org.overlord.rtgov.activity.server.rest.client.RESTActivityServer.java Source code

Java tutorial

Introduction

Here is the source code for org.overlord.rtgov.activity.server.rest.client.RESTActivityServer.java

Source

/*
 * 2012-3 Red Hat Inc. and/or its affiliates and other contributors.
 *
 * 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.overlord.rtgov.activity.server.rest.client;

import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.inject.Singleton;

import org.overlord.rtgov.activity.model.ActivityType;
import org.overlord.rtgov.activity.model.ActivityUnit;
import org.overlord.rtgov.activity.model.Context;
import org.overlord.rtgov.activity.server.ActivityServer;
import org.overlord.rtgov.activity.server.QuerySpec;
import org.overlord.rtgov.activity.util.ActivityUtil;

import org.overlord.rtgov.common.util.RTGovProperties;

/**
 * This class provides the REST client implementation of the activity server.
 *
 */
@Singleton
public class RESTActivityServer implements ActivityServer {

    private static final Logger LOG = Logger.getLogger(RESTActivityServer.class.getName());

    private static final String STORE = "/overlord-rtgov/activity/store";
    private static final String UNIT = "/overlord-rtgov/activity/unit";
    private static final String QUERY = "/overlord-rtgov/activity/query";
    private static final String EVENTS = "/overlord-rtgov/activity/events";

    private String _serverURL;
    private String _serverUsername;
    private String _serverPassword;

    /**
     * The default constructor.
     */
    public RESTActivityServer() {
        _serverURL = RTGovProperties.getProperty("RESTActivityServer.serverURL", "http://localhost:8080");
        _serverUsername = RTGovProperties.getProperty("RESTActivityServer.serverUsername", "");
        _serverPassword = RTGovProperties.getProperty("RESTActivityServer.serverPassword", "");
    }

    /**
     * This method sets the URL of the Activity Server.
     * 
     * @param url The URL
     */
    public void setServerURL(String url) {
        _serverURL = url;
    }

    /**
     * This method gets the URL of the Activity Server.
     * 
     * @return The URL
     */
    public String getServerURL() {
        return (_serverURL);
    }

    /**
     * This method sets the username for the Activity Server.
     * 
     * @param username The username
     */
    public void setServerUsername(String username) {
        _serverUsername = username;
    }

    /**
     * This method gets the username for the Activity Server.
     * 
     * @return The username
     */
    public String getServerUsername() {
        return (_serverUsername);
    }

    /**
     * This method sets the password for the Activity Server.
     * 
     * @param password The password
     */
    public void setServerPassword(String password) {
        _serverPassword = password;
    }

    /**
     * This method gets the password for the Activity Server.
     * 
     * @return The password
     */
    public String getServerPassword() {
        return (_serverPassword);
    }

    /**
     * This method initializes the authentication properties on the supplied
     * URL connection.
     * 
     * @param connection The connection
     */
    protected void initAuth(HttpURLConnection connection) {
        String userPassword = _serverUsername + ":" + _serverPassword;
        String encoding = org.apache.commons.codec.binary.Base64.encodeBase64String(userPassword.getBytes());

        StringBuffer buf = new StringBuffer(encoding);

        for (int i = 0; i < buf.length(); i++) {
            if (Character.isWhitespace(buf.charAt(i))) {
                buf.deleteCharAt(i);
                i--;
            }
        }

        connection.setRequestProperty("Authorization", "Basic " + buf.toString());
    }

    /**
     * {@inheritDoc}
     */
    public void store(List<ActivityUnit> activities) throws Exception {
        URL storeUrl = new URL(_serverURL + STORE);

        if (LOG.isLoggable(Level.FINER)) {
            LOG.finer("RESTActivityServer[" + storeUrl + "] store: " + activities);
        }

        HttpURLConnection connection = (HttpURLConnection) storeUrl.openConnection();

        initAuth(connection);

        connection.setRequestMethod("POST");

        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setUseCaches(false);
        connection.setAllowUserInteraction(false);
        connection.setRequestProperty("Content-Type", "application/json");

        java.io.OutputStream os = connection.getOutputStream();

        os.write(ActivityUtil.serializeActivityUnitList(activities));

        os.flush();
        os.close();

        java.io.InputStream is = connection.getInputStream();

        byte[] b = new byte[is.available()];

        is.read(b);

        is.close();

        if (LOG.isLoggable(Level.FINER)) {
            LOG.finer("RESTActivityServer result: " + new String(b));
        }
    }

