void update(java.util.Map<String, TemplateDescriptor> descriptors, String[] removeTemplates)
      throws UpdateFailedException {
    //
    // Note: _descriptors is updated by Application
    //

    //
    // One big set of removes
    //
    removeChildren(removeTemplates);

    //
    // One big set of updates, followed by inserts
    //
    java.util.List<TreeNodeBase> newChildren = new java.util.ArrayList<>();
    java.util.List<TreeNodeBase> updatedChildren = new java.util.LinkedList<>();

    for (java.util.Map.Entry<String, TemplateDescriptor> p : descriptors.entrySet()) {
      String name = p.getKey();
      TemplateDescriptor templateDescriptor = p.getValue();
      ServiceTemplate child = (ServiceTemplate) findChild(name);
      if (child == null) {
        newChildren.add(new ServiceTemplate(false, this, name, templateDescriptor));
      } else {
        child.rebuild(templateDescriptor);
        updatedChildren.add(child);
      }
    }

    childrenChanged(updatedChildren);
    insertChildren(newChildren, true);
  }
 void commit() {
   _editable.commit();
   for (TreeNodeBase p : _children) {
     ServiceTemplate st = (ServiceTemplate) p;
     st.commit();
   }
 }
  @Override
  boolean isSimpleUpdate() {
    ServiceInstanceDescriptor descriptor = getDescriptor();
    ServiceTemplate t = (ServiceTemplate) _template.getSelectedItem();

    return descriptor.template.equals(t.getId())
        && descriptor.parameterValues.equals(_parameters.getValues());
  }
 java.util.Map<String, TemplateDescriptor> getUpdates() {
   java.util.Map<String, TemplateDescriptor> updates = new java.util.HashMap<>();
   for (TreeNodeBase p : _children) {
     ServiceTemplate t = (ServiceTemplate) p;
     if (t.getEditable().isNew() || t.getEditable().isModified()) {
       updates.put(t.getId(), (TemplateDescriptor) t.getDescriptor());
     }
   }
   return updates;
 }
 public static java.util.Map<String, TemplateDescriptor> copyDescriptors(
     java.util.Map<String, TemplateDescriptor> descriptors) {
   java.util.Map<String, TemplateDescriptor> copy = new java.util.HashMap<>();
   for (java.util.Map.Entry<String, TemplateDescriptor> p : descriptors.entrySet()) {
     copy.put(p.getKey(), ServiceTemplate.copyDescriptor(p.getValue()));
   }
   return copy;
 }
  void show(ServiceInstance service) {
    detectUpdates(false);
    _target = service;

    //
    // If it's not a template instance, it's shown using
    // ServiceEditor.show()
    //
    assert getDescriptor().template.length() > 0;

    ServiceInstanceDescriptor descriptor = (ServiceInstanceDescriptor) service.getDescriptor();
    Coordinator coordinator = service.getCoordinator();
    boolean isEditable = service.isEphemeral() || !coordinator.substitute();

    Utils.Resolver resolver = isEditable ? null : ((TreeNode) service.getParent()).getResolver();

    //
    // Need to make control enabled before changing it
    //
    _template.setEnabled(true);

    ServiceTemplates serviceTemplates = service.getRoot().getServiceTemplates();
    _template.setModel(serviceTemplates.createComboBoxModel());

    ServiceTemplate t = (ServiceTemplate) serviceTemplates.findChild(descriptor.template);
    assert t != null;
    _template.setSelectedItem(t);

    ListDataListener templateListener =
        new ListDataListener() {
          @Override
          public void contentsChanged(ListDataEvent e) {
            updated();

            ServiceTemplate t = (ServiceTemplate) _template.getModel().getSelectedItem();

            TemplateDescriptor td = (TemplateDescriptor) t.getDescriptor();

            //
            // Replace parameters but keep existing values
            //
            _parameters.set(
                td.parameters,
                makeParameterValues(_parameters.getValues(), td.parameters),
                td.parameterDefaults,
                null);
          }

          @Override
          public void intervalAdded(ListDataEvent e) {}

          @Override
          public void intervalRemoved(ListDataEvent e) {}
        };

    _template.getModel().addListDataListener(templateListener);
    _template.setEnabled(isEditable);

    TemplateDescriptor td = (TemplateDescriptor) t.getDescriptor();
    _parameters.set(td.parameters, descriptor.parameterValues, td.parameterDefaults, resolver);

    _propertySets.setList(
        java.util.Arrays.asList(descriptor.propertySet.references), getDetailResolver());
    _propertySets.setEditable(isEditable);

    _properties.setProperties(
        descriptor.propertySet.properties, null, null, getDetailResolver(), isEditable);

    _applyButton.setEnabled(service.isEphemeral());
    _discardButton.setEnabled(service.isEphemeral());
    detectUpdates(true);
    if (service.isEphemeral()) {
      updated();
    }
  }