org.ovirt.engine.sdk.web.HttpProxyBroker.java Source code

Java tutorial

Introduction

Here is the source code for org.ovirt.engine.sdk.web.HttpProxyBroker.java

Source

//
// Copyright (c) 2012 Red Hat, Inc.
//
// Licensed 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.ovirt.engine.sdk.web;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
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.entity.StringEntity;
import org.ovirt.engine.sdk.exceptions.ServerException;
import org.ovirt.engine.sdk.mapping.Mapper;
import org.ovirt.engine.sdk.utils.SerializationHelper;
import org.ovirt.engine.sdk.utils.StringUtils;
import org.ovirt.engine.sdk.utils.UrlHelper;

/**
 * Provides broker capabilities over HttpProxy
 */
public class HttpProxyBroker {

    private HttpProxy proxy;
    private UrlHelper urlHelper;

    /**
     * @param proxy
     *            HttpProxy to encapsulate
     */
    public HttpProxyBroker(HttpProxy proxy) {
        this.proxy = proxy;
        this.urlHelper = new UrlHelper(proxy.getUrl());
    }

    /**
     * updates resource
     * 
     * @param url
     *            resource url
     * @param entity
     *            resource
     * @param from
     *            from type
     * @param to
     *            to type
     * 
     * @return updated resource
     * 
     * @throws IOException
     * @throws ClientProtocolException
     * @throws ServerException
     */
    public <F, T> T update(String url, F entity, Class<F> from, Class<T> to)
            throws IOException, ClientProtocolException, ServerException {
        return update(url, entity, from, to, null);
    }

    /**
     * updates resource
     * 
     * @param url
     *            resource url
     * @param entity
     *            resource
     * @param from
     *            from type
     * @param to
     *            to type
     * @param headers
     *            HTTP headers
     * 
     * @return updated resource
     * 
     * @throws IOException
     * @throws ClientProtocolException
     * @throws ServerException
     */
    public <F, T> T update(String url, F entity, Class<F> from, Class<T> to, List<Header> headers)
            throws IOException, ClientProtocolException, ServerException {

        HttpPut httpput = new HttpPut(this.urlHelper.combine(url));

        String xmlReq = SerializationHelper.marshall(from, entity);
        HttpEntity httpentity = new StringEntity(xmlReq, StringUtils.UTF8);
        httpput.setEntity(httpentity);

        String xmlRes = this.proxy.execute(httpput, headers, null);
        return unmarshall(from, to, xmlRes);
    }

    /**
     * Performs action on a resource
     * 
     * @param url
     *            resource url
     * @param entity
     *            resource
     * @param from
     *            from type
     * @param to
     *            to type
     * 
     * @return action response
     * 
     * @throws IOException
     * @throws ClientProtocolException
     * @throws ServerException
     */
    public <F, T> T action(String url, F entity, Class<F> from, Class<T> to)
            throws IOException, ClientProtocolException, ServerException {
        return add(url, entity, from, to, null);
    }

    /**
     * Performs action on a resource
     * 
     * @param url
     *            resource url
     * @param entity
     *            resource
     * @param from
     *            from type
     * @param to
     *            to type
     * @param headers
     *            HTTP headers
     * 
     * @return action response
     * 
     * @throws IOException
     * @throws ClientProtocolException
     * @throws ServerException
     */
    public <F, T> T action(String url, F entity, Class<F> from, Class<T> to, List<Header> headers)
            throws IOException, ClientProtocolException, ServerException {
        return add(url, entity, from, to, headers);
    }

    /**
     * Adds new resource
     * 
     * @param url
     *            collection url
     * @param entity
     *            entity to add
     * @param from
     *            from type
     * @param to
     *            to type
     * 
     * @return added resource
     * 
     * @throws IOException
     * @throws ClientProtocolException
     * @throws ServerException
     */
    public <F, T> T add(String url, F entity, Class<F> from, Class<T> to)
            throws IOException, ClientProtocolException, ServerException {
        return add(url, entity, from, to, null);
    }

