View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2010 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.beans.PropertyChangeEvent;
16  import java.beans.PropertyChangeListener;
17  import java.util.ArrayList;
18  import java.util.List;
19  
20  import com.eviware.soapui.impl.rest.RestMethod;
21  import com.eviware.soapui.impl.rest.RestResource;
22  import com.eviware.soapui.model.iface.Request;
23  import com.eviware.soapui.model.tree.AbstractModelItemTreeNode;
24  import com.eviware.soapui.model.tree.SoapUITreeModel;
25  import com.eviware.soapui.model.tree.SoapUITreeNode;
26  import com.eviware.soapui.model.tree.TreeNodeFactory;
27  
28  /***
29   * SoapUITreeNode for Operation implementations
30   * 
31   * @author Ole.Matzura
32   */
33  
34  public class RestResourceTreeNode extends AbstractModelItemTreeNode<RestResource> implements PropertyChangeListener
35  {
36  	private List<RestResourceTreeNode> resourceNodes = new ArrayList<RestResourceTreeNode>();
37  	private List<RestMethodTreeNode> methodNodes = new ArrayList<RestMethodTreeNode>();
38  	private final RestResource restResource;
39  
40  	private ReorderPropertyChangeListener propertyChangeListener = new ReorderPropertyChangeListener();
41  
42  	public RestResourceTreeNode( RestResource restResource, SoapUITreeModel treeModel )
43  	{
44  		super( restResource, restResource.getParent(), treeModel );
45  		this.restResource = restResource;
46  		treeModel.mapModelItem( this );
47  
48  		for( int c = 0; c < restResource.getChildResourceCount(); c++ )
49  		{
50  			resourceNodes.add( new RestResourceTreeNode( restResource.getChildResourceAt( c ), getTreeModel() ) );
51  		}
52  		treeModel.mapModelItems( resourceNodes );
53  
54  		for( int c = 0; c < restResource.getRestMethodCount(); c++ )
55  		{
56  			methodAdded( restResource.getRestMethodAt( c ) );
57  		}
58  	}
59  
60  	@Override
61  	public SoapUITreeNode getParentTreeNode()
62  	{
63  		return restResource.getParentResource() == null ? super.getParentTreeNode() : getTreeModel().getTreeNode(
64  				restResource.getParentResource() );
65  	}
66  
67  	@Override
68  	public String toString()
69  	{
70  		return restResource.getName() + " [" + restResource.getFullPath() + "]";
71  	}
72  
73  	@Override
74  	public int getChildCount()
75  	{
76  		return restResource.getRestMethodCount() + restResource.getChildResourceCount();
77  	}
78  
79  	@Override
80  	public SoapUITreeNode getChildNode( int index )
81  	{
82  		int childCount = methodNodes.size();
83  		if( index < childCount )
84  			return methodNodes.get( index );
85  		else
86  			return resourceNodes.get( index - childCount );
87  	}
88  
89  	@Override
90  	public int getIndexOfChild( Object child )
91  	{
92  		int result = methodNodes.indexOf( child );
93  		if( result == -1 )
94  		{
95  			result = resourceNodes.indexOf( child );
96  			if( result >= 0 )
97  				result += methodNodes.size();
98  		}
99  
100 		return result;
101 	}
102 
103 	public void release()
104 	{
105 		super.release();
106 
107 		for( RestMethodTreeNode treeNode : methodNodes )
108 		{
109 			treeNode.getModelItem().removePropertyChangeListener( Request.NAME_PROPERTY, propertyChangeListener );
110 			treeNode.release();
111 		}
112 		
113 		for( RestResourceTreeNode resource : resourceNodes )
114 		{
115 			resource.release();
116 		}
117 	}
118 
119 	public void addChildResource( RestResource restResource )
120 	{
121 		RestResourceTreeNode operationTreeNode = ( RestResourceTreeNode )TreeNodeFactory.createTreeNode( restResource,
122 				getTreeModel() );
123 
124 		resourceNodes.add( operationTreeNode );
125 		getTreeModel().notifyNodeInserted( operationTreeNode );
126 	}
127 
128 	public void removeChildResource( RestResourceTreeNode childResource )
129 	{
130 		if( resourceNodes.contains( childResource ) )
131 		{
132 			getTreeModel().notifyNodeRemoved( childResource );
133 			resourceNodes.remove( childResource );
134 		}
135 	}
136 
137 	/*
138 	 * public void requestAdded(Request request) { if (request instanceof
139 	 * RestRequest) { RestMethod method = ((RestRequest)
140 	 * request).getRestMethod(); RestMethodTreeNode node = (RestMethodTreeNode)
141 	 * getTreeModel() .getTreeNode(method); if (methodNodes.contains(node)) {
142 	 * node.requestAdded(request); } } }
143 	 * 
144 	 * public void requestRemoved(Request request) { if (request instanceof
145 	 * RestRequest) { RestMethod method = ((RestRequest)
146 	 * request).getRestMethod(); RestMethodTreeNode node = (RestMethodTreeNode)
147 	 * getTreeModel() .getTreeNode(method); if (methodNodes.contains(node)) {
148 	 * node.requestRemoved(request); } } }
149 	 */
150 
151 	public void methodAdded( RestMethod method )
152 	{
153 		RestMethodTreeNode methodTreeNode = new RestMethodTreeNode( method, getTreeModel() );
154 		methodNodes.add( methodTreeNode );
155 		reorder( false );
156 		method.addPropertyChangeListener( Request.NAME_PROPERTY, propertyChangeListener );
157 		getTreeModel().notifyNodeInserted( methodTreeNode );
158 	}
159 
160 	public void methodRemoved( RestMethod method )
161 	{
162 		SoapUITreeNode methodTreeNode = getTreeModel().getTreeNode( method );
163 		if( methodNodes.contains( methodTreeNode ) )
164 		{
165 			getTreeModel().notifyNodeRemoved( methodTreeNode );
166 			methodNodes.remove( methodTreeNode );
167 			method.removePropertyChangeListener( propertyChangeListener );
168 		}
169 		else
170 			throw new RuntimeException( "Removing unknown method" );
171 	}
172 
173 	public void propertyChange( PropertyChangeEvent evt )
174 	{
175 		super.propertyChange( evt );
176 		if( evt.getPropertyName().equals( "childMethods" ) )
177 		{
178 			if( evt.getNewValue() != null )
179 			{
180 				methodAdded( ( RestMethod )evt.getNewValue() );
181 			}
182 			else
183 			{
184 				methodRemoved( ( RestMethod )evt.getOldValue() );
185 			}
186 		}
187 	}
188 }