diff options
author | rfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68> | 2009-03-18 17:21:53 +0000 |
---|---|---|
committer | rfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68> | 2009-03-18 17:21:53 +0000 |
commit | 1ef444625452eb2dc45dee6d5a388a91c25cea69 (patch) | |
tree | 9a3c25f7df583b0dd4a47a278240da30c494b06a /java | |
parent | b00d3430f73cd2190303e6f70deb0bf55ad65629 (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')
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 * |