// Path: src/main/java/octopus/api/shell/ShellManager.java
// public class ShellManager {
// 
// 	public List<OctopusGremlinShell> getActiveShells()
// 	{
// 		return OctopusShellManager.getActiveShells();
// 	}
// 
// 	public int createNewShellThread(String projectName, String shellName) throws IOException
// 	{
// 		int port = OctopusShellManager.createNewShell(projectName, shellName);
// 		OctopusGremlinShell shell = OctopusShellManager.getShellForPort(port);
// 		startShellThread(shell);
// 		return port;
// 	}
// 
// 	private void startShellThread(OctopusGremlinShell shell) throws IOException
// 	{
// 		ShellRunnable runnable = new ShellRunnable(shell);
// 		Thread thread = new Thread(runnable);
// 		thread.start();
// 	}
// 
// }
// 
// Path: src/main/java/octopus/server/gremlinShell/OctopusGremlinShell.java
// public class OctopusGremlinShell
// {
// 
// 	private GroovyShell shell;
// 	private int port;
// 	Database database;
// 	private String name;
// 	private boolean occupied = false;
// 	private Graph graph;
// 	private String projectName;
// 	private GraphTraversalSource g;
// 
// 	static
// 	{
// 
// 	}
// 
// 	public OctopusGremlinShell(String projectName)
// 	{
// 		this.projectName = projectName;
// 	}
// 
// 	private void octopusSugarLoad()
// 	{
// 		String cmd = "GremlinLoader.load();";
// 		execute(cmd);
// 
// 		// This is the code responsible for the execution of session steps
// 		cmd = "DefaultGraphTraversal.metaClass.methodMissing = { final String name, final def args -> def closure = getStep(name); if (closure != null) { closure.delegate = delegate; return closure(args); } else { throw new MissingMethodException(name, this.class, args) } }";
// 		execute(cmd);
// 	}
// 
// 	public void initShell()
// 	{
// 		this.shell = new GroovyShell(new OctopusCompilerConfiguration());
// 		openDatabaseConnection(projectName);
// 		octopusSugarLoad();
// 		loadStandardQueryLibrary();
// 	}
// 
// 	private void openDatabaseConnection(String projectName)
// 	{
// 		OctopusProject project = new ProjectManager().getProjectByName(projectName);
// 		database = project.getNewDatabaseInstance();
// 		this.projectName = projectName;
// 
// 		graph = database.getGraph();
// 		g = graph.traversal();
// 		this.shell.setVariable("graph", graph);
// 		this.shell.setVariable("g", g);
// 		this.shell.setVariable("sessionSteps", new HashMap<String, Closure>());
// 	}
// 
// 	private void loadStandardQueryLibrary()
// 	{
// 		try
// 		{
// 			Path languagesDir = OctopusEnvironment.LANGUAGES_DIR;
// 			loadRecursively(languagesDir.toString());
// 		} catch (IOException e)
// 		{
// 			e.printStackTrace();
// 		}
// 	}
// 
// 	private void loadRecursively(String languagesDir) throws IOException
// 	{
// 		SourceFileWalker walker = new OrderedWalker();
// 		GroovyFileLoader listener = new GroovyFileLoader();
// 		listener.setGroovyShell(this.getShell());
// 
// 		walker.setFilenameFilter("*.groovy");
// 		walker.addListener(listener);
// 		walker.walk(new String[]{languagesDir});
// 	}
// 
// 	public Object execute(String code)
// 	{
// 
// 		try
// 		{
// 			return shell.evaluate(code);
// 		} catch (Exception ex)
// 		{
// 			return String.format("[%s] %s\n", ex.getClass().getSimpleName(), ex.getMessage());
// 		}
// 	}
// 
// 	public int getPort()
// 	{
// 		return port;
// 	}
// 
// 	public void setPort(int port)
// 	{
// 		this.port = port;
// 	}
// 
// 	public GroovyShell getShell()
// 	{
// 		return shell;
// 	}
// 
// 	public void setName(String name)
// 	{
// 		this.name = name;
// 	}
// 
// 	public String getName()
// 	{
// 		return this.name;
// 	}
// 
// 	public void markAsOccupied()
// 	{
// 		occupied = true;
// 	}
// 
// 	public void markAsFree()
// 	{
// 		occupied = false;
// 	}
// 
// 	public boolean isOccupied()
// 	{
// 		return occupied;
// 	}
// 
// 	public void shutdownDBInstance()
// 	{
// 		database.closeInstance();
// 	}
// 
// 	public String getProjectName()
// 	{
// 		return projectName;
// 	}
// 
// 	public Graph getGraph()
// 	{
// 		return graph;
// 	}
// 
// }
// 
// Path: src/main/java/octopus/server/restServer/OctopusRestHandler.java
// public interface OctopusRestHandler {
// 
// 	public Object handle(Request req, Response resp);
// 
// }


import octopus.api.shell.ShellManager;
import octopus.server.gremlinShell.OctopusGremlinShell;
import octopus.server.restServer.OctopusRestHandler;
import spark.Request;
import spark.Response;
package octopus.server.restServer.handlers;


public class ListShellsHandler implements OctopusRestHandler {

