/*******************************************************************************
* 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.ApplicationContext;
import org.everrest.core.RequestFilter;
import org.everrest.core.ResponseFilter;
import org.everrest.core.method.MethodInvokerFilter;
import javax.ws.rs.core.MediaType;
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 java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.List;
import static java.util.stream.Collectors.toList;
/**
* Provider binder for concrete JAX-RS application. Set of providers from this binder always take preference over
* providers embedded to EverRest framework. For example if ApplicationProviderBinder is able to provide
* MessageBodyWriter or MessageBodyReader for media type 'application/xml' then such reader/writer will be in use for
* all resources from the same Application.
*
* @author andrew00x
* @see javax.ws.rs.core.Application
*/
public class ApplicationProviderBinder extends ProviderBinder {
@Override
public List<MediaType> getAcceptableWriterMediaTypes(Class<?> type, Type genericType, Annotation[] annotations) {
List<MediaType> mediaTypes = doGetAcceptableWriterMediaTypes(type, genericType, annotations);
mediaTypes.addAll(getDefaults().getAcceptableWriterMediaTypes(type, genericType, annotations));
return mediaTypes;
}
@Override
public <T> ContextResolver<T> getContextResolver(Class<T> contextType, MediaType mediaType) {
ContextResolver<T> resolver = doGetContextResolver(contextType, mediaType);
if (resolver == null) {
resolver = getDefaults().getContextResolver(contextType, mediaType);
}
return resolver;
}
@Override
public <T extends Throwable> ExceptionMapper<T> getExceptionMapper(Class<T> type) {
ExceptionMapper<T> exceptionMapper = doGetExceptionMapper(type);
if (exceptionMapper == null) {
exceptionMapper = getDefaults().getExceptionMapper(type);
}
return exceptionMapper;
}
@Override
public <T> MessageBodyReader<T> getMessageBodyReader(Class<T> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
MessageBodyReader<T> reader = doGetMessageBodyReader(type, genericType, annotations, mediaType);
if (reader == null) {
reader = getDefaults().getMessageBodyReader(type, genericType, annotations, mediaType);
}
return reader;
}
@Override
public <T> MessageBodyWriter<T> getMessageBodyWriter(Class<T> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
MessageBodyWriter<T> writer = doGetMessageBodyWriter(type, genericType, annotations, mediaType);
if (writer == null) {
writer = getDefaults().getMessageBodyWriter(type, genericType, annotations, mediaType);
}
return writer;
}
@Override
public List<MethodInvokerFilter> getMethodInvokerFilters(String path) {
ApplicationContext context = ApplicationContext.getCurrent();
List<MethodInvokerFilter> filters = doGetMatchedFilters(path, invokerFilters).stream()
.map(factory -> (MethodInvokerFilter)factory.getInstance(context))
.collect(toList());
filters.addAll(getDefaults().getMethodInvokerFilters(path));
return filters;
}
@Override
public List<RequestFilter> getRequestFilters(String path) {
ApplicationContext context = ApplicationContext.getCurrent();
List<RequestFilter> filters = doGetMatchedFilters(path, requestFilters).stream()
.map(factory -> (RequestFilter)factory.getInstance(context))
.collect(toList());
filters.addAll(getDefaults().getRequestFilters(path));
return filters;
}
@Override
public List<ResponseFilter> getResponseFilters(String path) {
ApplicationContext context = ApplicationContext.getCurrent();
List<ResponseFilter> filters = doGetMatchedFilters(path, responseFilters).stream()
.map(factory -> (ResponseFilter)factory.getInstance(context))
.collect(toList());
filters.addAll(getDefaults().getResponseFilters(path));
return filters;
}
private ProviderBinder getDefaults() {
return ProviderBinder.getInstance();
}
}