/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.server.middleware.types;
import Sirius.server.localserver.attribute.*;
import Sirius.server.newuser.*;
import org.apache.log4j.Logger;
import org.openide.util.Lookup;
import java.util.*;
import de.cismet.cids.dynamics.CidsBean;
import de.cismet.cids.tools.tostring.*;
import de.cismet.cids.utils.MetaClassCacheService;
/**
* Return Type of a RMI method.
*
* @version $Revision$, $Date$
*/
public class DefaultMetaObject extends Sirius.server.localserver.object.DefaultObject implements MetaObject {
//~ Static fields/initializers ---------------------------------------------
private static final transient Logger LOG = Logger.getLogger(DefaultMetaObject.class);
private static MetaClassCacheService classCacheService = null;
//~ Instance fields --------------------------------------------------------
/** domain (localserver) of where this object is hosted. */
protected String domain;
/** this object was changed (needs to be modified according to status). */
protected boolean changed;
/** this objects editor. */
protected String editor;
/** this objects renderer. */
protected String renderer;
/** this objects status (NO_STATUS,NEW,MODIFIED,TO_DELETE,TEMPLATE). */
/** this objects MetaClass (to be set in a clientApplication after retrieval ). */
private MetaClass metaClass;
private transient HashMap classes;
private transient CidsBean bean = null;
//~ Constructors -----------------------------------------------------------
/**
* constructs a metaObject out of a (server) object. mainly adds the domain infromation
*
* @param o "server" object
* @param domain domain
*/
public DefaultMetaObject(final Sirius.server.localserver.object.Object o, final String domain) {
// zum Testen einfach rekursives ersetzen
super(o);
this.domain = domain;
setStatus(o.getStatus());
if (o instanceof DefaultMetaObject) {
// this.status = ((MetaObject) o).status;
this.classes = ((DefaultMetaObject)o).classes;
} else {
// this.status = NO_STATUS;
}
final ObjectAttribute[] attr = o.getAttribs();
for (int i = 0; i < attr.length; i++) {
if (attr[i].referencesObject()) {
final Sirius.server.localserver.object.Object ob = (Sirius.server.localserver.object.Object)
attr[i].getValue();
if (ob != null) {
final MetaObject mo = new DefaultMetaObject(ob, domain);
attr[i].setValue(mo);
// attr[i].setClassKey(ob.getClassID()+"@"+domain);
}
}
// \u00FCbrschreibe classkey der attribute
}
this.setDummy(o.isDummy());
}
// bugfix
/**
* constructs a metaObject out of a (server) object. mainly adds the domain infromation and filters attribute not
* allowed for a usergroup (ug)
*
* @param object "server" object
* @param domain domain
* @param ug user group
*
* @throws Exception java.lang.Exception error
*/
public DefaultMetaObject(final Sirius.server.localserver.object.Object object,
final String domain,
final UserGroup ug) throws Exception {
this(object.filter(ug), domain);
}
// --------------------------------------------------------------
//~ Methods ----------------------------------------------------------------
@Override
public HashMap getAllClasses() {
if (classes == null) {
setAllClasses();
}
return classes;
}
/**
* getter for grouping criterion in this case the domain (in the sense of the group by clause in SQL).
*
* @return grouping criterion
*/
@Override
public String getGroup() {
return domain;
}
/**
* getter for domain.
*
* @return domain
*/
@Override
public String getDomain() {
return domain;
}
// workarround wegen Umstellung
/**
* getter for name.
*
* @return name
*/
@Override
public String getName() {
final Collection c = getAttributeByName("name", 1); // NOI18N
final Iterator iter = c.iterator();
Attribute a = null;
if (iter.hasNext()) {
a = (Attribute)iter.next();
final Object value = a.getValue();
if (value != null) {
return value.toString();
}
}
return null;
}
// workarround wegen Umstellung
/**
* getter for description.
*
* @return description
*/
@Override
public String getDescription() {
final Collection c = getAttributeByName("description", 1); // NOI18N
final Iterator iter = c.iterator();
if (iter.hasNext()) {
final Object o = ((Attribute)iter.next()).getValue();
if (o != null) {
return o.toString();
}
}
return null;
}
@Override
public void setArrayKey2PrimaryKey() {
final int primaryKey = getId();
final ObjectAttribute[] allAttribs = getAttribs();
for (final ObjectAttribute oa : allAttribs) {
if (oa.getMai().isArray()) {
final MetaObject dummyObject = (MetaObject)oa.getValue();
final String backreferenceFieldName = oa.getMai().getArrayKeyFieldName();
try {
final ObjectAttribute[] dummyEntries = dummyObject.getAttribs();
for (final ObjectAttribute dummyEntry : dummyEntries) {
final MetaObject dummyEntryMO = (MetaObject)dummyEntry.getValue();
dummyEntryMO.getAttributeByFieldName(backreferenceFieldName).setValue(primaryKey);
}
} catch (Exception e) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("no dummyobject for " + oa.getMai().getFieldName()); // NOI18N
}
}
}
}
}
/**
* DOCUMENT ME!
*
* @param classes DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public String toString(final HashMap classes) {
return metaClass.getToStringConverter().convert(this, classes);
}
/**
* getter for classKey.
*
* @return classKey
*/
@Override
public String getClassKey() {
return super.classID + "@" + domain; // NOI18N
}
/**
* Getter for property changed.
*
* @return Value of property changed.
*/
@Override
public boolean isChanged() {
return changed;
}
/**
* Setter for property changed.
*
* @param changed New value of property changed.
*/
@Override
public void setChanged(final boolean changed) {
this.changed = changed;
}
/**
* getter for complex editor.
*
* @return complex editor
*/
@Override
public String getComplexEditor() {
return editor;
}
/**
* getter for simple editor.
*
* @return siomple editor
*/
@Override
public String getSimpleEditor() {
return editor;
}
/**
* getter for renderer.
*
* @return renderer
*/
@Override
public String getRenderer() {
return renderer;
}
/**
* Getter for property editor.
*
* @return Value of property editor.
*/
@Override
public java.lang.String getEditor() {
return editor;
}
/**
* Setter for property editor.
*
* @param editor New value of property editor.
*/
@Override
public void setEditor(final java.lang.String editor) {
this.editor = editor;
}
/**
* Setter for property renderer.
*
* @param renderer New value of property renderer.
*/
@Override
public void setRenderer(final java.lang.String renderer) {
this.renderer = renderer;
}
/**
* setter for the primary key sets the value of the attribute being primary key.
*
* @param key value of the key
*
* @return whether a primary key was found and its value set
*/
@Override
public boolean setPrimaryKey(final java.lang.Object key) {
final ObjectAttribute[] as = getAttribs();
for (int i = 0; i < as.length; i++) {
if (as[i].isPrimaryKey()) {
as[i].setValue(key);
return true;
}
}
return false;
}
/**
* setter for modified.
*
* @param status DOCUMENT ME!
*/
// public void setModified() {
// this.status = MODIFIED;}
// /**
// * setter for deleted
// */
// public void setDeleted() {
// this.status = TO_DELETE;}
// /**
// * setter for new
// */
// public void setNew() {
// this.status =NEW;}
//
//
// /**
// * setter for new
// */
// public void setTemplate() {
// this.status =TEMPLATE;}
//
/**
* sets the same status for all Objects in the hirarchy recursively.
*
* @param status DOCUMENT ME!
*/
@Override
public void setAllStatus(final int status) {
this.setStatus(status);
final Iterator attributes = attribHash.values().iterator();
while (attributes.hasNext()) {
final ObjectAttribute a = (ObjectAttribute)attributes.next();
// recursion
if (a.referencesObject()) {
final MetaObject mo = (MetaObject)a.getValue();
if (mo != null) {
mo.setAllStatus(status);
}
}
}
}
@Override
public Collection getURLs(final Collection classKeys) {
if (LOG != null) {
if (LOG.isDebugEnabled()) {
LOG.debug("enter getURLS"); // NOI18N
}
}
final ArrayList l = new ArrayList();
if (classKeys.contains(this.getClassKey())) // class is an URL
{
if (LOG != null) {
if (LOG.isDebugEnabled()) {
LOG.debug("getURL meta object is a url"); // NOI18N
}
}
final UrlConverter u2s = new UrlConverter();
final String url = u2s.convert(this);
l.add(url);
}
final Iterator attributes = attribHash.values().iterator();
while (attributes.hasNext()) {
final ObjectAttribute a = (ObjectAttribute)attributes.next();
// recursion
if (a.referencesObject()) {
final MetaObject mo = (MetaObject)a.getValue();
if (mo != null) {
l.addAll(mo.getURLs(classKeys));
}
}
}
if (LOG != null) {
if (LOG.isDebugEnabled()) {
LOG.debug("end getURLS list contains elementcount = " + l.size()); // NOI18N
}
}
return l;
}
@Override
public Collection getURLsByName(final Collection classKeys, final Collection urlNames) {
if (LOG != null) {
if (LOG.isDebugEnabled()) {
LOG.debug("enter getURLS"); // NOI18N
}
}
final ArrayList l = new ArrayList();
if (classKeys.contains(this.getClassKey())) // class is an URL
{
if (LOG != null) {
if (LOG.isDebugEnabled()) {
LOG.debug("getURL meta object is a url will not search attributes"); // NOI18N
}
}
final UrlConverter u2s = new UrlConverter();
final String url = u2s.convert(this);
l.add(url);
return l;
}
final Collection attrs = getAttributesByName(urlNames);
final Iterator attributes = attrs.iterator();
while (attributes.hasNext()) {
final ObjectAttribute a = (ObjectAttribute)attributes.next();
// recursion
if (a.referencesObject()) {
final MetaObject mo = (MetaObject)a.getValue();
if (mo != null) {
l.addAll(mo.getURLs(classKeys));
}
}
}
if (LOG != null) {
if (LOG.isDebugEnabled()) {
LOG.debug("end getURLS list contains elementcount = " + l.size()); // NOI18N
}
}
return l;
}
@Override
public MetaClass getMetaClass() {
if (metaClass == null) {
setAllClasses();
}
return metaClass;
}
@Override
public void setMetaClass(final MetaClass metaClass) {
this.metaClass = metaClass;
}
@Override
public void setAllClasses(final HashMap classes) {
this.classes = classes;
setAllClasses();
}
@Override
public void setAllClasses() {
if (classes == null) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("Classcache not set yet. Setting classcache in Domain:" + domain); // NOI18N
}
try {
if (classCacheService == null) {
classCacheService = Lookup.getDefault().lookup(MetaClassCacheService.class);
}
if (classCacheService == null) {
LOG.warn("MetaClassCacheService not found via lookup"); // NOI18N
} else {
classes = classCacheService.getAllClasses(domain);
}
} catch (Exception e) {
LOG.error("Error while setting classes.", e); // NOI18N
}
}
if (classes != null) {
final String classKey = domain + this.classID;
final MetaClass mc = (MetaClass)classes.get(classKey);
if (mc != null) {
metaClass = mc;
}
final ObjectAttribute[] oas = this.getAttribs();
for (int i = 0; i < oas.length; i++) {
if (oas[i].referencesObject()) {
final MetaObject mo = (MetaObject)oas[i].getValue();
// recursion
if (mo != null) {
mo.setAllClasses(classes);
}
}
}
} else {
// logger.warn("Classcache konnte nicht gesetzt werden.");
}
}
/**
* String representation of this DefaultObject.
*
* @return DefaultObject as a String
*/
@Override
public String toString() {
// setLogger();
// if (log != null) {
// if (log.isDebugEnabled()) {
// log.debug("MetaClass gesetzt ? " + metaClass);
// }
// }
//
// if (getMetaClass() != null) {
// if (getMetaClass().getToStringConverter() != null) {
// return getMetaClass().getToStringConverter().convert(this);
// } else {
// log.warn("kein Stringvonverter gesetzt");
// return "";
// }
// } else {
// if (log != null) {
// log.warn(
// "keine Klasse und daher kein StringConverter f\u00FCr dieses MetaObject gesetzt : "
// + this.getID());
// }
// log.error("Metaclass was null classId=" + classID);
// return "Metaclass was null";
// }
final MetaClass mc = getMetaClass();
if (mc != null) {
final ToStringConverter converter = metaClass.getToStringConverter();
if (converter != null) {
return converter.convert(this);
} else {
return ""; // NOI18N
}
} else {
return "Metaclass was null"; // NOI18N
}
}
@Override
public org.apache.log4j.Logger getLogger() {
return LOG;
}
@Override
public int getId() {
return super.getID();
}
/**
* DOCUMENT ME!
*
* @param changed DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private String getColorForChangedFlag(final boolean changed) {
if (changed) {
return "\"#D62408\""; // red // NOI18N
} else {
return "\"#FFFFFF\""; // white // NOI18N
}
}
@Override
public String getDebugString() {
String ret = ""; // NOI18N
// System.out.println("class :: "+classID+"object :: " +objectID+" atrubutes"+ attribHash);
// border=\"1\" bgcolor=\"#E0E0E0\"
ret =
"<table border=\"1\" rules=\"all\" cellspacing=\"0\" cellpadding=\"2\"> <tr><th colspan=\"3\" align=\"left\">class = " // NOI18N
+ classID
+ "<br>object id =" // NOI18N
+ objectID
+ "<br>status = " // NOI18N
+ getStatusDebugString()
+ "<br>dummy = " // NOI18N
+ isDummy()
+ "</th></tr>"; // NOI18N
final ObjectAttribute[] as = getAttribs();
for (int i = 0; i < as.length; i++) {
if (as[i].referencesObject() && (as[i].getValue() != null)) {
ret += "<tr><td bgcolor=" // NOI18N
+ getColorForChangedFlag(as[i].isChanged())
+ " valign=\"top\" align=\"right\">" // NOI18N
+ as[i].getName()
+ "</td><td bgcolor=" // NOI18N
+ getColorForChangedFlag(as[i].isChanged())
+ " valign=\"top\" align=\"right\">[" // NOI18N
+ as[i].getMai().getFieldName()
+ "]</td><td>" // NOI18N
+ ((MetaObject)as[i].getValue()).getDebugString()
+ "</td></tr>"; // NOI18N
} else {
final int maxLength = 255;
final String suffix = "...";
String string = as[i].toString();
if (string.length() >= maxLength) {
string = string.substring(0, maxLength - suffix.length())
+ suffix;
}
ret += "<tr><td bgcolor=" // NOI18N
+ getColorForChangedFlag(as[i].isChanged())
+ " valign=\"top\" align=\"right\">" // NOI18N
+ as[i].getName()
+ "</td><td bgcolor=" // NOI18N
+ getColorForChangedFlag(as[i].isChanged())
+ " valign=\"top\" align=\"right\">[" // NOI18N
+ as[i].getMai().getFieldName()
+ "]</td><td>" // NOI18N
+ string
+ "</td></tr>"; // NOI18N
}
}
ret += "</table>"; // NOI18N
return ret;
}
@Override
public String getPropertyString() {
final StringBuilder ret = new StringBuilder(""); // NOI18N
ret.append("Properties:(").append(classID).append(",").append(objectID).append("):\n"); // NOI18N
final ObjectAttribute[] as = getAttribs();
for (int i = 0; i < as.length; i++) {
if (as[i].referencesObject() && (as[i].getValue() != null)) {
ret.append(as[i].getMai().getFieldName()).append("-->") // NOI18N
.append(((MetaObject)as[i].getValue()).getPropertyString());
if (((MetaObject)as[i].getValue()).getStatus() == DefaultMetaObject.TO_DELETE) {
ret.append("**deleteted**"); // NOI18N
}
ret.append("\n"); // NOI18N
} else {
ret.append(as[i].getMai().getFieldName()).append("=").append(as[i].toString()).append("\n");
}
}
return ret.toString();
}
@Override
public boolean propertyEquals(final MetaObject tester) {
try {
final String thisPS = getPropertyString();
final String testerPS = tester.getPropertyString();
return (thisPS.equals(testerPS));
} catch (Exception ex) {
getLogger().error("Error in propertyEquals " + ex); // NOI18N
}
return false;
}
@Override
public CidsBean getBean() {
if (bean == null) {
try {
bean = BeanFactory.getInstance().createBean(this);
} catch (Exception e) {
getLogger().error("Error while creating JavaBean of a MetaObject \n" + getDebugString(), e); // NOI18N
}
}
return bean;
}
@Override
public boolean equals(final Object obj) {
if (obj instanceof MetaObject) {
final MetaObject tmp = (MetaObject)obj;
// debug: if ((getClassID() == tmp.getClassID()) && (getID() == tmp.getID()) &&
// getDomain().equals(tmp.getDomain()) != equals(obj)) { logger.fatal("Different Equals: " + toString() +
// "\n VS \n" + obj); }
if (getID() > -1) {
return (getClassID() == tmp.getClassID())
&& (getID() == tmp.getID())
&& getDomain().equals(tmp.getDomain());
} else {
// not persisted MOs are only equal if they have the same reference
return this
== obj;
}
}
return false;
}
@Override
public int hashCode() {
int hash = 5;
hash = (11 * hash)
+ this.getClassID();
hash = (11 * hash)
+ this.getID();
hash = (11 * hash)
+ this.getDomain().hashCode();
return hash;
}
}