package org.odata4j.test.integration; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Hashtable; import java.util.Map; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpHost; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.conn.params.ConnRoutePNames; import org.apache.http.entity.InputStreamEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicHeader; import org.apache.http.util.EntityUtils; import org.odata4j.consumer.ODataConsumer; import org.odata4j.consumer.behaviors.OClientBehavior; import org.odata4j.core.ODataConstants.Headers; import org.odata4j.core.ODataHttpMethod; import org.odata4j.core.Throwables; import org.odata4j.examples.cxf.consumer.ODataCxfConsumer; import org.odata4j.examples.cxf.consumer.ODataCxfConsumer.Builder; import org.odata4j.examples.cxf.producer.server.ODataCxfServer; import org.odata4j.format.FormatType; import org.odata4j.producer.resources.DefaultODataApplication; import org.odata4j.producer.resources.RootApplication; import org.odata4j.producer.server.ODataServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CxfRuntimeFacade implements RuntimeFacade { private static final Logger LOGGER = LoggerFactory.getLogger(CxfRuntimeFacade.class); @Override public void hostODataServer(String baseUri) { try { ODataServer server = this.startODataServer(baseUri); System.out.println("Press any key to exit"); new BufferedReader(new InputStreamReader(System.in)).readLine(); server.stop(); } catch (IOException e) { throw Throwables.propagate(e); } } @Override public ODataServer startODataServer(String baseUri) { return this.createODataServer(baseUri).start(); } @Override public ODataServer createODataServer(String baseUri) { return new ODataCxfServer(baseUri, DefaultODataApplication.class, RootApplication.class); } @Override public ODataConsumer createODataConsumer(String endpointUri, FormatType format, OClientBehavior... clientBehaviors) { Builder builder = ODataCxfConsumer.newBuilder(endpointUri); if (format != null) { builder = builder.setFormatType(format); } if (clientBehaviors != null) { builder = builder.setClientBehaviors(clientBehaviors); } return builder.build(); } @Override public ResponseData acceptAndReturn(String uri, MediaType mediaType) { uri = uri.replace(" ", "%20"); return this.getResource(ODataHttpMethod.GET, uri, null, mediaType, null); } @Override public ResponseData getWebResource(String uri, String accept) { uri = uri.replace(" ", "%20"); Hashtable<String, Object> header = new Hashtable<String, Object>(); header.put("accept", accept); return this.getResource(ODataHttpMethod.GET, uri, null, null, header); } @Override public void accept(String uri, MediaType mediaType) { // no effect??? } @Override public ResponseData getWebResource(String uri) { return this.getResource(ODataHttpMethod.GET, uri, null, null, null); } private ResponseData getResource(ODataHttpMethod method, String uri, InputStream content, MediaType mediaType, Map<String, Object> headers) { String resource = ""; try { HttpClient httpClient = new DefaultHttpClient(); if (System.getProperties().containsKey("http.proxyHost") && System.getProperties().containsKey("http.proxyPort")) { // support proxy settings String hostName = System.getProperties().getProperty("http.proxyHost"); String hostPort = System.getProperties().getProperty("http.proxyPort"); HttpHost proxy = new HttpHost(hostName, Integer.parseInt(hostPort)); httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy); } HttpUriRequest httpRequest; switch (method) { case GET: httpRequest = new HttpGet(uri); break; case DELETE: httpRequest = new HttpDelete(uri); break; case PATCH: HttpPost patch = new HttpPost(uri); if (content != null) patch.setEntity(new InputStreamEntity(content, -1)); patch.setHeader(Headers.X_HTTP_METHOD, "PATCH"); httpRequest = patch; break; case MERGE: HttpPost merge = new HttpPost(uri); if (content != null) merge.setEntity(new InputStreamEntity(content, -1)); merge.setHeader(Headers.X_HTTP_METHOD, "MERGE"); httpRequest = merge; break; case PUT: HttpPut put = new HttpPut(uri); if (content != null) put.setEntity(new InputStreamEntity(content, -1)); httpRequest = put; break; case POST: HttpPost post = new HttpPost(uri); if (content != null) post.setEntity(new InputStreamEntity(content, -1)); httpRequest = post; break; default: throw new RuntimeException("Unsupported method: " + method); } if (headers != null) { for (String key : headers.keySet()) { String value = (String) headers.get(key).toString(); Header header = new BasicHeader(key, value); httpRequest.addHeader(header); } } if (mediaType != null) { if (content != null) { httpRequest.addHeader(HttpHeaders.CONTENT_TYPE, mediaType.toString()); } if (method == ODataHttpMethod.GET) { httpRequest.addHeader(HttpHeaders.ACCEPT, mediaType.toString()); } } // Execute the request HttpResponse response = httpClient.execute(httpRequest); // Examine the response status CxfRuntimeFacade.LOGGER.debug(response.getStatusLine().toString()); // Get hold of the response entity HttpEntity entity = response.getEntity(); // If the response does not enclose an entity, there is no need // to worry about connection release if (entity != null) { resource = EntityUtils.toString(entity); } return new ResponseData(response.getStatusLine().getStatusCode(), resource); } catch (Exception e) { throw Throwables.propagate(e); } } @Override public ResponseData postWebResource(String uri, InputStream content, MediaType mediaType, Map<String, Object> headers) { return this.getResource(ODataHttpMethod.POST, uri, content, mediaType, headers); } @Override public ResponseData putWebResource(String uri, InputStream content, MediaType mediaType, Map<String, Object> headers) { return this.getResource(ODataHttpMethod.PUT, uri, content, mediaType, headers); } @Override public ResponseData mergeWebResource(String uri, InputStream content, MediaType mediaType, Map<String, Object> headers) { return this.getResource(ODataHttpMethod.MERGE, uri, content, mediaType, headers); } @Override public ResponseData patchWebResource(String uri, InputStream content, MediaType mediaType, Map<String, Object> headers) { return this.getResource(ODataHttpMethod.PATCH, uri, content, mediaType, headers); } @Override public ResponseData getWebResource(String uri, InputStream content, MediaType mediaType, Map<String, Object> headers) { return this.getResource(ODataHttpMethod.GET, uri, content, mediaType, headers); } @Override public ResponseData deleteWebResource(String uri, InputStream content, MediaType mediaType, Map<String, Object> headers) { return this.getResource(ODataHttpMethod.DELETE, uri, content, mediaType, headers); } }