package com.aol.micro.server.rest.jersey;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.function.Consumer;
import lombok.Getter;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.ServerProperties;
import com.aol.micro.server.auto.discovery.Rest;
import com.aol.micro.server.auto.discovery.RestResource;
import com.aol.micro.server.module.JaxRsProvider;
import com.aol.micro.server.servers.ServerThreadLocalVariables;
public class JerseyRestApplication extends ResourceConfig {
@Getter
private static final ConcurrentMap<String, List<Object>> resourcesMap = new ConcurrentHashMap<>();
@Getter
private static final ConcurrentMap<String, List<String>> packages = new ConcurrentHashMap<>();
@Getter
private static final ConcurrentMap<String, List<Class<?>>> resourcesClasses = new ConcurrentHashMap<>();
@Getter
private static final ConcurrentMap<String, Consumer<JaxRsProvider<Object>>> resourceConfigManager = new ConcurrentHashMap<>();
@Getter
private static final ConcurrentMap<String, Map<String, Object>> serverPropertyMap = new ConcurrentHashMap<>();
public JerseyRestApplication() {
this(resourcesMap.get(ServerThreadLocalVariables.getContext().get()),
packages.get(ServerThreadLocalVariables.getContext().get()),
resourcesClasses.get(ServerThreadLocalVariables.getContext().get()),
serverPropertyMap.get(ServerThreadLocalVariables.getContext().get()));
}
public JerseyRestApplication(List<Object> allResources,List<String> packages, List<Class<?>> resources, Map<String, Object> serverProperties) {
if (allResources != null) {
for (Object next : allResources) {
if(isSingleton(next))
register(next);
else
register(next.getClass());
}
}
register(new AsyncBinder());
if (serverProperties.isEmpty()) {
property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
//http://stackoverflow.com/questions/25755773/bean-validation-400-errors-are-returning-default-error-page-html-instead-of-re
property(ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, "true");
} else {
for (Map.Entry<String, Object> entry : serverProperties.entrySet()) {
property(entry.getKey(), entry.getValue());
}
}
packages.stream().forEach( e -> packages(e));
resources.stream().forEach( e -> register(e));
Optional.ofNullable(this.resourceConfigManager.get(ServerThreadLocalVariables.getContext().get())).ifPresent(e->e.accept(new JaxRsProvider<>(this)));
}
private boolean isSingleton(Object next) {
if(next instanceof RestResource)
return ((RestResource)next).isSingleton();
Rest rest = next.getClass().getAnnotation(Rest.class);
if(rest == null)
return !(next instanceof Class);
return rest.isSingleton();
}
public static void clear() {
resourcesMap.clear();
packages.clear();
}
}