View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2009 eviware.com 
3    *
4    *  soapUI is free software; you can redistribute it and/or modify it under the 
5    *  terms of version 2.1 of the GNU Lesser General Public License as published by 
6    *  the Free Software Foundation.
7    *
8    *  soapUI is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without 
9    *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
10   *  See the GNU Lesser General Public License for more details at gnu.org.
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.TestModelItem;
27  import com.eviware.soapui.model.TestPropertyHolder;
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,
53  					treeModel );
54  			propertyNodes.add( propertyTreeNode );
55  			propertyMap.put( name, propertyTreeNode );
56  			getTreeModel().mapModelItem( propertyTreeNode );
57  		}
58  
59  		testPropertyListener = new InternalTestPropertyListener();
60  		holder.addTestPropertyListener( testPropertyListener );
61  	}
62  
63  	public static PropertiesTreeNode<?> createDefaultPropertiesNode( TestModelItem modelItem, SoapUITreeModel treeModel )
64  	{
65  		return new PropertiesTreeNode<PropertiesTreeNode.PropertiesModelItem>(
66  				new PropertiesTreeNode.PropertiesModelItem( modelItem ), modelItem, modelItem, treeModel );
67  	}
68  
69  	public int getChildCount()
70  	{
71  		return getTreeModel().isShowProperties() ? propertyNodes.size() : 0;
72  	}
73  
74  	public SoapUITreeNode getChildNode( int index )
75  	{
76  		return propertyNodes.get( index );
77  	}
78  
79  	public int getIndexOfChild( Object child )
80  	{
81  		return propertyNodes.indexOf( child );
82  	}
83  
84  	public void release()
85  	{
86  		super.release();
87  
88  		holder.removeTestPropertyListener( testPropertyListener );
89  
90  		for( PropertyTreeNode node : propertyNodes )
91  			getTreeModel().unmapModelItem( node.getModelItem() );
92  
93  		propertyNodes.clear();
94  		propertyMap.clear();
95  	}
96  
97  	private class InternalTestPropertyListener implements TestPropertyListener
98  	{
99  		public void propertyAdded( String name )
100 		{
101 			PropertyTreeNode propertyTreeNode = new PropertyTreeNode( holder.getProperty( name ), getModelItem(), holder,
102 					getTreeModel() );
103 			propertyNodes.add( propertyTreeNode );
104 			propertyMap.put( name, propertyTreeNode );
105 			getTreeModel().notifyNodeInserted( propertyTreeNode );
106 
107 			if( getModelItem() instanceof PropertiesModelItem )
108 			{
109 				( ( PropertiesModelItem )getModelItem() ).updateName();
110 			}
111 		}
112 
113 		public void propertyRemoved( String name )
114 		{
115 			SoapUITreeNode treeNode = getTreeModel().getTreeNode( propertyMap.get( name ).getModelItem() );
116 			if( propertyNodes.contains( treeNode ) )
117 			{
118 				getTreeModel().notifyNodeRemoved( treeNode );
119 				propertyNodes.remove( treeNode );
120 				propertyMap.remove( name );
121 
122 				if( getModelItem() instanceof PropertiesModelItem )
123 				{
124 					( ( PropertiesModelItem )getModelItem() ).updateName();
125 				}
126 			}
127 			else
128 				throw new RuntimeException( "Removing unkown property" );
129 		}
130 
131 		public void propertyRenamed( String oldName, String newName )
132 		{
133 			PropertyTreeNode propertyTreeNode = propertyMap.remove( oldName );
134 			propertyMap.put( newName, propertyTreeNode );
135 			propertyTreeNode.getModelItem().setName( PropertyTreeNode.buildName( holder.getProperty( newName ) ) );
136 		}
137 
138 		public void propertyValueChanged( String name, String oldValue, String newValue )
139 		{
140 			PropertyTreeNode propertyTreeNode = propertyMap.get( name );
141 			if( propertyTreeNode != null )
142 			propertyTreeNode.getModelItem().setName( PropertyTreeNode.buildName( holder.getProperty( name ) ) );
143 		}
144 
145 		public void propertyMoved( String name, int oldIndex, int newIndex )
146 		{
147 			PropertyTreeNode node = propertyNodes.get( oldIndex );
148 			getTreeModel().notifyNodeRemoved( node, false );
149 
150 			propertyNodes.remove( oldIndex );
151 			if( newIndex >= propertyNodes.size() )
152 				propertyNodes.add( node );
153 			else
154 				propertyNodes.add( newIndex, node );
155 
156 			getTreeModel().notifyNodeInserted( node );
157 		}
158 	}
159 
160 	public static class PropertiesModelItem extends EmptyModelItem
161 	{
162 		private final TestPropertyHolder holder;
163 
164 		public PropertiesModelItem( TestPropertyHolder holder )
165 		{
166 			super( "Properties (" + holder.getPropertyNames().length + ")", UISupport
167 					.createImageIcon( "/properties_step.gif" ) );
168 			this.holder = holder;
169 		}
170 
171 		public void updateName()
172 		{
173 			setName( "Properties (" + holder.getPropertyNames().length + ")" );
174 		}
175 	}
176 
177 	public ActionList getActions()
178 	{
179 		if( getModelItem() instanceof PropertiesModelItem && holder instanceof MutableTestPropertyHolder )
180 		{
181 			DefaultActionList actions = new DefaultActionList();
182 			actions.addAction( new AddPropertyAction() );
183 			return actions;
184 		}
185 
186 		return super.getActions();
187 	}
188 
189 	private class AddPropertyAction extends AbstractAction
190 	{
191 		public AddPropertyAction()
192 		{
193 			super( "Add Property" );
194 			putValue( Action.SMALL_ICON, UISupport.createImageIcon( "/add_property.gif" ) );
195 			putValue( Action.SHORT_DESCRIPTION, "Adds a property to the property list" );
196 		}
197 
198 		public void actionPerformed( ActionEvent e )
199 		{
200 			String name = UISupport.prompt( "Specify unique property name", "Add Property", "" );
201 			if( StringUtils.hasContent( name ) )
202 			{
203 				if( holder.hasProperty( name ) )
204 				{
205 					UISupport.showErrorMessage( "Property name [" + name + "] already exists.." );
206 					return;
207 				}
208 
209 				( ( MutableTestPropertyHolder )holder ).addProperty( name );
210 			}
211 		}
212 	}
213 }