/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.navigator.types.treenode;
import Sirius.navigator.connection.SessionManager;
import Sirius.navigator.resource.ResourceManager;
import Sirius.server.middleware.types.MetaClass;
import Sirius.server.middleware.types.MetaObject;
import Sirius.server.middleware.types.MetaObjectNode;
import Sirius.server.middleware.types.Node;
import com.vividsolutions.jts.geom.Geometry;
import org.apache.log4j.Logger;
import java.util.HashMap;
import javax.swing.ImageIcon;
import de.cismet.tools.CurrentStackTrace;
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
public class ObjectTreeNode extends DefaultMetaTreeNode {
//~ Static fields/initializers ---------------------------------------------
private static final transient Logger LOG = Logger.getLogger(ObjectTreeNode.class);
private static final ResourceManager resource = ResourceManager.getManager();
private static final HashMap<String, ImageIcon> iconCache = new HashMap<String, ImageIcon>();
//~ Instance fields --------------------------------------------------------
protected Geometry cashedGeometry;
protected String lightweightJson;
/**
* DOCUMENT ME!
*
* @param autoload DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
protected ImageIcon nodeIcon;
/**
* DOCUMENT ME!
*
* @param autoload DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
volatile Boolean metaObjectFilled = false;
/**
* DOCUMENT ME!
*
* @param autoload DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private MetaClass metaClass;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new ObjectTreeNode object.
*
* @param metaObjectNode DOCUMENT ME!
*/
public ObjectTreeNode(final MetaObjectNode metaObjectNode) {
super(metaObjectNode);
try {
final MetaClass myMetaClass = this.getMetaClass();
final String classKey = myMetaClass.getID() + "@" + myMetaClass.getDomain();
nodeIcon = iconCache.get(classKey);
if (nodeIcon == null) {
if ((myMetaClass != null) && (myMetaClass.getObjectIconData().length > 0)) {
this.nodeIcon = new ImageIcon(myMetaClass.getObjectIconData());
} else {
this.nodeIcon = resource.getIcon("ObjectNodeIcon.gif"); // NOI18N
}
iconCache.put(classKey, nodeIcon);
}
} catch (Exception exp) {
LOG.warn("could not load object icon: " + exp.getMessage(), exp);
this.nodeIcon = resource.getIcon("ObjectNodeIcon.gif"); // NOI18N
}
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public MetaObjectNode getMetaObjectNode() {
return (MetaObjectNode)this.userObject;
}
@Override
public TreeNodeLoader getTreeNodeLoader() {
return ((DefaultMetaTreeNode)this.getParent()).getTreeNodeLoader();
}
// --------------------------------------------------------------------------
@Override
public final synchronized void explore() throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("[ObjectNode] Begin explore()"); // NOI18N
}
if (!isExplored() && !this.getMetaObjectNode().isLeaf()) {
this.explored = this.getTreeNodeLoader().addChildren(this);
}
if (LOG.isDebugEnabled()) {
LOG.debug("[ObjectNode] End explore()"); // NOI18N
}
}
@Override
public final boolean isRootNode() {
return false;
}
@Override
public final boolean isWaitNode() {
return false;
}
@Override
public final boolean isPureNode() {
return false;
}
@Override
public final boolean isObjectNode() {
return true;
}
@Override
public final boolean isClassNode() {
return false;
}
@Override
public final String toString() {
String toString = getMetaObjectNode().getName();
if (toString == null) {
final MetaObject mo = getMetaObjectNode().getObject();
if (mo != null) {
toString = mo.toString();
getNode().setName(toString);
} else {
// Implicitly stores toString in getNode().setName(...) for future use.
// See implementation of getMetaObject().
final MetaObject m = getMetaObject();
if (m != null) {
toString = m.toString();
} else {
toString = "null";
}
}
}
return toString;
}
@Override
public final String getDescription() {
return this.getMetaObjectNode().getDescription();
}
@Override
public final ImageIcon getOpenIcon() {
return this.nodeIcon;
}
@Override
public final ImageIcon getClosedIcon() {
return this.nodeIcon;
}
@Override
public final ImageIcon getLeafIcon() {
return this.nodeIcon;
}
@Override
public final boolean equals(final DefaultMetaTreeNode node) {
if (node.isObjectNode() && (this.getID() == node.getID()) && this.getDomain().equals(node.getDomain())) {
return true;
} else {
return false;
}
}
@Override
public final boolean equalsNode(final Node node) {
if ((node instanceof MetaObjectNode) && this.getMetaObjectNode().getDomain().equals(node.getDomain())
&& (this.getMetaObjectNode().getId() == node.getId())) {
return true;
} else {
return false;
}
}
@Override
public final int getID() {
return this.getMetaObjectNode().getId();
}
@Override
public final String getDomain() {
return this.getMetaObjectNode().getDomain();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public final MetaObject getMetaObject() {
return getMetaObject(true);
}
/**
* DOCUMENT ME!
*
* @param autoload DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public final MetaObject getMetaObject(final boolean autoload) {
final MetaObjectNode mon = (MetaObjectNode)this.userObject;
MetaObject mo = mon.getObject();
if (!autoload) {
return mo;
}
if (mo == null) {
synchronized (this) {
mo = mon.getObject();
if (mo == null) {
try {
if (LOG.isDebugEnabled()) {
LOG.debug("caching object node", new CurrentStackTrace()); // NOI18N
}
final int oid = mon.getObjectId();
final int cid = mon.getClassId();
final String domain = mon.getDomain();
final MetaObject metaObject = SessionManager.getProxy().getMetaObject(oid, cid, domain);
mon.setObject(metaObject);
metaObjectFilled = true;
if ((mon.getName() == null) || mon.getName().equals("NameWirdGeladen")) {
mon.setName(metaObject.toString());
}
mo = metaObject;
} catch (final Throwable t) {
String nodeName = String.valueOf(userObject);
if (mon != null) {
nodeName += " (class: " + mon.getClassId() + ", object: " + mon.getObjectId() + ")";
}
LOG.error("could not retrieve meta object of node '" + nodeName + "'", t);
}
}
}
}
return mo;
}
/**
* Setzt ein neues MetaObject, bzw. die ver\u00E4nderte Kopie des alten MetaObjects dieser Node.
*
* @param metaObject DOCUMENT ME!
*/
public final void setMetaObject(final MetaObject metaObject) {
if (LOG.isDebugEnabled()) {
LOG.debug("setting mo from " + getMetaObject() + " to " + metaObject); // NOI18N
}
this.getMetaObjectNode().setObject(metaObject);
this.setChanged(true);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*
* @throws Exception DOCUMENT ME!
*/
public final MetaClass getMetaClass() throws Exception {
if (metaClass == null) {
metaClass = SessionManager.getProxy().getMetaClass(this.getMetaObjectNode().getClassId(), this.getDomain());
}
return metaClass;
}
@Override
public String getKey() throws Exception {
if (LOG.isDebugEnabled()) {
LOG.debug("getkey"); // NOI18N
}
return this.getMetaObject().getKey().toString();
}
@Override
public int getClassID() {
return this.getMetaObjectNode().getClassId();
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Boolean isMetaObjectFilled() {
return metaObjectFilled;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Geometry getCashedGeometry() {
return cashedGeometry;
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public String getLightweightJson() {
return lightweightJson;
}
}