Java tutorial
/******************************************************************************* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. ******************************************************************************/ package org.apache.olingo.odata2.fit.client.util; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.URL; import java.util.List; import org.apache.commons.codec.binary.Base64; import org.apache.olingo.odata2.api.commons.HttpStatusCodes; import org.apache.olingo.odata2.api.edm.Edm; import org.apache.olingo.odata2.api.edm.EdmEntityContainer; import org.apache.olingo.odata2.api.edm.EdmEntitySetInfo; import org.apache.olingo.odata2.api.ep.EntityProvider; import org.apache.olingo.odata2.api.ep.EntityProviderReadProperties; import org.apache.olingo.odata2.api.ep.feed.ODataDeltaFeed; import org.apache.olingo.odata2.api.ep.feed.ODataFeed; import org.apache.olingo.odata2.api.exception.ODataException; public class Client { public static final String APPLICATION_JSON = "application/json"; public static final String APPLICATION_XML = "application/xml"; public static final String APPLICATION_ATOM_XML = "application/atom+xml"; public static final String METADATA = "$metadata"; private String serviceUrl; private Proxy.Type protocol; private String proxy; private int port; private boolean useProxy; private String username; private String password; private boolean useAuthentication; private Edm edm; public Client(final String serviceUrl, final Proxy.Type protocol, final String proxy, final int port) throws IOException, ODataException, HttpException { this.serviceUrl = serviceUrl; this.protocol = protocol; this.proxy = proxy; this.port = port; useProxy = true; useAuthentication = false; edm = getEdmInternal(); } public Client(final String serviceUrl) throws IOException, ODataException, HttpException { this.serviceUrl = serviceUrl; useProxy = false; useAuthentication = false; edm = getEdmInternal(); } public Client(final String serviceUrl, final Proxy.Type protocol, final String proxy, final int port, final String username, final String password) throws IOException, ODataException, HttpException { this.serviceUrl = serviceUrl; this.protocol = protocol; this.proxy = proxy; this.port = port; useProxy = true; this.username = username; this.password = password; useAuthentication = true; edm = getEdmInternal(); } public Client(final String serviceUrl, final String username, final String password) throws IOException, ODataException, HttpException { this.serviceUrl = serviceUrl; useProxy = false; this.username = username; this.password = password; useAuthentication = true; edm = getEdmInternal(); } private Edm getEdmInternal() throws IOException, ODataException, HttpException { HttpURLConnection connection = connect(METADATA, null, APPLICATION_XML, "GET"); edm = EntityProvider.readMetadata((InputStream) connection.getContent(), false); return edm; } private void checkStatus(final HttpURLConnection connection) throws IOException, HttpException { if (400 <= connection.getResponseCode() && connection.getResponseCode() <= 599) { HttpStatusCodes httpStatusCode = HttpStatusCodes.fromStatusCode(connection.getResponseCode()); throw new HttpException(httpStatusCode, httpStatusCode.getStatusCode() + " " + httpStatusCode.toString()); } } public Edm getEdm() { return edm; } public List<EdmEntitySetInfo> getEntitySets() throws ODataException { return edm.getServiceMetadata().getEntitySetInfos(); } public ODataFeed readFeed(final String entityContainerName, final String entitySetName, final String contentType) throws IOException, ODataException, HttpException { return readFeed(entityContainerName, entitySetName, contentType, null); } public ODataFeed readFeed(final String entityContainerName, final String entitySetName, final String contentType, final String query) throws IOException, ODataException, HttpException { EdmEntityContainer entityContainer = edm.getEntityContainer(entityContainerName); String relativeUri; if (entityContainer.isDefaultEntityContainer()) { relativeUri = entitySetName; } else { relativeUri = entityContainerName + "." + entitySetName; } InputStream content = (InputStream) connect(relativeUri, query, contentType, "GET").getContent(); return EntityProvider.readFeed(contentType, entityContainer.getEntitySet(entitySetName), content, EntityProviderReadProperties.init().build()); } private HttpURLConnection connect(final String absoluteUri, final String contentType, final String httpMethod) throws IOException, HttpException { URL url = new URL(absoluteUri); HttpURLConnection connection; if (useProxy) { Proxy proxy = new Proxy(protocol, new InetSocketAddress(this.proxy, port)); connection = (HttpURLConnection) url.openConnection(proxy); } else { connection = (HttpURLConnection) url.openConnection(); } connection.setRequestMethod(httpMethod); connection.setRequestProperty("Accept", contentType); if (useAuthentication) { String authorization = "Basic "; authorization += new String(Base64.encodeBase64((username + ":" + password).getBytes())); connection.setRequestProperty("Authorization", authorization); } connection.connect(); checkStatus(connection); return connection; } private HttpURLConnection connect(final String relativeUri, final String query, final String contentType, final String httpMethod) throws IOException, HttpException { URL url = new URL(serviceUrl + relativeUri + (query != null ? "?" + query : "")); return connect(url.toString(), contentType, httpMethod); } public ODataDeltaFeed readDeltaFeed(final String entityContainerName, final String entitySetName, final String contentType, final String deltaLink) throws IOException, ODataException, HttpException { EdmEntityContainer entityContainer = edm.getEntityContainer(entityContainerName); InputStream content = (InputStream) connect(deltaLink, contentType, "GET").getContent(); return EntityProvider.readDeltaFeed(contentType, entityContainer.getEntitySet(entitySetName), content, EntityProviderReadProperties.init().build()); } }