
org.odata4j.jersey.consumer.ODataJerseyClient Maven / Gradle / Ivy
package org.odata4j.jersey.consumer;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import java.lang.reflect.Field;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response.StatusType;
import org.core4j.Enumerable;
import org.core4j.xml.XDocument;
import org.core4j.xml.XmlFormat;
import org.odata4j.consumer.AbstractODataClient;
import org.odata4j.consumer.ODataClientRequest;
import org.odata4j.consumer.ODataConsumer;
import org.odata4j.consumer.ODataClientResponse;
import org.odata4j.consumer.behaviors.OClientBehavior;
import org.odata4j.consumer.behaviors.OClientBehaviors;
import org.odata4j.core.ODataConstants;
import org.odata4j.core.ODataConstants.Charsets;
import org.odata4j.core.OError;
import org.odata4j.core.Throwables;
import org.odata4j.exceptions.ODataProducerException;
import org.odata4j.exceptions.ODataProducerExceptions;
import org.odata4j.format.Entry;
import org.odata4j.format.FormatParserFactory;
import org.odata4j.format.FormatType;
import org.odata4j.format.FormatWriter;
import org.odata4j.format.FormatWriterFactory;
import org.odata4j.format.SingleLink;
import org.odata4j.internal.BOMWorkaroundReader;
import org.odata4j.stax2.XMLEventReader2;
import org.odata4j.stax2.util.StaxUtil;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientHandlerException;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.ClientResponse.Status;
import com.sun.jersey.api.client.PartialRequestBuilder;
import com.sun.jersey.api.client.WebResource;
/**
* OData client based on Jersey.
*/
class ODataJerseyClient extends AbstractODataClient {
private final OClientBehavior[] requiredBehaviors = new OClientBehavior[] { OClientBehaviors.methodTunneling("MERGE") }; // jersey hates MERGE, tunnel through POST
private final OClientBehavior[] behaviors;
private final Client client;
public ODataJerseyClient(FormatType type, JerseyClientFactory clientFactory, OClientBehavior... behaviors) {
super(type);
this.behaviors = Enumerable.create(requiredBehaviors).concat(Enumerable.create(behaviors)).toArray(OClientBehavior.class);
this.client = JerseyClientUtil.newClient(clientFactory, behaviors);
}
public Reader getFeedReader(ODataClientResponse response) {
ClientResponse clientResponse = ((JerseyClientResponse) response).getClientResponse();
if (ODataConsumer.dump.responseBody()) {
String textEntity = clientResponse.getEntity(String.class);
dumpResponseBody(textEntity, clientResponse.getType());
return new BOMWorkaroundReader(new StringReader(textEntity));
}
InputStream textEntity = clientResponse.getEntityInputStream();
try {
return new BOMWorkaroundReader(new InputStreamReader(textEntity, Charsets.Upper.UTF_8));
} catch (Exception e) {
throw Throwables.propagate(e);
}
}
public String requestBody(FormatType formatType, ODataClientRequest request) throws ODataProducerException {
ODataClientResponse response = doRequest(formatType, request, Status.OK);
String entity = ((JerseyClientResponse) response).getClientResponse().getEntity(String.class);
response.close();
return entity;
}
@SuppressWarnings("unchecked")
protected ODataClientResponse doRequest(FormatType reqType, ODataClientRequest request, StatusType... expectedResponseStatus) throws ODataProducerException {
if (behaviors != null) {
for (OClientBehavior behavior : behaviors)
request = behavior.transform(request);
}
WebResource webResource = JerseyClientUtil.resource(client, request.getUrl(), behaviors);
// set query params
for (String qpn : request.getQueryParams().keySet())
webResource = webResource.queryParam(qpn, request.getQueryParams().get(qpn));
WebResource.Builder b = webResource.getRequestBuilder();
// set headers
b = b.accept(reqType.getAcceptableMediaTypes());
for (String header : request.getHeaders().keySet())
b.header(header, request.getHeaders().get(header));
if (!request.getHeaders().containsKey(ODataConstants.Headers.USER_AGENT))
b.header(ODataConstants.Headers.USER_AGENT, "odata4j.org");
if (ODataConsumer.dump.requestHeaders())
dumpHeaders(request, webResource, b);
// request body
if (request.getPayload() != null) {
Class> payloadClass;
if (request.getPayload() instanceof Entry)
payloadClass = Entry.class;
else if (request.getPayload() instanceof SingleLink)
payloadClass = SingleLink.class;
else
throw new IllegalArgumentException("Unsupported payload: " + request.getPayload());
StringWriter sw = new StringWriter();
FormatWriter
© 2015 - 2025 Weber Informatics LLC | Privacy Policy