Author: adrianc
Date: Sat Aug 30 14:47:53 2014
New Revision: 1621466
URL: http://svn.apache.org/r1621466
Log:
Some work on ServiceDispatcher.java:
1. Remove Javolution.
2. Replace DCL design pattern with ConcurrentHashMap.
Modified:
ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceDispatcher.java
Modified:
ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceDispatcher.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceDispatcher.java?rev=1621466&r1=1621465&r2=1621466&view=diff
==============================================================================
--- ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceDispatcher.java
(original)
+++ ofbiz/trunk/framework/service/src/org/ofbiz/service/ServiceDispatcher.java
Sat Aug 30 14:47:53 2014
@@ -18,15 +18,15 @@
*******************************************************************************/
package org.ofbiz.service;
+import java.util.HashMap;
+import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import javax.transaction.Transaction;
-import javolution.util.FastList;
-import javolution.util.FastMap;
-
import org.ofbiz.base.config.GenericConfigException;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.GeneralRuntimeException;
@@ -46,7 +46,7 @@ import org.ofbiz.security.Security;
import org.ofbiz.security.SecurityConfigurationException;
import org.ofbiz.security.SecurityFactory;
import org.ofbiz.service.config.ServiceConfigUtil;
-import org.ofbiz.service.config.model.*;
+import org.ofbiz.service.config.model.StartupService;
import org.ofbiz.service.eca.ServiceEcaRule;
import org.ofbiz.service.eca.ServiceEcaUtil;
import org.ofbiz.service.engine.GenericEngine;
@@ -69,7 +69,7 @@ public class ServiceDispatcher {
public static final int LOCK_RETRIES = 3;
protected static final Map<RunningService, ServiceDispatcher> runLog = new
ConcurrentLinkedHashMap.Builder<RunningService,
ServiceDispatcher>().maximumWeightedCapacity(lruLogSize).build();
- protected static Map<String, ServiceDispatcher> dispatchers =
FastMap.newInstance();
+ protected static ConcurrentHashMap<String, ServiceDispatcher> dispatchers
= new ConcurrentHashMap<String, ServiceDispatcher>();
// FIXME: These fields are not thread-safe. They are modified by
EntityDataLoadContainer.
// We need a better design - like have this class query
EntityDataLoadContainer if data is being loaded.
protected static boolean enableJM = true;
@@ -79,8 +79,8 @@ public class ServiceDispatcher {
protected Delegator delegator = null;
protected GenericEngineFactory factory = null;
protected Security security = null;
- protected Map<String, DispatchContext> localContext = null;
- protected Map<String, List<GenericServiceCallback>> callbacks = null;
+ protected Map<String, DispatchContext> localContext = new HashMap<String,
DispatchContext>();
+ protected Map<String, List<GenericServiceCallback>> callbacks = new
HashMap<String, List<GenericServiceCallback>>();
protected JobManager jm = null;
protected JmsListenerFactory jlf = null;
@@ -90,8 +90,6 @@ public class ServiceDispatcher {
ServiceEcaUtil.readConfig();
this.delegator = delegator;
- this.localContext = FastMap.newInstance();
- this.callbacks = FastMap.newInstance();
if (delegator != null) {
try {
@@ -165,14 +163,11 @@ public class ServiceDispatcher {
String dispatcherKey = delegator != null ?
delegator.getDelegatorName() : "null";
sd = dispatchers.get(dispatcherKey);
if (sd == null) {
- synchronized (ServiceDispatcher.class) {
- if (Debug.verboseOn())
Debug.logVerbose("[ServiceDispatcher.getInstance] : No instance found (" +
dispatcherKey + ").", module);
- sd = dispatchers.get(dispatcherKey);
- if (sd == null) {
- sd = new ServiceDispatcher(delegator);
- dispatchers.put(dispatcherKey, sd);
- }
- }
+ if (Debug.verboseOn())
+ Debug.logVerbose("[ServiceDispatcher.getInstance] : No
instance found (" + dispatcherKey + ").", module);
+ sd = new ServiceDispatcher(delegator);
+ dispatchers.putIfAbsent(dispatcherKey, sd);
+ sd = dispatchers.get(dispatcherKey);
}
return sd;
}
@@ -204,7 +199,7 @@ public class ServiceDispatcher {
public synchronized void registerCallback(String serviceName,
GenericServiceCallback cb) {
List<GenericServiceCallback> callBackList = callbacks.get(serviceName);
if (callBackList == null) {
- callBackList = FastList.newInstance();
+ callBackList = new LinkedList<GenericServiceCallback>();
}
callBackList.add(cb);
callbacks.put(serviceName, callBackList);
@@ -254,7 +249,7 @@ public class ServiceDispatcher {
*/
public Map<String, Object> runSync(String localName, ModelService
modelService, Map<String, ? extends Object> params, boolean validateOut) throws
ServiceAuthException, ServiceValidationException, GenericServiceException {
long serviceStartTime = System.currentTimeMillis();
- Map<String, Object> result = FastMap.newInstance();
+ Map<String, Object> result = new HashMap<String, Object>();
ServiceSemaphore lock = null;
Map<String, List<ServiceEcaRule>> eventMap = null;
Map<String, Object> ecaContext = null;
@@ -277,7 +272,7 @@ public class ServiceDispatcher {
"/" + modelService.invoke + "] (" +
modelService.engineName + ")", module);
}
- Map<String, Object> context = FastMap.newInstance();
+ Map<String, Object> context = new HashMap<String, Object>();
if (params != null) {
context.putAll(params);
}
@@ -451,7 +446,7 @@ public class ServiceDispatcher {
needsLockRetry = true;
// reset state variables
- result = FastMap.newInstance();
+ result = new HashMap<String, Object>();
isFailure = false;
isError = false;
@@ -470,7 +465,7 @@ public class ServiceDispatcher {
} while (needsLockRetry && lockRetriesRemaining > 0);
// create a new context with the results to pass to ECA
services; necessary because caller may reuse this context
- ecaContext = FastMap.newInstance();
+ ecaContext = new HashMap<String, Object>();
ecaContext.putAll(context);
// copy all results: don't worry parameters that aren't
allowed won't be passed to the ECA services
ecaContext.putAll(result);
@@ -629,12 +624,12 @@ public class ServiceDispatcher {
"] (" + service.engineName + ")", module);
}
- Map<String, Object> context = FastMap.newInstance();
+ Map<String, Object> context = new HashMap<String, Object>();
if (params != null) {
context.putAll(params);
}
// setup the result map
- Map<String, Object> result = FastMap.newInstance();
+ Map<String, Object> result = new HashMap<String, Object>();
boolean isFailure = false;
boolean isError = false;
@@ -946,8 +941,7 @@ public class ServiceDispatcher {
// gets a value object from name/password pair
private GenericValue getLoginObject(String service, String localName,
String username, String password, Locale locale) throws GenericServiceException
{
- Map<String, Object> context = FastMap.newInstance();
- context.putAll(UtilMisc.toMap("login.username", username,
"login.password", password, "isServiceAuth", true, "locale", locale));
+ Map<String, Object> context = UtilMisc.toMap("login.username",
username, "login.password", password, "isServiceAuth", true, "locale", locale);
if (Debug.verboseOn())
Debug.logVerbose("[ServiceDispathcer.authenticate] : Invoking UserLogin
Service", module);