diff --git a/src/main/java/bdv/server/ManagerHandler.java b/src/main/java/bdv/server/ManagerHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..0039019bf48ba6edf263f80e4e61690affa37582 --- /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