[jboss-svn-commits] JBL Code SVN: r18453 - in labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin: src/main/java/org/drools/eclipse and 6 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Feb 10 21:29:14 EST 2008


Author: KrisVerlaenen
Date: 2008-02-10 21:29:14 -0500 (Sun, 10 Feb 2008)
New Revision: 18453

Added:
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/ProcessInfo.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/ProcessInstanceLogicalStructureDelegate.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/ProcessInstanceViewer.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/ProcessInstancesView.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/ProcessInstancesViewContentProvider.java
Modified:
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/plugin.xml
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DroolsEclipsePlugin.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/WorkItemDefinitions.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/builder/DroolsBuilder.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/datatype/DefaultDataTypeRegistry.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/core/ProcessWrapper.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/policy/ConnectionEditPolicy.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/NodeWrapper.java
   labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleFlowProcessWrapper.java
Log:
JBRULES-1463: Debugging process instances
 - process instances view shows all current process instances and their state
 - process instance viewer shows runtime state of selected process instance

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/plugin.xml
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/plugin.xml	2008-02-11 02:22:36 UTC (rev 18452)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/plugin.xml	2008-02-11 02:29:14 UTC (rev 18453)
@@ -37,6 +37,20 @@
       </view>
       -->
       <view
+         name="Process Instances View"
+         icon="icons/drools.gif"
+         category="org.drools.eclipse.views"
+         class="org.drools.eclipse.debug.ProcessInstancesView"
+         id="org.drools.eclipse.debug.ProcessInstancesView">
+      </view>
+      <view
+            name="Process Instance View"
+            icon="icons/drools.gif"
+            category="org.drools.eclipse.views"
+            class="org.drools.eclipse.debug.ProcessInstanceViewer"
+            id="org.drools.eclipse.debug.ProcessInstanceViewer">
+      </view>
+      <view
          name="Audit View"
          icon="icons/drools.gif"
          category="org.drools.eclipse.views"
@@ -60,6 +74,12 @@
         modelIdentifier="org.eclipse.jdt.debug"
         description="Agenda Item">
       </logicalStructureType>
+      <logicalStructureType
+        id="org.drools.eclipse.debug.ProcessInstanceLogicalStructures"
+        class="org.drools.eclipse.debug.ProcessInstanceLogicalStructureDelegate"
+        modelIdentifier="org.eclipse.jdt.debug"
+        description="Process Instance">
+      </logicalStructureType>
    </extension>
    <extension
          point="org.eclipse.ui.editors">

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DroolsEclipsePlugin.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DroolsEclipsePlugin.java	2008-02-11 02:22:36 UTC (rev 18452)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/DroolsEclipsePlugin.java	2008-02-11 02:29:14 UTC (rev 18453)
@@ -27,16 +27,19 @@
 import org.drools.compiler.DroolsParserException;
 import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.PackageBuilderConfiguration;
+import org.drools.compiler.ProcessBuilder;
 import org.drools.eclipse.DRLInfo.FunctionInfo;
 import org.drools.eclipse.DRLInfo.RuleInfo;
 import org.drools.eclipse.builder.DroolsBuilder;
 import org.drools.eclipse.builder.Util;
 import org.drools.eclipse.dsl.editor.DSLAdapter;
 import org.drools.eclipse.editors.AbstractRuleEditor;
+import org.drools.eclipse.flow.ruleflow.core.RuleFlowProcessWrapper;
 import org.drools.eclipse.preferences.IDroolsConstants;
 import org.drools.eclipse.util.ProjectClassLoader;
 import org.drools.lang.descr.PackageDescr;
 import org.drools.rule.builder.dialect.java.JavaDialectConfiguration;
+import org.drools.ruleflow.core.RuleFlowProcess;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IResourceVisitor;
@@ -57,6 +60,8 @@
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.osgi.framework.BundleContext;
 
