View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2008 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.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 		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 }