/**
* Global Sensor Networks (GSN) Source Code
* Copyright (c) 2006-2016, Ecole Polytechnique Federale de Lausanne (EPFL)
*
* This file is part of GSN.
*
* GSN is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GSN 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GSN. If not, see <http://www.gnu.org/licenses/>.
*
* File: src/ch/epfl/gsn/beans/VSensorConfig.java
*
* @author Jerome Rousselot
* @author Mehdi Riahi
* @author gsn_devs
* @author Ali Salehi
* @author Timotee Maret
*
*/
package ch.epfl.gsn.beans;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.*;
import org.apache.commons.collections.KeyValue;
import org.slf4j.LoggerFactory;
import ch.epfl.gsn.Main;
import ch.epfl.gsn.beans.AddressBean;
import ch.epfl.gsn.beans.DataField;
import ch.epfl.gsn.beans.InputStream;
import ch.epfl.gsn.beans.StorageConfig;
import ch.epfl.gsn.beans.StreamSource;
import ch.epfl.gsn.beans.VSensorConfig;
import ch.epfl.gsn.beans.WebInput;
import ch.epfl.gsn.utils.CaseInsensitiveComparator;
import ch.epfl.gsn.utils.Pair;
import ch.epfl.gsn.utils.Utils;
import org.slf4j.Logger;
public class VSensorConfig implements Serializable {
private static final long serialVersionUID = 1625382440863797197L;
public static final int DEFAULT_PRIORITY = 100;
public static final int NO_FIXED_RATE = 0;
public static final int DEFAULT_POOL_SIZE = 10;
private String name;
private int priority = DEFAULT_PRIORITY;
private String mainClass;
private String description;
@Deprecated
private int lifeCyclePoolSize = DEFAULT_POOL_SIZE;
private int outputStreamRate;
private KeyValue[] addressing ;
private DataField [] outputStructure ;
private String webParameterPassword = null;
private String storageHistorySize = null;
private final HashMap < String , InputStream > inputStreamNameToInputStreamObjectMapping = new HashMap < String , InputStream >();
private InputStream inputStreams [] ;
private ArrayList < KeyValue > mainClassInitialParams = new ArrayList < KeyValue >( );
private transient Long lastModified;
private String fileName;
private StorageConfig storage;
private String timeZone;
private SimpleDateFormat sdf = null;
private transient final Logger logger = LoggerFactory.getLogger( VSensorConfig.class );
private String directoryQuery ;
private WebInput[] webinput;
private String sensorMap = "false";
private String access_protected = "false";
/**
* @return Returns the addressing.
*/
public KeyValue[] getAddressing ( ) {
return this.addressing;
}
public String[][] getRPCFriendlyAddressing() {
String[][] toReturn = new String[this.addressing.length][2] ;
for(int i=0;i<toReturn.length;i++)
for (KeyValue val : this.addressing) {
toReturn[i][0] = ( String ) val.getKey( );
toReturn[i][1] = ( String ) val.getValue( );
}
return toReturn;
}
public String[][] getRPCFriendlyOutputStructure() {
String[][] toReturn = new String[this.outputStructure.length][2] ;
for(int i=0;i<outputStructure.length;i++){
toReturn[i][0] = ( String ) outputStructure[i].getName();
toReturn[i][1] = ( String ) outputStructure[i].getType();
}
return toReturn;
}
/**
* @return Returns the description.
*/
public String getDescription ( ) {
return this.description;
}
/**
* @return Returns the inputStreams.
*/
public Collection < InputStream > getInputStreams ( ) {
return this.inputStreamNameToInputStreamObjectMapping.values( );
}
public InputStream getInputStream ( final String inputStreamName ) {
return this.inputStreamNameToInputStreamObjectMapping.get( inputStreamName );
}
/**
* @Deprecated
* @return Returns the lifeCyclePoolSize.
*/
public int getLifeCyclePoolSize ( ) {
return this.lifeCyclePoolSize;
}
/**
* @return Returns the mainClass.
*/
public String getProcessingClass ( ) {
if ( this.mainClass == null ) this.mainClass = "ch.epfl.gsn.vsensor.BridgeVirtualSensor";
return this.mainClass;
}
/**
* The <code>nameInitialized</code> is used to cache the virtual sensor's
* name for preformance.
*/
private boolean nameInitialized = false;
public String getName ( ) {
if ( this.nameInitialized == false ) {
this.name = this.name.replace( " " , "" ).trim( ).toLowerCase();
this.nameInitialized = true;
}
return this.name;
}
/**
* @return Returns the outputStreamRate.
*/
public int getOutputStreamRate ( ) {
return this.outputStreamRate;
}
/**
* @return Returns the outputStructure.
*/
public DataField [] getOutputStructure ( ) {
return this.outputStructure;
}
/**
* @return Returns the priority.
*/
public int getPriority ( ) {
return this.priority;
}
public Long getLastModified ( ) {
return this.lastModified;
}
/**
* @param addressing The addressing to set.
*/
public void setAddressing ( KeyValue [] addressing ) {
this.addressing = addressing;
}
/**
* @param description The description to set.
*/
public void setDescription ( final String description ) {
this.description = description;
}
/**
* @param lastModified The lastModified to set.
*/
public void setLastModified ( final Long lastModified ) {
this.lastModified = lastModified;
}
/**
* @Deprecated
* @param lifeCyclePoolSize The lifeCyclePoolSize to set.
*/
public void setLifeCyclePoolSize ( final int lifeCyclePoolSize ) {
this.lifeCyclePoolSize = lifeCyclePoolSize;
}
/**
* @param mainClass The mainClass to set.
*/
public void setMainClass ( final String mainClass ) {
this.mainClass = mainClass;
}
/**
* @param virtualSensorName The name to set.
*/
public void setName ( final String virtualSensorName ) {
this.name = virtualSensorName;
}
/**
* @param outputStreamRate The outputStreamRate to set.
*/
public void setOutputStreamRate ( final int outputStreamRate ) {
this.outputStreamRate = outputStreamRate;
}
/**
* @param outputStructure The outputStructure to set.
*/
public void setOutputStructure ( DataField[] outputStructure) {
this.outputStructure = outputStructure;
}
/**
* @param priority The priority to set.
*/
public void setPriority ( final int priority ) {
this.priority = priority;
}
public String [ ] getAddressingKeys ( ) {
final String result[] = new String [ this.getAddressing( ).length ];
int counter = 0;
for ( final KeyValue predicate : this.getAddressing( ) )
result[ counter++ ] = ( String ) predicate.getKey( );
return result;
}
public String [ ] getAddressingValues ( ) {
final String result[] = new String [ this.getAddressing( ).length ];
int counter = 0;
for ( final KeyValue predicate : this.getAddressing( ) )
result[ counter++ ] = ( String ) predicate.getValue( );
return result;
}
private boolean isGetMainClassInitParamsInitialized = false;
private final TreeMap < String , String > mainClassInitParams = new TreeMap < String , String >( new CaseInsensitiveComparator());
/**
* Note that the key and value both are trimmed before being inserted into
* the data strcture.
*
* @return
*/
public TreeMap < String , String > getMainClassInitialParams ( ) {
if ( !this.isGetMainClassInitParamsInitialized ) {
this.isGetMainClassInitParamsInitialized = true;
for ( final KeyValue param : this.mainClassInitialParams ) {
this.mainClassInitParams.put( param.getKey( ).toString( ).toLowerCase( ) , param.getValue( ).toString( ) );
}
}
return this.mainClassInitParams;
}
public void setMainClassInitialParams ( final ArrayList < KeyValue > mainClassInitialParams ) {
this.mainClassInitialParams = mainClassInitialParams;
}
public String getFileName ( ) {
return this.fileName;
}
public void setFileName ( final String fileName ) {
this.fileName = fileName;
}
private boolean isStorageCountBased = true;
public static final int STORAGE_SIZE_NOT_SET = -1;
private long parsedStorageSize = STORAGE_SIZE_NOT_SET;
/**
* @return Returns the storageHistorySize.
*/
public String getStorageHistorySize ( ) {
if (storageHistorySize == null) {
if ( storage == null || storage.getStorageSize() == null || storage.getStorageSize().trim( ).equals( "" ) )
storageHistorySize = ""+STORAGE_SIZE_NOT_SET;
else
storageHistorySize = storage.getStorageSize();
}
return storageHistorySize;
}
public boolean validate ( ) {
for ( final InputStream inputStream : this.inputStreams )
this.inputStreamNameToInputStreamObjectMapping.put( inputStream.getInputStreamName( ) , inputStream );
try {
Pair<Boolean,Long> p = Utils.parseWindowSize(this.getStorageHistorySize( ));
this.parsedStorageSize = p.getSecond();
this.isStorageCountBased = ! p.getFirst();
} catch ( final NumberFormatException e ) {
logger.error( "The storage size, " + storageHistorySize + ", specified for the virtual sensor : " + name + " is not valid.", e );
return false;
}
return true;
}
public StorageConfig getStorage() {
return storage;
}
public void setStorage(StorageConfig sc){
this.storage=sc;
}
public boolean isStorageCountBased ( ) {
return this.isStorageCountBased;
}
public long getParsedStorageSize ( ) {
return this.parsedStorageSize;
}
public String getDirectoryQuery() {
return directoryQuery;
}
/**
* @return the securityCode
*/
public String getWebParameterPassword ( ) {
return webParameterPassword;
}
public void setWebParameterPassword ( String p) {
webParameterPassword=p;
}
public String toString ( ) {
final StringBuilder builder = new StringBuilder( "Input Stream [" );
for ( final InputStream inputStream : this.getInputStreams( ) ) {
builder.append( "Input-Stream-Name" ).append( inputStream.getInputStreamName( ) );
builder.append( "Input-Stream-Query" ).append( inputStream.getQuery( ) );
builder.append( " Stream-Sources ( " );
if ( inputStream.getSources( ) == null )
builder.append( "null" );
else
for ( final StreamSource ss : inputStream.getSources( ) ) {
builder.append( "Stream-Source Alias : " ).append( ss.getAlias( ) );
for ( final AddressBean addressing : ss.getAddressing( ) ) {
builder.append( "Stream-Source-wrapper >" ).append( addressing.getWrapper( ) ).append( "< with addressign predicates : " );
for ( final KeyValue keyValue : addressing.getPredicates( ) )
builder.append( "Key=" ).append( keyValue.getKey( ) ).append( "Value=" ).append( keyValue.getValue( ) );
}
builder.append( " , " );
}
builder.append( ")" );
}
builder.append( "]" );
return "VSensorConfig{" + "name='" + this.name + '\'' + ", priority=" + this.priority + ", mainClass='" + this.mainClass + '\''
+ ", description='" + this.description + '\'' + ", outputStreamRate=" + this.outputStreamRate
+ ", addressing=" + this.addressing + ", outputStructure=" + this.outputStructure + ", storageHistorySize='" + this.storageHistorySize + '\'' + builder.toString( )
+ ", mainClassInitialParams=" + this.mainClassInitialParams + ", lastModified=" + this.lastModified + ", fileName='" + this.fileName + '\'' + ", logger=" + this.logger + ", nameInitialized="
+ this.nameInitialized + ", isStorageCountBased=" + this.isStorageCountBased + ", parsedStorageSize=" + this.parsedStorageSize + '}';
}
public boolean equals(Object obj){
if (obj instanceof VSensorConfig) {
VSensorConfig vSensorConfig = (VSensorConfig) obj;
return name.equals(vSensorConfig.getName());
}
return false;
}
public int hashCode(){
if(name != null){
return name.hashCode();
}
else{
return super.hashCode();
}
}
// time zone
public SimpleDateFormat getSDF() {
if (timeZone == null)
return null;
else {
if (sdf == null) {
sdf = new SimpleDateFormat (Main.getContainerConfig().getTimeFormat());
sdf.setTimeZone(TimeZone.getTimeZone(timeZone));
}
}
return sdf;
}
/**
* @return the webinput
*/
public WebInput [ ] getWebinput ( ) {
return webinput;
}
public void setWebInput(WebInput[] webInput){
this.webinput = webInput;
}
public void setInputStreams(InputStream... inputStreams) {
this.inputStreams = inputStreams;
}
public void setStorageHistorySize(String storageHistorySize){
this.storageHistorySize = storageHistorySize;
}
public boolean getPublishToSensorMap() {
if (sensorMap==null)
return false;
return Boolean.parseBoolean(sensorMap.toString());
}
/**
* Addressing Helper methods.
*/
private transient Double cached_altitude = null ;
private transient Double cached_longitude = null;
private transient Double cached_latitude = null;
private boolean addressing_processed = false;
private boolean isTimestampUnique = false;
public void preprocess_addressing() {
if (!addressing_processed) {
for (KeyValue kv:getAddressing())
if (kv.getKey().toString().equalsIgnoreCase("altitude"))
cached_altitude=Double.parseDouble(kv.getValue().toString());
else if (kv.getKey().toString().equalsIgnoreCase("longitude"))
cached_longitude=Double.parseDouble(kv.getValue().toString());
else if (kv.getKey().toString().equalsIgnoreCase("latitude"))
cached_latitude=Double.parseDouble(kv.getValue().toString());
addressing_processed=true;
}
}
public Double getAltitude() {
preprocess_addressing();
return cached_altitude;
}
public Double getLatitude() {
preprocess_addressing();
return cached_latitude;
}
public Double getLongitude() {
preprocess_addressing();
return cached_longitude;
}
public boolean getIsTimeStampUnique() {
return isTimestampUnique ;
}
public void setIsTimeStampUnique(boolean unique){
this.isTimestampUnique=unique;
}
public boolean isAccess_protected() {
try {
return Boolean.parseBoolean(access_protected.trim());
}catch (Exception e) {
logger.error(e.getMessage(), e);
return false;
}
}
}