+import com.thoughtworks.xstream.XStream;
+
 /**
  * The main plugin class to be used in the desktop.
  * 
@@ -78,6 +83,8 @@
 	private Map compiledRules = new HashMap();
 	private Map ruleInfoByClassNameMap = new HashMap();
 	private Map functionInfoByClassNameMap = new HashMap();
+	private Map<IResource, ProcessInfo> processInfos = new HashMap<IResource, ProcessInfo>();
+	private Map<String, ProcessInfo> processInfosById = new HashMap<String, ProcessInfo>();
 	private boolean useCachePreference;
 
     private FormColors               ruleBuilderFormColors;
@@ -115,6 +122,8 @@
 		compiledRules.clear();
 		ruleInfoByClassNameMap.clear();
 		functionInfoByClassNameMap.clear();
+		processInfos.clear();
+		processInfosById = null;
 	}
 
 	/**
@@ -126,6 +135,8 @@
 		resourceBundle = null;
 		parsedRules = null;
 		compiledRules = null;
+		processInfos = null;
+		processInfosById = null;
 		Iterator iterator = colors.values().iterator();
 		while (iterator.hasNext()) {
 			((Color) iterator.next()).dispose();
@@ -282,6 +293,10 @@
 			}
 		}
 		parsedRules.remove(resource);
+		ProcessInfo processInfo = processInfos.remove(resource);
+		if (processInfo != null) {
+		    processInfosById.remove(processInfo.getProcessId());
+		}
 	}
 	
 	private DRLInfo generateParsedResource(IResource resource, boolean compile) throws DroolsParserException {
@@ -394,6 +409,43 @@
 	public FunctionInfo getFunctionInfoByClass(String functionClassName) {
 		return (FunctionInfo) functionInfoByClassNameMap.get(functionClassName);
 	}
+	
+	public ProcessInfo parseProcess(String input, IResource resource) {
+	    try {
+            XStream stream = new XStream();
+            stream.setMode(XStream.ID_REFERENCES);
+            
+            ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+            ClassLoader newLoader = this.getClass().getClassLoader();
+            try {
+                Thread.currentThread().setContextClassLoader(newLoader);
+                Object o = stream.fromXML(input);
+                if (o instanceof RuleFlowProcessWrapper) {
+                    RuleFlowProcessWrapper processWrapper = (RuleFlowProcessWrapper) o;
+                    RuleFlowProcess process = processWrapper.getRuleFlowProcess();
+                    PackageBuilder packageBuilder = new PackageBuilder();
+                    ProcessBuilder processBuilder = new ProcessBuilder(packageBuilder);
+                    processBuilder.buildProcess(process);
+                    ProcessInfo processInfo = new ProcessInfo(process.getId(), processWrapper, packageBuilder.getPackage());
+                    processInfo.setErrors(processBuilder.getErrors());
+                    if (useCachePreference) {
+                        processInfos.put(resource, processInfo);
+                        processInfosById.put(process.getId(), processInfo);
+                    }
+                    return processInfo;
+                }
+            } finally {
+                Thread.currentThread().setContextClassLoader(oldLoader);
+            }           
+        } catch (Exception e) {
+            log(e);
+        }
+	    return null;
+	}
+	
+	public ProcessInfo getProcessInfo(String processId) {
+	    return processInfosById.get(processId);
+	}
 
     /**
      * Form Colors, default colors for now.

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/ProcessInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/ProcessInfo.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/ProcessInfo.java	2008-02-11 02:29:14 UTC (rev 18453)
@@ -0,0 +1,42 @@
+package org.drools.eclipse;
+
+import java.util.List;
+
+import org.drools.eclipse.flow.common.editor.core.ProcessWrapper;
+import org.drools.process.core.Process;
+import org.drools.rule.Package;
+
+public class ProcessInfo {
+    
+    private Package processPackage;
+    private String processId;
+    private ProcessWrapper processWrapper;
+    private List errors;
+    
+    public ProcessInfo(String processId, ProcessWrapper processWrapper, Package processPackage) {
+        this.processId = processId;
+        this.processPackage = processPackage;
+        this.processWrapper = processWrapper;
+    }
+    
+    public Process getProcess() {
+        return (Process) processPackage.getRuleFlows().get(processId);
+    }
+    
+    public String getProcessId() {
+        return processId;
+    }
+    
+    public ProcessWrapper getProcessWrapper() {
+        return processWrapper;
+    }
+    
+    public List getErrors() {
+        return errors;
+    }
+    
+    public void setErrors(List errors) {
+        this.errors = errors;
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/WorkItemDefinitions.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/WorkItemDefinitions.java	2008-02-11 02:22:36 UTC (rev 18452)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/WorkItemDefinitions.java	2008-02-11 02:29:14 UTC (rev 18453)
@@ -32,12 +32,12 @@
         logDefinition.setIcon("icons/open.gif");
         addWorkDefinition(logDefinition);
         // Order
-        WorkDefinitionExtensionImpl orderDefinition = new WorkDefinitionExtensionImpl();
-        orderDefinition.setName("Order");
-        orderDefinition.addParameter(new ParameterDefinitionImpl("OrderId", new StringDataType()));
-        orderDefinition.setDisplayName("Order");
-        orderDefinition.setIcon("icons/open.gif");
-        addWorkDefinition(orderDefinition);
+//        WorkDefinitionExtensionImpl orderDefinition = new WorkDefinitionExtensionImpl();
+//        orderDefinition.setName("Order");
+//        orderDefinition.addParameter(new ParameterDefinitionImpl("OrderId", new StringDataType()));
+//        orderDefinition.setDisplayName("Order");
+//        orderDefinition.setIcon("icons/open.gif");
+//        addWorkDefinition(orderDefinition);
 
     }
     

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/builder/DroolsBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/builder/DroolsBuilder.java	2008-02-11 02:22:36 UTC (rev 18452)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/builder/DroolsBuilder.java	2008-02-11 02:29:14 UTC (rev 18453)
@@ -22,15 +22,13 @@
 import org.drools.compiler.FunctionError;
 import org.drools.compiler.GlobalError;
 import org.drools.compiler.ImportError;
-import org.drools.compiler.PackageBuilder;
 import org.drools.compiler.ParserError;
-import org.drools.compiler.ProcessBuilder;
 import org.drools.compiler.RuleBuildError;
 import org.drools.decisiontable.InputType;
 import org.drools.decisiontable.SpreadsheetCompiler;
 import org.drools.eclipse.DRLInfo;
 import org.drools.eclipse.DroolsEclipsePlugin;
-import org.drools.eclipse.flow.ruleflow.core.RuleFlowProcessWrapper;
+import org.drools.eclipse.ProcessInfo;
 import org.drools.eclipse.preferences.IDroolsConstants;
 import org.drools.lang.ExpanderException;
 import org.eclipse.core.resources.IFile;
@@ -51,8 +49,6 @@
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.JavaModelException;
 
-import com.thoughtworks.xstream.XStream;
-
 /**
  * Automatically syntax checks .drl files and adds possible
  * errors or warnings to the problem list. Nominally is triggerd on save.
@@ -282,23 +278,10 @@
     private DroolsBuildMarker[] parseRuleFlowFile(IFile file) {
     	List markers = new ArrayList();
 		try {
-			String ruleflow = convertToString(file.getContents());
-			XStream stream = new XStream();
-	        stream.setMode(XStream.ID_REFERENCES);
-	        
-	        ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
-	        ClassLoader newLoader = this.getClass().getClassLoader();
-	        try {
-	            Thread.currentThread().setContextClassLoader(newLoader);
-	            Object o = stream.fromXML(ruleflow);
-	            if (o instanceof RuleFlowProcessWrapper) {
-	            	ProcessBuilder processBuilder = new ProcessBuilder(new PackageBuilder());
-	            	processBuilder.buildProcess(((RuleFlowProcessWrapper) o).getRuleFlowProcess());
-	            	markParseErrors(markers, processBuilder.getErrors());
-	            }
-	        } finally {
-	            Thread.currentThread().setContextClassLoader(oldLoader);
-	        }			
+            String input = convertToString(file.getContents());
+		    ProcessInfo processInfo =
+                DroolsEclipsePlugin.getDefault().parseProcess(input, file);
+		    markParseErrors(markers, processInfo.getErrors());  
         } catch (Exception t) {
         	String message = t.getMessage();
             if (message == null || message.trim().equals( "" )) {

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/ProcessInstanceLogicalStructureDelegate.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/ProcessInstanceLogicalStructureDelegate.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/ProcessInstanceLogicalStructureDelegate.java	2008-02-11 02:29:14 UTC (rev 18453)
@@ -0,0 +1,105 @@
+package org.drools.eclipse.debug;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.eclipse.DroolsEclipsePlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.ILogicalStructureTypeDelegate;
+import org.eclipse.debug.core.model.IValue;
+import org.eclipse.debug.core.model.IVariable;
+import org.eclipse.jdt.debug.core.IJavaArray;
+import org.eclipse.jdt.debug.core.IJavaClassType;
+import org.eclipse.jdt.debug.core.IJavaInterfaceType;
+import org.eclipse.jdt.debug.core.IJavaObject;
+import org.eclipse.jdt.debug.core.IJavaType;
+import org.eclipse.jdt.debug.core.IJavaValue;
+import org.eclipse.jdt.debug.core.IJavaVariable;
+
+/**
+ * The logical structures of a process instance.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">kris verlaenen </a>
+ */
+public class ProcessInstanceLogicalStructureDelegate implements ILogicalStructureTypeDelegate {
+
+    public boolean providesLogicalStructure(IValue value) {
+        if (!(value instanceof IJavaObject)) {
+            return false;
+        }
+        IJavaObject javaValue= (IJavaObject) value;
+        try {
+            IJavaType type= javaValue.getJavaType();
+            if (!(type instanceof IJavaClassType)) {
+                return false;
+            }
+            IJavaClassType classType = (IJavaClassType) type;
+            IJavaInterfaceType[] interfaceTypes = classType.getAllInterfaces();
+            for ( int i = 0; i < interfaceTypes.length; i++ ) {
+                if ("org.drools.process.instance.ProcessInstance".equals(interfaceTypes[i].getName())) {
+                    return true;
+                }                
+            }
+            return false;
+        } catch (DebugException e) {
+            DroolsEclipsePlugin.log(e);
+            return false;
+        }
+    }
+
+    public IValue getLogicalStructure(IValue value) throws CoreException {
+        if (!(value instanceof IJavaObject)) {
+            return null;
+        }
+        IJavaObject javaValue = (IJavaObject) value;
+        if (!providesLogicalStructure(value)) {
+            return null;
+        }
+        List<IJavaVariable> variables = new ArrayList<IJavaVariable>();
+        
+        IJavaValue id = null;
+        IJavaValue processId = null;
+        IJavaValue processName = null;
+        IVariable[] vars = value.getVariables();
+        for ( int j = 0; j < vars.length; j++ ) {
+            IVariable var = vars[j];
+            if ("id".equals(var.getName())) {
+                id = (IJavaValue)var.getValue();
+            } else if ("process".equals(var.getName())) {
+                IJavaValue process = (IJavaValue) var.getValue();
+                IVariable[] vars2 = process.getVariables();
+                for ( int k = 0; k < vars2.length; k++ ) {
+                    IVariable var2 = vars2[k];
+                    if ("id".equals(var2.getName())) {
+                        processId = (IJavaValue) var2.getValue();
+                    } else if ("name".equals(var2.getName())) {
+                        processName = (IJavaValue) var2.getValue();
+                    }
+                }
+            }
+        }
+        variables.add(new VariableWrapper("id", id));
+        variables.add(new VariableWrapper("processName", processName));
+        variables.add(new VariableWrapper("processId", processId));
+        
+        IJavaArray nodeInstances = (IJavaArray) DebugUtil.getValueByExpression("return getNodeInstances().toArray();", value);
+        List<IVariable> nodeInstancesResult = new ArrayList<IVariable>();
+        IJavaValue[] javaVals = nodeInstances.getValues();
+        for ( int i = 0; i < javaVals.length; i++ ) {
+            IJavaValue nodeInstance = javaVals[i];
+            id = null;
+            vars = nodeInstance.getVariables();
+            for ( int j = 0; j < vars.length; j++ ) {
+                IVariable var = vars[j];
+                if ("id".equals(var.getName())) {
+                    id = (IJavaValue) var.getValue();
+                }
+            }
+            nodeInstancesResult.add(new VariableWrapper("[" + id.getValueString() + "]", nodeInstance));
+        }
+        variables.add(new VariableWrapper("nodeInstances", new ObjectWrapper(nodeInstances, nodeInstancesResult.toArray(new IJavaVariable[nodeInstancesResult.size()]))));
+        
+        return new ObjectWrapper(javaValue, variables.toArray(new IJavaVariable[variables.size()]));
+    }
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/ProcessInstanceViewer.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/ProcessInstanceViewer.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/ProcessInstanceViewer.java	2008-02-11 02:29:14 UTC (rev 18453)
@@ -0,0 +1,133 @@
+package org.drools.eclipse.debug;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.drools.eclipse.DroolsEclipsePlugin;
+import org.drools.eclipse.ProcessInfo;
+import org.drools.eclipse.flow.common.editor.core.ElementWrapper;
+import org.drools.eclipse.flow.common.editor.core.ProcessWrapper;
+import org.drools.eclipse.flow.common.editor.editpart.ElementEditPart;
+import org.drools.eclipse.flow.common.editor.editpart.ProcessEditPart;
+import org.drools.eclipse.flow.common.editor.editpart.figure.ElementFigure;
+import org.drools.eclipse.flow.ruleflow.core.RuleFlowProcessWrapper;
+import org.drools.eclipse.flow.ruleflow.editor.editpart.RuleFlowEditPartFactory;
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.gef.editparts.ScalableRootEditPart;
+import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabFolder2Adapter;
+import org.eclipse.swt.custom.CTabFolderEvent;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * @author Kris Verlaenen
+ *  
+ */
+public class ProcessInstanceViewer extends ViewPart implements ISelectionListener {
+
+    private CTabFolder tabFolder;
+    private Map<String, ProcessInstanceTabItem> processInstanceTabItems = new HashMap<String, ProcessInstanceTabItem>();
+
+    public ProcessInstanceViewer() {
+    }
+
+    public void createPartControl(Composite parent) {
+        GridLayout gridLayout = new GridLayout();
+        gridLayout.numColumns = 1;
+        parent.setLayout(gridLayout);
+
+        tabFolder = new CTabFolder(parent, SWT.CLOSE);
+        tabFolder.setBorderVisible(true);
+        GridData gridData = new GridData();
+        gridData.grabExcessVerticalSpace = true;
+        gridData.grabExcessHorizontalSpace = true;
+        gridData.horizontalAlignment = GridData.FILL;
+        gridData.verticalAlignment = GridData.FILL;
+        tabFolder.setLayoutData(gridData);
+    }
+
+    public void setFocus() {
+        // Do nothing
+    }
+    
+    private class ProcessInstanceTabItem {
+        
+        private GraphicalViewer graphicalViewer;
+        private CTabItem tabItem;
+        
+        public ProcessInstanceTabItem(CTabFolder folder, String processInstanceId, String processId, List<String> nodeIds) {
+            tabItem = new CTabItem(folder, SWT.NONE);
+            ProcessInfo processInfo = DroolsEclipsePlugin.getDefault().getProcessInfo(processId);
+            if (processInfo == null) {
+                throw new IllegalArgumentException(
+                    "Could not find process with id " + processId);
+            }
+            tabItem.setText(processInstanceId + " = " + processInfo.getProcess().getName() + "[" + processInfo.getProcessId() + "]");
+
+            Composite composite = new Composite(folder, SWT.NONE);
+            composite.setLayout(new FillLayout());
+            tabItem.setControl(composite);
+            
+            graphicalViewer = new ScrollingGraphicalViewer();
+            graphicalViewer.createControl(composite);
+            graphicalViewer.getControl().setBackground(ColorConstants.listBackground);
+            graphicalViewer.setRootEditPart(new ScalableRootEditPart());
+            graphicalViewer.setEditPartFactory(new RuleFlowEditPartFactory());
+            setProcess(processInfo);
+            for (String nodeId: nodeIds) {
+            	handleNodeInstanceSelection(nodeId);
+            }            
+        }
+        
+        private void setProcess(ProcessInfo processInfo) {
+            ProcessWrapper processWrapper = processInfo.getProcessWrapper();
+            graphicalViewer.setContents(
+                processWrapper == null ? new RuleFlowProcessWrapper() : processWrapper);
+        }
+
+        private void handleNodeInstanceSelection(String nodeId) {
+            boolean found = false;
+            Iterator iterator = ((ProcessEditPart) graphicalViewer.getContents()).getChildren().iterator();
+            while (iterator.hasNext()) {
+                ElementEditPart elementEditPart = (ElementEditPart) iterator.next();
+                if (((ElementWrapper) elementEditPart.getModel()).getId().equals(nodeId)) {
+                    ((ElementFigure) elementEditPart.getFigure()).setSelected(true);
+                    found = true;
+                    break;
+                }
+            }
+            if (!found) {
+                throw new IllegalArgumentException(
+                    "Could not find node with id " + nodeId);
+            }
+        }
+        
+        public CTabItem getTabItem() {
+            return tabItem;
+        }
+    }
+
+    public void showProcessInstance(String processInstanceId, String processId, List nodeIds) {
+        processInstanceTabItems.put(processInstanceId,
+            new ProcessInstanceTabItem(tabFolder, processInstanceId, processId, nodeIds));
+    }
+
+    public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+        System.out.println("Selection changed: " + selection);
+    }
+
+}
+

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/ProcessInstancesView.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/ProcessInstancesView.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/ProcessInstancesView.java	2008-02-11 02:29:14 UTC (rev 18453)
@@ -0,0 +1,99 @@
+package org.drools.eclipse.debug;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.eclipse.DroolsEclipsePlugin;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.IValue;
+import org.eclipse.debug.core.model.IVariable;
+import org.eclipse.jdt.debug.core.IJavaArray;
+import org.eclipse.jdt.debug.core.IJavaValue;
+import org.eclipse.jdt.debug.core.IJavaVariable;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.IContentProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PartInitException;
+
+/**
+ * The Process instances view.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">kris verlaenen </a>
+ */
+public class ProcessInstancesView extends DroolsDebugEventHandlerView {
+
+    public ProcessInstancesView() {
+        setAction(DOUBLE_CLICK_ACTION, new DoubleClickAction());
+    }
+    
+    protected IContentProvider createContentProvider() {
+        ProcessInstancesViewContentProvider contentProvider = new ProcessInstancesViewContentProvider(this);
+        return contentProvider;
+    }
+    
+    private class DoubleClickAction extends Action {
+        public void run() {
+            IViewPart view = getSite().getPage().findView("org.drools.eclipse.debug.ProcessInstanceViewer");
+            if (view == null) {
+                try {
+                    view = getSite().getPage().showView("org.drools.eclipse.debug.ProcessInstanceViewer");
+                } catch (PartInitException e) {
+                    DroolsEclipsePlugin.log(e);
+                }
+            }
+            if (view != null) {
+                ISelection selection = getViewer().getSelection();
+                if (selection instanceof StructuredSelection) {
+                    Object selected = ((StructuredSelection) selection).getFirstElement();
+                    if (selected instanceof IJavaVariable) {
+                        try {
+                            openProcessInstance(((IJavaVariable) selected).getValue(), view);
+                        } catch (DebugException e) {
+                            DroolsEclipsePlugin.log(e);
+                        }
+                    }
+                }
+            }
+        }
+        
+        private void openProcessInstance(IValue processInstance, IViewPart view) throws DebugException {
+            String id = null;
+            String processId = null;
+            IVariable[] vars = processInstance.getVariables();
+            for ( int j = 0; j < vars.length; j++ ) {
+                IVariable var = vars[j];
+                if ("id".equals(var.getName())) {
+                    id = ((IJavaValue)var.getValue()).getValueString();
+                } else if ("process".equals(var.getName())) {
+                    IJavaValue process = (IJavaValue) var.getValue();
+                    IVariable[] vars2 = process.getVariables();
+                    for ( int k = 0; k < vars2.length; k++ ) {
+                        IVariable var2 = vars2[k];
+                        if ("id".equals(var2.getName())) {
+                            processId = ((IJavaValue) var2.getValue()).getValueString();
+                            break;
+                        }
+                    }
+                }
+            }
+            List<String> nodeIds = new ArrayList<String>();
+            IJavaArray nodeInstances = (IJavaArray) DebugUtil.getValueByExpression("return getNodeInstances().toArray();", processInstance);
+            IJavaValue[] javaVals = nodeInstances.getValues();
+            for ( int i = 0; i < javaVals.length; i++ ) {
+                IJavaValue nodeInstance = javaVals[i];
+                String nodeId = null;
+                vars = nodeInstance.getVariables();
+                for ( int j = 0; j < vars.length; j++ ) {
+                    IVariable var = vars[j];
+                    if ("nodeId".equals(var.getName())) {
+                        nodeId = ((IJavaValue) var.getValue()).getValueString();
+                    }
+                }
+                nodeIds.add(nodeId);
+            }
+            ((ProcessInstanceViewer) view).showProcessInstance(id, processId, nodeIds);
+        }
+    }
+}

