org.openiot.gsn.http.rest.RemoteWrapperParamParser.java Source code

Java tutorial

Introduction

Here is the source code for org.openiot.gsn.http.rest.RemoteWrapperParamParser.java

Source

/**
*    Copyright (c) 2011-2014, OpenIoT
*   
*    This file is part of OpenIoT.
*
*    OpenIoT is free software: you can redistribute it and/or modify
*    it under the terms of the GNU Lesser General Public License as published by
*    the Free Software Foundation, version 3 of the License.
*
*    OpenIoT is distributed in the hope that it will be useful,
*    but WITHOUT ANY WARRANTY; without even the implied warranty of
*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*    GNU Lesser General Public License for more details.
*
*    You should have received a copy of the GNU Lesser General Public License
*    along with OpenIoT.  If not, see <http://www.gnu.org/licenses/>.
*
*     Contact: OpenIoT mailto: info@openiot.eu
 * @author Ali Salehi
 * @author Timotee Maret
*/

package org.openiot.gsn.http.rest;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import org.openiot.gsn.DataDistributer;
import org.openiot.gsn.beans.AddressBean;
import org.openiot.gsn.beans.ContainerConfig;
import org.openiot.gsn.utils.Helpers;

import org.apache.log4j.Logger;
import org.joda.time.format.ISODateTimeFormat;

public class RemoteWrapperParamParser {

    private final transient Logger logger = Logger.getLogger(RemoteWrapperParamParser.class);

    private long startTime;
    private boolean isPushBased;
    private String query, deliveryContactPoint, remoteContactPoint;
    private String username, password;
    private boolean isSSLRequired;
    // The default timeout is set to 3 times the rate of the periodical Keep alive messages.
    // The timeout can be overriden in the virtual sensor description files.
    private int timeout = 3 * DataDistributer.getKeepAlivePeriod();

    private final String CURRENT_TIME = ISODateTimeFormat.dateTime().print(System.currentTimeMillis());

    public RemoteWrapperParamParser(AddressBean addressBean, boolean isPushBased) {

        query = addressBean.getPredicateValueWithException("query");

        logger.debug("Remote wrapper parameter [keep-alive: " + isPushBased + "], Query=> " + query);

        if (isPushBased)
            deliveryContactPoint = addressBean.getPredicateValueWithException(PushDelivery.LOCAL_CONTACT_POINT);

        username = addressBean.getPredicateValue("username");
        password = addressBean.getPredicateValue("password");

        timeout = addressBean.getPredicateValueAsInt("timeout", timeout);

        /**
        * First looks for URL parameter, if it is there it will be used otherwise
        * looks for host and port parameters.
        */
        if ((remoteContactPoint = addressBean.getPredicateValue("remote-contact-point")) == null) {
            String host = addressBean.getPredicateValue("host");
            if (host == null || host.trim().length() == 0)
                throw new RuntimeException("The >host< parameter is missing from the RemoteWrapper wrapper.");
            int port = addressBean.getPredicateValueAsInt("port", ContainerConfig.DEFAULT_GSN_PORT);
            if (port > 65000 || port <= 0)
                throw new RuntimeException("Remote wrapper initialization failed, bad port number:" + port);

            remoteContactPoint = "http://" + host + ":" + port + "/streaming/";
        }
        remoteContactPoint = remoteContactPoint.trim();
        if (!remoteContactPoint.trim().endsWith("/"))
            remoteContactPoint += "/";
        //
        isSSLRequired = remoteContactPoint.toLowerCase().startsWith("https");

        try {
            startTime = Helpers
                    .convertTimeFromIsoToLong(addressBean.getPredicateValueWithDefault("start-time", CURRENT_TIME));
        } catch (Exception e) {
            logger.error("Failed to parse the start-time parameter of the remote wrapper, a sample time could be:"
                    + (CURRENT_TIME));
            throw new RuntimeException(e);
        }
    }

    public long getStartTime() {
        return startTime;
    }

    public String getStartTimeInString(long time) {
        return ISODateTimeFormat.dateTime().print(time);
    }

    public boolean isPushBased() {
        return isPushBased;
    }

    public String getQuery() {
        return query;
    }

    public String getLocalContactPoint() {
        return deliveryContactPoint;
    }

    public String getRemoteContactPoint() {
        return remoteContactPoint;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public int getTimeout() {
        return timeout;
    }

    public boolean isSSLRequired() {
        return isSSLRequired;
    }

    public String getRemoteContactPointEncoded(long lastModifiedTime) {
        String toSend;
        try {
            toSend = getRemoteContactPoint() + URLEncoder.encode(query, "UTF-8") + "/"
                    + URLEncoder.encode(getStartTimeInString(lastModifiedTime), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        logger.debug(new StringBuilder("Wants to connect to ")
                .append(getRemoteContactPoint() + query + "/" + getStartTimeInString(lastModifiedTime))
                .append("==Encoded==> " + toSend));
        return toSend;
    }

}