From 1ef444625452eb2dc45dee6d5a388a91c25cea69 Mon Sep 17 00:00:00 2001 From: rfeng Date: Wed, 18 Mar 2009 17:21:53 +0000 Subject: 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 --- .../sca/core/DefaultUtilityExtensionPoint.java | 98 ++++++++++++---------- .../tuscany/sca/core/UtilityExtensionPoint.java | 10 +++ 2 files changed, 62 insertions(+), 46 deletions(-) (limited to 'java') 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, Object> utilities = new HashMap, Object>(); + private Map, Object> utilities = new ConcurrentHashMap, Object>(); private ExtensionPointRegistry extensionPoints; @@ -95,50 +95,7 @@ public class DefaultUtilityExtensionPoint implements UtilityExtensionPoint { * @throws IllegalArgumentException if utilityType is null */ public T getUtility(Class 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 getUtility(Class 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 @@ -44,6 +44,16 @@ public interface UtilityExtensionPoint { */ T getUtility(Class 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 getUtility(Class utilityType, boolean newInstance); + /** * Remove a utility * @param utility The utility to remove -- cgit v1.2.3