} else if (Object.class.equals(method.getDeclaringClass())
&& "hashCode".equals(method.getName())) {
return hashCode();
// TODO beter hash algorithm
}
TargetException e = new TargetException("Operation not configured");
e.setIdentifier(method.getName());
throw e;
}
OutboundInvocationChain chain = holder.chain;
TargetInvoker invoker;
if (holder.cachedInvoker == null) {
assert chain != null;
if (chain.getTargetInvoker() == null) {
TargetException e = new TargetException("No target invoker configured for operation");
e.setIdentifier(chain.getOperation().getName());
throw e;
}
if (chain.getTargetInvoker().isCacheable()) {
// clone and store the invoker locally
holder.cachedInvoker = (TargetInvoker) chain.getTargetInvoker().clone();