public ComponentEntry createClient(final Class<?> viewClass) {
final ComponentView view = views.get(viewClass);
if (view == null) {
throw new IllegalArgumentException("Non-existent view " + viewClass + " requested");
}
final ManagedReference managedReference = view.getReference();
final Method[] methods = view.getProxyFactory().getCachedMethods();
final IdentityHashMap<Method, Interceptor> interceptorMap = new IdentityHashMap<Method, Interceptor>();
final SimpleInterceptorFactoryContext interceptorFactoryContext = new SimpleInterceptorFactoryContext();
for (Method method : methods) {
final InterceptorFactory interceptorFactory = interceptorFactoryMap.get(method);
if (interceptorFactory != null) {
interceptorMap.put(method, interceptorFactory.create(interceptorFactoryContext));
}
}
final Set<Method> allowedMethods = Collections.unmodifiableSet(interceptorFactoryMap.keySet());
return new ComponentEntry() {
public Component getComponent() {
return AbstractComponent.this;
}
public Class<?> getViewClass() {
return viewClass;
}
public Collection<Method> allowedMethods() {
return allowedMethods;
}
public Interceptor getEntryPoint(final Method method) throws IllegalArgumentException {
Interceptor interceptor = interceptorMap.get(method);
if (interceptor == null) {
throw new IllegalArgumentException("No entry point found for " + method);
}
return interceptor;
}
public boolean isAsynchronous(final Method method) throws IllegalArgumentException {
if (! interceptorMap.containsKey(method)) {
throw new IllegalArgumentException("No entry point found for " + method);
}
return false;
}
public void destroy() {
managedReference.release();
}
};
}