From 409faed903f9152de4acc6b1b6b69c548ffd0594 Mon Sep 17 00:00:00 2001 From: HongKee Moon <hkmoon@me.com> Date: Wed, 7 Jan 2015 14:52:55 +0100 Subject: [PATCH] Add /manager context to manage datasets It is very simple version for it. It provides list, deploy and undeploy operations. --- src/main/java/bdv/server/ManagerHandler.java | 145 +++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 src/main/java/bdv/server/ManagerHandler.java diff --git a/src/main/java/bdv/server/ManagerHandler.java b/src/main/java/bdv/server/ManagerHandler.java new file mode 100644 index 0000000..0039019 --- /dev/null +++ b/src/main/java/bdv/server/ManagerHandler.java @@ -0,0 +1,145 @@ +package bdv.server; + +import mpicbg.spim.data.SpimDataException; +import org.eclipse.jetty.server.Handler; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.ContextHandler; +import org.eclipse.jetty.server.handler.HandlerCollection; +import org.eclipse.jetty.util.log.Log; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +public class ManagerHandler extends ContextHandler +{ + private static final org.eclipse.jetty.util.log.Logger LOG = Log.getLogger( ManagerHandler.class ); + private final String baseURL; + private final Server server; + private final HandlerCollection handlers; + + public ManagerHandler( String baseURL, Server server, HandlerCollection handlers ) + { + this.baseURL = baseURL; + this.server = server; + this.handlers = handlers; + setContextPath( "/manager" ); + } + + @Override + public void doHandle( final String target, final Request baseRequest, final HttpServletRequest request, final HttpServletResponse response ) throws IOException, ServletException + { + final String op = request.getParameter( "op" ); + + if ( op == null ) + { + list( baseRequest, response ); + } + else if ( op.equals( "deploy" ) ) + { + String ds = request.getParameter( "ds" ); + String file = request.getParameter( "file" ); + deploy( ds, file, baseRequest, response ); + } + else if ( op.equals( "undeploy" ) ) + { + String ds = request.getParameter( "ds" ); + undeploy( ds, baseRequest, response ); + } + else + { + return; + } + + } + + private void list( final Request baseRequest, final HttpServletResponse response ) throws IOException + { + response.setContentType( "text/html" ); + response.setStatus( HttpServletResponse.SC_OK ); + baseRequest.setHandled( true ); + + final PrintWriter ow = response.getWriter(); + + for ( Handler handler : server.getChildHandlersByClass( CellHandler.class ) ) + { + CellHandler contextHandler = null; + if ( handler instanceof CellHandler ) + { + contextHandler = ( CellHandler ) handler; + ow.write( contextHandler.getContextPath() ); + } + } + + ow.close(); + } + + private void deploy( final String datasetName, final String fileLocation, final Request baseRequest, final HttpServletResponse response ) throws IOException + { + LOG.info( "Add new context: " + datasetName ); + CellHandler ctx = null; + try + { + ctx = new CellHandler( baseURL + datasetName + "/", fileLocation ); + } + catch ( SpimDataException e ) + { + LOG.warn( "Failed to create a CellHandler", e ); + e.printStackTrace(); + } + ctx.setContextPath( "/" + datasetName ); + handlers.addHandler( ctx ); + + response.setContentType( "text/html" ); + response.setStatus( HttpServletResponse.SC_OK ); + baseRequest.setHandled( true ); + + final PrintWriter ow = response.getWriter(); + ow.write( datasetName + " registered." ); + ow.close(); + } + + private void undeploy( final String datasetName, final Request baseRequest, final HttpServletResponse response ) throws IOException + { + LOG.info( "Remove the context: " + datasetName ); + boolean ret = false; + + for ( Handler handler : server.getChildHandlersByClass( CellHandler.class ) ) + { + CellHandler contextHandler = null; + if ( handler instanceof CellHandler ) + { + contextHandler = ( CellHandler ) handler; + if ( datasetName.equals( contextHandler.getContextPath() ) ) + { + try + { + contextHandler.stop(); + } + catch ( Exception e ) + { + e.printStackTrace(); + } + contextHandler.destroy(); + handlers.removeHandler( contextHandler ); + ret = true; + break; + } + } + } + + if ( ret ) + { + response.setContentType( "text/html" ); + response.setStatus( HttpServletResponse.SC_OK ); + baseRequest.setHandled( true ); + + final PrintWriter ow = response.getWriter(); + ow.write( datasetName + " removed." ); + ow.close(); + } + } +} \ No newline at end of file -- GitLab