blob: beaea84f1baedc377191673e791bd76230888498 [file] [log] [blame]
/*******************************************************************************
* 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.dialogs;
import java.io.IOException;
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.MessagepropertiesFactory;
import org.eclipse.bpel.model.messageproperties.Property;
import org.eclipse.bpel.model.messageproperties.PropertyAlias;
import org.eclipse.bpel.ui.BPELEditor;
import org.eclipse.bpel.ui.IHelpContextIds;
import org.eclipse.bpel.ui.Messages;
import org.eclipse.bpel.ui.commands.AddImportCommand;
import org.eclipse.bpel.ui.commands.util.AutoUndoCommand;
import org.eclipse.bpel.ui.details.providers.ColumnTableProvider;
import org.eclipse.bpel.ui.details.providers.ModelLabelProvider;
import org.eclipse.bpel.ui.details.providers.PropertyAliasContentProvider;
import org.eclipse.bpel.ui.details.providers.PropertyAliasFilter;
import org.eclipse.bpel.ui.util.BrowseUtil;
import org.eclipse.bpel.ui.util.ModelHelper;
import org.eclipse.bpel.ui.util.WSDLImportHelper;
import org.eclipse.core.resources.IFile;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
import org.eclipse.wst.wsdl.Definition;
import org.eclipse.wst.wsdl.Message;
import org.eclipse.wst.wsdl.internal.impl.DefinitionImpl;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDNamedComponent;
import org.eclipse.xsd.XSDSchema;
import org.eclipse.xsd.XSDTypeDefinition;
import org.eclipse.xsd.util.XSDConstants;
/**
* Dialog for creating or editing message properties.
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=330813
* https://jira.jboss.org/browse/JBIDE-7107
* This has been completely reworked to support Properties of both XSD Simple Types and
* XSD Elements (previous version only supported Simple Types).
*/
public class EditMessagePropertyDialog extends Dialog {
protected static final int BID_USE_TYPE = IDialogConstants.CLIENT_ID + 30;
protected static final int BID_USE_ELEMENT = IDialogConstants.CLIENT_ID + 31;
// True if a new property is being created (as opposed to an existing being edited)
protected boolean isNew;
// True if the given propery will be replaced
protected boolean isReplacement;
protected Property property;
protected Object propertyType;
protected XSDTypeDefinition xsdTypeDefinition;
protected XSDElementDeclaration xsdElementDeclaration;
protected IFile targetFile;
protected URI propertyTypeFileURI;
protected BPELEditor bpelEditor;
protected List newAliasesList = new ArrayList();
// widgets
protected Text propertyNameText;
protected Label typeOrElementNameLabel;
protected Label typeOrElementNameText;
private Button typeRadio;
private Button elementRadio;
private int typeOrElement;
protected Button browseTypeButton;
protected Button newAliasButton;
protected Button editAliasButton;
protected Button removeAliasButton;
protected Table aliasesTable;
protected ColumnTableProvider aliasesTableProvider;
protected TableViewer aliasesTableViewer;
protected PropertyAliasFilter aliasesFilter;
protected Set existingPropertyNames;
protected TabbedPropertySheetWidgetFactory wf;
/** inner classes **/
public class MessageTypeColumn extends ColumnTableProvider.Column implements ILabelProvider {
@Override
public String getHeaderText() { return Messages.EditMessagePropertyDialog_1; }
@Override
public String getProperty() { return "aliasMsgType"; } //$NON-NLS-1$
@Override
public int getInitialWeight() { return 50; }
ModelLabelProvider labelProvider = new ModelLabelProvider();
public String getText(Object element) {
PropertyAlias alias = (PropertyAlias)element;
String part = alias.getPart();
Object message = ((PropertyAlias)element).getMessageType();
String s = "";
if (message!=null) {
s = labelProvider.getText(message) + (part==null? "" : ("."+part) );
if (part!=null && alias.getQuery() != null) {
String query = alias.getQuery().getValue();
if (query != null && !"".equals(query)) { //$NON-NLS-1$
s += NLS.bind(Messages.EditMessagePropertyDialog_4, (new Object[] { query }));
}
}
}
return s;
}
}
public class XSDElementColumn extends ColumnTableProvider.Column implements ILabelProvider {
@Override
public String getHeaderText() { return Messages.EditMessagePropertyDialog_15; }
@Override
public String getProperty() { return "aliasElement"; } //$NON-NLS-1$
@Override
public int getInitialWeight() { return 25; }
public String getText(Object element) {
PropertyAlias alias = (PropertyAlias)element;
XSDNamedComponent xsdElem = (XSDNamedComponent)alias.getXSDElement();
String s = (xsdElem==null? "":xsdElem.getName());
if (xsdElem!=null && alias.getQuery() != null) {
String query = alias.getQuery().getValue();
if (query != null && !"".equals(query)) { //$NON-NLS-1$
s += NLS.bind(Messages.EditMessagePropertyDialog_4, (new Object[] { query }));
}
}
return s;
}
}
public class XSDTypeColumn extends ColumnTableProvider.Column implements ILabelProvider {
@Override
public String getHeaderText() { return Messages.EditMessagePropertyDialog_16; }
@Override
public String getProperty() { return "aliasType"; } //$NON-NLS-1$
@Override
public int getInitialWeight() { return 25; }
public String getText(Object element) {
PropertyAlias alias = (PropertyAlias)element;
XSDNamedComponent xsdElem = (XSDNamedComponent)alias.getType();
String s = (xsdElem==null? "":xsdElem.getName());
if (xsdElem!=null && alias.getQuery() != null) {
String query = alias.getQuery().getValue();
if (query != null && !"".equals(query)) { //$NON-NLS-1$
s += NLS.bind(Messages.EditMessagePropertyDialog_4, (new Object[] { query }));
}
}
return s;
}
}
public EditMessagePropertyDialog(Shell parentShell, Property property, String newPropertyName, BPELEditor bpelEditor, TabbedPropertySheetWidgetFactory wf) {
super(parentShell);
setShellStyle(getShellStyle() | SWT.RESIZE);
this.bpelEditor = bpelEditor;
this.property = property;
this.wf = wf;
isNew = (property == null);
isReplacement = (property!=null && property.eIsProxy());
if (isReplacement)
newPropertyName = property.getName();
if (isNew || isReplacement) {
targetFile = bpelEditor.getEditModelClient().getArtifactsResourceInfo().getFile();
this.property = MessagepropertiesFactory.eINSTANCE.createProperty();
this.property.setName(newPropertyName);
typeOrElement = BID_USE_TYPE;
} else {
Object type = property.getType();
if (type instanceof XSDTypeDefinition) {
this.propertyType = type;
this.xsdTypeDefinition = (XSDTypeDefinition)type;
typeOrElement = BID_USE_TYPE;
}
else if (type instanceof XSDElementDeclaration) {
this.propertyType = type;
this.xsdElementDeclaration = (XSDElementDeclaration)type;
typeOrElement = BID_USE_ELEMENT;
}
else {
typeOrElement = BID_USE_TYPE;
}
}
}
/**
* @return Returns the property.
*/
public Property getProperty() {
return property;
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
GridLayout layout = (GridLayout) composite.getLayout();
layout.makeColumnsEqualWidth = false;
layout.numColumns = 3;
Listener enablementListener = new Listener() {
public void handleEvent(Event e) {
updateEnablement();
}
};
// create widgets
Label propertyNameLabel = new Label(composite, SWT.NONE);
propertyNameLabel.setText(Messages.EditMessagePropertyDialog_14);
propertyNameText = new Text(composite, SWT.BORDER);
if (property != null) {
String s = property.getName();
propertyNameText.setText((s == null)? "" : s); //$NON-NLS-1$
}
// TODO: if the property name changes we need to update the aliases as well
propertyNameText.addListener(SWT.Modify, enablementListener);
if (isReplacement)
propertyNameText.setEnabled(false);
String groupText = Messages.EditMessagePropertyDialog_10;
// Property must have either XSD Type or XSD Element: create radio button group
Group typeOrElementRadioGroup = new Group(composite,SWT.SHADOW_ETCHED_IN);
typeOrElementRadioGroup.setText(groupText);
layout = new GridLayout();
layout.makeColumnsEqualWidth = false;
layout.numColumns = 1;
typeOrElementRadioGroup.setLayout(layout);
typeRadio = createRadioButton(typeOrElementRadioGroup,Messages.EditMessagePropertyDialog_11, BID_USE_TYPE, typeOrElement == BID_USE_TYPE);
elementRadio = createRadioButton(typeOrElementRadioGroup,Messages.EditMessagePropertyDialog_12, BID_USE_ELEMENT, typeOrElement == BID_USE_ELEMENT);
typeRadio.addListener(SWT.Selection, enablementListener);
elementRadio.addListener(SWT.Selection, enablementListener);
typeOrElementNameLabel = new Label(composite, SWT.NONE);
typeOrElementNameText = new Label(composite, SWT.NONE);
browseTypeButton = new Button(composite, SWT.PUSH);
browseTypeButton.setText(Messages.EditMessagePropertyDialog_18);
browseTypeButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
browsePropertyType();
}
});
Label separator = new Label(composite, SWT.SEPARATOR|SWT.HORIZONTAL|SWT.BOLD);
Label aliasesLabel = new Label(composite, SWT.NONE);
aliasesLabel.setText(Messages.EditMessagePropertyDialog_20);
Composite c2 = new Composite(composite, SWT.NONE);
newAliasButton = new Button(c2, SWT.PUSH);
newAliasButton.setText(Messages.EditMessagePropertyDialog_21);
newAliasButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
createAlias();
}
});
editAliasButton = new Button(c2, SWT.PUSH);
editAliasButton.setText(Messages.EditMessagePropertyDialog_22);
editAliasButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
IStructuredSelection sel = (IStructuredSelection)aliasesTableViewer.getSelection();
PropertyAlias alias = (PropertyAlias) sel.getFirstElement();
editAlias(alias);
}
});
removeAliasButton = new Button(c2, SWT.PUSH);
removeAliasButton.setText(Messages.EditMessagePropertyDialog_23);
removeAliasButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
IStructuredSelection sel = (IStructuredSelection)aliasesTableViewer.getSelection();
PropertyAlias alias = (PropertyAlias) sel.getFirstElement();
Definition definition = property.getEnclosingDefinition();
if (definition != null) {
definition.getEExtensibilityElements().remove(alias);
} else {
newAliasesList.remove(alias);
}
updatePropertyAliasTable();
}
});
aliasesTable = new Table(composite, SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.BORDER);
aliasesTable.setLinesVisible(true);
aliasesTable.setHeaderVisible(true);
aliasesTableProvider = new ColumnTableProvider();
aliasesTableProvider.add(new MessageTypeColumn());
aliasesTableProvider.add(new XSDElementColumn());
aliasesTableProvider.add(new XSDTypeColumn());
aliasesTableViewer = new TableViewer(aliasesTable);
aliasesTableProvider.createTableLayout(aliasesTable);
aliasesTableViewer.setLabelProvider(aliasesTableProvider);
// Content provider that combines aliases from the actual model and newAliasesList.
aliasesTableViewer.setContentProvider(new PropertyAliasContentProvider() {
@Override
public Object[] getElements(Object input) {
Object[] superResult = super.getElements(input);
Object[] result = new Object[superResult.length + newAliasesList.size()];
System.arraycopy(superResult, 0, result, 0, superResult.length);
int i = superResult.length;
for (Iterator it = newAliasesList.iterator(); it.hasNext(); ) {
result[i++] = it.next();
}
return result;
}
});
aliasesTableViewer.setColumnProperties(aliasesTableProvider.getColumnProperties());
aliasesFilter = new PropertyAliasFilter();
aliasesTableViewer.addFilter(aliasesFilter);
aliasesTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
updateEnablement();
}
});
// update type widgets
updateTypeWidgets();
updatePropertyAliasTable();
updateTypeFileText();
// layout widgets
GridData data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
data.horizontalSpan = 1;
propertyNameLabel.setLayoutData(data);
data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL);
data.horizontalSpan = 2;
propertyNameText.setLayoutData(data);
data = new GridData(GridData.FILL_BOTH);
data.horizontalSpan = 3;
// data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
// topLabel.setLayoutData(data);
typeOrElementRadioGroup.setLayoutData(data);
data = new GridData(GridData.FILL_HORIZONTAL);
typeRadio.setLayoutData(data);
data = new GridData(GridData.FILL_HORIZONTAL);
elementRadio.setLayoutData(data);
data = new GridData(GridData.FILL_HORIZONTAL);
data.horizontalSpan = 3;
separator.setLayoutData(data);
data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
typeOrElementNameLabel.setLayoutData(data);
data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL);
typeOrElementNameText.setLayoutData(data);
data = new GridData(GridData.HORIZONTAL_ALIGN_END);
browseTypeButton.setLayoutData(data);
data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
aliasesLabel.setLayoutData(data);
data = new GridData(GridData.HORIZONTAL_ALIGN_END);
data.horizontalSpan = 2;
c2.setLayoutData(data);
layout = new GridLayout(3, false);
layout.marginWidth = 0;
layout.marginHeight = 0;
c2.setLayout(layout);
data = new GridData(GridData.HORIZONTAL_ALIGN_END);
newAliasButton.setLayoutData(data);
data = new GridData(GridData.HORIZONTAL_ALIGN_END);
editAliasButton.setLayoutData(data);
data = new GridData(GridData.HORIZONTAL_ALIGN_END);
removeAliasButton.setLayoutData(data);
data = new GridData(GridData.FILL_BOTH);
data.horizontalSpan = 3;
data.verticalSpan = 3;
data.heightHint = 200;
data.widthHint = 500;
aliasesTable.setLayoutData(data);
PlatformUI.getWorkbench().getHelpSystem().setHelp(
parent, IHelpContextIds.PROPERTY_DIALOG);
composite.pack();
return composite;
}
protected Button createRadioButton(Composite parent, String label, int id, boolean checked) {
Button button = new Button(parent,SWT.RADIO);
button.setText(label);
button.setFont(JFaceResources.getDialogFont());
button.setData( Integer.valueOf( id ));
button.setSelection( checked );
button.addSelectionListener (new SelectionAdapter() {
@Override
public void widgetSelected (SelectionEvent event) {
Button b = (Button) event.widget;
int val = ((Integer) b.getData()).intValue();
buttonPressed(val, b.getSelection(), true );
}
});
return button;
}
/**
* Handle the check button and radio button callbacks.
*
* @param id
* @param checked
* @param refresh unless this is set, no refresh is done.
*/
protected void buttonPressed(int id, boolean checked, boolean bRefresh) {
switch (id) {
case BID_USE_ELEMENT:
case BID_USE_TYPE:
if (!checked)
return;
typeOrElement = id;
break;
default :
break;
}
if (bRefresh) {
updateTypeWidgets();
}
}
protected void updatePropertyAliasTable() {
aliasesFilter.setProperty(property);
//aliasesTableViewer.setInput(definition);
aliasesTableViewer.setInput(bpelEditor.getProcess());
}
protected void updateTypeFileText() {
if (propertyType instanceof XSDTypeDefinition) {
xsdTypeDefinition = (XSDTypeDefinition) propertyType;
typeOrElementNameText.setText(xsdTypeDefinition.getName());
} else if (propertyType instanceof XSDElementDeclaration) {
xsdElementDeclaration = (XSDElementDeclaration) propertyType;
typeOrElementNameText.setText(xsdElementDeclaration.getName());
}
else
{
typeOrElementNameText.setText("");
}
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
if (isNew) {
newShell.setText(Messages.EditMessagePropertyDialog_26);
} else {
newShell.setText(Messages.EditMessagePropertyDialog_27);
}
}
@Override
protected Control createContents(Composite parent) {
Control result = super.createContents(parent);
updateEnablement();
return result;
}
protected void updateEnablement() {
// update the OK button
boolean isOK = true;
if ((targetFile == null && property.eResource() == null)
|| !isPropertyNameValid()
|| propertyType == null) {
isOK = false;
}
Button okButton = getButton(IDialogConstants.OK_ID);
if (okButton != null) {
okButton.setEnabled(isOK);
}
newAliasButton.setEnabled(isOK);
isOK &= !aliasesTableViewer.getSelection().isEmpty();
editAliasButton.setEnabled(isOK);
removeAliasButton.setEnabled(isOK);
}
protected boolean isPropertyNameValid() {
String name = propertyNameText.getText();
if (name == null) return false;
if ("".equals(name)) return false; //$NON-NLS-1$
if (propertyNameExists(name)) return false;
return true;
}
protected boolean propertyNameExists(String name) {
if (!isNew && name.equals(property.getName())) return false;
return !isReplacement && getExistingPropertyNames().contains(name);
}
protected Set getExistingPropertyNames() {
if (existingPropertyNames == null) {
Set properties = ModelHelper.getAvailableProperties(bpelEditor.getProcess());
existingPropertyNames = new HashSet();
for (Iterator iter = properties.iterator(); iter.hasNext();) {
Property prop = (Property) iter.next();
existingPropertyNames.add(prop.getName());
}
}
return existingPropertyNames;
}
protected void updateTypeWidgets() {
// update type from file
if (typeOrElement == BID_USE_ELEMENT ) {
typeOrElementNameLabel.setText(Messages.EditMessagePropertyDialog_Element_1);
typeRadio.setSelection(false);
elementRadio.setSelection(true);
propertyType = xsdElementDeclaration;
}
else {
typeOrElementNameLabel.setText(Messages.EditMessagePropertyDialog_Type_1);
typeRadio.setSelection(true);
elementRadio.setSelection(false);
propertyType = xsdTypeDefinition;
}
typeOrElementNameLabel.pack();
updateTypeFileText();
}
/**
* Opens a dialog and let the user browse for an XSD type or element.
* Updates the property type according to the user choice.
*/
protected void browsePropertyType() {
Object type = null;
Object result[] = null;
if (typeOrElement == BID_USE_TYPE)
result = BrowseUtil.browseForXSDType(bpelEditor.getProcess(), getShell());
else
result = BrowseUtil.browseForXSDElement(bpelEditor.getProcess(), getShell(),false);
if (result!=null && result.length>=1)
type = result[0];
if (type != null) {
propertyType = type;
if (typeOrElement == BID_USE_ELEMENT)
xsdElementDeclaration = (XSDElementDeclaration) type;
else
xsdTypeDefinition = (XSDTypeDefinition) type;
updateTypeFileText();
updateEnablement();
}
}
protected URI getTargetFileURI() {
if (targetFile != null) {
return URI.createPlatformResourceURI(targetFile.getFullPath().toString());
}
return property.eResource().getURI();
}
@Override
protected void okPressed() {
createProperty();
super.okPressed();
}
/**
* Creates the necessary property (in the Resource in memory only).
*/
protected void createProperty() {
URI uri = getTargetFileURI();
final Resource resource = bpelEditor.getResourceSet().getResource(uri, true);
final Definition definition = (Definition) resource.getContents().get(0);
bpelEditor.getCommandFramework().execute(new AutoUndoCommand(definition) {
@Override
public void doExecute() {
if (isNew) {
definition.getEExtensibilityElements().add(property);
property.setEnclosingDefinition(definition);
// add any aliases we're creating too.
for (Iterator it = newAliasesList.iterator(); it.hasNext(); ) {
PropertyAlias alias = (PropertyAlias)it.next();
definition.getEExtensibilityElements().add(alias);
alias.setEnclosingDefinition(definition);
}
newAliasesList.clear();
}
else if (isReplacement) {
boolean found = false;
for (Object obj : definition.getEExtensibilityElements()) {
if (obj instanceof Property && ((Property)obj).getName().equals(property.getName())) {
property = (Property)obj;
found = true;
break;
}
}
if (!found) {
definition.getEExtensibilityElements().add(property);
property.setEnclosingDefinition(definition);
}
}
property.setName(propertyNameText.getText());
property.setType(propertyType);
WSDLImportHelper.addAllImportsAndNamespaces(definition,
bpelEditor.getEditModelClient().getPrimaryResourceInfo().getFile());
// This property must be a simple type. Make sure the namespace is already in the wsdl file.
if (definition.getPrefix(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001) == null) {
// TODO: what if it already had this prefix??
definition.addNamespace("xs", XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001); //$NON-NLS-1$
}
// https://issues.jboss.org/browse/JBIDE-8075
// create the artifacts resource if it doesn't already exist
if (targetFile!=null && !targetFile.exists()) {
// add the import if not already being imported by this process
AddImportCommand cmd = new AddImportCommand(bpelEditor.getProcess(), definition, null);
if (cmd.canDoExecute() && cmd.wouldCreateDuplicateImport() == false) {
bpelEditor.getCommandStack().execute(cmd);
}
try {
resource.setModified(true);
resource.save(resource.getResourceSet().getLoadOptions());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
}
/**
* Opens a dialog and let the user create a new property alias.
*/
protected void createAlias() {
EditPropertyAliasDialog dialog = new EditPropertyAliasDialog(getShell(), property, null, bpelEditor, wf);
if (dialog.open() == Window.OK) {
final PropertyAlias alias = dialog.getPropertyAlias();
if (alias != null) {
URI uri = getTargetFileURI();
Resource resource = bpelEditor.getResourceSet().getResource(uri, true);
final Definition definition = (Definition) resource.getContents().get(0);
bpelEditor.getCommandFramework().execute(new AutoUndoCommand(definition) {
@Override
public void doExecute() {
if (isNew) {
// save the alias and add them later
newAliasesList.add(alias);
} else {
// add the alias now
if (isReplacement) {
alias.setPropertyName(property);
}
alias.setEnclosingDefinition(definition);
definition.getEExtensibilityElements().add(alias);
}
Object imported = null;
Object messageTypeObject = alias.getMessageType();
Object xsdElementObject = alias.getXSDElement();
Object typeObject = alias.getType();
if (messageTypeObject instanceof Message) {
imported = ((Message)messageTypeObject).getEnclosingDefinition();
}
else if (xsdElementObject instanceof XSDElementDeclaration) {
EObject top = (XSDElementDeclaration)xsdElementObject;
while (top.eContainer() != null) {
top = top.eContainer();
if (top instanceof Definition) {
imported = top;
break;
}
}
}
else if (typeObject instanceof XSDTypeDefinition) {
EObject top = (XSDTypeDefinition)typeObject;
while (top.eContainer() != null) {
top = top.eContainer();
if (top instanceof Definition) {
imported = top;
break;
}
}
}
if (imported instanceof Definition) {
WSDLImportHelper.addImportAndNamespace(definition, (Definition)imported);
}
else if (imported instanceof XSDSchema) {
WSDLImportHelper.addImportAndNamespace(definition, (XSDSchema)imported,
bpelEditor.getEditModelClient().getPrimaryResourceInfo().getFile());
}
// This doesn't seem to introduce an updateElement automatically,
// so do it manually now, so that RolePortTypes (for example) who
// are affected by the new namespace will know about it.
((DefinitionImpl)definition).updateElement();
}
});
updatePropertyAliasTable();
}
}
}
/**
* Opens a dialog and let the user edit an existing property alias.
*/
protected void editAlias(PropertyAlias alias) {
if (alias != null) {
EditPropertyAliasDialog dialog = new EditPropertyAliasDialog(getShell(), property, alias, bpelEditor, wf);
if (dialog.open() == Window.OK) {
updatePropertyAliasTable();
}
}
}
}