1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.model.tree.nodes;
14
15 import java.awt.event.ActionEvent;
16 import java.util.ArrayList;
17 import java.util.HashMap;
18 import java.util.List;
19 import java.util.Map;
20
21 import javax.swing.AbstractAction;
22 import javax.swing.Action;
23
24 import com.eviware.soapui.impl.wsdl.MutableTestPropertyHolder;
25 import com.eviware.soapui.model.ModelItem;
26 import com.eviware.soapui.model.TestPropertyHolder;
27 import com.eviware.soapui.model.TestModelItem;
28 import com.eviware.soapui.model.testsuite.TestPropertyListener;
29 import com.eviware.soapui.model.tree.AbstractModelItemTreeNode;
30 import com.eviware.soapui.model.tree.SoapUITreeModel;
31 import com.eviware.soapui.model.tree.SoapUITreeNode;
32 import com.eviware.soapui.model.tree.nodes.support.EmptyModelItem;
33 import com.eviware.soapui.support.StringUtils;
34 import com.eviware.soapui.support.UISupport;
35 import com.eviware.soapui.support.action.swing.ActionList;
36 import com.eviware.soapui.support.action.swing.DefaultActionList;
37
38 public class PropertiesTreeNode<T extends ModelItem> extends AbstractModelItemTreeNode<T>
39 {
40 private List<PropertyTreeNode> propertyNodes = new ArrayList<PropertyTreeNode>();
41 private Map<String,PropertyTreeNode> propertyMap = new HashMap<String, PropertyTreeNode>();
42 private InternalTestPropertyListener testPropertyListener;
43 private final TestPropertyHolder holder;
44
45 public PropertiesTreeNode( T modelItem, ModelItem parentItem, TestPropertyHolder holder, SoapUITreeModel treeModel )
46 {
47 super( modelItem, parentItem, treeModel );
48 this.holder = holder;
49
50 for( String name : holder.getPropertyNames() )
51 {
52 PropertyTreeNode propertyTreeNode = new PropertyTreeNode( holder.getProperty( name ), getModelItem(), holder, treeModel );
53 propertyNodes.add( propertyTreeNode);
54 propertyMap.put( name, propertyTreeNode );
55 getTreeModel().mapModelItem( propertyTreeNode );
56 }
57
58 testPropertyListener = new InternalTestPropertyListener();
59 holder.addTestPropertyListener( testPropertyListener );
60 }
61
62 public static PropertiesTreeNode createDefaultPropertiesNode( TestModelItem modelItem, SoapUITreeModel treeModel )
63 {
64 return new PropertiesTreeNode<PropertiesTreeNode.PropertiesModelItem>(
65 new PropertiesTreeNode.PropertiesModelItem( modelItem ), modelItem, modelItem, treeModel );
66 }
67
68 public int getChildCount()
69 {
70 return getTreeModel().isShowProperties() ? propertyNodes.size() : 0;
71 }
72
73 public SoapUITreeNode getChildNode( int index )
74 {
75 return propertyNodes.get( index );
76 }
77
78 public int getIndexOfChild( Object child )
79 {
80 return propertyNodes.indexOf( child );
81 }
82
83 public void 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
140 public static class PropertiesModelItem extends EmptyModelItem
141 {
142 private final TestPropertyHolder holder;
143
144 public PropertiesModelItem( TestPropertyHolder holder )
145 {
146 super( "Properties (" + holder.getPropertyNames().length + ")", UISupport.createImageIcon( "/properties_step.gif" ));
147 this.holder = holder;
148 }
149
150 public void updateName()
151 {
152 setName( "Properties (" + holder.getPropertyNames().length + ")" );
153 }
154 }
155
156 public ActionList getActions()
157 {
158 if( getModelItem() instanceof PropertiesModelItem && holder instanceof MutableTestPropertyHolder )
159 {
160 DefaultActionList actions = new DefaultActionList();
161 actions.addAction( new AddPropertyAction() );
162 return actions;
163 }
164
165 return super.getActions();
166 }
167
168 private class AddPropertyAction extends AbstractAction
169 {
170 public AddPropertyAction()
171 {
172 super( "Add Property" );
173 putValue(Action.SMALL_ICON, UISupport.createImageIcon("/add_property.gif"));
174 putValue(Action.SHORT_DESCRIPTION, "Adds a property to the property list");
175 }
176
177 public void actionPerformed(ActionEvent e)
178 {
179 String name = UISupport.prompt("Specify unique property name", "Add Property", "");
180 if ( StringUtils.hasContent( name ))
181 {
182 if( holder.hasProperty( name ))
183 {
184 UISupport.showErrorMessage( "Property name [" + name + "] already exists.." );
185 return;
186 }
187
188 ((MutableTestPropertyHolder)holder).addProperty(name);
189 }
190 }
191 }
192 }