blob: 8c05451cd85a560dfec408cbfaecd47d3322b141 [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 org.eclipse.bpel.model.messageproperties.MessagepropertiesFactory;
import org.eclipse.bpel.model.messageproperties.MessagepropertiesPackage;
import org.eclipse.bpel.model.messageproperties.Property;
import org.eclipse.bpel.model.messageproperties.PropertyAlias;
import org.eclipse.bpel.model.messageproperties.Query;
import org.eclipse.bpel.ui.BPELEditor;
import org.eclipse.bpel.ui.IHelpContextIds;
import org.eclipse.bpel.ui.Messages;
import org.eclipse.bpel.ui.expressions.IEditorConstants;
import org.eclipse.bpel.ui.properties.ExpressionSection;
import org.eclipse.bpel.ui.util.BrowseUtil;
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.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.gef.commands.Command;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.resource.JFaceResources;
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.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.Part;
import org.eclipse.xsd.XSDComponent;
import org.eclipse.xsd.XSDElementDeclaration;
import org.eclipse.xsd.XSDNamedComponent;
import org.eclipse.xsd.XSDTypeDefinition;
/**
* Dialog for creating or editing a property alias.
* 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 Message Types, XSD Simple Types and
* XSD Elements (previous version only supported Message Types).
*
* This also incorporates the XPath Expression editor for use in editing the Query expression.
*/
public class EditPropertyAliasDialog extends Dialog {
protected static final int BID_USE_TYPE = IDialogConstants.CLIENT_ID + 30;
protected static final int BID_USE_ELEMENT = IDialogConstants.CLIENT_ID + 31;
protected static final int BID_USE_MESSAGE = IDialogConstants.CLIENT_ID + 32;
// True if a new propertyAlias is being created (as opposed to an existing being edited)
protected boolean isNew;
protected BPELEditor bpelEditor;
protected Property property;
protected PropertyAlias alias;
protected EObject activeTypeElementOrMessage;
protected Query activeQuery;
protected XSDTypeDefinition xsdTypeDefinition;
protected Query xsdTypeQuery;
protected XSDElementDeclaration xsdElementDeclaration;
protected Query xsdElementQuery;
protected Message message;
protected String messagePart;
protected Query messageQuery;
protected Label typeElementOrMessageNameLabel;
protected Label typeElementOrMessageNameText;
private Button typeRadio;
private Button elementRadio;
private Button messageRadio;
private int typeElementOrMessage;
private QueryEditor queryEditor;
protected Button browseTypeButton;
protected TabbedPropertySheetWidgetFactory wf;
public class QueryEditor extends ExpressionSection {
public void setInput(EObject obj) {
basicSetInput(obj);
}
public String getQuery() {
return this.expressionText.getText().trim();
}
@Override
protected String getExpressionType() {
return IEditorConstants.ET_ANY;
}
@Override
public BPELEditor getBPELEditor() {
return EditPropertyAliasDialog.this.bpelEditor;
}
@Override
public TabbedPropertySheetWidgetFactory getWidgetFactory() {
return EditPropertyAliasDialog.this.wf;
}
@Override
protected EStructuralFeature getStructuralFeature ( EObject eObject ) {
return eObject != null ? MessagepropertiesPackage.eINSTANCE.getPropertyAlias_Query() : null;
}
@Override
protected Command wrapInShowContextCommand(Command inner) {
EditPropertyAliasDialog.this.updateWidgets();
return null;
}
}
public EditPropertyAliasDialog(Shell parentShell, Property property, PropertyAlias alias, BPELEditor bpelEditor, TabbedPropertySheetWidgetFactory wf) {
super(parentShell);
setShellStyle(getShellStyle() | SWT.RESIZE);
this.isNew = (alias == null);
this.alias = alias;
this.property = property;
this.bpelEditor = bpelEditor;
this.wf = wf;
if (this.isNew) {
this.typeElementOrMessage = BID_USE_MESSAGE;
this.alias = MessagepropertiesFactory.eINSTANCE.createPropertyAlias();
}
else {
if (alias.getMessageType() != null) {
this.typeElementOrMessage = BID_USE_MESSAGE;
this.message = (Message)alias.getMessageType();
this.messagePart = alias.getPart();
this.messageQuery = alias.getQuery();
}
else if (alias.getType() != null) {
this.typeElementOrMessage = BID_USE_TYPE;
this.xsdTypeDefinition = (XSDTypeDefinition)alias.getType();
this.xsdTypeQuery = alias.getQuery();
}
else if (alias.getXSDElement() != null) {
this.typeElementOrMessage = BID_USE_ELEMENT;
this.xsdElementDeclaration = (XSDElementDeclaration)alias.getXSDElement();
this.xsdElementQuery = alias.getQuery();
}
}
}
@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
String groupText = Messages.EditMessagePropertyDialog_10;
// PropertyAlias must have either XSD Type or XSD Element or (message type and part): create radio button group
Group typeElementOrMessageRadioGroup = new Group(composite,SWT.SHADOW_ETCHED_IN);
typeElementOrMessageRadioGroup.setText(groupText);
layout = new GridLayout();
layout.makeColumnsEqualWidth = true;
layout.numColumns = 1;
typeElementOrMessageRadioGroup.setLayout(layout);
this.messageRadio = createRadioButton(typeElementOrMessageRadioGroup,Messages.EditMessagePropertyDialog_13, BID_USE_MESSAGE, this.typeElementOrMessage == BID_USE_MESSAGE);
this.typeRadio = createRadioButton(typeElementOrMessageRadioGroup,Messages.EditMessagePropertyDialog_11, BID_USE_TYPE, this.typeElementOrMessage == BID_USE_TYPE);
this.elementRadio = createRadioButton(typeElementOrMessageRadioGroup,Messages.EditMessagePropertyDialog_12, BID_USE_ELEMENT, this.typeElementOrMessage == BID_USE_ELEMENT);
this.messageRadio.addListener(SWT.Selection, enablementListener);
this.typeRadio.addListener(SWT.Selection, enablementListener);
this.elementRadio.addListener(SWT.Selection, enablementListener);
// type label and text
this.typeElementOrMessageNameLabel = new Label(composite, SWT.NONE);
this.typeElementOrMessageNameText = new Label(composite, SWT.NONE);
this.browseTypeButton = new Button(composite, SWT.PUSH);
this.browseTypeButton.setText(Messages.EditMessagePropertyDialog_18);
this.browseTypeButton.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
browsePropertyType();
}
});
// layout widgets
GridData data;
this.queryEditor = new QueryEditor();
Group queryGroup = new Group(composite,SWT.SHADOW_ETCHED_IN);
queryGroup.setText("Query");
layout = new GridLayout();
layout.makeColumnsEqualWidth = true;
layout.numColumns = 1;
queryGroup.setLayout(layout);
data = new GridData(GridData.FILL_BOTH);
data.horizontalSpan = 3;
queryGroup.setLayoutData(data);
this.queryEditor.createControls( queryGroup, null );
data = new GridData(GridData.FILL_BOTH);
data.horizontalSpan = 3;
// data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
// topLabel.setLayoutData(data);
typeElementOrMessageRadioGroup.setLayoutData(data);
data = new GridData(GridData.FILL_HORIZONTAL);
this.messageRadio.setLayoutData(data);
data = new GridData(GridData.FILL_HORIZONTAL);
this.typeRadio.setLayoutData(data);
data = new GridData(GridData.FILL_HORIZONTAL);
this.elementRadio.setLayoutData(data);
data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
this.typeElementOrMessageNameLabel.setLayoutData(data);
data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.FILL_HORIZONTAL);
this.typeElementOrMessageNameText.setLayoutData(data);
data = new GridData(GridData.HORIZONTAL_ALIGN_END);
this.browseTypeButton.setLayoutData(data);
// update widgets
updateWidgets();
PlatformUI.getWorkbench().getHelpSystem().setHelp(
parent, IHelpContextIds.PROPERTY_ALIAS_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:
case BID_USE_MESSAGE:
if (!checked)
return;
this.typeElementOrMessage = id;
break;
default :
break;
}
if (bRefresh) {
updateWidgets();
}
}
protected void updateWidgets() {
// String s = this.queryEditor.getQuery();
// if (s!=null && this.activeQuery!=null) {
// this.activeQuery.setValue(s);
// this.activeQuery.setQueryLanguage(this.queryEditor.getQueryLanguage());
// }
if (this.typeElementOrMessage == BID_USE_TYPE) {
this.typeRadio.setSelection(true);
this.elementRadio.setSelection(false);
this.messageRadio.setSelection(false);
this.activeTypeElementOrMessage = this.xsdTypeDefinition;
if (this.xsdTypeQuery == null) {
this.xsdTypeQuery = MessagepropertiesFactory.eINSTANCE.createQuery();
}
this.activeQuery = this.xsdTypeQuery;
this.typeElementOrMessageNameLabel.setText(Messages.EditMessagePropertyDialog_Type_1);
this.alias.setMessageType(null);
this.alias.setPart(null);
this.alias.setType(this.xsdTypeDefinition);
this.alias.setXSDElement(null);
}
else if (this.typeElementOrMessage == BID_USE_ELEMENT) {
this.typeRadio.setSelection(false);
this.elementRadio.setSelection(true);
this.messageRadio.setSelection(false);
this.activeTypeElementOrMessage = this.xsdElementDeclaration;
if (this.xsdElementQuery == null) {
this.xsdElementQuery = MessagepropertiesFactory.eINSTANCE.createQuery();
}
this.activeQuery = this.xsdElementQuery;
this.typeElementOrMessageNameLabel.setText(Messages.EditMessagePropertyDialog_Element_1);
this.alias.setMessageType(null);
this.alias.setPart(null);
this.alias.setType(null);
this.alias.setXSDElement(this.xsdElementDeclaration);
}
else if (this.typeElementOrMessage == BID_USE_MESSAGE) {
this.typeRadio.setSelection(false);
this.elementRadio.setSelection(false);
this.messageRadio.setSelection(true);
this.activeTypeElementOrMessage = this.message;
if (this.messageQuery == null) {
this.messageQuery = MessagepropertiesFactory.eINSTANCE.createQuery();
}
this.activeQuery = this.messageQuery;
this.typeElementOrMessageNameLabel.setText(Messages.EditMessagePropertyDialog_Message_1);
this.alias.setMessageType(this.message);
this.alias.setPart(this.messagePart);
this.alias.setType(null);
this.alias.setXSDElement(null);
}
this.alias.setQuery(this.activeQuery);
this.queryEditor.setInput(this.alias);
updateTypeElementOrMessageName();
updateEnablement();
}
protected void updateTypeElementOrMessageName() {
if (this.activeTypeElementOrMessage instanceof XSDTypeDefinition) {
this.xsdTypeDefinition = (XSDTypeDefinition) this.activeTypeElementOrMessage;
this.xsdTypeQuery = this.activeQuery;
this.typeElementOrMessageNameText.setText(this.xsdTypeDefinition.getName());
} else if (this.activeTypeElementOrMessage instanceof XSDElementDeclaration) {
this.xsdElementDeclaration = (XSDElementDeclaration) this.activeTypeElementOrMessage;
this.xsdElementQuery = this.activeQuery;
this.typeElementOrMessageNameText.setText(this.xsdElementDeclaration.getName());
} else if (this.activeTypeElementOrMessage instanceof Message) {
this.message = (Message) this.activeTypeElementOrMessage;
String s = this.message.getQName().getLocalPart();
this.messageQuery = this.activeQuery;
if (this.messagePart!=null) {
s += "." + this.messagePart;
}
this.typeElementOrMessageNameText.setText(s);
}
else
{
this.typeElementOrMessageNameText.setText("");
}
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
if (this.isNew) {
newShell.setText(Messages.EditPropertyAliasDialog_9);
} else {
newShell.setText(Messages.EditPropertyAliasDialog_10);
}
}
/**
* 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 part = null;
Object query = null;
Object result[] = null;
if (this.typeElementOrMessage == BID_USE_TYPE)
result = BrowseUtil.browseForXSDType(this.bpelEditor.getProcess(), getShell());
else if (this.typeElementOrMessage == BID_USE_ELEMENT)
result = BrowseUtil.browseForXSDElement(this.bpelEditor.getProcess(), getShell(), true);
else {
result = BrowseUtil.browseForMessageType(this.bpelEditor.getProcess(), getShell(), true);
}
if (result!=null) {
if (result.length>=1) {
type = result[0];
int index = 1;
if (type instanceof Message) {
this.message = (Message) type;
if (result.length>=2 && result[1] instanceof Part) {
part = ((Part)result[1]).getName();
index = 2;
}
}
// build the query string
// NOTE: The namespace for the XSD type may be different from the message namespace
// e.g. the message is defined in a WSDL and the XSD type is defined in externally
// with a different namespace.
Definition definition = this.property.getEnclosingDefinition();
if (definition==null) {
IFile targetFile = this.bpelEditor.getEditModelClient().getArtifactsResourceInfo().getFile();
URI uri = URI.createPlatformResourceURI( targetFile.getFullPath().toString(), true );
Resource resource = this.bpelEditor.getResourceSet().getResource(uri, true);
definition = (Definition) resource.getContents().get(0);
}
query = "";
while (index<result.length) {
if (result[index] instanceof XSDComponent) {
XSDNamedComponent nc = (XSDNamedComponent)result[index];
WSDLImportHelper.addImportAndNamespace(definition, nc.getSchema(),
this.bpelEditor.getEditModelClient().getPrimaryResourceInfo().getFile());
String prefix = definition.getPrefix(nc.getTargetNamespace());
if (prefix!=null)
query = query + "/" + prefix + ":" + nc.getName();
else
query = query + "/" + nc.getName();
}
++index;
}
}
this.activeTypeElementOrMessage = (EObject)type;
if (query!=null)
this.activeQuery.setValue(query.toString());
else
this.activeQuery.setValue("");
if (this.typeElementOrMessage == BID_USE_TYPE) {
this.xsdTypeDefinition = (XSDTypeDefinition) type;
this.xsdTypeQuery = this.activeQuery;
}
else if (this.typeElementOrMessage == BID_USE_ELEMENT) {
this.xsdElementDeclaration = (XSDElementDeclaration) type;
this.xsdElementQuery = this.activeQuery;
}
else {
this.message = (Message)type;
if (part!=null)
this.messagePart = part.toString();
this.messageQuery = this.activeQuery;
}
// hack: don't fetch query from XPath Expression Editor
// because it will overwrite the currently selected element
this.activeQuery = null;
updateWidgets();
}
}
/**
* @return Returns the alias.
*/
public PropertyAlias getPropertyAlias() {
return this.alias;
}
@Override
protected void okPressed() {
this.alias.setPropertyName(this.property);
if (this.typeElementOrMessage == BID_USE_TYPE) {
this.alias.setType(this.xsdTypeDefinition);
if (this.xsdTypeQuery!=null && (this.xsdTypeQuery.getValue()==null || this.xsdTypeQuery.getValue().trim().equals("")) )
this.xsdTypeQuery = null;
this.alias.setQuery(this.xsdTypeQuery);
}
else if (this.typeElementOrMessage == BID_USE_ELEMENT) {
this.alias.setXSDElement(this.xsdElementDeclaration);
if (this.xsdElementQuery!=null && (this.xsdElementQuery.getValue()==null || this.xsdElementQuery.getValue().trim().equals("")) )
this.xsdElementQuery = null;
this.alias.setQuery(this.xsdElementQuery);
}
else {
this.alias.setMessageType(this.message);
this.alias.setPart(this.messagePart);
if (this.messageQuery!=null && (this.messageQuery.getValue()==null || this.messageQuery.getValue().trim().equals("")) )
this.messageQuery = null;
this.alias.setQuery(this.messageQuery);
}
super.okPressed();
}
@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 (variableTypeSelector.getVariableType() == null
// || (messagePartViewer.getSelection() == null) || (messagePartViewer.getSelection().isEmpty())) {
// isOK = false;
// }
Button okButton = getButton(IDialogConstants.OK_ID);
if (okButton != null) {
okButton.setEnabled(isOK);
}
}
}