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.mock.MockOperation;
19  import com.eviware.soapui.model.mock.MockResponse;
20  import com.eviware.soapui.model.mock.MockService;
21  import com.eviware.soapui.model.mock.MockServiceListener;
22  import com.eviware.soapui.model.tree.AbstractModelItemTreeNode;
23  import com.eviware.soapui.model.tree.SoapUITreeModel;
24  import com.eviware.soapui.model.tree.SoapUITreeNode;
25  import com.eviware.soapui.settings.UISettings;
26  
27  /***
28   * SoapUITreeNode for MockService implementations
29   * 
30   * @author Ole.Matzura
31   */
32  
33  public class MockServiceTreeNode extends AbstractModelItemTreeNode<MockService>
34  {
35  	private ReorderPropertyChangeListener propertyChangeListener = new ReorderPropertyChangeListener();
36  	private List<MockOperationTreeNode> mockOperationNodes = new ArrayList<MockOperationTreeNode>();
37  	private InternalMockServiceListener mockServiceListener;
38  	private PropertiesTreeNode<?> propertiesTreeNode;
39  
40  	public MockServiceTreeNode( MockService mockService, SoapUITreeModel treeModel )
41  	{
42  		super( mockService, mockService.getProject(), treeModel );
43  
44  		mockServiceListener = new InternalMockServiceListener();
45  		mockService.addMockServiceListener( mockServiceListener );
46  
47  		for( int c = 0; c < mockService.getMockOperationCount(); c++ )
48  		{
49  			MockOperation mockOperation = mockService.getMockOperationAt( c );
50  			mockOperation.addPropertyChangeListener( MockService.NAME_PROPERTY, propertyChangeListener );
51  			mockOperationNodes.add( new MockOperationTreeNode( mockOperation, getTreeModel() ) );
52  		}
53  
54  		initOrdering( mockOperationNodes, UISettings.ORDER_MOCKOPERATION );
55  
56  		getTreeModel().mapModelItems( mockOperationNodes );
57  
58  		propertiesTreeNode = PropertiesTreeNode.createDefaultPropertiesNode( mockService, getTreeModel() );
59  		getTreeModel().mapModelItem( propertiesTreeNode );
60  	}
61  
62  	public void release()
63  	{
64  		super.release();
65  
66  		getModelItem().removeMockServiceListener( mockServiceListener );
67  
68  		for( MockOperationTreeNode treeNode : mockOperationNodes )
69  		{
70  			treeNode.getModelItem().removePropertyChangeListener( propertyChangeListener );
71  			treeNode.release();
72  		}
73  
74  		propertiesTreeNode.release();
75  	}
76  
77  	public MockService getMockService()
78  	{
79  		return ( MockService )getModelItem();
80  	}
81  
82  	public int getChildCount()
83  	{
84  		int propMod = getTreeModel().isShowProperties() ? 1 : 0;
85  		return mockOperationNodes.size() + propMod;
86  	}
87  
88  	public int getIndexOfChild( Object child )
89  	{
90  		int propMod = getTreeModel().isShowProperties() ? 1 : 0;
91  		if( propMod == 1 && child == propertiesTreeNode )
92  			return 0;
93  
94  		int ix = mockOperationNodes.indexOf( child );
95  		return ix == -1 ? ix : ix + propMod;
96  	}
97  
98  	public SoapUITreeNode getChildNode( int index )
99  	{
100 		int propMod = getTreeModel().isShowProperties() ? 1 : 0;
101 		return index == 0 && propMod == 1 ? propertiesTreeNode : mockOperationNodes.get( index - propMod );
102 	}
103 
104 	private final class InternalMockServiceListener implements MockServiceListener
105 	{
106 		public void mockOperationAdded( MockOperation mockOperation )
107 		{
108 			MockOperationTreeNode mockOperationTreeNode = new MockOperationTreeNode( mockOperation, getTreeModel() );
109 			mockOperationNodes.add( mockOperationTreeNode );
110 			mockOperation.addPropertyChangeListener( propertyChangeListener );
111 			getTreeModel().notifyNodeInserted( mockOperationTreeNode );
112 		}
113 
114 		public void mockOperationRemoved( MockOperation mockOperation )
115 		{
116 			SoapUITreeNode treeNode = getTreeModel().getTreeNode( mockOperation );
117 			if( mockOperationNodes.contains( treeNode ) )
118 			{
119 				getTreeModel().notifyNodeRemoved( treeNode );
120 				mockOperation.removePropertyChangeListener( propertyChangeListener );
121 				mockOperationNodes.remove( treeNode );
122 			}
123 			else
124 				throw new RuntimeException( "Removing unkown mockOperation" );
125 		}
126 
127 		public void mockResponseAdded( MockResponse mockResponse )
128 		{
129 			MockOperationTreeNode operationTreeNode = ( MockOperationTreeNode )getTreeModel().getTreeNode(
130 					mockResponse.getMockOperation() );
131 			if( operationTreeNode != null )
132 				operationTreeNode.mockResponseAdded( mockResponse );
133 			else
134 				throw new RuntimeException( "Adding mockResponse to unknwown MockOperation" );
135 		}
136 
137 		public void mockResponseRemoved( MockResponse mockResponse )
138 		{
139 			MockOperationTreeNode operationTreeNode = ( MockOperationTreeNode )getTreeModel().getTreeNode(
140 					mockResponse.getMockOperation() );
141 			if( operationTreeNode != null )
142 				operationTreeNode.mockResponseRemoved( mockResponse );
143 			else
144 				throw new RuntimeException( "Removing mockResponse from unknown MockOperation" );
145 		}
146 	}
147 }