/** * 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/Mappings.java * * @author Ali Salehi * @author Mehdi Riahi * @author Timotee Maret * */ package ch.epfl.gsn; import java.util.Iterator; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; import org.slf4j.LoggerFactory; import ch.epfl.gsn.Mappings; import ch.epfl.gsn.VirtualSensor; import ch.epfl.gsn.beans.DataField; import ch.epfl.gsn.beans.VSensorConfig; import org.slf4j.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 = LoggerFactory.getLogger(Mappings.class); public static boolean addVSensorInstance(VirtualSensor sensorPool) { try { logger.info("Testing the pool for :" + sensorPool.getConfig().getName()); sensorPool.returnVS(sensorPool.borrowVS()); } catch (Exception 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. " + e.getMessage(), e ); 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; } }