/* * RomRaider Open-Source Tuning, Logging and Reflashing * Copyright (C) 2006-2015 RomRaider.com * * This program 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 2 of the License, or * (at your option) any later version. * * This program 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 this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package com.romraider.logger.external.core; import com.romraider.logger.ecu.definition.plugin.PluginFilenameFilter; import com.romraider.logger.ecu.exception.ConfigurationException; import static com.romraider.util.ParamChecker.isNullOrEmpty; import org.apache.log4j.Logger; import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Properties; public final class ExternalDataSourceLoaderImpl implements ExternalDataSourceLoader { private static final Logger LOGGER = Logger.getLogger(ExternalDataSourceLoaderImpl.class); private List<ExternalDataSource> externalDataSources = new ArrayList<ExternalDataSource>(); public void loadExternalDataSources(Map<String, String> loggerPluginPorts) { try { File pluginsDir = new File("./plugins"); if (pluginsDir.exists() && pluginsDir.isDirectory()) { File[] pluginPropertyFiles = pluginsDir.listFiles(new PluginFilenameFilter()); for (File pluginPropertyFile : pluginPropertyFiles) { Properties pluginProps = new Properties(); FileInputStream inputStream = new FileInputStream(pluginPropertyFile); try { pluginProps.load(inputStream); String datasourceClassName = pluginProps.getProperty("datasource.class"); if (!isNullOrEmpty(datasourceClassName)) { try { Class<?> dataSourceClass = getClass().getClassLoader().loadClass(datasourceClassName); if (dataSourceClass != null && ExternalDataSource.class.isAssignableFrom(dataSourceClass)) { ExternalDataSource dataSource = dataSource(dataSourceClass, loggerPluginPorts, pluginProps); ExternalDataSource managedDataSource = new GenericDataSourceManager(dataSource); externalDataSources.add(managedDataSource); LOGGER.info("Plugin loaded: " + dataSource.getName() + " v" + dataSource.getVersion()); } } catch (Throwable t) { LOGGER.error("Error loading external datasource: " + datasourceClassName + ", specified in: " + pluginPropertyFile.getAbsolutePath(), t); } } } finally { inputStream.close(); } } } } catch (Exception e) { throw new ConfigurationException(e); } } private ExternalDataSource dataSource( Class<?> dataSourceClass, Map<String, String> loggerPluginPorts, Properties pluginProps) throws Exception { ExternalDataSource dataSource = (ExternalDataSource) dataSourceClass.newInstance(); if (loggerPluginPorts != null) { String port = loggerPluginPorts.get(dataSource.getId()); if (port != null && port.trim().length() > 0) dataSource.setPort(port); } dataSource.setProperties(pluginProps); return dataSource; } public List<ExternalDataSource> getExternalDataSources() { return externalDataSources; } }