/**
*
*/
package org.minnal.core;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.ext.ExceptionMapper;
import org.glassfish.jersey.server.ResourceConfig;
import org.minnal.core.config.ApplicationConfiguration;
import org.minnal.core.config.ConfigurationProvider;
import org.minnal.utils.reflection.Generics;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* @author ganeshs
*
*/
public abstract class Application<T extends ApplicationConfiguration> implements Lifecycle {
private URI path;
private T configuration;
private List<Plugin> plugins = new ArrayList<Plugin>();
private ConfigurationProvider configurationProvider = ConfigurationProvider.getDefault();
private ResourceConfig resourceConfig;
private ObjectMapper objectMapper = new ObjectMapper();
@SuppressWarnings({ "unchecked", "rawtypes" })
public Application() {
this.configuration = (T) configurationProvider.provide((Class)Generics.getTypeParameter(getClass(), ApplicationConfiguration.class));
resourceConfig = new ResourceConfig();
}
public Application(T configuration) {
this.configuration = configuration;
}
/**
* @return the resourceConfig
*/
public ResourceConfig getResourceConfig() {
return resourceConfig;
}
/**
* @param filter
*/
public void addFilter(Class<?> filter) {
resourceConfig.register(filter);
}
/**
* @param filter
*/
public void addFilter(Object filter) {
resourceConfig.register(filter);
}
/**
* @param listener
*/
public void addListener(Object listener) {
resourceConfig.register(listener);
}
/**
* @param listener
*/
public void addListener(Class<?> listener) {
resourceConfig.register(listener);
}
/**
* @param mapper
*/
@SuppressWarnings("rawtypes")
public void addExceptionMapper(Class<? extends ExceptionMapper> mapper) {
resourceConfig.register(mapper);
}
/**
* @param mapper
*/
@SuppressWarnings("rawtypes")
public void addExceptionMapper(ExceptionMapper mapper) {
resourceConfig.register(mapper);
}
/**
* @return the objectMapper
*/
public ObjectMapper getObjectMapper() {
return objectMapper;
}
/**
* @param objectMapper the objectMapper to set
*/
public void setObjectMapper(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
public void init() {
registerPlugins();
addFilters();
defineResources();
mapExceptions();
addProviders();
for (Plugin plugin : plugins) {
plugin.init(this);
}
}
public void start() {
}
public void stop() {
for (Plugin plugin : plugins) {
plugin.destroy();
}
}
protected abstract void registerPlugins();
protected void addFilters() {
}
protected abstract void defineResources();
/**
* Adds the providers
*/
protected void addProviders() {
resourceConfig.register(new JacksonProvider(objectMapper, null));
}
/**
* Adds the provider class
*
* @param provider
*/
public void addProvider(Class<?> provider) {
resourceConfig.register(provider);
}
/**
* Adds the provider
*
* @param provider
*/
public void addProvider(Object provider) {
resourceConfig.register(provider);
}
protected void mapExceptions() {
}
public void addResource(Class<?> resourceClass) {
resourceConfig.register(resourceClass);
}
/**
* Will be used by the container to set the absolute path for this application
*
* @return the path
*/
public URI getPath() {
return path;
}
/**
* Will be used by the container to set the absolute path for this application
*
* @param path the path to set
*/
void setPath(URI path) {
this.path = path;
}
/**
* @return the configuration
*/
public T getConfiguration() {
return configuration;
}
public void registerPlugin(Plugin plugin) {
plugins.add(plugin);
}
@JsonValue
@Override
public String toString() {
return configuration.getName();
}
}