    /**
     * Adds new resource
     * 
     * @param url
     *            collection url
     * @param entity
     *            entity to add
     * @param from
     *            from type
     * @param to
     *            to type
     * 
     * @param headers
     *            HTTP headers
     * 
     * @return added resource
     * 
     * @throws IOException
     * @throws ClientProtocolException
     * @throws ServerException
     */
    public <F, T> T add(String url, F entity, Class<F> from, Class<T> to, List<Header> headers)
            throws IOException, ClientProtocolException, ServerException {

        HttpPost httpost = new HttpPost(this.urlHelper.combine(url));

        String xmlReq = SerializationHelper.marshall(from, entity);
        HttpEntity httpentity = new StringEntity(xmlReq, StringUtils.UTF8);
        httpost.setEntity(httpentity);

        String xmlRes = this.proxy.execute(httpost, headers, null);
        return unmarshall(from, to, xmlRes);
    }

    /**
     * Deletes resource
     * 
     * @param url
     *            resource url
     * @param to
     *            to typr
     * 
     * @return response
     * 
     * @throws IOException
     * @throws ClientProtocolException
     * @throws ServerException
     */
    public <F, T> T delete(String url, Class<T> to) throws IOException, ClientProtocolException, ServerException {
        return delete(url, null, null, to, null);
    }

    /**
     * Deletes resource
     * 
     * @param url
     *            resource url
     * @param to
     *            to typr
     * @param headers
     *            HTTP headers
     * 
     * @return response
     * 
     * @throws IOException
     * @throws ClientProtocolException
     * @throws ServerException
     */
    public <F, T> T delete(String url, Class<T> to, List<Header> headers)
            throws IOException, ClientProtocolException, ServerException {
        return delete(url, null, null, to, headers);
    }

    /**
     * Deletes resource
     * 
     * @param url
     *            resource url
     * @param entity
     *            entity to pass
     * @param from
     *            from type
     * @param to
     *            to type
     * 
     * @return response
     * 
     * @throws IOException
     * @throws ClientProtocolException
     * @throws ServerException
     */
    public <F, T> T delete(String url, F entity, Class<F> from, Class<T> to)
            throws IOException, ClientProtocolException, ServerException {
        return delete(url, entity, from, to, null);
    }

    /**
     * Deletes resource
     * 
     * @param url
     *            resource url
     * @param entity
     *            entity to pass
     * @param from
     *            from type
     * @param to
     *            to type
     * @param headers
     *            HTTP headers
     * 
     * @return response
     * 
     * @throws IOException
     * @throws ClientProtocolException
     * @throws ServerException
     */
    public <F, T> T delete(String url, F entity, Class<F> from, Class<T> to, List<Header> headers)
            throws IOException, ClientProtocolException, ServerException {

        HttpDelete httdelete = new HttpDelete(this.urlHelper.combine(url));

        if (entity != null && from != null) {
            String xmlReq = SerializationHelper.marshall(from, entity);
            HttpEntity httpentity = new StringEntity(xmlReq, StringUtils.UTF8);
            httdelete.setEntity(httpentity);
        }

        String xmlRes = this.proxy.execute(httdelete, headers, null);
        return SerializationHelper.unmarshall(to, xmlRes);
    }

    /**
     * Fetches resource
     * 
     * @param url
     *            entity url
     * @param from
     *            from type
     * @param to
     *            to type
     * @param headers
     *            HTTP headers
     * 
     * @return T entity
     * 
     * @throws IOException
     * @throws ClientProtocolException
     * @throws ServerException
     */
    public <F, T> T get(String url, Class<F> from, Class<T> to, List<Header> headers)
            throws IOException, ClientProtocolException, ServerException {
        HttpGet httpget = new HttpGet(this.urlHelper.combine(url));
        String xmlRes = this.proxy.execute(httpget, headers, null);

        return unmarshall(from, to, xmlRes);
    }

