package se.pp.gustafson.marten.mime; import java.util.HashMap; import java.util.Map; import javax.activation.MimeType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class HandlerMap { static final Logger log = LoggerFactory.getLogger(MultipartMixed.class); private final Map<String, MimeTypeHandler<?>> handlerMappings; public HandlerMap(final MimeTypeHandler<?>... handlers) { this.handlerMappings = new HashMap<String, MimeTypeHandler<?>>(); for(final MimeTypeHandler<?> handler : handlers) { for(final MimeType mimeType : handler.appliesTo()) { addHandler(mimeType.getBaseType(), handler); } } } public <T> void addHandler(final String key, final MimeTypeHandler<T> handler) { final MimeTypeHandler<?> oldHandler = this.handlerMappings.put(key, handler); if(oldHandler == null) { log.debug("Added handler for " + key + ": " + handler.getClass().getName()); } else { log.debug("Handler: " + oldHandler.getClass().getName() + " for " + key + " was replaced by " + handler.getClass().getName()); } } @SuppressWarnings("unchecked") public MimeTypeHandler getFor(final String mimeType) { if(this.handlerMappings.containsKey(mimeType)) { return this.handlerMappings.get(mimeType); } else { return new MimeTypeHandler<Object>() { @Override public MimeType[] appliesTo() { return new MimeType[0]; } @Override public <A> void process(final Object data) { log.info("Null handler called for " + mimeType + ", content: " + data); } }; } } public boolean handles(final String mimeType) { return this.handlerMappings.containsKey(mimeType); } }