package org.talend.designer.core.ui.editor.jobletcontainer; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; import org.talend.commons.ui.runtime.exception.ExceptionHandler; import org.talend.core.GlobalServiceRegister; import org.talend.core.PluginChecker; import org.talend.core.model.components.ComponentUtilities; import org.talend.core.model.components.IComponent; import org.talend.core.model.metadata.IMetadataTable; import org.talend.core.model.metadata.MetadataTable; import org.talend.core.model.process.EConnectionType; import org.talend.core.model.process.EParameterFieldType; import org.talend.core.model.process.Element; import org.talend.core.model.process.IConnection; import org.talend.core.model.process.IElementParameter; import org.talend.core.model.process.IExternalData; import org.talend.core.model.process.IExternalNode; import org.talend.core.model.process.INode; import org.talend.core.model.process.INodeConnector; import org.talend.core.model.process.IProcess; import org.talend.core.model.process.IProcess2; import org.talend.core.model.properties.Item; import org.talend.core.model.properties.JobletProcessItem; import org.talend.core.ui.IJobletProviderService; import org.talend.core.ui.ISVNProviderService; import org.talend.designer.core.model.components.EParameterName; import org.talend.designer.core.model.components.NodeConnector; import org.talend.designer.core.model.utils.emf.talendfile.ElementParameterType; import org.talend.designer.core.model.utils.emf.talendfile.NodeType; import org.talend.designer.core.ui.AbstractMultiPageTalendEditor; import org.talend.designer.core.ui.editor.connections.Connection; import org.talend.designer.core.ui.editor.nodecontainer.NodeContainer; import org.talend.designer.core.ui.editor.nodecontainer.NodeContainerPart; import org.talend.designer.core.ui.editor.nodes.Node; import org.talend.designer.core.ui.editor.nodes.NodePart; import org.talend.designer.core.ui.editor.subjobcontainer.SubjobContainer; import org.talend.designer.joblet.model.JobletNode; import org.talend.designer.joblet.model.JobletProcess; import org.talend.repository.model.ComponentsFactoryProvider; import org.talend.repository.model.ERepositoryStatus; import org.talend.repository.model.IProxyRepositoryFactory; import org.talend.repository.model.IProxyRepositoryService; public class JobletUtil { public boolean isJobletInput(Node connNode, IProcess2 process) { if (process.getProperty().getItem() instanceof JobletProcessItem) { JobletProcess jobletProcess = ((JobletProcessItem) process.getProperty().getItem()).getJobletProcess(); List<JobletNode> jobletNodes = jobletProcess.getJobletNodes(); for (JobletNode jnode : jobletNodes) { List list = jnode.getElementParameter(); for (Object obj : list) { if (obj instanceof ElementParameterType) { if (((ElementParameterType) obj).getValue().equals(connNode.getJoblet_unique_name())) { return jnode.isInput(); } } } } } return false; } public List<INodeConnector> createConnectors(INode node, IProcess2 process) { List<INodeConnector> listConnector = new ArrayList<INodeConnector>(); if (process == null) { return listConnector; } if (process.getProperty().getItem() instanceof JobletProcessItem) { JobletProcess jobletProcess = ((JobletProcessItem) process.getProperty().getItem()).getJobletProcess(); EList<JobletNode> jobletLinks = jobletProcess.getJobletNodes(); INodeConnector nodeConnector; int nbInput = 0; int nbOutput = 0; int jobletNbInput = 0; for (JobletNode jNode : jobletLinks) { if (jNode.isInput()) { jobletNbInput++; } } boolean multipleInput = jobletNbInput > 1; for (JobletNode jNode : jobletLinks) { String name = ComponentUtilities.getNodeUniqueName(jNode); if (jNode.isTrigger()) { // createTriggerConnector(listConnector, node); } else { if (jNode.isInput()) { if (multipleInput) { nodeConnector = new NodeConnector(node); nodeConnector.setName(name); nodeConnector.setBaseSchema(EConnectionType.FLOW_MAIN.getName()); nodeConnector.setDefaultConnectionType(EConnectionType.FLOW_MAIN); nodeConnector.setMaxLinkInput(1); nodeConnector.setMinLinkInput(0); nodeConnector.setMaxLinkOutput(0); nodeConnector.setMinLinkOutput(0); listConnector.add(nodeConnector); } nbInput++; } else { nodeConnector = new NodeConnector(node); nodeConnector.setName(name); nodeConnector.setBaseSchema(EConnectionType.FLOW_MAIN.getName()); nodeConnector.setBuiltIn(true); nodeConnector.setMaxLinkOutput(1); nodeConnector.setMinLinkOutput(1); // achen modify to fix bug 6205 String displayName = getDisplayName(jNode); nodeConnector.setLinkName("Joblet " + name); nodeConnector.setMenuName(displayName); nodeConnector.setDefaultConnectionType(EConnectionType.FLOW_MAIN); nodeConnector.addConnectionProperty(EConnectionType.FLOW_MAIN, EConnectionType.FLOW_MAIN.getRGB(), EConnectionType.FLOW_MAIN.getDefaultLineStyle()); nodeConnector.addConnectionProperty(EConnectionType.FLOW_REF, EConnectionType.FLOW_REF.getRGB(), EConnectionType.FLOW_REF.getDefaultLineStyle()); nodeConnector.addConnectionProperty(EConnectionType.FLOW_MERGE, EConnectionType.FLOW_MERGE.getRGB(), EConnectionType.FLOW_MERGE.getDefaultLineStyle()); listConnector.add(nodeConnector); nbOutput++; } } } } createTriggerConnector(listConnector, node); return listConnector; } private void createTriggerConnector(List<INodeConnector> listConnector, INode jobletNode) { IJobletProviderService service = (IJobletProviderService) GlobalServiceRegister.getDefault().getService( IJobletProviderService.class); if (service != null) { List<INode> triggerNodes = service.getTriggerNodes(jobletNode.getJobletNode()); for (INode node : triggerNodes) { // INode node = jobletNode; EConnectionType triggerConnType = service.getTriggerNodeConnType(node); if (triggerConnType == null) { continue; } boolean isInput = service.isTriggerInputNode(node); INodeConnector nodeConnector = null; String name = node.getUniqueName(); nodeConnector = new NodeConnector(jobletNode); nodeConnector.setName(name); nodeConnector.setBaseSchema(triggerConnType.getName()); nodeConnector.setBuiltIn(true); nodeConnector.setMaxLinkOutput(isInput ? 0 : 1); nodeConnector.setMinLinkOutput(0); nodeConnector.setMaxLinkInput(isInput ? 1 : 0); nodeConnector.setMinLinkInput(0); String displayName = conDisplayName(node.getLabel(), name); nodeConnector.setLinkName(triggerConnType.getDefaultLinkName() + " (" + displayName + ")"); //$NON-NLS-1$ //$NON-NLS-2$ nodeConnector.setMenuName(triggerConnType.getDefaultMenuName() + " (" + displayName + ")"); //$NON-NLS-1$ //$NON-NLS-2$ nodeConnector.setDefaultConnectionType(triggerConnType); nodeConnector.addConnectionProperty(triggerConnType, triggerConnType.getRGB(), triggerConnType.getDefaultLineStyle()); listConnector.add(nodeConnector); } } } private String getDisplayName(NodeType node) { String uniqueName = ComponentUtilities.getNodeUniqueName(node); String label = ComponentUtilities.getNodePropertyValue(node, EParameterName.LABEL.getName()); String displayName = uniqueName; if (label != null && uniqueName != null) { label = label.replaceAll("__" + EParameterName.UNIQUE_NAME.getName() + "__", uniqueName);//$NON-NLS-1$ displayName = conDisplayName(label, uniqueName); } return "Joblet " + displayName; } private String conDisplayName(String label, String uniqueName) { String displayName = uniqueName; if (!label.equals(uniqueName)) { displayName = label + "(" + uniqueName + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } return displayName; } public NodeContainer cloneNodeContainer(NodeContainer nodeContainer, Node cloneNode) { NodeContainerPart nodeConPart = new NodeContainerPart(); // TDI-13132 IComponent tempComponent = cloneNode.getComponent(); if (tempComponent != null) { String tempComponentName = tempComponent.getName(); if (tempComponentName != null) { IComponent component = ComponentsFactoryProvider.getInstance().get(tempComponentName); if (component != null) { cloneNode.setComponent(component); } } } NodeContainer cloneNodeContainer = new NodeContainer(cloneNode); nodeConPart.setModel(cloneNodeContainer); cloneNodeContainer.setNodeError(cloneNode.getNodeError()); cloneNodeContainer.setNodeLabel(cloneNode.getNodeLabel()); cloneNodeContainer.setNodeProgressBar(cloneNode.getNodeProgressBar()); cloneNodeContainer.setReadOnly(nodeContainer.isReadOnly()); return cloneNodeContainer; } public Node cloneNode(Node node, IProcess process, boolean lockByOther) { NodePart nodePart = new NodePart(); IJobletProviderService service = (IJobletProviderService) GlobalServiceRegister.getDefault().getService( IJobletProviderService.class); boolean isInOut = false; if (service != null) { isInOut = service.isJobletInOutComponent(node); } Node cloneNode = null; if (isInOut) { cloneNode = new Node(node.getComponent(), (IProcess2) process, node.getUniqueName()); } else { cloneNode = new Node(node.getComponent(), (IProcess2) process); } nodePart.setModel(cloneNode); cloneNode.setLabel(node.getLabel()); // if (lock == null) { // cloneNode.setReadOnly(true); // } else { // if (lock) { // cloneNode.setReadOnly(false); // } else { // cloneNode.setReadOnly(true); // } // } if (lockByOther) { cloneNode.setReadOnly(true); } else { cloneNode.setReadOnly(false); } List<? extends IElementParameter> elementParas = node.getElementParameters(); for (IElementParameter elementPara : elementParas) { if (elementPara.getName() != null && !elementPara.getName().equals("UNIQUE_NAME")) { IElementParameter cloneElement = cloneNode.getElementParameter(elementPara.getName()); Object paValue = elementPara.getValue(); if (paValue instanceof List) { List list = new ArrayList(); list.addAll((List) paValue); cloneElement.setValue(list); } else { cloneElement.setValue(elementPara.getValue()); } // if (lock == null) { // cloneElement.setReadOnly(true); // } else { // if (lock) { // cloneElement.setReadOnly(false); // } else { // cloneElement.setReadOnly(true); // } // } if (lockByOther) { cloneElement.setReadOnly(true); } else { cloneElement.setReadOnly(false); } if (elementPara.getChildParameters() != null) { Map<String, IElementParameter> elementParaChild = elementPara.getChildParameters(); Map<String, IElementParameter> cloneElementChild = cloneElement.getChildParameters(); Iterator<Entry<String, IElementParameter>> ite = elementParaChild.entrySet().iterator(); while (ite.hasNext()) { Entry<String, IElementParameter> entry = ite.next(); String key = entry.getKey(); IElementParameter c = entry.getValue(); if (key != null && c != null) { IElementParameter cloneC = cloneElementChild.get(key); if (cloneC != null) { cloneC.setValue(c.getValue()); // if (lock == null) { // cloneC.setReadOnly(true); // } else { // if (lock) { // cloneC.setReadOnly(false); // } else { // cloneC.setReadOnly(true); // } // } if (lockByOther) { cloneC.setReadOnly(true); } else { cloneC.setReadOnly(false); } } } } } } } for (IElementParameter param : cloneNode.getElementParameters()) { String repositoryValue = param.getRepositoryValue(); if (param.isShow(cloneNode.getElementParameters()) && (repositoryValue != null) && (!param.getName().equals(EParameterName.PROPERTY_TYPE.getName())) && param.getFieldType() != EParameterFieldType.MEMO_SQL) { param.setRepositoryValueUsed(true); param.setReadOnly(true); } } cloneNode.setMetadataList(node.getMetadataList()); // cloneNode.setExternalNode(node.getExternalNode()); cloneNode.setListConnector(node.getListConnector()); cloneNode.setConnectionName(node.getConnectionName()); cloneNode.setLocation(node.getLocation()); IExternalNode externalNode = cloneNode.getExternalNode(); if (externalNode != null) { if (node.getExternalData() != null) { try { externalNode.setExternalData(node.getExternalData().clone()); } catch (CloneNotSupportedException e) { ExceptionHandler.process(e); } ((Node) cloneNode).setExternalData(externalNode.getExternalData()); } if (node.getExternalNode().getExternalEmfData() != null) { externalNode.setExternalEmfData(EcoreUtil.copy(node.getExternalNode().getExternalEmfData())); } // for (IMetadataTable metaTable : node.getMetadataList()) { // String oldName = metaTable.getTableName(); // String newName = oldMetaToNewMeta.get(cloneNode.getUniqueName() + ":" + metaTable.getTableName()); //$NON-NLS-1$ // externalNode.renameOutputConnection(oldName, newName); // CorePlugin.getDefault().getMapperService() // .renameJoinTable(process, externalNode.getExternalData(), createdNames); // } // when copy a external node, should also copy screeshot if (node.getExternalNode() != null) { ImageDescriptor screenshot = node.getExternalNode().getScreenshot(); if (screenshot != null) { externalNode.setScreenshot(screenshot); } } } return cloneNode; } public void updateNode(Node cloneNode, Node node) { List<? extends IElementParameter> elementParas = node.getElementParameters(); for (IElementParameter elementPara : elementParas) { if (elementPara.getName() != null && !elementPara.getName().equals("UNIQUE_NAME")) { IElementParameter cloneElement = cloneNode.getElementParameter(elementPara.getName()); cloneElement.setValue(elementPara.getValue()); } } cloneNode.setLocation(node.getLocation()); } public Connection cloneConnection(IConnection conn, INode source, INode target) { Connection cloneConn = new Connection(source, target, conn.getLineStyle(), conn.getConnectorName(), conn.getMetaName(), conn.getName(), conn.isMonitorConnection()); return cloneConn; } public boolean canAdd(List<NodeContainer> nodeContainers, INode jobletNodes) { for (NodeContainer nodeCon : nodeContainers) { Node temNode = nodeCon.getNode(); if (jobletNodes.getUniqueName().equals(temNode.getJoblet_unique_name())) { return false; } } return true; } public boolean canDelete(List<? extends INode> jobletNodes, Node temNode) { for (INode jCon : jobletNodes) { if (jCon.getUniqueName().equals(temNode.getJoblet_unique_name())) { return false; } } return true; } public Rectangle getExpandRectangle(Rectangle nodeRec) { Point location = nodeRec.getLocation(); Dimension size = nodeRec.getSize(); int width = location.x + size.width; int height = location.y + size.height; Rectangle rec = new Rectangle(0, 0, width, height); return rec; } public void makeSureUnlockJoblet(IProcess2 process) { List<? extends INode> nodeList = process.getGraphicalNodes(); for (INode node : nodeList) { if (((Node) node).isJoblet()) { // if (!((Node) node).getNodeContainer().isCollapsed()) { IJobletProviderService service = (IJobletProviderService) GlobalServiceRegister.getDefault().getService( IJobletProviderService.class); if (service != null) { service.unlockJoblet(node, false); service.reloadJobletProcess(node); } // } } } } public boolean needReadOnlyJoblet(JobletProcessItem jobletItem) { IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IEditorPart[] editors = page.getEditors(); for (int i = 0; i < editors.length; i++) { if (editors[i] instanceof AbstractMultiPageTalendEditor) { List<? extends INode> nodeList = ((AbstractMultiPageTalendEditor) editors[i]).getProcess().getGraphicalNodes(); for (INode node : nodeList) { if (((Node) node).isJoblet() && jobletItem.getProperty() != null) { if (jobletItem.getProperty().getId().equals(node.getComponent().getProcess().getId())) { boolean haveLock = jobletItem.getState().isLocked(); boolean isSvn = false; ISVNProviderService service = null; if (PluginChecker.isSVNProviderPluginLoaded()) { service = (ISVNProviderService) GlobalServiceRegister.getDefault().getService( ISVNProviderService.class); } if (service != null && service.isProjectInSvnMode()) { isSvn = service.isProjectInSvnMode(); } if (isSvn) { IProxyRepositoryService proxyService = (IProxyRepositoryService) GlobalServiceRegister .getDefault().getService(IProxyRepositoryService.class); IProxyRepositoryFactory factory = proxyService.getProxyRepositoryFactory(); ERepositoryStatus repositoryStatus = factory.getStatus(jobletItem); if (repositoryStatus == ERepositoryStatus.LOCK_BY_USER) { haveLock = true; } } if (haveLock) { return true; } } } } } } return false; } public boolean openedInJob(JobletProcessItem jobletItem, Node currNode) { IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IEditorPart[] editors = page.getEditors(); for (int i = 0; i < editors.length; i++) { if (editors[i] instanceof AbstractMultiPageTalendEditor) { IProcess2 pro = ((AbstractMultiPageTalendEditor) editors[i]).getProcess(); if (currNode != null) { IProcess2 currPro = (IProcess2) currNode.getProcess(); if (currPro.getId().equals(pro.getId())) { List<? extends INode> currNodeList = currPro.getGraphicalNodes(); for (INode node : currNodeList) { if (node == currNode) { continue; } else { if (((Node) node).isJoblet() && jobletItem.getProperty() != null) { boolean haveOpened = !((Node) node).getNodeContainer().isCollapsed(); if (haveOpened) { return true; } } } } continue; } } List<? extends INode> nodeList = pro.getGraphicalNodes(); for (INode node : nodeList) { if (((Node) node).isJoblet() && jobletItem.getProperty() != null) { if (jobletItem.getProperty().getId().equals(node.getComponent().getProcess().getId())) { boolean haveOpened = !((Node) node).getNodeContainer().isCollapsed(); if (haveOpened) { return true; } } } } } } return false; } public boolean checkModify(JobletContainer jobletContainer) { IProcess process = jobletContainer.getNode().getComponent().getProcess(); List<? extends INode> nodeList = process.getGraphicalNodes(); List<NodeContainer> containerList = jobletContainer.getNodeContainers(); for (NodeContainer nodeCon : containerList) { Node node = nodeCon.getNode(); String jobletUnique = node.getJoblet_unique_name(); if (jobletUnique == null || "".equals(jobletUnique)) { continue; } for (INode nodeOra : nodeList) { if (nodeOra.getUniqueName().equals(jobletUnique)) { List<? extends IElementParameter> paras = node.getElementParameters(); for (IElementParameter para : paras) { if (para == null) { continue; } String paraName = para.getName(); if (paraName != null) { if (paraName.equals(EParameterName.UNIQUE_NAME.getName())) { continue; } if (paraName.equals(EParameterName.UPDATE_COMPONENTS.getName())) { continue; } IElementParameter paraOra = nodeOra.getElementParameter(paraName); if (paraOra == null || para == null) { continue; } if (para.getValue() != null) { if (paraOra.getValue() != null) { // TDI-18915:The parameter here is not only a string value,but can be a // MetadataTable if (para.getValue() instanceof IMetadataTable) { boolean isSame = ((MetadataTable) para.getValue()).sameMetadataAs((MetadataTable) paraOra .getValue()); if (!isSame) { return true; } } else { if (!para.getValue().equals(paraOra.getValue())) { return true; } } } else { return true; } } else { if (paraOra.getValue() != null) { return true; } } if (paraOra.getChildParameters() != null && para.getChildParameters() != null) { Map<String, IElementParameter> paraChild = para.getChildParameters(); Map<String, IElementParameter> paraOraChild = paraOra.getChildParameters(); Iterator<Entry<String, IElementParameter>> ite = paraChild.entrySet().iterator(); while (ite.hasNext()) { Entry<String, IElementParameter> entry = ite.next(); String key = entry.getKey(); IElementParameter c = entry.getValue(); if (key != null && c != null) { IElementParameter oc = paraOraChild.get(key); if (oc != null) { if (c.getValue() != null) { if (oc.getValue() != null) { if (!oc.getValue().equals(c.getValue())) { return true; } } else { return true; } } else { if (oc.getValue() != null) { return true; } } } } } } } } List<IMetadataTable> nodeTables = node.getMetadataList(); List<IMetadataTable> oraTables = nodeOra.getMetadataList(); if (nodeTables.size() != oraTables.size()) { return true; } IExternalNode OraExternalNode = nodeOra.getExternalNode(); if (OraExternalNode != null) { IExternalNode externalNode = node.getExternalNode(); if (externalNode == null) { return true; } IExternalData oraData = nodeOra.getExternalData(); IExternalData data = node.getExternalData(); if (oraData != null) { if (data == null) { return true; } List<IMetadataTable> oraMetaList = OraExternalNode.getMetadataList(); List<IMetadataTable> metaList = externalNode.getMetadataList(); if (oraMetaList != null) { if (metaList == null) { return true; } if (oraMetaList.size() != metaList.size()) { return true; } } } } } } } return false; } public boolean keepLockJoblet(Item item) { if (item instanceof JobletProcessItem) { boolean isOpen = openedInJob((JobletProcessItem) item, null); return !isOpen; // if (isOpen) { // boolean flag = MessageDialog.openConfirm(Display.getDefault().getActiveShell(), "Lock joblet", // "The joblet is openes in a job,Do you want unlock it?"); // return flag; // } } return true; } public Map<String, List<JobletContainer>> getModifyMap(List<Element> elem) { Map<String, List<JobletContainer>> jobletNodeMap = new HashMap<String, List<JobletContainer>>(); for (Element element : elem) { if (element instanceof SubjobContainer) { for (NodeContainer container : ((SubjobContainer) element).getNodeContainers()) { if (container instanceof JobletContainer) { String processID = container.getNode().getProcess().getId(); if (!jobletNodeMap.containsKey(processID)) { List<JobletContainer> nodeList = new ArrayList<JobletContainer>(); nodeList.add((JobletContainer) container); jobletNodeMap.put(processID, nodeList); } else { jobletNodeMap.get(processID).add((JobletContainer) container); } } } } } return jobletNodeMap; } // public void reloadJobletComponent(IProcess2 process){ // IJobletProviderService service = (IJobletProviderService) GlobalServiceRegister.getDefault().getService( // IJobletProviderService.class); // if (service != null) { // process.get // service.reloadJobletProcess(this); // } // } public boolean lockByOthers(Item item) { IProxyRepositoryService service = (IProxyRepositoryService) GlobalServiceRegister.getDefault().getService( IProxyRepositoryService.class); IProxyRepositoryFactory factory = service.getProxyRepositoryFactory(); ERepositoryStatus repositoryStatus = factory.getStatus(item); if (repositoryStatus == ERepositoryStatus.LOCK_BY_OTHER) { return true; } return false; } }