org.apache.olingo.odata2.fit.client.util.Client.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.olingo.odata2.fit.client.util.Client.java

Source

/*******************************************************************************
 * 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());
    }
}