package net.sourceforge.phpdt.sql.view.bookmark; import java.util.Collections; import java.util.Vector; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import net.sourceforge.phpdt.sql.Messages; import net.sourceforge.phpdt.sql.sql.metadata.MetaDataXMLInterface; import net.sourceforge.phpdt.sql.sql.metadata.ObjectMetaData; public class SubsetNode implements TreeNode { private String name = null; private Vector children = new Vector(); public SubsetNode(SubsetNode param) { name = param.name; children.addAll(param.children); } public ObjectMetaData getMetaData() { return null; //no metadata implementation for now } public SubsetNode() { } public SubsetNode(String name) { this.name = name; } public void setName(String name) { this.name = name; } public String getName(){ return name; } public Object[] getChildren() { return children.toArray(); } public Object getParent() { return Root.ROOT; } public boolean hasChildren() { if (children != null && children.size() > 0) { return true; } return false; } public void setChildren(Vector children) { for (int i = 0; i < children.size(); i++) { Object obj = children.elementAt(i); isValid(obj); } Collections.sort(children); this.children = children; } public void isValid(Object child) { boolean valid = false; if (child instanceof ObjectNode ) { valid = true; } if (!valid) { throw new RuntimeException("Invalid SubsetNode child: " + child.getClass().getName()); //$NON-NLS-1$ } } /** * Finds a child of the SubsetNode with the said name * @param name * @return the TreeNode found. null if none */ public TreeNode find(String name){ for (int i = 0; i < children.size(); i++) { Object obj = children.elementAt(i); if (obj instanceof TreeNode){ TreeNode node = (TreeNode) obj; if (name.equals(node.getName())) return node; } } return null; } public boolean add(ObjectNode object){ if (children.indexOf(object) >= 0) return false; children.add(object); return true; } public boolean addReplace(ObjectNode object){ children.remove(object); return add(object); } public boolean remove(ObjectNode object){ return children.remove(object); } public void exportXML(Element root) { Element sub = MetaDataXMLInterface.createElementText(root,Messages.getString("ExportXMLAction.Subset"), ""); //$NON-NLS-1$ //$NON-NLS-2$ MetaDataXMLInterface.createElementText(sub,Messages.getString("ExportXMLAction.SubsetName"), getName()); //$NON-NLS-1$ for (int i = 0; i < children.size(); i++) { Object obj = children.elementAt(i); if (obj instanceof ObjectNode){ ((ObjectNode) obj).exportXML(sub); } } } /** * Imports a set of XML tags (parsed into a XMLDocument) into a Subset * @param root Document to get the data from * @param replace True if you want to replace already-existing elements with the same name, false if not */ public void importXML(Element root, boolean replace) { if (replace) { String name = MetaDataXMLInterface.getElementText(root, Messages.getString("ExportXMLAction.SubsetName")); //$NON-NLS-1$ if (name == "") return; //$NON-NLS-1$ setName(name); } importElementXML(root, replace, Messages.getString("ExportXMLAction.Table")); //$NON-NLS-1$ importElementXML(root, replace, Messages.getString("ExportXMLAction.View")); //$NON-NLS-1$ } /** * * Imports one type of element from a XMLDocument (possibly a part of one) into a Subset * @param root Document to get the data from * @param replace True if you want to replace already-existing elements with the same name, false if not * @param type The type of element to import, has to correspond with the XML tag */ private void importElementXML(Element root, boolean replace, String type) { // We get all the tags named as the type NodeList tables = root.getElementsByTagName(type); for (int i = 0; i < tables.getLength(); i++) { Element table = (Element) tables.item(i); ObjectNode objectNode = ObjectNode.importXML(table, this); if (replace)addReplace(objectNode); else add(objectNode); } } }