1
2
3
4
5
6
7
8
9
10
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
139
140
141
142
143
144
145
146
147
148
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 }