/** * Registers the given subclass handler. * * @param handler */ public void registerSubclassHandler(DelegatingSubclassHandler<T, ? extends T> handler) { if (subclassHandlers == null) { init(); } for (DelegatingSubclassHandler<T, ? extends T> current : subclassHandlers) { if (current.getClass().equals(handler.getClass())) { log.info("Tried to register a subclass handler, but the class is already registered: " + handler.getClass()); return; } } subclassHandlers.add(handler); }
/** * @param type the user-friendly name of a registered subclass handler * @return the handler for the given user-friendly type name */ protected DelegatingSubclassHandler<T, ? extends T> getSubclassHandler(String type) { if (hasTypesDefined()) { if (subclassHandlers == null) { init(); } for (DelegatingSubclassHandler<T, ? extends T> handler : subclassHandlers) { if (type.equals(handler.getTypeName())) return handler; } } return null; }
/** * @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; }