Change to use new extension point mechanism.

This commit is contained in:
robin shine 2013-09-10 17:12:46 +08:00
parent f1e37112c5
commit 5a2fe0dc63
25 changed files with 239 additions and 282 deletions

View File

@ -1,13 +1,7 @@
package com.pmease.commons.editable;
import java.util.Collection;
import com.pmease.commons.loader.AbstractPlugin;
public class EditablePlugin extends AbstractPlugin {
@Override
public Collection<?> getExtensions() {
return null;
}
}

View File

@ -1,13 +1,7 @@
package com.pmease.commons.git;
import java.util.Collection;
import com.pmease.commons.loader.AbstractPlugin;
public class GitPlugin extends AbstractPlugin {
@Override
public Collection<?> getExtensions() {
return null;
}
}

View File

@ -13,6 +13,7 @@ import com.google.inject.name.Names;
import com.google.inject.util.Providers;
import com.pmease.commons.hibernate.dao.DefaultGeneralDao;
import com.pmease.commons.hibernate.dao.GeneralDao;
import com.pmease.commons.jetty.extensionpoints.ServletContextConfigurator;
import com.pmease.commons.loader.AbstractPlugin;
import com.pmease.commons.loader.AbstractPluginModule;
@ -42,6 +43,8 @@ public class HibernateModule extends AbstractPluginModule {
Matchers.any(),
Matchers.annotatedWith(Transactional.class),
transactionInterceptor);
addExtension(ServletContextConfigurator.class, HibernateServletContextConfigurator.class);
}
@Override

View File

@ -1,47 +1,15 @@
package com.pmease.commons.hibernate;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Collection;
import java.util.EnumSet;
import javax.servlet.DispatcherType;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import com.google.common.collect.ImmutableList;
import com.google.inject.Inject;
import com.google.inject.TypeLiteral;
import com.pmease.commons.jetty.extensionpoints.ServletContextConfigurator;
import com.pmease.commons.loader.AbstractPlugin;
import com.pmease.commons.util.ExceptionUtils;
public class HibernatePlugin extends AbstractPlugin {
private final PersistService persistService;
private final HibernateFilter hibernateFilter;
private static Field typeLiteralTypeField;
static {
try {
typeLiteralTypeField = TypeLiteral.class.getDeclaredField("type");
typeLiteralTypeField.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(typeLiteralTypeField, Modifier.PROTECTED);
} catch (Exception e) {
throw ExceptionUtils.unchecked(e);
}
}
@Inject
public HibernatePlugin(PersistService persistService, HibernateFilter hibernateFilter) {
public HibernatePlugin(PersistService persistService) {
this.persistService = persistService;
this.hibernateFilter = hibernateFilter;
}
@Override
@ -54,16 +22,4 @@ public class HibernatePlugin extends AbstractPlugin {
persistService.stop();
}
@Override
public Collection<?> getExtensions() {
return ImmutableList.of(new ServletContextConfigurator() {
@Override
public void configure(ServletContextHandler context) {
FilterHolder filterHolder = new FilterHolder(hibernateFilter);
context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
}
});
}
}

View File

@ -0,0 +1,28 @@
package com.pmease.commons.hibernate;
import java.util.EnumSet;
import javax.inject.Inject;
import javax.servlet.DispatcherType;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import com.pmease.commons.jetty.extensionpoints.ServletContextConfigurator;
public class HibernateServletContextConfigurator implements ServletContextConfigurator {
private final HibernateFilter hibernateFilter;
@Inject
public HibernateServletContextConfigurator(HibernateFilter hibernateFilter) {
this.hibernateFilter = hibernateFilter;
}
@Override
public void configure(ServletContextHandler context) {
FilterHolder filterHolder = new FilterHolder(hibernateFilter);
context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
}
}

View File

@ -0,0 +1,14 @@
package com.pmease.commons.jersey;
import org.apache.shiro.web.filter.mgt.FilterChainManager;
import com.pmease.commons.shiro.extensionpoint.FilterChainConfigurator;
public class JerseyFilterChainConfigurator implements FilterChainConfigurator {
@Override
public void configure(FilterChainManager filterChainManager) {
filterChainManager.createChain("/" + JerseyPlugin.REST_PATH + "/**", "noSessionCreation, authcBasic");
}
}

View File

@ -2,6 +2,7 @@ package com.pmease.commons.jersey;
import com.pmease.commons.loader.AbstractPlugin;
import com.pmease.commons.loader.AbstractPluginModule;
import com.pmease.commons.shiro.extensionpoint.FilterChainConfigurator;
import com.pmease.commons.util.EasyMap;
import com.sun.jersey.guice.JerseyServletModule;
import com.sun.jersey.guice.spi.container.servlet.GuiceContainer;
@ -34,6 +35,8 @@ public class JerseyModule extends AbstractPluginModule {
}
});
addExtension(FilterChainConfigurator.class, JerseyFilterChainConfigurator.class);
}
@Override

