/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.server.localserver.attribute;
import Sirius.server.middleware.types.MetaObject;
import Sirius.server.middleware.types.TypeVisitor;
import Sirius.server.newuser.permission.PermissionHolder;
import Sirius.server.newuser.permission.Policy;
import Sirius.util.Editable;
import Sirius.util.Mapable;
import Sirius.util.Renderable;
import org.apache.log4j.Logger;
import de.cismet.cids.tools.fromstring.DateFromString;
import de.cismet.cids.tools.fromstring.FromStringCreator;
import de.cismet.cids.tools.fromstring.StringCreateable;
import de.cismet.cids.tools.tostring.StringConvertable;
import de.cismet.cids.tools.tostring.ToStringConverter;
import de.cismet.cids.utils.ClassloadingHelper;
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
public class ObjectAttribute extends Attribute implements Mapable,
java.io.Serializable,
Renderable,
Editable,
StringCreateable,
StringConvertable {
//~ Static fields/initializers ---------------------------------------------
private static final transient Logger LOG = Logger.getLogger(ObjectAttribute.class);
//~ Instance fields --------------------------------------------------------
// objekt zu dem das Attribut gehoert
protected int objectID;
// klasse des Objektes zu dem das Attribut gehoert????
protected int classID;
// Metainformation for this attribute (nachtraeglich dazugekommen)
protected MemberAttributeInfo mai;
protected Object deletedValue = null;
protected String editor;
protected String complexEditor;
protected String toStringString;
protected Sirius.server.localserver.object.Object parentObject;
// NOI18N
// xxx not initialized yet
private FromStringCreator objectCreator;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new ObjectAttribute object.
*
* @param mai DOCUMENT ME!
* @param objectID DOCUMENT ME!
* @param value DOCUMENT ME!
* @param policy DOCUMENT ME!
*/
public ObjectAttribute(final MemberAttributeInfo mai,
final int objectID,
final java.lang.Object value,
final Policy policy) {
// id????
this(mai.getId() + "", mai, objectID, value, policy); // NOI18N
}
/**
* Creates a new ObjectAttribute object.
*
* @param id DOCUMENT ME!
* @param mai DOCUMENT ME!
* @param objectID DOCUMENT ME!
* @param value DOCUMENT ME!
* @param policy DOCUMENT ME!
*/
public ObjectAttribute(final String id,
final MemberAttributeInfo mai,
final int objectID,
final java.lang.Object value,
final Policy policy) {
// Info wird zum Teil doppelt gehalten im mai Objekt und in der Superklasse
// verursacht durch : mai nachtraeglich eingefuegt
super(id, mai.getName(), null, new PermissionHolder(policy), mai.isVisible());
this.setMai(mai);
this.objectID = objectID;
this.classID = mai.getClassId();
this.isArray = mai.isArray();
super.typeId = mai.getTypeId();
super.referencesObject = mai.foreignKey;
super.optional = mai.isOptional();
if (value instanceof java.lang.String) {
this.value = ((String)value).trim();
} else {
this.value = value;
}
this.editor = mai.getEditor();
this.complexEditor = mai.getComplexEditor();
this.toStringString = mai.getToString();
initFromString(mai);
}
//~ Methods ----------------------------------------------------------------
/**
* Getter for property classID.
*
* @return Value of property classID.
*/
public int getClassID() {
return classID;
}
/**
* Setter for property classID.
*
* @param classID New value of property classID.
*/
public void setClassID(final int classID) {
this.classID = classID;
}
/**
* Setter for property objectID.
*
* @param objectID New value of property objectID.
*/
public void setObjectID(final int objectID) {
this.objectID = objectID;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
final int getObjectID() {
return objectID;
}
// mapable
@Override
public java.lang.Object getKey() {
return id + "@" + classID; // NOI18N
}
@Override
public Object constructKey(final Mapable m) {
return super.constructKey(m);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public String getToStringString() {
return toStringString;
}
@Override
public String getRenderer() {
return toStringString;
}
@Override
public Object fromString(final String objectRepresentation, final Object mo) throws Exception {
return objectCreator.create(objectRepresentation, mo);
}
@Override
public boolean isStringCreateable() {
return (objectCreator != null);
}
@Override
public String getComplexEditor() {
if (this.complexEditor == null) {
complexEditor = "Sirius.navigator.ui.attributes.editor.metaobject.DefaultComplexMetaAttributeEditor"; // NOI18N
}
if (this.editor == null) {
editor = "Sirius.navigator.ui.attributes.editor.metaobject.DefaultSimpleComplexMetaAttributeEditor"; // NOI18N
}
if (this.referencesObject()) {
return complexEditor;
} else {
return editor;
}
}
@Override
public String getSimpleEditor() {
return editor;
}
/**
* Setter for property complexEditor.
*
* @param complexEditor New value of property complexEditor.
*/
public void setComplexEditor(final String complexEditor) {
this.complexEditor = complexEditor;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public ToStringConverter getToStringConverter() {
if (toStringConverter == null) {
final Sirius.server.localserver.object.Object parObj = parentObject;
if (parObj instanceof MetaObject) {
final MetaObject mo = (MetaObject)parObj;
try {
final Class<?> converterClass = ClassloadingHelper.getDynamicClass(mo.getMetaClass(),
mai,
ClassloadingHelper.CLASS_TYPE.TO_STRING_CONVERTER);
if (converterClass != null) {
if (ToStringConverter.class.isAssignableFrom(converterClass)) {
toStringConverter = (ToStringConverter)converterClass.newInstance();
} else {
LOG.warn("Class " + converterClass + " is not subtype of ToStringConverter!");
}
}
} catch (final Throwable t) {
if (LOG.isDebugEnabled()) {
LOG.debug("Error while trying to load ToStringConverter !", t);
}
}
if (toStringConverter == null) {
toStringConverter = new ToStringConverter();
}
}
}
return toStringConverter;
}
@Override
public String toString() {
if (value != null) {
final ToStringConverter toStringConv = getToStringConverter();
if (toStringConv != null) {
return toStringConv.convert(this);
} else {
return value.toString();
}
}
return ""; // NOI18N
}
/**
* muss total neu gemacht werden.
*
* @param mai DOCUMENT ME!
*/
protected void initFromString(final MemberAttributeInfo mai) {
final String fromString = mai.getFromString();
if (fromString != null) {
try {
if (LOG.isDebugEnabled()) {
LOG.debug("<LS> info :: try to load fromString if not null : " + fromString); // NOI18N
}
final java.lang.Class c0 = java.lang.Class.forName("Sirius.util.FromStringCreator"); // NOI18N
final java.lang.Class c = java.lang.Class.forName(fromString.trim());
if (c0.isAssignableFrom(c)) {
this.objectCreator = (FromStringCreator)c.newInstance();
if (LOG.isDebugEnabled()) {
LOG.debug(this.objectCreator + " of type " + fromString + " successfully assigned"); // NOI18N
}
} else {
LOG.warn(
"<LS> info :: fromSTringObjectCreator " // NOI18N
+ fromString
+ "nicht geladen: reference is :" // NOI18N
+ this.objectCreator);
}
} catch (Exception e) {
LOG.error(
"<LS> ERROR :: " // NOI18N
+ fromString
+ " f\u00FCr Klasse " // NOI18N
+ name
+ " konnte nicht geladen werden set string converter to Default ", // NOI18N
e);
}
} else {
// default from string
if ((value instanceof java.sql.Date)
|| (value instanceof java.util.Date)
|| ((typeId > 78) && (typeId < 87))) {
this.objectCreator = new DateFromString();
}
}
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public MemberAttributeInfo getMai() {
return mai;
}
/**
* DOCUMENT ME!
*
* @param mai DOCUMENT ME!
*/
public void setMai(final MemberAttributeInfo mai) {
this.mai = mai;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Sirius.server.localserver.object.Object getParentObject() {
return parentObject;
}
/**
* DOCUMENT ME!
*
* @param parentObject DOCUMENT ME!
*/
public void setParentObject(final Sirius.server.localserver.object.Object parentObject) {
this.parentObject = parentObject;
}
}