Added: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/ProcessInstancesViewContentProvider.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/ProcessInstancesViewContentProvider.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/debug/ProcessInstancesViewContentProvider.java	2008-02-11 02:29:14 UTC (rev 18453)
@@ -0,0 +1,82 @@
+package org.drools.eclipse.debug;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.drools.eclipse.DroolsEclipsePlugin;
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.IValue;
+import org.eclipse.debug.core.model.IVariable;
+import org.eclipse.jdt.debug.core.IJavaArray;
+import org.eclipse.jdt.debug.core.IJavaObject;
+import org.eclipse.jdt.debug.core.IJavaValue;
+
+/**
+ * The process instances view content provider.
+ * 
+ * @author <a href="mailto:kris_verlaenen at hotmail.com">kris verlaenen </a>
+ */
+public class ProcessInstancesViewContentProvider extends DroolsDebugViewContentProvider {
+
+    private DroolsDebugEventHandlerView view;
+    
+    public ProcessInstancesViewContentProvider(DroolsDebugEventHandlerView view) {
+        this.view = view;
+    }
+    
+    protected String getEmptyString() {
+    	return "The selected working memory has no process instances.";
+    }
+
+    public Object[] getChildren(Object obj) {
+        try {
+            IVariable[] instances = null;
+            if (obj != null && obj instanceof IJavaObject
+                    && "org.drools.reteoo.ReteooStatefulSession".equals(
+                        ((IJavaObject) obj).getReferenceTypeName())) {
+                instances = getProcessInstances((IJavaObject) obj);
+            } else if (obj instanceof IVariable) {
+            	if (view.isShowLogicalStructure()) {
+            		IValue value = getLogicalValue(((IVariable) obj).getValue(), new ArrayList<IVariable>());
+            		instances = value.getVariables();
+                }
+            	if (instances == null) {
+            	    instances = ((IVariable) obj).getValue().getVariables();
+                }
+            }
+            if (instances == null) {
+                return new Object[0];
+            } else {
+                cache(obj, instances);
+                return instances;
+            }
+        } catch (DebugException e) {
+            DroolsEclipsePlugin.log(e);
+            return new Object[0];
+        }
+    }
+    
+    private IVariable[] getProcessInstances(IJavaObject stackObj) throws DebugException {
+        IValue objects = DebugUtil.getValueByExpression("return getProcessInstances().toArray();", stackObj);
+        if (objects instanceof IJavaArray) {
+            IJavaArray array = (IJavaArray) objects;
+            List<IVariable> result = new ArrayList<IVariable>();
+            IJavaValue[] javaVals = array.getValues();
+            for ( int i = 0; i < javaVals.length; i++ ) {
+                IJavaValue processInstance = javaVals[i];
+                String id = null;
+                IVariable[] vars = processInstance.getVariables();
+                for ( int j = 0; j < vars.length; j++ ) {
+                    IVariable var = vars[j];
+                    if ("id".equals(var.getName())) {
+                        id = var.getValue().getValueString();
+                    }
+                }
+                result.add(new VariableWrapper("[" + id + "]", processInstance));
+            }
+            return result.toArray(new IVariable[result.size()]);
+        }
+        return null;
+    }
+    
+}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/datatype/DefaultDataTypeRegistry.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/datatype/DefaultDataTypeRegistry.java	2008-02-11 02:22:36 UTC (rev 18452)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/datatype/DefaultDataTypeRegistry.java	2008-02-11 02:29:14 UTC (rev 18453)
@@ -18,7 +18,9 @@
 import org.drools.eclipse.flow.common.datatype.impl.DataTypeRegistryImpl;
 import org.drools.eclipse.flow.common.view.datatype.editor.impl.BooleanEditor;
 import org.drools.eclipse.flow.common.view.datatype.editor.impl.EmptyEditor;
