blob: c240a5cd324213be8fb4602999ba5b335bc44654 [file] [log] [blame]
package edu.psu.swe.scim.spec.extension;
import java.util.HashMap;
import java.util.Map;
import edu.psu.swe.scim.spec.annotation.ScimExtensionType;
import edu.psu.swe.scim.spec.exception.InvalidExtensionException;
import edu.psu.swe.scim.spec.resources.ScimExtension;
import edu.psu.swe.scim.spec.resources.ScimResource;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public final class ScimExtensionRegistry {
private static final ScimExtensionRegistry INSTANCE = new ScimExtensionRegistry();
private Map<Class<? extends ScimResource>, Map<String, Class<? extends ScimExtension>>> registry;
private ScimExtensionRegistry() {
registry = new HashMap<Class<? extends ScimResource>, Map<String, Class<? extends ScimExtension>>>();
}
public Class<? extends ScimExtension> getExtensionClass(Class<? extends ScimResource> resourceClass, String urn) {
Class<? extends ScimExtension> extensionClass = null;
if(registry.containsKey(resourceClass)) {
Map<String, Class<? extends ScimExtension>> resourceMap = registry.get(resourceClass);
if(resourceMap.containsKey(urn)) {
extensionClass = resourceMap.get(urn);
}
}
return extensionClass;
}
public static ScimExtensionRegistry getInstance() {
return INSTANCE;
}
public void registerExtension(Class<? extends ScimResource> resourceClass, Class<? extends ScimExtension> extensionClass) {
ScimExtensionType[] se = extensionClass.getAnnotationsByType(ScimExtensionType.class);
if (se.length == 0 || se.length > 1) {
throw new InvalidExtensionException("Registered extensions must have an ScimExtensionType annotation");
}
String urn = se[0].id();
log.debug("Registering extension for URN: " + urn);
log.debug(" (associated resource class: " + resourceClass.getSimpleName() + ")");
log.debug(" (associated extension class: " + extensionClass.getSimpleName() + ")");
Map<String, Class<? extends ScimExtension>> resourceMap = registry.get(resourceClass);
if(resourceMap == null) {
resourceMap = new HashMap<>();
registry.put(resourceClass, resourceMap);
}
if(!resourceMap.containsKey(urn)) {
resourceMap.put(urn, extensionClass);
}
}
}