From e54cea564bec7f3247a95f58a9635f955fad44cf Mon Sep 17 00:00:00 2001 From: robin Date: Tue, 22 May 2012 22:07:19 +0800 Subject: [PATCH] 1. add tapestry support 2. enhance wicket support 3. merge parent.plugin, parent.product with parent.general --- .../resources/archetype-resources/pom.xml | 2 +- .../main/resources/archetype-resource/pom.xml | 2 +- .../resources/archetype-resources/pom.xml | 4 +- .../src/main/java/Plugin.java | 35 +++++- .../src/main/java/PluginModule.java | 4 +- .../src/main/java/WicketConfig.java | 9 ++ .../src/main/java/web/ErrorPage404.html | 12 +-- .../src/main/java/web/ErrorPage404.java | 9 ++ .../main/resources/archetype-resource/pom.xml | 2 +- commons.all/pom.xml | 1 + .../pmease/commons/bootstrap/Bootstrap.java | 19 +++- commons.hibernate/pom.xml | 2 +- .../commons/hibernate/AbstractEntity.java | 5 +- .../pmease/commons/hibernate/Hibernate.java | 16 +++ .../commons/hibernate/HibernatePlugin.java | 22 +--- .../commons/hibernate/PersistServiceImpl.java | 3 +- commons.jetty/pom.xml | 2 +- .../com/pmease/commons/jetty/JettyPlugin.java | 10 +- .../com/pmease/commons/loader/AppLoader.java | 3 +- .../pmease/commons/loader/PluginManager.java | 7 +- .../commons/loader/PluginManagerImpl.java | 21 +++- commons.product/pom.xml | 8 +- .../com/pmease/commons/product/Counter.java | 18 ++++ .../commons/product/DownloadServlet.java | 18 ++++ .../com/pmease/commons/product/Plugin.java | 44 ++++++-- .../pmease/commons/product/PluginModule.java | 8 +- .../pmease/commons/product/WicketConfig.java | 15 --- .../commons/product/pages/AnotherPage.java | 13 +++ .../commons/product/pages/AnotherPage.tml | 3 + .../pmease/commons/product/pages/Index.java | 53 +++++++++ .../pmease/commons/product/pages/Index.tml | 10 ++ .../com/pmease/commons/product/pages/ok.gif | Bin 0 -> 1717 bytes .../commons/product/services/AppModule.java | 18 ++++ .../pmease/commons/product/web/HomePage.java | 34 ------ .../main/resources/archetype-resource/pom.xml | 2 +- .../system/resource/scripts/viewer.js | 3 + commons.tapestry/pom.xml | 101 ++++++++++++++++++ .../tapestry/CustomTapestryFilter.java | 33 ++++++ .../tapestry/DisabledInjectionProvider.java | 16 +++ .../commons/tapestry/GuiceObjectProvider.java | 59 ++++++++++ .../commons/tapestry/TapestryModule.java | 25 +++++ .../commons/tapestry/TapestryPlugin.java | 14 +++ .../commons/tapestry/components/Viewer.java | 99 +++++++++++++++++ .../commons/tapestry/components/Viewer.tml | 6 ++ .../TapestryConfiguratorProvider.java | 5 + .../commons/tapestry/services/AppModule.java | 73 +++++++++++++ .../META-INF/maven/archetype-metadata.xml | 17 +++ .../main/resources/archetype-resource/pom.xml | 62 +++++++++++ .../src/main/java/Plugin.java | 13 +++ .../src/main/java/PluginModule.java | 24 +++++ ...WebFilter.java => CustomWicketFilter.java} | 4 +- .../com/pmease/commons/wicket/WebServlet.java | 30 ------ .../pmease/commons/wicket/WicketModule.java | 4 +- .../pmease/commons/wicket/WicketPlugin.java | 29 +---- parent.general/pom.xml | 21 ++++ parent.plugin/pom.xml | 55 ---------- parent.product/pom.xml | 55 ---------- .../maven/CreateProductSandboxMojo.java | 15 ++- .../maven/GeneratePluginResourcesMojo.java | 4 +- .../maven/GenerateProductResourcesMojo.java | 4 +- 60 files changed, 907 insertions(+), 298 deletions(-) rename commons.product/src/main/java/com/pmease/commons/product/web/HomePage.html => archetype.product/src/main/resources/archetype-resources/src/main/java/web/ErrorPage404.html (56%) create mode 100644 archetype.product/src/main/resources/archetype-resources/src/main/java/web/ErrorPage404.java create mode 100644 commons.hibernate/src/main/java/com/pmease/commons/hibernate/Hibernate.java create mode 100644 commons.product/src/main/java/com/pmease/commons/product/Counter.java create mode 100644 commons.product/src/main/java/com/pmease/commons/product/DownloadServlet.java delete mode 100644 commons.product/src/main/java/com/pmease/commons/product/WicketConfig.java create mode 100644 commons.product/src/main/java/com/pmease/commons/product/pages/AnotherPage.java create mode 100644 commons.product/src/main/java/com/pmease/commons/product/pages/AnotherPage.tml create mode 100644 commons.product/src/main/java/com/pmease/commons/product/pages/Index.java create mode 100644 commons.product/src/main/java/com/pmease/commons/product/pages/Index.tml create mode 100644 commons.product/src/main/java/com/pmease/commons/product/pages/ok.gif create mode 100644 commons.product/src/main/java/com/pmease/commons/product/services/AppModule.java delete mode 100644 commons.product/src/main/java/com/pmease/commons/product/web/HomePage.java create mode 100644 commons.product/system/resource/scripts/viewer.js create mode 100644 commons.tapestry/pom.xml create mode 100644 commons.tapestry/src/main/java/com/pmease/commons/tapestry/CustomTapestryFilter.java create mode 100644 commons.tapestry/src/main/java/com/pmease/commons/tapestry/DisabledInjectionProvider.java create mode 100644 commons.tapestry/src/main/java/com/pmease/commons/tapestry/GuiceObjectProvider.java create mode 100644 commons.tapestry/src/main/java/com/pmease/commons/tapestry/TapestryModule.java create mode 100644 commons.tapestry/src/main/java/com/pmease/commons/tapestry/TapestryPlugin.java create mode 100644 commons.tapestry/src/main/java/com/pmease/commons/tapestry/components/Viewer.java create mode 100644 commons.tapestry/src/main/java/com/pmease/commons/tapestry/components/Viewer.tml create mode 100644 commons.tapestry/src/main/java/com/pmease/commons/tapestry/extensionpoints/TapestryConfiguratorProvider.java create mode 100644 commons.tapestry/src/main/java/com/pmease/commons/tapestry/services/AppModule.java create mode 100644 commons.tapestry/src/main/resources/META-INF/maven/archetype-metadata.xml create mode 100644 commons.tapestry/src/main/resources/archetype-resource/pom.xml create mode 100644 commons.tapestry/src/main/resources/archetype-resource/src/main/java/Plugin.java create mode 100644 commons.tapestry/src/main/resources/archetype-resource/src/main/java/PluginModule.java rename commons.wicket/src/main/java/com/pmease/commons/wicket/{WebFilter.java => CustomWicketFilter.java} (85%) delete mode 100644 commons.wicket/src/main/java/com/pmease/commons/wicket/WebServlet.java delete mode 100644 parent.plugin/pom.xml delete mode 100644 parent.product/pom.xml diff --git a/archetype.plugin/src/main/resources/archetype-resources/pom.xml b/archetype.plugin/src/main/resources/archetype-resources/pom.xml index cdf18b6336..71b4de5d00 100644 --- a/archetype.plugin/src/main/resources/archetype-resources/pom.xml +++ b/archetype.plugin/src/main/resources/archetype-resources/pom.xml @@ -10,7 +10,7 @@ #end com.pmease - parent.plugin + parent.general 1.0.5 diff --git a/archetype.plugin/src/main/resources/archetype-resources/src/main/resources/archetype-resource/pom.xml b/archetype.plugin/src/main/resources/archetype-resources/src/main/resources/archetype-resource/pom.xml index b2860a347e..dffd0e9ed9 100644 --- a/archetype.plugin/src/main/resources/archetype-resources/src/main/resources/archetype-resource/pom.xml +++ b/archetype.plugin/src/main/resources/archetype-resources/src/main/resources/archetype-resource/pom.xml @@ -10,7 +10,7 @@ #end com.pmease - parent.plugin + parent.general 1.0.5 diff --git a/archetype.product/src/main/resources/archetype-resources/pom.xml b/archetype.product/src/main/resources/archetype-resources/pom.xml index 3bdb03e2e6..7e9ee443a1 100644 --- a/archetype.product/src/main/resources/archetype-resources/pom.xml +++ b/archetype.product/src/main/resources/archetype-resources/pom.xml @@ -12,7 +12,7 @@ com.pmease - parent.product + parent.general 1.0.5 @@ -143,7 +143,7 @@ bin/*.sh, bin/wrapper-* com.pmease.commons.bootstrap.Bootstrap ${package}.PluginModule - true + false \ No newline at end of file diff --git a/archetype.product/src/main/resources/archetype-resources/src/main/java/Plugin.java b/archetype.product/src/main/resources/archetype-resources/src/main/java/Plugin.java index 3389eb839e..1494e85f26 100644 --- a/archetype.product/src/main/resources/archetype-resources/src/main/java/Plugin.java +++ b/archetype.product/src/main/resources/archetype-resources/src/main/java/Plugin.java @@ -1,20 +1,29 @@ package ${package}; +import javax.inject.Inject; +import javax.servlet.DispatcherType; +import javax.servlet.http.HttpServletResponse; + import java.io.File; import java.util.Collection; +import java.util.EnumSet; import java.util.Properties; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.bio.SocketConnector; +import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.servlet.ErrorPageErrorHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.apache.wicket.protocol.http.WicketServlet; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.pmease.commons.bootstrap.Bootstrap; import com.pmease.commons.hibernate.AbstractEntity; +import com.pmease.commons.hibernate.HibernateFilter; import com.pmease.commons.hibernate.extensionpoints.ModelContribution; import com.pmease.commons.jetty.JettyUtils; import com.pmease.commons.jetty.extensionpoints.ServerConfigurator; @@ -28,9 +37,16 @@ public class Plugin extends AbstractPlugin { private static final Logger logger = LoggerFactory.getLogger(Plugin.class); - private Properties serverProps; + private final Properties serverProps; - public Plugin() { + private final HibernateFilter hibernateFilter; + + private final WicketServlet wicketServlet; + + @Inject + public Plugin(HibernateFilter hibernateFilter, WicketServlet wicketServlet) { + this.hibernateFilter = hibernateFilter; + this.wicketServlet = wicketServlet; serverProps = FileUtils.loadProperties(new File(Bootstrap.getConfDir(), "server.properties")); } @@ -59,6 +75,21 @@ public class Plugin extends AbstractPlugin { context.addServlet(servletHolder, "/images/*"); context.addServlet(servletHolder, "/scripts/*"); context.addServlet(servletHolder, "/styles/*"); + + FilterHolder filterHolder = new FilterHolder(hibernateFilter); + context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); + + 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, "/"); + + ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler(); + errorHandler.addErrorPage(HttpServletResponse.SC_NOT_FOUND, "/404"); + context.setErrorHandler(errorHandler); } }, diff --git a/archetype.product/src/main/resources/archetype-resources/src/main/java/PluginModule.java b/archetype.product/src/main/resources/archetype-resources/src/main/java/PluginModule.java index 6b1f1bbada..05879528d8 100644 --- a/archetype.product/src/main/resources/archetype-resources/src/main/java/PluginModule.java +++ b/archetype.product/src/main/resources/archetype-resources/src/main/java/PluginModule.java @@ -5,11 +5,11 @@ import java.util.Properties; import org.apache.wicket.protocol.http.WebApplication; -import com.google.inject.name.Names; import com.pmease.commons.bootstrap.Bootstrap; import com.pmease.commons.loader.AbstractPlugin; import com.pmease.commons.loader.AbstractPluginModule; import com.pmease.commons.util.FileUtils; +import com.pmease.commons.hibernate.Hibernate; public class PluginModule extends AbstractPluginModule { @@ -19,7 +19,7 @@ public class PluginModule extends AbstractPluginModule { Properties hibernateProps = FileUtils.loadProperties( new File(Bootstrap.installDir, "conf/hibernate.properties")); - bind(Properties.class).annotatedWith(Names.named("hibernate")).toInstance(hibernateProps); + bind(Properties.class).annotatedWith(Hibernate.class).toInstance(hibernateProps); bind(WebApplication.class).to(WicketConfig.class); } diff --git a/archetype.product/src/main/resources/archetype-resources/src/main/java/WicketConfig.java b/archetype.product/src/main/resources/archetype-resources/src/main/java/WicketConfig.java index 2c397a857a..1eb98ea0b4 100644 --- a/archetype.product/src/main/resources/archetype-resources/src/main/java/WicketConfig.java +++ b/archetype.product/src/main/resources/archetype-resources/src/main/java/WicketConfig.java @@ -3,10 +3,19 @@ package ${package}; import org.apache.wicket.Page; import com.pmease.commons.wicket.AbstractWicketConfig; + +import ${package}.web.ErrorPage404; import ${package}.web.HomePage; public class WicketConfig extends AbstractWicketConfig { + @Override + protected void init() { + super.init(); + + mountPage("/404", ErrorPage404.class); + } + @Override public Class getHomePage() { return HomePage.class; diff --git a/commons.product/src/main/java/com/pmease/commons/product/web/HomePage.html b/archetype.product/src/main/resources/archetype-resources/src/main/java/web/ErrorPage404.html similarity index 56% rename from commons.product/src/main/java/com/pmease/commons/product/web/HomePage.html rename to archetype.product/src/main/resources/archetype-resources/src/main/java/web/ErrorPage404.html index 04ae636aa9..380f0af26b 100644 --- a/commons.product/src/main/java/com/pmease/commons/product/web/HomePage.html +++ b/archetype.product/src/main/resources/archetype-resources/src/main/java/web/ErrorPage404.html @@ -2,17 +2,9 @@ - Hello World + Page Not Found -
- -
-
-

