improve api

This commit is contained in:
Sebastian Sdorra
2010-09-16 21:50:30 +02:00
parent 16070397b0
commit 2f170494cf
13 changed files with 689 additions and 102 deletions

View File

@@ -11,27 +11,20 @@ package sonia.scm;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.servlet.GuiceServletContextListener;
import com.google.inject.servlet.ServletModule;
import javax.servlet.ServletContextEvent;
import sonia.scm.api.rest.UriExtensionsConfig;
import sonia.scm.filter.GZipFilter;
import sonia.scm.filter.SecurityFilter;
import sonia.scm.filter.StaticResourceFilter;
import sonia.scm.repository.Repository;
import sonia.scm.repository.RepositoryManager;
import sonia.scm.security.Authenticator;
import sonia.scm.security.DemoAuthenticator;
import sonia.scm.util.Util;
//~--- JDK imports ------------------------------------------------------------
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;
import com.sun.jersey.guice.spi.container.servlet.GuiceContainer;
import com.sun.jersey.spi.container.servlet.ServletContainer;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.ConsoleHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
@@ -40,32 +33,18 @@ import java.util.Map;
public class ContextListener extends GuiceServletContextListener
{
/** Field description */
public static final String PATTERN_PAGE = "*.html";
@Override
public void contextInitialized(ServletContextEvent servletContextEvent)
{
Logger logger = Logger.getLogger("");
logger.setLevel(Level.ALL);
ConsoleHandler handler = new ConsoleHandler();
handler.setLevel(Level.ALL);
logger.addHandler( handler );
super.contextInitialized(servletContextEvent);
}
/** Field description */
public static final String PATTERN_RESTAPI = "/api/rest/*";
/** Field description */
public static final String PATTERN_SCRIPT = "*.js";
/** Field description */
public static final String PATTERN_STYLESHEET = "*.css";
/** Field description */
public static final String REST_PACKAGE = "sonia.scm.api.rest";
/** Field description */
public static final String[] PATTERN_STATIC_RESOURCES = new String[] {
PATTERN_SCRIPT,
PATTERN_STYLESHEET, "*.jpg", "*.gif", "*.png" };
/** Field description */
public static final String[] PATTERN_COMPRESSABLE = new String[] {
PATTERN_SCRIPT,
PATTERN_STYLESHEET, "*.json", "*.xml", "*.txt" };
//~--- get methods ----------------------------------------------------------
/**
* Method description
@@ -76,41 +55,25 @@ public class ContextListener extends GuiceServletContextListener
@Override
protected Injector getInjector()
{
return Guice.createInjector(new ServletModule()
ScmWebPluginContext webPluginContext = new ScmWebPluginContext();
List<ScmWebPlugin> plugins = webPluginContext.getPlugins();
List<Module> modules = new ArrayList<Module>();
modules.add(new ScmServletModule(webPluginContext));
if (Util.isNotEmpty(plugins))
{
@Override
protected void configureServlets()
for (ScmWebPlugin plugin : plugins)
{
SCMContextProvider context = SCMContext.getContext();
Module[] moduleArray = plugin.getModules();
bind(Authenticator.class).to(DemoAuthenticator.class);
bind(SCMContextProvider.class).toInstance(context);
bind(RepositoryManager.class).toInstance(
context.getRepositoryManager());
// filters
filter(PATTERN_PAGE,
PATTERN_STATIC_RESOURCES).through(StaticResourceFilter.class);
filter(PATTERN_PAGE, PATTERN_COMPRESSABLE).through(GZipFilter.class);
filter(PATTERN_RESTAPI).through(SecurityFilter.class);
// jersey
Map<String, String> params = new HashMap<String, String>();
/*
* params.put("com.sun.jersey.spi.container.ContainerRequestFilters",
* "com.sun.jersey.api.container.filter.LoggingFilter");
* params.put("com.sun.jersey.spi.container.ContainerResponseFilters",
* "com.sun.jersey.api.container.filter.LoggingFilter");
* params.put("com.sun.jersey.config.feature.Trace", "true");
* params.put("com.sun.jersey.config.feature.TracePerRequest", "true");
*/
params.put(ResourceConfig.FEATURE_REDIRECT, Boolean.TRUE.toString());
params.put(ServletContainer.RESOURCE_CONFIG_CLASS,
UriExtensionsConfig.class.getName());
params.put(PackagesResourceConfig.PROPERTY_PACKAGES, REST_PACKAGE);
serve(PATTERN_RESTAPI).with(GuiceContainer.class, params);
if (Util.isNotEmpty(moduleArray))
{
modules.addAll(Arrays.asList(moduleArray));
}
}
});
}
return Guice.createInjector(modules);
}
}

