// ============================================================================ // // Copyright (C) 2006-2016 Talend Inc. - www.talend.com // // This source code is available under agreement available at // %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt // // You should have received a copy of the agreement // along with this program; if not, write to Talend SA // 9 rue Pages 92150 Suresnes, France // // ============================================================================ package com.amalto.workbench.editors; import java.awt.event.TextEvent; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.DragSource; import org.eclipse.swt.dnd.DragSourceEvent; import org.eclipse.swt.dnd.DragSourceListener; import org.eclipse.swt.dnd.DropTarget; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.DropTargetListener; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.widgets.FormToolkit; import org.talend.commons.ui.swt.proposal.ContentProposalAdapterExtended; import com.amalto.workbench.dialogs.PluginDetailsDialog; import com.amalto.workbench.dialogs.XpathSelectDialog; import com.amalto.workbench.i18n.Messages; import com.amalto.workbench.image.EImage; import com.amalto.workbench.image.ImageCache; import com.amalto.workbench.models.Line; import com.amalto.workbench.models.TreeObject; import com.amalto.workbench.models.TreeParent; import com.amalto.workbench.providers.XObjectEditorInput; import com.amalto.workbench.utils.EInputTemplate; import com.amalto.workbench.utils.IConstants; import com.amalto.workbench.utils.Util; import com.amalto.workbench.utils.WidgetUtils; import com.amalto.workbench.utils.XmlUtil; import com.amalto.workbench.utils.XtentisException; import com.amalto.workbench.webservices.TMDMService; import com.amalto.workbench.webservices.WSGetServicesList; import com.amalto.workbench.webservices.WSRoutingRule; import com.amalto.workbench.webservices.WSRoutingRuleExpression; import com.amalto.workbench.webservices.WSServiceGetDocument; import com.amalto.workbench.webservices.WSServicesList; import com.amalto.workbench.webservices.WSServicesListItem; import com.amalto.workbench.webservices.WSString; import com.amalto.workbench.widgets.ComplexTableViewerColumn; import com.amalto.workbench.widgets.ConditionWidget; import com.amalto.workbench.widgets.TisTableViewer; import com.amalto.workbench.widgets.xmleditor.ExtensibleContentEditor; import com.amalto.workbench.widgets.xmleditor.ExtensibleContentEditorPage; import com.amalto.workbench.widgets.xmleditor.ExtensibleContentEditorPageDescription; import com.amalto.workbench.widgets.xmleditor.ExtensibleContentEditorPageListener; import com.amalto.workbench.widgets.xmleditor.ExtensibleEditorContent; import com.amalto.workbench.widgets.xmleditor.ExtensibleTextContentEditorPageCreator; import com.amalto.workbench.widgets.xmleditor.TriggerCallProcessSourcePageCreator; import com.amalto.workbench.widgets.xmleditor.infoholder.ExternalInfoHolder; public class RoutingRuleMainPage extends AMainPageV2 { private static Log log = LogFactory.getLog(RoutingRuleMainPage.class); protected Text descriptionText; protected Text objectTypeText; // Concept protected Button isSynchronousButton; protected Combo serviceNameCombo; // protected Text serviceParametersText; protected ExtensibleContentEditor serviceParametersEditor; private ParameterEditorListener parameterEditorListener; private Map<String, ArrayList<ExternalInfoHolder<?>>> externalInfoName2Holder = new HashMap<String, ArrayList<ExternalInfoHolder<?>>>(); // protected ListViewer routingExpressionsViewer; protected Button xpathButton; protected Combo operatorCombo; protected Text rightValueText; protected Button defultParameterBtn; protected DropTarget windowTarget; protected boolean refreshing = false; protected boolean comitting = false; protected TreeParent treeParent; private static String ROUTE_SERVICE = "amalto/local/service/";//$NON-NLS-1$ protected String dataModelName; private Text conditionText; private final static String EXCONTENTEDITOR_ID = "trigger";//$NON-NLS-1$ protected ComplexTableViewerColumn[] conditionsColumns = new ComplexTableViewerColumn[] { new ComplexTableViewerColumn("XPath", false, "newXPath", "newXPath", "", ComplexTableViewerColumn.XPATH_STYLE,//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$ new String[] {}, 0), new ComplexTableViewerColumn("Operator", false, "", "", "", ComplexTableViewerColumn.COMBO_STYLE,//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$ IConstants.ROUTE_CONDITION_OPERATORS, 0), new ComplexTableViewerColumn("Value", false, "", ""),//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ new ComplexTableViewerColumn("Condition Id", false, "", "", true) };//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ private TisTableViewer conditionViewer; private Button deactiveButton; ContentProposalAdapterExtended adapter; private Text orderText; private Label orderLabel; public String getDataModelName() { return dataModelName; } public void setDataModelName(String dataModelName) { this.dataModelName = dataModelName; } public RoutingRuleMainPage(FormEditor editor) { super(editor, RoutingRuleMainPage.class.getName(), Messages.bind( Messages.triggerLabel, ((XObjectEditorInput) editor.getEditorInput()).getName() + Util.getRevision((TreeObject) ((XObjectEditorInput) editor.getEditorInput()).getModel()))); // get Version information try { treeParent = this.getXObject().getParent(); if (treeParent == null && !isLocalInput()) {// if it is a new page,treeParent should be ROUTING_RULE treeParent = this.getXObject().getServerRoot().findServerFolder(TreeObject.ROUTING_RULE); } initExternalInfoHolder(); } catch (Exception e) {/* no versioning support on old cores */ } } protected void initExternalInfoHolder() { try { ExternalInfoHolder<?> allProcessNamesHolder = ExternalInfoHolder.getAllProcessesNamesHolder(Util .getMDMService(getXObject())); ExternalInfoHolder<?> allJobInfosHolder = ExternalInfoHolder.getAllJobInfosHolder(Util.getMDMService(getXObject())); ExternalInfoHolder<?> allVarCandidatesHolder = ExternalInfoHolder.getTriggerAllCallJobVarsCandidatesHolder(); ExternalInfoHolder<?> mdmServerInfoHolder = ExternalInfoHolder.getAllMDMServerInfoHolder(Util .getMDMService(getXObject())); ExternalInfoHolder<?> workflowInfoHolder = ExternalInfoHolder.getAllWorkflowInfoHolder(Util .getMDMService(getXObject())); ExternalInfoHolder<?> allDataModelHolderProxy = ExternalInfoHolder.getAllDataModelInfoHolderProxy(getXObject()); initExternalInfoHolderForEachType("callprocess", new ExternalInfoHolder<?>[] { allProcessNamesHolder });//$NON-NLS-1$ initExternalInfoHolderForEachType("callJob", new ExternalInfoHolder<?>[] { allJobInfosHolder, mdmServerInfoHolder,//$NON-NLS-1$ allVarCandidatesHolder }); initExternalInfoHolderForEachType("workflow", new ExternalInfoHolder<?>[] { workflowInfoHolder, //$NON-NLS-1$ allDataModelHolderProxy }); } catch (XtentisException e) { log.error(e.getMessage(), e); } } protected void initExternalInfoHolderForEachType(String operaType, ExternalInfoHolder<?>[] infoHolders) { ArrayList<ExternalInfoHolder<?>> externalInfoHolders = new ArrayList<ExternalInfoHolder<?>>(); externalInfoHolders.addAll(Arrays.asList(infoHolders)); externalInfoName2Holder.put(operaType, externalInfoHolders); } @Override protected void createCharacteristicsContent(FormToolkit toolkit, Composite charComposite) { try { // description Label descriptionLabel = toolkit.createLabel(charComposite, Messages.descriptionLabel, SWT.NULL); descriptionLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1)); descriptionText = toolkit.createText(charComposite, "", SWT.BORDER);//$NON-NLS-1$ descriptionText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); descriptionText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (refreshing) { return; } markDirtyWithoutCommit(); } }); // Util.createCompDropTarget(descriptionText); // objectType Label objectTypeLabel = toolkit.createLabel(charComposite, Messages.entityLabel, SWT.NULL); objectTypeLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, true, 1, 1)); Composite typeComposite = toolkit.createComposite(charComposite); typeComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); GridLayout layout = new GridLayout(2, false); layout.marginLeft = 0; layout.marginWidth = 0; typeComposite.setLayout(layout); objectTypeText = toolkit.createText(typeComposite, "", SWT.BORDER);//$NON-NLS-1$ objectTypeText.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING, SWT.CENTER, false, false, 1, 1)); ((GridData) objectTypeText.getLayoutData()).widthHint = 300; // objectTypeText.setLocation(descriptionText.getLocation().x,descriptionText.getLocation().y+10); objectTypeText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (refreshing) { return; } markDirtyWithoutCommit(); } }); xpathButton = toolkit.createButton(typeComposite, "", SWT.PUSH);//$NON-NLS-1$ xpathButton.setImage(ImageCache.getCreatedImage(EImage.DOTS_BUTTON.getPath())); xpathButton.setToolTipText(Messages.entitySelectLabel); xpathButton.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { } public void widgetSelected(SelectionEvent e) { XpathSelectDialog xpathDialog; xpathDialog = getNewXpathDlg(); xpathDialog.setBlockOnOpen(true); xpathDialog.open(); if (xpathDialog.getReturnCode() == Window.OK) { String xpath = xpathDialog.getXpath(); int index = xpathDialog.getXpath().indexOf("/");//$NON-NLS-1$ if (index > 0) { xpath = xpathDialog.getXpath().substring(0, index); } objectTypeText.setText(xpath); } } }); // xpathWidget1 = new XpathWidget("...",treeParent, toolkit, // charComposite,(AMainPageV2)RoutingRuleMainPage.this,false,false,dataModelName); Composite paramComposite = toolkit.createComposite(charComposite); GridLayout pcLayout = new GridLayout(4, false); pcLayout.marginLeft = 0; pcLayout.horizontalSpacing = 0; paramComposite.setLayout(pcLayout); GridData pcLayoutData = new GridData(SWT.FILL, SWT.FILL, true, false); pcLayoutData.horizontalSpan = 2; pcLayoutData.horizontalIndent = 0; paramComposite.setLayoutData(pcLayoutData); // issynchronous Button isSynchronousButton = toolkit.createButton(paramComposite, Messages.executesynLabel, SWT.CHECK); GridData synBtnLayoutData = new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1); synBtnLayoutData.horizontalIndent = 0; isSynchronousButton.setLayoutData(synBtnLayoutData); isSynchronousButton.addMouseListener(new MouseListener() { public void mouseUp(MouseEvent e) { orderLabel.setEnabled(isSynchronousButton.getSelection()); orderText.setEnabled(isSynchronousButton.getSelection()); if (isSynchronousButton.getSelection()) { orderText.setText("0"); //$NON-NLS-1$ } else { orderText.setText(""); //$NON-NLS-1$ } // mark for need to save markDirtyWithoutCommit(); } public void mouseDoubleClick(MouseEvent e) { } public void mouseDown(MouseEvent e) { } }); orderLabel = toolkit.createLabel(paramComposite, Messages.RoutingRuleMainPage_executeOrder); GridData olLayoutData = new GridData(); olLayoutData.horizontalIndent = 10; orderLabel.setLayoutData(olLayoutData); orderLabel.setEnabled(false); orderText = toolkit.createText(paramComposite, "", SWT.BORDER | SWT.SINGLE); //$NON-NLS-1$ GridData otLayoutData = new GridData(SWT.FILL, SWT.CENTER, false, false); otLayoutData.widthHint = 50; otLayoutData.horizontalIndent = 10; orderText.setLayoutData(otLayoutData); orderText.setEnabled(false); orderText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { markDirtyWithoutCommit(); } }); deactiveButton = toolkit.createButton(paramComposite, Messages.deactivateLabel, SWT.CHECK); GridData dbLayoutData = new GridData(SWT.BEGINNING, SWT.FILL, false, true, 1, 1); dbLayoutData.horizontalIndent = 25; deactiveButton.setLayoutData(dbLayoutData); deactiveButton.addMouseListener(new MouseListener() { public void mouseUp(MouseEvent e) { // mark for need to save markDirtyWithoutCommit(); } public void mouseDoubleClick(MouseEvent e) { } public void mouseDown(MouseEvent e) { } }); // Routing Expressions Composite serviceGroup = this.getNewSectionComposite(Messages.serviceLabel); serviceGroup.setLayout(new GridLayout(2, false)); // Service Name Label serviceNameLabel = toolkit.createLabel(serviceGroup, Messages.serviceJndiLabel, SWT.NULL); serviceNameLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, true, 1, 1)); Composite subPanel = toolkit.createComposite(serviceGroup); subPanel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, true, 1, 1)); subPanel.setLayout(new GridLayout(2, false)); serviceNameCombo = new Combo(subPanel, SWT.DROP_DOWN | SWT.SINGLE | SWT.READ_ONLY); serviceNameCombo.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, true, 1, 1)); ((GridData) serviceNameCombo.getLayoutData()).widthHint = 300; serviceNameCombo.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (refreshing) { return; } String serviceName = serviceNameCombo.getText(); String helpPara = ""; //$NON-NLS-1$ if (!"".equals(serviceName) && !serviceName.equals(null)) { //$NON-NLS-1$ if (EInputTemplate.getXtentisObjexts().get(serviceName) != null) { helpPara = EInputTemplate.getXtentisObjexts().get(serviceName).getContent(); } else { helpPara = ""; //$NON-NLS-1$ } } // serviceParametersText.setText(XmlUtil.formatXmlSource(helpPara)); refreshParameterEditor(serviceName); serviceParametersEditor.setContent(XmlUtil.formatXmlSource(helpPara)); markDirtyWithoutCommit(); initParamterProposal(serviceNameCombo.getText()); } }); initServiceNameCombo(); // default parameters button defultParameterBtn = toolkit.createButton(subPanel, "", SWT.PUSH);//$NON-NLS-1$ defultParameterBtn.setImage(ImageCache.getCreatedImage(EImage.HELP_CONTENTS.getPath())); defultParameterBtn.setToolTipText(Messages.helpLabel); defultParameterBtn.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1)); defultParameterBtn.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) { }; public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) { if (serviceNameCombo.getText().trim().length() == 0) { return; } String doc = "";//$NON-NLS-1$ String desc = "";//$NON-NLS-1$ // WSRoutingRule wsObject = (WSRoutingRule) (getXObject().getWSObject()); try { WSServiceGetDocument document = getServiceDocument(serviceNameCombo.getText().trim()); doc = document.getDocument(); desc = document.getDescription(); } catch (Exception e1) { doc = "N/A";//$NON-NLS-1$ } finally { showUpDialog(desc, doc); } }; private void showUpDialog(String desc, String doc) { final PluginDetailsDialog dialog = new PluginDetailsDialog(getSite().getShell(), desc, doc, null, Messages.documentionLabel); dialog.addListener(new Listener() { public void handleEvent(Event event) { dialog.close(); } }); dialog.create(); dialog.getShell().setText(serviceNameCombo.getText() + Messages.serviceDetailLabel); dialog.setBlockOnOpen(true); dialog.open(); } }); // Service Parameters Label serviceParametersLabel = toolkit.createLabel(serviceGroup, Messages.serviceParamLabel, SWT.NULL); serviceParametersLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, true, 2, 1)); serviceParametersEditor = new ExtensibleContentEditor(serviceGroup, SWT.MULTI | SWT.WRAP, EXCONTENTEDITOR_ID); GridData gdServiceParameter = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1); // gdServiceParameter.widthHint = 200; gdServiceParameter.heightHint = 200; serviceParametersEditor.setLayoutData(gdServiceParameter); parameterEditorListener = new ParameterEditorListener(); // serviceParametersText = toolkit.createText(serviceGroup, "",SWT.BORDER|SWT.MULTI|SWT.V_SCROLL|SWT.WRAP); // serviceParametersText.setLayoutData( // new GridData(SWT.FILL,SWT.FILL,true,false,2,1) // ); // ((GridData) serviceParametersText.getLayoutData()).widthHint = 200; // ((GridData) serviceParametersText.getLayoutData()).heightHint = 120; // serviceParametersText.addModifyListener(new ModifyListener() { // // public void modifyText(ModifyEvent e) { // if (refreshing) // return; // markDirtyWithoutCommit(); // } // }); // // add by ymli.fix the bug:0011830. We can reuse the same ctrl+space in trigger configs. // serviceParametersText.addKeyListener(new KeyListener() { // // public void keyReleased(KeyEvent event) { // // // System.out.println("SWT.CTRL:"+SWT.CTRL); // int start = serviceParametersText.getSelection().x; // int end = serviceParametersText.getSelection().y; // if (event.stateMask == SWT.CTRL && event.keyCode == 17) { // // if(event.keyCode == SWT.F2){ // ResourceSelectDialog dialog = new ResourceSelectDialog(getSite().getShell(), treeParent.getParent(), // "Select a resource node", ServerView.show().getSite()); // dialog.setBlockOnOpen(true); // dialog.open(); // if (dialog.getReturnCode() == Window.OK) { // String xpath = dialog.getXpath(); // String textHead = serviceParametersText.getText(0, start - 1); // String textEnd = serviceParametersText.getText(end, serviceParametersText.getText().length()); // serviceParametersText.setText(textHead + xpath + textEnd); // serviceParametersText.setSelection(start, start + xpath.length()); // markDirtyWithoutCommit(); // } // } // } // // public void keyPressed(KeyEvent e) { // } // }); // Routing Expressions Composite routingExpressionsGroup = this.getNewSectionComposite(Messages.triggerExpressionLabel); routingExpressionsGroup.setLayout(new GridLayout(1, true)); conditionsColumns[0].setColumnWidth(250); conditionsColumns[1].setColumnWidth(150); conditionsColumns[2].setColumnWidth(250); conditionsColumns[3].setColumnWidth(120); conditionViewer = getNewTisTableViewer(toolkit, routingExpressionsGroup); TreeParent treeParent = (TreeParent) getAdapter(TreeParent.class); conditionViewer.setTreeParent(treeParent); conditionViewer.setDatamodelName("UpdateReport"); //$NON-NLS-1$ conditionViewer.setXpath(true); conditionViewer.setMainPage(this); conditionViewer.setAddMulti(true); conditionViewer.create(); conditionViewer.setHeight(110); // and or not condition ConditionWidget conditionWidget = new ConditionWidget(routingExpressionsGroup, toolkit, this); conditionText = conditionWidget.getConditionText(); conditionText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (!refreshing) { markDirtyWithoutCommit(); } } }); wrap.Wrap(this, conditionViewer); // make the Page window a DropTarget - we need to dispose it windowTarget = new DropTarget(this.getPartControl(), DND.DROP_MOVE); windowTarget.setTransfer(new Transfer[] { TextTransfer.getInstance() }); windowTarget.addDropListener(new DCDropTargetListener()); refreshData(); conditionText.addFocusListener(new FocusListener() { public void focusLost(FocusEvent e) { // adapter.resetPosition(); } public void focusGained(FocusEvent e) { initConditionProposal(); } }); } catch (Exception e) { log.error(e.getMessage(), e); } }// createCharacteristicsContent /** * DOC hbhong Comment method "getNewXpathDlg". * * @return */ protected XpathSelectDialog getNewXpathDlg() { return new XpathSelectDialog(getSite().getShell(), treeParent, Messages.selectEntityLabel, getSite(), false, dataModelName); } protected WSServiceGetDocument getServiceDocument(String jndiName) { TMDMService service = getService(); if (service != null) { return service.getServiceDocument(new WSString(jndiName)); } return null; } protected TisTableViewer getNewTisTableViewer(FormToolkit toolkit, Composite routingExpressionsGroup) { return new TisTableViewer(Arrays.asList(conditionsColumns), toolkit, routingExpressionsGroup); } /** * DOC hbhong Comment method "initServiceNameCombo". * * @throws XtentisException */ protected void initServiceNameCombo() throws XtentisException { WSServicesList list = Util.getMDMService(getXObject()).getServicesList(new WSGetServicesList(""));//$NON-NLS-1$ List<WSServicesListItem> items = list.getItem(); if (items != null) { String[] sortedList = new String[items.size()]; for (int i = 0; i < items.size(); i++) { sortedList[i] = items.get(i).getJndiName(); } Arrays.sort(sortedList); for (String element : sortedList) { serviceNameCombo.add(element); } // serviceNameCombo.add(""); } } private void addSourceServiceParameterEditorPage(String serviceName) { if ("callprocess".equals(serviceName)) { //$NON-NLS-1$ serviceParametersEditor.addPage(new ExtensibleContentEditorPageDescription("Source", Integer.MAX_VALUE,//$NON-NLS-1$ new TriggerCallProcessSourcePageCreator(), false), serviceName); } else { serviceParametersEditor.addPage(new ExtensibleContentEditorPageDescription("Source", Integer.MAX_VALUE,//$NON-NLS-1$ new ExtensibleTextContentEditorPageCreator(), false), serviceName); } } private void initConditionProposal() { // add content proposal to conditions java.util.List<Line> lines = (java.util.List<Line>) conditionViewer.getViewer().getInput(); java.util.List<String> proposals = new ArrayList<String>(); for (Line line : lines) { String value = line.keyValues.get(3).value; if (value != null && value.trim().length() > 0) { proposals.add(value); } } adapter = WidgetUtils.addContentProposal(conditionText, proposals.toArray(new String[proposals.size()]), new char[] { ' ', '(' }); adapter.setPopupSize(new Point(120, 100)); } private void initParamterProposal(String jndi) { if (externalInfoName2Holder.containsKey(jndi)) { // if ("callprocess".equals(jndi)) { // // add content proposal to paramter // WSTransformerV2PK[] transformerPKs = null; // try { // transformerPKs = Util.getPort(getXObject()).getTransformerV2PKs(new WSGetTransformerV2PKs("")) // .getWSTransformerV2PK(); // } catch (Exception e) { // System.out.println("No Transformers"); // } // java.util.List<String> proposals = new ArrayList<String>(); // if (transformerPKs != null) // for (WSTransformerV2PK pk : transformerPKs) { // if (pk.getPk() != null && pk.getPk().length() > 0) // proposals.add(pk.getPk()); // } // // ContentProposalAdapterExtended adapter = WidgetUtils.addContentProposal(serviceParametersText, // // (String[]) proposals.toArray(new String[proposals.size()]), new char[] { ' ', '=' }); // // adapter.setPopupSize(new Point(300, 250)); serviceParametersEditor.reloadExternalInfo(); } } @Override protected void refreshData() { try { if (this.comitting) { return; } this.refreshing = true; WSRoutingRule wsRoutingRule = (WSRoutingRule) (getXObject().getWsObject()); descriptionText.setText(wsRoutingRule.getDescription()); isSynchronousButton.setSelection(wsRoutingRule.isSynchronous()); if (wsRoutingRule.isDeactive() != null) { deactiveButton.setSelection(wsRoutingRule.isDeactive()); } if (wsRoutingRule.isSynchronous()) { orderLabel.setEnabled(true); orderText.setEnabled(true); orderText.setText(String.valueOf(wsRoutingRule.getExecuteOrder())); } // serviceNameText.setText(wsRoutingRule.getServiceJNDI().replaceFirst("amalto/local/service/", "")); serviceNameCombo.setText(wsRoutingRule.getServiceJNDI().replaceFirst("amalto/local/service/", ""));//$NON-NLS-1$//$NON-NLS-2$ // serviceParametersText.setText(wsRoutingRule.getParameters() == null ? "" : // XmlUtil.formatXmlSource(wsRoutingRule // .getParameters())); refreshParameterEditor(serviceNameCombo.getText().trim()); serviceParametersEditor.setContent(wsRoutingRule.getParameters() == null ? "" : XmlUtil.formatXmlSource(wsRoutingRule//$NON-NLS-1$ .getParameters())); objectTypeText.setText(wsRoutingRule.getConcept()); // xpathWidget1.setText(wsRoutingRule.getConcept()); java.util.List<Line> lines = new ArrayList<Line>(); for (WSRoutingRuleExpression wc : wsRoutingRule.getWsRoutingRuleExpressions()) { Line line = new Line(conditionsColumns, Util.convertRouteCondition(wc)); lines.add(line); } conditionViewer.getViewer().setInput(lines); if (wsRoutingRule.getCondition() != null) { conditionText.setText(wsRoutingRule.getCondition()); } this.refreshing = false; if (objectTypeText.getText().length() > 0 && !objectTypeText.getText().equals("*")) {//$NON-NLS-1$ conditionViewer.setConceptName(objectTypeText.getText()); } initParamterProposal(serviceNameCombo.getText()); // initConditionProposal(); } catch (Exception e) { log.error(e.getMessage(), e); MessageDialog.openError(this.getSite().getShell(), Messages.errorMsgLabel, Messages.bind(Messages.errorMsgLabelX, e.getLocalizedMessage())); } } @Override protected void commit() { try { if (this.refreshing) { return; } this.comitting = true; WSRoutingRule ws = (WSRoutingRule) (getXObject().getWsObject()); ws.setDescription(descriptionText.getText()); ws.setConcept(objectTypeText.getText()); ws.setServiceJNDI(serviceNameCombo.getText().contains("/") ? serviceNameCombo.getText() : "amalto/local/service/"//$NON-NLS-1$//$NON-NLS-2$ + serviceNameCombo.getText()); // ws.setParameters("".equals(serviceParametersText.getText()) ? null : serviceParametersText.getText()); String curServiceParameter = serviceParametersEditor.getContent().getContent(); ws.setParameters("".equals(curServiceParameter) ? null : curServiceParameter);//$NON-NLS-1$ serviceParametersEditor.clearExternalResources(); ws.setSynchronous(isSynchronousButton.getSelection()); ws.setDeactive(deactiveButton.getSelection()); if (isSynchronousButton.getSelection()) { String orderStr = orderText.getText().trim(); if (orderStr.isEmpty()) { orderStr = "0"; //$NON-NLS-1$ } try { int order = Integer.parseInt(orderStr); ws.setExecuteOrder(order); } catch (Exception e) { } } else { ws.setExecuteOrder(0); } java.util.List<Line> lines = (java.util.List<Line>) conditionViewer.getViewer().getInput(); java.util.List<WSRoutingRuleExpression> wclist = new ArrayList<WSRoutingRuleExpression>(); for (Line item : lines) { String[] values = new String[] { item.keyValues.get(0).value, item.keyValues.get(1).value, item.keyValues.get(2).value, item.keyValues.get(3).value }; WSRoutingRuleExpression wc = Util.convertLineRoute(values); wclist.add(wc); } ws.getWsRoutingRuleExpressions().clear(); ws.getWsRoutingRuleExpressions().addAll(wclist); // WSRoutingRuleExpressions refreshed by viewer ws.setCondition(conditionText.getText()); this.comitting = false; } catch (Exception e) { log.error(e.getMessage(), e); MessageDialog.openError(this.getSite().getShell(), Messages.errorCommitLabel, Messages.bind(Messages.errorCommitLabelX, e.getLocalizedMessage())); } } public void textChanged(TextEvent event) { markDirtyWithoutCommit(); } private boolean isValidDigit(String text) { if (text.trim().isEmpty()) { return true; } Pattern pattern = Pattern.compile("[0-9]*");//$NON-NLS-1$ Matcher matcher = pattern.matcher(text.trim()); if (!matcher.matches()) { return false; } if (text.trim().startsWith("0") && text.trim().length() > 1) { //$NON-NLS-1$ return false; } return true; } @Override public void dispose() { super.dispose(); externalInfoName2Holder.clear(); externalInfoName2Holder = null; serviceParametersEditor.dispose(); windowTarget.dispose(); } /**************************************************************************** * DND ****************************************************************************/ class DCDragSourceListener implements DragSourceListener { private int selected; public void dragFinished(DragSourceEvent event) { Control control = ((DragSource) event.widget).getControl(); if ((control instanceof List) && ((event.detail & DND.DROP_MOVE) == DND.DROP_MOVE)) { ((List) control).remove(selected); RoutingRuleMainPage.this.markDirtyWithoutCommit(); } } public void dragSetData(DragSourceEvent event) { Control control = ((DragSource) event.widget).getControl(); if ((control instanceof org.eclipse.swt.widgets.List)) { if (TextTransfer.getInstance().isSupportedType(event.dataType)) { this.selected = ((org.eclipse.swt.widgets.List) control).getSelectionIndex(); event.data = ((org.eclipse.swt.widgets.List) control).getSelection()[0]; } } } public void dragStart(DragSourceEvent event) { Control control = ((DragSource) event.widget).getControl(); if ((control instanceof org.eclipse.swt.widgets.List)) { event.doit = (((org.eclipse.swt.widgets.List) control).getItemCount() > 0); } } } class DCDropTargetListener implements DropTargetListener { public void dragEnter(DropTargetEvent event) { // priority to copy if ((event.operations & DND.DROP_COPY) == DND.DROP_COPY) { event.detail = DND.DROP_COPY; } else if ((event.operations & DND.DROP_MOVE) == DND.DROP_MOVE) { event.detail = DND.DROP_MOVE; } else { event.detail = DND.DROP_NONE; } } public void dragLeave(DropTargetEvent event) { } public void dragOperationChanged(DropTargetEvent event) { } public void dragOver(DropTargetEvent event) { } public void drop(DropTargetEvent event) { Control control = ((DropTarget) event.widget).getControl(); if ((control instanceof List) && ((event.operations & DND.DROP_COPY) == DND.DROP_COPY)) { if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) { if (!Arrays.asList(((org.eclipse.swt.widgets.List) control).getItems()).contains(event.data)) { ((List) control).add(event.data); RoutingRuleMainPage.this.markDirtyWithoutCommit(); } } } } public void dropAccept(DropTargetEvent event) { } } // private void createCompDropTarget() { // DropTarget dropTarget = new DropTarget(serviceParametersText, DND.DROP_MOVE | DND.DROP_LINK); // // dropTarget.setTransfer(new ByteArrayTransfer[] { }); // dropTarget.setTransfer(new TreeObjectTransfer[] { TreeObjectTransfer.getInstance() }); // dropTarget.addDropListener(new DropTargetAdapter() { // // public void dragEnter(DropTargetEvent event) { // } // // public void dragLeave(DropTargetEvent event) { // } // // public void dragOver(DropTargetEvent event) { // event.feedback |= DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL; // } // // public void drop(DropTargetEvent event) { // if (event.data instanceof TreeObject[]) // if (((TreeObject[]) event.data)[0].getType() == TreeObject.TRANSFORMER) // serviceParametersText.setText(serviceParametersText.getText().replace("?", "") // + ((TreeObject[]) event.data)[0].getDisplayName()); // else // serviceParametersText.setText(serviceParametersText.getText() // + ((TreeObject[]) event.data)[0].getDisplayName()); // } // }); // // } @Override public Object getAdapter(Class adapter) { if (adapter == TreeParent.class) { return Util.getServerTreeParent(getXObject()); } return super.getAdapter(adapter); } @Override public boolean beforeDoSave() { if (isSynchronousButton.getSelection()) { String text = orderText.getText(); if (!isValidDigit(text)) { MessageDialog.openError(getSite().getShell(), Messages._Error, Messages.RoutingRuleMainPage_invalidOrder); return false; } } if (serviceNameCombo.getText() == null || serviceNameCombo.getText().length() == 0) { MessageDialog.openError(this.getSite().getShell(), Messages.errorSaveTitleLabel, Messages.errorSaveMsgLabel); return false; } return true; } @Override protected void createActions() { } private void refreshParameterEditor(String serviceName) { serviceParametersEditor.setPageGroup(serviceName); addSourceServiceParameterEditorPage(serviceName); serviceParametersEditor.addExtensibleXMLEditorPageListener(parameterEditorListener); if (externalInfoName2Holder.containsKey(serviceName)) { for (ExternalInfoHolder<?> eachInfoHolder : externalInfoName2Holder.get(serviceName)) { serviceParametersEditor.setExternalInfoHolder(eachInfoHolder); } } } class ParameterEditorListener implements ExtensibleContentEditorPageListener { public void onXMLDocumentChanged(ExtensibleContentEditorPage source, ExtensibleEditorContent newCotent) { if (refreshing) { return; } markDirtyWithoutCommit(); } } }