Skip to content

Commit

Permalink
infrastructure for supporting providers #15
Browse files Browse the repository at this point in the history
  • Loading branch information
zcourts committed May 30, 2014
1 parent bd1ab95 commit eb39bbb
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 20 deletions.
Expand Up @@ -4,10 +4,12 @@
import io.higgs.core.MethodProcessor;
import io.higgs.core.ProtocolConfiguration;
import io.higgs.core.ProtocolDetectorFactory;
import io.higgs.http.server.Util;
import io.higgs.core.reflect.dependency.DependencyProvider;
import io.higgs.http.server.auth.HiggsSecurityManager;
import io.higgs.http.server.config.HttpConfig;
import io.higgs.http.server.providers.ProviderContainer;
import io.higgs.http.server.providers.filters.HiggsFilter;
import io.higgs.http.server.util.Util;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.mgt.SecurityManager;
Expand All @@ -29,10 +31,10 @@
*/
public class HttpProtocolConfiguration implements ProtocolConfiguration {
//Providers
protected final Set<MessageBodyWriter> writers = new NonBlockingHashSet<>();
protected final Set<MessageBodyReader> readers = new NonBlockingHashSet<>();
protected final Set<ContextResolver> contextProviders = new NonBlockingHashSet<>();
protected final Set<ExceptionMapper> exceptionMappers = new NonBlockingHashSet<>();
protected final Set<ProviderContainer<MessageBodyWriter>> writers = new NonBlockingHashSet<>();
protected final Set<ProviderContainer<MessageBodyReader>> readers = new NonBlockingHashSet<>();
protected final Set<ProviderContainer<ContextResolver>> contextProviders = new NonBlockingHashSet<>();
protected final Set<ProviderContainer<ExceptionMapper>> exceptionMappers = new NonBlockingHashSet<>();
protected final Set<HiggsFilter> filters = new NonBlockingHashSet<>();
//
protected SecurityManager securityManager;
Expand Down Expand Up @@ -69,16 +71,16 @@ public void initialize(HiggsServer server) {
}
//todo make auto discovery configurable, allowing users to disable it
log.debug("Attempting to discover providers");
Set providers = Util.getServices(Provider.class);
Set providers = Util.getServices(Provider.class, DependencyProvider.global());
for (Object o : providers) {
if (o instanceof MessageBodyReader) {
readers.add((MessageBodyReader) o);
readers.add(new ProviderContainer<>((MessageBodyReader) o));
} else if (o instanceof MessageBodyWriter) {
writers.add((MessageBodyWriter) o);
writers.add(new ProviderContainer<>((MessageBodyWriter) o));
} else if (o instanceof ContextResolver) {
contextProviders.add((ContextResolver) o);
contextProviders.add(new ProviderContainer<>((ContextResolver) o));
} else if (o instanceof ExceptionMapper) {
exceptionMappers.add((ExceptionMapper) o);
exceptionMappers.add(new ProviderContainer<>((ExceptionMapper) o));
} else if (o instanceof HiggsFilter) {
filters.add((HiggsFilter) o);
} else {
Expand All @@ -88,31 +90,39 @@ public void initialize(HiggsServer server) {
));
}
}
filters.addAll(Util.getServices(HiggsFilter.class));
//todo add config option to enable discovery of any implementation of the following (wouldn't be jsr-311 compliant)
// readers.addAll(Util.getServices(MessageBodyReader.class));
// writers.addAll(Util.getServices(MessageBodyWriter.class));
// contextProviders.addAll(Util.getServices(ContextResolver.class));
// exceptionMappers.addAll(Util.getServices(ExceptionMapper.class));
// filters.addAll(Util.getServices(HiggsFilter.class));
////todo add config option to enable discovery of any implementation of the following (wouldn't be jsr-311 compliant)
for (ContextResolver m : Util.getServices(ContextResolver.class, DependencyProvider.global())) {
contextProviders.add(new ProviderContainer<>(m));
}
for (MessageBodyReader m : Util.getServices(MessageBodyReader.class, DependencyProvider.global())) {
readers.add(new ProviderContainer<>(m));
}
// for (MessageBodyWriter m : Util.getServices(MessageBodyWriter.class)) {
// writers.add(new ProviderContainer<>(m));
// }
// for (ExceptionMapper m : Util.getServices(ExceptionMapper.class)) {
// exceptionMappers.add(new ProviderContainer<>(m));
// }
}

public Set<HiggsFilter> getFilters() {
return filters;
}

public Set<MessageBodyWriter> getWriters() {
public Set<ProviderContainer<MessageBodyWriter>> getWriters() {
return writers;
}

public Set<MessageBodyReader> getReaders() {
public Set<ProviderContainer<MessageBodyReader>> getReaders() {
return readers;
}

public Set<ContextResolver> getContextProviders() {
public Set<ProviderContainer<ContextResolver>> getContextProviders() {
return contextProviders;
}

public Set<ExceptionMapper> getExceptionMappers() {
public Set<ProviderContainer<ExceptionMapper>> getExceptionMappers() {
return exceptionMappers;
}

Expand Down
@@ -0,0 +1,91 @@
package io.higgs.http.server.providers;

import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.HashSet;
import java.util.Set;

/**
* Wraps a {@link javax.ws.rs.ext.Provider} to provide convenient ways of determining if it
* produces or consumes a certain {@link javax.ws.rs.core.MediaType}.
*
* @author Courtney Robinson <courtney@crlog.info>
*/
public class ProviderContainer<T> {
protected final T instance;
protected final Class<?> klass;
protected Set<MediaType> consumes = new HashSet<>();
protected Set<MediaType> produces = new HashSet<>();

public ProviderContainer(T i) {
if (i == null) {
throw new IllegalArgumentException("Provider cannot be null");
}
this.instance = i;
klass = i.getClass();
inspect();
}

/**
* Figure out if the provider wrapped by this container restricts what types it consumes or produces
*/
private void inspect() {
Consumes consumesAnnotation = klass.getAnnotation(Consumes.class);
if (consumesAnnotation != null && consumesAnnotation.value() != null) {
for (String mediaType : consumesAnnotation.value()) {
consumes.add(MediaType.valueOf(mediaType));
}
} else {
consumes.add(MediaType.WILDCARD_TYPE); //consumes everything
}
Produces producesAnnotation = klass.getAnnotation(Produces.class);
if (producesAnnotation != null && producesAnnotation.value() != null) {
for (String mediaType : producesAnnotation.value()) {
produces.add(MediaType.valueOf(mediaType));
}
} else {
produces.add(MediaType.WILDCARD_TYPE); //produces everything
}
}

public T get() {
return instance;
}

/**
* Checks if the provider wrapped by this container consumes the given media type
*
* @param t the media type to check for compatibility for
* @return true if the provider can consume the type, false otherwise
*/
public boolean consumes(MediaType t) {
if (t == null) {
return false;
}
for (MediaType consumedType : consumes) {
if (consumedType.isCompatible(t)) {
return true;
}
}
return false;
}

/**
* Checks if the provider wrapped by this container produces the given media type
*
* @param t the media type to check for compatibility for
* @return true if the provider can produce the type, false otherwise
*/
public boolean produces(MediaType t) {
if (t == null) {
return false;
}
for (MediaType producedType : produces) {
if (producedType.isCompatible(t)) {
return true;
}
}
return false;
}
}

0 comments on commit eb39bbb

Please sign in to comment.