summaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
authorrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2009-03-18 17:21:53 +0000
committerrfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68>2009-03-18 17:21:53 +0000
commit1ef444625452eb2dc45dee6d5a388a91c25cea69 (patch)
tree9a3c25f7df583b0dd4a47a278240da30c494b06a /java
parentb00d3430f73cd2190303e6f70deb0bf55ad65629 (diff)
Add a method to create new instances of a utility
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@755659 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java')
-rw-r--r--java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultUtilityExtensionPoint.java98
-rw-r--r--java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/UtilityExtensionPoint.java10
2 files changed, 62 insertions, 46 deletions
diff --git a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultUtilityExtensionPoint.java b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultUtilityExtensionPoint.java
index 07b058ebcc..fd85c5afa0 100644
--- a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultUtilityExtensionPoint.java
+++ b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/DefaultUtilityExtensionPoint.java
@@ -23,10 +23,10 @@ import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
import org.apache.tuscany.sca.extensibility.ServiceDeclaration;
import org.apache.tuscany.sca.extensibility.ServiceDiscovery;
@@ -37,7 +37,7 @@ import org.apache.tuscany.sca.extensibility.ServiceDiscovery;
* @version $Rev$ $Date$
*/
public class DefaultUtilityExtensionPoint implements UtilityExtensionPoint {
- private Map<Class<?>, Object> utilities = new HashMap<Class<?>, Object>();
+ private Map<Class<?>, Object> utilities = new ConcurrentHashMap<Class<?>, Object>();
private ExtensionPointRegistry extensionPoints;
@@ -95,50 +95,7 @@ public class DefaultUtilityExtensionPoint implements UtilityExtensionPoint {
* @throws IllegalArgumentException if utilityType is null
*/
public <T> T getUtility(Class<T> utilityType) {
- if (utilityType == null) {
- throw new IllegalArgumentException("Cannot lookup Service of type null");
- }
-
- Object utility = utilities.get(utilityType);
- if (utility == null) {
-
- // Dynamically load a utility class declared under META-INF/services/"utilityType"
- try {
- ServiceDeclaration utilityDeclaration =ServiceDiscovery.getInstance().getFirstServiceDeclaration(utilityType.getName());
- if (utilityDeclaration != null) {
- Class<?> utilityClass = utilityDeclaration.loadClass();
-
- // Construct the utility
- Constructor<?>[] constructors = utilityClass.getConstructors();
- Constructor<?> constructor = getConstructor(constructors, new Class<?>[] {ExtensionPointRegistry.class});
- if (constructor != null) {
- utility = constructor.newInstance(extensionPoints);
- } else {
- constructor = getConstructor(constructors, new Class<?>[] {});
- if (constructor != null) {
- utility = constructor.newInstance();
- } else {
- throw new IllegalArgumentException(
- "No valid constructor is found for " + utilityClass);
- }
- }
-
- // Cache the loaded utility
- addUtility(utility);
- }
- } catch (InvocationTargetException e) {
- throw new IllegalArgumentException(e);
- } catch (IOException e) {
- throw new IllegalArgumentException(e);
- } catch (ClassNotFoundException e) {
- throw new IllegalArgumentException(e);
- } catch (InstantiationException e) {
- throw new IllegalArgumentException(e);
- } catch (IllegalAccessException e) {
- throw new IllegalArgumentException(e);
- }
- }
- return utilityType.cast(utility);
+ return getUtility(utilityType, false);
}
/**
@@ -183,4 +140,53 @@ public class DefaultUtilityExtensionPoint implements UtilityExtensionPoint {
}
}
+ public <T> T getUtility(Class<T> utilityType, boolean newInstance) {
+ if (utilityType == null) {
+ throw new IllegalArgumentException("Cannot lookup Service of type null");
+ }
+
+ Object utility = null;
+ if (!newInstance) {
+ utility = utilities.get(utilityType);
+ }
+ if (utility == null) {
+
+ // Dynamically load a utility class declared under META-INF/services/"utilityType"
+ try {
+ ServiceDeclaration utilityDeclaration =ServiceDiscovery.getInstance().getFirstServiceDeclaration(utilityType.getName());
+ if (utilityDeclaration != null) {
+ Class<?> utilityClass = utilityDeclaration.loadClass();
+
+ // Construct the utility
+ Constructor<?>[] constructors = utilityClass.getConstructors();
+ Constructor<?> constructor = getConstructor(constructors, new Class<?>[] {ExtensionPointRegistry.class});
+ if (constructor != null) {
+ utility = constructor.newInstance(extensionPoints);
+ } else {
+ constructor = getConstructor(constructors, new Class<?>[] {});
+ if (constructor != null) {
+ utility = constructor.newInstance();
+ } else {
+ throw new IllegalArgumentException(
+ "No valid constructor is found for " + utilityClass);
+ }
+ }
+
+ // Cache the loaded utility
+ addUtility(utility);
+ }
+ } catch (InvocationTargetException e) {
+ throw new IllegalArgumentException(e);
+ } catch (IOException e) {
+ throw new IllegalArgumentException(e);
+ } catch (ClassNotFoundException e) {
+ throw new IllegalArgumentException(e);
+ } catch (InstantiationException e) {
+ throw new IllegalArgumentException(e);
+ } catch (IllegalAccessException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+ return utilityType.cast(utility); }
+
}
diff --git a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/UtilityExtensionPoint.java b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/UtilityExtensionPoint.java
index 6b14b95666..9804234850 100644
--- a/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/UtilityExtensionPoint.java
+++ b/java/sca/modules/extensibility/src/main/java/org/apache/tuscany/sca/core/UtilityExtensionPoint.java
@@ -45,6 +45,16 @@ public interface UtilityExtensionPoint {
<T> T getUtility(Class<T> utilityType);
/**
+ * Get a new instance of the utility by the interface
+ * @param utilityType The lookup key (utility interface)
+ * @param newInstance A new instance is required
+ * @return The instance of the utility
+ *
+ * @throws IllegalArgumentException if utilityType is null
+ */
+ <T> T getUtility(Class<T> utilityType, boolean newInstance);
+
+ /**
* Remove a utility
* @param utility The utility to remove
*