    /**
     * {@inheritDoc}
     */
    public ActivityUnit getActivityUnit(String id) throws Exception {
        ActivityUnit ret = null;

        URL queryUrl = new URL(_serverURL + UNIT + "?id=" + id);

        if (LOG.isLoggable(Level.FINER)) {
            LOG.finer("RESTActivityServer[" + queryUrl + "] getActivityUnit: " + id);
        }

        HttpURLConnection connection = (HttpURLConnection) queryUrl.openConnection();

        initAuth(connection);

        connection.setRequestMethod("GET");

        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setUseCaches(false);
        connection.setAllowUserInteraction(false);
        connection.setRequestProperty("Content-Type", "application/json");

        java.io.InputStream is = connection.getInputStream();

        byte[] b = new byte[is.available()];

        is.read(b);

        is.close();

        ret = ActivityUtil.deserializeActivityUnit(b);

        if (LOG.isLoggable(Level.FINER)) {
            LOG.finer("RESTActivityServer getActivityUnit result: " + ret);
        }

        return (ret);
    }

    /**
     * {@inheritDoc}
     */
    public List<ActivityType> getActivityTypes(Context context, long from, long to) throws Exception {
        URL queryUrl = new URL(_serverURL + EVENTS + "?type=" + context.getType() + "&value=" + context.getValue()
                + "&from=" + from + "&to=" + to);

        if (LOG.isLoggable(Level.FINER)) {
            LOG.finer("RESTActivityServer[" + queryUrl + "] getActivityTypes: " + context + " from=" + from + " to="
                    + to);
        }

        return (getActivityTypes(queryUrl));
    }

    /**
     * {@inheritDoc}
     */
    public List<ActivityType> getActivityTypes(Context context) throws Exception {

        URL queryUrl = new URL(_serverURL + EVENTS + "?type=" + context.getType() + "&value=" + context.getValue());

        if (LOG.isLoggable(Level.FINER)) {
            LOG.finer("RESTActivityServer[" + queryUrl + "] getActivityTypes: " + context);
        }

        return (getActivityTypes(queryUrl));
    }

    /**
     * This method retrieves the activity types associated with the supplied
     * query URL.
     * 
     * @param queryUrl The query URL
     * @return The list of activity types
     * @throws Exception Failed to get activity types
     */
    protected List<ActivityType> getActivityTypes(URL queryUrl) throws Exception {
        List<ActivityType> ret = null;

        HttpURLConnection connection = (HttpURLConnection) queryUrl.openConnection();

        initAuth(connection);

        connection.setRequestMethod("GET");

        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setUseCaches(false);
        connection.setAllowUserInteraction(false);
        connection.setRequestProperty("Content-Type", "application/json");

        java.io.InputStream is = connection.getInputStream();

        byte[] b = new byte[is.available()];
        is.read(b);

        ret = ActivityUtil.deserializeActivityTypeList(b);

        is.close();

        if (LOG.isLoggable(Level.FINER)) {
            LOG.finer("RESTActivityServer getActivityTypes result: " + ret);
        }

        return (ret);
    }

    /**
     * {@inheritDoc}
     */
    public List<ActivityType> query(QuerySpec query) throws Exception {
        List<ActivityType> ret = null;

        URL queryUrl = new URL(_serverURL + QUERY);

        if (LOG.isLoggable(Level.FINER)) {
            LOG.finer("RESTActivityServer[" + queryUrl + "] query: " + query);
        }

        HttpURLConnection connection = (HttpURLConnection) queryUrl.openConnection();

        initAuth(connection);

        connection.setRequestMethod("POST");

        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setUseCaches(false);
        connection.setAllowUserInteraction(false);
        connection.setRequestProperty("Content-Type", "application/json");

        java.io.OutputStream os = connection.getOutputStream();

        byte[] b = ActivityUtil.serializeQuerySpec(query);
        os.write(b);

        os.flush();
        os.close();

        java.io.InputStream is = connection.getInputStream();

        b = new byte[is.available()];
        is.read(b);

        ret = ActivityUtil.deserializeActivityTypeList(b);

        is.close();

        if (LOG.isLoggable(Level.FINER)) {
            LOG.finer("RESTActivityServer result: " + ret);
        }

        return (ret);
    }

}