View File

@@ -0,0 +1,128 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package sonia.scm;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.servlet.ServletModule;
import sonia.scm.api.rest.UriExtensionsConfig;
import sonia.scm.filter.GZipFilter;
import sonia.scm.filter.SecurityFilter;
import sonia.scm.filter.StaticResourceFilter;
import sonia.scm.plugin.ScriptResourceServlet;
import sonia.scm.repository.RepositoryManager;
import sonia.scm.security.Authenticator;
import sonia.scm.security.DemoAuthenticator;
//~--- JDK imports ------------------------------------------------------------
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;
import com.sun.jersey.guice.spi.container.servlet.GuiceContainer;
import com.sun.jersey.spi.container.servlet.ServletContainer;
import java.util.HashMap;
import java.util.Map;
/**
*
* @author Sebastian Sdorra
*/
public class ScmServletModule extends ServletModule
{
/** Field description */
public static final String PATTERN_PAGE = "*.html";
/** Field description */
public static final String PATTERN_PLUGIN_SCRIPT = "/plugins/sonia.plugin.js";
/** Field description */
public static final String PATTERN_RESTAPI = "/api/rest/*";
/** Field description */
public static final String PATTERN_SCRIPT = "*.js";
/** Field description */
public static final String PATTERN_STYLESHEET = "*.css";
/** Field description */
public static final String REST_PACKAGE = "sonia.scm.api.rest";
/** Field description */
public static final String[] PATTERN_STATIC_RESOURCES = new String[] {
PATTERN_SCRIPT,
PATTERN_STYLESHEET, "*.jpg", "*.gif", "*.png" };
/** Field description */
public static final String[] PATTERN_COMPRESSABLE = new String[] {
PATTERN_SCRIPT,
PATTERN_STYLESHEET, "*.json", "*.xml", "*.txt" };
//~--- constructors ---------------------------------------------------------
/**
* Constructs ...
*
*
* @param webPluginContext
*/
ScmServletModule(ScmWebPluginContext webPluginContext)
{
this.webPluginContext = webPluginContext;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*/
@Override
protected void configureServlets()
{
SCMContextProvider context = SCMContext.getContext();
bind(Authenticator.class).to(DemoAuthenticator.class);
bind(SCMContextProvider.class).toInstance(context);
bind(RepositoryManager.class).toInstance(context.getRepositoryManager());
bind(ScmWebPluginContext.class).toInstance(webPluginContext);
// filters
filter(PATTERN_PAGE,
PATTERN_STATIC_RESOURCES).through(StaticResourceFilter.class);
filter(PATTERN_PAGE, PATTERN_COMPRESSABLE).through(GZipFilter.class);
filter(PATTERN_RESTAPI).through(SecurityFilter.class);
// plugin resources
serve(PATTERN_PLUGIN_SCRIPT).with(ScriptResourceServlet.class);
// jersey
Map<String, String> params = new HashMap<String, String>();
/*
* params.put("com.sun.jersey.spi.container.ContainerRequestFilters",
* "com.sun.jersey.api.container.filter.LoggingFilter");
* params.put("com.sun.jersey.spi.container.ContainerResponseFilters",
* "com.sun.jersey.api.container.filter.LoggingFilter");
* params.put("com.sun.jersey.config.feature.Trace", "true");
* params.put("com.sun.jersey.config.feature.TracePerRequest", "true");
*/
params.put(ResourceConfig.FEATURE_REDIRECT, Boolean.TRUE.toString());
params.put(ServletContainer.RESOURCE_CONFIG_CLASS,
UriExtensionsConfig.class.getName());
params.put(PackagesResourceConfig.PROPERTY_PACKAGES, REST_PACKAGE);
serve(PATTERN_RESTAPI).with(GuiceContainer.class, params);
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private ScmWebPluginContext webPluginContext;
}

View File

@@ -75,7 +75,7 @@ public class StaticResourceFilter extends HttpFilter
String uri = request.getRequestURI();
File resource = getResourceFile(request, uri);
if (resource.exists())
if (!resource.exists())
{
WebUtil.addETagHeader(response, resource);
WebUtil.addStaticCacheControls(response, WebUtil.TIME_YEAR);
@@ -100,7 +100,7 @@ public class StaticResourceFilter extends HttpFilter
}
else
{
response.sendError(HttpServletResponse.SC_NOT_FOUND);
chain.doFilter(request, response);
}
}

View File

@@ -0,0 +1,186 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package sonia.scm.plugin;
//~--- non-JDK imports --------------------------------------------------------
import sonia.scm.util.Util;
//~--- JDK imports ------------------------------------------------------------
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author Sebastian Sdorra
*/
public abstract class AbstractResourceServlet extends HttpServlet
{
/** Field description */
public static final String DEFAULT_CHARSET = "UTF-8";
/** Field description */
private static final long serialVersionUID = -7703282364120349053L;
public AbstractResourceServlet()
{
System.out.println("CONSTRUCT !!!");
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param stream
*
* @throws IOException
* @throws ServletException
*/
protected abstract void appendResources(OutputStream stream)
throws ServletException, IOException;
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
protected abstract String getContentType();
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @throws ServletException
*/
@Override
public void init() throws ServletException
{
System.out.println("INIT !!!");
ByteArrayOutputStream output = new ByteArrayOutputStream();
try
{
appendResources(output);
}
catch (IOException ex)
{
throw new ServletException(ex);
}
finally
{
Util.close(output);
}
this.content = output.toByteArray();
}
/**
* Method description
*
*
* @param request
* @param response
*
* @throws IOException
* @throws ServletException
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
processRequest(request, response);
}
/**
* Method description
*
*
* @param request
* @param response
*
* @throws IOException
* @throws ServletException
*/
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
processRequest(request, response);
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
protected String getCharacterEncoding()
{
return DEFAULT_CHARSET;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param request
* @param response
*
* @throws IOException
* @throws ServletException
*/
private void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
System.out.println( "JA !!!" );
response.setCharacterEncoding(getCharacterEncoding());
response.setContentType(getContentType());
response.setContentLength(content.length);
OutputStream output = response.getOutputStream();
try
{
output.write(content);
}
finally
{
Util.close(output);
}
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private byte[] content;
}

View File

@@ -0,0 +1,123 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package sonia.scm.plugin;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Inject;
import com.google.inject.Singleton;
import sonia.scm.ScmWebPlugin;
import sonia.scm.ScmWebPluginContext;
import sonia.scm.util.Util;
//~--- JDK imports ------------------------------------------------------------
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import javax.servlet.ServletException;
/**
*
* @author Sebastian Sdorra
*/
@Singleton
public class ScriptResourceServlet extends AbstractResourceServlet
{
/** Field description */
public static final String CONTENT_TYPE = "text/javascript";
/** Field description */
private static final long serialVersionUID = -5769146163848821050L;
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param stream
*
* @throws IOException
* @throws ServletException
*/
@Override
protected void appendResources(OutputStream stream)
throws ServletException, IOException
{
stream.write(
"function sayPluginHello(){ alert('Plugin Hello !'); }".concat(
System.getProperty("line.separator")).getBytes());
List<ScmWebPlugin> plugins = webPluginContext.getPlugins();
if (Util.isNotEmpty(plugins))
{
for (ScmWebPlugin plugin : plugins)
{
appendResource(stream, plugin);
}
}
}
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @return
*/
@Override
protected String getContentType()
{
return CONTENT_TYPE;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param stream
* @param plugin
*
* @throws IOException
* @throws ServletException
*/
private void appendResource(OutputStream stream, ScmWebPlugin plugin)
throws ServletException, IOException
{
InputStream input = plugin.getScript();
if (input != null)
{
try
{
Util.copy(input, stream);
}
finally
{
Util.close(input);
}
}
}
//~--- fields ---------------------------------------------------------------
/** Field description */
@Inject
private ScmWebPluginContext webPluginContext;
}