    /**
     * Fetches resource
     * 
     * @param url
     *            entity url
     * @param from
     *            from type
     * @param to
     *            to type
     * 
     * @return T entity
     * 
     * @throws IOException
     * @throws ClientProtocolException
     * @throws ServerException
     */
    public <F, T> T get(String url, Class<F> from, Class<T> to)
            throws IOException, ClientProtocolException, ServerException {
        return get(url, from, to, null);
    }

    /**
     * Fetches resource
     * 
     * @param url
     *            entity url
     * @param from
     *            from type
     * 
     * @return F entity
     * 
     * @throws IOException
     * @throws ClientProtocolException
     * @throws ServerException
     */
    public <F> F get(String url, Class<F> from) throws IOException, ClientProtocolException, ServerException {
        HttpGet httpget = new HttpGet(this.urlHelper.combine(url));
        String xmlRes = this.proxy.execute(httpget, null, null);
        return SerializationHelper.unmarshall(from, xmlRes);
    }

    /**
     * Fetches resource
     * 
     * @param url
     *            entity url
     * 
     * @return entity XML representation
     * 
     * @throws IOException
     * @throws ClientProtocolException
     * @throws ServerException
     */
    public String get(String url) throws IOException, ClientProtocolException, ServerException {
        return get(url, new ArrayList<Header>());
    }

    /**
     * Fetches resource
     * 
     * @param url
     *            entity url
     * @param headers
     *            HTTP headers
     * 
     * @return entity
     * 
     * @throws IOException
     * @throws ClientProtocolException
     * @throws ServerException
     */
    public String get(String url, List<Header> headers)
            throws IOException, ClientProtocolException, ServerException {

        HttpGet httpget = new HttpGet(this.urlHelper.combine(url));
        return this.proxy.execute(httpget, headers, null);
    }

    /**
     * Enable/Disable client permissions based filtering (default is False)
     * 
     * @param filter
     */
    public void setFilter(boolean filter) {
        this.proxy.setFilter(filter);
    }

    /**
     * Enable/Disable debug mode (default is False)
     * 
     * @param debug
     */
    public void setDebug(boolean debug) {
        this.proxy.setDebug(debug);
    }

    /**
     * Enable/Disable persistent authentication (default is True)
     * 
     * @param persistentAuth
     */
    public void setPersistentAuth(boolean persistentAuth) {
        this.proxy.setPersistentAuth(persistentAuth);
    }

    /**
     * @param sessionid
     *            oVirt api sessionid to authenticate the user with
     *            (used as SSO solution instead of username+password)
     */
    public void setSessionid(String sessionid) {
        this.proxy.setSessionid(sessionid);
    }

    /**
    * oVirt api sessionid to authenticate the user with
    * (used as SSO solution instead of username+password)
     */
    public boolean isSetSessionid() {
        return this.proxy.isSetSessionid();
    }

    /**
     * @return persistent authentication flag
     */
    public boolean isPersistentAuth() {
        return this.proxy.isPersistentAuth();
    }

    /**
     * @return Filter flag
     */
    public boolean isFilter() {
        return this.proxy.isFilter();
    }

    /**
     * @return Debug flag
     */
    public boolean isDebug() {
        return this.proxy.isDebug();
    }

    /**
     * @return oVirt API root resource URL
     */
    public String getRoot() {
        return this.urlHelper.getRoot();
    }

    /**
     * Unmarshales item from the xml
     * 
     * @param from
     *            entity type
     * @param to
     *            decorator type
     * @param xml
     *            xml object representation
     * 
     * @return decorator
     * 
     */
    @SuppressWarnings("unchecked")
    private <F, T> T unmarshall(Class<F> from, Class<T> to, String xml) {
        F res = SerializationHelper.unmarshall(from, xml);
        if (from.equals(to)) {
            return (T) res;
        }
        return Mapper.map(res, to, this);
    }

    /**
     * When HttpProxyBroker instance is no longer needed, shut down the connection
     * manager to ensure immediate deallocation of all system resources.
     */
    public void shutdown() {
        this.proxy.shutdown();
    }
}