package org.odata4j.examples.jersey.consumer; import javax.ws.rs.ext.RuntimeDelegate; import org.odata4j.consumer.AbstractODataConsumer; import org.odata4j.consumer.ODataClient; import org.odata4j.consumer.ODataConsumer; import org.odata4j.consumer.behaviors.OClientBehavior; import org.odata4j.format.FormatType; /** * OData consumer based on Jersey. */ public class ODataJerseyConsumer extends AbstractODataConsumer { private ODataJerseyClient client; private ODataJerseyConsumer(FormatType type, String serviceRootUri, JerseyClientFactory clientFactory, OClientBehavior... behaviors) { super(serviceRootUri); // ensure that a correct JAX-RS implementation (Jersey, server or default) is loaded if (!(RuntimeDelegate.getInstance() instanceof com.sun.jersey.core.spi.factory.AbstractRuntimeDelegate)) RuntimeDelegate.setInstance(new com.sun.ws.rs.ext.RuntimeDelegateImpl()); this.client = new ODataJerseyClient(type, clientFactory, behaviors); } @Override protected ODataClient getClient() { return client; } /** * Builder for {@link ODataJerseyConsumer} objects. */ public static class Builder implements ODataConsumer.Builder { private FormatType formatType; private String serviceRootUri; private JerseyClientFactory clientFactory; private OClientBehavior[] clientBehaviors; private Builder(String serviceRootUri) { this.serviceRootUri = serviceRootUri; this.formatType = FormatType.ATOM; this.clientFactory = DefaultJerseyClientFactory.INSTANCE; } /** * Sets a preferred {@link FormatType}. Defaults to {@code FormatType.ATOM}. * * @param formatType the format type * @return this builder */ public Builder setFormatType(FormatType formatType) { this.formatType = formatType; return this; } /** * Sets a specific {@link JerseyClientFactory}. * * @param clientFactory the jersey client factory * @return this builder */ public Builder setClientFactory(JerseyClientFactory clientFactory) { this.clientFactory = clientFactory; return this; } /** * Sets one or more client behaviors. * * <p>Client behaviors transform http requests to interact with services that require custom extensions. * * @param clientBehaviors the client behaviors * @return this builder */ public Builder setClientBehaviors(OClientBehavior... clientBehaviors) { this.clientBehaviors = clientBehaviors; return this; } /** * Builds the {@link ODataJerseyConsumer} object. * * @return a new OData consumer */ public ODataJerseyConsumer build() { if (this.clientBehaviors != null) return new ODataJerseyConsumer(this.formatType, this.serviceRootUri, this.clientFactory, this.clientBehaviors); else return new ODataJerseyConsumer(this.formatType, this.serviceRootUri, this.clientFactory); } } /** * Constructs a new builder for an {@link ODataJerseyConsumer} object. * * @param serviceRootUri the OData service root uri */ public static Builder newBuilder(String serviceRootUri) { return new Builder(serviceRootUri); } /** * Creates a new consumer for the given OData service uri. * * <p>Wrapper for {@code ODataJerseyConsumer.newBuilder(serviceRootUri).build()}. * * @param serviceRootUri the service uri <p>e.g. <code>http://services.odata.org/Northwind/Northwind.svc/</code></p> * @return a new OData consumer */ public static ODataJerseyConsumer create(String serviceRootUri) { return ODataJerseyConsumer.newBuilder(serviceRootUri).build(); } }