/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ /* * AbstractComplexMetaAttributeEditor.java * * Created on 26. August 2004, 14:17 */ package Sirius.navigator.ui.attributes.editor.metaobject; import Sirius.navigator.connection.*; import Sirius.navigator.ui.attributes.editor.*; import Sirius.server.localserver.attribute.Attribute; import Sirius.server.localserver.attribute.ObjectAttribute; import Sirius.server.middleware.types.*; import java.util.*; /** * DOCUMENT ME! * * @author pascal * @version $Revision$, $Date$ */ public abstract class AbstractComplexMetaAttributeEditor extends AbstractComplexEditor { //~ Instance fields -------------------------------------------------------- protected String PROPERTY_SHOW_ONLY_VISIBLE_ATTRIBUTES = "showOnlyVisibleAttributes"; // NOI18N protected boolean showOnlyVisibleAttributes = false; //~ Methods ---------------------------------------------------------------- // setValue() -------------------------------------------------------------- @Override protected void setValue(final Object value) { if (logger.isDebugEnabled()) { logger.debug("setValue(" + this + "):" + value); // NOI18N } if ((this.getValue() != null) && (this.getValue() instanceof Attribute) && ((value == null) || !(value instanceof Attribute))) { if (logger.isDebugEnabled()) { logger.debug("setValue(" + this + ") setting new value of existing meta attribute"); // NOI18N } ((Attribute)this.getValue()).setValue(value); } else if ((value != null) && (value instanceof MetaObject)) { if (logger.isDebugEnabled()) { logger.debug("setValue(" + this + ") setting new meta object (this must be the root editor)"); // NOI18N } super.setValue(value); } else if ((value != null) && (value instanceof Attribute)) { if (logger.isDebugEnabled()) { logger.debug("setValue(" + this + ") setting new meta attribute"); // NOI18N } MetaObject MetaObject = this.getMetaObject(value); if (MetaObject == null) { if (logger.isDebugEnabled()) { logger.warn("setValue(" + this + ") the value of this attribute is null, creating new empty meta object"); // NOI18N } if (((Attribute)value).isArray()) { final String domain = ((Attribute)value).getClassKey().split("@")[1]; // NOI18N try { MetaObject = new DefaultMetaObject(new Sirius.server.localserver.object.DefaultObject( -1, ((ObjectAttribute)value).getClassID()), domain); MetaObject.setDummy(true); } catch (Exception e) { logger.error("Error while creating a ArrayDummyObjektes", e); // NOI18N } } else { MetaObject = this.getMetaObjectInstance(((Attribute)value).getClassKey()); } ((Attribute)value).setValue(MetaObject); } super.setValue(value); } else { logger.error("setValue(" + this + ") old value or new value is not of type Attribute or MetaObject (" + value + ")"); // NOI18N } } @Override public java.lang.Object getValue(final java.lang.Object key) { final Map metaAttributes = this.getMetaObjectAttributes(this.getValue()); if ((metaAttributes != null) && metaAttributes.containsKey(key)) { return metaAttributes.get(key); } else { logger.error("getValue(" + this + ") no meta attributes in this meta object found, or unknown attribute key: '" + key + "'"); // NOI18N } return null; } @Override public void setValue(final java.lang.Object key, final java.lang.Object value) { final Map metaAttributes = this.getMetaObjectAttributes(this.getValue()); if (metaAttributes != null) { if (metaAttributes.containsKey(key)) { final Attribute metaAttribute = (Attribute)metaAttributes.get(key); final Object attributeValue = this.getAttributeValue(value); if (logger.isDebugEnabled()) { logger.debug("setValue(" + this + ") setting attribute '" + key + "' value: " + value); // NOI18N } if (this.showOnlyVisibleAttributes && !metaAttribute.isVisible()) { logger.warn("setting the value of an invisible attribute"); // NOI18N } metaAttribute.setValue(attributeValue); metaAttribute.setChanged(true); } else if ((value != null) && (value instanceof Attribute)) { if (logger.isDebugEnabled()) { logger.warn("adding new attribute '" + key + "' to the list of attributes"); // NOI18N } metaAttributes.put(key, value); } else { logger.error("setValue(" + this + ") attribute '" + key + "' not found in map of attributes (" + value + ")"); // NOI18N } } else { logger.error("getValue(" + this + ") no meta attributes in this meta object found (" + key + ")"); // NOI18N } } @Override public void setValueChanged(final boolean valueChanged) { if (logger.isDebugEnabled()) { logger.debug("setValueChanged"); // NOI18N } super.setValueChanged(valueChanged); if (this.getValue() instanceof Attribute) { ((Attribute)this.getValue()).setChanged(((Attribute)this.getValue()).isChanged() | valueChanged); } final MetaObject MetaObject = this.getMetaObject(this.getValue()); MetaObject.setChanged(MetaObject.isChanged() | valueChanged); if (MetaObject.isChanged() && (!MetaObject.isDummy())) { if (logger.isDebugEnabled()) { logger.debug("Object: " + MetaObject + " was modified and has the state " + MetaObject.getStatus()); // NOI18N } if ((MetaObject.getStatus() == MetaObject.NO_STATUS) || (MetaObject.getStatus() == MetaObject.MODIFIED)) { MetaObject.setStatus(MetaObject.MODIFIED); } else { MetaObject.setStatus(MetaObject.NEW); } } // else if (MetaObject.isDummy()) // frickeldasgeht // { // ObjectAttribute[] as = MetaObject.getAttribs(); // // for(int i=0;i<as.length;i++) // { // MetaObject mo =(MetaObject)as[i].getValue(); // // if(mo.getStatus()== MetaObject.NO_STATUS) // mo.setStatus(MetaObject.NEW); // // } // // // // } } // Properties -------------------------------------------------------------- @Override public boolean setProperty(final String key, final Object value) { if (key.equalsIgnoreCase(PROPERTY_SHOW_ONLY_VISIBLE_ATTRIBUTES) && (value instanceof Boolean)) { this.showOnlyVisibleAttributes = ((Boolean)value).booleanValue(); return true; } else { return super.setProperty(key, value); } } @Override public Object getProperty(final String key) { if (key.equalsIgnoreCase(PROPERTY_SHOW_ONLY_VISIBLE_ATTRIBUTES)) { return new Boolean(this.showOnlyVisibleAttributes); } else { return super.getProperty(key); } } // Hilfsmethoden ----------------------------------------------------------- /** * Liefert den Wert eines Attributes, wenn es sich bei dem Argument um ein MetaAttribut handelt. * * @param value DOCUMENT ME! * * @return DOCUMENT ME! */ protected Object getAttributeValue(final Object value) { if ((value != null) && (value instanceof Attribute)) { return ((Attribute)value).getValue(); } return value; } /** * Liefert den Wert eines Attributes, wenn es sich bei dem Argument um ein MetaAttribut handelt. * * @param value DOCUMENT ME! * * @return DOCUMENT ME! */ protected MetaObject getMetaObject(final Object value) { if (value != null) { if (value instanceof MetaObject) { return (MetaObject)value; } else if (value instanceof Attribute) { final Object attributeValue = ((Attribute)value).getValue(); if ((attributeValue == null) || ((attributeValue != null) && (attributeValue instanceof MetaObject))) { return (MetaObject)attributeValue; } else { logger.error("getMetaObject(" + this + ") value of Attribute '" + ((Attribute)value).getName() + "' is not of type MetaObject (" + attributeValue.getClass().getName() + ")"); // NOI18N } } else { logger.error("getMetaObject(" + this + ") value is not of type Attribute or MetaObject (" + value.getClass().getName() + ")"); // NOI18N } } return null; } /** * Created a new instance of a Meta Object. * * @param classKey Class of the Meta Object * * @return new instnace of MetaObject of Type classKey or null */ protected MetaObject getMetaObjectInstance(final Object classKey) { try { if (logger.isDebugEnabled()) { logger.debug("getMetaObjectInstance(): try to retrive ObjectTemplate for Class '" + classKey + "'"); // NOI18N } final MetaClass metaClass = SessionManager.getProxy().getMetaClass(classKey.toString()); final MetaObject MetaObject = SessionManager.getProxy().getInstance(metaClass); MetaObject.setStatus(MetaObject.NEW); return MetaObject; } catch (Throwable t) { logger.error("setValue(" + this + ") could not create new empty meta object of type '" + classKey + "'", t); // NOI18N return null; } } /** * DOCUMENT ME! * * @param value DOCUMENT ME! * * @return DOCUMENT ME! */ protected Map getMetaObjectAttributes(final Object value) { final MetaObject MetaObject = this.getMetaObject(value); if (MetaObject != null) { return MetaObject.getAttributes(); } return null; } /** * DOCUMENT ME! * * @param value DOCUMENT ME! * * @return DOCUMENT ME! */ protected String getName(final Object value) { if (value != null) { if (value instanceof Attribute) { return ((Attribute)value).getName(); } else if (value instanceof MetaObject) { return ((MetaObject)value).getName(); } } return null; } }