/**
* 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 Mehdi Riahi
* @author Timotee Maret
*/
package org.openiot.gsn;
import org.openiot.gsn.beans.DataField;
import org.openiot.gsn.beans.VSensorConfig;
import java.util.Iterator;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.log4j.Logger;
public final class Mappings {
private static final ConcurrentHashMap<String,VSensorConfig> vsNameTOVSConfig = new ConcurrentHashMap<String,VSensorConfig>( );
private static final ConcurrentHashMap < String , VirtualSensor> fileNameToVSInstance = new ConcurrentHashMap < String , VirtualSensor>( );
private static final ConcurrentHashMap < String , TreeMap < String , Boolean >> vsNamesToOutputStructureFields = new ConcurrentHashMap < String , TreeMap < String , Boolean >>( );
private static final transient Logger logger = Logger.getLogger( Mappings.class );
public static boolean addVSensorInstance ( VirtualSensor sensorPool ) {
try {
if ( logger.isInfoEnabled( ) ) logger.info( ( new StringBuilder( "Testing the pool for :" ) ).append( sensorPool.getConfig( ).getName( ) ).toString( ) );
sensorPool.returnVS( sensorPool.borrowVS( ) );
} catch ( Exception e ) {
logger.error( e.getMessage( ) , e );
sensorPool.closePool( );
logger.error( "GSN can't load the virtual sensor specified at " + sensorPool.getConfig( ).getFileName( ) + " because the initialization of the virtual sensor failed (see above exception)." );
logger.error( "Please fix the following error" );
return false;
}
TreeMap < String , Boolean > vsNameToOutputStructureFields = new TreeMap < String , Boolean >( );
vsNamesToOutputStructureFields.put( sensorPool.getConfig( ).getName( ) , vsNameToOutputStructureFields );
for ( DataField fields : sensorPool.getConfig( ).getOutputStructure( ) )
vsNameToOutputStructureFields.put( fields.getName( ) , Boolean.TRUE );
vsNameToOutputStructureFields.put( "timed" , Boolean.TRUE );
vsNameTOVSConfig.put( sensorPool.getConfig( ).getName( ) , sensorPool.getConfig( ) );
fileNameToVSInstance.put( sensorPool.getConfig( ).getFileName( ) , sensorPool );
return true;
}
public static VirtualSensor getVSensorInstanceByFileName ( String fileName ) {
return fileNameToVSInstance.get( fileName );
}
public static final TreeMap < String , Boolean > getVsNamesToOutputStructureFieldsMapping ( String vsName ) {
return vsNamesToOutputStructureFields.get( vsName );
}
public static VSensorConfig getVSensorConfig ( String vSensorName ) {
if ( vSensorName == null ) return null;
return vsNameTOVSConfig.get( vSensorName );
}
public static void removeFilename ( String fileName ) {
if(fileNameToVSInstance.containsKey(fileName)){
VSensorConfig config = ( fileNameToVSInstance.get( fileName ) ).getConfig( );
vsNameTOVSConfig.remove( config.getName( ) );
fileNameToVSInstance.remove( fileName );
}
}
public static Long getLastModifiedTime ( String configFileName ) {
return Long.valueOf( ( fileNameToVSInstance.get( configFileName ) ).getLastModified( ) );
}
public static String [ ] getAllKnownFileName ( ) {
return fileNameToVSInstance.keySet( ).toArray( new String [ 0 ] );
}
public static VSensorConfig getConfigurationObject ( String fileName ) {
if ( fileName == null ) return null;
return ( fileNameToVSInstance.get( fileName ) ).getConfig( );
}
public static Iterator < VSensorConfig > getAllVSensorConfigs ( ) {
return vsNameTOVSConfig.values( ).iterator( );
}
public static VirtualSensor getVSensorInstanceByVSName ( String vsensorName ) {
if ( vsensorName == null ) return null;
VSensorConfig vSensorConfig = vsNameTOVSConfig.get( vsensorName );
if ( vSensorConfig == null ) return null;
return getVSensorInstanceByFileName( vSensorConfig.getFileName( ) );
}
/**
* Case insensitive matching.
* @param vsName
* @return
*/
public static VSensorConfig getConfig(String vsName) {
Iterator<VSensorConfig> configs = Mappings.getAllVSensorConfigs();
while(configs.hasNext()) {
VSensorConfig config = configs.next();
if (config.getName().equalsIgnoreCase(vsName))
return config;
}
return null;
}
}