All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.winterly.rxjersey.client.inject.RemoteResolver Maven / Gradle / Ivy

package net.winterly.rxjersey.client.inject;

import net.winterly.rxjersey.client.ClientMethodInvoker;
import net.winterly.rxjersey.client.WebResourceFactory;
import org.glassfish.hk2.api.Injectee;
import org.glassfish.hk2.api.InjectionResolver;
import org.glassfish.hk2.api.ServiceHandle;
import org.glassfish.hk2.api.ServiceLocator;

import javax.inject.Inject;
import javax.inject.Singleton;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import java.lang.reflect.Type;
import java.net.URI;

import static java.lang.String.format;

/**
 * Injection resolver for RxWebTarget and Proxy client instances based on value of {@link Remote} annotation
 *
 * @see Remote
 */
@Singleton
public class RemoteResolver implements InjectionResolver {

    @Inject
    private ServiceLocator serviceLocator;

    @Inject
    private ClientMethodInvoker clientMethodInvoker;

    @Inject
    @RxJerseyClient
    private Client client;

    private static URI merge(String value, UriInfo uriInfo) {
        URI target = URI.create(value);
        if (target.getHost() == null) {
            target = UriBuilder.fromUri(uriInfo.getBaseUri()).uri(target).build();
        }

        return target;
    }

    /**
     * @return RxWebTarget or Proxy client of specified injectee interface
     * @throws IllegalStateException if uri is not correct or there is no sufficient injection resolved
     */
    @Override
    public Object resolve(Injectee injectee, ServiceHandle root) {
        Remote remote = injectee.getParent().getAnnotation(Remote.class);
        UriInfo uriInfo = serviceLocator.getService(UriInfo.class);

        URI target = merge(remote.value(), uriInfo);
        WebTarget webTarget = client.target(target);
        Type type = injectee.getRequiredType();

        if (type instanceof Class) {
            Class required = (Class) type;

            if (WebTarget.class.isAssignableFrom(required)) {
                return webTarget;
            }

            if (required.isInterface()) {
                return WebResourceFactory.newResource(required, webTarget, clientMethodInvoker);
            }
        }

        throw new IllegalStateException(format("Can't find proper injection for %s", type));
    }

    @Override
    public boolean isConstructorParameterIndicator() {
        return true;
    }

    @Override
    public boolean isMethodParameterIndicator() {
        return false;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy