// ********************************************************************** // // Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved. // // This copy of Ice is licensed to you under the terms described in the // ICE_LICENSE file included in this distribution. // // ********************************************************************** package IceGridGUI.Application; import java.awt.Component; import java.util.Enumeration; import javax.swing.Icon; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; import javax.swing.JTextField; import javax.swing.JTree; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeCellRenderer; import javax.swing.tree.DefaultTreeCellRenderer; import IceGrid.*; import IceGridGUI.*; class Node extends TreeNode implements PropertySetParent { static public NodeDescriptor copyDescriptor(NodeDescriptor nd) { NodeDescriptor copy = (NodeDescriptor)nd.clone(); copy.propertySets = PropertySets.copyDescriptors(copy.propertySets); copy.serverInstances = new java.util.LinkedList(); for(ServerInstanceDescriptor p : nd.serverInstances) { copy.serverInstances.add(ServerInstance.copyDescriptor(p)); } copy.servers = new java.util.LinkedList(); for(ServerDescriptor p : nd.servers) { copy.servers.add(PlainServer.copyDescriptor(p)); } return copy; } public Enumeration children() { return new Enumeration() { public boolean hasMoreElements() { if(!_p.hasNext()) { if(!_iteratingOverServers) { _p = _servers.iterator(); _iteratingOverServers = true; return _p.hasNext(); } return false; } return true; } public Object nextElement() { return _p.next(); } private java.util.Iterator _p = _propertySets.iterator(); private boolean _iteratingOverServers = false; }; } public boolean getAllowsChildren() { return true; } public javax.swing.tree.TreeNode getChildAt(int childIndex) { if(childIndex < 0) { throw new ArrayIndexOutOfBoundsException(childIndex); } else if(childIndex < _propertySets.size()) { return _propertySets.get(childIndex); } else if(childIndex < (_propertySets.size() + _servers.size())) { return (javax.swing.tree.TreeNode)_servers.get(childIndex - _propertySets.size()); } else { throw new ArrayIndexOutOfBoundsException(childIndex); } } public int getChildCount() { return _propertySets.size() + _servers.size(); } public int getIndex(javax.swing.tree.TreeNode node) { if(node instanceof PropertySet) { return _propertySets.indexOf(node); } else { int index = _servers.indexOf(node); if(index != -1) { index += _propertySets.size(); } return index; } } public boolean isLeaf() { return _propertySets.isEmpty() && _servers.isEmpty(); } void removeServers(String[] childIds) { removeSortedChildren(childIds, _servers, getRoot().getTreeModel()); } void removePropertySets(String[] childIds) { removeSortedChildren(childIds, _propertySets, getRoot().getTreeModel()); } void childrenChanged(java.util.List children) { childrenChanged(children, getRoot().getTreeModel()); } Server findServer(String id) { return (Server)find(id, _servers); } PropertySet findPropertySet(String id) { return (PropertySet)find(id, _propertySets); } void insertPropertySets(java.util.List newChildren, boolean fireEvent) throws UpdateFailedException { DefaultTreeModel treeModel = fireEvent ? getRoot().getTreeModel() : null; String badChildId = insertSortedChildren(newChildren, _propertySets, treeModel); if(badChildId != null) { throw new UpdateFailedException(this, badChildId); } } void insertServer(TreeNode child, boolean fireEvent) throws UpdateFailedException { DefaultTreeModel treeModel = fireEvent ? getRoot().getTreeModel() : null; if(!insertSortedChild(child, _servers, treeModel)) { throw new UpdateFailedException(this, child.getId()); } } void insertServers(java.util.List newChildren, boolean fireEvent) throws UpdateFailedException { DefaultTreeModel treeModel = fireEvent ? getRoot().getTreeModel() : null; String badChildId = insertSortedChildren(newChildren, _servers, treeModel); if(badChildId != null) { throw new UpdateFailedException(this, badChildId); } } void removeServer(TreeNode child) { int index = getIndex(child); _servers.remove(child); getRoot().getTreeModel().nodesWereRemoved(this, new int[]{index}, new Object[]{child}); } public void insertPropertySet(PropertySet child, boolean fireEvent) throws UpdateFailedException { DefaultTreeModel treeModel = fireEvent ? getRoot().getTreeModel() : null; if(!insertSortedChild(child, _propertySets, treeModel)) { throw new UpdateFailedException(this, child.getId()); } } public void removePropertySet(PropertySet child) { int index = getIndex(child); _propertySets.remove(child); getRoot().getTreeModel().nodesWereRemoved(this, new int[]{index}, new Object[]{child}); } public void removeDescriptor(String id) { _descriptor.propertySets.remove(id); } public Editable getEditable() { return _editable; } public boolean[] getAvailableActions() { boolean[] actions = new boolean[ACTION_COUNT]; actions[COPY] = !_ephemeral; actions[DELETE] = true; Object descriptor = getCoordinator().getClipboard(); if(descriptor != null) { actions[PASTE] = descriptor instanceof NodeDescriptor || descriptor instanceof ServerInstanceDescriptor || descriptor instanceof ServerDescriptor || descriptor instanceof PropertySetDescriptor; } if(!_ephemeral) { actions[SHOW_VARS] = true; actions[SUBSTITUTE_VARS] = true; actions[NEW_PROPERTY_SET] = true; actions[NEW_SERVER] = true; actions[NEW_SERVER_ICEBOX] = true; actions[NEW_SERVER_FROM_TEMPLATE] = true; } return actions; } public JPopupMenu getPopupMenu() { ApplicationActions actions = getCoordinator().getActionsForPopup(); if(_popup == null) { _popup = new JPopupMenu(); _popup.add(actions.get(NEW_PROPERTY_SET)); _popup.addSeparator(); _popup.add(actions.get(NEW_SERVER)); _popup.add(actions.get(NEW_SERVER_ICEBOX)); _popup.add(actions.get(NEW_SERVER_FROM_TEMPLATE)); } actions.setTarget(this); return _popup; } public void copy() { getCoordinator().setClipboard(copyDescriptor(_descriptor)); getCoordinator().getActionsForMenu().get(PASTE).setEnabled(true); } public void paste() { Object descriptor = getCoordinator().getClipboard(); if(descriptor instanceof NodeDescriptor) { ((TreeNode)_parent).paste(); } else if(descriptor instanceof PropertySetDescriptor) { newPropertySet(PropertySet.copyDescriptor((PropertySetDescriptor)descriptor)); } else if(descriptor instanceof ServerInstanceDescriptor) { // // Remove any extra parameters // ServerInstanceDescriptor sid = ServerInstance.copyDescriptor((ServerInstanceDescriptor)descriptor); TemplateDescriptor td = getRoot().findServerTemplateDescriptor(sid.template); if(td != null) { sid.parameterValues.keySet().retainAll(td.parameters); } newServer(sid); } else { ServerDescriptor sd = PlainServer.copyDescriptor((ServerDescriptor)descriptor); if(sd instanceof IceBoxDescriptor) { if(!getRoot().pasteIceBox((IceBoxDescriptor)sd)) { return; } } newServer(sd); } } public void newPropertySet() { newPropertySet(new PropertySetDescriptor(new String[0], new java.util.LinkedList())); } public void newServer() { newServer(PlainServer.newServerDescriptor()); } public void newServerIceBox() { newServer(PlainServer.newIceBoxDescriptor()); } public void newServerFromTemplate() { ServerInstanceDescriptor descriptor = new ServerInstanceDescriptor("", new java.util.HashMap(), new PropertySetDescriptor( new String[0], new java.util.LinkedList()), new java.util.HashMap()); newServer(descriptor); } public void destroy() { Nodes nodes = (Nodes)_parent; if(_ephemeral) { nodes.removeChild(this); } else { nodes.removeChild(this); nodes.removeDescriptor(_id); nodes.getEditable().removeElement(_id, _editable, Node.class); getRoot().updated(); } } public Component getTreeCellRendererComponent( JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { if(_cellRenderer == null) { // // Initialization // _cellRenderer = new DefaultTreeCellRenderer(); Icon nodeIcon = Utils.getIcon("/icons/16x16/node.png"); _cellRenderer.setOpenIcon(nodeIcon); _cellRenderer.setClosedIcon(nodeIcon); } return _cellRenderer.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); } public Editor getEditor() { if(_editor == null) { _editor = (NodeEditor)getRoot().getEditor(NodeEditor.class, this); } _editor.show(this); return _editor; } protected Editor createEditor() { return new NodeEditor(); } public boolean isEphemeral() { return _ephemeral; } Object getDescriptor() { return _descriptor; } NodeDescriptor saveDescriptor() { return (NodeDescriptor)_descriptor.clone(); } void restoreDescriptor(NodeDescriptor copy) { _descriptor.description = copy.description; _descriptor.loadFactor = copy.loadFactor; _descriptor.variables = copy.variables; } void write(XMLWriter writer) throws java.io.IOException { if(!_ephemeral) { java.util.List attributes = new java.util.LinkedList(); attributes.add(createAttribute("name", _id)); if(_descriptor.loadFactor.length() > 0) { attributes.add(createAttribute("load-factor", _descriptor.loadFactor)); } writer.writeStartTag("node", attributes); if(_descriptor.description.length() > 0) { writer.writeElement("description", _descriptor.description); } writeVariables(writer, _descriptor.variables); for(PropertySet p : _propertySets) { p.write(writer); } for(Server p : _servers) { TreeNode server = (TreeNode)p; server.write(writer); } writer.writeEndTag("node"); } } static class Backup { Utils.Resolver resolver; java.util.List backupList; java.util.List servers; } // // Try to rebuild this node; // returns a backup object if rollback is later necessary // We don't rebuild the property sets since they don't // depend on the variables. // Backup rebuild(java.util.List editables) throws UpdateFailedException { Root root = getRoot(); Backup backup = new Backup(); backup.resolver = _resolver; @SuppressWarnings("unchecked") Utils.Resolver resolver = new Utils.Resolver(new java.util.Map[] {_descriptor.variables, root.getVariables()}); _resolver = resolver; _resolver.put("application", root.getId()); _resolver.put("node", _id); backup.backupList = new java.util.Vector(); backup.servers = new java.util.LinkedList(_servers); for(Server p : backup.servers) { try { backup.backupList.add(p.rebuild(editables)); } catch(UpdateFailedException e) { restore(backup); throw e; } } return backup; } void commit() { _editable.commit(); _origVariables = _descriptor.variables; _origDescription = _descriptor.description; _origLoadFactor = _descriptor.loadFactor; for(PropertySet p : _propertySets) { p.commit(); } for(Server p : _servers) { p.getEditable().commit(); } } void restore(Backup backup) { for(int i = backup.backupList.size() - 1; i >= 0; --i) { backup.servers.get(i).restore(backup.backupList.get(i)); } _resolver = backup.resolver; } ServerInstance createServer(boolean brandNew, ServerInstanceDescriptor instanceDescriptor) throws UpdateFailedException { Root root = getRoot(); // // Find template // TemplateDescriptor templateDescriptor = root.findServerTemplateDescriptor(instanceDescriptor.template); if(templateDescriptor == null) { throw new UpdateFailedException("Cannot find template descriptor '" + instanceDescriptor.template + "' referenced by server-instance"); } ServerDescriptor serverDescriptor = (ServerDescriptor)templateDescriptor.descriptor; assert serverDescriptor != null; boolean isIceBox = serverDescriptor instanceof IceBoxDescriptor; // // Build resolver // Utils.Resolver instanceResolver = new Utils.Resolver(_resolver, instanceDescriptor.parameterValues, templateDescriptor.parameterDefaults); String serverId = instanceResolver.substitute(serverDescriptor.id); instanceResolver.put("server", serverId); // // Create server // return new ServerInstance(brandNew, this, serverId, instanceResolver, instanceDescriptor, isIceBox); } PlainServer createServer(boolean brandNew, ServerDescriptor serverDescriptor) throws UpdateFailedException { // // Build resolver // Utils.Resolver instanceResolver = new Utils.Resolver(_resolver); String serverId = instanceResolver.substitute(serverDescriptor.id); instanceResolver.put("server", serverId); // // Create server // return new PlainServer(brandNew, this, serverId, instanceResolver, serverDescriptor); } NodeUpdateDescriptor getUpdate() { NodeUpdateDescriptor update = new NodeUpdateDescriptor(); update.name = _id; // // First: property sets // if(_editable.isNew()) { update.removePropertySets = new String[0]; update.propertySets = _descriptor.propertySets; } else { update.removePropertySets = _editable.removedElements(PropertySet.class); update.propertySets = new java.util.HashMap(); for(PropertySet p : _propertySets) { if(p.getEditable().isNew() || p.getEditable().isModified()) { update.propertySets.put(p.getId(), (PropertySetDescriptor)p.getDescriptor()); } } } // // Then: servers // if(_editable.isNew()) { update.removeServers = new String[0]; } else { update.removeServers = _editable.removedElements(Server.class); } update.serverInstances = new java.util.LinkedList(); update.servers = new java.util.LinkedList(); for(Server p : _servers) { if(_editable.isNew() || p.getEditable().isModified() || p.getEditable().isNew()) { if(p instanceof PlainServer) { update.servers.add((ServerDescriptor)p.getDescriptor()); } else { update.serverInstances.add((ServerInstanceDescriptor)p.getDescriptor()); } } } // // Anything in this update? // if(!_editable.isNew() && !_editable.isModified() && update.removePropertySets.length == 0 && update.propertySets.size() == 0 && update.removeServers.length == 0 && update.servers.size() == 0 && update.serverInstances.size() == 0) { return null; } if(_editable.isNew()) { update.variables = _descriptor.variables; update.removeVariables = new String[0]; update.loadFactor = new IceGrid.BoxedString(_descriptor.loadFactor); update.description = new IceGrid.BoxedString(_descriptor.description); } else { if(!_descriptor.description.equals(_origDescription)) { update.description = new IceGrid.BoxedString(_descriptor.description); } if(!_descriptor.loadFactor.equals(_origLoadFactor)) { update.loadFactor = new IceGrid.BoxedString(_descriptor.loadFactor); } // // Diff variables (TODO: avoid duplication with same code in Root) // update.variables = new java.util.TreeMap(_descriptor.variables); java.util.List removeVariables = new java.util.LinkedList(); for(java.util.Map.Entry p : _origVariables.entrySet()) { String key = p.getKey(); String newValue = update.variables.get(key); if(newValue == null) { removeVariables.add(key); } else { String value = p.getValue(); if(newValue.equals(value)) { update.variables.remove(key); } } } update.removeVariables = removeVariables.toArray(new String[0]); } return update; } void update(NodeUpdateDescriptor update, java.util.Set serverTemplates, java.util.Set serviceTemplates) throws UpdateFailedException { Root root = getRoot(); java.util.Vector newServers = new java.util.Vector(); java.util.Vector updatedServers = new java.util.Vector(); if(update != null) { // // Description // if(update.description != null) { _descriptor.description = update.description.value; _origDescription = _descriptor.description; } // // Load factor // if(update.loadFactor != null) { _descriptor.loadFactor = update.loadFactor.value; _origLoadFactor = _descriptor.loadFactor; } // // Variables // for(String name : update.removeVariables) { _descriptor.variables.remove(name); } _descriptor.variables.putAll(update.variables); // // Property Sets // removePropertySets(update.removePropertySets); for(String id : update.removePropertySets) { _descriptor.propertySets.remove(id); } java.util.Vector newPropertySets = new java.util.Vector(); java.util.Vector updatedPropertySets = new java.util.Vector(); for(java.util.Map.Entry p : update.propertySets.entrySet()) { String id = p.getKey(); PropertySetDescriptor psd = p.getValue(); // // Lookup named property set // PropertySet ps = findPropertySet(id); if(ps != null) { ps.rebuild(psd); updatedPropertySets.add(ps); } else { ps = new PropertySet(false, this, id, id, psd); newPropertySets.add(ps); _descriptor.propertySets.put(id, psd); } } childrenChanged(updatedPropertySets); insertPropertySets(newPropertySets, true); // // Update _descriptor // for(String id : update.removeServers) { Server server = findServer(id); removeDescriptor(server); } // // One big set of removes // removeServers(update.removeServers); // // One big set of updates, followed by inserts // for(ServerInstanceDescriptor p : update.serverInstances) { // // Find template // TemplateDescriptor templateDescriptor = root.findServerTemplateDescriptor(p.template); assert templateDescriptor != null; ServerDescriptor serverDescriptor = (ServerDescriptor)templateDescriptor.descriptor; assert serverDescriptor != null; // // Build resolver // Utils.Resolver instanceResolver = new Utils.Resolver(_resolver, p.parameterValues, templateDescriptor.parameterDefaults); String serverId = instanceResolver.substitute(serverDescriptor.id); instanceResolver.put("server", serverId); // // Lookup servers // ServerInstance server = (ServerInstance)findServer(serverId); if(server != null) { removeDescriptor(server); server.rebuild(instanceResolver, p, serverDescriptor instanceof IceBoxDescriptor); updatedServers.add(server); _descriptor.serverInstances.add(p); } else { server = new ServerInstance(false, this, serverId, instanceResolver, p, serverDescriptor instanceof IceBoxDescriptor); newServers.add(server); _descriptor.serverInstances.add(p); } } // // Plain servers // for(ServerDescriptor p : update.servers) { // // Build resolver // Utils.Resolver instanceResolver = new Utils.Resolver(_resolver); String serverId = instanceResolver.substitute(p.id); instanceResolver.put("server", serverId); // // Lookup server // PlainServer server = (PlainServer)findServer(serverId); if(server != null) { removeDescriptor(server); server.rebuild(instanceResolver, p); updatedServers.add(server); _descriptor.servers.add(p); } else { server = new PlainServer(false, this, serverId, instanceResolver, p); newServers.add(server); _descriptor.servers.add(p); } } } // // Find servers affected by template updates // java.util.Set serverSet = new java.util.HashSet(); for(String p : serverTemplates) { java.util.List serverInstances = findServerInstances(p); for(ServerInstance q : serverInstances) { if(!updatedServers.contains(q) && !newServers.contains(q)) { serverSet.add(q); } } } // // Servers affected by service-template updates // for(String p : serviceTemplates) { java.util.List serviceInstances = findServiceInstances(p); for(ServiceInstance q : serviceInstances) { Server server = (Server)q.getParent().getParent(); if(!updatedServers.contains(server) && !newServers.contains(server)) { serverSet.add(server); } } } // // Rebuild these servers // for(Server p : serverSet) { if(p instanceof PlainServer) { PlainServer ps = (PlainServer)p; ServerDescriptor serverDescriptor = (ServerDescriptor)ps.getDescriptor(); Utils.Resolver instanceResolver = new Utils.Resolver(_resolver); String serverId = instanceResolver.substitute(serverDescriptor.id); assert serverId.equals(ps.getId()); ps.rebuild(instanceResolver, serverDescriptor); } else { ServerInstance si = (ServerInstance)p; ServerInstanceDescriptor instanceDescriptor = (ServerInstanceDescriptor)si.getDescriptor(); TemplateDescriptor templateDescriptor = root.findServerTemplateDescriptor(instanceDescriptor.template); assert templateDescriptor != null; ServerDescriptor serverDescriptor = (ServerDescriptor)templateDescriptor.descriptor; assert serverDescriptor != null; Utils.Resolver instanceResolver = new Utils.Resolver(_resolver, instanceDescriptor.parameterValues, templateDescriptor.parameterDefaults); String serverId = instanceResolver.substitute(serverDescriptor.id); assert serverId.equals(si.getId()); si.rebuild(instanceResolver, instanceDescriptor, serverDescriptor instanceof IceBoxDescriptor); } updatedServers.add(p); } childrenChanged(updatedServers); insertServers(newServers, true); } Node(boolean brandNew, TreeNode parent, String nodeName, NodeDescriptor descriptor) throws UpdateFailedException { super(parent, nodeName); _editable = new Editable(brandNew); _ephemeral = false; _descriptor = descriptor; _origVariables = _descriptor.variables; _origDescription = _descriptor.description; _origLoadFactor = _descriptor.loadFactor; @SuppressWarnings("unchecked") Utils.Resolver resolver = new Utils.Resolver(new java.util.Map[] {_descriptor.variables, getRoot().getVariables()}); _resolver = resolver; _resolver.put("application", getRoot().getId()); _resolver.put("node", _id); // // Property Sets // for(java.util.Map.Entry p : _descriptor.propertySets.entrySet()) { String id = p.getKey(); insertPropertySet(new PropertySet(false, this, id, id, p.getValue()), false); } // // Template instances // for(ServerInstanceDescriptor p : _descriptor.serverInstances) { insertServer(createServer(false, p), false); } // // Plain servers // for(ServerDescriptor p : _descriptor.servers) { insertServer(createServer(false, p), false); } } Node(TreeNode parent, String nodeName, NodeDescriptor descriptor) { super(parent, nodeName); _editable = new Editable(false); _ephemeral = true; _descriptor = descriptor; } java.util.List findServerInstances(String template) { java.util.List result = new java.util.LinkedList(); for(Server p : _servers) { if(p instanceof ServerInstance) { ServerInstanceDescriptor instanceDescriptor = (ServerInstanceDescriptor)p.getDescriptor(); if(instanceDescriptor.template.equals(template)) { result.add((ServerInstance)p); } } } return result; } void removeServerInstances(String template) { java.util.List toRemove = new java.util.LinkedList(); for(Server p : _servers) { if(p instanceof ServerInstance) { ServerInstanceDescriptor instanceDescriptor = (ServerInstanceDescriptor)p.getDescriptor(); if(instanceDescriptor.template.equals(template)) { // // Remove instance // removeDescriptor(instanceDescriptor); String id = ((TreeNode)p).getId(); _editable.removeElement(id, p.getEditable(), Server.class); toRemove.add(id); } } } if(toRemove.size() > 0) { removeServers(toRemove.toArray(new String[0])); } } java.util.List findServiceInstances(String template) { java.util.List result = new java.util.LinkedList(); for(Server p : _servers) { if(p instanceof PlainServer) { result.addAll(((PlainServer)p).findServiceInstances(template)); } } return result; } void removeServiceInstances(String template) { for(Server p : _servers) { if(p instanceof PlainServer) { ((PlainServer)p).removeServiceInstances(template); } } } Utils.Resolver getResolver() { return _resolver; } public void tryAdd(String id, PropertySetDescriptor descriptor) throws UpdateFailedException { insertPropertySet(new PropertySet(true, this, id, id, descriptor), true); _descriptor.propertySets.put(id, descriptor); } public void tryRename(String oldId, String oldId2, String newId) throws UpdateFailedException { PropertySet oldChild = findPropertySet(oldId); assert oldChild != null; removePropertySet(oldChild); PropertySetDescriptor descriptor = (PropertySetDescriptor)oldChild.getDescriptor(); try { insertPropertySet(new PropertySet(true, this, newId, newId, descriptor), true); } catch(UpdateFailedException ex) { try { insertPropertySet(oldChild, true); } catch(UpdateFailedException ufe) { assert false; } throw ex; } _editable.removeElement(oldId, oldChild.getEditable(), PropertySet.class); _descriptor.propertySets.remove(oldId); _descriptor.propertySets.put(newId, descriptor); } void tryAdd(ServerInstanceDescriptor instanceDescriptor, boolean addDescriptor) throws UpdateFailedException { insertServer(createServer(true, instanceDescriptor), true); if(addDescriptor) { _descriptor.serverInstances.add(instanceDescriptor); } } void tryAdd(ServerDescriptor serverDescriptor, boolean addDescriptor) throws UpdateFailedException { insertServer(createServer(true, serverDescriptor), true); if(addDescriptor) { _descriptor.servers.add(serverDescriptor); } } void removeDescriptor(Server server) { if(server instanceof ServerInstance) { removeDescriptor((ServerInstanceDescriptor)server.getDescriptor()); } else { removeDescriptor((ServerDescriptor)server.getDescriptor()); } } void removeDescriptor(ServerDescriptor sd) { // // A straight remove uses equals(), which is not the desired behavior // java.util.Iterator p = _descriptor.servers.iterator(); while(p.hasNext()) { if(sd == p.next()) { p.remove(); break; } } } void removeDescriptor(ServerInstanceDescriptor sd) { // // A straight remove uses equals(), which is not the desired behavior // java.util.Iterator p = _descriptor.serverInstances.iterator(); while(p.hasNext()) { if(sd == p.next()) { p.remove(); break; } } } private void newPropertySet(PropertySetDescriptor descriptor) { String id = makeNewChildId("PropertySet"); PropertySet ps = new PropertySet(this, id, descriptor); try { insertPropertySet(ps, true); } catch(UpdateFailedException e) { assert false; } getRoot().setSelectedNode(ps); } private void newServer(ServerDescriptor descriptor) { descriptor.id = makeNewChildId(descriptor.id); PlainServer server = new PlainServer(this, descriptor.id, descriptor); try { insertServer(server, true); } catch(UpdateFailedException e) { assert false; } getRoot().setSelectedNode(server); } private void newServer(ServerInstanceDescriptor descriptor) { String id = makeNewChildId("NewServer"); Root root = getRoot(); // // Make sure descriptor.template points to a real template // ServerTemplate t = root.findServerTemplate(descriptor.template); if(t == null) { if(root.getServerTemplates().getChildCount() == 0) { JOptionPane.showMessageDialog( getCoordinator().getMainFrame(), "You need to create a server template before you can create a server from a template.", "No Server Template", JOptionPane.INFORMATION_MESSAGE); return; } t = (ServerTemplate)root.getServerTemplates().getChildAt(0); descriptor.template = t.getId(); descriptor.parameterValues = new java.util.HashMap(); } ServerInstance server = new ServerInstance(this, id, descriptor); try { insertServer(server, true); } catch(UpdateFailedException e) { assert false; } root.setSelectedNode(server); } private NodeDescriptor _descriptor; private Utils.Resolver _resolver; private java.util.Map _origVariables; private String _origDescription; private String _origLoadFactor; private final boolean _ephemeral; private NodeEditor _editor; private java.util.LinkedList _propertySets = new java.util.LinkedList(); private java.util.LinkedList _servers = new java.util.LinkedList(); private Editable _editable; static private DefaultTreeCellRenderer _cellRenderer; static private JPopupMenu _popup; }