	@Override
	public Object handle(Request req, Response resp)
	{

		ShellManager shellManager = new ShellManager();

		StringBuilder sb = new StringBuilder();
		for (OctopusGremlinShell shell : shellManager.getActiveShells())
		{
			sb.append(rowForShell(shell));
			sb.append('\n');

		}

		return sb.toString();
	}

// Path: src/main/java/octopus/api/shell/ShellManager.java
// public class ShellManager {
// 
// 	public List<OctopusGremlinShell> getActiveShells()
// 	{
// 		return OctopusShellManager.getActiveShells();
// 	}
// 
// 	public int createNewShellThread(String projectName, String shellName) throws IOException
// 	{
// 		int port = OctopusShellManager.createNewShell(projectName, shellName);
// 		OctopusGremlinShell shell = OctopusShellManager.getShellForPort(port);
// 		startShellThread(shell);
// 		return port;
// 	}
// 
// 	private void startShellThread(OctopusGremlinShell shell) throws IOException
// 	{
// 		ShellRunnable runnable = new ShellRunnable(shell);
// 		Thread thread = new Thread(runnable);
// 		thread.start();
// 	}
// 
// }
// 
// Path: src/main/java/octopus/server/gremlinShell/OctopusGremlinShell.java
// public class OctopusGremlinShell
// {
// 
// 	private GroovyShell shell;
// 	private int port;
// 	Database database;
// 	private String name;
// 	private boolean occupied = false;
// 	private Graph graph;
// 	private String projectName;
// 	private GraphTraversalSource g;
// 
// 	static
// 	{
// 
// 	}
// 
// 	public OctopusGremlinShell(String projectName)
// 	{
// 		this.projectName = projectName;
// 	}
// 
// 	private void octopusSugarLoad()
// 	{
// 		String cmd = "GremlinLoader.load();";
// 		execute(cmd);
// 
// 		// This is the code responsible for the execution of session steps
// 		cmd = "DefaultGraphTraversal.metaClass.methodMissing = { final String name, final def args -> def closure = getStep(name); if (closure != null) { closure.delegate = delegate; return closure(args); } else { throw new MissingMethodException(name, this.class, args) } }";
// 		execute(cmd);
// 	}
// 
// 	public void initShell()
// 	{
// 		this.shell = new GroovyShell(new OctopusCompilerConfiguration());
// 		openDatabaseConnection(projectName);
// 		octopusSugarLoad();
// 		loadStandardQueryLibrary();
// 	}
// 
// 	private void openDatabaseConnection(String projectName)
// 	{
// 		OctopusProject project = new ProjectManager().getProjectByName(projectName);
// 		database = project.getNewDatabaseInstance();
// 		this.projectName = projectName;
// 
// 		graph = database.getGraph();
// 		g = graph.traversal();
// 		this.shell.setVariable("graph", graph);
// 		this.shell.setVariable("g", g);
// 		this.shell.setVariable("sessionSteps", new HashMap<String, Closure>());
// 	}
// 
// 	private void loadStandardQueryLibrary()
// 	{
// 		try
// 		{
// 			Path languagesDir = OctopusEnvironment.LANGUAGES_DIR;
// 			loadRecursively(languagesDir.toString());
// 		} catch (IOException e)
// 		{
// 			e.printStackTrace();
// 		}
// 	}
// 
// 	private void loadRecursively(String languagesDir) throws IOException
// 	{
// 		SourceFileWalker walker = new OrderedWalker();
// 		GroovyFileLoader listener = new GroovyFileLoader();
// 		listener.setGroovyShell(this.getShell());
// 
// 		walker.setFilenameFilter("*.groovy");
// 		walker.addListener(listener);
// 		walker.walk(new String[]{languagesDir});
// 	}
// 
// 	public Object execute(String code)
// 	{
// 
// 		try
// 		{
// 			return shell.evaluate(code);
// 		} catch (Exception ex)
// 		{
// 			return String.format("[%s] %s\n", ex.getClass().getSimpleName(), ex.getMessage());
// 		}
// 	}
// 
// 	public int getPort()
// 	{
// 		return port;
// 	}
// 
// 	public void setPort(int port)
// 	{
// 		this.port = port;
// 	}
// 
// 	public GroovyShell getShell()
// 	{
// 		return shell;
// 	}
// 
// 	public void setName(String name)
// 	{
// 		this.name = name;
// 	}
// 
// 	public String getName()
// 	{
// 		return this.name;
// 	}
// 
// 	public void markAsOccupied()
// 	{
// 		occupied = true;
// 	}
// 
// 	public void markAsFree()
// 	{
// 		occupied = false;
// 	}
// 
// 	public boolean isOccupied()
// 	{
// 		return occupied;
// 	}
// 
// 	public void shutdownDBInstance()
// 	{
// 		database.closeInstance();
// 	}
// 
// 	public String getProjectName()
// 	{
// 		return projectName;
// 	}
// 
// 	public Graph getGraph()
// 	{
// 		return graph;
// 	}
// 
// }
// 
// Path: src/main/java/octopus/server/restServer/OctopusRestHandler.java
// public interface OctopusRestHandler {
// 
// 	public Object handle(Request req, Response resp);
// 
// }


// Path: src/main/java/octopus/server/restServer/handlers/ListShellsHandler.java
import octopus.api.shell.ShellManager;
import octopus.server.gremlinShell.OctopusGremlinShell;
import octopus.server.restServer.OctopusRestHandler;
import spark.Request;
import spark.Response;

package octopus.server.restServer.handlers;


public class ListShellsHandler implements OctopusRestHandler {

	@Override
	public Object handle(Request req, Response resp)
	{

		ShellManager shellManager = new ShellManager();

		StringBuilder sb = new StringBuilder();
		for (OctopusGremlinShell shell : shellManager.getActiveShells())
		{
			sb.append(rowForShell(shell));
			sb.append('\n');

		}

		return sb.toString();
	}

	private Object rowForShell(OctopusGremlinShell shell)