/******************************************************************************* * Copyright 2017 Capital One Services, LLC and Bitwise, Inc. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ package hydrograph.ui.graph.action.subjob; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.apache.commons.lang.StringUtils; import org.eclipse.core.resources.IFile; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.EditPart; import org.eclipse.gef.GraphicalViewer; import org.eclipse.gef.commands.Command; import org.eclipse.gef.ui.actions.Clipboard; import org.eclipse.gef.ui.actions.SelectionAction; import org.eclipse.gef.ui.parts.GraphicalEditor; import org.eclipse.jface.action.IAction; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PlatformUI; import hydrograph.ui.common.util.Constants; import hydrograph.ui.graph.Messages; import hydrograph.ui.graph.action.PasteAction; import hydrograph.ui.graph.command.ComponentCreateCommand; import hydrograph.ui.graph.command.SubJobCommand; import hydrograph.ui.graph.controller.ComponentEditPart; import hydrograph.ui.graph.editor.ELTGraphicalEditor; import hydrograph.ui.graph.model.Component; import hydrograph.ui.graph.model.Component.ValidityStatus; import hydrograph.ui.graph.model.Container; import hydrograph.ui.graph.model.Link; import hydrograph.ui.graph.model.LinkComparatorBySourceLocation; import hydrograph.ui.graph.model.components.InputSubjobComponent; import hydrograph.ui.graph.model.components.OutputSubjobComponent; import hydrograph.ui.graph.model.components.SubjobComponent; import hydrograph.ui.graph.utility.SubJobUtility; /** * The Class SubJobAction use to create sub graph. * * @author Bitwise */ public class SubJobAction extends SelectionAction{ /** The paste action. */ //TODO : remove pasteAction is not needed. PasteAction pasteAction; /** The ed component edit part. */ ComponentEditPart componentEditPart; /** * Instantiates a new cut action. * * @param part * the part * @param action * the action */ public SubJobAction(IWorkbenchPart part, IAction action) { super(part); this.pasteAction = (PasteAction) action; setLazyEnablementCalculation(true); } /* (non-Javadoc) * @see org.eclipse.gef.ui.actions.WorkbenchPartAction#init() */ @Override protected void init() { super.init(); ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages(); setText(Constants.SUBJOB_CREATE); setId(Constants.SUBJOB_CREATE); setEnabled(false); } /** * Creates the sub job command. * * @param selectedObjects the selected objects * @return the command */ private Command createSubJobCommand(List<Object> selectedObjects) { SubJobCommand cutCommand =new SubJobCommand(); if (selectedObjects == null || selectedObjects.isEmpty()) { return null; } Component node = null; boolean enabled=false; for(Object obj:selectedObjects) { if(obj instanceof ComponentEditPart) { enabled=true; break; } } if(enabled) { for(Object obj:selectedObjects) { if (obj instanceof ComponentEditPart) { node = (Component) ((EditPart)obj).getModel(); cutCommand.addElement(node); } } return cutCommand; } else return null; } /* (non-Javadoc) * @see org.eclipse.gef.ui.actions.WorkbenchPartAction#calculateEnabled() */ @Override protected boolean calculateEnabled() { Command cmd = createSubJobCommand(getSelectedObjects()); if (cmd == null){ return false; }else{ return true; } } /* * Create sub graph */ @Override public void run() { if(notConfirmedByUser()) return; SubJobUtility subJobUtility = new SubJobUtility(); IFile file=subJobUtility.openSubJobSaveDialog(); if(file!=null) { ELTGraphicalEditor editor=(ELTGraphicalEditor) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); Container containerOld=editor.getContainer(); String validityStatus = null; for (int i = 0; i < containerOld.getUIComponentList().size(); i++) { if (!(containerOld.getUIComponentList().get(i) instanceof InputSubjobComponent || containerOld.getUIComponentList() .get(i) instanceof OutputSubjobComponent)) { Component component = containerOld.getUIComponentList().get(i); if (component.getProperties().get(Constants.VALIDITY_STATUS) != null && ((StringUtils.equalsIgnoreCase(ValidityStatus.ERROR.name(), component.getProperties().get(Constants.VALIDITY_STATUS).toString())) || StringUtils.equalsIgnoreCase(ValidityStatus.WARN.name(), component.getProperties().get(Constants.VALIDITY_STATUS) .toString()))) { validityStatus = ValidityStatus.ERROR.name(); break; } else { validityStatus = ValidityStatus.VALID.name(); } } } execute(createSubJobCommand(getSelectedObjects())); List clipboardList = (List) Clipboard.getDefault().getContents(); SubjobComponent subjobComponent= new SubjobComponent(); ComponentCreateCommand createComponent = new ComponentCreateCommand(subjobComponent,containerOld,new Rectangle(((Component)clipboardList.get(0)).getLocation(),((Component)clipboardList.get(0)).getSize())); createComponent.execute(); subjobComponent.getProperties().put(Constants.VALIDITY_STATUS,validityStatus); GraphicalViewer graphicalViewer =(GraphicalViewer) ((GraphicalEditor)editor).getAdapter(GraphicalViewer.class); for (Iterator<EditPart> ite = graphicalViewer.getEditPartRegistry().values().iterator(); ite.hasNext();) { EditPart editPart = (EditPart) ite.next(); if(editPart instanceof ComponentEditPart && Constants.SUBJOB_COMPONENT_CATEGORY.equalsIgnoreCase(((ComponentEditPart) editPart).getCastedModel().getCategory())) { Component tempComponent=((ComponentEditPart) editPart).getCastedModel(); if (StringUtils.equals(tempComponent.getComponentLabel().getLabelContents(), subjobComponent.getComponentLabel().getLabelContents())) { componentEditPart= (ComponentEditPart) editPart; } } } /* * Collect all input and output links for missing target or source. */ List< Link> inLinks = new ArrayList<>(); List< Link> outLinks = new ArrayList<>(); for (Object object : clipboardList) { Component component = (Component)object; if(component!= null){ List<Link> tarLinks= component.getTargetConnections(); for(int i=0;i<tarLinks.size();i++){ if (!clipboardList.contains(tarLinks.get(i).getSource())) { inLinks.add(tarLinks.get(i)); } } List<Link> sourLinks= component.getSourceConnections(); for(int i=0;i<sourLinks.size();i++){ if (!clipboardList.contains(sourLinks.get(i).getTarget())) { outLinks.add(sourLinks.get(i)); } } } } Collections.sort(inLinks, new LinkComparatorBySourceLocation()); Collections.sort(outLinks, new LinkComparatorBySourceLocation()); /* * Update main sub graph component size and properties */ subJobUtility.updateSubJobModelProperties(componentEditPart, inLinks.size(), outLinks.size(), file); /* * Create Input port in main subjob component. */ subJobUtility.createDynamicInputPort(inLinks, componentEditPart); /* * Create output port in main subjob component. */ subJobUtility.createDynamicOutputPort(outLinks, componentEditPart) ; /* * Generate subjob target xml. */ Container container=subJobUtility.createSubJobXmlAndGetContainer(componentEditPart,clipboardList,file); finishSubjobCreation(subjobComponent,componentEditPart,container); } } private void finishSubjobCreation(Component subjobComponent, ComponentEditPart componentEditPart, Container container) { subjobComponent.getProperties().put(Constants.SUBJOB_VERSION,container.getSubjobVersion()); SubJobUtility.getCurrentEditor().setDirty(true); componentEditPart.updateComponentStatus(); SubJobUtility.getCurrentEditor().getViewer().select(componentEditPart); } private boolean notConfirmedByUser() { MessageBox messageBox = new MessageBox(Display.getCurrent().getActiveShell(), SWT.ICON_QUESTION | SWT.YES | SWT.NO); messageBox.setMessage(Messages.CONFIRM_TO_CREATE_SUBJOB_MESSAGE); messageBox.setText(Messages.CONFIRM_TO_CREATE_SUBJOB_WINDOW_TITLE); int response = messageBox.open(); if (response == SWT.YES) { return false; } else return true; } }