View File

@ -1,29 +1,9 @@
package com.pmease.commons.jersey;
import java.util.Arrays;
import java.util.Collection;
import org.apache.shiro.web.filter.mgt.FilterChainManager;
import com.pmease.commons.loader.AbstractPlugin;
import com.pmease.commons.shiro.extensionpoint.FilterChainConfigurator;
public class JerseyPlugin extends AbstractPlugin {
public static final String REST_PATH = "rest";
@Override
public Collection<?> getExtensions() {
return Arrays.asList(
new FilterChainConfigurator() {
@Override
public void configure(FilterChainManager filterChainManager) {
filterChainManager.createChain("/" + REST_PATH + "/**", "noSessionCreation, authcBasic");
}
}
);
}
}

View File

@ -1,7 +1,6 @@
package com.pmease.commons.jetty;
import java.io.IOException;
import java.util.Collection;
import java.util.EnumSet;
import java.util.Set;
@ -98,11 +97,6 @@ public class JettyPlugin extends AbstractPlugin {
return server;
}
@Override
public Collection<?> getExtensions() {
return null;
}
public static class DisableTraceFilter implements Filter {
@Override

View File

@ -1,6 +1,5 @@
package com.pmease.commons.loader;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
@ -99,5 +98,4 @@ public abstract class AbstractPlugin implements Dependency, Lifecycle {
public void stop() {
}
public abstract Collection<?> getExtensions();
}

View File

@ -1,8 +1,8 @@
package com.pmease.commons.loader;
import static org.mockito.Mockito.*;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.spy;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
@ -21,34 +21,16 @@ public class AbstractPluginTest {
@Before
public void before() {
plugin1 = spy(new AbstractPlugin() {
@Override
public Collection<?> getExtensions() {
return null;
}
});
plugin1.setId("plugin1");
plugin1.setDependencyIds(ImmutableSet.of("plugin2", "plugin3"));
plugin2 = spy(new AbstractPlugin() {
@Override
public Collection<?> getExtensions() {
return null;
}
});
plugin2.setId("plugin2");
plugin2.setDependencyIds(ImmutableSet.of("plugin3"));
plugin3 = spy(new AbstractPlugin() {
@Override
public Collection<?> getExtensions() {
return null;
}
});
plugin3.setId("plugin3");

View File

@ -9,6 +9,7 @@ import org.apache.shiro.guice.aop.ShiroAopModule;
import org.apache.shiro.web.filter.mgt.FilterChainResolver;
import org.apache.shiro.web.mgt.WebSecurityManager;
import com.pmease.commons.jetty.extensionpoints.ServletContextConfigurator;
import com.pmease.commons.loader.AbstractPlugin;
import com.pmease.commons.loader.AbstractPluginModule;
@ -30,6 +31,8 @@ public class ShiroModule extends AbstractPluginModule {
bind(CredentialsMatcher.class).to(DefaultPasswordMatcher.class);
install(new ShiroAopModule());
addExtension(ServletContextConfigurator.class, ShiroServletContextConfigurator.class);
}
@Override

View File

@ -1,38 +1,7 @@
package com.pmease.commons.shiro;
import java.util.Arrays;
import java.util.Collection;
import java.util.EnumSet;
import javax.servlet.DispatcherType;
import org.apache.shiro.web.env.EnvironmentLoader;
import org.apache.shiro.web.env.EnvironmentLoaderListener;
import org.apache.shiro.web.servlet.ShiroFilter;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import com.pmease.commons.jetty.extensionpoints.ServletContextConfigurator;
import com.pmease.commons.loader.AbstractPlugin;
public class ShiroPlugin extends AbstractPlugin {
@Override
public Collection<?> getExtensions() {
return Arrays.asList(new ServletContextConfigurator() {
@Override
public void configure(ServletContextHandler context) {
context.setInitParameter(
EnvironmentLoader.ENVIRONMENT_CLASS_PARAM,
DefaultWebEnvironment.class.getName());
context.addEventListener(new EnvironmentLoaderListener());
context.addFilter(new FilterHolder(new ShiroFilter()), "/*", EnumSet.allOf(DispatcherType.class));
}
});
}
}

View File

@ -0,0 +1,28 @@
package com.pmease.commons.shiro;
import java.util.EnumSet;
import javax.servlet.DispatcherType;
import org.apache.shiro.web.env.EnvironmentLoader;
import org.apache.shiro.web.env.EnvironmentLoaderListener;
import org.apache.shiro.web.servlet.ShiroFilter;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import com.pmease.commons.jetty.extensionpoints.ServletContextConfigurator;
public class ShiroServletContextConfigurator implements ServletContextConfigurator {
@Override
public void configure(ServletContextHandler context) {
context.setInitParameter(
EnvironmentLoader.ENVIRONMENT_CLASS_PARAM,
DefaultWebEnvironment.class.getName());
context.addEventListener(new EnvironmentLoaderListener());
context.addFilter(new FilterHolder(new ShiroFilter()), "/*", EnumSet.allOf(DispatcherType.class));
}
}

View File

@ -3,6 +3,7 @@ package com.pmease.commons.wicket;
import org.apache.wicket.protocol.http.WicketFilter;
import org.apache.wicket.protocol.http.WicketServlet;
import com.pmease.commons.jetty.extensionpoints.ServletContextConfigurator;
import com.pmease.commons.loader.AbstractPlugin;
import com.pmease.commons.loader.AbstractPluginModule;
@ -14,6 +15,8 @@ public class WicketModule extends AbstractPluginModule {
bind(WicketServlet.class).to(DefaultWicketServlet.class);
bind(WicketFilter.class).to(DefaultWicketFilter.class);
addExtension(ServletContextConfigurator.class, WicketServletContextConfigurator.class);
}
@Override

View File

@ -1,44 +1,7 @@
package com.pmease.commons.wicket;
import java.util.Collection;
import javax.inject.Inject;
import org.apache.wicket.protocol.http.WicketServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import com.google.common.collect.ImmutableList;
import com.pmease.commons.jetty.extensionpoints.ServletContextConfigurator;
import com.pmease.commons.loader.AbstractPlugin;
public class WicketPlugin extends AbstractPlugin {
private final WicketServlet wicketServlet;
@Inject
public WicketPlugin(WicketServlet wicketServlet) {
this.wicketServlet = wicketServlet;
}
@Override
public Collection<?> getExtensions() {
return ImmutableList.of(
new ServletContextConfigurator() {
@Override
public void configure(ServletContextHandler context) {
ServletHolder servletHolder = new ServletHolder(wicketServlet);
/*
* Add wicket servlet as the default servlet which will serve all requests failed to
* match a path pattern
*/
context.addServlet(servletHolder, "/");
}
}
);
}
}

View File

@ -0,0 +1,28 @@
package com.pmease.commons.wicket;
import org.apache.wicket.protocol.http.WicketServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import com.pmease.commons.jetty.extensionpoints.ServletContextConfigurator;
public class WicketServletContextConfigurator implements ServletContextConfigurator {
private final WicketServlet wicketServlet;
public WicketServletContextConfigurator(WicketServlet wicketServlet) {
this.wicketServlet = wicketServlet;
}
@Override
public void configure(ServletContextHandler context) {
ServletHolder servletHolder = new ServletHolder(wicketServlet);
/*
* Add wicket servlet as the default servlet which will serve all requests failed to
* match a path pattern
*/
context.addServlet(servletHolder, "/");
}
}

View File

@ -3,8 +3,8 @@ package com.pmease.gitop.core;
import java.io.Serializable;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import javax.inject.Inject;
@ -14,6 +14,7 @@ import org.slf4j.LoggerFactory;
import com.pmease.commons.loader.AbstractPlugin;
import com.pmease.commons.loader.AppLoader;
import com.pmease.commons.loader.AppName;
import com.pmease.gitop.core.manager.InitManager;
import com.pmease.gitop.core.setting.ServerConfig;
@ -24,20 +25,18 @@ public class Gitop extends AbstractPlugin {
private final InitManager initManager;
private final ServerConfig serverConfig;
private final String appName;
private List<ManualConfig> manualConfigs;
@Inject
public Gitop(ServerConfig serverConfig, InitManager initManager) {
public Gitop(ServerConfig serverConfig, InitManager initManager, @AppName String appName) {
this.initManager = initManager;
this.serverConfig = serverConfig;
this.appName = appName;
}
@Override
public Collection<?> getExtensions() {
return null;
}
@SuppressWarnings("serial")
@Override
public void start() {
@ -92,6 +91,10 @@ public class Gitop extends AbstractPlugin {
return "https://" + hostName + ":" + serverConfig.getSslConfig().getPort();
}
public String getAppName() {
return appName;
}
/**
* This method can be called from different UI threads, so we clone manual configs to
* make it thread-safe.
@ -114,4 +117,8 @@ public class Gitop extends AbstractPlugin {
return AppLoader.getInstance(type);
}
public static <T> Set<T> getExtensions(Class<T> extensionPoint) {
return AppLoader.getExtensions(extensionPoint);
}
}

View File

@ -0,0 +1,44 @@
package com.pmease.gitop.product;
import javax.inject.Inject;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.bio.SocketConnector;
import org.eclipse.jetty.server.ssl.SslSocketConnector;
import com.pmease.commons.jetty.extensionpoints.ServerConfigurator;
import com.pmease.gitop.core.setting.ServerConfig;
import com.pmease.gitop.core.setting.SslConfig;
public class GitopServerConfigurator implements ServerConfigurator {
private ServerConfig serverConfig;
@Inject
public GitopServerConfigurator(ServerConfig serverConfig) {
this.serverConfig = serverConfig;
}
@SuppressWarnings("deprecation")
@Override
public void configure(Server server) {
if (serverConfig.getHttpPort() != 0) {
SocketConnector connector = new SocketConnector();
connector.setPort(serverConfig.getHttpPort());
server.addConnector(connector);
}
SslConfig sslConfig = serverConfig.getSslConfig();
if (sslConfig != null) {
SslSocketConnector sslConnector = new SslSocketConnector();
sslConnector.setPort(sslConfig.getPort());
sslConnector.setKeystore(sslConfig.getKeystorePath());
sslConnector.setPassword(sslConfig.getKeystorePassword());
sslConnector.setKeyPassword(sslConfig.getKeystoreKeyPassword());
server.addConnector(sslConnector);
}
}
}

View File

@ -0,0 +1,35 @@
package com.pmease.gitop.product;
import java.io.File;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import com.pmease.commons.bootstrap.Bootstrap;
import com.pmease.commons.jetty.FileAssetServlet;
import com.pmease.commons.jetty.extensionpoints.ServletContextConfigurator;
import com.pmease.gitop.core.setting.ServerConfig;
public class GitopServletContextConfigurator implements ServletContextConfigurator {
private final ServerConfig serverConfig;
public GitopServletContextConfigurator(ServerConfig serverConfig) {
this.serverConfig = serverConfig;
}
@Override
public void configure(ServletContextHandler context) {
context.getSessionHandler().getSessionManager().setMaxInactiveInterval(serverConfig.getSessionTimeout());
/*
* Configure a servlet to serve contents under site folder. Site folder can be used
* to hold site specific web assets.
*/
File siteDir = new File(Bootstrap.installDir, "site");
ServletHolder servletHolder = new ServletHolder(new FileAssetServlet(siteDir));
context.addServlet(servletHolder, "/site/*");
context.addServlet(servletHolder, "/robots.txt");
}
}

View File

@ -1,87 +1,16 @@
package com.pmease.gitop.product;
import java.io.File;
import java.util.Collection;
import javax.inject.Inject;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.bio.SocketConnector;
import org.eclipse.jetty.server.ssl.SslSocketConnector;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.ImmutableList;
import com.pmease.commons.bootstrap.Bootstrap;
import com.pmease.commons.jetty.FileAssetServlet;
import com.pmease.commons.jetty.extensionpoints.ServerConfigurator;
import com.pmease.commons.jetty.extensionpoints.ServletContextConfigurator;
import com.pmease.commons.loader.AbstractPlugin;
import com.pmease.gitop.core.setting.ServerConfig;
import com.pmease.gitop.core.setting.SslConfig;
public class Product extends AbstractPlugin {
private static final Logger logger = LoggerFactory.getLogger(Product.class);
private final ServerConfig serverConfig;
public static final String NAME = "Gitop";
@Inject
public Product(ServerConfig serverConfig) {
this.serverConfig = serverConfig;
}
@Override
public Collection<?> getExtensions() {
return ImmutableList.of(
new ServerConfigurator() {
@SuppressWarnings("deprecation")
@Override
public void configure(Server server) {
if (serverConfig.getHttpPort() != 0) {
SocketConnector connector = new SocketConnector();
connector.setPort(serverConfig.getHttpPort());
server.addConnector(connector);
}
SslConfig sslConfig = serverConfig.getSslConfig();
if (sslConfig != null) {
SslSocketConnector sslConnector = new SslSocketConnector();
sslConnector.setPort(sslConfig.getPort());
sslConnector.setKeystore(sslConfig.getKeystorePath());
sslConnector.setPassword(sslConfig.getKeystorePassword());
sslConnector.setKeyPassword(sslConfig.getKeystoreKeyPassword());
server.addConnector(sslConnector);
}
}
},
new ServletContextConfigurator() {
@Override
public void configure(ServletContextHandler context) {
context.getSessionHandler().getSessionManager().setMaxInactiveInterval(serverConfig.getSessionTimeout());
/*
* Configure a servlet to serve contents under site folder. Site folder can be used
* to hold site specific web assets.
*/
File siteDir = new File(Bootstrap.installDir, "site");
ServletHolder servletHolder = new ServletHolder(new FileAssetServlet(siteDir));
context.addServlet(servletHolder, "/site/*");
context.addServlet(servletHolder, "/robots.txt");
}
}
);
}
@Override
public void postStart() {
logger.info(NAME + " has been started successfully.");

View File

@ -5,6 +5,8 @@ import java.util.Properties;
import com.google.inject.name.Names;
import com.pmease.commons.bootstrap.Bootstrap;
import com.pmease.commons.jetty.extensionpoints.ServerConfigurator;
import com.pmease.commons.jetty.extensionpoints.ServletContextConfigurator;
import com.pmease.commons.loader.AbstractPlugin;
import com.pmease.commons.loader.AbstractPluginModule;
import com.pmease.commons.loader.AppName;
@ -28,6 +30,9 @@ public class ProductModule extends AbstractPluginModule {
bind(Properties.class).annotatedWith(Names.named("server")).toInstance(serverProps);
bind(ServerConfig.class).to(DefaultServerConfig.class);
addExtension(ServerConfigurator.class, GitopServerConfigurator.class);
addExtension(ServletContextConfigurator.class, GitopServletContextConfigurator.class);
}
@Override

View File

@ -1,5 +1,6 @@
package com.pmease.gitop.web;
import com.pmease.commons.jetty.extensionpoints.ServletContextConfigurator;
import com.pmease.commons.loader.AbstractPlugin;
import com.pmease.commons.loader.AbstractPluginModule;
import com.pmease.commons.wicket.AbstractWicketConfig;
@ -16,6 +17,8 @@ public class WebModule extends AbstractPluginModule {
// put your guice bindings here
bind(AbstractWicketConfig.class).to(WicketConfig.class);
addExtension(ServletContextConfigurator.class, WebServletContextConfigurator.class);
}
@Override

View File

@ -1,38 +1,7 @@
package com.pmease.gitop.web;
import java.util.Arrays;
import java.util.Collection;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.servlet.ErrorPageErrorHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import com.pmease.commons.jetty.ClasspathAssetServlet;
import com.pmease.commons.jetty.extensionpoints.ServletContextConfigurator;
import com.pmease.commons.loader.AbstractPlugin;
import com.pmease.gitop.web.asset.AssetLocator;
public class WebPlugin extends AbstractPlugin {
@Override
public Collection<?> getExtensions() {
return Arrays.asList(
new ServletContextConfigurator() {
@Override
public void configure(ServletContextHandler context) {
ServletHolder servletHolder = new ServletHolder(new ClasspathAssetServlet(AssetLocator.class));
context.addServlet(servletHolder, "/asset/*");
context.addServlet(servletHolder, "/favicon.ico");
ErrorPageErrorHandler errorHandler = (ErrorPageErrorHandler) context.getErrorHandler();
errorHandler.addErrorPage(HttpServletResponse.SC_NOT_FOUND, "/asset/404.html");
}
}
);
}
}

View File

@ -0,0 +1,25 @@
package com.pmease.gitop.web;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.servlet.ErrorPageErrorHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import com.pmease.commons.jetty.ClasspathAssetServlet;
import com.pmease.commons.jetty.extensionpoints.ServletContextConfigurator;
import com.pmease.gitop.web.asset.AssetLocator;
public class WebServletContextConfigurator implements ServletContextConfigurator {
@Override
public void configure(ServletContextHandler context) {
ServletHolder servletHolder = new ServletHolder(new ClasspathAssetServlet(AssetLocator.class));
context.addServlet(servletHolder, "/asset/*");
context.addServlet(servletHolder, "/favicon.ico");
ErrorPageErrorHandler errorHandler = (ErrorPageErrorHandler) context.getErrorHandler();
errorHandler.addErrorPage(HttpServletResponse.SC_NOT_FOUND, "/asset/404.html");
}
}