// Path: src/main/java/octopus/OctopusEnvironment.java
// public class OctopusEnvironment {
// 
// 	private static final String OCTOPUS_HOME_STR;
// 	private static final String DATA_STR = "data";
// 	private static final String PROJECTS_STR = "projects";
// 	private static final String PLUGINS_STR = "plugins";
// 	private static final String LANGUAGES_STR = "languages";
// 
// 	public static final Path PROJECTS_DIR;
// 	public static final Path PLUGINS_DIR;
// 	public static final Path LANGUAGES_DIR;
// 
// 	static {
// 
// 		OCTOPUS_HOME_STR = System.getProperty("OCTOPUS_HOME");
// 
//         if (OCTOPUS_HOME_STR == null)
//         {
//             throw new RuntimeException("System property OCTOPUS_HOME not defined.");
//         }
// 
//         PROJECTS_DIR = Paths.get(OCTOPUS_HOME_STR, DATA_STR, PROJECTS_STR);
//         PLUGINS_DIR = Paths.get(OCTOPUS_HOME_STR, PLUGINS_STR);
//         LANGUAGES_DIR = Paths.get(OCTOPUS_HOME_STR, LANGUAGES_STR);
// 
// 	}
// 
// }
// 
// Path: src/main/java/octopus/server/pluginInterface/PluginLoader.java
// public class PluginLoader
// {
// 	public static Plugin load(Path pathToJar, String pluginClass)
// 	{
// 		ClassLoader parentClassLoader = PluginClassLoader.class
// 				.getClassLoader();
// 		PluginClassLoader classLoader = new PluginClassLoader(
// 				parentClassLoader);
// 		classLoader.setJarFilename(pathToJar.toString());
// 
// 		return createPluginInstance(classLoader, pluginClass);
// 	}
// 
// 	public static Plugin load(String pluginClass)
// 	{
// 		ClassLoader parentClassLoader = PluginClassLoader.class
// 				.getClassLoader();
// 		return createPluginInstance(parentClassLoader, pluginClass);
// 	}
// 
// 	private static Plugin createPluginInstance(ClassLoader classLoader, String pluginClass)
// 	{
// 		try
// 		{
// 			Class<?> myObjectClass = classLoader.loadClass(pluginClass);
// 			return (Plugin) myObjectClass.newInstance();
// 		} catch (Exception e)
// 		{
// 				return null;
// 		}
// 	}
// 
// }


import java.nio.file.Path;
import java.nio.file.Paths;
import org.json.JSONObject;
import octopus.OctopusEnvironment;
import octopus.server.pluginInterface.PluginLoader;
package octopus.api.plugin;




public class PluginExecutor {

	public Object executePlugin(String pluginName, String pluginClass)
	{
		return executePlugin(pluginName, pluginClass, null);
	}

	public Object executePlugin(String pluginName, String pluginClass, JSONObject settings)
	{
		Plugin plugin;

		if(!pluginName.equals("")){
			String pluginDir = OctopusEnvironment.PLUGINS_DIR.toString();
			Path pathToJar = Paths.get(pluginDir, pluginName).toAbsolutePath();
			plugin = PluginLoader.load(pathToJar, pluginClass);
		}else{
			plugin = PluginLoader.load(pluginClass);
		}

		if (plugin == null)
			throw new RuntimeException(
					"Error while loading plugin " + pluginName);

		try
		{
// Path: src/main/java/octopus/OctopusEnvironment.java
// public class OctopusEnvironment {
// 
// 	private static final String OCTOPUS_HOME_STR;
// 	private static final String DATA_STR = "data";
// 	private static final String PROJECTS_STR = "projects";
// 	private static final String PLUGINS_STR = "plugins";
// 	private static final String LANGUAGES_STR = "languages";
// 
// 	public static final Path PROJECTS_DIR;
// 	public static final Path PLUGINS_DIR;
// 	public static final Path LANGUAGES_DIR;
// 
// 	static {
// 
// 		OCTOPUS_HOME_STR = System.getProperty("OCTOPUS_HOME");
// 
//         if (OCTOPUS_HOME_STR == null)
//         {
//             throw new RuntimeException("System property OCTOPUS_HOME not defined.");
//         }
// 
//         PROJECTS_DIR = Paths.get(OCTOPUS_HOME_STR, DATA_STR, PROJECTS_STR);
//         PLUGINS_DIR = Paths.get(OCTOPUS_HOME_STR, PLUGINS_STR);
//         LANGUAGES_DIR = Paths.get(OCTOPUS_HOME_STR, LANGUAGES_STR);
// 
// 	}
// 
// }
// 
// Path: src/main/java/octopus/server/pluginInterface/PluginLoader.java
// public class PluginLoader
// {
// 	public static Plugin load(Path pathToJar, String pluginClass)
// 	{
// 		ClassLoader parentClassLoader = PluginClassLoader.class
// 				.getClassLoader();
// 		PluginClassLoader classLoader = new PluginClassLoader(
// 				parentClassLoader);
// 		classLoader.setJarFilename(pathToJar.toString());
// 
// 		return createPluginInstance(classLoader, pluginClass);
// 	}
// 
// 	public static Plugin load(String pluginClass)
// 	{
// 		ClassLoader parentClassLoader = PluginClassLoader.class
// 				.getClassLoader();
// 		return createPluginInstance(parentClassLoader, pluginClass);
// 	}
// 
// 	private static Plugin createPluginInstance(ClassLoader classLoader, String pluginClass)
// 	{
// 		try
// 		{
// 			Class<?> myObjectClass = classLoader.loadClass(pluginClass);
// 			return (Plugin) myObjectClass.newInstance();
// 		} catch (Exception e)
// 		{
// 				return null;
// 		}
// 	}
// 
// }


// Path: src/main/java/octopus/api/plugin/PluginExecutor.java
import java.nio.file.Path;
import java.nio.file.Paths;
import org.json.JSONObject;
import octopus.OctopusEnvironment;
import octopus.server.pluginInterface.PluginLoader;

package octopus.api.plugin;




public class PluginExecutor {

	public Object executePlugin(String pluginName, String pluginClass)
	{
		return executePlugin(pluginName, pluginClass, null);
	}

	public Object executePlugin(String pluginName, String pluginClass, JSONObject settings)
	{
		Plugin plugin;

		if(!pluginName.equals("")){
			String pluginDir = OctopusEnvironment.PLUGINS_DIR.toString();
			Path pathToJar = Paths.get(pluginDir, pluginName).toAbsolutePath();
			plugin = PluginLoader.load(pathToJar, pluginClass);
		}else{
			plugin = PluginLoader.load(pluginClass);
		}

		if (plugin == null)
			throw new RuntimeException(
					"Error while loading plugin " + pluginName);

		try
		{
			if(settings != null)