Friday, October 17, 2008

MySQL issue: delete column :)

I faced very simple task: remove unused column in database table. Issue was in fact that mentioned column is a foreign key to another table.
After trying to run:
alter table table_name drop column_name;
strange message appeared:
Error on rename of '.\database\#sql-6ec-13' to '.\database\' (errno: 150)
This is because adding foreign keys also adds an index key to the table (for optimization needs).Therefore to delete mentioned column You need:
  1. Run show create table table_name and see what keys and foreign keys are created on mentioned column;
  2. Delete all keys using alter table table_name drop key key_name;
  3. Delete all foreign keys using alter table table_name drop foreign key foreign_key_name;
  4. Drop needed column alter table table_name drop column_name;
That's all.

Friday, August 1, 2008

JBoss in debug mode

You can start JBoss in debug mode. You have to edit the run.bat file to configure the debug options.
Edit the run.bat file of JBoss to use the following debug options (note the suspend=n option, this tells the server not to wait till the debugger attaches itself to the server ):

set JAVA_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n %JAVA_OPTS%

After that port 8787 can be used for debugging.

Wednesday, July 30, 2008

Old Tech Per: java.net.HttpRetryException: cannot retry due to server authentication, in streaming mode

Old Tech Per: java.net.HttpRetryException: cannot retry due to server authentication, in streaming mode

Tuesday, October 16, 2007

Changing password in LDAP.

Hello.
Today we faced the problem while changing password stored in LDAP manually, in other words through console. OpenLDAP wants the result to be Base64 encoded.
So we need to use slappasswd command, which is situated in /usr/sbin/ to transform new password to MD5 hash and then transform result to Base64 encoded.

For instance:
slappasswd -h "{md5}" -s "newpassword"
Then result will be like that:
{MD5}Xp0RoUrRyN136Y75tT/Rug==

Afterwards, we can connect to the ldap and made appropriate changes.
For instance:
ldapmodify -h localhost -p 389 -x -D "cn=root,dc=rubicon,dc=gridcommons,dc=net" -w ldap
connects to the ldap located on localhost:389, credentials (user/password) are root/ldap.

Then we can manually change needed branch:

dn: cn=Jeanne Bradford jeanneririo,o=Tom's Business Services,cn=Consumers,dc=rubicon,dc=gridcommons,dc=net
changetype: modify
replace: userPassword
userPassword: {md5}Xp0RoUrRyN136Y75tT/Rug==

Pushing "Enter" and we will see text similar to published below:

modifying entry "cn=Jeanne Bradford jeanneririo,o=Tom's Business Services,cn=Consumers,dc=rubicon,dc=gridcommons,dc=net"

The same result can be achieved by importing data from file. As an example:
ldapmodify -h localhost -p 389 -x -D "cn=root,dc=rubicon,dc=gridcommons,dc=net" -w ldap -f some_file.ldiff, where some_file.ldiff contents looks like:

dn: cn=Jeanne Bradford jeanneririo,o=Tom's Business Services,cn=Consumers,dc=rubicon,dc=gridcommons,dc=net
changetype: modify
replace: userPassword
userPassword: {md5}Xp0RoUrRyN136Y75tT/Rug==

That's all. We can check the results through exporting ldap data. This can be done by:
slapcat dump.ldiff. For instance: slapcat -l /opt/ldap_dump.ldiff.

Good luck to You with LDAP :)

Friday, September 28, 2007

Думки пізньої ночі

