1. add tapestry support

2. enhance wicket support
3. merge parent.plugin, parent.product with parent.general
This commit is contained in:
robin 2012-05-22 22:07:19 +08:00
parent 3dc8a7d31c
commit e54cea564b
60 changed files with 907 additions and 298 deletions

View File

@ -10,7 +10,7 @@
#end
<parent>
<groupId>com.pmease</groupId>
<artifactId>parent.plugin</artifactId>
<artifactId>parent.general</artifactId>
<version>1.0.5</version>
</parent>

View File

@ -10,7 +10,7 @@
#end
<parent>
<groupId>com.pmease</groupId>
<artifactId>parent.plugin</artifactId>
<artifactId>parent.general</artifactId>
<version>1.0.5</version>
</parent>

View File

@ -12,7 +12,7 @@
<parent>
<groupId>com.pmease</groupId>
<artifactId>parent.product</artifactId>
<artifactId>parent.general</artifactId>
<version>1.0.5</version>
</parent>
@ -143,7 +143,7 @@
<executables>bin/*.sh, bin/wrapper-*</executables>
<bootstrapClass>com.pmease.commons.bootstrap.Bootstrap</bootstrapClass>
<moduleClass>${package}.PluginModule</moduleClass>
<aggregation>true</aggregation>
<aggregation>false</aggregation>
</properties>
</project>

View File

@ -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);
}
},

View File

@ -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);
}

View File

@ -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;

View File

@ -2,17 +2,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Hello World</title>
<title>Page Not Found</title>
</head>
<body>
<div>
<img src="/images/ok.gif"></img>
</div>
<div>
<h1>It Works!</h1>
</div>
<div>
<a wicket:id="addUser">add user</a>
</div>
Sorry we can not find the page you requested.
</body>
</html>

View File

@ -0,0 +1,9 @@
package ${package}.web;
import org.apache.wicket.markup.html.WebPage;
@SuppressWarnings("serial")
public class ErrorPage404 extends WebPage {
public ErrorPage404() {
}
}

View File

@ -10,7 +10,7 @@
#end
<parent>
<groupId>com.pmease</groupId>
<artifactId>parent.plugin</artifactId>
<artifactId>parent.general</artifactId>
<version>1.0.5</version>
</parent>

View File

@ -18,6 +18,7 @@
<module>../commons.jetty</module>
<module>../commons.hibernate</module>
<module>../commons.wicket</module>
<module>../commons.tapestry</module>
</modules>
<repositories>
<repository>

View File

@ -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);

View File

@ -3,7 +3,7 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>parent.plugin</artifactId>
<artifactId>parent.general</artifactId>
<groupId>com.pmease</groupId>
<version>1.0.5</version>
</parent>

View File

@ -37,8 +37,7 @@ public abstract class AbstractEntity implements Serializable {
if (getId() == null && otherEntity.getId() == null)
return super.equals(other);
else
return new EqualsBuilder().append(getId(), otherEntity.getId())
.isEquals();
return new EqualsBuilder().append(getId(), otherEntity.getId()).isEquals();
}
public int hashCode() {

View File

@ -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 {
}

View File

@ -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;
}
}

View File

@ -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<SessionFacto
@Inject
public PersistServiceImpl(PluginManager pluginManager, NamingStrategy namingStrategy,
@Named("hibernate") Properties hibernateProperties) {
@Hibernate Properties hibernateProperties) {
this.pluginManager = pluginManager;
this.namingStrategy = namingStrategy;
this.hibernateProperties = hibernateProperties;

View File

@ -3,7 +3,7 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>parent.plugin</artifactId>
<artifactId>parent.general</artifactId>
<groupId>com.pmease</groupId>
<version>1.0.5</version>
</parent>

View File

@ -29,6 +29,8 @@ public class JettyPlugin extends AbstractPlugin {
private Server server;
private ServletContextHandler context;
public final PluginManager pluginManager;
@Inject
@ -56,10 +58,14 @@ public class JettyPlugin extends AbstractPlugin {
}
}
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("/");

View File

@ -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> T getInstance(Class<T> type) {
return injector.getInstance(type);
}
}

View File

@ -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 {
<T> Collection<T> getExtensions(Class<T> extensionPoint);
Map<String, AbstractPlugin> getPluginMap();
Collection<AbstractPlugin> getPlugins();
<T extends AbstractPlugin> T getPlugin(Class<T> pluginClass);
AbstractPlugin getPlugin(String pluginId);
}

View File

@ -82,8 +82,25 @@ public class PluginManagerImpl implements PluginManager {
}
@Override
public Map<String, AbstractPlugin> getPluginMap() {
return Collections.unmodifiableMap(pluginMap);
public Collection<AbstractPlugin> getPlugins() {
return Collections.unmodifiableCollection(pluginMap.values());
}
@SuppressWarnings("unchecked")
@Override
public <T extends AbstractPlugin> T getPlugin(Class<T> 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 + "'.");
}
}

View File

@ -7,7 +7,7 @@
<parent>
<groupId>com.pmease</groupId>
<artifactId>parent.product</artifactId>
<artifactId>parent.general</artifactId>
<version>1.0.5</version>
</parent>
@ -109,8 +109,8 @@
</dependency>
<dependency>
<groupId>com.pmease</groupId>
<artifactId>commons.wicket</artifactId>
<version>1.0.5</version>
<artifactId>commons.tapestry</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
@ -136,7 +136,7 @@
<executables>bin/*.sh, bin/wrapper-*</executables>
<bootstrapClass>com.pmease.commons.bootstrap.Bootstrap</bootstrapClass>
<moduleClass>com.pmease.commons.product.PluginModule</moduleClass>
<aggregation>true</aggregation>
<aggregation>false</aggregation>
</properties>
</project>

View File

@ -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++;
}
}

View File

@ -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");
}
}

View File

@ -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();
Preconditions.checkNotNull(servletHolder);
context.addServlet(servletHolder, "/images/*");
context.addServlet(servletHolder, "/scripts/*");
context.addServlet(servletHolder, "/styles/*");
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));
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/*");
}
},

View File

@ -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

View File

@ -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;
}
}

View File

@ -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");
}
}

View File

@ -0,0 +1,3 @@
<t:container xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd" xmlns:p="tapestry:parameter">
<t:commons.viewer elements="elements" value="var:value">${var:value}</t:commons.viewer>
</t:container>

View File

@ -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<Counter> counters;
@InjectComponent
private Zone zone;
@Property
private Counter counter;
@Inject
private GeneralDao dao;
void setupRender() {
if (counters == null) {
counters = new ArrayList<Counter>();
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();
}
}

View File

@ -0,0 +1,10 @@
<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd" xmlns:p="tapestry:parameter">
<body>
<t:loop source="counters" value="counter" index="var:index">
<t:zone t:id="zone">${counter.value}</t:zone>
<t:actionlink t:id="increase" t:zone="prop:zoneId" t:context="var:index">increase</t:actionlink>
</t:loop>
<img src="${asset:ok.gif}"></img>
<t:actionlink t:id="modify">modify</t:actionlink>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -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<String, Object> configuration, PluginManager pluginManager) {
configuration.override(
SymbolConstants.APPLICATION_VERSION,
pluginManager.getPlugin(Plugin.class).getVersion());
}
}

View File

@ -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<Void>("addUser") {
@Override
public void onClick() {
GeneralDao generalDao = AppLoader.getInstance(GeneralDao.class);
Collection<User> 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);
}
}
});
}
}

View File

@ -10,7 +10,7 @@
#end
<parent>
<groupId>com.pmease</groupId>
<artifactId>parent.plugin</artifactId>
<artifactId>parent.general</artifactId>
<version>1.0.5</version>
</parent>

View File

@ -0,0 +1,3 @@
function test(msg) {
alert(msg);
}

101
commons.tapestry/pom.xml Normal file
View File

@ -0,0 +1,101 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>commons.tapestry</artifactId>
<version>1.0.0</version>
<parent>
<groupId>com.pmease</groupId>
<artifactId>parent.general</artifactId>
<version>1.0.5</version>
</parent>
<build>
<plugins>
<plugin>
<groupId>com.pmease</groupId>
<artifactId>plugin.maven</artifactId>
</plugin>
<plugin>
<artifactId>maven-source-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.pmease</groupId>
<artifactId>commons.loader</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>com.pmease</groupId>
<artifactId>commons.jetty</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>org.apache.tapestry</groupId>
<artifactId>tapestry-core</artifactId>
<version>5.3.3</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- dependency>
<groupId>org.apache.tapestry</groupId>
<artifactId>tapestry-hibernate</artifactId>
<version>5.3.3</version>
</dependency-->
<dependency>
<groupId>org.got5</groupId>
<artifactId>tapestry5-jquery</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>devlab722-repo</id>
<url>http://nexus.devlab722.net/nexus/content/repositories/releases</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>devlab722-snapshot-repo</id>
<url>http://nexus.devlab722.net/nexus/content/repositories/snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
<repository>
<id>pmeaseRepo</id>
<name>PMEase Repository</name>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
<url>http://artifact.pmease.com/</url>
</repository>
</repositories>
<properties>
<moduleClass>com.pmease.commons.tapestry.TapestryModule</moduleClass>
</properties>
</project>

View File

@ -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<Class<?>> moduleClasses = new ArrayList<Class<?>>();
moduleClasses.add(AppModule.class);
for (TapestryConfiguratorProvider each : pluginManager
.getExtensions(TapestryConfiguratorProvider.class))
moduleClasses.add(each.getTapestryConfigurator());
return moduleClasses.toArray(new Class<?>[0]);
}
}

View File

@ -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;
}
}

View File

@ -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> T provide(Class<T> 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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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<Context> stack = new Stack<Context>();
@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;
}
}
}

View File

@ -0,0 +1,6 @@
<div xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd" xmlns:p="tapestry:parameter">
<t:loop source="stack">&nbsp;</t:loop><t:body></t:body>
<script type="text/javascript">
test(${current});
</script>
</div>

View File

@ -0,0 +1,5 @@
package com.pmease.commons.tapestry.extensionpoints;
public interface TapestryConfiguratorProvider {
Class<?> getTapestryConfigurator();
}

View File

@ -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<String, Object> 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<ObjectProvider> configuration) {
configuration.add("guiceProvider", new GuiceObjectProvider(injector), "after:*");
}
public static void contributeInjectionProvider(OrderedConfiguration<InjectionProvider2> configuration,
SymbolSource symbolSource, AssetSource assetSource) {
configuration.overrideInstance("Named", DisabledInjectionProvider.class);
}
public static void contributeComponentClassResolver(Configuration<LibraryMapping> 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<String> 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);
}
}
}
}
}
}

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor name="archetype.plugin">
<fileSets>
<fileSet filtered="true" packaged="true">
<directory>src/main/java</directory>
</fileSet>
<fileSet filtered="false" packaged="false">
<directory>src/main/resources</directory>
</fileSet>
<fileSet filtered="false" packaged="false">
<directory>src/test/java</directory>
</fileSet>
<fileSet filtered="false" packaged="false">
<directory>src/test/resources</directory>
</fileSet>
</fileSets>
</archetype-descriptor>

View File

@ -0,0 +1,62 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
#if (\${groupId} != "com.pmease")
<groupId>\${groupId}</groupId>
#end
<artifactId>\${artifactId}</artifactId>
#if (\${version} != "1.0.5")
<version>\${version}</version>
#end
<parent>
<groupId>com.pmease</groupId>
<artifactId>parent.general</artifactId>
<version>1.0.5</version>
</parent>
<build>
<plugins>
<plugin>
<groupId>com.pmease</groupId>
<artifactId>plugin.maven</artifactId>
</plugin>
<plugin>
<artifactId>maven-source-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>pmeaseRepo</id>
<name>PMEase Repository</name>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
<url>http://artifact.pmease.com/</url>
</repository>
</repositories>
<properties>
<moduleClass>\${package}.PluginModule</moduleClass>
</properties>
</project>

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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("");
}

View File

@ -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;
}
}

View File

@ -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

View File

@ -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;
}
}

View File

@ -178,6 +178,27 @@
<goal>package-artifact</goal>
</goals>
</execution>
<execution>
<id>generate-plugin-resources</id>
<phase>compile</phase>
<goals>
<goal>generate-plugin-resources</goal>
</goals>
</execution>
<execution>
<id>generate-product-resources</id>
<phase>compile</phase>
<goals>
<goal>generate-product-resources</goal>
</goals>
</execution>
<execution>
<id>create-product-sandbox</id>
<phase>compile</phase>
<goals>
<goal>create-product-sandbox</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>

View File

@ -1,55 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>parent.general</artifactId>
<groupId>com.pmease</groupId>
<version>1.0.5</version>
</parent>
<artifactId>parent.plugin</artifactId>
<packaging>pom</packaging>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>com.pmease</groupId>
<artifactId>plugin.maven</artifactId>
<executions>
<execution>
<id>generate-plugin-resources</id>
<phase>compile</phase>
<goals>
<goal>generate-plugin-resources</goal>
</goals>
</execution>
<execution>
<id>create-product-sandbox</id>
<phase>compile</phase>
<goals>
<goal>create-product-sandbox</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
<repositories>
<repository>
<id>pmeaseRepo</id>
<name>PMEase Repository</name>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
<url>http://artifact.pmease.com/</url>
</repository>
</repositories>
</project>

View File

@ -1,55 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>parent.general</artifactId>
<groupId>com.pmease</groupId>
<version>1.0.5</version>
</parent>
<artifactId>parent.product</artifactId>
<packaging>pom</packaging>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>com.pmease</groupId>
<artifactId>plugin.maven</artifactId>
<executions>
<execution>
<id>generate-plugin-resources</id>
<phase>compile</phase>
<goals>
<goal>generate-plugin-resources</goal>
</goals>
</execution>
<execution>
<id>generate-product-resources</id>
<phase>compile</phase>
<goals>
<goal>generate-product-resources</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
<repositories>
<repository>
<id>pmeaseRepo</id>
<name>PMEase Repository</name>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
<url>http://artifact.pmease.com/</url>
</repository>
</repositories>
</project>

View File

@ -45,6 +45,16 @@ 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.
*
@ -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()) {

View File

@ -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());

View File

@ -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<RemoteRepository> remoteRepos;
public void execute() throws MojoExecutionException {
if (executables == null)
return;
PluginUtils.checkResolvedArtifacts(project, true);
File binDir = new File(project.getBuild().getDirectory(), PluginConstants.SANDBOX + "/bin");