package com.hwlcn.ldap.ldap.sdk.persist; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Type; import com.hwlcn.ldap.ldap.sdk.Attribute; import com.hwlcn.ldap.ldap.sdk.schema.AttributeTypeDefinition; import com.hwlcn.core.annotation.Extensible; import com.hwlcn.core.annotation.ThreadSafety; import com.hwlcn.ldap.util.ThreadSafetyLevel; import static com.hwlcn.ldap.ldap.sdk.persist.PersistMessages.*; import static com.hwlcn.ldap.util.Debug.*; import static com.hwlcn.ldap.util.StaticUtils.*; @Extensible() @ThreadSafety(level=ThreadSafetyLevel.INTERFACE_THREADSAFE) public abstract class ObjectEncoder implements Serializable { public abstract boolean supportsType(final Type t); public final AttributeTypeDefinition constructAttributeType(final Field f) throws LDAPPersistException { return constructAttributeType(f, DefaultOIDAllocator.getInstance()); } public abstract AttributeTypeDefinition constructAttributeType(final Field f, final OIDAllocator a) throws LDAPPersistException; public final AttributeTypeDefinition constructAttributeType(final Method m) throws LDAPPersistException { return constructAttributeType(m, DefaultOIDAllocator.getInstance()); } public abstract AttributeTypeDefinition constructAttributeType(final Method m, final OIDAllocator a) throws LDAPPersistException; public abstract boolean supportsMultipleValues(final Field field); public abstract boolean supportsMultipleValues(final Method method); public abstract Attribute encodeFieldValue(final Field field, final Object value, final String name) throws LDAPPersistException; public abstract Attribute encodeMethodValue(final Method method, final Object value, final String name) throws LDAPPersistException; public abstract void decodeField(final Field field, final Object object, final Attribute attribute) throws LDAPPersistException; public void setNull(final Field f, final Object o) throws LDAPPersistException { try { f.setAccessible(true); final Class<?> type = f.getType(); if (type.equals(Boolean.TYPE)) { f.set(o, Boolean.FALSE); } else if (type.equals(Byte.TYPE)) { f.set(o, (byte) 0); } else if (type.equals(Character.TYPE)) { f.set(o, '\u0000'); } else if (type.equals(Double.TYPE)) { f.set(o, 0.0d); } else if (type.equals(Float.TYPE)) { f.set(o, 0.0f); } else if (type.equals(Integer.TYPE)) { f.set(o, 0); } else if (type.equals(Long.TYPE)) { f.set(o, 0L); } else if (type.equals(Short.TYPE)) { f.set(o, (short) 0); } else { f.set(o, null); } } catch (Exception e) { debugException(e); throw new LDAPPersistException( ERR_ENCODER_CANNOT_SET_NULL_FIELD_VALUE.get(f.getName(), o.getClass().getName(), getExceptionMessage(e)), e); } } public void setNull(final Method m, final Object o) throws LDAPPersistException { try { m.setAccessible(true); final Class<?> type = m.getParameterTypes()[0]; if (type.equals(Boolean.TYPE)) { m.invoke(o, Boolean.FALSE); } else if (type.equals(Byte.TYPE)) { m.invoke(o, (byte) 0); } else if (type.equals(Character.TYPE)) { m.invoke(o, '\u0000'); } else if (type.equals(Double.TYPE)) { m.invoke(o, 0.0d); } else if (type.equals(Float.TYPE)) { m.invoke(o, 0.0f); } else if (type.equals(Integer.TYPE)) { m.invoke(o, 0); } else if (type.equals(Long.TYPE)) { m.invoke(o, 0L); } else if (type.equals(Short.TYPE)) { m.invoke(o, (short) 0); } else { m.invoke(o, type.cast(null)); } } catch (Exception e) { debugException(e); throw new LDAPPersistException( ERR_ENCODER_CANNOT_SET_NULL_METHOD_VALUE.get(m.getName(), o.getClass().getName(), getExceptionMessage(e)), e); } } public abstract void invokeSetter(final Method method, final Object object, final Attribute attribute) throws LDAPPersistException; }