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 extends Page> 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!
-
-
+ 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 extends Page> 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 0000000000..5b621ed831
Binary files /dev/null and b/commons.product/src/main/java/com/pmease/commons/product/pages/ok.gif differ
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 extends Annotation> 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 extends AbstractPlugin> 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 extends AbstractPlugin> 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");