1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.model.tree.nodes;
14
15 import com.eviware.soapui.impl.wsdl.MutableTestPropertyHolder;
16 import com.eviware.soapui.model.ModelItem;
17 import com.eviware.soapui.model.TestModelItem;
18 import com.eviware.soapui.model.TestPropertyHolder;
19 import com.eviware.soapui.model.testsuite.TestPropertyListener;
20 import com.eviware.soapui.model.tree.AbstractModelItemTreeNode;
21 import com.eviware.soapui.model.tree.SoapUITreeModel;
22 import com.eviware.soapui.model.tree.SoapUITreeNode;
23 import com.eviware.soapui.model.tree.nodes.support.EmptyModelItem;
24 import com.eviware.soapui.support.StringUtils;
25 import com.eviware.soapui.support.UISupport;
26 import com.eviware.soapui.support.action.swing.ActionList;
27 import com.eviware.soapui.support.action.swing.DefaultActionList;
28
29 import javax.swing.*;
30 import java.awt.event.ActionEvent;
31 import java.util.ArrayList;
32 import java.util.HashMap;
33 import java.util.List;
34 import java.util.Map;
35
36 public class PropertiesTreeNode<T extends ModelItem> extends AbstractModelItemTreeNode<T>
37 {
38 private List<PropertyTreeNode> propertyNodes = new ArrayList<PropertyTreeNode>();
39 private Map<String,PropertyTreeNode> propertyMap = new HashMap<String, PropertyTreeNode>();
40 private InternalTestPropertyListener testPropertyListener;
41 private final TestPropertyHolder holder;
42
43 public PropertiesTreeNode( T modelItem, ModelItem parentItem, TestPropertyHolder holder, SoapUITreeModel treeModel )
44 {
45 super( modelItem, parentItem, treeModel );
46 this.holder = holder;
47
48 for( String name : holder.getPropertyNames() )
49 {
50 PropertyTreeNode propertyTreeNode = new PropertyTreeNode( holder.getProperty( name ), getModelItem(), holder, treeModel );
51 propertyNodes.add( propertyTreeNode);
52 propertyMap.put( name, propertyTreeNode );
53 getTreeModel().mapModelItem( propertyTreeNode );
54 }
55
56 testPropertyListener = new InternalTestPropertyListener();
57 holder.addTestPropertyListener( testPropertyListener );
58 }
59
60 public static PropertiesTreeNode<?> createDefaultPropertiesNode( TestModelItem modelItem, SoapUITreeModel treeModel )
61 {
62 return new PropertiesTreeNode<PropertiesTreeNode.PropertiesModelItem>(
63 new PropertiesTreeNode.PropertiesModelItem( modelItem ), modelItem, modelItem, treeModel );
64 }
65
66 public int getChildCount()
67 {
68 return getTreeModel().isShowProperties() ? propertyNodes.size() : 0;
69 }
70
71 public SoapUITreeNode getChildNode( int index )
72 {
73 return propertyNodes.get( index );
74 }
75
76 public int getIndexOfChild( Object child )
77 {
78 return propertyNodes.indexOf( child );
79 }
80
81 public void release()
82 {
83 super.release();
84
85 holder.removeTestPropertyListener( testPropertyListener );
86
87 for( PropertyTreeNode node : propertyNodes )
88 getTreeModel().unmapModelItem( node.getModelItem() );
89
90 propertyNodes.clear();
91 propertyMap.clear();
92 }
93
94 private class InternalTestPropertyListener implements TestPropertyListener
95 {
96 public void propertyAdded( String name )
97 {
98 PropertyTreeNode propertyTreeNode = new PropertyTreeNode( holder.getProperty( name ), getModelItem(), holder, getTreeModel() );
99 propertyNodes.add( propertyTreeNode);
100 propertyMap.put( name, propertyTreeNode );
101 getTreeModel().notifyNodeInserted( propertyTreeNode );
102
103 if( getModelItem() instanceof PropertiesModelItem )
104 {
105 ((PropertiesModelItem)getModelItem()).updateName();
106 }
107 }
108
109 public void propertyRemoved( String name )
110 {
111 SoapUITreeNode treeNode = getTreeModel().getTreeNode( propertyMap.get( name ).getModelItem() );
112 if( propertyNodes.contains( treeNode ))
113 {
114 getTreeModel().notifyNodeRemoved( treeNode );
115 propertyNodes.remove( treeNode);
116 propertyMap.remove( name );
117
118 if( getModelItem() instanceof PropertiesModelItem )
119 {
120 ((PropertiesModelItem)getModelItem()).updateName();
121 }
122 }
123 else throw new RuntimeException( "Removing unkown property" );
124 }
125
126 public void propertyRenamed( String oldName, String newName )
127 {
128 PropertyTreeNode propertyTreeNode = propertyMap.remove( oldName );
129 propertyMap.put( newName, propertyTreeNode );
130 propertyTreeNode.getModelItem().setName( PropertyTreeNode.buildName( holder.getProperty( newName ) ) );
131 }
132
133 public void propertyValueChanged( String name, String oldValue, String newValue )
134 {
135 PropertyTreeNode propertyTreeNode = propertyMap.get( name );
136 propertyTreeNode.getModelItem().setName( PropertyTreeNode.buildName( holder.getProperty( name ) ) );
137 }
138
139 public void propertyMoved(String name, int oldIndex, int newIndex)
140 {
141 PropertyTreeNode node = propertyNodes.get(oldIndex);
142 getTreeModel().notifyNodeRemoved(node, false);
143
144 propertyNodes.remove(oldIndex);
145 propertyNodes.add(newIndex, node);
146
147 getTreeModel().notifyNodeInserted(node);
148 }
149 }
150
151 public static class PropertiesModelItem extends EmptyModelItem
152 {
153 private final TestPropertyHolder holder;
154
155 public PropertiesModelItem( TestPropertyHolder holder )
156 {
157 super( "Properties (" + holder.getPropertyNames().length + ")", UISupport.createImageIcon( "/properties_step.gif" ));
158 this.holder = holder;
159 }
160
161 public void updateName()
162 {
163 setName( "Properties (" + holder.getPropertyNames().length + ")" );
164 }
165 }
166
167 public ActionList getActions()
168 {
169 if( getModelItem() instanceof PropertiesModelItem && holder instanceof MutableTestPropertyHolder )
170 {
171 DefaultActionList actions = new DefaultActionList();
172 actions.addAction( new AddPropertyAction() );
173 return actions;
174 }
175
176 return super.getActions();
177 }
178
179 private class AddPropertyAction extends AbstractAction
180 {
181 public AddPropertyAction()
182 {
183 super( "Add Property" );
184 putValue(Action.SMALL_ICON, UISupport.createImageIcon("/add_property.gif"));
185 putValue(Action.SHORT_DESCRIPTION, "Adds a property to the property list");
186 }
187
188 public void actionPerformed(ActionEvent e)
189 {
190 String name = UISupport.prompt("Specify unique property name", "Add Property", "");
191 if ( StringUtils.hasContent( name ))
192 {
193 if( holder.hasProperty( name ))
194 {
195 UISupport.showErrorMessage( "Property name [" + name + "] already exists.." );
196 return;
197 }
198
199 ((MutableTestPropertyHolder)holder).addProperty(name);
200 }
201 }
202 }
203 }