/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package Sirius.server.middleware.types; import Sirius.server.localserver.attribute.AttributeVector; import Sirius.server.localserver.attribute.MemberAttributeInfo; import Sirius.server.localserver.attribute.ObjectAttribute; import Sirius.util.Editable; import Sirius.util.Groupable; import Sirius.util.Renderable; import java.util.Iterator; import java.util.LinkedHashMap; import de.cismet.cids.tools.tostring.ToStringConverter; import de.cismet.cids.utils.ClassloadingHelper; /** * Return Type of a RMI method. * * @version $Revision$, $Date$ */ public class MetaClass extends Sirius.server.localserver._class.Class implements java.io.Serializable, Groupable, Renderable, Editable { //~ Static fields/initializers --------------------------------------------- private static String toStringConverterPrefix = "de.cismet.cids.custom.tostringconverter."; // NOI18N private static String toStringConverterPostfix = "ToStringConverter"; // NOI18N //~ Instance fields -------------------------------------------------------- /** domain. */ protected final String domain; private transient org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(this.getClass()); /** erzeugt eine String repr\u00E4entation eines Objketes der Klasse, kann in toString benutzt werden. */ private transient ToStringConverter toStringConverter; private transient Class javaClass = null; private Boolean hasExtensionAttributes = null; // ------------------------------------------------------------------- private final String key; //~ Constructors ----------------------------------------------------------- /** * constuructor adding the domain. * * @param c "server" class * @param domain domain */ public MetaClass(final Sirius.server.localserver._class.Class c, final String domain) { /* * SystemProperties */ super( c.getID(), c.getName(), c.getDescription(), c.getIcon(), c.getObjectIcon(), c.getTableName(), c.getPrimaryKey(), c.getToString(), c.getPermissions(), c.getAttributePolicy(), c.isIndexed()); super.attribs = new AttributeVector(c.getAttributes()); super.memberAttributeInfos = new LinkedHashMap(c.getMemberAttributeInfos()); // Hell super.setEditor(c.getEditor()); super.setRenderer(c.getRenderer()); this.domain = domain; this.key = id + "@" + domain; this.arrayElementLink = c.isArrayElementLink(); } //~ Methods ---------------------------------------------------------------- /** * grouping criterion. * * @return grouping criterion */ @Override public String getGroup() { return domain; } /** * getter for icon. * * @return class icon (image) */ public byte[] getIconData() { return icon.getImageData(); } /** * getter for object icon. * * @return object icon (image) */ public byte[] getObjectIconData() { return objectIcon.getImageData(); } /** * getter for domain. * * @return domain */ public String getDomain() { return domain; } /** * getter for key. * * @return key */ @Override public Object getKey() { return key; } /** * getter for simple editor. * * @return simple editor */ @Override public String getSimpleEditor() { return editor; } /** * getter for renderer. * * @return renderer */ @Override public String getRenderer() { return renderer; } /** * getter for complex editor. * * @return complex editor */ @Override public String getComplexEditor() { return editor; } // public String toString() // { return super.toString()+"@"+domain;} /** * getter for toStringConverter. * * @return toStringConverter */ public ToStringConverter getToStringConverter() { if (toStringConverter == null) { loadToStringConverter(); } return toStringConverter; } /** * public void setToStringConverter(ToStringConverter toStringConverter) { this.toStringConverter = * toStringConverter; }. */ private void loadToStringConverter() { setLogger(); try { if (logger != null) { if (logger.isDebugEnabled()) { logger.debug("try to load stringconverter if not null : " + toString); // NOI18N } } Class<?> converterClass = null; try { converterClass = ClassloadingHelper.getDynamicClass( this, ClassloadingHelper.CLASS_TYPE.TO_STRING_CONVERTER); } catch (Exception e) { if (logger.isDebugEnabled()) { logger.debug("no lazy toStringConverter found!"); } } if ((converterClass != null) && de.cismet.cids.tools.tostring.ToStringConverter.class.isAssignableFrom(converterClass)) { this.toStringConverter = (ToStringConverter)converterClass.newInstance(); } else if (logger != null) { if (logger.isDebugEnabled()) { logger.debug( " customized stringconverter could not be loaded as ClassQualifer ist not a valid ToSTringconverter " + toString); } } if (converterClass == null) { this.toStringConverter = new ToStringConverter(); if (logger.isDebugEnabled()) { logger.debug(" default stringconverter loaded: reference is :" + this.toStringConverter); // NOI18N } } } catch (Exception e) { if (logger != null) { logger.error( toString + " f\u00FCr Klasse " + name + " konnte nicht geladen werden set string converter to Default ", e); } this.toStringConverter = new ToStringConverter(); } } /** * DOCUMENT ME! */ public void setLogger() { if (logger == null) { logger = org.apache.log4j.Logger.getLogger(this.getClass()); } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public org.apache.log4j.Logger getLogger() { if (logger == null) { setLogger(); } return logger; } @Override public int getId() { return super.getID(); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public Class getJavaClass() { if (javaClass == null) { javaClass = ClassloadingHelper.getDynamicClass(this, ClassloadingHelper.CLASS_TYPE.CUSTOM_BEAN); if (javaClass == null) { try { javaClass = BeanFactory.getInstance().getJavaClass(this); } catch (Exception e) { getLogger().error("Javaclass for " + this.getName() + " could not be created.", e); // NOI18N } } } return javaClass; } /** * returns an empty instance of the metaClass. only first level initialization. no arrays. no subobjects. * * @return MetaObject */ public MetaObject getEmptyInstance() { try { final Sirius.server.localserver.object.Object o = new Sirius.server.localserver.object.DefaultObject( -1, getId()); o.setStatus(Sirius.server.localserver.object.Object.NEW); final Iterator iter = getMemberAttributeInfos().values().iterator(); while (iter.hasNext()) { final MemberAttributeInfo mai = (MemberAttributeInfo)iter.next(); final ObjectAttribute oAttr; oAttr = new ObjectAttribute(mai, -1, null, getAttributePolicy()); oAttr.setVisible(mai.isVisible()); oAttr.setSubstitute(mai.isSubstitute()); oAttr.setReferencesObject(mai.isForeignKey()); oAttr.setIsPrimaryKey(mai.getFieldName().equalsIgnoreCase(getPrimaryKey())); if (oAttr.isPrimaryKey()) { oAttr.setValue(-1); } oAttr.setOptional(mai.isOptional()); oAttr.setClassKey(mai.getForeignKeyClassId() + "@" + domain); // NOI18N o.addAttribute(oAttr); } return new DefaultMetaObject(o, getDomain()); } catch (Exception e) { getLogger().error("Error in getEmptyInstance", e); // NOI18N return null; } } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean hasExtensionAttributes() { if (hasExtensionAttributes == null) { final Iterator iter = getMemberAttributeInfos().values().iterator(); while (iter.hasNext()) { final MemberAttributeInfo mai = (MemberAttributeInfo)iter.next(); if (mai.isExtensionAttribute()) { hasExtensionAttributes = true; break; } } if (hasExtensionAttributes == null) { hasExtensionAttributes = false; } } return hasExtensionAttributes; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } else if (obj instanceof MetaClass) { final MetaClass other = (MetaClass)obj; final boolean sameDomain = (getDomain() == other.getDomain()) || ((getDomain() != null) && getDomain().equals(other.getDomain())); return sameDomain && (getID() == other.getID()); } else { return false; } } @Override public int hashCode() { return (getDomain() + getID()).hashCode(); } }