package org.gcube.data.access.storagehub.handlers.content; import java.util.Arrays; import java.util.HashMap; import java.util.Set; import javax.inject.Singleton; import org.gcube.common.storagehub.model.annotations.MimeTypeHandler; import org.reflections.Reflections; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Singleton public class ContentHandlerFactory { private static Logger logger = LoggerFactory.getLogger(ContentHandlerFactory.class); private Reflections reflection = new Reflections(); private static HashMap> handlerMap = new HashMap>(); private Class defaultHandler = GenericFileHandler.class; @SuppressWarnings("unchecked") public ContentHandlerFactory() { Set> classesAnnotated = reflection.getTypesAnnotatedWith(MimeTypeHandler.class); for (Class clazz: classesAnnotated ){ if (ContentHandler.class.isAssignableFrom(clazz)) { logger.debug("searching for mimetypes {} with values {}",clazz.getName(), Arrays.toString(clazz.getAnnotation(MimeTypeHandler.class).value())); for (String value: clazz.getAnnotation(MimeTypeHandler.class).value()){ logger.debug("value for class {} is {}",clazz.getName(), value); handlerMap.put(value, (Class) clazz); } } } } public ContentHandler create(String mimetype) throws Exception{ Class handlerClass = handlerMap.get(mimetype); if (handlerClass!=null) return handlerClass.newInstance(); else return defaultHandler.newInstance(); } }