// ============================================================================ // // 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.process; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.PlatformUI; import org.talend.commons.exception.PersistenceException; import org.talend.core.GlobalServiceRegister; import org.talend.core.model.properties.Item; import org.talend.core.model.properties.ItemState; import org.talend.core.model.properties.ProcessItem; import org.talend.core.model.properties.PropertiesFactory; import org.talend.core.model.repository.ERepositoryObjectType; import org.talend.core.model.repository.IRepositoryViewObject; import org.talend.core.runtime.CoreRuntimePlugin; import org.talend.designer.core.ui.MultiPageTalendEditor; import org.talend.designer.core.ui.editor.ProcessEditorInput; import org.talend.mdm.repository.core.impl.transformerV2.ITransformerV2NodeConsDef; import org.talend.mdm.repository.i18n.Messages; import org.talend.mdm.repository.model.mdmproperties.ContainerItem; 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.actions.AbstractSimpleAddAction; import org.talend.mdm.repository.ui.wizards.process.IMDMJobTemplate; import org.talend.mdm.repository.ui.wizards.process.NewProcessWizard; import org.talend.mdm.repository.utils.RepositoryResourceUtil; import org.talend.mdm.repository.utils.RepositoryTransformUtil; import org.talend.repository.model.IProxyRepositoryFactory; import com.amalto.workbench.service.IValidateService; /** * DOC hbhong class global comment. Detailled comment <br/> * */ public class NewProcessAction extends AbstractSimpleAddAction implements ITransformerV2NodeConsDef { private static Logger log = Logger.getLogger(NewProcessAction.class); /** * DOC AddProcess constructor comment. * * @param text */ public NewProcessAction() { super(); } @Override protected String getDialogTitle() { return Messages.NewProcessAction_newProcess; } @Override protected void doRun() { parentItem = null; selectObj = getSelectedObject().get(0); int type = getType(); if (selectObj instanceof IRepositoryViewObject) { Item pItem = ((IRepositoryViewObject) selectObj).getProperty().getItem(); if (pItem instanceof ContainerItem) { parentItem = (ContainerItem) pItem; } } IWorkbenchPartSite site = commonViewer.getCommonNavigator().getSite(); // wizard NewProcessWizard newProcessWizard = new NewProcessWizard(site, type); WizardDialog wizardDialog = new WizardDialog(getShell(), newProcessWizard); wizardDialog.setPageSize(500, 260); if (wizardDialog.open() == IDialogConstants.OK_ID) { WSTransformerV2E newProcess = newProcessWizard.getNewProcess(); final Item item = createServerObject(newProcess); commonViewer.refresh(selectObj); commonViewer.expandToLevel(selectObj, 1); openEditor(item); if (newProcessWizard.isCreateJob()) { generateJobTemplate(newProcessWizard.getType(), newProcessWizard.getProcessName(), newProcessWizard.getReturnMessages(), newProcessWizard.isEnableRedirect(), newProcessWizard.getRedirectUrl(), newProcessWizard.getJobTemplates()); refreshJobEditorTitle(item); } } } private void refreshJobEditorTitle(Item item) { String label = item.getProperty().getLabel(); // job name can not contains '#' and '$', see job's create procedure label = label.replaceAll("#|\\$", ""); //$NON-NLS-1$ //$NON-NLS-2$ IWorkbenchPage activePage = getActivePage(); IEditorReference[] editorReferences = activePage.getEditorReferences(); if (editorReferences != null) { for (IEditorReference editorPart : editorReferences) { IEditorInput editorInput = editorPart.getEditor(false).getEditorInput(); if (editorInput instanceof ProcessEditorInput) { ProcessEditorInput processInput = (ProcessEditorInput) editorInput; ProcessItem jobItem = (ProcessItem) processInput.getItem(); MultiPageTalendEditor jobEditor = (MultiPageTalendEditor) editorPart.getEditor(false); String jobLabel = jobItem.getProperty().getLabel(); if (jobLabel.equals(label)) { jobEditor.refreshName(); break; } } } } } private IWorkbenchPage getActivePage() { return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); } private int getType() { int type = 0; IRepositoryViewObject repositoryViewObject = (IRepositoryViewObject) selectObj; ContainerItem containerItem = (ContainerItem) repositoryViewObject.getProperty().getItem(); String path = containerItem.getState().getPath(); if (path.isEmpty()) { type = TYPE_PROCESS; } else if (path.startsWith(IPath.SEPARATOR + ITransformerV2NodeConsDef.PATH_BEFORESAVE)) { type = TYPE_BEFORESAVE; } else if (path.startsWith(IPath.SEPARATOR + ITransformerV2NodeConsDef.PATH_BEFOREDEL)) { type = TYPE_BEFOREDEL; } else if (path.startsWith(IPath.SEPARATOR + ITransformerV2NodeConsDef.PATH_ENTITYACTION)) { type = TYPE_ENTITYACTION; } else if (path.startsWith(IPath.SEPARATOR + ITransformerV2NodeConsDef.PATH_WELCOMEACTION)) { type = TYPE_WELCOMEACTION; } else if (path.startsWith(IPath.SEPARATOR + ITransformerV2NodeConsDef.PATH_SMARTVIEW)) { type = TYPE_SMARTVIEW; } else if (path.startsWith(IPath.SEPARATOR + ITransformerV2NodeConsDef.PATH_OTHER)) { type = TYPE_OTHER; } return type; } private WSTransformerV2E newProcess(String key) { WSTransformerV2E transformer = MdmserverobjectFactory.eINSTANCE.createWSTransformerV2E(); transformer.setName(key); transformer.setDescription(""); //$NON-NLS-1$ if (key.toString().startsWith("Smart_view_")) {//$NON-NLS-1$ final String parameters = "<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>\n"//$NON-NLS-1$ + " <xsl:output method='html' indent='yes' omit-xml-declaration='yes'/>\n"//$NON-NLS-1$ + " <xsl:template match='/'>\n" + " <html>\n"//$NON-NLS-1$//$NON-NLS-2$ + " <head><title>Smart View</title></head>\n" + " <body>\n"//$NON-NLS-1$//$NON-NLS-2$ + " <h1>This is the default Smart View for: <xsl:value-of select='./text()'/></h1>\n"//$NON-NLS-1$ + " <xsl:copy-of select='.'/>\n" + " <!-- Customize the stylesheet -->\n"//$NON-NLS-1$//$NON-NLS-2$ + " </body>\n" + " </html>\n" + " </xsl:template>" + "</xsl:stylesheet>";//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$ final String TRANSFORMER_PLUGIN = "amalto/local/transformer/plugin/xslt";//$NON-NLS-1$ List<WSTransformerVariablesMappingE> inItems = new ArrayList<WSTransformerVariablesMappingE>(); WSTransformerVariablesMappingE inputLine = MdmserverobjectFactory.eINSTANCE.createWSTransformerVariablesMappingE(); inputLine.setPipelineVariable("_DEFAULT_");//$NON-NLS-1$ inputLine.setPluginVariable("xml");//$NON-NLS-1$ inItems.add(inputLine); List<WSTransformerVariablesMappingE> outItems = new ArrayList<WSTransformerVariablesMappingE>(); WSTransformerVariablesMappingE outputLine = MdmserverobjectFactory.eINSTANCE.createWSTransformerVariablesMappingE(); outputLine.setPipelineVariable("html");//$NON-NLS-1$ outputLine.setPluginVariable("text");//$NON-NLS-1$ outItems.add(outputLine); ArrayList<WSTransformerProcessStepE> list = new ArrayList<WSTransformerProcessStepE>(); WSTransformerProcessStepE step = MdmserverobjectFactory.eINSTANCE.createWSTransformerProcessStepE(); step.setPluginJNDI(TRANSFORMER_PLUGIN); step.setDescription("Stylesheet"); //$NON-NLS-1$ step.setParameters(parameters); step.getInputMappings().addAll(inItems); step.getOutputMappings().addAll(outItems); step.setDisabled(false); list.add(step); transformer.getProcessSteps().addAll(list); } return transformer; } @Override protected Item createServerObject(String key) { WSTransformerV2Item item = MdmpropertiesFactory.eINSTANCE.createWSTransformerV2Item(); ItemState itemState = PropertiesFactory.eINSTANCE.createItemState(); item.setState(itemState); // WSTransformerV2E process = newProcess(key); item.setWsTransformerV2(process); if (parentItem != null) { item.getState().setPath(parentItem.getState().getPath()); RepositoryResourceUtil.createItem(item, key); } return item; } protected Item createServerObject(WSTransformerV2E process) { WSTransformerV2Item item = MdmpropertiesFactory.eINSTANCE.createWSTransformerV2Item(); ItemState itemState = PropertiesFactory.eINSTANCE.createItemState(); item.setState(itemState); // item.setWsTransformerV2(process); if (parentItem != null) { String path = rebuildItemPath(process.getName()); item.getState().setPath(path); RepositoryResourceUtil.createItem(item, process.getName()); } return item; } private String rebuildItemPath(String processName) { String path = parentItem.getState().getPath(); if (path.isEmpty()) { path = RepositoryTransformUtil.getInstance().getProcessPath(processName, true); } return path; } public void generateJobTemplate(int type, String processName, String[] returnMessages, boolean enableRedirect, String redirectUrl, List<IMDMJobTemplate> jobTemplates) { if (type == ITransformerV2NodeConsDef.TYPE_SMARTVIEW) {// don't create job if smartview return; } if (returnMessages == null || returnMessages.length < 2) { throw new IllegalArgumentException(); } String infoType = null; String pMessage = null; if (type == ITransformerV2NodeConsDef.TYPE_BEFOREDEL || type == ITransformerV2NodeConsDef.TYPE_BEFORESAVE) { infoType = returnMessages[0]; pMessage = returnMessages[1]; } if (type == ITransformerV2NodeConsDef.TYPE_ENTITYACTION || type == ITransformerV2NodeConsDef.TYPE_WELCOMEACTION) { if (enableRedirect) { pMessage = "<results><item><attr>" + redirectUrl + //$NON-NLS-1$ "</attr></item></results>"; //$NON-NLS-1$ } else { pMessage = ""; //$NON-NLS-1$ } } IValidateService validateService = (IValidateService) GlobalServiceRegister.getDefault().getService( IValidateService.class); for (IMDMJobTemplate job : jobTemplates) { boolean result = true; processName = processName.replaceAll("#|\\$", ""); //$NON-NLS-1$//$NON-NLS-2$ if (validateService != null) { result = validateService.validateAndAlertObjectExistence(ERepositoryObjectType.PROCESS, processName, "Job"); //$NON-NLS-1$ } if (result) { closeEditor(processName); job.generateJobTemplate(type, processName, infoType, pMessage); } } } private void closeEditor(String processName) { IWorkbenchPage activePage = getActivePage(); IEditorReference[] editorRef = activePage.getEditorReferences(); for (IEditorReference ref : editorRef) { IEditorInput editorInput = ref.getEditor(false).getEditorInput(); if (editorInput instanceof ProcessEditorInput) { ProcessEditorInput processInput = (ProcessEditorInput) editorInput; ProcessItem jobItem = (ProcessItem) processInput.getItem(); if (jobItem.getProperty().getLabel().equals(processName)) { activePage.closeEditors(new IEditorReference[] { ref }, false); IRepositoryViewObject jobViewObject = RepositoryResourceUtil.findViewObjectByName( ERepositoryObjectType.PROCESS, processName); if (jobViewObject != null) { IProxyRepositoryFactory factory = CoreRuntimePlugin.getInstance().getProxyRepositoryFactory(); try { factory.deleteObjectPhysical(jobViewObject); } catch (PersistenceException e) { log.error(e.getMessage(), e); } } break; } } } } }