// ============================================================================ // // 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 org.talend.mdm.repository.ui.actions.job; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.ui.IEditorPart; import org.talend.commons.ui.runtime.image.ECoreImage; import org.talend.commons.ui.runtime.image.ImageProvider; import org.talend.core.GlobalServiceRegister; import org.talend.core.model.properties.ItemState; import org.talend.core.model.properties.PropertiesFactory; import org.talend.core.model.properties.Property; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.mdm.repository.core.AbstractRepositoryAction; import org.talend.mdm.repository.core.IServerObjectRepositoryType; import org.talend.mdm.repository.core.impl.transformerV2.ITransformerV2NodeConsDef; import org.talend.mdm.repository.i18n.Messages; import org.talend.mdm.repository.model.mdmproperties.MdmpropertiesFactory; import org.talend.mdm.repository.model.mdmproperties.WSTransformerV2Item; import org.talend.mdm.repository.model.mdmserverobject.MdmserverobjectFactory; import org.talend.mdm.repository.model.mdmserverobject.WSTransformerProcessStepE; import org.talend.mdm.repository.model.mdmserverobject.WSTransformerV2E; import org.talend.mdm.repository.model.mdmserverobject.WSTransformerVariablesMappingE; import org.talend.mdm.repository.ui.dialogs.job.JobOptionsDialog; import org.talend.mdm.repository.ui.dialogs.job.JobOptionsDialog.Execution; import org.talend.mdm.repository.ui.dialogs.job.JobOptionsDialog.Parameter; import org.talend.mdm.repository.utils.RepositoryResourceUtil; import org.talend.mdm.repository.utils.UIUtil; import com.amalto.workbench.service.IValidateService; import com.amalto.workbench.webservices.WSTransformerVariablesMapping; /** * */ public class GenerateJobTransformerAction extends AbstractRepositoryAction { /** * */ private static final String PREFIX = "CallJob_"; //$NON-NLS-1$ protected Object selectObj; static Logger log = Logger.getLogger(GenerateJobTransformerAction.class); public GenerateJobTransformerAction() { super(Messages.GenerateJobXX_GenTJobProcess); setImageDescriptor(ImageProvider.getImageDesc(ECoreImage.PROCESS_ICON)); } /* * (non-Javadoc) * * @see org.talend.mdm.repository.core.AbstractRepositoryAction#getGroupName() */ @Override public String getGroupName() { return GROUP_EDIT; } @Override protected void doRun() { selectObj = getSelectedObject().get(0); JobOptionsDialog dialog = new JobOptionsDialog(getShell(), Messages.JobProcesssOptionsDialogTitle_title, Execution.EMBEDDED); dialog.setBlockOnOpen(true); int ret = dialog.open(); if (ret == Dialog.CANCEL) { return; } String jobName = ""; //$NON-NLS-1$ String jobVersion = ""; //$NON-NLS-1$ String path = "/other"; //$NON-NLS-1$ if (selectObj instanceof IRepositoryViewObject) { Property property = ((IRepositoryViewObject) selectObj).getProperty(); if (property != null) { jobName = property.getLabel(); jobVersion = property.getVersion(); } } // check exist IValidateService validateService = (IValidateService) GlobalServiceRegister.getDefault().getService( IValidateService.class); if (validateService != null) { boolean result = validateService.validateAndAlertObjectExistence(IServerObjectRepositoryType.TYPE_TRANSFORMERV2, getNewProcessName(jobName), null); if (!result) { return; } } WSTransformerV2E transformer = createTransformer(jobName, jobVersion, dialog); // if the new objectect is opened ,than close it before regenerating IRepositoryViewObject toDelete = RepositoryResourceUtil.findViewObjectByName( IServerObjectRepositoryType.TYPE_TRANSFORMERV2, PREFIX + jobName); if (toDelete != null) { IEditorPart openedEditor = UIUtil.findOpenedEditor(toDelete); if (openedEditor != null) { UIUtil.closeEditor(openedEditor, false); } // delete directly RepositoryResourceUtil.removeViewObjectPhysically(toDelete, jobVersion); } AttachToProcessView(jobName, transformer); } /** * @param jobVersion */ private WSTransformerV2E createTransformer(String jobName, String jobVersion, JobOptionsDialog dialog) { String server = "http://localhost:8180"; //$NON-NLS-1$ Execution execution = dialog.getExecution(); Parameter executionParameter = dialog.getParameter(); final String TRANSFORMER_PLUGIN = "amalto/local/transformer/plugin/xslt";//$NON-NLS-1$ WSTransformerV2E transformer = MdmserverobjectFactory.eINSTANCE.createWSTransformerV2E(); String url = "";//$NON-NLS-1$ switch (execution) { case EMBEDDED: url = "ltj://" + jobName + "/" + jobVersion;//$NON-NLS-1$//$NON-NLS-2$ break; case WEB_SERVICE: url = Messages.bind(Messages.GenerateJobXX_UrlString, server, jobName, jobVersion, jobName); break; } // Generate the job call List<WSTransformerProcessStepE> steps = new ArrayList<WSTransformerProcessStepE>(); WSTransformerVariablesMapping[] input; WSTransformerVariablesMapping[] output; try { List<WSTransformerVariablesMappingE> inItems; List<WSTransformerVariablesMappingE> outItems; switch (executionParameter) { case CONTEXT_VARIABLE: String itemstr = "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns:mdm=\"java:com.amalto.core.plugin.base.xslt.MdmExtension\" version=\"1.0\"> <xsl:output method=\"xml\" indent=\"yes\" omit-xml-declaration=\"yes\" /> <xsl:template match=\"/\" priority=\"1\">\n" //$NON-NLS-1$ + "<exchange> <report>\n <xsl:copy-of select=\"Update\"/> </report> <item><xsl:copy-of select='mdm:getItemProjection(Update/RevisionID,Update/DataCluster,Update/Concept,Update/Key)'/></item></exchange> "//$NON-NLS-1$ + "</xsl:template> </xsl:stylesheet>\n";//$NON-NLS-1$ WSTransformerProcessStepE steps1 = MdmserverobjectFactory.eINSTANCE.createWSTransformerProcessStepE(); inItems = new ArrayList<WSTransformerVariablesMappingE>(); WSTransformerVariablesMappingE inputLine = MdmserverobjectFactory.eINSTANCE .createWSTransformerVariablesMappingE(); inputLine.setPipelineVariable("_DEFAULT_");//$NON-NLS-1$ inputLine.setPluginVariable("xml");//$NON-NLS-1$ inItems.add(inputLine); outItems = new ArrayList<WSTransformerVariablesMappingE>(); WSTransformerVariablesMappingE outputLine = MdmserverobjectFactory.eINSTANCE .createWSTransformerVariablesMappingE(); outputLine.setPipelineVariable("item_xml");//$NON-NLS-1$ outputLine.setPluginVariable("text");//$NON-NLS-1$ outItems.add(outputLine); steps1.setPluginJNDI(TRANSFORMER_PLUGIN); steps1.setDescription("Stylesheet"); //$NON-NLS-1$ steps1.setParameters(itemstr); steps1.getInputMappings().addAll(inItems); steps1.getOutputMappings().addAll(outItems); steps1.setDisabled(false); // Generate the XSLT step to retrieve the item from an update report // step 2 WSTransformerProcessStepE steps2 = MdmserverobjectFactory.eINSTANCE.createWSTransformerProcessStepE(); List<WSTransformerVariablesMappingE> inItems2 = new ArrayList<WSTransformerVariablesMappingE>(); WSTransformerVariablesMappingE inputLine2 = MdmserverobjectFactory.eINSTANCE .createWSTransformerVariablesMappingE(); inputLine2.setPipelineVariable("item_xml");//$NON-NLS-1$ inputLine2.setPluginVariable("law_text");//$NON-NLS-1$ inItems2.add(inputLine2); List<WSTransformerVariablesMappingE> outItems2 = new ArrayList<WSTransformerVariablesMappingE>(); WSTransformerVariablesMappingE outputLine2 = MdmserverobjectFactory.eINSTANCE .createWSTransformerVariablesMappingE(); outputLine2.setPipelineVariable("decode_xml");//$NON-NLS-1$ outputLine2.setPluginVariable("codec_text");//$NON-NLS-1$ outItems2.add(outputLine2); steps2.setPluginJNDI("amalto/local/transformer/plugin/codec");//$NON-NLS-1$ steps2.setDescription("Escape the item XML"); //$NON-NLS-1$ String parameter = "<parameters>\n" + "<method>DECODE</method>\n" + "<algorithm>XMLESCAPE</algorithm>\n"//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + "</parameters>\n";//$NON-NLS-1$ steps2.setParameters(parameter); steps2.getInputMappings().addAll(inItems2); steps2.getOutputMappings().addAll(outItems2); steps2.setDisabled(false); // step 3 WSTransformerProcessStepE steps3 = MdmserverobjectFactory.eINSTANCE.createWSTransformerProcessStepE(); List<WSTransformerVariablesMappingE> inItems3 = new ArrayList<WSTransformerVariablesMappingE>(); WSTransformerVariablesMappingE inputLine3 = MdmserverobjectFactory.eINSTANCE .createWSTransformerVariablesMappingE(); inputLine3.setPipelineVariable("decode_xml");//$NON-NLS-1$ inputLine3.setPluginVariable("text");//$NON-NLS-1$ inItems3.add(inputLine3); List<WSTransformerVariablesMappingE> outItems3 = new ArrayList<WSTransformerVariablesMappingE>(); WSTransformerVariablesMappingE outputLine3 = MdmserverobjectFactory.eINSTANCE .createWSTransformerVariablesMappingE(); outputLine3.setPipelineVariable("output");//$NON-NLS-1$ outputLine3.setPluginVariable("result");//$NON-NLS-1$ outItems3.add(outputLine3); steps3.setPluginJNDI("amalto/local/transformer/plugin/callJob");//$NON-NLS-1$ steps3.setDescription("Invoke the job"); //$NON-NLS-1$ input = new WSTransformerVariablesMapping[1]; input[0] = new WSTransformerVariablesMapping(null, "_DEFAULT_", "xml");//$NON-NLS-1$ //$NON-NLS-2$ output = new WSTransformerVariablesMapping[1]; output[0] = new WSTransformerVariablesMapping(null, "item_xml", "text");//$NON-NLS-1$ //$NON-NLS-2$ steps3.setParameters(parameter); steps3.getInputMappings().addAll(inItems3); steps3.getOutputMappings().addAll(outItems3); steps3.setDisabled(false); parameter = "<configuration>\n" + "<url>" + url + "</url>\n" + "<contextParam>\n"//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + "<name>xmlInput</name>\n" + "<value>{decode_xml}</value>\n" + "</contextParam>\n"//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + "</configuration>\n";//$NON-NLS-1$ steps3.setParameters(parameter); steps.add(steps1); steps.add(steps2); steps.add(steps3); break; case INTEGRATED: WSTransformerProcessStepE step1 = MdmserverobjectFactory.eINSTANCE.createWSTransformerProcessStepE(); inItems = new ArrayList<WSTransformerVariablesMappingE>(); inputLine = MdmserverobjectFactory.eINSTANCE.createWSTransformerVariablesMappingE(); inputLine.setPipelineVariable("_DEFAULT_");//$NON-NLS-1$ inputLine.setPluginVariable("text");//$NON-NLS-1$ inItems.add(inputLine); outItems = new ArrayList<WSTransformerVariablesMappingE>(); outputLine = MdmserverobjectFactory.eINSTANCE.createWSTransformerVariablesMappingE(); outputLine.setPipelineVariable("item_xml");//$NON-NLS-1$ outputLine.setPluginVariable("result");//$NON-NLS-1$ outItems.add(outputLine); step1.setPluginJNDI("amalto/local/transformer/plugin/callJob"); //$NON-NLS-1$ step1.setDescription("Invoke the job"); //$NON-NLS-1$ step1.setParameters("<configuration>\n" + "<url>" + url + "</url>\n" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + "</configuration>\n"); //$NON-NLS-1$ step1.getInputMappings().addAll(inItems); step1.getOutputMappings().addAll(outItems); step1.setDisabled(false); steps.add(step1); break; default: log.warn(Messages.bind(Messages.GenerateJobXX_UNSupportedType, executionParameter)); steps = Collections.emptyList(); } } catch (Exception e) { log.error(e.getMessage(), e); } try { // Generate the job call transformer.setName(getNewProcessName(jobName)); transformer.setDescription(Messages.bind(Messages.GenerateJobXX_ProcessCallJob, jobName)); transformer.getProcessSteps().addAll(steps); } catch (Exception e) { log.error(e.getMessage(), e); } return transformer; } private String getNewProcessName(String name) { return PREFIX + name; } /** * DOC jsxie Comment method "AttachToProcessView". * * @param filename * @param transformer */ private void AttachToProcessView(String filename, WSTransformerV2E transformer) { WSTransformerV2Item item = MdmpropertiesFactory.eINSTANCE.createWSTransformerV2Item(); ItemState itemState = PropertiesFactory.eINSTANCE.createItemState(); item.setState(itemState); item.setWsTransformerV2(transformer); item.getState().setPath(IPath.SEPARATOR + ITransformerV2NodeConsDef.PATH_OTHER); RepositoryResourceUtil.createItem(item, PREFIX + filename); getCommonViewer().refresh(); } @Override public boolean isVisible(IRepositoryViewObject viewObj) { if (getSelectedObject().size() > 1) { return false; } return super.isVisible(viewObj); } }