blob: 5d9abfa6e602333edb48b6d3ec1e97fdf6a298c8 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2004 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.wst.wsdl.ui.internal.model;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import org.eclipse.swt.graphics.Image;
import org.eclipse.wst.wsdl.Definition;
import org.eclipse.wst.wsdl.Message;
import org.eclipse.wst.wsdl.ui.internal.WSDLEditorPlugin;
import org.eclipse.wst.wsdl.ui.internal.util.ComponentReferenceUtil;
import org.eclipse.wst.wsdl.ui.internal.util.WSDLEditorUtil;
// Note that the TYPES_GROUP group is just a place holder. If the Types obejct actually exists
// for the root WSDL document, it will be used instead of this model group
//
public class WSDLGroupObject implements ModelAdapter
{
public static final int IMPORTS_GROUP = 1;
public static final int MESSAGES_GROUP = 2;
public static final int SERVICES_GROUP = 3;
public static final int PORT_TYPES_GROUP = 4;
public static final int BINDINGS_GROUP = 5;
public static final int TYPES_GROUP = 6;
public static final int EXTENSIBILITY_ELEMENTS_GROUP = 7;
protected Definition definition;
protected int type;
protected List listenerList = new ArrayList();
protected ModelAdapterFactory modelAdapterFactory;
public WSDLGroupObject(Definition definition, int type)
{
this(definition, type, null);
}
public WSDLGroupObject(Definition definition, int type, ModelAdapterFactory modelAdapterFactory)
{
this.definition = definition;
this.type = type;
this.modelAdapterFactory = modelAdapterFactory;
}
public Definition getParent()
{
return definition;
}
public Definition getDefinition()
{
return definition;
}
public int getType()
{
return type;
}
public String getLabel()
{
String name = "";
switch (type)
{
case IMPORTS_GROUP :
{
name = WSDLEditorPlugin.getWSDLString("_UI_FOLDER_IMPORTS"); //$NON-NLS-1$
break;
}
case MESSAGES_GROUP :
{
name = WSDLEditorPlugin.getWSDLString("_UI_FOLDER_MESSAGES"); //$NON-NLS-1$
break;
}
case SERVICES_GROUP :
{
name = WSDLEditorPlugin.getWSDLString("_UI_FOLDER_SERVICES"); //$NON-NLS-1$
break;
}
case BINDINGS_GROUP :
{
name = WSDLEditorPlugin.getWSDLString("_UI_FOLDER_BINDINGS"); //$NON-NLS-1$
break;
}
case PORT_TYPES_GROUP :
{
name = WSDLEditorPlugin.getWSDLString("_UI_FOLDER_PORTTYPES"); //$NON-NLS-1$
break;
}
case TYPES_GROUP :
{
name = WSDLEditorPlugin.getWSDLString("_UI_FOLDER_TYPES"); //$NON-NLS-1$
break;
}
case EXTENSIBILITY_ELEMENTS_GROUP:
{
name = WSDLEditorPlugin.getWSDLString("_UI_FOLDER_EXTENSIBILITY_ELEMENTS"); //$NON-NLS-1$
break;
}
}
return name;
}
public Image getImage()
{
Image image = null;
switch (type)
{
case IMPORTS_GROUP :
{
image = WSDLEditorPlugin.getInstance().getImage("icons/importheader_obj.gif"); //$NON-NLS-1$
break;
}
case MESSAGES_GROUP :
{
image = WSDLEditorPlugin.getInstance().getImage("icons/messageheader_obj.gif"); //$NON-NLS-1$
break;
}
case SERVICES_GROUP :
{
image = WSDLEditorPlugin.getInstance().getImage("icons/serviceheader_obj.gif"); //$NON-NLS-1$
break;
}
case PORT_TYPES_GROUP :
{
image = WSDLEditorPlugin.getInstance().getImage("icons/porttypeheader_obj.gif"); //$NON-NLS-1$
break;
}
case BINDINGS_GROUP :
{
image = WSDLEditorPlugin.getInstance().getImage("icons/bindingheader_obj.gif"); //$NON-NLS-1$
break;
}
case TYPES_GROUP :
{
image = WSDLEditorPlugin.getInstance().getImage("icons/types_obj.gif"); //$NON-NLS-1$
break;
}
case EXTENSIBILITY_ELEMENTS_GROUP:
{
image = WSDLEditorPlugin.getInstance().getImage("icons/fldr_el.gif"); //$NON-NLS-1$
break;
}
}
return image;
}
// implement ModelAdapter
public void addListener(ModelAdapterListener listener)
{
if (!listenerList.contains(listener))
{
listenerList.add(listener);
}
}
public void removeListener(ModelAdapterListener listener)
{
listenerList.remove(listener);
}
public Object getProperty(Object modelObject, String propertyName)
{
Object result = null;
if (propertyName.equals(CHILDREN_PROPERTY))
{
result = getChildren();
}
else if (propertyName.equals(LABEL_PROPERTY))
{
result = getLabel();
}
else if (propertyName.equals(IMAGE_PROPERTY))
{
result = getImage();
}
return result;
}
public void firePropertyChanged(Object notifier, String property)
{
List list = new ArrayList();
list.addAll(listenerList);
for (Iterator i = list .iterator(); i.hasNext(); )
{
ModelAdapterListener listener = (ModelAdapterListener)i.next();
listener.propertyChanged(notifier, property);
}
}
public List getChildren()
{
List list = Collections.EMPTY_LIST;
ComponentReferenceUtil util = new ComponentReferenceUtil(definition);
switch (getType())
{
case WSDLGroupObject.IMPORTS_GROUP :
{
list = definition.getEImports();
break;
}
case WSDLGroupObject.MESSAGES_GROUP :
{
try
{
list = sortMessages(util.getMessages());
}
catch(Exception e)
{
list = util.getMessages();
}
break;
}
case WSDLGroupObject.SERVICES_GROUP :
{
list = util.getServices();
break;
}
case WSDLGroupObject.PORT_TYPES_GROUP :
{
list = util.getPortTypes();
break;
}
case WSDLGroupObject.BINDINGS_GROUP :
{
list = util.getBindings();
break;
}
case WSDLGroupObject.TYPES_GROUP :
{
Object types = definition.getETypes();
if (types != null)
{
list = (List)modelAdapterFactory.getAdapter(types).getProperty(types, ModelAdapter.CHILDREN_PROPERTY);
}
break;
}
case WSDLGroupObject.EXTENSIBILITY_ELEMENTS_GROUP:
{
list = WSDLEditorUtil.getInstance().getExtensibilityElementNodes(definition);
break;
}
}
return list;
}
private List initialSort(List inputList) {
List messageGroups = new ArrayList();
Iterator iterator = inputList.iterator();
while (iterator.hasNext()) {
Message newMessage = (Message) iterator.next();
boolean messageAdded = false;
for (int index = 0; index < messageGroups.size(); index++) {
MessageGroup messageItem = (MessageGroup) messageGroups.get(index);
if(messageItem.addMessage(newMessage)) {
messageAdded = true;
break;
}
}
// Do we need to create a new MessageGroup object?
if (!messageAdded) {
MessageGroup msGroup = new MessageGroup(newMessage.getQName().getLocalPart());
msGroup.addMessage(newMessage);
messageGroups.add(msGroup);
}
}
return messageGroups;
}
private List buildMessageList(List list) {
List sortedMessageList = new ArrayList();
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
MessageGroup mGroup = (MessageGroup) iterator.next();
sortedMessageList.addAll(mGroup.getMessages());
}
return sortedMessageList;
}
private List sortMessages(List inputList) {
List sortedList = new ArrayList();
sortedList.addAll(inputList);
// Get a sorted list of MessageGroups
sortedList = initialSort(inputList);
Collections.sort(sortedList, new Comparator() {
public int compare(Object o1, Object o2) {
String name1 = ((MessageGroup) o1).getBaseName();
String name2 = ((MessageGroup) o2).getBaseName();
return name1.compareToIgnoreCase(name2);
}
});
sortedList = buildMessageList(sortedList);
return sortedList;
}
private class MessageGroup {
private String baseName;
private Vector messages;
public MessageGroup(String name) {
this.baseName = computeBaseName(name);
messages = new Vector();
}
public boolean addMessage(Message newMessage) {
// do check if it belongs here?......
String newMessageBaseName = computeBaseName(newMessage.getQName().getLocalPart());
if (newMessageBaseName.equalsIgnoreCase(getBaseName())) {
addToSortedList(newMessage);
return true;
}
return false;
}
public Vector getMessages() {
return messages;
}
public String getBaseName() {
return baseName;
}
private int getFirstInstance(String subString) {
for (int index = 0; index < messages.size(); index++) {
Message message = (Message) messages.get(index);
String messageName = message.getQName().getLocalPart();
if (messageName.indexOf(subString, 1) > 0) {
return index;
}
}
return -1;
}
private void addToSortedList(Message message) {
// We need to add the new Message in the right position
int index = -1;
String name = message.getQName().getLocalPart();
if (name.indexOf("Request", 1) > 0) {
// Add after first instance of 'Response'
index = getFirstInstance("Response");
}
else if (name.indexOf("Response", 1) > 0) {
// Add after first instance of 'Request'
index = getFirstInstance("Request");
if (index >= 0)
index++;
}
if (index >= 0) {
messages.add(index, message);
}
else {
messages.add(message);
}
}
private String computeBaseName(String name) {
int resReqIndex = name.indexOf("Request", 1);
int resReqLength;
if (resReqIndex == -1) {
resReqIndex = name.indexOf("Response", 1);
resReqLength = "Response".length();
}
else {
resReqLength = "Request".length();
}
// Did we even find a Request/Response in both strings?
if (resReqIndex != -1) {
return name.substring(0, resReqIndex) + name.substring(resReqIndex + resReqLength, name.length());
}
else {
return name;
}
}
}
}