/** * @param type user-friendly type name * @return the actual java class for this type */ protected Class<? extends T> getActualSubclass(String type) { DelegatingSubclassHandler<T, ? extends T> handler = getSubclassHandler(type); if (handler != null) return handler.getSubclassHandled(); // otherwise we need to return our own declared class return ReflectionUtil.getParameterizedTypeFromInterface(getClass(), DelegatingResourceHandler.class, 0); }
/** * @param subclass * @return the handler most appropriate for the given subclass, or null if none is suitable */ protected DelegatingSubclassHandler<T, ? extends T> getSubclassHandler(Class<? extends T> subclass) { if (subclassHandlers == null) { init(); } if (!hasTypesDefined()) return null; // look for an exact match for (DelegatingSubclassHandler<T, ? extends T> handler : subclassHandlers) { Class<? extends T> subclassHandled = handler.getSubclassHandled(); if (subclass.equals(subclassHandled)) return handler; } // TODO should we recurse to subclass's superclass, e.g. so DrugOrderHandler can handle HivDrugOrder if no handler is defined? // didn't find anything suitable return null; }