1 package com.sri.emo.dbobj.model_tree;
2
3 import com.jcorporate.expresso.core.db.DBException;
4 import com.sri.emo.dbobj.IViewable;
5 import org.apache.log4j.Logger;
6
7 import java.io.Serializable;
8
9 /***
10 * Default Model node used for nesting ModelVisitable data.
11 *
12 * @author Michael Rimov
13 */
14 public class DefaultModelNode extends AbstractModelNode {
15
16 /***
17 * The actual node data. Technically the DefaultModelNode is just a placeholder
18 * and the nodeData is the real concern -- the Model Tree only conforms
19 * the data to a tree-like structure.
20 */
21 private final ModelVisitable nodeData;
22
23 /***
24 * Event sink.
25 */
26 private static final Logger log = Logger.getLogger(DefaultModelNode.class);
27
28 /***
29 * Fill status variable.
30 */
31 private ModelFillStatus fillStatus = ModelFillStatus.COMPLETE;
32
33 /***
34 * Tag information for this node.
35 */
36 private Serializable tagInfo;
37
38 /***
39 * Completion Status (truncated|recursive|complete|undefined).
40 */
41 private NodeCompletionStatus completionStatus = NodeCompletionStatus.UNDEFINED_STATUS;
42
43 /***
44 * Constructor used for a root node.
45 *
46 * @param data The data to be attached.
47 */
48 public DefaultModelNode(final ModelVisitable data) {
49 super();
50 nodeData = data;
51 extractIViewableData(data);
52 }
53
54 /***
55 * Extracts the iviewable data to make the link to view the data.
56 *
57 * @param data ModelVisitable the current data to extract the data from.
58 * @throws IllegalStateException if we cannot extract the data
59 * most likely due to database exception.
60 */
61 private void extractIViewableData(final ModelVisitable data) throws IllegalStateException {
62 if (data instanceof IViewable) {
63 IViewable castedData = (IViewable) data;
64 try {
65 this.setLink(castedData.getViewTrans());
66 this.setLabel(getLink().getLabel());
67 } catch (DBException ex) {
68 log.error("Error getting viewable link from data: " + data.toString(), ex);
69 throw new IllegalStateException(
70 "Error getting viewable link from data: " + data.toString() + " " + ex.getMessage());
71 }
72 }
73 }
74
75 /***
76 * Constructor to indicate a nested node.
77 *
78 * @param nodeParent ModelCompositeNode nodeParent.addChild() is automatically
79 * called by the base class implementation.
80 * @param data the data to be attached to the node.
81 */
82 public DefaultModelNode(final ModelVisitable data, final MutableModelNode nodeParent) {
83 super(nodeParent);
84 nodeData = data;
85 extractIViewableData(data);
86 }
87
88 /***
89 * Retrieve the viewable interface of what we are dealing with.
90 *
91 * @return IViewable
92 */
93 public ModelVisitable getVisitable() {
94 return nodeData;
95 }
96
97 /***
98 * {@inheritDoc}
99 *
100 * @return ModelFillStatus
101 */
102 public ModelFillStatus getModelFillStatus() {
103 return fillStatus;
104 }
105
106 /***
107 * Set the model status in terms of 'filled parts'. A set on a particular
108 * node propagates calls up the tree.
109 *
110 * @param newStatus ModelStatus
111 */
112 public void setModelFilledStatus(ModelFillStatus newStatus) {
113 fillStatus = newStatus;
114 if (this.getParent() != ModelNode.NO_PARENT) {
115 DefaultModelNode parent = (DefaultModelNode) this.getParent();
116 ModelFillStatus oldStatus = parent.getModelFillStatus();
117 ModelFillStatus newParentStatus = oldStatus.intersect(fillStatus);
118 parent.setModelFilledStatus(newParentStatus);
119 }
120 }
121
122 /***
123 * {@inheritDoc}
124 *
125 * @return Serializable
126 */
127 public synchronized Serializable getAdditionalInfo() {
128 return tagInfo;
129 }
130
131 /***
132 * {@inheritDoc}
133 *
134 * @param newInfo the new application-specific information.
135 */
136 public synchronized void setAdditionalInfo(Serializable newInfo) {
137 tagInfo = newInfo;
138 }
139
140 /***
141 * {@inheritDoc}
142 *
143 * @return NodeCompletionStatus
144 */
145 public NodeCompletionStatus getNodeCompletionStatus() {
146 return completionStatus;
147 }
148
149 /***
150 * Sets the node completion status. They can either be Undefined, Complete,
151 * or Recursive -- pointing to another model node in the tree.
152 *
153 * @param newStatus NodeCompletionStatus
154 * @see NodeCompletionStatus
155 */
156 public void setNodeCompletionStatus(NodeCompletionStatus newStatus) {
157 completionStatus = newStatus;
158 }
159
160 }