diff options
Diffstat (limited to 'branches/sca-java-1.5.2/modules/core/src/main/java')
2 files changed, 34 insertions, 15 deletions
diff --git a/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/RuntimeWireImpl.java b/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/RuntimeWireImpl.java index ad38906e9d..cc71374296 100644 --- a/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/RuntimeWireImpl.java +++ b/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/RuntimeWireImpl.java @@ -21,7 +21,9 @@ package org.apache.tuscany.sca.core.assembly; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; +import java.util.IdentityHashMap; import java.util.List; +import java.util.Map; import org.apache.tuscany.sca.assembly.Binding; import org.apache.tuscany.sca.assembly.Component; @@ -79,6 +81,10 @@ public class RuntimeWireImpl implements RuntimeWire { private List<InvocationChain> chains; private InvocationChain bindingInvocationChain; + // Cache + private transient final Map<Operation, InvocationChain> invocationChainMap = + new IdentityHashMap<Operation, InvocationChain>(); + /** * @param source @@ -129,20 +135,30 @@ public class RuntimeWireImpl implements RuntimeWire { } public InvocationChain getInvocationChain(Operation operation) { - for (InvocationChain chain : getInvocationChains()) { - Operation op = null; - if (wireSource.getContract() != null) { - // Reference chain - op = chain.getSourceOperation(); + synchronized (invocationChainMap) { + InvocationChain cached = invocationChainMap.get(operation); + if (cached == null) { + for (InvocationChain chain : getInvocationChains()) { + Operation op = null; + if (wireSource.getContract() != null) { + // Reference chain + op = chain.getSourceOperation(); + } else { + // Service chain + op = chain.getTargetOperation(); + } + if (interfaceContractMapper.isCompatible(operation, op, op.getInterface().isRemotable())) { + invocationChainMap.put(operation, chain); + return chain; + } + } + invocationChainMap.put(operation, null); + return null; + } else { - // Service chain - op = chain.getTargetOperation(); - } - if (interfaceContractMapper.isCompatible(operation, op, op.getInterface().isRemotable())) { - return chain; + return cached; } } - return null; } public Object invoke(Message msg) throws InvocationTargetException { diff --git a/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java b/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java index 80650b2804..4c6abc726c 100644 --- a/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java +++ b/branches/sca-java-1.5.2/modules/core/src/main/java/org/apache/tuscany/sca/core/invocation/JDKInvocationHandler.java @@ -23,7 +23,7 @@ import java.io.Serializable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; -import java.util.HashMap; +import java.util.IdentityHashMap; import java.util.List; import java.util.Map; import java.util.UUID; @@ -82,7 +82,7 @@ public class JDKInvocationHandler implements InvocationHandler, Serializable { protected boolean fixedWire = true; - protected transient Map<Method, InvocationChain> chains = new HashMap<Method, InvocationChain>(); + protected transient Map<Method, InvocationChain> chains = new IdentityHashMap<Method, InvocationChain>(); public JDKInvocationHandler(MessageFactory messageFactory, Class<?> businessInterface, RuntimeWire wire) { this.messageFactory = messageFactory; @@ -288,8 +288,11 @@ public class JDKInvocationHandler implements InvocationHandler, Serializable { } protected synchronized InvocationChain getInvocationChain(Method method, RuntimeWire wire) { - if (fixedWire && chains.containsKey(method)) { - return chains.get(method); + if (fixedWire) { + InvocationChain chain = chains.get(method); + if (chain != null) { + return chain; + } } InvocationChain found = null; for (InvocationChain chain : wire.getInvocationChains()) { |