+import org.drools.eclipse.flow.common.view.datatype.editor.impl.FloatEditor;
 import org.drools.eclipse.flow.common.view.datatype.editor.impl.IntegerEditor;
+import org.drools.eclipse.flow.common.view.datatype.editor.impl.StringEditor;
 import org.drools.process.core.datatype.DataTypeFactory;
 import org.drools.process.core.datatype.impl.InstanceDataTypeFactory;
 import org.drools.process.core.datatype.impl.type.BooleanDataType;
@@ -52,12 +54,12 @@
 		registerVariableDataType(IntegerDataType.class,
 				new InstanceDataTypeFactory(IntegerDataType.class), "Integer",
 				IntegerEditor.class, EmptyEditor.class);
-//		registerVariableDataType(FloatDataType.class,
-//				new InstanceDataTypeFactory(FloatDataType.class), "Float",
-//				FloatEditor.class, EmptyEditor.class);
-//		registerVariableDataType(StringDataType.class,
-//				new InstanceDataTypeFactory(StringDataType.class), "String",
-//				StringEditor.class, EmptyEditor.class);
+		registerVariableDataType(FloatDataType.class,
+				new InstanceDataTypeFactory(FloatDataType.class), "Float",
+				FloatEditor.class, EmptyEditor.class);
+		registerVariableDataType(StringDataType.class,
+				new InstanceDataTypeFactory(StringDataType.class), "String",
+				StringEditor.class, EmptyEditor.class);
 	}
 
 	public static void registerVariableDataType(Class type,

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/core/ProcessWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/core/ProcessWrapper.java	2008-02-11 02:22:36 UTC (rev 18452)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/core/ProcessWrapper.java	2008-02-11 02:29:14 UTC (rev 18453)
@@ -25,6 +25,8 @@
 import java.util.List;
 import java.util.Map;
 
+import org.drools.eclipse.flow.common.view.property.ListPropertyDescriptor;
+import org.drools.eclipse.flow.ruleflow.view.property.variable.VariableListCellEditor;
 import org.drools.process.core.Process;
 import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
 import org.eclipse.ui.views.properties.IPropertyDescriptor;
@@ -52,7 +54,8 @@
     public static final String ID = "id";
     public static final String PACKAGE_NAME = "packageName";
     public static final String ROUTER_LAYOUT = "routerLayout";
-    
+    public static final String VARIABLES = "variables";
+     
     static {
         descriptors = new IPropertyDescriptor[] {
             new TextPropertyDescriptor(NAME, "Name"),
@@ -61,6 +64,8 @@
             new TextPropertyDescriptor(PACKAGE_NAME, "Package"),
             new ComboBoxPropertyDescriptor(ROUTER_LAYOUT, "Connection Layout", 
                 new String[] { "Manual", "Manhatten", "Shortest Path" }),
+            new ListPropertyDescriptor(VARIABLES, "Variables",
+                VariableListCellEditor.class),
         };
     }
     
@@ -193,6 +198,9 @@
         if (ROUTER_LAYOUT.equals(id)) {
             return routerLayout;
         }
+        if (VARIABLES.equals(id)) {
+            return getProcess().getVariables();
+        }
         return null;
     }
 
