[jbpm-commits] JBoss JBPM SVN: r6279 - in jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal: wire and 1 other directory.

do-not-reply at jboss.org do-not-reply at jboss.org
Mon Apr 26 13:01:16 EDT 2010


Author: alex.guizar at jboss.com
Date: 2010-04-26 13:01:15 -0400 (Mon, 26 Apr 2010)
New Revision: 6279

Modified:
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/env/BasicEnvironment.java
   jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/WireContext.java
Log:
JBPM-2844: refine the manner in which WireContext delegates a get(Class) call to the environment

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/env/BasicEnvironment.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/env/BasicEnvironment.java	2010-04-24 00:18:37 UTC (rev 6278)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/env/BasicEnvironment.java	2010-04-26 17:01:15 UTC (rev 6279)
@@ -21,14 +21,12 @@
  */
 package org.jbpm.pvm.internal.env;
 
-import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.Map;
 
 import org.jbpm.api.JbpmException;
 import org.jbpm.internal.log.Log;
 
-
 /**
  * @author Tom Baeyens
  */
@@ -39,19 +37,11 @@
   private static final Log log = Log.getLog(BasicEnvironment.class.getName()); 
 
   protected String authenticatedUserId;
-  protected Map<String, Context> contexts;
-  protected ArrayList<String> defaultSearchOrderList;
-  protected String[] defaultSearchOrder;
+  protected Map<String, Context> contexts = new LinkedHashMap<String, Context>();
   protected Throwable exception;
 
   protected transient ClassLoader classLoader;
 
-  public BasicEnvironment() {
-    contexts = new HashMap<String, Context>();
-    defaultSearchOrderList = new ArrayList<String>();
-    defaultSearchOrder = null;
-  }
-
   // context methods ////////////////////////////////////////////////////////////
 
   public Context getContext(String contextName) {
@@ -59,11 +49,7 @@
   }
 
   public void setContext(Context context) {
-    String key = context.getName();
-    if (contexts.put(key, context)==null) {
-      defaultSearchOrderList.add(key);
-    }
-    defaultSearchOrder = null;
+    contexts.put(context.getName(), context);
   }
 
   public Context removeContext(Context context) {
@@ -71,12 +57,7 @@
   }
   
   public Context removeContext(String contextName) {
-    Context removedContext = contexts.remove(contextName);
-    if (removedContext!=null) {
-      defaultSearchOrderList.remove(contextName);
-      defaultSearchOrder = null;
-    }
-    return removedContext;
+    return contexts.remove(contextName);
   }
 
   public Context getEnvironmentFactoryContext() {
@@ -117,33 +98,51 @@
     if (searchOrder==null) {
       searchOrder = getDefaultSearchOrder();
     }
-    for (int i=0; i<searchOrder.length; i++){
-      Context context = contexts.get(searchOrder[i]);
-      if (context.has(name)) {
-        return context.get(name);
-      }
+    for (String contextName : searchOrder) {
+      Context context = contexts.get(contextName);
+      if (context.has(name)) return context.get(name);
     }
     return null;
   }
 
   public <T> T get(Class<T> type) {
-    return get(type, null);
+    return get(type, (String[]) null);
   }
 
   public <T> T get(Class<T> type, String[] searchOrder) {
     if (searchOrder==null) {
       searchOrder = getDefaultSearchOrder();
     }
-    for (int i=0; i<searchOrder.length; i++){
-      Context context = contexts.get(searchOrder[i]);
-      T o = context.get(type);
-      if (o!=null) {
-        return o;
+    for (String contextName : searchOrder) {
+      Context context = contexts.get(contextName);
+      T object = context.get(type);
+      if (object != null) return object;
+    }
+    return null;
+  }
+  
+  /**
+   * searches an object based on type in the default search order.
+   * if this environment contains the given context, the search skips
+   * contexts registered after it.
+   */
+  public <T> T get(Class<T> type, Context requester) {
+    String[] searchOrder = getDefaultSearchOrder();
+    int searchPosition = 0;
+    for (int i = 0; i < searchOrder.length; i++) {
+      if (contexts.get(searchOrder[i]) == requester) {
+        searchPosition = i + 1;
+        break;
       }
     }
+    for (int i = searchPosition; i < searchOrder.length; i++) {
+      Context context = contexts.get(searchOrder[i]);
+      T object = context.get(type);
+      if (object != null) return object;
+    }
     return null;
   }
-  
+
   // close ////////////////////////////////////////////////////////////////////
 
   public void close() {
@@ -158,13 +157,14 @@
   // private methods //////////////////////////////////////////////////////////
 
   protected String[] getDefaultSearchOrder() {
-    if (defaultSearchOrder==null) {
-      int size = defaultSearchOrderList.size();
-      defaultSearchOrder = (String[]) new String[size];
-      for (int i=0; i<size; i++) {
-        defaultSearchOrder[i] = defaultSearchOrderList.get(size-1-i);
-      }
+    int size = contexts.size();
+    String[] defaultSearchOrder = new String[size];
+
+    int index = size;
+    for (String contextName : contexts.keySet()) {
+      defaultSearchOrder[--index] = contextName;
     }
+
     return defaultSearchOrder;
   }
 }

Modified: jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/WireContext.java
===================================================================
--- jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/WireContext.java	2010-04-24 00:18:37 UTC (rev 6278)
+++ jbpm4/trunk/modules/pvm/src/main/java/org/jbpm/pvm/internal/wire/WireContext.java	2010-04-26 17:01:15 UTC (rev 6279)
@@ -31,6 +31,7 @@
 
 import org.jbpm.api.activity.ActivityBehaviour;
 import org.jbpm.internal.log.Log;
+import org.jbpm.pvm.internal.env.BasicEnvironment;
 import org.jbpm.pvm.internal.env.Context;
 import org.jbpm.pvm.internal.env.EnvironmentImpl;
 import org.jbpm.pvm.internal.model.ProcessElementImpl;
@@ -707,26 +708,15 @@
     }
     // check if we can find it in the environment (if one is available)
     EnvironmentImpl environment = EnvironmentImpl.getCurrent();
-    if (environment != null) {
-      Context processEngineContext = environment.getContext(CONTEXTNAME_PROCESS_ENGINE);
-      if (processEngineContext != this) {
-        Context transactionContext = environment.getContext(CONTEXTNAME_TRANSACTION);
-        if (transactionContext != this) {
-          return environment.get(type);
-        }
-        // try process engine context
-        if (processEngineContext != null) {
-          return processEngineContext.get(type);
-        }
-      }
+    if (environment instanceof BasicEnvironment) {
+      BasicEnvironment basicEnvironment = (BasicEnvironment) environment;
+      return basicEnvironment.get(type, this);
     }
     return null;
   }
   
   protected boolean hasException(String objectName) {
-    return ( (exceptions!=null)
-             && (exceptions.containsKey(objectName))
-           );
+    return exceptions!=null && exceptions.containsKey(objectName);
   }
   
   protected void addException(Descriptor descriptor, Exception exception) {



More information about the jbpm-commits mailing list