// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.ImportImagePlugin;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Properties;
import javax.swing.JMenu;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.ExtensionFileFilter;
import org.openstreetmap.josm.actions.JosmAction;
import org.openstreetmap.josm.gui.MainMenu;
import org.openstreetmap.josm.plugins.Plugin;
import org.openstreetmap.josm.plugins.PluginInformation;
import org.openstreetmap.josm.tools.Utils;
/**
* Plugin class.
* Provides basic routines for plugin installation and provides the plugin properties.
*
*
* @author Christoph Beekmans, Fabian Kowitz, Anna Robaszkiewicz, Oliver Kuhn, Martin Ulitzny
*
*/
public class ImportImagePlugin extends Plugin {
private static Logger logger;
JMenu mainmenu = null;
JosmAction loadFileAction = null;
// custom Classloader
static ClassLoader pluginClassLoader;
// plugin proerties
static Properties pluginProps;
// path constants
static final String PLUGIN_DIR =
Main.pref.getPluginsDirectory().getAbsolutePath() + "/ImportImagePlugin/";
static final String PLUGINPROPERTIES_PATH =
Main.pref.getPluginsDirectory().getAbsolutePath() + "/ImportImagePlugin/pluginProperties.properties";
static final String PLUGINLIBRARIES_DIR =
Main.pref.getPluginsDirectory().getAbsolutePath() + "/ImportImagePlugin/lib/";
static final String PLUGINPROPERTIES_FILENAME = "pluginProperties.properties";
static final String LOGGING_PROPERTIES_FILEPATH =
Main.pref.getPluginsDirectory().getAbsolutePath() + "/ImportImagePlugin/log4j.properties/";
public Properties getPluginProps() {
return pluginProps;
}
/**
* constructor
*
* @throws IOException if any I/O error occurs
*/
public ImportImagePlugin(PluginInformation info) throws IOException {
super(info);
try {
// First create custom ClassLoader to load resources from the main JAR
pluginClassLoader = createPluginClassLoader();
// Initialize logger
initializeLogger(pluginClassLoader);
// Check whether plugin has already been installed. Otherwise install
checkInstallation();
// If resources are available load properties from plugin directory
if (pluginProps == null || pluginProps.isEmpty()) {
pluginProps = new Properties();
pluginProps.load(new File(PLUGINPROPERTIES_PATH).toURI().toURL().openStream());
logger.debug("Plugin properties loaded");
}
// load information about supported reference systems
PluginOperations.loadCRSData(pluginProps);
// create new Action for menu entry
loadFileAction = new LoadImageAction();
loadFileAction.setEnabled(true);
if (Main.main != null) {
MainMenu.add(Main.main.menu.imagerySubMenu, loadFileAction);
}
ExtensionFileFilter.addImporter(new ImportImageFileImporter());
} catch (IOException e) {
logger.fatal("Error while loading plugin", e);
throw e;
}
logger.info("Plugin successfully loaded.");
}
/**
* Checks whether plugin resources are available.
* If not, start install procedure.
*/
private void checkInstallation() throws IOException {
// check plugin resource state
boolean isInstalled = true;
if (!new File(PLUGINPROPERTIES_PATH).exists()
|| !new File(PLUGIN_DIR).exists()
|| !new File(PLUGINLIBRARIES_DIR).exists())
isInstalled = false;
// if properties file doesn't exist, install plugin
if (!isInstalled) {
/*----------- Begin installation ---------------*/
// check if plugin directory exist
File pluginDir = new File(PLUGIN_DIR);
if (!pluginDir.exists()) {
Utils.mkDirs(pluginDir);
}
// check if "lib" directory exist
File libDir = new File(PLUGINLIBRARIES_DIR);
if (!libDir.exists()) {
Utils.mkDirs(libDir);
}
// create local properties file
if (pluginProps == null || pluginProps.isEmpty()) {
try (FileWriter fw = new FileWriter(new File(PLUGINPROPERTIES_PATH))) {
URL propertiesURL = pluginClassLoader.getResource("resources/" + PLUGINPROPERTIES_FILENAME);
pluginProps = new Properties();
pluginProps.load(propertiesURL.openStream());
pluginProps.store(fw, null);
}
logger.debug("Plugin properties loaded");
}
if (!new File(LOGGING_PROPERTIES_FILEPATH).exists()) {
try (FileWriter fw = new FileWriter(new File(LOGGING_PROPERTIES_FILEPATH))) {
URL propertiesURL = pluginClassLoader.getResource("resources/log4j.properties");
Properties loggingProps = new Properties();
loggingProps.load(propertiesURL.openStream());
loggingProps.store(fw, null);
}
logger.debug("Logging properties created");
}
logger.debug("Plugin successfully installed");
}
}
/**
* Initialize logger using plugin classloader.
*/
private void initializeLogger(ClassLoader cl) {
Properties props = new Properties();
try {
props.load(new File(LOGGING_PROPERTIES_FILEPATH).toURI().toURL().openStream());
// Set file for logging here:
props.setProperty("log4j.appender.MyRoFiAppender.file",
(Main.pref.getPluginsDirectory().getAbsolutePath() + "/ImportImagePlugin/" + "log.log"));
PropertyConfigurator.configure(props);
logger = Logger.getLogger(ImportImagePlugin.class);
logger.info("Logger successfully initialized.");
return;
} catch (IOException e) {
System.out.println("Logging properties file not found. Using standard settings.");
}
// if no log4j.properties file can be found, initialize manually:
props.setProperty("log4j.rootLogger", "INFO, A");
props.setProperty("log4j.appender.A", "org.apache.log4j.FileAppender");
props.setProperty("log4j.appender.A.layout",
"org.apache.log4j.PatternLayout ");
props.setProperty("log4j.appender.A.layout.ConversionPattern",
"%d{ISO8601} %-5p [%t] %c: %m%n");
// Set file for logging here:
props.setProperty("log4j.appender.A.file",
(Main.pref.getPluginsDirectory().getAbsolutePath() + "/ImportImagePlugin/" + "log.log"));
PropertyConfigurator.configure(props);
logger = Logger.getLogger(ImportImagePlugin.class);
logger.info("Logger successfully initialized with standard settings.");
}
/**
* get a plugin-specific classloader.
*/
private ClassLoader createPluginClassLoader() throws MalformedURLException {
ClassLoader loader = null;
loader = URLClassLoader.newInstance(
new URL[] {new File(Main.pref.getPluginsDirectory().getAbsolutePath() + "/ImportImagePlugin.jar").toURI().toURL()},
ImportImagePlugin.class.getClassLoader()
);
return loader;
}
}