/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.model.tree.nodes; import com.eviware.soapui.impl.wsdl.MutableTestPropertyHolder; import com.eviware.soapui.model.ModelItem; import com.eviware.soapui.model.TestModelItem; import com.eviware.soapui.model.TestPropertyHolder; import com.eviware.soapui.model.testsuite.TestPropertyListener; import com.eviware.soapui.model.tree.AbstractModelItemTreeNode; import com.eviware.soapui.model.tree.SoapUITreeModel; import com.eviware.soapui.model.tree.SoapUITreeNode; import com.eviware.soapui.model.tree.nodes.support.EmptyModelItem; import com.eviware.soapui.support.StringUtils; import com.eviware.soapui.support.UISupport; import com.eviware.soapui.support.action.swing.ActionList; import com.eviware.soapui.support.action.swing.DefaultActionList; import javax.swing.AbstractAction; import javax.swing.Action; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class PropertiesTreeNode<T extends ModelItem> extends AbstractModelItemTreeNode<T> { private List<PropertyTreeNode> propertyNodes = new ArrayList<PropertyTreeNode>(); private Map<String, PropertyTreeNode> propertyMap = new HashMap<String, PropertyTreeNode>(); private InternalTestPropertyListener testPropertyListener; private final TestPropertyHolder holder; public PropertiesTreeNode(T modelItem, ModelItem parentItem, TestPropertyHolder holder, SoapUITreeModel treeModel) { super(modelItem, parentItem, treeModel); this.holder = holder; for (String name : holder.getPropertyNames()) { PropertyTreeNode propertyTreeNode = new PropertyTreeNode(holder.getProperty(name), getModelItem(), holder, treeModel); propertyNodes.add(propertyTreeNode); propertyMap.put(name, propertyTreeNode); getTreeModel().mapModelItem(propertyTreeNode); } testPropertyListener = new InternalTestPropertyListener(); holder.addTestPropertyListener(testPropertyListener); } public static PropertiesTreeNode<?> createDefaultPropertiesNode(TestModelItem modelItem, SoapUITreeModel treeModel) { return new PropertiesTreeNode<PropertiesTreeNode.PropertiesModelItem>( new PropertiesTreeNode.PropertiesModelItem(modelItem), modelItem, modelItem, treeModel); } public int getChildCount() { return getTreeModel().isShowProperties() ? propertyNodes.size() : 0; } public SoapUITreeNode getChildNode(int index) { return propertyNodes.get(index); } public int getIndexOfChild(Object child) { return propertyNodes.indexOf(child); } public void release() { super.release(); holder.removeTestPropertyListener(testPropertyListener); for (PropertyTreeNode node : propertyNodes) { getTreeModel().unmapModelItem(node.getModelItem()); } propertyNodes.clear(); propertyMap.clear(); } private class InternalTestPropertyListener implements TestPropertyListener { public void propertyAdded(String name) { PropertyTreeNode propertyTreeNode = new PropertyTreeNode(holder.getProperty(name), getModelItem(), holder, getTreeModel()); propertyNodes.add(propertyTreeNode); propertyMap.put(name, propertyTreeNode); getTreeModel().notifyNodeInserted(propertyTreeNode); if (getModelItem() instanceof PropertiesModelItem) { ((PropertiesModelItem) getModelItem()).updateName(); } } public void propertyRemoved(String name) { SoapUITreeNode treeNode = getTreeModel().getTreeNode(propertyMap.get(name).getModelItem()); if (propertyNodes.contains(treeNode)) { getTreeModel().notifyNodeRemoved(treeNode); propertyNodes.remove(treeNode); propertyMap.remove(name); if (getModelItem() instanceof PropertiesModelItem) { ((PropertiesModelItem) getModelItem()).updateName(); } } else { throw new RuntimeException("Removing unkown property"); } } public void propertyRenamed(String oldName, String newName) { PropertyTreeNode propertyTreeNode = propertyMap.remove(oldName); propertyMap.put(newName, propertyTreeNode); propertyTreeNode.getModelItem().setName(PropertyTreeNode.buildName(holder.getProperty(newName))); } public void propertyValueChanged(String name, String oldValue, String newValue) { PropertyTreeNode propertyTreeNode = propertyMap.get(name); if (propertyTreeNode != null) { propertyTreeNode.getModelItem().setName(PropertyTreeNode.buildName(holder.getProperty(name))); } } public void propertyMoved(String name, int oldIndex, int newIndex) { PropertyTreeNode node = propertyNodes.get(oldIndex); getTreeModel().notifyNodeRemoved(node, false); propertyNodes.remove(oldIndex); if (newIndex >= propertyNodes.size()) { propertyNodes.add(node); } else { propertyNodes.add(newIndex, node); } getTreeModel().notifyNodeInserted(node); } } public static class PropertiesModelItem extends EmptyModelItem { private final TestPropertyHolder holder; public PropertiesModelItem(TestPropertyHolder holder) { super("Properties (" + holder.getPropertyNames().length + ")", UISupport .createImageIcon("/properties_step.png")); this.holder = holder; } public void updateName() { setName("Properties (" + holder.getPropertyNames().length + ")"); } } public ActionList getActions() { if (getModelItem() instanceof PropertiesModelItem && holder instanceof MutableTestPropertyHolder) { DefaultActionList actions = new DefaultActionList(); actions.addAction(new AddPropertyAction()); return actions; } return super.getActions(); } private class AddPropertyAction extends AbstractAction { public AddPropertyAction() { super("Add Property"); putValue(Action.SMALL_ICON, UISupport.createImageIcon("/add.png")); putValue(Action.SHORT_DESCRIPTION, "Adds a property to the property list"); } public void actionPerformed(ActionEvent e) { String name = UISupport.prompt("Specify unique property name", "Add Property", ""); if (StringUtils.hasContent(name)) { if (holder.hasProperty(name)) { UISupport.showErrorMessage("Property name [" + name + "] already exists.."); return; } ((MutableTestPropertyHolder) holder).addProperty(name); } } } }