00001
00002
00003
00004
package org.nees.rbnb;
00005
00006
import java.io.IOException;
00007
import java.util.Vector;
00008
import java.util.Hashtable;
00009
import java.util.Enumeration;
00010
00011
import org.w3c.dom.Document;
00012
import org.w3c.dom.Element;
00013
import org.w3c.dom.NodeList;
00014
import org.w3c.dom.Node;
00015
00016
import javax.swing.tree.DefaultMutableTreeNode;
00017
import javax.swing.tree.MutableTreeNode;
00018
00022 public class NeesControlMetadata {
00023
00024
00025
00026
00027
00028
public static final String XML_TAG_FOR_METADATA =
"NEESMetadata";
00029
public static final String XML_TAG_FOR_LINK_LIST =
"links";
00030
public static final String XML_TAG_FOR_LINK =
"link";
00031
public static final String XML_TAG_FOR_TEMPLATE_LIST =
"templates";
00032
public static final String XML_TAG_FOR_TEMPLATE =
"template";
00033
public static final String XML_TAG_FOR_TEMPLATE_NAME =
"templateName";
00034
public static final String XML_TAG_FOR_TEMPLATE_TYPE =
"type";
00035
public static final String XML_TAG_FOR_PARAMETER_LIST =
"parameters";
00036
public static final String XML_TAG_FOR_PARAMETER =
"parameter";
00037
public static final String XML_TAG_FOR_INSTANCE_LIST =
"instances";
00038
public static final String XML_TAG_FOR_INSTANCE =
"instance";
00039
public static final String XML_TAG_FOR_INSTANCE_NAME =
"instanceName";
00040
public static final String XML_TAG_FOR_INSATNCE_TEMPLATE_NAME =
"instanceTemplateName";
00041
public static final String XML_TAG_FOR_INSTANCE_RUNNING_FLAG =
"instanceRunningFlag";
00042
public static final String XML_TAG_FOR_ADDITIONAL_METADATA =
"internalMetadata";
00043
00044
public static final String XML_TAG_FOR_COMMAND =
"Command";
00045
00046
public static final String IMAGE_TYPE =
"image";
00047
public static final String MOVIE_TYPE =
"movie";
00048
public static final String DATA_TYPE =
"data";
00049
public static final String DAQ_TYPE =
"DAQ";
00050
00051
private Vector links =
new Vector();
00052
private Hashtable templates =
new Hashtable();
00053
private Hashtable instances =
new Hashtable();
00054
00055
public NeesControlMetadata()
00056 {
00057 }
00058
00059
public NeesControlMetadata(String xml)
00060 {
00061
setFromXml(xml);
00062 }
00063
00064
public String toXmlString()
00065 {
00066 Document doc =
Xml.createDocument();
00067 buildXmlDoc(doc);
00068
try {
00069
return Xml.writeDocumentToString(doc);
00070 }
catch (IOException e) {
00071
return Xml.errorXml(
"Failed to generate Control Metadata" , e.toString());
00072 }
00073 }
00074
00075
public void buildXmlDoc(Document doc)
00076 {
00077 Node root = doc.createElement(XML_TAG_FOR_METADATA);
00078
if (links.size() > 0) root.appendChild(linksToXml(doc));
00079
if (templates.size() > 0) root.appendChild(templatesToXml(doc));
00080
if (instances.size() > 0) root.appendChild(instancesToXml(doc));
00081 doc.appendChild(root);
00082 }
00083
00088
private Node linksToXml(Document doc) {
00089 Node node, root = doc.createElement(XML_TAG_FOR_LINK_LIST);
00090 Enumeration e = links.elements();
00091
while (e.hasMoreElements())
00092 {
00093 node = doc.createElement(XML_TAG_FOR_LINK);
00094 String link = (String) e.nextElement();
00095 node.appendChild(doc.createTextNode(link));
00096 root.appendChild(node);
00097 }
00098
return root;
00099 }
00100
00105
private Node templatesToXml(Document doc) {
00106 Node root = doc.createElement(XML_TAG_FOR_TEMPLATE_LIST);
00107 Enumeration e = templates.elements();
00108
while (e.hasMoreElements())
00109 {
00110 TemplateDescription t = (TemplateDescription) e.nextElement();
00111
if (t.valid())
00112 root.appendChild(t.createXmlNode(doc));
00113 }
00114
return root;
00115 }
00116
00121
private Node instancesToXml(Document doc) {
00122 Node root = doc.createElement(XML_TAG_FOR_INSTANCE_LIST);
00123 Enumeration e = instances.elements();
00124
while (e.hasMoreElements())
00125 {
00126 InstanceDescription i = (InstanceDescription) e.nextElement();
00127
if (i.valid())
00128 root.appendChild(i.createXmlNode(doc));
00129 }
00130
return root;
00131 }
00132
00133
public TemplateDescription getTemplate(String name)
00134 {
00135
return (TemplateDescription)templates.get(name);
00136 }
00137
00138
public Enumeration getTemplatesEnumeration()
00139 {
00140
return templates.elements();
00141 }
00142
00143
public Hashtable getTemplatesHashtable()
00144 {
00145
return templates;
00146 }
00147
00152 public void putTemplate(String templateName, TemplateDescription
template) {
00153 templates.put(templateName,
template);
00154 }
00155
00156
public InstanceDescription getInstance(String name)
00157 {
00158
return (InstanceDescription)instances.get(name);
00159 }
00160
00161
public boolean deleteInstance(String name)
00162 {
00163
if (name == null)
return false;
00164
00165 InstanceDescription i = getInstance(name);
00166
if (i == null)
return false;
00167
00168
00169
if (i.isRunning())
return false;
00170
00171 instances.remove(name);
00172
00173
return (null == getInstance(name));
00174 }
00175
00176
public Enumeration getInstancesEnumeration()
00177 {
00178
return instances.elements();
00179 }
00180
00181
public Hashtable getInstancesHashtable()
00182 {
00183
return instances;
00184 }
00185
00189 public void setFromXml(String xml)
throws IllegalArgumentException {
00190
00191 Document doc =
Xml.readDocumentFromString(xml);
00192
if (doc == null)
00193
throw new IllegalArgumentException(
"XML string unparsable: " + xml);
00194
00195
00196 Element root = doc.getDocumentElement();
00197
if (!(root.getTagName().equals(XML_TAG_FOR_METADATA)))
00198
throw new IllegalArgumentException(
00199
"XML string does not have root tag with " + XML_TAG_FOR_METADATA
00200 +
"; found " + root.getTagName() +
" instead.");
00201
00202 links.clear();
00203 templates.clear();
00204 instances.clear();
00205
00206
00207 NodeList children = root.getChildNodes();
00208
final int length = children.getLength();
00209
for(
int i = 0; i < length; i++)
00210 {
00211 Node child = children.item(i);
00212
if (child.getNodeType() == Node.ELEMENT_NODE)
00213 {
00214 Element element = (Element)child;
00215 String name = element.getTagName();
00216
if (name.equals(XML_TAG_FOR_LINK_LIST))
00217 addToLinkList(element);
00218
else
00219
if (name.equals(XML_TAG_FOR_TEMPLATE_LIST))
00220 addToTemplateList(element);
00221
else
00222
if (name.equals(XML_TAG_FOR_INSTANCE_LIST))
00223 addToInstanceList(element);
00224
else
00225
throw new IllegalArgumentException(
"unrecognized XML tag = " + name);
00226 }
00227 }
00228 }
00229
00233
private void addToLinkList(Node node) {
00234
00235 NodeList children = node.getChildNodes();
00236
final int length = children.getLength();
00237
for(
int i = 0; i < length; i++)
00238 {
00239 Node child = children.item(i);
00240
if (child.getNodeType() == Node.ELEMENT_NODE)
00241 {
00242 Element element = (Element)child;
00243 String tag = element.getTagName();
00244
if (tag.equals(XML_TAG_FOR_LINK))
00245 {
00246
00247
00248 links.add(child.getChildNodes().item(0).getNodeValue());
00249 }
00250 }
00251 }
00252 }
00253
00257
private void addToTemplateList(Node node) {
00258 NodeList children = node.getChildNodes();
00259
final int length = children.getLength();
00260
for(
int i = 0; i < length; i++)
00261 {
00262 Node child = children.item(i);
00263
if (child.getNodeType() == Node.ELEMENT_NODE)
00264 {
00265 Element element = (Element)child;
00266 String tag = element.getTagName();
00267
if (tag.equals(XML_TAG_FOR_TEMPLATE))
00268 {
00269 TemplateDescription t =
new TemplateDescription(
this, child);
00270
if (t != null) templates.put(t.getName(), t);
00271 }
00272 }
00273 }
00274 }
00275
00279
private void addToInstanceList(Node node) {
00280 NodeList children = node.getChildNodes();
00281
final int length = children.getLength();
00282
for(
int i = 0; i < length; i++)
00283 {
00284 Node child = children.item(i);
00285
if (child.getNodeType() == Node.ELEMENT_NODE)
00286 {
00287 Element element = (Element)child;
00288 String tag = element.getTagName();
00289
if (tag.equals(XML_TAG_FOR_INSTANCE))
00290 {
00291 InstanceDescription n =
new InstanceDescription(
this, child);
00292
if (n != null) instances.put(n.getName(), n);
00293 }
00294 }
00295 }
00296 }
00297
00298
public void addToTemplateList(String name, String type)
00299 {
00300 TemplateDescription t =
new TemplateDescription(
this, name, type);
00301 templates.put(name,t);
00302 }
00303
00304
public void insertParametersToTempateFromBase
00305 (String name, RBNBBase base)
00306 {
00307 TemplateDescription t = (TemplateDescription)templates.get(name);
00308
if (t != null)
00309 t.setParamters(base.getParamterTable());
00310 }
00311
00312
public void addToInstanceList(String name, String templateName)
00313 {
00314 InstanceDescription i =
new InstanceDescription(
this, name, templateName);
00315 instances.put(name,i);
00316 }
00317
00318
public void addToInstanceList
00319 (String name, String templateName, RBNBBase actualInstance)
00320 {
00321 InstanceDescription i =
00322
new InstanceDescription(
this, name, templateName, actualInstance);
00323 instances.put(name,i);
00324 }
00325
00326
public void addParameterToInstance
00327 (String instanceName, String parameterName, String parameterType, Object value)
00328 {
00329 InstanceDescription i = (InstanceDescription)instances.get(instanceName);
00330
if (i != null)
00331 i.addParameter(parameterName, parameterType, value);
00332 }
00333
00334
public DefaultMutableTreeNode insertIntoSwingTree(DefaultMutableTreeNode top)
00335 {
00336 DefaultMutableTreeNode root =
new DefaultMutableTreeNode(
"NeesPOP MCP Metadata");
00337 root.add(makeSwingTreeLinks());
00338 root.add(
makeSwingTreeTemplates());
00339 root.add(makeSwingTreeInstances());
00340 top.add(root);
00341
return top;
00342 }
00343
00347
private MutableTreeNode makeSwingTreeLinks() {
00348 DefaultMutableTreeNode root =
new DefaultMutableTreeNode(
"Links");
00349 Enumeration e = links.elements();
00350
while (e.hasMoreElements())
00351 root.add(
new DefaultMutableTreeNode(e.nextElement()));
00352
return root;
00353 }
00354
00358 protected MutableTreeNode
makeSwingTreeTemplates() {
00359 DefaultMutableTreeNode root =
new DefaultMutableTreeNode(
"Templates");
00360 Enumeration e = templates.elements();
00361
while (e.hasMoreElements())
00362 {
00363 TemplateDescription t = (TemplateDescription)e.nextElement();
00364 root.add(t.makeSwingTreeNode());
00365 }
00366
return root;
00367 }
00368
00372
private MutableTreeNode makeSwingTreeInstances() {
00373 DefaultMutableTreeNode root =
new DefaultMutableTreeNode(
"Instances");
00374 Enumeration e = instances.elements();
00375
while (e.hasMoreElements())
00376 {
00377 InstanceDescription i = (InstanceDescription)e.nextElement();
00378 root.add(i.makeSwingTreeNode());
00379 }
00380
return root;
00381 }
00382
00383 }