/*
* SoapUI, Copyright (C) 2004-2016 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.model.tree.nodes;
import com.eviware.soapui.model.mock.MockOperation;
import com.eviware.soapui.model.mock.MockResponse;
import com.eviware.soapui.model.mock.MockService;
import com.eviware.soapui.model.mock.MockServiceListener;
import com.eviware.soapui.model.tree.AbstractModelItemTreeNode;
import com.eviware.soapui.model.tree.SoapUITreeModel;
import com.eviware.soapui.model.tree.SoapUITreeNode;
import java.util.ArrayList;
import java.util.List;
/**
* SoapUITreeNode for MockService implementations
*
* @author Ole.Matzura
*/
public class MockServiceTreeNode extends AbstractModelItemTreeNode<MockService> {
private ReorderPropertyChangeListener propertyChangeListener = new ReorderPropertyChangeListener();
private List<MockOperationTreeNode> mockOperationNodes = new ArrayList<MockOperationTreeNode>();
private InternalMockServiceListener mockServiceListener;
private PropertiesTreeNode<?> propertiesTreeNode;
public MockServiceTreeNode(MockService mockService, SoapUITreeModel treeModel) {
super(mockService, mockService.getProject(), treeModel);
mockServiceListener = new InternalMockServiceListener();
mockService.addMockServiceListener(mockServiceListener);
for (int c = 0; c < mockService.getMockOperationCount(); c++) {
MockOperation mockOperation = mockService.getMockOperationAt(c);
mockOperation.addPropertyChangeListener(MockService.NAME_PROPERTY, propertyChangeListener);
mockOperationNodes.add(new MockOperationTreeNode(mockOperation, getTreeModel()));
}
getTreeModel().mapModelItems(mockOperationNodes);
propertiesTreeNode = PropertiesTreeNode.createDefaultPropertiesNode(mockService, getTreeModel());
getTreeModel().mapModelItem(propertiesTreeNode);
}
public void release() {
super.release();
getModelItem().removeMockServiceListener(mockServiceListener);
for (MockOperationTreeNode treeNode : mockOperationNodes) {
treeNode.getModelItem().removePropertyChangeListener(propertyChangeListener);
treeNode.release();
}
propertiesTreeNode.release();
}
public MockService getMockService() {
return getModelItem();
}
public int getChildCount() {
int propMod = getTreeModel().isShowProperties() ? 1 : 0;
return mockOperationNodes.size() + propMod;
}
public int getIndexOfChild(Object child) {
int propMod = getTreeModel().isShowProperties() ? 1 : 0;
if (propMod == 1 && child == propertiesTreeNode) {
return 0;
}
int ix = mockOperationNodes.indexOf(child);
return ix == -1 ? ix : ix + propMod;
}
public SoapUITreeNode getChildNode(int index) {
int propMod = getTreeModel().isShowProperties() ? 1 : 0;
return index == 0 && propMod == 1 ? propertiesTreeNode : mockOperationNodes.get(index - propMod);
}
private final class InternalMockServiceListener implements MockServiceListener {
public void mockOperationAdded(MockOperation mockOperation) {
MockOperationTreeNode mockOperationTreeNode = new MockOperationTreeNode(mockOperation, getTreeModel());
mockOperationNodes.add(mockOperationTreeNode);
mockOperation.addPropertyChangeListener(propertyChangeListener);
getTreeModel().notifyNodeInserted(mockOperationTreeNode);
}
public void mockOperationRemoved(MockOperation mockOperation) {
SoapUITreeNode treeNode = getTreeModel().getTreeNode(mockOperation);
if (mockOperationNodes.contains(treeNode)) {
getTreeModel().notifyNodeRemoved(treeNode);
mockOperation.removePropertyChangeListener(propertyChangeListener);
mockOperationNodes.remove(treeNode);
} else {
throw new RuntimeException("Removing unkown mockOperation");
}
}
public void mockResponseAdded(MockResponse mockResponse) {
MockOperationTreeNode operationTreeNode = (MockOperationTreeNode) getTreeModel().getTreeNode(
mockResponse.getMockOperation());
if (operationTreeNode != null) {
operationTreeNode.mockResponseAdded(mockResponse);
} else {
throw new RuntimeException("Adding mockResponse to unknwown MockOperation");
}
}
public void mockResponseRemoved(MockResponse mockResponse) {
MockOperationTreeNode operationTreeNode = (MockOperationTreeNode) getTreeModel().getTreeNode(
mockResponse.getMockOperation());
if (operationTreeNode != null) {
operationTreeNode.mockResponseRemoved(mockResponse);
} else {
throw new RuntimeException("Removing mockResponse from unknown MockOperation");
}
}
}
}