[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