View Javadoc

1   /*
2    *  soapUI, copyright (C) 2004-2007 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 throw new RuntimeException( "Removing unkown mockOperation" );
124 		}
125 
126 		public void mockResponseAdded( MockResponse mockResponse )
127 		{
128 			 MockOperationTreeNode operationTreeNode = (MockOperationTreeNode) getTreeModel().getTreeNode( mockResponse.getMockOperation() );
129 	       if( operationTreeNode != null )
130 	       	 operationTreeNode.mockResponseAdded( mockResponse );		
131 	       else
132 	      	 throw new RuntimeException( "Adding mockResponse to unknwown MockOperation" );
133 	   }
134 
135 		public void mockResponseRemoved( MockResponse mockResponse )
136 		{
137 			MockOperationTreeNode operationTreeNode = (MockOperationTreeNode) getTreeModel().getTreeNode( mockResponse.getMockOperation() );
138 	       if( operationTreeNode != null )
139 	       	 operationTreeNode.mockResponseRemoved( mockResponse );		
140 	       else
141 	      	 throw new RuntimeException( "Removing mockResponse from unknown MockOperation" );
142 		}
143 	}
144 }