@@ -216,6 +224,9 @@
         if (ROUTER_LAYOUT.equals(id)) {
             setRouterLayout(null);
         }
+        if (VARIABLES.equals(id)) {
+            getProcess().setVariables(new ArrayList());
+        }
     }
 
     public void setPropertyValue(Object id, Object value) {
@@ -229,6 +240,8 @@
             setPackageName((String) value);
         } else if (ROUTER_LAYOUT.equals(id)) {
             setRouterLayout((Integer) value);
+        } else if (VARIABLES.equals(id)) {
+            getProcess().setVariables((List) value);
         }
     }
 }

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/policy/ConnectionEditPolicy.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/policy/ConnectionEditPolicy.java	2008-02-11 02:22:36 UTC (rev 18452)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/common/editor/policy/ConnectionEditPolicy.java	2008-02-11 02:29:14 UTC (rev 18453)
@@ -70,6 +70,7 @@
     }
 
     protected Command getSplitTransitionCommand(Request request) {
+        // TODO error when using this split, nodes do not know connections
     	if (elementConnectionFactory == null) {
     		throw new IllegalStateException("DefaultElementConnectionFactory is null");
     	}

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/NodeWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/NodeWrapper.java	2008-02-11 02:22:36 UTC (rev 18452)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/NodeWrapper.java	2008-02-11 02:29:14 UTC (rev 18453)
@@ -35,7 +35,7 @@
     
     public String getId() {
         long id = getNode().getId();
-        return id == -1 ? null : getNode().getId() + "-Wrapper";
+        return id == -1 ? null : getNode().getId() + "";
     }
 
     public String getName() {

Modified: labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleFlowProcessWrapper.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleFlowProcessWrapper.java	2008-02-11 02:22:36 UTC (rev 18452)
+++ labs/jbossrules/trunk/drools-eclipse/drools-eclipse-plugin/src/main/java/org/drools/eclipse/flow/ruleflow/core/RuleFlowProcessWrapper.java	2008-02-11 02:29:14 UTC (rev 18453)
@@ -19,7 +19,6 @@
 import org.drools.eclipse.flow.common.editor.core.ProcessWrapper;
 import org.drools.process.core.Process;
 import org.drools.ruleflow.core.RuleFlowProcess;
-import org.drools.workflow.core.WorkflowProcess;
 
 /**
  * Wrapper for a RuleFlow process.
@@ -30,18 +29,8 @@
 
 	private static final long serialVersionUID = 400L;
 
-//	private static IPropertyDescriptor[] descriptors;
-//
-//    public static final String VARIABLES = "variables";
-//    static {
-//        descriptors = new IPropertyDescriptor[ProcessWrapper.descriptors.length + 1];
-//        System.arraycopy(ProcessWrapper.descriptors, 0, descriptors, 0, ProcessWrapper.descriptors.length);
-//        descriptors[descriptors.length - 1] = 
-//            new ListPropertyDescriptor(VARIABLES, "Variables", VariableListCellEditor.class);
-//   }
-    
-    public WorkflowProcess getRuleFlowProcess() {
-        return (WorkflowProcess) getProcess();
+    public RuleFlowProcess getRuleFlowProcess() {
+        return (RuleFlowProcess) getProcess();
     }
     
     protected Process createProcess() {
@@ -56,30 +45,4 @@
         getRuleFlowProcess().removeNode(((NodeWrapper) element).getNode()); 
     }
     
-//    public IPropertyDescriptor[] getPropertyDescriptors() {
-//        return descriptors;
-//    }
-//
-//    public Object getPropertyValue(Object id) {
-//        if (VARIABLES.equals(id)) {
-//            return getRuleFlowProcess().getVariables();
-//        }
-//        return super.getPropertyValue(id);
-//    }
-//
-//    public void resetPropertyValue(Object id) {
-//        if (VARIABLES.equals(id)) {
-//            getRuleFlowProcess().setVariables(new ArrayList());
-//        } else {
-//            super.resetPropertyValue(id);
-//        }
-//    }
-//
-//    public void setPropertyValue(Object id, Object value) {
-//        if (VARIABLES.equals(id)) {
-//            getRuleFlowProcess().setVariables((List) value);
-//        } else {
-//            super.setPropertyValue(id, value);
-//        }
-//    }
 }




More information about the jboss-svn-commits mailing list