| /******************************************************************************* |
| * 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); |
| } |
| } |
| } |