Ось уже майже новий день і всілякі думки лізуть в голову. Як хороші, так і не дуже.
Останнім часом думається про час (вибачте, за тавтологію). Цікаво, коли до нас приходить розуміння, що це таке, "час"? В ранньому дитинстві Ти насолоджуєшся дотиками, емоціями, Тобі не відомі такі поняття як грубість, нещирість, брехня, зрада ... Все, що Ти відчуваєш, це емоції. Тому й саме життя здається послідовністю нескінчених емоцій : позитивних і негативних. Ти йдеш в школу, бо так треба, любиш батьків й завжди радієш їхній присутності, й ніколи не замислюєшся над плином часу. Перший клас, третій, шостий ... Кілька табелів й грамот у шухляді. Потім Ти просто усвідомлюєш, що рано чи пізно, але Ти помреш і це все закінчиться. Але істинний зміст цього доходить не скоро. Життя тепер як послідовність речей, які хочеться й не хочеться виконувати, як набір друзів і інших не хороших людей. І батьки ... які з кожним днем втрачають авторитет у Твоїх очах. Але життя приносить задоволення. Повна визначеність і сукупність правил : батьків поважати, батьківщину любити, їсти все, що дають, робити домашнє завдання й не говорити матюків. А час іде. Десь майоріє закінчення школи, мимо пропливає перше невзаємне кохання, з'являється думка, що правила можна порушувати. Й Ти пробуєш заборонений плід : з Твоїх вуст злітають злі фрази, про наслідки яких Ти навіть не задумовувся, батьки здаються для Тебе нічим не кращими за інших знайомих людей, сигарети, алкоголь, дівчата. Й тут Ти говориш собі - я не хочу втратити себе справжнього. В цей момент Ти чітко віриш в те, що Ти знаєш ким Ти є й до чого прагнеш. Університет. Нові люди, нове ставлення, нові правила, все та ж визначеність у вибраному шляху. Перший раз в голову в'їдається думка - а може я щось роблю не правильно? З допомогою алкоголю та друзів її так легко позбутися. Часу вистачає на все й життя перетворюється на процес маневрування між дозволеним й не дуже. Головне здати сесію, чи ти так? Депресія, вірші, важка музика з іншого боку, пари, веселі друзі, класна компанія, драм, алкоголь з іншого. Навіщо задумовуваватися над чимось серйозним? І тут щось міняється ... Хтось знаходить роботу, хтось кохання, у когось навіть вже весілля й діточки. А ТИ? Що в цей час робиш Ти? Хіба Ти розумієш, що кожна втрачена хвилина - це реально втрачена хвилина? Що з кожним моментом Ти відстаєш від когось, хто в цей час щось робить, щось творить, щось відчуває? Ні, він ще впевнений, що не втратив того справжнього і все буде в порядку. Хоча рамок й точної послідовності правильних дій ніхто не знає й точно ніхто не підкаже. Перша робота. Перші мізерні гроші. Перший вітерок в бумажний будинок під назвою "моє розуміння життя й куди я рухаюсь". Перше велике взаємне кохання, яке так легко знищити. Розуміння, що ці всі речі цікаві Тобі і тільки Тобі. І батькам, і родичам, і як не прикро це говорити, але й найближчим друзям, на всі Твої думки не те, що начхати, а їм просто нейтрально. Це ж не їхнє життя. І правильно. Й тут ти згадуєш про втрачений час, й намагаєшся щось змінити. Нова робота, нові обставини, нові можливості. Батьки вже просто як сусіди. Гроші, які змінюють людей. Заздрість, підтримка, повага, зневага, розуміння. Відсів Твого оточення, природній відсів. Всього вже так багато, а Тебе так мало. Й час. Час, який вже реально просто не спинити. Це не пауза у ВінАмпі, а реальні секунди, які втікають. Питання ж "куди?" правда буде риторичним? І кожного ранку, прокидаючись вранці, задаєш питання "навіщо?", а потім знайдуться 1000 речей, які змусять Тебе забути про те, що Ти живеш й перетворитися на машину, яка наче вірить, що несе якийсь сенс в це життя. А чи є сенс? І не врятують ні гроші, ні дівчата, ні друзі, ні віртуальний світ. Від власного Я вже не втекти. А той справжній Ти вже згубився з плином часу. Назавжди. Велком ту ріал ворд ...

Friday, May 11, 2007

Hibernate & enumerations (Part II)

