diff --git a/commons.hibernate/src/main/java/com/pmease/commons/hibernate/ConfigurationProvider.java b/commons.hibernate/src/main/java/com/pmease/commons/hibernate/ConfigurationProvider.java new file mode 100644 index 0000000000..c6256112b9 --- /dev/null +++ b/commons.hibernate/src/main/java/com/pmease/commons/hibernate/ConfigurationProvider.java @@ -0,0 +1,71 @@ +package com.pmease.commons.hibernate; + +import java.lang.reflect.Modifier; +import java.util.Collection; +import java.util.Properties; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.hibernate.cfg.Configuration; +import org.hibernate.cfg.Environment; +import org.hibernate.cfg.NamingStrategy; + +import com.google.inject.Provider; +import com.pmease.commons.bootstrap.Bootstrap; +import com.pmease.commons.hibernate.extensionpoints.ModelContribution; +import com.pmease.commons.loader.PluginManager; +import com.pmease.commons.util.ClassUtils; +import com.pmease.commons.util.StringUtils; + +@Singleton +public class ConfigurationProvider implements Provider { + + private Configuration configuration; + + private final PluginManager pluginManager; + + private final NamingStrategy namingStrategy; + + private final Properties hibernateProperties; + + @Inject + public ConfigurationProvider(PluginManager pluginManager, NamingStrategy namingStrategy, + @Hibernate Properties hibernateProperties) { + this.pluginManager = pluginManager; + this.namingStrategy = namingStrategy; + this.hibernateProperties = hibernateProperties; + } + + @Override + public synchronized Configuration get() { + if (configuration == null) { + String url = hibernateProperties.getProperty(Environment.URL); + hibernateProperties.setProperty(Environment.URL, + StringUtils.replace(url, "${installDir}", Bootstrap.installDir.getAbsolutePath())); + String encryptedPassword = hibernateProperties.getProperty("hibernate.connection.encrypted_password"); + if (StringUtils.isNotBlank(encryptedPassword)) + hibernateProperties.setProperty(Environment.PASS, StringUtils.decrypt(encryptedPassword.trim())); + + configuration = new Configuration(); + configuration.setNamingStrategy(namingStrategy); + Collection> modelClasses = + ClassUtils.findSubClasses(AbstractEntity.class, AbstractEntity.class); + for (Class model: modelClasses) { + if (!Modifier.isAbstract(model.getModifiers())) + configuration.addAnnotatedClass(model); + } + + Collection contributions = + pluginManager.getExtensions(ModelContribution.class); + for (ModelContribution contribution: contributions) { + for (Class modelClass: contribution.getModelClasses()) + configuration.addAnnotatedClass(modelClass); + } + + configuration.setProperties(hibernateProperties); + } + return configuration; + } + +} diff --git a/commons.hibernate/src/main/java/com/pmease/commons/hibernate/HibernateModule.java b/commons.hibernate/src/main/java/com/pmease/commons/hibernate/HibernateModule.java index cff86e6c58..fe011ab74c 100644 --- a/commons.hibernate/src/main/java/com/pmease/commons/hibernate/HibernateModule.java +++ b/commons.hibernate/src/main/java/com/pmease/commons/hibernate/HibernateModule.java @@ -2,6 +2,7 @@ package com.pmease.commons.hibernate; import org.hibernate.Session; import org.hibernate.SessionFactory; +import org.hibernate.cfg.Configuration; import org.hibernate.cfg.ImprovedNamingStrategy; import org.hibernate.cfg.NamingStrategy; @@ -21,8 +22,10 @@ public class HibernateModule extends AbstractPluginModule { bind(PersistService.class).to(PersistServiceImpl.class); bind(SessionFactory.class).toProvider(PersistServiceImpl.class); + bind(Configuration.class).toProvider(ConfigurationProvider.class); bind(UnitOfWork.class).to(UnitOfWorkImpl.class); bind(Session.class).toProvider(UnitOfWorkImpl.class); + bind(SessionProvider.class).to(UnitOfWorkImpl.class); bind(GeneralDao.class).to(GeneralDaoImpl.class); 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 a970beed9b..556688041c 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,17 +1,28 @@ 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 hibernateFilter; + @Inject - public HibernatePlugin(PersistService persistService) { + public HibernatePlugin(PersistService persistService, HibernateFilter hibernateFilter) { this.persistService = persistService; + this.hibernateFilter = hibernateFilter; } @Override @@ -26,7 +37,17 @@ public class HibernatePlugin extends AbstractPlugin { @Override public Collection getExtensions() { - return null; + return ImmutableList.of( + new ServletContextConfigurator() { + + @Override + public void configure(ServletContextHandler context) { + FilterHolder filterHolder = new FilterHolder(hibernateFilter); + context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); + } + + } + ); } } 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 7b67b22ba8..b1c1d5e2fb 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 @@ -1,71 +1,27 @@ package com.pmease.commons.hibernate; -import java.lang.reflect.Modifier; -import java.util.Collection; -import java.util.Properties; - import org.hibernate.SessionFactory; -import org.hibernate.cfg.Configuration; -import org.hibernate.cfg.Environment; -import org.hibernate.cfg.NamingStrategy; import com.google.common.base.Preconditions; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; -import com.pmease.commons.bootstrap.Bootstrap; -import com.pmease.commons.hibernate.extensionpoints.ModelContribution; -import com.pmease.commons.loader.PluginManager; -import com.pmease.commons.util.ClassUtils; -import com.pmease.commons.util.StringUtils; @Singleton public class PersistServiceImpl implements PersistService, Provider { - private final PluginManager pluginManager; - - private final NamingStrategy namingStrategy; - - private final Properties hibernateProperties; + private final ConfigurationProvider configurationProvider; private volatile SessionFactory sessionFactory; @Inject - public PersistServiceImpl(PluginManager pluginManager, NamingStrategy namingStrategy, - @Hibernate Properties hibernateProperties) { - this.pluginManager = pluginManager; - this.namingStrategy = namingStrategy; - this.hibernateProperties = hibernateProperties; - - String url = hibernateProperties.getProperty(Environment.URL); - hibernateProperties.setProperty(Environment.URL, - StringUtils.replace(url, "${installDir}", Bootstrap.installDir.getAbsolutePath())); - String encryptedPassword = hibernateProperties.getProperty("hibernate.connection.encrypted_password"); - if (StringUtils.isNotBlank(encryptedPassword)) - hibernateProperties.setProperty(Environment.PASS, StringUtils.decrypt(encryptedPassword.trim())); + public PersistServiceImpl(ConfigurationProvider configurationProvider) { + this.configurationProvider = configurationProvider; } public void start() { Preconditions.checkState(sessionFactory == null); - - Configuration cfg = new Configuration(); - cfg.setNamingStrategy(namingStrategy); - Collection> modelClasses = - ClassUtils.findSubClasses(AbstractEntity.class, AbstractEntity.class); - for (Class model: modelClasses) { - if (!Modifier.isAbstract(model.getModifiers())) - cfg.addAnnotatedClass(model); - } - - Collection contributions = - pluginManager.getExtensions(ModelContribution.class); - for (ModelContribution contribution: contributions) { - for (Class modelClass: contribution.getModelClasses()) - cfg.addAnnotatedClass(modelClass); - } - - cfg.setProperties(hibernateProperties); - sessionFactory = cfg.buildSessionFactory(); + sessionFactory = configurationProvider.get().buildSessionFactory(); } public void stop() { @@ -76,12 +32,10 @@ public class PersistServiceImpl implements PersistService, Provider { + +} diff --git a/commons.hibernate/src/main/java/com/pmease/commons/hibernate/UnitOfWorkImpl.java b/commons.hibernate/src/main/java/com/pmease/commons/hibernate/UnitOfWorkImpl.java index a27dd48483..9a5f4f2bd7 100644 --- a/commons.hibernate/src/main/java/com/pmease/commons/hibernate/UnitOfWorkImpl.java +++ b/commons.hibernate/src/main/java/com/pmease/commons/hibernate/UnitOfWorkImpl.java @@ -11,7 +11,7 @@ import com.google.inject.Provider; import com.google.inject.Singleton; @Singleton -public class UnitOfWorkImpl implements UnitOfWork, Provider { +public class UnitOfWorkImpl implements UnitOfWork, Provider, SessionProvider { private final Provider sessionFactoryProvider; diff --git a/commons.product/src/main/java/com/pmease/commons/product/GitServlet.java b/commons.product/src/main/java/com/pmease/commons/product/GitServlet.java deleted file mode 100644 index 557935cbb2..0000000000 --- a/commons.product/src/main/java/com/pmease/commons/product/GitServlet.java +++ /dev/null @@ -1,20 +0,0 @@ -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 GitServlet extends HttpServlet { - - private static final long serialVersionUID = 1L; - - @Override - protected void service(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { - resp.getOutputStream().println(req.getServletPath()); - } - -} 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 c1ae3aa44f..0ef115dd40 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,19 +2,14 @@ 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; @@ -37,14 +32,8 @@ public class Plugin extends AbstractPlugin { private Properties serverProps; - 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")); } @@ -70,21 +59,7 @@ public class Plugin extends AbstractPlugin { 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)); - - 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(GitServlet.class, "*.git"); } }, 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 e1835823ef..bc95d5f161 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 @@ -7,6 +7,7 @@ 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.tapestry.Tapestry; import com.pmease.commons.util.FileUtils; public class PluginModule extends AbstractPluginModule { @@ -18,6 +19,7 @@ public class PluginModule extends AbstractPluginModule { Properties hibernateProps = FileUtils.loadProperties( new File(Bootstrap.installDir, "conf/hibernate.properties")); bind(Properties.class).annotatedWith(Hibernate.class).toInstance(hibernateProps); + bind(Package.class).annotatedWith(Tapestry.class).toInstance(Plugin.class.getPackage()); } @Override diff --git a/commons.product/src/main/java/com/pmease/commons/product/components/LoginForm.java b/commons.product/src/main/java/com/pmease/commons/product/components/LoginForm.java deleted file mode 100644 index 1a4c9bc7e0..0000000000 --- a/commons.product/src/main/java/com/pmease/commons/product/components/LoginForm.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.pmease.commons.product.components; - -public class LoginForm { - - private String userName; - - public String getUserName() { - return userName; - } - - public void setUserName(String userName) { - this.userName = userName; - } - - void onActionFromLogin() { - - } -} diff --git a/commons.product/src/main/java/com/pmease/commons/product/components/LoginForm.tml b/commons.product/src/main/java/com/pmease/commons/product/components/LoginForm.tml deleted file mode 100644 index 0b8060227e..0000000000 --- a/commons.product/src/main/java/com/pmease/commons/product/components/LoginForm.tml +++ /dev/null @@ -1,3 +0,0 @@ - - login as ${userName} - \ No newline at end of file diff --git a/commons.product/src/main/java/com/pmease/commons/product/model/Repository.java b/commons.product/src/main/java/com/pmease/commons/product/model/Repository.java deleted file mode 100644 index 3bcf8e0d0d..0000000000 --- a/commons.product/src/main/java/com/pmease/commons/product/model/Repository.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.pmease.commons.product.model; - -import javax.persistence.Entity; - -@Entity -public class Repository { - - private String name; - - private String description; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - -} diff --git a/commons.product/src/main/java/com/pmease/commons/product/model/User.java b/commons.product/src/main/java/com/pmease/commons/product/model/User.java index ab2df2fba7..9b3bcd5a46 100644 --- a/commons.product/src/main/java/com/pmease/commons/product/model/User.java +++ b/commons.product/src/main/java/com/pmease/commons/product/model/User.java @@ -1,19 +1,18 @@ package com.pmease.commons.product.model; -public class User { +import javax.persistence.Entity; +import com.pmease.commons.hibernate.AbstractEntity; + +@Entity +public class User extends AbstractEntity { + + private static final long serialVersionUID = 1L; + private String name; - + private String email; - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - public String getEmail() { return email; } @@ -21,5 +20,13 @@ public class User { public void setEmail(String email) { this.email = email; } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } } 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 index e2fa030152..60f165c1c1 100644 --- 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 @@ -1,87 +1,31 @@ package com.pmease.commons.product.pages; -import java.util.ArrayList; -import java.util.List; +import java.util.Date; import javax.inject.Inject; -import org.apache.tapestry5.Block; import org.apache.tapestry5.annotations.Property; -import org.apache.tapestry5.services.ComponentSource; +import org.apache.tapestry5.annotations.SessionState; -import com.pmease.commons.product.model.Repository; +import com.pmease.commons.hibernate.dao.GeneralDao; import com.pmease.commons.product.model.User; public class Index { + @Inject + private GeneralDao generalDao; + + @SessionState @Property private User user; - @Property - private Repository repository; - - @Inject - private ComponentSource componentSource; - - @Inject - private Block emailBlock; - - @Inject - private Block loginBlock; - - public List getUsers() { - List users = new ArrayList(); - - User user = new User(); - user.setName("robin"); + public void onActionFromBtn() { + user.setName(new Date().toString()); user.setEmail("robin@pmease.com"); - users.add(user); - - user = new User(); - user.setName("steve"); - user.setEmail("steve@pmease.com"); - users.add(user); - - return users; + generalDao.save(user); } - void onActivate(String userName) { - user = new User(); - user.setName(userName); - } - - void onActivate(String userName, String repositoryName) { - user = new User(); - user.setName(userName); - - repository = new Repository(); - repository.setName(repositoryName); - } - - public UserViewer getUserViewer() { - UserViewer viewer = (UserViewer) componentSource.getPage(UserViewer.class); - viewer.setUser(user); - return viewer; - } - - public RepositoryViewer getRepositoryViewer() { - RepositoryViewer viewer = (RepositoryViewer) componentSource.getPage(RepositoryViewer.class); - viewer.setUser(user); - viewer.setRepository(repository); - return viewer; - } - - Object onActionFromEmailLink(String userName) { - user = new User(); - user.setName(userName); - user.setEmail(userName + "@pmease.com"); - return emailBlock; - } - - Object onActionFromLoginLink(String userName) { - user = new User(); - user.setName(userName); - user.setEmail(userName + "@pmease.com"); - return loginBlock; + public void onActivate(User user) { + this.user = user; } } 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 index 3cb7ba96b9..b7f8349dde 100644 --- 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 @@ -1,40 +1,10 @@ - - - Workshop - - - - - - - - - - - - - ${user.name} - - - open - - - login - - - - - - - - - - ${user.email} - - - - - - - + + + Hello world + + + add + ${user.name} + diff --git a/commons.product/src/main/java/com/pmease/commons/product/pages/Preference.java b/commons.product/src/main/java/com/pmease/commons/product/pages/Preference.java deleted file mode 100644 index de03fb1f4a..0000000000 --- a/commons.product/src/main/java/com/pmease/commons/product/pages/Preference.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pmease.commons.product.pages; - - -public class Preference { - -} diff --git a/commons.product/src/main/java/com/pmease/commons/product/pages/Preference.tml b/commons.product/src/main/java/com/pmease/commons/product/pages/Preference.tml deleted file mode 100644 index 9b2588d940..0000000000 --- a/commons.product/src/main/java/com/pmease/commons/product/pages/Preference.tml +++ /dev/null @@ -1,7 +0,0 @@ - - - Preferences - - - - diff --git a/commons.product/src/main/java/com/pmease/commons/product/pages/RepositoryViewer.java b/commons.product/src/main/java/com/pmease/commons/product/pages/RepositoryViewer.java deleted file mode 100644 index 934257b42b..0000000000 --- a/commons.product/src/main/java/com/pmease/commons/product/pages/RepositoryViewer.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.pmease.commons.product.pages; - -import com.pmease.commons.product.model.Repository; -import com.pmease.commons.product.model.User; - -public class RepositoryViewer { - - private User user; - - private Repository repository; - - public User getUser() { - return user; - } - - public void setUser(User user) { - this.user = user; - } - - public Repository getRepository() { - return repository; - } - - public void setRepository(Repository repository) { - this.repository = repository; - } - -} diff --git a/commons.product/src/main/java/com/pmease/commons/product/pages/RepositoryViewer.tml b/commons.product/src/main/java/com/pmease/commons/product/pages/RepositoryViewer.tml deleted file mode 100644 index c8ff5ffe03..0000000000 --- a/commons.product/src/main/java/com/pmease/commons/product/pages/RepositoryViewer.tml +++ /dev/null @@ -1,3 +0,0 @@ - - ${user.name} - ${repository.name} - diff --git a/commons.product/src/main/java/com/pmease/commons/product/pages/UserViewer.java b/commons.product/src/main/java/com/pmease/commons/product/pages/UserViewer.java deleted file mode 100644 index c3f1ce6571..0000000000 --- a/commons.product/src/main/java/com/pmease/commons/product/pages/UserViewer.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.pmease.commons.product.pages; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.tapestry5.annotations.Property; - -import com.pmease.commons.product.model.Repository; -import com.pmease.commons.product.model.User; - -public class UserViewer { - - private User user; - - @SuppressWarnings("unused") - @Property - private Repository repository; - - public User getUser() { - return user; - } - - public void setUser(User user) { - this.user = user; - } - - public List getRepositories() { - List repositories = new ArrayList(); - Repository repository = new Repository(); - repository.setName("QuickBuild"); - repository.setDescription("QuickBuild Trunk"); - repositories.add(repository); - - repository = new Repository(); - repository.setName("Gitop"); - repository.setDescription("Gitop Trunk"); - repositories.add(repository); - - return repositories; - } - -} diff --git a/commons.product/src/main/java/com/pmease/commons/product/pages/UserViewer.tml b/commons.product/src/main/java/com/pmease/commons/product/pages/UserViewer.tml deleted file mode 100644 index 2a0b3b449f..0000000000 --- a/commons.product/src/main/java/com/pmease/commons/product/pages/UserViewer.tml +++ /dev/null @@ -1,8 +0,0 @@ - -
${user.name}
- - - ${repository.name} - - -
\ No newline at end of file diff --git a/commons.tapestry/pom.xml b/commons.tapestry/pom.xml index 3f748e8d94..6b233bf505 100644 --- a/commons.tapestry/pom.xml +++ b/commons.tapestry/pom.xml @@ -27,12 +27,7 @@ com.pmease - commons.loader - 1.0.5 - - - com.pmease - commons.jetty + commons.hibernate 1.0.5 @@ -50,15 +45,10 @@ - org.got5 tapestry5-jquery - 3.0.0 + 3.2.0 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 index 3ca2812e26..94382780ea 100644 --- a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/CustomTapestryFilter.java +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/CustomTapestryFilter.java @@ -11,7 +11,7 @@ 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; +import com.pmease.commons.tapestry.services.TapestryConfigurator; @Singleton public class CustomTapestryFilter extends TapestryFilter { @@ -23,7 +23,7 @@ public class CustomTapestryFilter extends TapestryFilter { protected Class[] provideExtraModuleClasses(ServletContext context) { List> moduleClasses = new ArrayList>(); - moduleClasses.add(AppModule.class); + moduleClasses.add(TapestryConfigurator.class); for (TapestryConfiguratorProvider each : pluginManager .getExtensions(TapestryConfiguratorProvider.class)) moduleClasses.add(each.getTapestryConfigurator()); diff --git a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/Tapestry.java b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/Tapestry.java new file mode 100644 index 0000000000..24a3e2a11c --- /dev/null +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/Tapestry.java @@ -0,0 +1,16 @@ +package com.pmease.commons.tapestry; + +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 Tapestry { + +} 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 index 3d189ceebd..40de96051d 100644 --- a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/TapestryPlugin.java +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/TapestryPlugin.java @@ -1,14 +1,47 @@ package com.pmease.commons.tapestry; import java.util.Collection; +import java.util.EnumSet; +import javax.inject.Inject; +import javax.servlet.DispatcherType; + +import org.apache.tapestry5.TapestryFilter; +import org.apache.tapestry5.internal.InternalConstants; +import org.eclipse.jetty.servlet.FilterHolder; +import org.eclipse.jetty.servlet.ServletContextHandler; + +import com.google.common.collect.ImmutableList; +import com.pmease.commons.jetty.extensionpoints.ServletContextConfigurator; import com.pmease.commons.loader.AbstractPlugin; public class TapestryPlugin extends AbstractPlugin { + + private final TapestryFilter tapestryFilter; + + private final Package appPackage; + @Inject + public TapestryPlugin(TapestryFilter tapestryFilter, @Tapestry Package appPackage) { + this.tapestryFilter = tapestryFilter; + this.appPackage = appPackage; + } + @Override public Collection getExtensions() { - return null; + return ImmutableList.of( + new ServletContextConfigurator() { + + @Override + public void configure(ServletContextHandler context) { + FilterHolder filterHolder = new FilterHolder(tapestryFilter); + filterHolder.setName("app"); + context.setInitParameter(InternalConstants.TAPESTRY_APP_PACKAGE_PARAM, appPackage.getName()); + context.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); + } + + } + ); } } diff --git a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/EntityApplicationStatePersistenceStrategy.java b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/EntityApplicationStatePersistenceStrategy.java new file mode 100644 index 0000000000..e76b5e69aa --- /dev/null +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/EntityApplicationStatePersistenceStrategy.java @@ -0,0 +1,63 @@ +package com.pmease.commons.tapestry.persistence; + +import java.io.Serializable; + +import org.apache.tapestry5.internal.services.SessionApplicationStatePersistenceStrategy; +import org.apache.tapestry5.services.ApplicationStateCreator; +import org.apache.tapestry5.services.Request; +import org.hibernate.HibernateException; + +import com.pmease.commons.hibernate.SessionProvider; + +public class EntityApplicationStatePersistenceStrategy extends SessionApplicationStatePersistenceStrategy { + + private final SessionProvider sessionProvider; + + public EntityApplicationStatePersistenceStrategy(Request request, + SessionProvider sessionProvider) { + super(request); + this.sessionProvider = sessionProvider; + } + + @SuppressWarnings("unchecked") + public T get(Class ssoClass, ApplicationStateCreator creator) { + final Object persistedValue = getOrCreate(ssoClass, creator); + + if (persistedValue instanceof PersistedEntity) { + final PersistedEntity persisted = (PersistedEntity) persistedValue; + + Object restored = persisted.restore(sessionProvider.get()); + + // shall we maybe throw an exception instead? + if (restored == null) { + set(ssoClass, null); + return (T) getOrCreate(ssoClass, creator); + } + + return (T) restored; + } + + return (T) persistedValue; + } + + public void set(Class ssoClass, T sso) { + final String key = buildKey(ssoClass); + Object entity; + + if (sso != null) { + try { + final String entityName = sessionProvider.get().getEntityName(sso); + final Serializable id = sessionProvider.get().getIdentifier(sso); + + entity = new PersistedEntity(entityName, id); + } catch (final HibernateException ex) { + entity = sso; + } + } else { + entity = sso; + } + + getSession().setAttribute(key, entity); + } + +} \ No newline at end of file diff --git a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/EntityDataSource.java b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/EntityDataSource.java new file mode 100644 index 0000000000..26b1781c1e --- /dev/null +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/EntityDataSource.java @@ -0,0 +1,130 @@ +package com.pmease.commons.tapestry.persistence; + +import java.util.List; + +import org.apache.tapestry5.grid.GridDataSource; +import org.apache.tapestry5.grid.SortConstraint; +import org.hibernate.Criteria; +import org.hibernate.Session; +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Projections; + +/** + * A simple implementation of {@link org.apache.tapestry5.grid.GridDataSource} + * based on a Hibernate Session and a known entity class. This implementation + * does support multiple {@link org.apache.tapestry5.grid.SortConstraint sort + * constraints}; however it assumes a direct mapping from sort constraint + * property to Hibernate property. + *

+ * This class is not thread-safe; it maintains internal state. + *

+ * Typically, an instance of this object is created fresh as needed (that is, it + * is not stored between requests). + */ +public class EntityDataSource implements GridDataSource { + private final Session session; + + private final Class entityType; + + private int startIndex; + + private List preparedResults; + + public EntityDataSource(Session session, Class entityType) { + assert session != null; + assert entityType != null; + this.session = session; + this.entityType = entityType; + } + + /** + * Returns the total number of rows for the configured entity type. + */ + public int getAvailableRows() { + Criteria criteria = session.createCriteria(entityType); + + applyAdditionalConstraints(criteria); + + criteria.setProjection(Projections.rowCount()); + + Number result = (Number) criteria.uniqueResult(); + + return result.intValue(); + } + + /** + * Prepares the results, performing a query (applying the sort results, and + * the provided start and end index). The results can later be obtained from + * {@link #getRowValue(int)} . + * + * @param startIndex + * index, from zero, of the first item to be retrieved + * @param endIndex + * index, from zero, of the last item to be retrieved + * @param sortConstraints + * zero or more constraints used to set the order of the returned + * values + */ + public void prepare(int startIndex, int endIndex, + List sortConstraints) { + assert sortConstraints != null; + Criteria crit = session.createCriteria(entityType); + + crit.setFirstResult(startIndex) + .setMaxResults(endIndex - startIndex + 1); + + for (SortConstraint constraint : sortConstraints) { + + String propertyName = constraint.getPropertyModel() + .getPropertyName(); + + switch (constraint.getColumnSort()) { + + case ASCENDING: + + crit.addOrder(Order.asc(propertyName)); + break; + + case DESCENDING: + crit.addOrder(Order.desc(propertyName)); + break; + + default: + } + } + + applyAdditionalConstraints(crit); + + this.startIndex = startIndex; + + preparedResults = crit.list(); + } + + /** + * Invoked after the main criteria has been set up (firstResult, maxResults + * and any sort contraints). This gives subclasses a chance to apply + * additional constraints before the list of results is obtained from the + * criteria. This implementation does nothing and may be overridden. + */ + protected void applyAdditionalConstraints(Criteria crit) { + } + + /** + * Returns a row value at the given index (which must be within the range + * defined by the call to {@link #prepare(int, int, java.util.List)} ). + * + * @param index + * of object + * @return object at that index + */ + public Object getRowValue(int index) { + return preparedResults.get(index - startIndex); + } + + /** + * Returns the entity type, as provided via the constructor. + */ + public Class getRowType() { + return entityType; + } +} diff --git a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/EntityPersistentFieldStrategy.java b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/EntityPersistentFieldStrategy.java new file mode 100644 index 0000000000..4d7193100d --- /dev/null +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/EntityPersistentFieldStrategy.java @@ -0,0 +1,35 @@ +package com.pmease.commons.tapestry.persistence; + +import java.io.Serializable; + +import org.apache.tapestry5.internal.services.AbstractSessionPersistentFieldStrategy; +import org.apache.tapestry5.services.Request; + +import com.pmease.commons.hibernate.SessionProvider; + +public class EntityPersistentFieldStrategy extends AbstractSessionPersistentFieldStrategy { + + private final SessionProvider sessionProvider; + + public EntityPersistentFieldStrategy(SessionProvider sessionProvider, Request request) { + super("entity:", request); + + this.sessionProvider = sessionProvider; + } + + @Override + protected Object convertApplicationValueToPersisted(Object newValue) { + String entityName = sessionProvider.get().getEntityName(newValue); + Serializable id = sessionProvider.get().getIdentifier(newValue); + + return new PersistedEntity(entityName, id); + } + + @Override + protected Object convertPersistedToApplicationValue(Object persistedValue) { + PersistedEntity persisted = (PersistedEntity) persistedValue; + + return persisted.restore(sessionProvider.get()); + } + +} diff --git a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/EntityValueEncoder.java b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/EntityValueEncoder.java new file mode 100644 index 0000000000..fd72770210 --- /dev/null +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/EntityValueEncoder.java @@ -0,0 +1,93 @@ +package com.pmease.commons.tapestry.persistence; + +import java.io.Serializable; + +import javax.inject.Provider; + +import org.apache.tapestry5.ValueEncoder; +import org.apache.tapestry5.ioc.internal.util.InternalUtils; +import org.apache.tapestry5.ioc.services.PropertyAccess; +import org.apache.tapestry5.ioc.services.PropertyAdapter; +import org.apache.tapestry5.ioc.services.TypeCoercer; +import org.hibernate.Session; +import org.hibernate.mapping.PersistentClass; +import org.hibernate.mapping.Property; +import org.slf4j.Logger; + +import com.pmease.commons.hibernate.SessionProvider; + +public final class EntityValueEncoder implements ValueEncoder { + private final Class entityClass; + + private final Provider sessionProvider; + + private final TypeCoercer typeCoercer; + + private final PropertyAdapter propertyAdapter; + + private final Logger logger; + + public EntityValueEncoder(Class entityClass, + PersistentClass persistentClass, SessionProvider sessionProvider, + PropertyAccess propertyAccess, TypeCoercer typeCoercer, + Logger logger) { + this.sessionProvider = sessionProvider; + this.entityClass = entityClass; + this.typeCoercer = typeCoercer; + this.logger = logger; + + Property property = persistentClass.getIdentifierProperty(); + + propertyAdapter = propertyAccess.getAdapter(this.entityClass) + .getPropertyAdapter(property.getName()); + } + + public String toClient(E value) { + if (value == null) + return null; + + Object id = propertyAdapter.get(value); + + if (id == null) { + return null; + } + + return typeCoercer.coerce(id, String.class); + } + + @SuppressWarnings("unchecked") + public E toValue(String clientValue) { + if (InternalUtils.isBlank(clientValue)) + return null; + + Object id = null; + + try { + + id = typeCoercer.coerce(clientValue, propertyAdapter.getType()); + } catch (Exception ex) { + throw new RuntimeException( + String.format( + "Exception converting '%s' to instance of %s (id type for entity %s): %s", + clientValue, propertyAdapter.getType().getName(), + entityClass.getName(), InternalUtils.toMessage(ex)), + ex); + } + + Serializable ser = (Serializable) id; + + E result = (E) sessionProvider.get().get(entityClass, ser); + + if (result == null) { + // We don't identify the entity type in the message because the + // logger is based on the + // entity type. + logger.error(String + .format("Unable to convert client value '%s' into an entity instance.", + clientValue)); + } + + return result; + } + +} diff --git a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/PersistedEntity.java b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/PersistedEntity.java new file mode 100644 index 0000000000..7090bc4c5f --- /dev/null +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/PersistedEntity.java @@ -0,0 +1,34 @@ +package com.pmease.commons.tapestry.persistence; + +import org.apache.tapestry5.annotations.ImmutableSessionPersistedObject; +import org.hibernate.Session; + +import java.io.Serializable; + +/** + * Encapsulates a Hibernate entity name with an entity id. + */ +@ImmutableSessionPersistedObject +public class PersistedEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + private final String entityName; + + private final Serializable id; + + public PersistedEntity(String entityName, Serializable id) { + this.entityName = entityName; + this.id = id; + } + + public Object restore(Session session) { + System.out.println("loading " + entityName + " " + id); + return session.load(entityName, id); + } + + @Override + public String toString() { + return String.format("", entityName, id); + } +} diff --git a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/PersistenceConstants.java b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/PersistenceConstants.java new file mode 100644 index 0000000000..c4ca007e5a --- /dev/null +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/persistence/PersistenceConstants.java @@ -0,0 +1,5 @@ +package com.pmease.commons.tapestry.persistence; + +public class PersistenceConstants { + public static final String ENTITY = "entity"; +} 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 deleted file mode 100644 index 950f851b66..0000000000 --- a/commons.tapestry/src/main/java/com/pmease/commons/tapestry/services/AppModule.java +++ /dev/null @@ -1,73 +0,0 @@ -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/java/com/pmease/commons/tapestry/services/TapestryConfigurator.java b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/services/TapestryConfigurator.java new file mode 100644 index 0000000000..a705773d1e --- /dev/null +++ b/commons.tapestry/src/main/java/com/pmease/commons/tapestry/services/TapestryConfigurator.java @@ -0,0 +1,145 @@ +package com.pmease.commons.tapestry.services; + +import java.util.Iterator; + +import org.apache.commons.lang.StringUtils; +import org.apache.tapestry5.SymbolConstants; +import org.apache.tapestry5.ValueEncoder; +import org.apache.tapestry5.ioc.Configuration; +import org.apache.tapestry5.ioc.LoggerSource; +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.PropertyAccess; +import org.apache.tapestry5.ioc.services.SymbolSource; +import org.apache.tapestry5.ioc.services.TypeCoercer; +import org.apache.tapestry5.services.ApplicationStateContribution; +import org.apache.tapestry5.services.ApplicationStatePersistenceStrategy; +import org.apache.tapestry5.services.AssetSource; +import org.apache.tapestry5.services.LibraryMapping; +import org.apache.tapestry5.services.PersistentFieldStrategy; +import org.apache.tapestry5.services.ValueEncoderFactory; +import org.apache.tapestry5.services.transform.InjectionProvider2; +import org.eclipse.jetty.servlet.ServletMapping; +import org.hibernate.Session; +import org.hibernate.mapping.PersistentClass; + +import com.google.inject.Injector; +import com.pmease.commons.bootstrap.Bootstrap; +import com.pmease.commons.hibernate.SessionProvider; +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; +import com.pmease.commons.tapestry.persistence.EntityApplicationStatePersistenceStrategy; +import com.pmease.commons.tapestry.persistence.EntityPersistentFieldStrategy; +import com.pmease.commons.tapestry.persistence.EntityValueEncoder; +import com.pmease.commons.tapestry.persistence.PersistenceConstants; + +public class TapestryConfigurator { + + 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); + } + } + } + } + } + + @SuppressWarnings("rawtypes") + public static void contributeValueEncoderSource(MappedConfiguration, ValueEncoderFactory> configuration, + final org.hibernate.cfg.Configuration hibernateCfg, final SessionProvider sessionProvider, + final TypeCoercer typeCoercer, final PropertyAccess propertyAccess, final LoggerSource loggerSource) { + + Iterator mappings = hibernateCfg.getClassMappings(); + while (mappings.hasNext()) { + final PersistentClass persistentClass = mappings.next(); + final Class entityClass = persistentClass.getMappedClass(); + + if (entityClass != null) { + ValueEncoderFactory factory = new ValueEncoderFactory() { + @SuppressWarnings("unchecked") + public ValueEncoder create(Class type) { + return new EntityValueEncoder(entityClass, persistentClass, sessionProvider, propertyAccess, + typeCoercer, loggerSource.getLogger(entityClass)); + } + }; + + configuration.add(entityClass, factory); + } + } + } + + public static void contributePersistentFieldManager(MappedConfiguration configuration) { + configuration.addInstance(PersistenceConstants.ENTITY, EntityPersistentFieldStrategy.class); + } + + /** + * Contributes the following strategy: + *

+ *
entity
+ *
Stores the id of the entity and reloads from the {@link Session}
+ *
+ */ + public void contributeApplicationStatePersistenceStrategySource( + MappedConfiguration configuration) { + configuration.addInstance(PersistenceConstants.ENTITY, EntityApplicationStatePersistenceStrategy.class); + } + + @SuppressWarnings("rawtypes") + public static void contributeApplicationStateManager( + MappedConfiguration configuration, + org.hibernate.cfg.Configuration hibernateCfg) { + + Iterator mappings = hibernateCfg.getClassMappings(); + while (mappings.hasNext()) { + final PersistentClass persistentClass = mappings.next(); + final Class entityClass = persistentClass.getMappedClass(); + + configuration.add(entityClass, new ApplicationStateContribution(PersistenceConstants.ENTITY)); + } + } + +}