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.util.ArrayList;
16  import java.util.List;
17  
18  import com.eviware.soapui.model.iface.Interface;
19  import com.eviware.soapui.model.mock.MockService;
20  import com.eviware.soapui.model.project.Project;
21  import com.eviware.soapui.model.support.ProjectListenerAdapter;
22  import com.eviware.soapui.model.testsuite.TestSuite;
23  import com.eviware.soapui.model.tree.AbstractModelItemTreeNode;
24  import com.eviware.soapui.model.tree.SoapUITreeNode;
25  
26  /***
27   * SoapUITreeNode for Project implementations
28   * 
29   * @author Ole.Matzura
30   */
31  
32  public class ProjectTreeNode extends AbstractModelItemTreeNode<Project>
33  {
34  	private InternalProjectListener internalProjectListener;
35  	private List<InterfaceTreeNode> interfaceNodes = new ArrayList<InterfaceTreeNode>();
36  	private List<TestSuiteTreeNode> testSuiteNodes = new ArrayList<TestSuiteTreeNode>();
37  	private List<MockServiceTreeNode> mockServiceNodes = new ArrayList<MockServiceTreeNode>();
38  	private PropertiesTreeNode<?> propertiesTreeNode;
39  
40  	public ProjectTreeNode( Project project, WorkspaceTreeNode workspaceNode )
41  	{
42  		super( project, workspaceNode.getWorkspace(), workspaceNode.getTreeModel() );
43  
44  		if( !project.isOpen() )
45  			return;
46  
47  		internalProjectListener = new InternalProjectListener();
48  		project.addProjectListener( internalProjectListener );
49  
50  		for( int c = 0; c < project.getInterfaceCount(); c++ )
51  		{
52  			Interface iface = project.getInterfaceAt( c );
53  			interfaceNodes.add( new InterfaceTreeNode( iface, getTreeModel() ) );
54  		}
55  
56  		for( int c = 0; c < project.getTestSuiteCount(); c++ )
57  		{
58  			testSuiteNodes.add( new TestSuiteTreeNode( project.getTestSuiteAt( c ), getTreeModel() ) );
59  		}
60  
61  		for( int c = 0; c < project.getMockServiceCount(); c++ )
62  		{
63  			mockServiceNodes.add( new MockServiceTreeNode( project.getMockServiceAt( c ), getTreeModel() ) );
64  		}
65  
66  		getTreeModel().mapModelItems( interfaceNodes );
67  		getTreeModel().mapModelItems( testSuiteNodes );
68  		getTreeModel().mapModelItems( mockServiceNodes );
69  
70  		propertiesTreeNode = PropertiesTreeNode.createDefaultPropertiesNode( project, getTreeModel() );
71  		getTreeModel().mapModelItem( propertiesTreeNode );
72  	}
73  
74  	public void release()
75  	{
76  		super.release();
77  
78  		getProject().removeProjectListener( internalProjectListener );
79  
80  		for( InterfaceTreeNode treeNode : interfaceNodes )
81  			treeNode.release();
82  
83  		for( TestSuiteTreeNode treeNode : testSuiteNodes )
84  			treeNode.release();
85  
86  		for( MockServiceTreeNode treeNode : mockServiceNodes )
87  			treeNode.release();
88  
89  		if( propertiesTreeNode != null )
90  			propertiesTreeNode.release();
91  	}
92  
93  	public int getChildCount()
94  	{
95  		if( propertiesTreeNode == null )
96  			return 0;
97  
98  		int propMod = getTreeModel().isShowProperties() ? 1 : 0;
99  
100 		return interfaceNodes.size() + testSuiteNodes.size() + mockServiceNodes.size() + propMod;
101 	}
102 
103 	public int getIndexOfChild( Object child )
104 	{
105 		if( propertiesTreeNode == null )
106 			return -1;
107 
108 		if( child == propertiesTreeNode )
109 			return 0;
110 
111 		int propMod = getTreeModel().isShowProperties() ? 1 : 0;
112 
113 		int index = interfaceNodes.indexOf( child );
114 		if( index >= 0 )
115 			return index + propMod;
116 
117 		index = testSuiteNodes.indexOf( child );
118 		if( index >= 0 )
119 			return index + interfaceNodes.size() + propMod;
120 
121 		index = mockServiceNodes.indexOf( child );
122 		if( index >= 0 )
123 			return index + interfaceNodes.size() + testSuiteNodes.size() + propMod;
124 
125 		return -1;
126 	}
127 
128 	public SoapUITreeNode getChildNode( int index )
129 	{
130 		if( propertiesTreeNode == null )
131 			return null;
132 
133 		int propMod = getTreeModel().isShowProperties() ? 1 : 0;
134 
135 		if( propMod == 1 && index == 0 )
136 			return propertiesTreeNode;
137 		else if( index < interfaceNodes.size() + propMod )
138 			return interfaceNodes.get( index - propMod );
139 		else if( index < testSuiteNodes.size() + interfaceNodes.size() + propMod )
140 			return testSuiteNodes.get( index - interfaceNodes.size() - propMod );
141 		else
142 			return mockServiceNodes.get( index - interfaceNodes.size() - testSuiteNodes.size() - propMod );
143 	}
144 
145 	public Project getProject()
146 	{
147 		return ( Project )getModelItem();
148 	}
149 
150 	private class InternalProjectListener extends ProjectListenerAdapter
151 	{
152 		public void interfaceAdded( Interface iface )
153 		{
154 			InterfaceTreeNode interfaceTreeNode = new InterfaceTreeNode( iface, getTreeModel() );
155 			interfaceNodes.add( interfaceTreeNode );
156 			getTreeModel().notifyNodeInserted( interfaceTreeNode );
157 		}
158 
159 		public void interfaceRemoved( Interface iface )
160 		{
161 			SoapUITreeNode treeNode = getTreeModel().getTreeNode( iface );
162 			if( interfaceNodes.contains( treeNode ) )
163 			{
164 				getTreeModel().notifyNodeRemoved( treeNode );
165 				interfaceNodes.remove( treeNode );
166 			}
167 			else
168 				throw new RuntimeException( "Removing unkown interface" );
169 		}
170 
171 		public void testSuiteAdded( TestSuite testSuite )
172 		{
173 			TestSuiteTreeNode testSuiteNode = new TestSuiteTreeNode( testSuite, getTreeModel() );
174 			testSuiteNodes.add( testSuite.getProject().getIndexOfTestSuite( testSuite ), testSuiteNode );
175 			getTreeModel().notifyNodeInserted( testSuiteNode );
176 		}
177 
178 		public void testSuiteRemoved( TestSuite testSuite )
179 		{
180 			SoapUITreeNode treeNode = getTreeModel().getTreeNode( testSuite );
181 			if( testSuiteNodes.contains( treeNode ) )
182 			{
183 				getTreeModel().notifyNodeRemoved( treeNode );
184 				testSuiteNodes.remove( treeNode );
185 			}
186 			else
187 				throw new RuntimeException( "Removing unkown testSuite" );
188 		}
189 
190 		@Override
191 		public void testSuiteMoved( TestSuite testSuite, int index, int offset )
192 		{
193 			testSuiteRemoved( testSuite );
194 			testSuiteAdded( testSuite );
195 		}
196 
197 		public void mockServiceAdded( MockService mockService )
198 		{
199 			MockServiceTreeNode mockServiceNode = new MockServiceTreeNode( mockService, getTreeModel() );
200 			mockServiceNodes.add( mockServiceNode );
201 			getTreeModel().notifyNodeInserted( mockServiceNode );
202 		}
203 
204 		public void mockServiceRemoved( MockService mockService )
205 		{
206 			SoapUITreeNode treeNode = getTreeModel().getTreeNode( mockService );
207 			if( mockServiceNodes.contains( treeNode ) )
208 			{
209 				getTreeModel().notifyNodeRemoved( treeNode );
210 				mockServiceNodes.remove( treeNode );
211 			}
212 			else
213 				throw new RuntimeException( "Removing unkown mockService" );
214 		}
215 	}
216 
217 }