Yesterday I faced the problem of mapping enumerations to bd using hbm.xml files. Now I will create a simple example to show you the solution for that problem.

Lets create a simple domain class :

public final class User {

/** The unique identifier. Must be unique among all service events. */
private String id;

/** The name of the particular user. */
private String name;

/** The education of the user. */
private Education educationType;

// here comes constructor and appropriate getters and setters.

}


Next we have to create our enumeration called Education.
For instance :

public enum Education{
/** */
UNIVERSITY,

/** */
COLLEGE,

/** */
SCHOOL
}


A now comes the trick. With help of my colleagues I found class created by Emmanuel Bernard which is the enum type wrapper. Here it is :

public class EnumType> implements UserType {
/** */
private static Log log = LogFactory.getLog(EnumType.class);

/** */
private static final boolean IS_TRACE_ENABLED;

static {
//cache this, because it was a significant performance cost
IS_TRACE_ENABLED = LogFactory.getLog(StringHelper.qualifier(Type.class.getName())).isTraceEnabled();
}

public static final String ENUM = "enumClass";
public static final String SCHEMA = "schema";
public static final String CATALOG = "catalog";
public static final String TABLE = "table";
public static final String COLUMN = "column";
public static final String TYPE = "type";

private static Map
enumValues = new HashMap();

private Class
enumClass;
// private int sqlType = Types.INTEGER; // enums will be mapped in bd as integer.
private int sqlType = Types.VARCHAR; // enums will be mapped in bd as varchar.

protected EnumType(final Class
c) {
this.enumClass = c;
}

public int[] sqlTypes() {
return new int[]{sqlType};
}

public Class returnedClass() {
return enumClass;
}

public boolean equals(final Object x, final Object y) throws HibernateException {
return x == y;
}

public int hashCode(final Object x) throws HibernateException {
return x == null ? 0 : x.hashCode();
}

public Object nullSafeGet(final ResultSet rs, final String[] names, final Object owner) throws HibernateException, SQLException {
final Object object = rs.getObject(names[0]);
if (rs.wasNull()) {
if (IS_TRACE_ENABLED) {
log.debug("Returning null as column " + names[0]);
}
return null;
}
if (object instanceof Number) {
Object[] values = enumValues.get(enumClass);
if (values == null) {
try {
final Method method = enumClass.getDeclaredMethod("values", new Class[0]);
values = (Object[]) method.invoke(null, new Object[0]);
enumValues.put(enumClass, values);
}
catch (Exception e) {
throw new HibernateException("Error while accessing enum.values(): " + enumClass, e);
}
}
final int ordinal = ((Number) object).intValue();
if (ordinal <>= values.length) {
throw new IllegalArgumentException("Unknown ordinal value for enum " + enumClass + ": " + ordinal);
}
if (IS_TRACE_ENABLED) {
log.debug("Returning '" + ordinal + "' as column " + names[0]);
}
return values[ordinal];
} else {
final String name = (String) object;
if (IS_TRACE_ENABLED) {
log.debug("Returning '" + name + "' as column " + names[0]);
}
try {
return Enum.valueOf(enumClass, name);
}
catch (IllegalArgumentException iae) {
throw new IllegalArgumentException("Unknown name value for enum " + enumClass + ": " + name, iae);
}
}
}

public void nullSafeSet(final PreparedStatement st, final Object value, final int index) throws HibernateException, SQLException {
//if (!guessed) guessType( st, index );
if (value == null) {
if (IS_TRACE_ENABLED) log.debug("Binding null to parameter: " + index);
st.setNull(index, sqlType);
} else {
final boolean isOrdinal = isOrdinal(sqlType);
if (isOrdinal) {
final int ordinal = ((Enum) value).ordinal();
if (IS_TRACE_ENABLED) {
log.debug("Binding '" + ordinal + "' to parameter: " + index);
}
st.setObject(index, new Integer(ordinal), sqlType);
} else {
final String enumString = ((Enum) value).name();
if (IS_TRACE_ENABLED) {
log.debug("Binding '" + enumString + "' to parameter: " + index);
}
st.setObject(index, enumString, sqlType);
}
}
}

private boolean isOrdinal(final int paramType) {
switch (paramType) {
case Types.INTEGER:
case Types.NUMERIC:
case Types.SMALLINT:
case Types.TINYINT:
case Types.BIGINT:
case Types.DECIMAL: //for Oracle Driver
case Types.DOUBLE: //for Oracle Driver
case Types.FLOAT: //for Oracle Driver
return true;
case Types.CHAR:
case Types.LONGVARCHAR:
case Types.VARCHAR:
return false;
default:
throw new HibernateException("Unable to persist an Enum in a column of SQL Type: " + paramType);
}
}

public Object deepCopy(final Object value) throws HibernateException {
return value;
}

public boolean isMutable() {
return false;
}

public Serializable disassemble(final Object value) throws HibernateException {
return (Serializable) value;
}

public Object assemble(final Serializable cached, final Object owner) throws HibernateException {
return cached;
}

public Object replace(final Object original, final Object target, final Object owner) throws HibernateException {
return original;
}
}


