X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=eclipse%2Fplugins%2Forg.argeo.slc.client.ui%2Fsrc%2Forg%2Fargeo%2Fslc%2Fclient%2Fui%2Fviews%2FProcessBuilderView.java;h=5d62983f96ac2167859920dafcc94b3b463a2b27;hb=997b077ede2082e4ef10d6c30ea8d58baa3879f5;hp=00a80d27e7ee74286ad0810e67a37ad41d57670a;hpb=20b786a39e7e034ca0b5bcfe7e690c7c742463a8;p=gpl%2Fargeo-slc.git diff --git a/eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ProcessBuilderView.java b/eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ProcessBuilderView.java index 00a80d27e..5d62983f9 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ProcessBuilderView.java +++ b/eclipse/plugins/org.argeo.slc.client.ui/src/org/argeo/slc/client/ui/views/ProcessBuilderView.java @@ -8,15 +8,21 @@ import java.util.Properties; import java.util.UUID; import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.argeo.slc.SlcException; +import org.argeo.slc.client.oxm.OxmInterface; +import org.argeo.slc.client.ui.ClientUiPlugin; import org.argeo.slc.client.ui.controllers.ProcessController; -import org.argeo.slc.execution.ExecutionFlowDescriptor; import org.argeo.slc.process.RealizedFlow; import org.argeo.slc.process.SlcExecution; import org.argeo.slc.runtime.SlcAgent; +import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerDropAdapter; @@ -30,29 +36,54 @@ import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.ViewPart; +/** + * Display a list of processes that are to be launched as batch. For the moment + * being, only one agent by batch is enabled. The batch is contructed by + * dropping process from the ExecutionModuleView. Wrong type of data dropped in + * this view might raise errors. + * + * @author bsinou + * + */ public class ProcessBuilderView extends ViewPart { + private final static Log log = LogFactory.getLog(ProcessBuilderView.class); + public static final String ID = "org.argeo.slc.client.ui.processBuilderView"; + private static final String EDIT_CMD = "org.argeo.slc.client.ui.editRealizedFlowDetails"; + private static final String FLOWASXML_PARAM = "org.argeo.slc.client.commands.realizedFlowAsXml"; + private static final String INDEX_PARAM = "org.argeo.slc.client.commands.realizedFlowIndex"; // private final static Log log = // LogFactory.getLog(ProcessBuilderView.class); private TableViewer viewer; - private List realizedFlows = new ArrayList(); - private String currentAgentUuid = null; + private String host = null; + + // TODO find a better way to get index of the current selected row + // used in removeSelected + private int curSelectedRow = -1; + + // IoC + private OxmInterface oxmBean; private ProcessController processController; + private List slcAgents; public void createPartControl(Composite parent) { Table table = createTable(parent); viewer = new TableViewer(table); viewer.setLabelProvider(new ViewLabelProvider()); viewer.setContentProvider(new ViewContentProvider()); + viewer.addSelectionChangedListener(new SelectionChangedListener()); + int operations = DND.DROP_COPY | DND.DROP_MOVE; Transfer[] tt = new Transfer[] { TextTransfer.getInstance() }; viewer.addDropSupport(operations, tt, new ViewDropListener(viewer)); + viewer.setInput(getViewSite()); } @@ -72,12 +103,12 @@ public class ProcessBuilderView extends ViewPart { table.setHeaderVisible(true); TableColumn column = new TableColumn(table, SWT.LEFT, 0); - column.setText("Date"); + column.setText("Module"); column.setWidth(200); column = new TableColumn(table, SWT.LEFT, 1); - column.setText("UUID"); - column.setWidth(300); + column.setText("Flow"); + column.setWidth(200); return table; } @@ -88,7 +119,6 @@ public class ProcessBuilderView extends ViewPart { SlcExecution slcExecution = new SlcExecution(); slcExecution.setUuid(UUID.randomUUID().toString()); slcExecution.setRealizedFlows(realizedFlows); - processController.execute(agent, slcExecution); } @@ -96,10 +126,79 @@ public class ProcessBuilderView extends ViewPart { viewer.getControl().setFocus(); } - public void setProcessController(ProcessController processController) { - this.processController = processController; + // update one of the parameter of a given RealizedFlow + public void updateParameter(int realizedFlowIndex, String paramName, + Object value) { + RealizedFlow curRealizedFlow = realizedFlows.get(realizedFlowIndex); + curRealizedFlow.getFlowDescriptor().getValues().put(paramName, value); + } + + // clear the realizedFlow + public void clearBatch() { + // we clear the list + realizedFlows = new ArrayList(); + curSelectedRow = -1; + refreshParameterview(); + viewer.refresh(); + } + + // Remove the selected process from the batch + public void removeSelected() { + if (curSelectedRow == -1) + return; + else + realizedFlows.remove(curSelectedRow); + curSelectedRow = -1; + refreshParameterview(); + viewer.refresh(); + } + + // calling this method with index =-1 will cause the reset of the view. + private void refreshParameterview() { + // We choose to directly access the view rather than going through + // commands. + ProcessParametersView ppView; + try { + ppView = (ProcessParametersView) ClientUiPlugin.getDefault() + .getWorkbench().getActiveWorkbenchWindow().getActivePage() + .showView(ProcessParametersView.ID); + + if (curSelectedRow == -1) + ppView.setRealizedFlow(-1, null); + else + ppView.setRealizedFlow(curSelectedRow, + realizedFlows.get(curSelectedRow)); + } catch (PartInitException e) { + throw new SlcException( + "Cannot Retrieve ProcessParameterView to edit parameters of selected process", + e); + } + } + + // Return the list of the processes to execute. + public void launchBatch() { + SlcExecution slcExecution = new SlcExecution(); + slcExecution.setUuid(UUID.randomUUID().toString()); + + slcExecution.setRealizedFlows(realizedFlows); + slcExecution.setHost(host); + + // TODO : insure that the concept has been well understood & the + // specification respected + SlcAgent curAgent; + for (int i = 0; i < slcAgents.size(); i++) { + if (currentAgentUuid == null) + throw new SlcException( + "Cannot launch a batch if no agent is specified"); + if (currentAgentUuid.equals(slcAgents.get(i).getAgentUuid())) { + curAgent = slcAgents.get(i); + processController.execute(curAgent, slcExecution); + break; + } + } } + // Specific Providers for the current view. protected class ViewContentProvider implements IStructuredContentProvider { public void inputChanged(Viewer arg0, Object arg1, Object arg2) { } @@ -131,6 +230,23 @@ public class ProcessBuilderView extends ViewPart { } + // Handle Events + class SelectionChangedListener implements ISelectionChangedListener { + public void selectionChanged(SelectionChangedEvent evt) { + + IStructuredSelection curSelection = (IStructuredSelection) evt + .getSelection(); + Object obj = curSelection.getFirstElement(); + + if (obj instanceof RealizedFlow) { + RealizedFlow rf = (RealizedFlow) obj; + curSelectedRow = realizedFlows.indexOf(rf); + refreshParameterview(); + } + } + } + + // Implementation of the Drop Listener protected class ViewDropListener extends ViewerDropAdapter { public ViewDropListener(Viewer viewer) { @@ -139,47 +255,62 @@ public class ProcessBuilderView extends ViewPart { @Override public boolean performDrop(Object data) { - System.out.println(data); + Properties props = new Properties(); + + // TODO : Handle wrong type of dropped data ByteArrayInputStream in = new ByteArrayInputStream(data.toString() .getBytes()); try { props.load(in); } catch (IOException e) { - throw new SlcException("Cannot create read realized flow", e); + throw new SlcException("Cannot create read flow node", e); } finally { IOUtils.closeQuietly(in); } String agentId = props.getProperty("agentId"); - if (currentAgentUuid == null) + if (currentAgentUuid == null) { currentAgentUuid = agentId; - else if (currentAgentUuid.equals(agentId)) - return false; + host = props.getProperty("host"); + } else if (!currentAgentUuid.equals(agentId)) { + // TODO: as for now, we can only construct batch on a single + // Agent, must be upgraded to enable batch on various agent. + throw new SlcException( + "Cannot create batch on two (or more) distinct agents", + null); + // return false; + } - RealizedFlow rf = realizedFlowFromProperties(props); + String fdXml = props.getProperty("RealizedFlowAsXml"); + if (fdXml == null) + return false; + RealizedFlow rf = (RealizedFlow) oxmBean.unmarshal(fdXml); realizedFlows.add(rf); + curSelectedRow = realizedFlows.indexOf(rf); + refreshParameterview(); getViewer().refresh(); return true; } - private RealizedFlow realizedFlowFromProperties(Properties props) { - RealizedFlow rf = new RealizedFlow(); - rf.setModuleName(props.getProperty("moduleName")); - rf.setModuleVersion(props.getProperty("moduleVersion")); - ExecutionFlowDescriptor efd = new ExecutionFlowDescriptor(); - efd.setName(props.getProperty("flowName")); - rf.setFlowDescriptor(efd); - return rf; - } - @Override public boolean validateDrop(Object target, int operation, TransferData transferType) { return true; - } + } + // IoC + public void setSlcAgents(List slcAgents) { + this.slcAgents = slcAgents; + } + + public void setOxmBean(OxmInterface oxmBean) { + this.oxmBean = oxmBean; + } + + public void setProcessController(ProcessController processController) { + this.processController = processController; } }