It Works!

-
-
- add user -
+ Sorry we can not find the page you requested. diff --git a/archetype.product/src/main/resources/archetype-resources/src/main/java/web/ErrorPage404.java b/archetype.product/src/main/resources/archetype-resources/src/main/java/web/ErrorPage404.java new file mode 100644 index 0000000000..7031da9de2 --- /dev/null +++ b/archetype.product/src/main/resources/archetype-resources/src/main/java/web/ErrorPage404.java @@ -0,0 +1,9 @@ +package ${package}.web; + +import org.apache.wicket.markup.html.WebPage; + +@SuppressWarnings("serial") +public class ErrorPage404 extends WebPage { + public ErrorPage404() { + } +} \ No newline at end of file diff --git a/archetype.product/src/main/resources/archetype-resources/src/main/resources/archetype-resource/pom.xml b/archetype.product/src/main/resources/archetype-resources/src/main/resources/archetype-resource/pom.xml index b2860a347e..dffd0e9ed9 100644 --- a/archetype.product/src/main/resources/archetype-resources/src/main/resources/archetype-resource/pom.xml +++ b/archetype.product/src/main/resources/archetype-resources/src/main/resources/archetype-resource/pom.xml @@ -10,7 +10,7 @@ #end com.pmease - parent.plugin + parent.general 1.0.5 diff --git a/commons.all/pom.xml b/commons.all/pom.xml index 7a191c538f..6fa3be9bd0 100644 --- a/commons.all/pom.xml +++ b/commons.all/pom.xml @@ -18,6 +18,7 @@ ../commons.jetty ../commons.hibernate ../commons.wicket + ../commons.tapestry diff --git a/commons.bootstrap/src/main/java/com/pmease/commons/bootstrap/Bootstrap.java b/commons.bootstrap/src/main/java/com/pmease/commons/bootstrap/Bootstrap.java index 697ca3d631..dbb92f0bfe 100644 --- a/commons.bootstrap/src/main/java/com/pmease/commons/bootstrap/Bootstrap.java +++ b/commons.bootstrap/src/main/java/com/pmease/commons/bootstrap/Bootstrap.java @@ -137,7 +137,24 @@ public class Bootstrap { } } - ClassLoader appClassLoader = new URLClassLoader(urls.toArray(new URL[0]), Bootstrap.class.getClassLoader()); + ClassLoader appClassLoader = new URLClassLoader(urls.toArray(new URL[0]), Bootstrap.class.getClassLoader()) { + + @Override + protected Class findClass(String name) throws ClassNotFoundException { + return super.findClass(name); + } + + @Override + public Class loadClass(String name) throws ClassNotFoundException { + return super.loadClass(name); + } + + @Override + public URL findResource(String name) { + return super.findResource(name); + } + + }; ClassLoader originClassLoader = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(appClassLoader); diff --git a/commons.hibernate/pom.xml b/commons.hibernate/pom.xml index 370a0f9e31..9b1ee48901 100644 --- a/commons.hibernate/pom.xml +++ b/commons.hibernate/pom.xml @@ -3,7 +3,7 @@ 4.0.0 - parent.plugin + parent.general com.pmease 1.0.5 diff --git a/commons.hibernate/src/main/java/com/pmease/commons/hibernate/AbstractEntity.java b/commons.hibernate/src/main/java/com/pmease/commons/hibernate/AbstractEntity.java index 706d2edc2e..ffab2211bd 100644 --- a/commons.hibernate/src/main/java/com/pmease/commons/hibernate/AbstractEntity.java +++ b/commons.hibernate/src/main/java/com/pmease/commons/hibernate/AbstractEntity.java @@ -36,9 +36,8 @@ public abstract class AbstractEntity implements Serializable { AbstractEntity otherEntity = (AbstractEntity) other; if (getId() == null && otherEntity.getId() == null) return super.equals(other); - else - return new EqualsBuilder().append(getId(), otherEntity.getId()) - .isEquals(); + else + return new EqualsBuilder().append(getId(), otherEntity.getId()).isEquals(); } public int hashCode() { diff --git a/commons.hibernate/src/main/java/com/pmease/commons/hibernate/Hibernate.java b/commons.hibernate/src/main/java/com/pmease/commons/hibernate/Hibernate.java new file mode 100644 index 0000000000..e2be999447 --- /dev/null +++ b/commons.hibernate/src/main/java/com/pmease/commons/hibernate/Hibernate.java @@ -0,0 +1,16 @@ +package com.pmease.commons.hibernate; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import com.google.inject.BindingAnnotation; + +@Retention(RUNTIME) +@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD }) +@BindingAnnotation +public @interface Hibernate { + +} diff --git a/commons.hibernate/src/main/java/com/pmease/commons/hibernate/HibernatePlugin.java b/commons.hibernate/src/main/java/com/pmease/commons/hibernate/HibernatePlugin.java index 5d7150ca2c..a970beed9b 100644 --- a/commons.hibernate/src/main/java/com/pmease/commons/hibernate/HibernatePlugin.java +++ b/commons.hibernate/src/main/java/com/pmease/commons/hibernate/HibernatePlugin.java @@ -1,28 +1,17 @@ package com.pmease.commons.hibernate; 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.pmease.commons.jetty.extensionpoints.ServletContextConfigurator; import com.pmease.commons.loader.AbstractPlugin; public class HibernatePlugin extends AbstractPlugin { private final PersistService persistService; - private final HibernateFilter persistFilter; - @Inject - public HibernatePlugin(PersistService persistService, HibernateFilter persistFilter) { + public HibernatePlugin(PersistService persistService) { this.persistService = persistService; - this.persistFilter = persistFilter; } @Override @@ -37,14 +26,7 @@ public class HibernatePlugin extends AbstractPlugin { @Override public Collection getExtensions() { - return ImmutableList.of(new ServletContextConfigurator() { - - @Override - public void configure(ServletContextHandler context) { - FilterHolder filterHolder = new FilterHolder(persistFilter); - context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); - } - }); + return null; } } diff --git a/commons.hibernate/src/main/java/com/pmease/commons/hibernate/PersistServiceImpl.java b/commons.hibernate/src/main/java/com/pmease/commons/hibernate/PersistServiceImpl.java index d767b5559a..7b67b22ba8 100644 --- a/commons.hibernate/src/main/java/com/pmease/commons/hibernate/PersistServiceImpl.java +++ b/commons.hibernate/src/main/java/com/pmease/commons/hibernate/PersistServiceImpl.java @@ -13,7 +13,6 @@ import com.google.common.base.Preconditions; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; -import com.google.inject.name.Named; import com.pmease.commons.bootstrap.Bootstrap; import com.pmease.commons.hibernate.extensionpoints.ModelContribution; import com.pmease.commons.loader.PluginManager; @@ -33,7 +32,7 @@ public class PersistServiceImpl implements PersistService, Provider 4.0.0 - parent.plugin + parent.general com.pmease 1.0.5 diff --git a/commons.jetty/src/main/java/com/pmease/commons/jetty/JettyPlugin.java b/commons.jetty/src/main/java/com/pmease/commons/jetty/JettyPlugin.java index dd81184ea3..acf3fea48a 100644 --- a/commons.jetty/src/main/java/com/pmease/commons/jetty/JettyPlugin.java +++ b/commons.jetty/src/main/java/com/pmease/commons/jetty/JettyPlugin.java @@ -29,6 +29,8 @@ public class JettyPlugin extends AbstractPlugin { private Server server; + private ServletContextHandler context; + public final PluginManager pluginManager; @Inject @@ -55,11 +57,15 @@ public class JettyPlugin extends AbstractPlugin { throw BootstrapUtils.unchecked(e); } } - + + public ServletContextHandler getContext() { + return context; + } + private Server createServer() { server = new Server(); - ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); + context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setClassLoader(JettyPlugin.class.getClassLoader()); context.setContextPath("/"); diff --git a/commons.loader/src/main/java/com/pmease/commons/loader/AppLoader.java b/commons.loader/src/main/java/com/pmease/commons/loader/AppLoader.java index 053b1f5696..3a6b736f34 100644 --- a/commons.loader/src/main/java/com/pmease/commons/loader/AppLoader.java +++ b/commons.loader/src/main/java/com/pmease/commons/loader/AppLoader.java @@ -26,7 +26,7 @@ public class AppLoader implements Lifecycle { private static final Logger logger = LoggerFactory.getLogger(AppLoader.class); - private static Injector injector; + public static Injector injector; @Override public void start() { @@ -100,4 +100,5 @@ public class AppLoader implements Lifecycle { public static T getInstance(Class type) { return injector.getInstance(type); } + } diff --git a/commons.loader/src/main/java/com/pmease/commons/loader/PluginManager.java b/commons.loader/src/main/java/com/pmease/commons/loader/PluginManager.java index e3fcdddbd1..b31d512595 100644 --- a/commons.loader/src/main/java/com/pmease/commons/loader/PluginManager.java +++ b/commons.loader/src/main/java/com/pmease/commons/loader/PluginManager.java @@ -1,7 +1,6 @@ package com.pmease.commons.loader; import java.util.Collection; -import java.util.Map; import com.pmease.commons.bootstrap.Lifecycle; @@ -9,5 +8,9 @@ public interface PluginManager extends Lifecycle { Collection getExtensions(Class extensionPoint); - Map getPluginMap(); + Collection getPlugins(); + + T getPlugin(Class pluginClass); + + AbstractPlugin getPlugin(String pluginId); } diff --git a/commons.loader/src/main/java/com/pmease/commons/loader/PluginManagerImpl.java b/commons.loader/src/main/java/com/pmease/commons/loader/PluginManagerImpl.java index 012adf5b12..a47ba31e4b 100644 --- a/commons.loader/src/main/java/com/pmease/commons/loader/PluginManagerImpl.java +++ b/commons.loader/src/main/java/com/pmease/commons/loader/PluginManagerImpl.java @@ -82,8 +82,25 @@ public class PluginManagerImpl implements PluginManager { } @Override - public Map getPluginMap() { - return Collections.unmodifiableMap(pluginMap); + public Collection getPlugins() { + return Collections.unmodifiableCollection(pluginMap.values()); + } + + @SuppressWarnings("unchecked") + @Override + public T getPlugin(Class pluginClass) { + for (AbstractPlugin plugin: pluginMap.values()) { + if (plugin.getClass() == pluginClass) + return (T) plugin; + } + throw new RuntimeException("Unable to find plugin with class '" + pluginClass + "'."); + } + + public AbstractPlugin getPlugin(String pluginId) { + if (pluginMap.containsKey(pluginId)) + return pluginMap.get(pluginId); + else + throw new RuntimeException("Unable to find plugin with id '" + pluginId + "'."); } } diff --git a/commons.product/pom.xml b/commons.product/pom.xml index 4d46a4f82b..b98cbf731e 100644 --- a/commons.product/pom.xml +++ b/commons.product/pom.xml @@ -7,7 +7,7 @@ com.pmease - parent.product + parent.general 1.0.5 @@ -109,8 +109,8 @@ com.pmease - commons.wicket - 1.0.5 + commons.tapestry + 1.0.0 @@ -136,7 +136,7 @@ bin/*.sh, bin/wrapper-* com.pmease.commons.bootstrap.Bootstrap com.pmease.commons.product.PluginModule - true + false \ No newline at end of file diff --git a/commons.product/src/main/java/com/pmease/commons/product/Counter.java b/commons.product/src/main/java/com/pmease/commons/product/Counter.java new file mode 100644 index 0000000000..a1592520d8 --- /dev/null +++ b/commons.product/src/main/java/com/pmease/commons/product/Counter.java @@ -0,0 +1,18 @@ +package com.pmease.commons.product; + +public class Counter { + + private int value; + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + + public void increase() { + value++; + } +} \ No newline at end of file diff --git a/commons.product/src/main/java/com/pmease/commons/product/DownloadServlet.java b/commons.product/src/main/java/com/pmease/commons/product/DownloadServlet.java new file mode 100644 index 0000000000..d39f6c3291 --- /dev/null +++ b/commons.product/src/main/java/com/pmease/commons/product/DownloadServlet.java @@ -0,0 +1,18 @@ +package com.pmease.commons.product; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class DownloadServlet extends HttpServlet { + + @Override + protected void service(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + resp.getOutputStream().println("hello world"); + } + +} diff --git a/commons.product/src/main/java/com/pmease/commons/product/Plugin.java b/commons.product/src/main/java/com/pmease/commons/product/Plugin.java index efea6d26d8..43d79c592b 100644 --- a/commons.product/src/main/java/com/pmease/commons/product/Plugin.java +++ b/commons.product/src/main/java/com/pmease/commons/product/Plugin.java @@ -2,27 +2,34 @@ package com.pmease.commons.product; import java.io.File; import java.util.Collection; +import java.util.EnumSet; import java.util.Properties; +import javax.inject.Inject; +import javax.servlet.DispatcherType; + +import org.apache.tapestry5.TapestryFilter; +import org.apache.tapestry5.internal.InternalConstants; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.bio.SocketConnector; +import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.pmease.commons.bootstrap.Bootstrap; import com.pmease.commons.hibernate.AbstractEntity; +import com.pmease.commons.hibernate.HibernateFilter; import com.pmease.commons.hibernate.extensionpoints.ModelContribution; import com.pmease.commons.jetty.JettyUtils; import com.pmease.commons.jetty.extensionpoints.ServerConfigurator; import com.pmease.commons.jetty.extensionpoints.ServletContextConfigurator; import com.pmease.commons.loader.AbstractPlugin; +import com.pmease.commons.product.model.User; import com.pmease.commons.util.ClassUtils; import com.pmease.commons.util.FileUtils; -import com.pmease.commons.product.model.User; public class Plugin extends AbstractPlugin { @@ -30,7 +37,14 @@ public class Plugin extends AbstractPlugin { private Properties serverProps; - public Plugin() { + private final HibernateFilter hibernateFilter; + + private final TapestryFilter tapestryFilter; + + @Inject + public Plugin(HibernateFilter hibernateFilter, TapestryFilter tapestryFilter) { + this.hibernateFilter = hibernateFilter; + this.tapestryFilter = tapestryFilter; serverProps = FileUtils.loadProperties(new File(Bootstrap.getConfDir(), "server.properties")); } @@ -52,13 +66,25 @@ public class Plugin extends AbstractPlugin { public void configure(ServletContextHandler context) { context.getSessionHandler().getSessionManager() .setMaxInactiveInterval(Integer.parseInt(serverProps.getProperty("sessionTimeout"))); - context.setResourceBase(new File(Bootstrap.installDir, "resource").getAbsolutePath()); + + File resourceDir = new File(Bootstrap.installDir, "resource"); + context.setResourceBase(resourceDir.getAbsolutePath()); + + ServletHolder servletHolder = JettyUtils.createResourceServletHolder(); + for (String path: resourceDir.list()) + context.addServlet(servletHolder, "/" + path); + + context.addServlet(JettyUtils.createResourceServletHolder(), "/"); + + FilterHolder filterHolder = new FilterHolder(hibernateFilter); + context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); - ServletHolder servletHolder = JettyUtils.createResourceServletHolder(); - Preconditions.checkNotNull(servletHolder); - context.addServlet(servletHolder, "/images/*"); - context.addServlet(servletHolder, "/scripts/*"); - context.addServlet(servletHolder, "/styles/*"); + filterHolder = new FilterHolder(tapestryFilter); + filterHolder.setName("app"); + context.setInitParameter(InternalConstants.TAPESTRY_APP_PACKAGE_PARAM, Plugin.class.getPackage().getName()); + context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); + + context.addServlet(DownloadServlet.class, "/download/*"); } }, diff --git a/commons.product/src/main/java/com/pmease/commons/product/PluginModule.java b/commons.product/src/main/java/com/pmease/commons/product/PluginModule.java index a8ef82f0b3..e1835823ef 100644 --- a/commons.product/src/main/java/com/pmease/commons/product/PluginModule.java +++ b/commons.product/src/main/java/com/pmease/commons/product/PluginModule.java @@ -3,10 +3,8 @@ package com.pmease.commons.product; import java.io.File; import java.util.Properties; -import org.apache.wicket.protocol.http.WebApplication; - -import com.google.inject.name.Names; import com.pmease.commons.bootstrap.Bootstrap; +import com.pmease.commons.hibernate.Hibernate; import com.pmease.commons.loader.AbstractPlugin; import com.pmease.commons.loader.AbstractPluginModule; import com.pmease.commons.util.FileUtils; @@ -19,9 +17,7 @@ public class PluginModule extends AbstractPluginModule { Properties hibernateProps = FileUtils.loadProperties( new File(Bootstrap.installDir, "conf/hibernate.properties")); - bind(Properties.class).annotatedWith(Names.named("hibernate")).toInstance(hibernateProps); - - bind(WebApplication.class).to(WicketConfig.class); + bind(Properties.class).annotatedWith(Hibernate.class).toInstance(hibernateProps); } @Override diff --git a/commons.product/src/main/java/com/pmease/commons/product/WicketConfig.java b/commons.product/src/main/java/com/pmease/commons/product/WicketConfig.java deleted file mode 100644 index 4e8629d499..0000000000 --- a/commons.product/src/main/java/com/pmease/commons/product/WicketConfig.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.pmease.commons.product; - -import org.apache.wicket.Page; - -import com.pmease.commons.wicket.AbstractWicketConfig; -import com.pmease.commons.product.web.HomePage; - -public class WicketConfig extends AbstractWicketConfig { - - @Override - public Class getHomePage() { - return HomePage.class; - } - -} diff --git a/commons.product/src/main/java/com/pmease/commons/product/pages/AnotherPage.java b/commons.product/src/main/java/com/pmease/commons/product/pages/AnotherPage.java new file mode 100644 index 0000000000..afbbad48b9 --- /dev/null +++ b/commons.product/src/main/java/com/pmease/commons/product/pages/AnotherPage.java @@ -0,0 +1,13 @@ +package com.pmease.commons.product.pages; + +import java.util.List; + +import com.google.common.collect.ImmutableList; + +public class AnotherPage { + + public List getElements() { + return ImmutableList.of("4", "5", "6"); + } + +} diff --git a/commons.product/src/main/java/com/pmease/commons/product/pages/AnotherPage.tml b/commons.product/src/main/java/com/pmease/commons/product/pages/AnotherPage.tml new file mode 100644 index 0000000000..bc2642924a --- /dev/null +++ b/commons.product/src/main/java/com/pmease/commons/product/pages/AnotherPage.tml @@ -0,0 +1,3 @@ + + ${var:value} + diff --git a/commons.product/src/main/java/com/pmease/commons/product/pages/Index.java b/commons.product/src/main/java/com/pmease/commons/product/pages/Index.java new file mode 100644 index 0000000000..d1b732ea00 --- /dev/null +++ b/commons.product/src/main/java/com/pmease/commons/product/pages/Index.java @@ -0,0 +1,53 @@ +package com.pmease.commons.product.pages; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +import org.apache.tapestry5.annotations.InjectComponent; +import org.apache.tapestry5.annotations.Persist; +import org.apache.tapestry5.annotations.Property; +import org.apache.tapestry5.corelib.components.Zone; + +import com.pmease.commons.hibernate.dao.GeneralDao; +import com.pmease.commons.product.Counter; +import com.pmease.commons.product.model.User; + +public class Index { + + @Persist + @Property + private List counters; + + @InjectComponent + private Zone zone; + + @Property + private Counter counter; + + @Inject + private GeneralDao dao; + + void setupRender() { + if (counters == null) { + counters = new ArrayList(); + counters.add(new Counter()); + counters.add(new Counter()); + } + } + + void onActionFromModify() { + System.out.println(dao.getReference(User.class, 1L).getEmail()); + } + + Object onActionFromIncrease(int index) { + counter = counters.get(index); + counter.increase(); + return zone; + } + + public String getZoneId() { + return zone.getClientId(); + } +} diff --git a/commons.product/src/main/java/com/pmease/commons/product/pages/Index.tml b/commons.product/src/main/java/com/pmease/commons/product/pages/Index.tml new file mode 100644 index 0000000000..5d10bc86fc --- /dev/null +++ b/commons.product/src/main/java/com/pmease/commons/product/pages/Index.tml @@ -0,0 +1,10 @@ + + + + ${counter.value} + increase + + + modify + + diff --git a/commons.product/src/main/java/com/pmease/commons/product/pages/ok.gif b/commons.product/src/main/java/com/pmease/commons/product/pages/ok.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b621ed83120821c1327c04264df05609eefc300 GIT binary patch literal 1717 zcmV;m21@xyNk%w1VIKe=0QUd@00030|Nj7*0RfZ&CY~lFl_V^bEJ2b%evp3Z?&`a| zyRNUU37iHioGNp)aSx#g6{-zdiCAB9UKy+o8mti>uM{J(7bdkDF0&*two5zmY?33q2HUO;GeAHrn~32VRK(7 zu@@`08!@;aG`u1*yCOHfB{{z)HM}K9!!|viFiXQcWzAP^$76uhb&1%3h}M6R+lQ6h zjGNw*aGGmlhhCYpmME(eH@YD>ydyinCq2R`K*K6P#4AF@EJMRCL#r`U%Rg(-TXocB zbj@XY)op{oH&NWfbHd4?xRM9w9(m7VrIakv< zS=BsS*FIm>L}J!PbJbme+ir#3a*5w|qu!Q0wjDvaAws+&RL?e8(>htyJ6qO0T-H5X z)jV9)JYCm5Ue`Wf*gs&|Kw;WJV%kAt+(TpALS@}VTew4Dq)(X5i@52m#OJ#~wjV{j zBSpF+V%b1t+(TvCLT24WXWm6<-bHEOMrz+iY~e_2;74uZNp9jvZ{td}*sIaz%TB;2 zPQ55lz${k6FIdDeaN|mGb>~iY=T3O(P_Fa$oUy%4;l>1_m`eBv)W0(D8nEz({{`>y^{{8*^ z`}_O$_V)7f^6&5O=jZ3);o;oe+}POI!otF*r>ByVl7)qZe}8{`e0*wZYXATL00000 z0000000000A^8LW008>{EC2ui03QG!000R80QU(TNbp#(YSf-RqxKD)t#<1ON}RYa z9VtZDteN7&g$o~3$*xhWm4F?^iN~lVGu2`O1PT~1SbzYb#UpFaNV$u6a^I+3EGKBl zVPXX-QY%t`*g(O;DP5xAnWR`OS(geKLYzpULdA-%DNvXYv7tg2T*Tr{B{=F97YiOp z^eC~ltBSBce30Pr!2*|Cd(;-p)y2XG9U?~f_;CV7im)b1^x&Z*#D@!Kg}~#P?wO+t zH$a5Yv7^UgEvSEF!D3~K4iGIoxNrnYfjfbtPQ9Sv1PTZpQ>;|MlBKv0ELEsTi2@r3 zjTfhk%`*vy&x;#4oIHslrOB&K%4N-Sie$IC3RxUz~Tu@3SF z8$$$Pk1a!du`4B-bka&Jv;^D2FTL<0%PXtED(DzPa8OS>ZMZ;)C7F2gD=oeRL#8sq z48yG~u6(jdCWX9UgFf`EvqcAeWU|RB*!nVzG6Oc_@G`=13rj1iXaY$GLEIzHJ_#^k zK_{NH0!uHzDC0~tEnqVZHqbP~j4-~?5(_J=wD9kH`><0>2Svp43cSLcoXs}gc+(9x zEh`gDFR;i`L0WG}y#K zLE-w;BbY>r3(>#;7og%zIg_J9c{rW8FhBtkbpH87?7*V{5CjY$Km|sG0frG42rvKv zY~Q1RR6Xspjyv-#fItKX7*Id~1{@Fp3;Nu%z&tx8KM*_b$U{#(_S}OHKKIyD4?Xg{ L!;U%=1q1*)QfDLl literal 0 HcmV?d00001 diff --git a/commons.product/src/main/java/com/pmease/commons/product/services/AppModule.java b/commons.product/src/main/java/com/pmease/commons/product/services/AppModule.java new file mode 100644 index 0000000000..5e276817bb --- /dev/null +++ b/commons.product/src/main/java/com/pmease/commons/product/services/AppModule.java @@ -0,0 +1,18 @@ +package com.pmease.commons.product.services; + +import org.apache.tapestry5.SymbolConstants; +import org.apache.tapestry5.ioc.MappedConfiguration; + +import com.pmease.commons.loader.PluginManager; +import com.pmease.commons.product.Plugin; + +public class AppModule { + + public static void contributeFactoryDefaults( + MappedConfiguration configuration, PluginManager pluginManager) { + configuration.override( + SymbolConstants.APPLICATION_VERSION, + pluginManager.getPlugin(Plugin.class).getVersion()); + } + +} diff --git a/commons.product/src/main/java/com/pmease/commons/product/web/HomePage.java b/commons.product/src/main/java/com/pmease/commons/product/web/HomePage.java deleted file mode 100644 index 6ac682ec3e..0000000000 --- a/commons.product/src/main/java/com/pmease/commons/product/web/HomePage.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.pmease.commons.product.web; - -import java.util.Collection; - -import org.apache.wicket.markup.html.WebPage; -import org.apache.wicket.markup.html.link.Link; -import org.hibernate.criterion.Criterion; -import org.hibernate.criterion.Restrictions; - -import com.pmease.commons.hibernate.dao.GeneralDao; -import com.pmease.commons.loader.AppLoader; -import com.pmease.commons.product.model.User; - -@SuppressWarnings("serial") -public class HomePage extends WebPage { - public HomePage() { - add(new Link("addUser") { - - @Override - public void onClick() { - GeneralDao generalDao = AppLoader.getInstance(GeneralDao.class); - Collection result = generalDao.search(User.class, - new Criterion[]{Restrictions.eq("name", "robin")}, null, 0, 0); - if (result.isEmpty()) { - User user = new User(); - user.setName("robin"); - user.setEmail("robin@example.com"); - generalDao.save(user); - } - } - - }); - } -} \ No newline at end of file diff --git a/commons.product/src/main/resources/archetype-resource/pom.xml b/commons.product/src/main/resources/archetype-resource/pom.xml index b2860a347e..dffd0e9ed9 100644 --- a/commons.product/src/main/resources/archetype-resource/pom.xml +++ b/commons.product/src/main/resources/archetype-resource/pom.xml @@ -10,7 +10,7 @@ #end com.pmease - parent.plugin + parent.general 1.0.5 diff --git a/commons.product/system/resource/scripts/viewer.js b/commons.product/system/resource/scripts/viewer.js new file mode 100644 index 0000000000..57b1d24176 --- /dev/null +++ b/commons.product/system/resource/scripts/viewer.js @@ -0,0 +1,3 @@ +function test(msg) { + alert(msg); +} \ No newline at end of file diff --git a/commons.tapestry/pom.xml b/commons.tapestry/pom.xml new file mode 100644 index 0000000000..3f748e8d94 --- /dev/null +++ b/commons.tapestry/pom.xml @@ -0,0 +1,101 @@ + + 4.0.0 + commons.tapestry + 1.0.0 + + com.pmease + parent.general + 1.0.5 + + + + + + com.pmease + plugin.maven + + + maven-source-plugin + + + maven-javadoc-plugin + + + + + + + com.pmease + commons.loader + 1.0.5 + + + com.pmease + commons.jetty + 1.0.5 + + + org.apache.tapestry + tapestry-core + 5.3.3 + + + log4j + log4j + + + org.slf4j + slf4j-log4j12 + + + + + + org.got5 + tapestry5-jquery + 3.0.0 + + + + + + devlab722-repo + http://nexus.devlab722.net/nexus/content/repositories/releases + + false + + + + devlab722-snapshot-repo + http://nexus.devlab722.net/nexus/content/repositories/snapshots + + false + + + + pmeaseRepo + PMEase Repository + + true + never + fail + + + true + always + fail + + http://artifact.pmease.com/ + + + + + com.pmease.commons.tapestry.TapestryModule + + + diff --git a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/CustomTapestryFilter.java b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/CustomTapestryFilter.java new file mode 100644 index 0000000000..3ca2812e26 --- /dev/null +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/CustomTapestryFilter.java @@ -0,0 +1,33 @@ +package com.pmease.commons.tapestry; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; +import javax.inject.Singleton; +import javax.servlet.ServletContext; + +import org.apache.tapestry5.TapestryFilter; + +import com.pmease.commons.loader.PluginManager; +import com.pmease.commons.tapestry.extensionpoints.TapestryConfiguratorProvider; +import com.pmease.commons.tapestry.services.AppModule; + +@Singleton +public class CustomTapestryFilter extends TapestryFilter { + + @Inject + private PluginManager pluginManager; + + @Override + protected Class[] provideExtraModuleClasses(ServletContext context) { + List> moduleClasses = new ArrayList>(); + + moduleClasses.add(AppModule.class); + for (TapestryConfiguratorProvider each : pluginManager + .getExtensions(TapestryConfiguratorProvider.class)) + moduleClasses.add(each.getTapestryConfigurator()); + return moduleClasses.toArray(new Class[0]); + } + +} diff --git a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/DisabledInjectionProvider.java b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/DisabledInjectionProvider.java new file mode 100644 index 0000000000..cd804577df --- /dev/null +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/DisabledInjectionProvider.java @@ -0,0 +1,16 @@ +package com.pmease.commons.tapestry; + +import org.apache.tapestry5.ioc.ObjectLocator; +import org.apache.tapestry5.model.MutableComponentModel; +import org.apache.tapestry5.plastic.PlasticField; +import org.apache.tapestry5.services.transform.InjectionProvider2; + +public class DisabledInjectionProvider implements InjectionProvider2 { + + @Override + public boolean provideInjection(PlasticField field, ObjectLocator locator, + MutableComponentModel componentModel) { + return false; + } + +} diff --git a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/GuiceObjectProvider.java b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/GuiceObjectProvider.java new file mode 100644 index 0000000000..155c8caa9b --- /dev/null +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/GuiceObjectProvider.java @@ -0,0 +1,59 @@ +package com.pmease.commons.tapestry; + +import java.lang.annotation.Annotation; +import java.util.List; + +import org.apache.tapestry5.ioc.AnnotationProvider; +import org.apache.tapestry5.ioc.ObjectLocator; +import org.apache.tapestry5.ioc.ObjectProvider; + +import com.google.inject.Binding; +import com.google.inject.Injector; +import com.google.inject.TypeLiteral; + +public class GuiceObjectProvider implements ObjectProvider { + + private Injector injector; + + public GuiceObjectProvider(Injector injector) { + this.injector = injector; + } + + @SuppressWarnings("unchecked") + public T provide(Class objectType, AnnotationProvider annotationProvider, ObjectLocator locator) { + TypeLiteral type = TypeLiteral.get(objectType); + final List bindings = injector.findBindingsByType(type); + if (bindings.size() == 1) + return injector.getInstance(objectType); + + for (int i = 0; i < bindings.size(); ++i) { + Binding binding = (Binding) bindings.get(i); + Class annotationType = binding.getKey().getAnnotationType(); + if (annotationType != null) { + Annotation annotation = annotationProvider.getAnnotation(annotationType); + if (annotation == null && annotationType == com.google.inject.name.Named.class) + annotation = annotationProvider.getAnnotation(javax.inject.Named.class); + if (annotation != null) { + if (annotation instanceof com.google.inject.name.Named) { + com.google.inject.name.Named providedNamed = (com.google.inject.name.Named) annotation; + com.google.inject.name.Named bindingNamed = (com.google.inject.name.Named) binding.getKey().getAnnotation(); + if (providedNamed.value().equals(bindingNamed.value())) + return (T) injector.getInstance(binding.getKey()); + } else if (annotation instanceof javax.inject.Named) { + javax.inject.Named providedNamed = (javax.inject.Named) annotation; + com.google.inject.name.Named bindingNamed = (com.google.inject.name.Named) binding.getKey().getAnnotation(); + if (providedNamed.value().equals(bindingNamed.value())) + return (T) injector.getInstance(binding.getKey()); + } else { + return (T) injector.getInstance(binding.getKey()); + } + } + } else { + return (T) injector.getInstance(binding.getKey()); + } + } + + return null; + } + +} diff --git a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/TapestryModule.java b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/TapestryModule.java new file mode 100644 index 0000000000..34e8a071cb --- /dev/null +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/TapestryModule.java @@ -0,0 +1,25 @@ +package com.pmease.commons.tapestry; + +import org.apache.tapestry5.TapestryFilter; + +import com.pmease.commons.loader.AbstractPlugin; +import com.pmease.commons.loader.AbstractPluginModule; + +/** + * NOTE: Do not forget to rename moduleClass property defined in the pom if you've renamed this class. + * + */ +public class TapestryModule extends AbstractPluginModule { + + @Override + protected void configure() { + super.configure(); + bind(TapestryFilter.class).to(CustomTapestryFilter.class); + } + + @Override + protected Class getPluginClass() { + return TapestryPlugin.class; + } + +} diff --git a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/TapestryPlugin.java b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/TapestryPlugin.java new file mode 100644 index 0000000000..3d189ceebd --- /dev/null +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/TapestryPlugin.java @@ -0,0 +1,14 @@ +package com.pmease.commons.tapestry; + +import java.util.Collection; + +import com.pmease.commons.loader.AbstractPlugin; + +public class TapestryPlugin extends AbstractPlugin { + + @Override + public Collection getExtensions() { + return null; + } + +} diff --git a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/components/Viewer.java b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/components/Viewer.java new file mode 100644 index 0000000000..ec990f7dd3 --- /dev/null +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/components/Viewer.java @@ -0,0 +1,99 @@ +package com.pmease.commons.tapestry.components; + +import java.io.Serializable; +import java.util.List; +import java.util.Stack; + +import org.apache.tapestry5.annotations.Import; +import org.apache.tapestry5.annotations.Parameter; +import org.apache.tapestry5.annotations.Property; + +@SuppressWarnings("rawtypes") +@Import(library="context:scripts/viewer.js") +public class Viewer { + + @Parameter(required=true) + private List elements; + + @Property + private Stack stack = new Stack(); + + @SuppressWarnings("unused") + @Parameter(required=true) + private String value; + + public Object getCurrent() { + return stack.peek().getCurrent(); + } + + void setupRender() { + if (stack.isEmpty()) + stack.push(new Context(elements, 0)); + else + stack.push(new Context((List) stack.peek().getCurrent(), 0)); + } + + void cleanupRender() { + stack.pop(); + } + + Object beginRender() { + if (stack.peek().getCurrent() instanceof List) + return this; + else + return null; + } + + boolean beforeRenderTemplate() { + Context context = stack.peek(); + Object current = context.getCurrent(); + if (current instanceof String) { + value = (String) current; + return true; + } else { + return false; + } + } + + boolean afterRender() { + stack.peek().setPosition(stack.peek().getPosition() + 1); + return stack.peek().getCurrent() == null; + } + + public static class Context implements Serializable { + private static final long serialVersionUID = 1L; + + private List elements; + + private int position; + + public Context(List elements, int position) { + this.elements = elements; + this.position = position; + } + + public List getElements() { + return elements; + } + + public void setElements(List elements) { + this.elements = elements; + } + + public int getPosition() { + return position; + } + + public void setPosition(int position) { + this.position = position; + } + + public Object getCurrent() { + if (position < elements.size()) + return elements.get(position); + else + return null; + } + } + +} diff --git a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/components/Viewer.tml b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/components/Viewer.tml new file mode 100644 index 0000000000..42bddbed9b --- /dev/null +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/components/Viewer.tml @@ -0,0 +1,6 @@ +
+   + +
diff --git a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/extensionpoints/TapestryConfiguratorProvider.java b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/extensionpoints/TapestryConfiguratorProvider.java new file mode 100644 index 0000000000..fdc586675f --- /dev/null +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/extensionpoints/TapestryConfiguratorProvider.java @@ -0,0 +1,5 @@ +package com.pmease.commons.tapestry.extensionpoints; + +public interface TapestryConfiguratorProvider { + Class getTapestryConfigurator(); +} diff --git a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/services/AppModule.java b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/services/AppModule.java new file mode 100644 index 0000000000..950f851b66 --- /dev/null +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/services/AppModule.java @@ -0,0 +1,73 @@ +package com.pmease.commons.tapestry.services; + +import org.apache.commons.lang.StringUtils; +import org.apache.tapestry5.SymbolConstants; +import org.apache.tapestry5.ioc.Configuration; +import org.apache.tapestry5.ioc.MappedConfiguration; +import org.apache.tapestry5.ioc.ObjectProvider; +import org.apache.tapestry5.ioc.OrderedConfiguration; +import org.apache.tapestry5.ioc.annotations.Local; +import org.apache.tapestry5.ioc.services.SymbolSource; +import org.apache.tapestry5.services.AssetSource; +import org.apache.tapestry5.services.LibraryMapping; +import org.apache.tapestry5.services.transform.InjectionProvider2; +import org.eclipse.jetty.servlet.ServletMapping; + +import com.google.inject.Injector; +import com.pmease.commons.bootstrap.Bootstrap; +import com.pmease.commons.jetty.JettyPlugin; +import com.pmease.commons.loader.AppLoader; +import com.pmease.commons.loader.PluginManager; +import com.pmease.commons.tapestry.DisabledInjectionProvider; +import com.pmease.commons.tapestry.GuiceObjectProvider; +import com.pmease.commons.tapestry.TapestryModule; + +public class AppModule { + + public static void contributeApplicationDefaults(MappedConfiguration configuration) { + configuration.add(SymbolConstants.SUPPORTED_LOCALES, "en"); + + configuration.add(SymbolConstants.PRODUCTION_MODE, !Bootstrap.isSandboxMode() || Bootstrap.isProdMode()); + } + + public static Injector buildGuiceInjector() { + return AppLoader.injector; + } + + public static void contributeMasterObjectProvider(@Local Injector injector, + OrderedConfiguration configuration) { + configuration.add("guiceProvider", new GuiceObjectProvider(injector), "after:*"); + } + + public static void contributeInjectionProvider(OrderedConfiguration configuration, + SymbolSource symbolSource, AssetSource assetSource) { + configuration.overrideInstance("Named", DisabledInjectionProvider.class); + } + + public static void contributeComponentClassResolver(Configuration configuration, + PluginManager pluginManager) { + configuration.add(new LibraryMapping("commons", TapestryModule.class.getPackage().getName())); + for (LibraryMapping mapping: pluginManager.getExtensions(LibraryMapping.class)) + configuration.add(mapping); + } + + public static void contributeIgnoredPathsFilter(Configuration configuration, PluginManager pluginManager) { + JettyPlugin jettyPlugin = pluginManager.getPlugin(JettyPlugin.class); + for (ServletMapping mapping: jettyPlugin.getContext().getServletHandler().getServletMappings()) { + for (String pathSpec: mapping.getPathSpecs()) { + if (!pathSpec.equals("/") && !pathSpec.equals("/*")) { + pathSpec = pathSpec.replace(".", "\\."); + if (pathSpec.endsWith("/*")) { + pathSpec = StringUtils.stripEnd(pathSpec, "/*"); + configuration.add(pathSpec); + configuration.add(pathSpec + "/.*"); + } else { + pathSpec = pathSpec.replace("*", ".*"); + configuration.add(pathSpec); + } + } + } + } + } + +} diff --git a/commons.tapestry/src/main/resources/META-INF/maven/archetype-metadata.xml b/commons.tapestry/src/main/resources/META-INF/maven/archetype-metadata.xml new file mode 100644 index 0000000000..904fb7a4bb --- /dev/null +++ b/commons.tapestry/src/main/resources/META-INF/maven/archetype-metadata.xml @@ -0,0 +1,17 @@ + + + + + src/main/java + + + src/main/resources + + + src/test/java + + + src/test/resources + + + \ No newline at end of file diff --git a/commons.tapestry/src/main/resources/archetype-resource/pom.xml b/commons.tapestry/src/main/resources/archetype-resource/pom.xml new file mode 100644 index 0000000000..dffd0e9ed9 --- /dev/null +++ b/commons.tapestry/src/main/resources/archetype-resource/pom.xml @@ -0,0 +1,62 @@ + + 4.0.0 +#if (\${groupId} != "com.pmease") + \${groupId} +#end + \${artifactId} +#if (\${version} != "1.0.5") + \${version} +#end + + com.pmease + parent.general + 1.0.5 + + + + + + com.pmease + plugin.maven + + + maven-source-plugin + + + maven-javadoc-plugin + + + + + + + ${project.groupId} + ${project.artifactId} + ${project.version} + + + + + + pmeaseRepo + PMEase Repository + + true + never + fail + + + true + always + fail + + http://artifact.pmease.com/ + + + + + \${package}.PluginModule + + + diff --git a/commons.tapestry/src/main/resources/archetype-resource/src/main/java/Plugin.java b/commons.tapestry/src/main/resources/archetype-resource/src/main/java/Plugin.java new file mode 100644 index 0000000000..da8842a8e2 --- /dev/null +++ b/commons.tapestry/src/main/resources/archetype-resource/src/main/java/Plugin.java @@ -0,0 +1,13 @@ +package ${package}; + +import java.util.Collection; +import com.pmease.commons.loader.AbstractPlugin; + +public class Plugin extends AbstractPlugin { + + @Override + public Collection getExtensions() { + return null; + } + +} diff --git a/commons.tapestry/src/main/resources/archetype-resource/src/main/java/PluginModule.java b/commons.tapestry/src/main/resources/archetype-resource/src/main/java/PluginModule.java new file mode 100644 index 0000000000..d566c299ba --- /dev/null +++ b/commons.tapestry/src/main/resources/archetype-resource/src/main/java/PluginModule.java @@ -0,0 +1,24 @@ +package ${package}; + +import com.pmease.commons.loader.AbstractPlugin; +import com.pmease.commons.loader.AbstractPluginModule; + +/** + * NOTE: Do not forget to rename moduleClass property defined in the pom if you've renamed this class. + * + */ +public class PluginModule extends AbstractPluginModule { + + @Override + protected void configure() { + super.configure(); + + // put your guice bindings here + } + + @Override + protected Class getPluginClass() { + return Plugin.class; + } + +} diff --git a/commons.wicket/src/main/java/com/pmease/commons/wicket/WebFilter.java b/commons.wicket/src/main/java/com/pmease/commons/wicket/CustomWicketFilter.java similarity index 85% rename from commons.wicket/src/main/java/com/pmease/commons/wicket/WebFilter.java rename to commons.wicket/src/main/java/com/pmease/commons/wicket/CustomWicketFilter.java index 7b334525b3..74d8afb1a2 100644 --- a/commons.wicket/src/main/java/com/pmease/commons/wicket/WebFilter.java +++ b/commons.wicket/src/main/java/com/pmease/commons/wicket/CustomWicketFilter.java @@ -8,12 +8,12 @@ import com.google.inject.Inject; import com.google.inject.Singleton; @Singleton -public class WebFilter extends WicketFilter { +public class CustomWicketFilter extends WicketFilter { private final WebApplication webApplication; @Inject - public WebFilter(WebApplication webApplication) { + public CustomWicketFilter(WebApplication webApplication) { this.webApplication = webApplication; setFilterPath(""); } diff --git a/commons.wicket/src/main/java/com/pmease/commons/wicket/WebServlet.java b/commons.wicket/src/main/java/com/pmease/commons/wicket/WebServlet.java deleted file mode 100644 index b073e65199..0000000000 --- a/commons.wicket/src/main/java/com/pmease/commons/wicket/WebServlet.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.pmease.commons.wicket; - -import org.apache.wicket.protocol.http.WicketFilter; -import org.apache.wicket.protocol.http.WicketServlet; - -import com.google.inject.Inject; -import com.google.inject.Singleton; - -@SuppressWarnings("serial") -@Singleton -public class WebServlet extends WicketServlet { - - private final WicketFilter wicketFilter; - - @Inject - public WebServlet(WicketFilter wicketFilter) { - this.wicketFilter = wicketFilter; - } - - @Override - public String getServletName() { - return "wicket"; - } - - @Override - protected WicketFilter newWicketFilter() { - return wicketFilter; - } - -} diff --git a/commons.wicket/src/main/java/com/pmease/commons/wicket/WicketModule.java b/commons.wicket/src/main/java/com/pmease/commons/wicket/WicketModule.java index c94d0186f0..89021c2e69 100644 --- a/commons.wicket/src/main/java/com/pmease/commons/wicket/WicketModule.java +++ b/commons.wicket/src/main/java/com/pmease/commons/wicket/WicketModule.java @@ -12,8 +12,8 @@ public class WicketModule extends AbstractPluginModule { protected void configure() { super.configure(); - bind(WicketServlet.class).to(WebServlet.class); - bind(WicketFilter.class).to(WebFilter.class); + bind(WicketServlet.class).to(WicketServlet.class); + bind(WicketFilter.class).to(CustomWicketFilter.class); } @Override diff --git a/commons.wicket/src/main/java/com/pmease/commons/wicket/WicketPlugin.java b/commons.wicket/src/main/java/com/pmease/commons/wicket/WicketPlugin.java index ea6e44530c..a551ad22f4 100644 --- a/commons.wicket/src/main/java/com/pmease/commons/wicket/WicketPlugin.java +++ b/commons.wicket/src/main/java/com/pmease/commons/wicket/WicketPlugin.java @@ -2,40 +2,13 @@ package com.pmease.commons.wicket; import java.util.Collection; -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.google.inject.Inject; -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, "/"); - } - - }); + return null; } } diff --git a/parent.general/pom.xml b/parent.general/pom.xml index 4dcf72db80..628b825e40 100644 --- a/parent.general/pom.xml +++ b/parent.general/pom.xml @@ -178,6 +178,27 @@ package-artifact + + generate-plugin-resources + compile + + generate-plugin-resources + + + + generate-product-resources + compile + + generate-product-resources + + + + create-product-sandbox + compile + + create-product-sandbox + + diff --git a/parent.plugin/pom.xml b/parent.plugin/pom.xml deleted file mode 100644 index 1a2d4bd32f..0000000000 --- a/parent.plugin/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - 4.0.0 - - parent.general - com.pmease - 1.0.5 - - parent.plugin - pom - - - - - com.pmease - plugin.maven - - - generate-plugin-resources - compile - - generate-plugin-resources - - - - create-product-sandbox - compile - - create-product-sandbox - - - - - - - - - - pmeaseRepo - PMEase Repository - - true - never - fail - - - true - always - fail - - http://artifact.pmease.com/ - - - diff --git a/parent.product/pom.xml b/parent.product/pom.xml deleted file mode 100644 index 0954fc922f..0000000000 --- a/parent.product/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - 4.0.0 - - parent.general - com.pmease - 1.0.5 - - parent.product - pom - - - - - com.pmease - plugin.maven - - - generate-plugin-resources - compile - - generate-plugin-resources - - - - generate-product-resources - compile - - generate-product-resources - - - - - - - - - - pmeaseRepo - PMEase Repository - - true - never - fail - - - true - always - fail - - http://artifact.pmease.com/ - - - diff --git a/plugin.maven/src/main/java/com/pmease/plugin/maven/CreateProductSandboxMojo.java b/plugin.maven/src/main/java/com/pmease/plugin/maven/CreateProductSandboxMojo.java index ab3f449565..ebecea6ff3 100644 --- a/plugin.maven/src/main/java/com/pmease/plugin/maven/CreateProductSandboxMojo.java +++ b/plugin.maven/src/main/java/com/pmease/plugin/maven/CreateProductSandboxMojo.java @@ -45,7 +45,17 @@ public class CreateProductSandboxMojo extends AbstractMojo { */ private RepositorySystem repoSystem; - /** + /** + * @parameter default-value="${executables}" + */ + private String executables; + + /** + * @parameter default-value="${moduleClass}" + */ + private String moduleClass; + + /** * The current repository/network configuration of Maven. * * @parameter default-value="${repositorySystemSession}" @@ -67,6 +77,9 @@ public class CreateProductSandboxMojo extends AbstractMojo { private ArchiverManager archiverManager; public void execute() throws MojoExecutionException { + if (moduleClass == null || executables != null) + return; + PluginUtils.checkResolvedArtifacts(project, true); for (Artifact artifact: project.getArtifacts()) { diff --git a/plugin.maven/src/main/java/com/pmease/plugin/maven/GeneratePluginResourcesMojo.java b/plugin.maven/src/main/java/com/pmease/plugin/maven/GeneratePluginResourcesMojo.java index 3975b874d9..4b6136b9de 100644 --- a/plugin.maven/src/main/java/com/pmease/plugin/maven/GeneratePluginResourcesMojo.java +++ b/plugin.maven/src/main/java/com/pmease/plugin/maven/GeneratePluginResourcesMojo.java @@ -24,11 +24,13 @@ public class GeneratePluginResourcesMojo extends AbstractMojo { /** * @parameter default-value="${moduleClass}" - * @required */ private String moduleClass; public void execute() throws MojoExecutionException { + if (moduleClass == null) + return; + PluginUtils.checkResolvedArtifacts(project, true); File outputDir = new File(project.getBuild().getOutputDirectory()); diff --git a/plugin.maven/src/main/java/com/pmease/plugin/maven/GenerateProductResourcesMojo.java b/plugin.maven/src/main/java/com/pmease/plugin/maven/GenerateProductResourcesMojo.java index 79184b201c..c35a7bbf5b 100644 --- a/plugin.maven/src/main/java/com/pmease/plugin/maven/GenerateProductResourcesMojo.java +++ b/plugin.maven/src/main/java/com/pmease/plugin/maven/GenerateProductResourcesMojo.java @@ -29,7 +29,6 @@ public class GenerateProductResourcesMojo extends AbstractMojo { /** * @parameter default-value="${executables}" - * @required */ private String executables; @@ -57,6 +56,9 @@ public class GenerateProductResourcesMojo extends AbstractMojo { private List remoteRepos; public void execute() throws MojoExecutionException { + if (executables == null) + return; + PluginUtils.checkResolvedArtifacts(project, true); File binDir = new File(project.getBuild().getDirectory(), PluginConstants.SANDBOX + "/bin");