Now we need to create a class which will be mapped to bd from one side and will wrap our Education enum from the other. Let's call it EducationEnumType :

public final class EducationEnumType extends EnumType{

/* ((( Constructors ))) */
/**
/*
*/
public EducationEnumType() {
super(Education.class);
}
}


We are almost finished. All is left is main part of our User.hbm.xml file : we need to create a property called "education" with type of EducationEnumType (NOT Education!).

That's all. Enjoy enumerations in hibernate :)

Tuesday, April 3, 2007

Hibernate & enumerations

Recently I had problem with mapping of enumerations. My database was MySQL and I used hibernate annotations. There are two solutions for doing that :

1 solution.

For storing enumerations in db we use field of type integer, it means that we store only indexes of items in enumeration. Let's make simple example:
- our db script :

CREATE DATABASE example DEFAULT CHARSET=utf8;

CREATE TABLE CalendarDay (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
day_type INTEGER NULL,
PRIMARY KEY(id),
);


- part of our entity class:

@Entity
@Table(name="CALENDARDAY")
public class CalendarDay implements Serializable {

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id = null;

@Column(name="DAY_TYPE")
@Enumerated()
private DayType dayType;

...


- our enumeration :

public enum DayType {
WORKINGDAY,
RESTDAY,
HOLIDAY,
}


If we create an instance of class CalendarDay and put it into db, in field DAY_TYPE we will only see 0,1,2 (indexes which corresponds to our enums : WORKINGDAY, RESTDAY, HOLIDAY).

Advantages of this solution are :
- less memory for storing data (as we store only integers);
Disadvantages of this solution are :
- we could not change order in which enums are written in DayType;
- store data is not so obvious to read and understand, as we see only integers, not strings;

2 solution:

For storing enumerations in db we use field of type varchar it means that we store strings of enumeration. Let's make simple example:

- our db script :

CREATE DATABASE example DEFAULT CHARSET=utf8;

CREATE TABLE CalendarDay (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
day_type VARCHAR(45) NULL,
PRIMARY KEY(id),
);


- part of our entity class:

@Entity
@Table(name="CALENDARDAY")
public class CalendarDay implements Serializable {

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id = null;

@Column(name="DAY_TYPE")
@Enumerated(EnumType.STRING)
private DayType dayType;

...


- our enumeration :

public enum DayType {
WORKINGDAY,
RESTDAY,
HOLIDAY,
}


If we create an instance of class CalendarDay and put it into db, in field DAY_TYPE we will see strings which corresponds to our enums : WORKINGDAY, RESTDAY, HOLIDAY).

Advantages of this solution are :
- we could not change order in which enums are written in DayType;
- store data is more obvious to read and understand;
Disadvantages of this solution are :
- a lot of memory for storing data (as we store full strings);