/******************************************************************************* * Copyright (c) 2005, 2012 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.ui.details.tree; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import org.eclipse.bpel.model.messageproperties.Property; import org.eclipse.bpel.model.messageproperties.PropertyAlias; import org.eclipse.bpel.ui.util.BPELUtil; import org.eclipse.emf.ecore.EObject; import org.eclipse.wst.wsdl.Input; import org.eclipse.wst.wsdl.Message; import org.eclipse.wst.wsdl.Output; import org.eclipse.wst.wsdl.Part; /** * Tree node to represent a message-type model object. */ public class MessageTypeTreeNode extends TreeNode { boolean isPropertyTree; boolean displayParticles; public MessageTypeTreeNode(Input msg, boolean isCondensed, boolean isProperty) { this(msg, isCondensed, isProperty,true); } public MessageTypeTreeNode(Output msg, boolean isCondensed, boolean isProperty) { this(msg, isCondensed, isProperty,true); } public MessageTypeTreeNode(Message messageType, boolean isCondensed, boolean isPropertyTree) { this(messageType, isCondensed, isPropertyTree, true); } public MessageTypeTreeNode (Message messageType, boolean isCondensed, boolean isPropertyTree, boolean displayParticles) { this((EObject) messageType,isCondensed,isPropertyTree,displayParticles); } private MessageTypeTreeNode(EObject obj, boolean isCondensed, boolean isPropertyTree, boolean displayParticles ) { super(obj, isCondensed); this.isPropertyTree = isPropertyTree; this.displayParticles = displayParticles; } /* ITreeNode */ @Override public Object[] getChildren() { Message msg = getMessage(); if (msg == null) { return EMPTY_ARRAY; } if (isPropertyTree) { // Find propertyAliases that refer to this message. List<PropertyAlias> aliases = BPELUtil.getPropertyAliasesForMessageType(msg); List<Property> properties = getPropertiesFromPropertyAliases(aliases); List<PropertyTreeNode> list = new ArrayList<PropertyTreeNode>(); for (Iterator<Property> it = properties.iterator(); it.hasNext(); ) { list.add(new PropertyTreeNode(it.next(), isCondensed)); } return list.toArray(); } if (msg.getParts() == null) { return EMPTY_ARRAY; } List<PartTreeNode> list = new ArrayList<PartTreeNode>(); for (Iterator<Part> it = msg.getParts().values().iterator(); it.hasNext(); ) { list.add(new PartTreeNode(it.next(), isCondensed, displayParticles)); } return list.toArray(); } @Override public boolean hasChildren() { if (isPropertyTree) { // TODO: we need some sort of property map maintained by the same // builder that will keep track of the namespaceURI's of WSDL files return getChildren().length > 0; } Message msg = getMessage(); if (msg == null) { return false; } return (msg.getParts() != null && !msg.getParts().isEmpty()); } /* other methods */ protected List<Property> getPropertiesFromPropertyAliases(List<PropertyAlias> aliases) { List<Property> properties = new ArrayList<Property>(); Set<Property> propertySet = new HashSet<Property>(); for (Iterator<PropertyAlias> it = aliases.iterator(); it.hasNext(); ) { PropertyAlias alias = it.next(); Property property = (Property)alias.getPropertyName(); if (!propertySet.contains(property)) { properties.add(property); propertySet.add(property); } } return properties; } Message getMessage () { if (modelObject instanceof Message) { return (Message) modelObject; } if (modelObject instanceof Input) { return ((Input)modelObject).getEMessage(); } if (modelObject instanceof Output) { return ((Output)modelObject).getEMessage(); } return null; } }