// ============================================================================
//
// 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.lang.reflect.InvocationTargetException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Observable;
import java.util.Set;
import java.util.TreeMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.TextEvent;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
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.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseTrackAdapter;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.Image;
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.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.AbstractFormPart;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
import com.amalto.workbench.dialogs.PluginDetailsDialog;
import com.amalto.workbench.dialogs.ProcessResultsDialog;
import com.amalto.workbench.dialogs.SetupTransformerInputVariablesDialog;
import com.amalto.workbench.dialogs.VariableDefinitionDialog;
import com.amalto.workbench.editors.xslteditor.PageRefresher;
import com.amalto.workbench.editors.xslteditor.XSLTEditor;
import com.amalto.workbench.editors.xslteditor.XSLTFileEditorInput;
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.providers.XObjectEditorInput;
import com.amalto.workbench.utils.EInputTemplate;
import com.amalto.workbench.utils.FileProvider;
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.BackgroundJobStatusType;
import com.amalto.workbench.webservices.TMDMService;
import com.amalto.workbench.webservices.WSBackgroundJob;
import com.amalto.workbench.webservices.WSBackgroundJobPK;
import com.amalto.workbench.webservices.WSByteArray;
import com.amalto.workbench.webservices.WSExecuteTransformerV2AsJob;
import com.amalto.workbench.webservices.WSExtractedContent;
import com.amalto.workbench.webservices.WSGetBackgroundJob;
import com.amalto.workbench.webservices.WSGetTransformerPluginV2Details;
import com.amalto.workbench.webservices.WSGetTransformerPluginV2SList;
import com.amalto.workbench.webservices.WSPipeline;
import com.amalto.workbench.webservices.WSPipelineTypedContentEntry;
import com.amalto.workbench.webservices.WSTransformerContext;
import com.amalto.workbench.webservices.WSTransformerContextPipeline;
import com.amalto.workbench.webservices.WSTransformerContextPipelinePipelineItem;
import com.amalto.workbench.webservices.WSTransformerPluginV2Details;
import com.amalto.workbench.webservices.WSTransformerPluginV2SList;
import com.amalto.workbench.webservices.WSTransformerPluginV2SListItem;
import com.amalto.workbench.webservices.WSTransformerPluginV2VariableDescriptor;
import com.amalto.workbench.webservices.WSTransformerProcessStep;
import com.amalto.workbench.webservices.WSTransformerV2;
import com.amalto.workbench.webservices.WSTransformerV2PK;
import com.amalto.workbench.webservices.WSTransformerVariablesMapping;
import com.amalto.workbench.webservices.WSTypedContent;
import com.amalto.workbench.widgets.DescAnnotationComposite;
import com.amalto.workbench.widgets.LabelCombo;
import com.amalto.workbench.widgets.WidgetFactory;
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.infoholder.ExternalInfoHolder;
public class TransformerMainPage extends AMainPageV2 {
private static Log log = LogFactory.getLog(TransformerMainPage.class);
static SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); //$NON-NLS-1$
public final static String DEFAULT_VAR = "_DEFAULT_"; //$NON-NLS-1$
public final static String DEFAULT_DISPLAY = "{}"; //$NON-NLS-1$
public final static String TRANSFORMER_PLUGIN = "amalto/local/transformer/plugin/"; //$NON-NLS-1$
private final static String EXCONTENTEDITOR_ID = "process";//$NON-NLS-1$
protected Text stepText;
protected List stepsList;
protected Label stepLabel;
protected CCombo pluginsCombo;
String currentPluginName;
protected Text pluginDescription;
protected ExtensibleContentEditor parameterEditor;
private ProcessPluginParameterEditorListener parameterEditorListener;
private Map<String, ArrayList<ExternalInfoHolder<?>>> externalInfoName2Holder = new HashMap<String, ArrayList<ExternalInfoHolder<?>>>();
SetupTransformerInputVariablesDialog transformerDialog = null;
protected DropTarget windowTarget;
protected AbstractFormPart topPart;
protected boolean refreshing = false;
protected boolean comitting = false;
protected String filePath;
protected int currentPlugin = -1;
protected DescAnnotationComposite desAntionComposite;
protected TreeMap<String, String> pluginDescriptions = new TreeMap<String, String>();
protected TreeMap<String, java.util.List<String>> inputVariablesMap = new TreeMap<String, java.util.List<String>>();
protected TreeMap<String, java.util.List<String>> outputVariablesMap = new TreeMap<String, java.util.List<String>>();
private TMDMService service;
private TransformerStepWidget stepWidget;
private Button disabledButton;
protected WSTransformerV2 transformer;
private Composite specsComposite;
private Section section;
private Button btnAutoIndent;
java.util.List<Line> cacheList; // remember the setup transformerinputvariablesdialog's input list
private Button btnOpenXsltEditor;
protected XSLTFileEditorInput xsltEditorInput;
private Color oldBackground;
private static final String TOOLTIP_AUTOINDENT_ENABLE = Messages.TransformerMainPage_AutoIndentEnabled;
private static final String TOOLTIP_AUTOINDENT_DISABLE = Messages.TransformerMainPage_AutoIndentDisabled;
private static final Object XSLT_TYPE = "xslt"; //$NON-NLS-1$
private Composite descriptionComposite;
private Composite sequenceGroup;
public TransformerMainPage(FormEditor editor) {
super(editor, TransformerMainPage.class.getName(), Messages.TransformerMainPage_Process
+ ((XObjectEditorInput) editor.getEditorInput()).getName()
+ Util.getRevision((TreeObject) ((XObjectEditorInput) editor.getEditorInput()).getModel()));
initExternalInfoHolder();
}
public java.util.List<Line> getCacheList() {
return cacheList;
}
public void setCacheList(java.util.List<Line> cacheList) {
this.cacheList = cacheList;
}
protected void initPlugin() {
WSTransformerPluginV2SList list = service.getTransformerPluginV2SList(new WSGetTransformerPluginV2SList("EN"));//$NON-NLS-1$
java.util.List<WSTransformerPluginV2SListItem> items = list.getItem();
if (items != null) {
for (WSTransformerPluginV2SListItem item : items) {
pluginDescriptions.put(item.getJndiName(), item.getDescription());
}
// get the sorted list and feed the combo
Set<String> jndis = pluginDescriptions.keySet();
for (String jndi : jndis) {
pluginsCombo.add(jndi);
// add input variables and output variables
WSTransformerPluginV2Details details = service.getTransformerPluginV2Details(new WSGetTransformerPluginV2Details(
jndi.contains("/") ? jndi//$NON-NLS-1$
: TRANSFORMER_PLUGIN + jndi, "en"));//$NON-NLS-1$
java.util.List<String> input = new ArrayList<String>();
for (WSTransformerPluginV2VariableDescriptor v : details.getInputVariableDescriptors()) {
input.add(v.getVariableName());
}
inputVariablesMap.put(jndi, input);
java.util.List<String> output = new ArrayList<String>();
for (WSTransformerPluginV2VariableDescriptor v : details.getOutputVariableDescriptors()) {
output.add(v.getVariableName());
}
outputVariablesMap.put(jndi, output);
}
}
}
public void execute() {
try {
service = getService();
if (service == null) {
return;
}
java.util.List<WSTransformerContextPipelinePipelineItem> items = new ArrayList<WSTransformerContextPipelinePipelineItem>();
for (Line line : cacheList) {
String variableName = line.keyValues.get(0).value;
String contentType = line.keyValues.get(1).value;
String value = line.keyValues.get(2).value;
items.add(new WSTransformerContextPipelinePipelineItem(variableName, new WSTypedContent(contentType, null,
new WSByteArray(value.getBytes("utf-8"))))); //$NON-NLS-1$
}
final WSBackgroundJobPK jobPK = service.executeTransformerV2AsJob(new WSExecuteTransformerV2AsJob(
new WSTransformerContext(new WSTransformerContextPipeline(items), null, new WSTransformerV2PK(transformer
.getName()))));
IRunnableWithProgress progress = new IRunnableWithProgress() {
WSBackgroundJob job = null;
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
/******************************************
* Watch the Background Job
******************************************/
try {
boolean firstTime = true;
do {
if (firstTime) {
Thread.sleep(1500L);
firstTime = false;
} else {
Thread.sleep(5000L);
}
if (monitor.isCanceled()) {
throw new InterruptedException(Messages.TransformerMainPage_UserCancel);
}
job = service.getBackgroundJob(new WSGetBackgroundJob(jobPK.getPk()));
monitor.subTask(job.getMessage());
} while (job.getStatus().equals(BackgroundJobStatusType.RUNNING)
|| job.getStatus().equals(BackgroundJobStatusType.SCHEDULED));
if (job.getStatus().equals(BackgroundJobStatusType.STOPPED)) {
getSite().getShell().getDisplay().syncExec(new Runnable() {
public void run() {
MessageDialog.openError(TransformerMainPage.this.getEditor().getSite().getShell(),
Messages.bind(Messages.TransformerMainPage_ErrorMsg, transformer.getName()),
job.getMessage());
}
});
throw new XtentisException(Messages.bind(Messages.TransformerMainPage_JobWasStoped, job.getMessage()));
}
monitor.worked(1);
monitor.done();
/******************************************
* Build the result console
******************************************/
// Auto sorts the entries
final TreeMap pipeline = new TreeMap<String, WSExtractedContent>();
WSPipeline wsPipeline = job.getPipeline();
java.util.List<WSPipelineTypedContentEntry> entries = wsPipeline.getTypedContentEntry();
for (WSPipelineTypedContentEntry entry : entries) {
pipeline.put(entry.getOutput(), entry.getWsExtractedContent());
}
getSite().getShell().getDisplay().asyncExec(new Runnable() {
public void run() {
try {
/*
* ProcessResultsPage page = new ProcessResultsPage(editor,pipeline);
* parent.editor.addPage(page); parent.editor.setActivePage(page.getId());
*
* parent.editor.getEditorSite().getShell()
*/
// Shell shell = new Shell(SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN);
ProcessResultsDialog dialog = new ProcessResultsDialog(getSite().getShell(), Messages.bind(
Messages.TransformerMainPage_DailogTitle,
sdf.format(new Date(System.currentTimeMillis()))), pipeline);
dialog.setBlockOnOpen(false);
dialog.open();
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new RuntimeException(e);
}
}
});
} catch (Exception e1) {
log.error(e1.getMessage(), e1);
}
}
};
new ProgressMonitorDialog(TransformerMainPage.this.getSite().getWorkbenchWindow().getShell()).run(true, // fork
true, progress);
} catch (Exception e1) {
log.error(e1.getMessage(), e1);
}
}
protected void initTransformer() throws XtentisException {
service = Util.getMDMService(getXObject());
transformer = (WSTransformerV2) getXObject().getWsObject();
}
@Override
protected void createCharacteristicsContent(final FormToolkit toolkit, Composite topComposite) {
try {
initTransformer();
descriptionComposite = toolkit.createComposite(topComposite, SWT.NONE);
descriptionComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
descriptionComposite.setLayout(new GridLayout(3, false));
// edit by ymli; fix the bug:0012024 Make Process descriptions multilingual.
// description
/*
* Label descriptionLabel = toolkit.createLabel(descriptionComposite, "Description", SWT.NULL);
* descriptionLabel.setLayoutData( new GridData(SWT.FILL,SWT.CENTER,false,true,1,1) ); descriptionText =
* toolkit.createText(descriptionComposite, "",SWT.BORDER|SWT.MULTI); descriptionText.setLayoutData( new
* GridData(SWT.FILL,SWT.FILL,true,true,1,1) ); ((GridData)descriptionText.getLayoutData()).minimumHeight =
* 30; descriptionText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if
* (refreshing) return; //commit as we go TransformerMainPage.this.comitting= true;
* //((WSTransformerV2)getXObject().getWsObject()) transformer.setDescription(descriptionText.getText());
* TransformerMainPage.this.comitting= false; //markDirtyWithoutCommit(); markDirtyWithoutCommit(); } });
*/
desAntionComposite = new DescAnnotationComposite(Messages.TransformerMainPage_Description,
" ...", toolkit, descriptionComposite, //$NON-NLS-1$
this, false);
desAntionComposite.getTextWidget().addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
if (refreshing) {
return;
}
TransformerMainPage.this.comitting = true;
transformer.setDescription(desAntionComposite.getText());
TransformerMainPage.this.comitting = false;
markDirtyWithoutCommit();
}
});
// 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());
sequenceGroup = this.getNewSectionComposite(Messages.TransformerMainPage_StepsSequence);
sequenceGroup.setLayout(new GridLayout(1, false));
Composite sequenceComposite = toolkit.createComposite(sequenceGroup, SWT.NONE);
sequenceComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
sequenceComposite.setLayout(new GridLayout(6, false));
Label l3 = toolkit.createLabel(sequenceComposite, Messages.TransformerMainPage_StepDesc, SWT.NULL);
l3.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, true, 1, 1));
stepText = toolkit.createText(sequenceComposite, "", SWT.BORDER | SWT.SINGLE);//$NON-NLS-1$
stepText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1));
stepText.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
if (e.keyCode == 13) { // enter
performAdd();
int index = stepsList.getItemCount() - 1;
performSelect(index);
}
}
});
Button addStepButton = toolkit.createButton(sequenceComposite, "", SWT.PUSH);//$NON-NLS-1$
addStepButton.setLayoutData(new GridData(SWT.CENTER, SWT.FILL, false, true, 1, 1));
addStepButton.setToolTipText(Messages.TransformerMainPage_Add);
addStepButton.setImage(ImageCache.getCreatedImage(EImage.ADD_OBJ.getPath()));
addStepButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
};
public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
// commit as we go
performAdd();
};
});
stepsList = new List(sequenceComposite, SWT.V_SCROLL | SWT.BORDER);
stepsList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 5, 1));
((GridData) stepsList.getLayoutData()).heightHint = 40;
/*
* DragSource stepsSource = new DragSource(stepsList,DND.DROP_MOVE); stepsSource.setTransfer(new
* Transfer[]{TextTransfer.getInstance()}); stepsSource.addDragListener(new DCDragSourceListener());
*/
stepsList.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
public void widgetSelected(SelectionEvent e) {
performSelect(stepsList.getSelectionIndex());
}
});
wrap.Wrap(this, stepsList);
stepsList.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
if (stepsList.getSelectionIndex() >= 0) {
refreshStep(stepsList.getSelectionIndex());
section.setVisible(true);
}
}
public void focusLost(FocusEvent e) {
}
});
Composite stepUpDownComposite = toolkit.createComposite(sequenceComposite, SWT.NONE);
stepUpDownComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1));
stepUpDownComposite.setLayout(new GridLayout(1, false));
Button stepUpButton = toolkit.createButton(stepUpDownComposite, "", SWT.PUSH | SWT.CENTER); //$NON-NLS-1$
stepUpButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1));
stepUpButton.setImage(ImageCache.getCreatedImage(EImage.PREV_NAV.getPath()));
stepUpButton.setToolTipText(Messages.TransformerMainPage_MoveUpTheItem);
stepUpButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
};
public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
int index = TransformerMainPage.this.stepsList.getSelectionIndex();
if (index > 0) {
// commit as we go
TransformerMainPage.this.comitting = true;
String val = TransformerMainPage.this.stepsList.getItem(index);
TransformerMainPage.this.stepsList.remove(index);
TransformerMainPage.this.stepsList.add(val, index - 1);
TransformerMainPage.this.stepsList.select(index - 1);
WSTransformerV2 wsTransformer = transformer;// (WSTransformerV2)getXObject().getWsObject();
java.util.List<WSTransformerProcessStep> list = wsTransformer.getProcessSteps();
WSTransformerProcessStep spec = list.get(index);
list.remove(index);
list.add(index - 1, spec);
performSelect(index - 1);
TransformerMainPage.this.comitting = false;
TransformerMainPage.this.stepsList.forceFocus();
markDirtyWithoutCommit();
}
};
});
Button stepDownButton = toolkit.createButton(stepUpDownComposite, "", SWT.PUSH | SWT.CENTER);//$NON-NLS-1$
stepDownButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1));
stepDownButton.setImage(ImageCache.getCreatedImage(EImage.NEXT_NAV.getPath()));
stepDownButton.setToolTipText(Messages.TransformerMainPage_MoveDownTheItem);
stepDownButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
};
public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
int index = TransformerMainPage.this.stepsList.getSelectionIndex();
if ((index >= 0) && (index < TransformerMainPage.this.stepsList.getItemCount() - 1)) {
// commit as we go
TransformerMainPage.this.comitting = true;
String val = TransformerMainPage.this.stepsList.getItem(index);
TransformerMainPage.this.stepsList.remove(index);
TransformerMainPage.this.stepsList.add(val, index + 1);
TransformerMainPage.this.stepsList.select(index + 1);
WSTransformerV2 wsTransformer = transformer;// (WSTransformerV2)getXObject().getWsObject();
java.util.List<WSTransformerProcessStep> list = wsTransformer.getProcessSteps();
WSTransformerProcessStep spec = list.get(index);
list.remove(index);
list.add(index + 1, spec);
TransformerMainPage.this.comitting = false;
TransformerMainPage.this.stepsList.forceFocus();
markDirtyWithoutCommit();
}
};
});
Button deleteStepButton = toolkit.createButton(stepUpDownComposite, "", SWT.PUSH | SWT.CENTER);//$NON-NLS-1$
deleteStepButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true, 1, 1));
deleteStepButton.setImage(ImageCache.getCreatedImage(EImage.DELETE_OBJ.getPath()));
deleteStepButton.setToolTipText(Messages.TransformerMainPage_DelTheItem);
deleteStepButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
};
public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
int index = TransformerMainPage.this.stepsList.getSelectionIndex();
if ((index >= 0) && (index < TransformerMainPage.this.stepsList.getItemCount())) {
removeStep(index);
}
};
});
// Plugin Specifications
// Sequence
section = this.getNewSection(Messages.TransformerMainPage_StepSpecification);
section.setVisible(false);
sequenceGroup.setLayout(new GridLayout(4, false));
disabledButton = toolkit.createButton((Composite) section.getClient(), Messages.TransformerMainPage_Disabled,
SWT.CHECK);
disabledButton.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, true, 4, 1));
specsComposite = toolkit.createComposite((Composite) section.getClient(), SWT.NULL);
specsComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
specsComposite.setLayout(new GridLayout(4, false));
disabledButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
WidgetUtils.enable(specsComposite, !disabledButton.getSelection());
markDirtyWithoutCommit();
if (stepsList.getSelectionIndex() >= 0) {
transformer.getProcessSteps().get(stepsList.getSelectionIndex())
.setDisabled(disabledButton.getSelection());
}
}
});
stepLabel = toolkit.createLabel(specsComposite, "", SWT.NULL); //$NON-NLS-1$
stepLabel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1));
FontData fd = stepLabel.getFont().getFontData()[0];
fd.setStyle(SWT.BOLD);
stepLabel.setFont(new Font(Display.getDefault(), fd));
stepWidget = new TransformerStepWidget(toolkit, specsComposite);
stepWidget.create();
btnAutoIndent = new Button(specsComposite, SWT.CHECK);
btnAutoIndent.setText(Messages.TransformerMainPage_AutoIndent);
btnAutoIndent.setImage(ImageCache.getCreatedImage(EImage.INTENT.getPath()));
btnAutoIndent.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
// refreshAutoIndentTooltip();
btnAutoIndent.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
refreshAutoIndentTooltip();
}
});
btnOpenXsltEditor = new Button(specsComposite, SWT.PUSH);
btnOpenXsltEditor.setText(Messages.TransformerMainPage_open);
btnOpenXsltEditor.setToolTipText(Messages.TransformerMainPage_opentext);
btnOpenXsltEditor.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
btnOpenXsltEditor.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
openInXSLTEditor();
}
public void openInXSLTEditor() {
refreshEnableState(false);
try {
IPreferenceStore preference = new ScopedPreferenceStore(new InstanceScope(), "org.eclipse.wst.xsl.ui"); //$NON-NLS-1$
String charSet = preference.getString("outputCodeset"); //$NON-NLS-1$
String xslcontent = parameterEditor.getContent().getContent();
IFile file = FileProvider.createdTempFile(xslcontent, getXSLTFileName(), charSet);
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
xsltEditorInput = new XSLTFileEditorInput(file, new MainPageRefresher(), true);
page.openEditor(xsltEditorInput, XSLTEditor.ID);
} catch (PartInitException e) {
log.error(e.getMessage(), e);
}
}
});
Group parametersGroup = new Group(specsComposite, SWT.SHADOW_NONE);
parametersGroup.setText(Messages.TransformerMainPage_Parameters);
parametersGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1));
((GridData) parametersGroup.getLayoutData()).minimumHeight = 300;
parametersGroup.setLayout(new GridLayout(1, true));
parameterEditor = new ExtensibleContentEditor(parametersGroup, SWT.NONE, EXCONTENTEDITOR_ID);
parameterEditor.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1));
parameterEditorListener = new ProcessPluginParameterEditorListener();
refreshParameterEditor();
refreshData();
addToolBarItem();
this.oldBackground = parameterEditor.getBackground();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
private void addToolBarItem() {
XObjectEditor editor = (XObjectEditor) getEditor();
editor.getToolBar().addActions(new TestProcessAction());
}
protected void executeProcess(final FormToolkit toolkit) {
try {
// check if we have a step to perfom
java.util.List<WSTransformerProcessStep> steps = // ((WSTransformerV2)getXObject().getWsObject())
transformer.getProcessSteps();
if ((steps == null) || (steps.size() == 0)) {
MessageDialog.openError(TransformerMainPage.this.getSite().getShell(), Messages.TransformerMainPage_ErrorTitle1,
Messages.TransformerMainPage_ErrorMsg1);
return;
}
// perform save
performSave();
// Open form Dialog
if (transformerDialog == null) {
transformerDialog = new SetupTransformerInputVariablesDialog(TransformerMainPage.this.getSite().getShell(),
toolkit, getXObject(), TransformerMainPage.this);
transformerDialog.create();
transformerDialog.getShell().setText(Messages.TransformerMainPage_DialogTitle);
}
openTransformerDialog();
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
}
protected void performSave() {
if (getEditor().isDirty()) {
if (MessageDialog.openConfirm(TransformerMainPage.this.getSite().getShell(),
Messages.TransformerMainPage_ConfirmTitle, Messages.TransformerMainPage_ConfirmContent)) {
TransformerMainPage.this.getEditor().doSave(new NullProgressMonitor());
}
}
}
private String getXSLTFileName() {
String xslfileExtension = ".xsl"; //$NON-NLS-1$
String[] invalidStr = { "\\", "/", ":", "*", "?", "\"", "<", ">", "|" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
String name = getEditorInput().getName().split(" ")[0]; //$NON-NLS-1$
int minIndex = name.length();
for (String str : invalidStr) {
if (name.contains(str)) {
minIndex = (minIndex > name.indexOf(str)) ? name.indexOf(str) : minIndex;
}
}
name = name.substring(0, minIndex);
String step = stepsList.getSelection()[0];
name = name + "_XSLT_Step_" + step + xslfileExtension; //$NON-NLS-1$
return name;
}
public void refreshParameterEditor() {
setParameterEditorPageGroup(pluginsCombo.getText().trim());
parameterEditor.addExtensibleXMLEditorPageListener(parameterEditorListener);
if (externalInfoName2Holder.containsKey(pluginsCombo.getText().trim())) {
for (ExternalInfoHolder<?> eachInfoHolder : externalInfoName2Holder.get(pluginsCombo.getText().trim())) {
parameterEditor.setExternalInfoHolder(eachInfoHolder);
}
}
}
private void setParameterEditorPageGroup(String pagegroup) {
parameterEditor.setPageGroup(pagegroup);
parameterEditor.addPage(new ExtensibleContentEditorPageDescription(Messages.TransformerMainPage_Source,
Integer.MAX_VALUE, new ExtensibleTextContentEditorPageCreator(), false), pagegroup);
}
protected void performSelect(int index) {
currentPlugin = index;
if (index >= 0) {
section.setVisible(true);
refreshStep(index);
}
}
protected void performAdd() {
try {
if (stepText.getText().trim().length() == 0) {
return;
}
TransformerMainPage.this.comitting = true;
TransformerMainPage.this.stepsList.add(
TransformerMainPage.this.stepText.getText()
);
WSTransformerV2 wsTransformer = transformer;//
wsTransformer.getProcessSteps().add(
new WSTransformerProcessStep(TransformerMainPage.this.stepText.getText(), false, new ArrayList(),
new ArrayList(), "", ""));
TransformerMainPage.this.comitting = false;
int index = TransformerMainPage.this.stepsList.getItemCount() - 1;
TransformerMainPage.this.stepsList.select(index);
refreshStep(index);
TransformerMainPage.this.stepsList.forceFocus();
refreshOpenXSLTBtnState();
markDirtyWithoutCommit();
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
}
protected void refreshStep(int index) {
currentPlugin = index;
if (index < 0) {
stepWidget.inputViewer.setInput(new ArrayList<WSTransformerVariablesMapping>());
stepWidget.outputViewer.setInput(new ArrayList<WSTransformerVariablesMapping>());
return;
}
TransformerMainPage.this.refreshing = true;
stepLabel.setText(transformer.getProcessSteps().get(index).getDescription());
String jndi = transformer.getProcessSteps().get(index).getPluginJNDI().replaceAll(TRANSFORMER_PLUGIN, ""); //$NON-NLS-1$
pluginsCombo.setText(jndi);
currentPluginName = jndi;
pluginDescription.setText(pluginDescriptions.get(jndi) == null ? "" : pluginDescriptions.get(jndi)); //$NON-NLS-1$
stepText.setText(""); //$NON-NLS-1$
refreshParameterEditor();
String content = transformer.getProcessSteps().get(index).getParameters();
if (btnAutoIndent.getSelection()) {
content = XmlUtil.formatXmlSource(content);
}
parameterEditor.setContent(content);
stepWidget.setProcessStep(transformer.getProcessSteps().get(index), index);
disabledButton.setSelection(transformer.getProcessSteps().get(index).isDisabled());
WidgetUtils.enable(specsComposite, !disabledButton.getSelection());
refreshOpenXSLTBtnState();
TransformerMainPage.this.refreshing = false;
}
private void refreshEnableState(boolean enable) {
if (!descriptionComposite.isDisposed()) {
descriptionComposite.setEnabled(enable);
sequenceGroup.setEnabled(enable);
section.setEnabled(enable);
specsComposite.setEnabled(enable);
if (!enable) {
Color grayColor = Display.getCurrent().getSystemColor(SWT.COLOR_GRAY);
setBackground(descriptionComposite, grayColor);
setBackground(sequenceGroup, grayColor);
setBackground(section, grayColor);
setBackground(specsComposite, grayColor);
} else {
setBackground(descriptionComposite, oldBackground);
setBackground(sequenceGroup, oldBackground);
setBackground(section, oldBackground);
setBackground(specsComposite, oldBackground);
}
}
}
private void setBackground(Control cotrl, Color colr) {
cotrl.setBackground(colr);
if (cotrl instanceof Composite) {
Composite comp = (Composite) cotrl;
Control[] children = comp.getChildren();
for (Control ch : children) {
setBackground(ch, colr);
}
}
}
private void saveAndCloseXSLTEditor(boolean close) {
if (xsltEditorInput != null) {
IWorkbenchPage workbenchPage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
IEditorPart xsltEditor = workbenchPage.findEditor(xsltEditorInput);
if (xsltEditor != null) {
if (close) {
workbenchPage.closeEditor(xsltEditor, false);
xsltEditorInput = null;
} else {
xsltEditor.doSave(new NullProgressMonitor());
}
}
}
}
private void refreshOpenXSLTBtnState() {
String jndi = pluginsCombo.getText();
boolean isXSLT = XSLT_TYPE.equals(jndi);
btnOpenXsltEditor.setEnabled(isXSLT);
}
protected void removeStep(int index) {
WSTransformerV2 wsTransformer = transformer;
// clean up boxes at the bottom
pluginsCombo.setText(""); //$NON-NLS-1$
pluginsCombo.select(-1);
parameterEditor.setContent(""); //$NON-NLS-1$
TransformerMainPage.this.comitting = true;
TransformerMainPage.this.stepsList.remove(index);
TransformerMainPage.this.stepsList.select(index - 1);
refreshStep(stepsList.getSelectionIndex());
TransformerMainPage.this.stepsList.forceFocus();
// commit as we go
wsTransformer.getProcessSteps().remove(index);
currentPlugin = stepsList.getSelectionIndex();
TransformerMainPage.this.comitting = false;
markDirtyWithoutCommit();
}
@Override
public void update(Observable o, Object arg) {
if (arg != null && (arg == stepsList || arg == stepWidget.inputViewer || arg == stepWidget.outputViewer)) {
deleteItems(arg);
}
}
public void rename(Object arg) {
if (arg != null && (arg == stepsList || arg == stepWidget.inputViewer || arg == stepWidget.outputViewer)) {
int index = stepsList.getSelectionIndices()[0];
String stepName = stepsList.getItem(index);
InputDialog id = new InputDialog(this.getSite().getShell(), Messages.TransformerMainPage_Rename,
Messages.TransformerMainPage_InputDialogTitle, stepName, new IInputValidator() {
public String isValid(String newText) {
if ((newText == null) || newText.length() == 0) {
return Messages.TransformerMainPage_NameCannotbeEmpty;
}
return null;
}
});
if (id.open() == Window.OK) {
transformer.getProcessSteps().get(stepsList.getSelectionIndex()).setDescription(id.getValue());
refreshData();
markDirtyWithoutCommit();
}
}
}
private void deleteItems(Object view) {
if (view != null && view == stepsList) {
int[] index = stepsList.getSelectionIndices();
boolean firstPos = false;
for (int i = index.length - 1; i >= 0; i--) {
if (index[i] == 0) {
firstPos = true;
}
removeStep(index[i]);
}
if (stepsList.getItemCount() == 0) {
section.setVisible(false);
}
if (stepsList.getItemCount() >= 1 && firstPos) {
stepsList.select(0);
refreshStep(0);
}
} else if (view == stepWidget.inputViewer || view == stepWidget.outputViewer) {
TableViewer viewer = (TableViewer) view;
IStructuredSelection selections = (IStructuredSelection) viewer.getSelection();
java.util.List list = Arrays.asList(selections.toArray());
if (list.size() == 0) {
return;
}
java.util.List<WSTransformerVariablesMapping> items = (java.util.List<WSTransformerVariablesMapping>) viewer
.getInput();
items.removeAll(list);
if (view == stepWidget.inputViewer) {
stepWidget.processStep.getInputMappings().clear();
stepWidget.processStep.getInputMappings().addAll(items);
} else {
stepWidget.processStep.getOutputMappings().clear();
stepWidget.processStep.getOutputMappings().addAll(items);
}
// refresh
viewer.refresh();
// mark for update
markDirtyWithoutCommit();
}
}
@Override
protected void refreshData() {
try {
if (this.comitting) {
return;
}
this.refreshing = true;
WSTransformerV2 wsTransformer = (WSTransformerV2) (getXObject().getWsObject());
desAntionComposite.getTextWidget().setText(
wsTransformer.getDescription() == null ? "" : wsTransformer.getDescription()); //$NON-NLS-1$
stepsList.removeAll();
java.util.List<WSTransformerProcessStep> specs = wsTransformer.getProcessSteps();
if (specs != null) {
for (WSTransformerProcessStep step : specs) {
stepsList.add(step.getDescription());
}
}
stepsList.select(currentPlugin);
if (stepsList.getItemCount() > 0 && stepsList.getSelectionIndex() == -1) {
refreshStep(0);
} else {
refreshStep(stepsList.getSelectionIndex());
}
stepsList.forceFocus();
this.refreshing = false;
} catch (Exception e) {
log.error(e.getMessage(), e);
MessageDialog.openError(this.getSite().getShell(), Messages.TransformerMainPage_ErroRefreshPage,
Messages.bind(Messages.TransformerMainPage_ErroRefreshPageXX, e.getLocalizedMessage()));
}
}
@Override
protected void commit() {
// changes are committed as we go
}
@Override
protected void createActions() {
}
public void textChanged(TextEvent event) {
markDirtyWithoutCommit();
}
protected void openTransformerDialog() {
transformerDialog.open();
}
@Override
public void dispose() {
saveAndCloseXSLTEditor(true);
super.dispose();
// if (parametersTextViewer.getUndoManager() != null)
// parametersTextViewer.getUndoManager().disconnect();
externalInfoName2Holder.clear();
externalInfoName2Holder = null;
parameterEditor.dispose();
windowTarget.dispose();
}
@Override
public boolean beforeDoSave() {
String processName = getXObject().getName();
if (processName.startsWith("beforeSaving_")) {//$NON-NLS-1$
boolean has = false;
WSTransformerProcessStep processStep = stepWidget.getProcessStep();
for (WSTransformerVariablesMapping map : processStep.getOutputMappings()) {
if ("output_report".equals(map.getPipelineVariable())) {//$NON-NLS-1$
has = true;
break;
}
}
if (!has) {
MessageDialog.openWarning(getSite().getShell(), Messages.Warning,
Messages.bind(Messages.TransformerMainPage_OutputReportMissing, processName));
}
}
return super.beforeDoSave();
}
@Override
public void doSave(IProgressMonitor monitor) {
saveAndCloseXSLTEditor(false);
super.doSave(monitor);
if (stepsList.getItemCount() > 0 && currentPlugin == -1) {
refreshStep(0);
} else {
refreshStep(currentPlugin);
}
parameterEditor.clearExternalResources();
}
class TestProcessAction extends Action {
public TestProcessAction() {
setImageDescriptor(ImageCache.getImage(EImage.RUN_EXC.getPath()));
setText(Messages.TransformerMainPage_Execute);
setToolTipText(Messages.TransformerMainPage_Execute);
}
@Override
public void run() {
executeProcess(WidgetFactory.getWidgetFactory());
}
}
class TransformerStepWidget {
FormToolkit toolkit;
Composite parent;
CCombo inputVariables;
CCombo inputParams;
CCombo outputParams;
CCombo outputVariables;
private Composite mainComposite;
private Button inputLinkButton;
private Button outputLinkButton;
WSTransformerProcessStep processStep;
private TableViewer inputViewer;
private TableViewer outputViewer;
private KeyListener variableListener;
private MouseTrackAdapter mouseListener;
Set<String> availableVariables = new HashSet<String>();
public TransformerStepWidget(FormToolkit toolkit, Composite parent) {
this.toolkit = toolkit;
this.parent = parent;
}
public WSTransformerProcessStep getProcessStep() {
return processStep;
}
public void setProcessStep(WSTransformerProcessStep processStep, int index) {
this.processStep = processStep;
// reset the available variables
availableVariables.clear();
for (int i = 0; i <= index; i++) {
if (transformer.getProcessSteps().get(i).isDisabled()) {
continue;
}
for (WSTransformerVariablesMapping mapping : transformer.getProcessSteps().get(i).getInputMappings()) {
availableVariables.add(mapping.getPipelineVariable() == null ? DEFAULT_VAR : mapping.getPipelineVariable());
}
for (WSTransformerVariablesMapping mapping : transformer.getProcessSteps().get(i).getOutputMappings()) {
availableVariables.add(mapping.getPipelineVariable() == null ? DEFAULT_VAR : mapping.getPipelineVariable());
}
}
refreshViewers();
refreshCombo();
}
private TableViewer createViewer(final java.util.List<String> columns, Composite parent, final boolean isInput) {
Table table = new Table(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION);
final TableViewer viewer = new TableViewer(table);
table.setToolTipText(Messages.TransformerMainPage_TableTip);
table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1));
((GridData) viewer.getControl().getLayoutData()).heightHint = 60;
// table.setLayoutData(new GridData(GridData.FILL_BOTH));
for (String column : columns) {
TableColumn tableColumn = new TableColumn(table, SWT.CENTER);
tableColumn.setText(column);
tableColumn.setWidth(200);
tableColumn.pack();
}
table.setHeaderVisible(true);
table.setLinesVisible(true);
// set the content provider
viewer.setContentProvider(new IStructuredContentProvider() {
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public Object[] getElements(Object inputElement) {
if (inputElement == null) {
return null;
}
java.util.List<WSTransformerVariablesMapping> lines = (java.util.List<WSTransformerVariablesMapping>) inputElement;
return lines.toArray();
}
});
// set the label provider
viewer.setLabelProvider(new ITableLabelProvider() {
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void dispose() {
}
public void addListener(ILabelProviderListener listener) {
}
public void removeListener(ILabelProviderListener listener) {
}
public String getColumnText(Object element, int columnIndex) {
WSTransformerVariablesMapping line = (WSTransformerVariablesMapping) element;
switch (columnIndex) {
case 0:
return isInput ? line.getPipelineVariable() : line.getPluginVariable();
case 1:
return isInput ? line.getPluginVariable() : line.getPipelineVariable();
}
return ""; //$NON-NLS-1$
}
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
});
// Set the column properties
viewer.setColumnProperties(columns.toArray(new String[columns.size()]));
return viewer;
}
void refreshViewers() {
if (processStep != null) {
java.util.List<WSTransformerVariablesMapping> items = new ArrayList<WSTransformerVariablesMapping>();
for (WSTransformerVariablesMapping map : processStep.getInputMappings()) {
items.add(map);
}
inputViewer.setInput(items);
items = new ArrayList<WSTransformerVariablesMapping>();
for (WSTransformerVariablesMapping map : processStep.getOutputMappings()) {
items.add(map);
}
outputViewer.setInput(items);
}
}
void refreshCombo() {
inputParams.removeAll();
java.util.List<String> list = inputVariablesMap.get(pluginsCombo.getText().trim());
if (list != null) {
inputParams.setItems(list.toArray(new String[list.size()]));
}
outputParams.removeAll();
list = outputVariablesMap.get(pluginsCombo.getText().trim());
if (list != null) {
outputParams.setItems(list.toArray(new String[list.size()]));
}
inputVariables.setItems(availableVariables.toArray(new String[availableVariables.size()]));
outputVariables.setItems(availableVariables.toArray(new String[availableVariables.size()]));
}
private boolean isExist(java.util.List<WSTransformerVariablesMapping> list, String parameterName) {
for (WSTransformerVariablesMapping map : list) {
if (map.getPluginVariable().equals(parameterName)) {
MessageDialog.openInformation(null,
"", Messages.bind(Messages.TransformerMainPage_InfoContent, parameterName)); //$NON-NLS-1$
return true;
}
}
return false;
}
private void createInput() {
Composite inputComposite = toolkit.createComposite(mainComposite, SWT.NONE);
inputComposite.setLayoutData(new GridData(SWT.FILL, SWT.RIGHT, true, true, 1, 1));
inputComposite.setLayout(new GridLayout(3, false));
LabelCombo inputV = new LabelCombo(toolkit, inputComposite, Messages.TransformerMainPage_InputVariables, SWT.BORDER,
1);
inputVariables = inputV.getCombo();
inputVariables.addKeyListener(variableListener);
inputVariables.getTabList()[0].addMouseTrackListener(mouseListener);
inputLinkButton = toolkit.createButton(inputComposite, "", SWT.PUSH | SWT.CENTER); //$NON-NLS-1$
inputLinkButton.setImage(ImageCache.getCreatedImage(EImage.SYNCED.getPath()));
inputLinkButton.setToolTipText(Messages.TransformerMainPage_LinkTip);
inputLinkButton.setToolTipText(Messages.TransformerMainPage_AddLinkTip);
inputLinkButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
inputLinkButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (inputParams.getText().length() == 0) {
return;
}
java.util.List<WSTransformerVariablesMapping> items = (java.util.List<WSTransformerVariablesMapping>) inputViewer
.getInput();
if (isExist(items, inputParams.getText())) {
return;
}
WSTransformerVariablesMapping line = new WSTransformerVariablesMapping();
if (inputVariables.getText().trim().length() > 0) {
line.setPipelineVariable(inputVariables.getText());
} else {
line.setPipelineVariable(DEFAULT_VAR);
}
if (inputParams.getText().trim().length() > 0) {
line.setPluginVariable(inputParams.getText());
}
items.add(line);
processStep.getInputMappings().clear();
processStep.getInputMappings().addAll(items);
inputViewer.refresh();
if (line.getPipelineVariable() != null) {
availableVariables.add(line.getPipelineVariable());
}
outputVariables.setItems(availableVariables.toArray(new String[availableVariables.size()]));
markDirtyWithoutCommit();
}
});
LabelCombo inputP = new LabelCombo(toolkit, inputComposite, Messages.TransformerMainPage_InputParameters, SWT.BORDER
| SWT.READ_ONLY, 1);
inputParams = inputP.getCombo();
// create table
java.util.List<String> columns = new ArrayList<String>();
columns.add(Messages.TransformerMainPage_InputVariables);
columns.add(Messages.TransformerMainPage_InputParameters);
inputViewer = createViewer(columns, inputComposite, true);
wrap.Wrap(TransformerMainPage.this, inputViewer);
}
private void createOutput() {
Composite outputComposite = toolkit.createComposite(mainComposite, SWT.NONE);
outputComposite.setLayoutData(new GridData(SWT.FILL, SWT.RIGHT, true, true, 1, 1));
outputComposite.setLayout(new GridLayout(3, false));
LabelCombo outputP = new LabelCombo(toolkit, outputComposite, Messages.TransformerMainPage_OutputParameters,
SWT.BORDER | SWT.READ_ONLY, 1);
outputParams = outputP.getCombo();
outputLinkButton = toolkit.createButton(outputComposite, "", SWT.PUSH | SWT.CENTER);//$NON-NLS-1$
outputLinkButton.setImage(ImageCache.getCreatedImage(EImage.SYNCED.getPath()));
outputLinkButton.setToolTipText(Messages.TransformerMainPage_LinkTip);
outputLinkButton.setToolTipText(Messages.TransformerMainPage_AddLinkTip1);
outputLinkButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
outputLinkButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (outputParams.getText().length() == 0) {
return;
}
java.util.List<WSTransformerVariablesMapping> items = (java.util.List<WSTransformerVariablesMapping>) outputViewer
.getInput();
if (isExist(items, outputParams.getText())) {
return;
}
WSTransformerVariablesMapping line = new WSTransformerVariablesMapping();
if (outputVariables.getText().length() > 0) {
line.setPipelineVariable(outputVariables.getText());
} else {
line.setPipelineVariable(DEFAULT_VAR);
}
if (outputParams.getText().trim().length() > 0) {
line.setPluginVariable(outputParams.getText());
}
items.add(line);
processStep.getOutputMappings().clear();
processStep.getOutputMappings().addAll(items);
outputViewer.refresh();
if (line.getPipelineVariable() != null) {
availableVariables.add(line.getPipelineVariable());
}
outputVariables.setItems(availableVariables.toArray(new String[availableVariables.size()]));
markDirtyWithoutCommit();
}
});
LabelCombo outputV = new LabelCombo(toolkit, outputComposite, Messages.TransformerMainPage_OutputVariables,
SWT.BORDER, 1);
outputVariables = outputV.getCombo();
outputVariables.addKeyListener(variableListener);
outputVariables.addMouseTrackListener(mouseListener);
outputVariables.getTabList()[0].addMouseTrackListener(mouseListener);
// create table
java.util.List<String> columns = new ArrayList<String>();
columns.add(Messages.TransformerMainPage_OutputParameters);
columns.add(Messages.TransformerMainPage_OutputVariables);
outputViewer = createViewer(columns, outputComposite, false);
wrap.Wrap(TransformerMainPage.this, outputViewer);
}
private void createPlugin() throws Exception {
Composite specsComposite = toolkit.createComposite(mainComposite, SWT.NONE);
specsComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
specsComposite.setLayout(new GridLayout(4, false));
pluginDescription = toolkit.createText(specsComposite, "", SWT.MULTI | SWT.WRAP); //$NON-NLS-1$
pluginDescription.setEditable(false);
pluginDescription.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 4, 2));
((GridData) pluginDescription.getLayoutData()).heightHint = 35;
Label jndiLabel = toolkit.createLabel(specsComposite, Messages.TransformerMainPage_PluginName, SWT.NULL);
jndiLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
pluginsCombo = new CCombo(specsComposite, SWT.BORDER | SWT.READ_ONLY);
pluginsCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
refreshCombo();
if (stepsList.getSelectionIndex() >= 0
&& stepsList.getSelectionIndex() < transformer.getProcessSteps().size()) {
transformer.getProcessSteps().get(stepsList.getSelectionIndex())
.setPluginJNDI(TRANSFORMER_PLUGIN + pluginsCombo.getText());
}
inputViewer.setInput(new ArrayList<WSTransformerVariablesMapping>());
outputViewer.setInput(new ArrayList<WSTransformerVariablesMapping>());
String jndi = pluginsCombo.getText();
pluginDescription.setText(pluginDescriptions.get(jndi) == null ? "" : pluginDescriptions.get(jndi)); //$NON-NLS-1$
refreshParameterEditor();
if (EInputTemplate.getXtentisObjexts().get(jndi) != null) {
String document = EInputTemplate.getXtentisObjexts().get(jndi).getContent();
parameterEditor.setContent(document);
} else {
parameterEditor.setContent(""); //$NON-NLS-1$
}
refreshOpenXSLTBtnState();
}
});
// feed the combo once
initPlugin();
Button detailsButton = toolkit.createButton(specsComposite, "", SWT.PUSH | SWT.CENTER); //$NON-NLS-1$
detailsButton.setImage(ImageCache.getCreatedImage(EImage.HELP_CONTENTS.getPath()));
detailsButton.setToolTipText(Messages.TransformerMainPage_Help);
detailsButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
detailsButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent e) {
};
public void widgetSelected(org.eclipse.swt.events.SelectionEvent e) {
try {
String jndi;
jndi = pluginsCombo.getText();
if (jndi.length() == 0) {
return;
}
WSTransformerPluginV2Details details = getWsTransformerPluginV2Details(jndi);
final PluginDetailsDialog dialog = new PluginDetailsDialog(getSite().getShell(),
details.getDescription(), details.getDocumentation(), details.getParametersSchema(),
Messages.TransformerMainPage_Documentation);
dialog.addListener(new Listener() {
public void handleEvent(Event event) {
dialog.close();
}
});
dialog.setBlockOnOpen(true);
dialog.open();
} catch (Exception ex) {
String jndi;
jndi = pluginsCombo.getText();
if (!Util.handleConnectionException(getSite().getShell(), ex, null)) {
MessageDialog.openError(getSite().getShell(), Messages.TransformerMainPage_ErrorDialogTitle + jndi,
Messages.bind(Messages.TransformerMainPage_ErrorMsg2, jndi));
}
return;
}
}
});
}
public void create() throws Exception {
mainComposite = toolkit.createComposite(parent, SWT.BORDER);
mainComposite.setLayoutData(new GridData(SWT.FILL, SWT.RIGHT, true, true, 4, 1));
mainComposite.setLayout(new GridLayout(3, false));
variableListener = new KeyListener() {
public void keyPressed(KeyEvent e) {
if (e.keyCode == '/' && e.stateMask == SWT.ALT) {
VariableDefinitionDialog dlg = new VariableDefinitionDialog(mainComposite.getShell(),
TransformerMainPage.this.getPartName(), e.widget == inputVariables ? true : false,
pluginsCombo.getText());
dlg.setBlockOnOpen(true);
dlg.open();
if (dlg.getReturnCode() == Window.OK) {
Widget wdg = e.widget;
if (wdg instanceof CCombo) {
CCombo combo = (CCombo) wdg;
if (!Arrays.asList(combo.getItems()).contains(dlg.outPutVariable())) {
combo.add(dlg.outPutVariable());
TransformerMainPage.this.markDirtyWithoutCommit();
}
for (int idx = 0; idx < combo.getItems().length; idx++) {
if (dlg.outPutVariable().equals(combo.getItem(idx))) {
combo.select(idx);
break;
}
}
}
dlg.close();
}
}
}
public void keyReleased(KeyEvent e) {
}
};
mouseListener = new MouseTrackAdapter() {
@Override
public void mouseEnter(MouseEvent e) {
((Control) e.getSource()).setToolTipText(Messages.TransformerMainPage_ToolTip);
}
};
createInput();
createPlugin();
createOutput();
}
}
protected void initExternalInfoHolder() {
try {
ExternalInfoHolder<?> allJobInfosHolder = ExternalInfoHolder.getAllJobInfosHolder(Util.getMDMService(getXObject()));
ExternalInfoHolder<?> mdmServerInfoHolder = ExternalInfoHolder.getAllMDMServerInfoHolder(Util
.getMDMService(getXObject()));
ExternalInfoHolder<?> allVarCandidatesHolder = ExternalInfoHolder
.getProcessAllCallJobVarsCandidatesHolder((WSTransformerV2) getXObject().getWsObject());
ExternalInfoHolder<?> workflowInfoHolder = ExternalInfoHolder.getAllWorkflowInfoHolder(Util
.getMDMService(getXObject()));
ExternalInfoHolder<?> allDataModelHolderProxy = ExternalInfoHolder.getAllDataModelInfoHolderProxy(getXObject());
initExternalInfoHolderForEachType("callJob", new ExternalInfoHolder<?>[] { allJobInfosHolder, mdmServerInfoHolder, //$NON-NLS-1$
allVarCandidatesHolder });
initExternalInfoHolderForEachType("workflowtrigger", new ExternalInfoHolder<?>[] { workflowInfoHolder, //$NON-NLS-1$
allDataModelHolderProxy });
} catch (XtentisException e) {
log.error(e.getMessage(), e);
}
}
protected WSTransformerPluginV2Details getWsTransformerPluginV2Details(String jndi) {
WSTransformerPluginV2Details details = service.getTransformerPluginV2Details(new WSGetTransformerPluginV2Details(jndi
.contains("/") ? jndi //$NON-NLS-1$
: TRANSFORMER_PLUGIN + jndi, "en")); //$NON-NLS-1$
return details;
}
protected void initExternalInfoHolderForEachType(String operaType, ExternalInfoHolder<?>[] infoHolders) {
ArrayList<ExternalInfoHolder<?>> externalInfoHolders = new ArrayList<ExternalInfoHolder<?>>();
externalInfoHolders.addAll(Arrays.asList(infoHolders));
externalInfoName2Holder.put(operaType, externalInfoHolders);
}
private void commitParameters(String parameter) {
if (refreshing) {
return;
}
if (TransformerMainPage.this.stepsList.getSelectionIndex() == -1) {
return;
}
// commit as we go
TransformerMainPage.this.comitting = true;
// ((WSTransformerV2)getXObject().getWsObject())
transformer.getProcessSteps().get(stepsList.getSelectionIndex()).setParameters(parameter);
TransformerMainPage.this.comitting = false;
markDirtyWithoutCommit();
}
private void refreshAutoIndentTooltip() {
if (btnAutoIndent == null) {
return;
}
btnAutoIndent.setToolTipText(btnAutoIndent.getSelection() ? TOOLTIP_AUTOINDENT_ENABLE : TOOLTIP_AUTOINDENT_DISABLE);
}
class ProcessPluginParameterEditorListener implements ExtensibleContentEditorPageListener {
public void onXMLDocumentChanged(ExtensibleContentEditorPage source, ExtensibleEditorContent newCotent) {
commitParameters(newCotent.getContent());
}
}
public class MainPageRefresher implements PageRefresher {
public void refreshPageContent(String xsltContent) {
if (xsltContent != null) {
transformer.getProcessSteps().get(currentPlugin).setParameters(xsltContent);
if (!parameterEditor.isDisposed()) {
parameterEditor.setContent(xsltContent);
}
}
}
public void refreshPageUIEnabled() {
refreshEnableState(true);
xsltEditorInput = null;
}
public void makeDirty() {
TransformerMainPage.this.markDirty();
}
}
}