/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.everrest.core.impl;
import org.everrest.core.Filter;
import org.everrest.core.ObjectFactory;
import org.everrest.core.RequestFilter;
import org.everrest.core.ResourceBinder;
import org.everrest.core.ResponseFilter;
import org.everrest.core.method.MethodInvokerFilter;
import javax.ws.rs.Path;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
/**
* @author andrew00x
*/
public class RestComponentResolver {
private ResourceBinder resources;
private ProviderBinder providers;
public RestComponentResolver(ResourceBinder resources, ProviderBinder providers) {
this.resources = resources;
this.providers = providers;
}
@SuppressWarnings({"unchecked"})
public void addSingleton(Object instance) {
Class clazz = instance.getClass();
if (clazz.getAnnotation(Provider.class) != null) {
if (instance instanceof ContextResolver) {
providers.addContextResolver((ContextResolver)instance);
}
if (instance instanceof ExceptionMapper) {
providers.addExceptionMapper((ExceptionMapper)instance);
}
if (instance instanceof MessageBodyReader) {
providers.addMessageBodyReader((MessageBodyReader)instance);
}
if (instance instanceof MessageBodyWriter) {
providers.addMessageBodyWriter((MessageBodyWriter)instance);
}
} else if (clazz.getAnnotation(Filter.class) != null) {
if (instance instanceof MethodInvokerFilter) {
providers.addMethodInvokerFilter((MethodInvokerFilter)instance);
}
if (instance instanceof RequestFilter) {
providers.addRequestFilter((RequestFilter)instance);
}
if (instance instanceof ResponseFilter) {
providers.addResponseFilter((ResponseFilter)instance);
}
} else if (clazz.getAnnotation(Path.class) != null) {
resources.addResource(instance, null);
}
}
@SuppressWarnings({"unchecked"})
public void addPerRequest(Class clazz) {
if (clazz.getAnnotation(Provider.class) != null) {
if (ContextResolver.class.isAssignableFrom(clazz)) {
providers.addContextResolver(clazz);
}
if (ExceptionMapper.class.isAssignableFrom(clazz)) {
providers.addExceptionMapper(clazz);
}
if (MessageBodyReader.class.isAssignableFrom(clazz)) {
providers.addMessageBodyReader(clazz);
}
if (MessageBodyWriter.class.isAssignableFrom(clazz)) {
providers.addMessageBodyWriter(clazz);
}
} else if (clazz.getAnnotation(Filter.class) != null) {
if (MethodInvokerFilter.class.isAssignableFrom(clazz)) {
providers.addMethodInvokerFilter(clazz);
}
if (RequestFilter.class.isAssignableFrom(clazz)) {
providers.addRequestFilter(clazz);
}
if (ResponseFilter.class.isAssignableFrom(clazz)) {
providers.addResponseFilter(clazz);
}
} else if (clazz.getAnnotation(Path.class) != null) {
resources.addResource(clazz, null);
}
}
@SuppressWarnings({"unchecked"})
public void addFactory(ObjectFactory factory) {
Class clazz = factory.getObjectModel().getObjectClass();
if (clazz.getAnnotation(Provider.class) != null) {
if (ContextResolver.class.isAssignableFrom(clazz)) {
providers.addContextResolver(factory);
}
if (ExceptionMapper.class.isAssignableFrom(clazz)) {
providers.addExceptionMapper(factory);
}
if (MessageBodyReader.class.isAssignableFrom(clazz)) {
providers.addMessageBodyReader(factory);
}
if (MessageBodyWriter.class.isAssignableFrom(clazz)) {
providers.addMessageBodyWriter(factory);
}
} else if (clazz.getAnnotation(Filter.class) != null) {
if (MethodInvokerFilter.class.isAssignableFrom(clazz)) {
providers.addMethodInvokerFilter(factory);
}
if (RequestFilter.class.isAssignableFrom(clazz)) {
providers.addRequestFilter(factory);
}
if (ResponseFilter.class.isAssignableFrom(clazz)) {
providers.addResponseFilter(factory);
}
} else if (clazz.getAnnotation(Path.class) != null) {
resources.addResource(factory);
}
}
}