/*******************************************************************************
* Copyright (c) 2012-2017 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.eclipse.che.api.core.rest;
import com.google.common.annotations.Beta;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import javax.inject.Inject;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyReader;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* This interceptor must be bound for the method
* {@link MessageBodyReader#readFrom(Class, Type, Annotation[], MediaType, MultivaluedMap, InputStream)}
*
* @author Yevhenii Voevodin
*/
@Beta
public class MessageBodyAdapterInterceptor implements MethodInterceptor {
private final Map<Class<?>, MessageBodyAdapter> adapters = new HashMap<>();
@Inject
public void init(Set<MessageBodyAdapter> adapters) {
for (MessageBodyAdapter adapter : adapters) {
for (Class<?> trigger : adapter.getTriggers()) {
this.adapters.put(trigger, adapter);
}
}
}
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
final Object[] args = invocation.getArguments();
final MessageBodyAdapter adapter = adapters.get((Class<?>)args[0]);
if (adapter != null) {
args[args.length - 1] = adapter.adapt((InputStream)args[args.length - 1]);
}
return invocation.proceed();
}
}