/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Sirius.server.middleware.types;
import Sirius.server.localserver.attribute.Attribute;
import Sirius.server.localserver.attribute.ObjectAttribute;
import Sirius.server.middleware.interfaces.proxy.MetaService;
import Sirius.server.newuser.User;
import Sirius.server.newuser.UserGroup;
import Sirius.util.Mapable;
import org.apache.log4j.Logger;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import de.cismet.cids.dynamics.CidsBean;
import de.cismet.cids.tools.fromstring.FromStringCreator;
/**
* DOCUMENT ME!
*
* @author srichter
* @version $Revision$, $Date$
*/
public final class LightweightMetaObject implements MetaObject, Comparable<LightweightMetaObject> {
//~ Instance fields --------------------------------------------------------
private transient org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(this.getClass());
// use volantile variable to fix "double checked locking" problem!
private transient volatile MetaObject lazyMetaObject;
private transient MetaService metaService;
private final Map<String, Object> attributesMap;
private final int classID;
private final User user;
private int objectID;
private String representation;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new LightweightMetaObject object.
*
* @param classID DOCUMENT ME!
* @param objectID DOCUMENT ME!
* @param user DOCUMENT ME!
* @param attributesMap DOCUMENT ME!
* @param formater DOCUMENT ME!
*/
public LightweightMetaObject(final int classID,
final int objectID,
final User user,
final Map<String, Object> attributesMap,
final AbstractAttributeRepresentationFormater formater) {
this.classID = classID;
this.objectID = objectID;
this.user = user;
this.metaService = null;
this.attributesMap = Collections.unmodifiableMap(attributesMap);
setFormater(formater);
}
//~ Methods ----------------------------------------------------------------
@Override
public HashMap getAllClasses() {
return getRealMetaObject().getAllClasses();
}
@Override
public CidsBean getBean() {
return getRealMetaObject().getBean();
}
@Override
public String getComplexEditor() {
return getRealMetaObject().getComplexEditor();
}
@Override
public String getDebugString() {
return getRealMetaObject().getDebugString();
}
@Override
public String getDescription() {
return getRealMetaObject().getDescription();
}
@Override
public String getEditor() {
return getRealMetaObject().getEditor();
}
@Override
public String getGroup() {
return getRealMetaObject().getGroup();
}
@Override
public Logger getLogger() {
return getRealMetaObject().getLogger();
}
@Override
public MetaClass getMetaClass() {
return getRealMetaObject().getMetaClass();
}
@Override
public String getName() {
return getRealMetaObject().getName();
}
@Override
public String getPropertyString() {
return getRealMetaObject().getPropertyString();
}
@Override
public String getRenderer() {
return getRealMetaObject().getRenderer();
}
@Override
public String getSimpleEditor() {
return getRealMetaObject().getSimpleEditor();
}
@Override
public Collection getURLs(final Collection classKeys) {
return getRealMetaObject().getURLs(classKeys);
}
@Override
public Collection getURLsByName(final Collection classKeys, final Collection urlNames) {
return getRealMetaObject().getURLsByName(classKeys, urlNames);
}
@Override
public boolean isChanged() {
return getRealMetaObject().isChanged();
}
@Override
public boolean propertyEquals(final MetaObject tester) {
return getRealMetaObject().propertyEquals(tester);
}
@Override
public void setAllClasses(final HashMap classes) {
getRealMetaObject().setAllClasses(classes);
}
@Override
public void setAllClasses() {
getRealMetaObject().setAllClasses();
}
@Override
public void setAllStatus(final int status) {
getRealMetaObject().setAllStatus(status);
}
@Override
public void setArrayKey2PrimaryKey() {
getRealMetaObject().setArrayKey2PrimaryKey();
}
@Override
public void setChanged(final boolean changed) {
getRealMetaObject().setChanged(changed);
}
@Override
public void setEditor(final String editor) {
getRealMetaObject().setEditor(editor);
}
@Override
public void setMetaClass(final MetaClass metaClass) {
getRealMetaObject().setMetaClass(metaClass);
}
@Override
public boolean setPrimaryKey(final Object key) {
return getRealMetaObject().setPrimaryKey(key);
}
@Override
public void setRenderer(final String renderer) {
getRealMetaObject().setRenderer(renderer);
}
@Override
public String toString(final HashMap classes) {
return getRealMetaObject().toString(classes);
}
/**
* DOCUMENT ME!
*
* @param objectAttributes DOCUMENT ME!
*/
@Override
public void addAllAttributes(final ObjectAttribute[] objectAttributes) {
getRealMetaObject().addAllAttributes(objectAttributes);
}
/**
* DOCUMENT ME!
*
* @param anyAttribute DOCUMENT ME!
*/
@Override
public void addAttribute(final ObjectAttribute anyAttribute) {
getRealMetaObject().addAttribute(anyAttribute);
}
/**
* DOCUMENT ME!
*
* @param m DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public Object constructKey(final Mapable m) {
return getRealMetaObject().constructKey(m);
}
/**
* DOCUMENT ME!
*
* @param ug DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public Sirius.server.localserver.object.Object filter(final UserGroup ug) {
return getRealMetaObject().filter(ug);
}
/**
* DOCUMENT ME!
*
* @param objectRepresentation DOCUMENT ME!
* @param mo DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
@Override
public Object fromString(final String objectRepresentation, final Object mo) throws Exception {
return getRealMetaObject().fromString(objectRepresentation, mo);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public ObjectAttribute[] getAttribs() {
return getRealMetaObject().getAttribs();
}
/**
* DOCUMENT ME!
*
* @param key DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public Object getAttribute(final Object key) {
return getRealMetaObject().getAttribute(key);
}
/**
* DOCUMENT ME!
*
* @param fieldname DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public ObjectAttribute getAttributeByFieldName(final String fieldname) {
return getRealMetaObject().getAttributeByFieldName(fieldname);
}
/**
* DOCUMENT ME!
*
* @param name DOCUMENT ME!
* @param maxResult DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public Collection<Attribute> getAttributeByName(final String name, final int maxResult) {
return getRealMetaObject().getAttributeByName(name, maxResult);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public HashMap getAttributes() {
return getRealMetaObject().getAttributes();
}
/**
* DOCUMENT ME!
*
* @param names DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public Collection getAttributesByName(final Collection names) {
return getRealMetaObject().getAttributesByName(names);
}
/**
* DOCUMENT ME!
*
* @param c DOCUMENT ME!
* @param recursionDepth DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public Collection getAttributesByType(final Class c, final int recursionDepth) {
return getRealMetaObject().getAttributesByType(c, recursionDepth);
}
/**
* DOCUMENT ME!
*
* @param c DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public Collection getAttributesByType(final Class c) {
return getRealMetaObject().getAttributesByType(c);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public Object getKey() {
return getRealMetaObject().getKey();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public Attribute getPrimaryKey() {
return getRealMetaObject().getPrimaryKey();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public ObjectAttribute getReferencingObjectAttribute() {
return getRealMetaObject().getReferencingObjectAttribute();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public int getStatus() {
return getRealMetaObject().getStatus();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public String getStatusDebugString() {
return getRealMetaObject().getStatusDebugString();
}
/**
* DOCUMENT ME!
*
* @param c DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public Collection getTraversedAttributesByType(final Class c) {
return getRealMetaObject().getTraversedAttributesByType(c);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public boolean isDummy() {
return getRealMetaObject().isDummy();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public boolean isPersistent() {
return getRealMetaObject().isPersistent();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public boolean isStringCreateable() {
return getRealMetaObject().isStringCreateable();
}
/**
* DOCUMENT ME!
*
* @param anyAttribute DOCUMENT ME!
*/
@Override
public void removeAttribute(final ObjectAttribute anyAttribute) {
getRealMetaObject().removeAttribute(anyAttribute);
}
/**
* DOCUMENT ME!
*
* @param dummy DOCUMENT ME!
*/
@Override
public void setDummy(final boolean dummy) {
getRealMetaObject().setDummy(dummy);
}
/**
* DOCUMENT ME!
*
* @param persistent DOCUMENT ME!
*/
@Override
public void setPersistent(final boolean persistent) {
getRealMetaObject().setPersistent(persistent);
}
/**
* DOCUMENT ME!
*/
@Override
public void setPrimaryKeysNull() {
getRealMetaObject().setPrimaryKeysNull();
}
/**
* DOCUMENT ME!
*
* @param referencingObjectAttribute DOCUMENT ME!
*/
@Override
public void setReferencingObjectAttribute(final ObjectAttribute referencingObjectAttribute) {
getRealMetaObject().setReferencingObjectAttribute(referencingObjectAttribute);
}
/**
* DOCUMENT ME!
*
* @param status DOCUMENT ME!
*/
@Override
public void setStatus(final int status) {
getRealMetaObject().setStatus(status);
}
/**
* DOCUMENT ME!
*/
@Override
public void setValuesNull() {
getRealMetaObject().setValuesNull();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public FromStringCreator getObjectCreator() {
return getRealMetaObject().getObjectCreator();
}
/**
* DOCUMENT ME!
*
* @param formater DOCUMENT ME!
*/
public void setFormater(final AbstractAttributeRepresentationFormater formater) {
if (formater != null) {
formater.setAttributes(attributesMap);
representation = formater.getRepresentation();
} else {
representation = "FORMATER IS NULL! (cID=" + classID + ", oID=" + objectID + ")"; // NOI18N
}
}
/**
* DOCUMENT ME!
*
* @param aName DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Object getLWAttribute(final String aName) {
return attributesMap.get(aName);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Set<String> getKnownAttributeNames() {
return attributesMap.keySet();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
* @throws IllegalStateException DOCUMENT ME!
*/
private MetaObject fetchRealMetaObject() throws Exception {
if (metaService == null) {
throw new IllegalStateException(
"Can not retrieve MetaObject, as Metaservice for LightweightMetaObject \""
+ toString() // NOI18N
+ "\" is null!"); // NOI18N
}
return metaService.getMetaObject(getUser(), getObjectID(), getClassID(), getUser().getDomain());
}
@Override
public String toString() {
return representation;
}
@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)) { log.fatal("Different Equals: " + toString() + "\n
// VS \n" + obj); }
return (getClassID() == tmp.getClassID()) && (getObjectID() == tmp.getID())
&& getDomain().equals(tmp.getDomain());
}
return false;
}
@Override
public int hashCode() {
int hash = 5;
hash = (11 * hash) + this.getClassID();
hash = (11 * hash) + this.getObjectID();
hash = (11 * hash) + this.getDomain().hashCode();
return hash;
}
/**
* DOCUMENT ME!
*
* @return the classID
*/
@Override
public int getClassID() {
return classID;
}
/**
* DOCUMENT ME!
*
* @return the objectID
*/
public int getObjectID() {
return objectID;
}
/**
* DOCUMENT ME!
*
* @return the user
*/
public User getUser() {
return user;
}
/**
* DOCUMENT ME!
*
* @param o DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public int compareTo(final LightweightMetaObject o) {
return representation.compareTo(o + ""); // NOI18N
}
/**
* DOCUMENT ME!
*
* @return the metaService
*/
public MetaService getMetaService() {
return metaService;
}
/**
* DOCUMENT ME!
*
* @param metaService the metaService to set
*/
public void setMetaService(final MetaService metaService) {
this.metaService = metaService;
}
/**
* Lazy loads for the real MetaObject if needed, the returns it.
*
* @return the real MetaObject which the LWMetaObject is a proxy for.
*
* @throws IllegalStateException DOCUMENT ME!
*/
public MetaObject getRealMetaObject() {
if (lazyMetaObject == null) {
synchronized (this) {
try {
lazyMetaObject = fetchRealMetaObject();
} catch (Exception ex) {
throw new IllegalStateException(ex);
}
}
}
return lazyMetaObject;
}
/**
* DOCUMENT ME!
*
* @param objectID DOCUMENT ME!
*/
@Override
public void setID(final int objectID) {
this.objectID = objectID;
getRealMetaObject().setID(objectID);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
@Override
public int getID() {
return getObjectID();
}
@Override
public int getId() {
return getObjectID();
}
@Override
public String getDomain() {
return getUser().getDomain();
}
@Override
public String getClassKey() {
return classID + "@" + getUser().getDomain(); // NOI18N
}
}