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