0 Replies Latest reply on Jul 12, 2009 10:36 AM by Alexandros Karypidis

    Creating users during startup with IdentityManager.createUser()

    Alexandros Karypidis Novice

      Hello,


      I want to create default user accounts (admin/admin, guest/guest) during the startup of my Seam 2.1.2 application. I need to do this with IdentityManager.createUser() because I use a hashed jpaIdentityStore, so I don't want to have to calculate hashes/update import.sql if I change the hashing approach (one point to modify - the hash annotation - and everything works). Here's the code:


      @Stateful
      @Name("applicationConfiguration")
      @Scope(ScopeType.APPLICATION)
      @BypassInterceptors
      public class ApplicationConfigurationBean implements ApplicationConfiguration {
           @Observer("org.jboss.seam.postInitialization")
           public void initializeApplication() {
                System.out.println("=== APPLICATION STARTUP ===");
                System.out.println("Disable security...");
                Identity.setSecurityEnabled(false);
                try {
                     System.out.println("Create context...");
                     Lifecycle.beginCall();
                     try {
                          System.out.println("Creating default user accounts...");
                          IdentityManager im = IdentityManager.instance();
                          im.createUser("admin", "admin");
                          im.createUser("guest", "guest");
                          System.out.println("Accounts created!");
                     } catch (Throwable t) {
                          t.printStackTrace();
                     } finally {
                          Lifecycle.endCall();
                     }
                } finally {
                     Identity.setSecurityEnabled(true);
                     System.out.println("Security restored...");
                }
                System.out.println("=== APPLICATION STARTUP ====");
                System.out.flush();
           }
      
           @Destroy
           @Remove
           public void destroy() {
           }
      }



      The accounts are created just fine, but the application throws an exception and JBoss (5.1.0-jdk6) stops it. So I am left with the accounts and a no longer running application. The exception is shown below, but the interesting thing I found is that I can prevent it (and have everything work perfectly) if I leave the LifeCycle.beginCall() open! In other words, If I remove the LifeCycle.endCall() from the snippet above, everything works.


      So this post is more in relation to understanding what is going on: if I don't do a beginCall(), Seam fails with No application context active. If I do, it fails with the exception below. The only way to keep it happy is to change the state in my @Create method and leave it changed. It does not seem right, but it works. Thing is, I need to understand why it works, otherwise I cannot feel safe about my code..


      Anyway, here is what Seam complains about when I play nice and leave things as I found them:



      10:49:15,750 INFO  [ServletContextListener] Welcome to Seam 2.1.2
      10:49:20,437 WARN  [Component] Stateful session beans was bound to the APPLICATION context - note that it is not safe to make concurrent calls to the bean: applicationConfiguration
      10:49:20,656 WARN  [PersistentPermissionResolver] no permission store available - please install a PermissionStore with the name 'org.jboss.seam.security.jpaPermissionStore' if persistent permissions are required.
      10:49:20,781 WARN  [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, InterceptorRegistry should be used via the bean container
      10:49:20,796 WARN  [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, InterceptorRegistry should be used via the bean container
      10:49:20,796 INFO  [STDOUT] ============= APPLICATION STARTUP ===============
      10:49:20,796 INFO  [STDOUT] Disable security...
      10:49:20,796 INFO  [STDOUT] Create context...
      10:49:20,812 INFO  [STDOUT] Creating default user accounts...
      10:49:21,078 WARN  [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, InterceptorRegistry should be used via the bean container
      10:49:21,078 WARN  [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, InterceptorRegistry should be used via the bean container
      10:49:21,515 INFO  [STDOUT] Hibernate: 
          select
              account0_.username as username21_,
              account0_.password as password21_ 
          from
              accounts account0_ 
          where
              account0_.username=? limit ?
      10:49:21,625 INFO  [STDOUT] Hibernate: 
          insert 
          into
              accounts
              (password, username) 
          values
              (?, ?)
      10:49:21,640 INFO  [STDOUT] Hibernate: 
          select
              account0_.username as username21_,
              account0_.password as password21_ 
          from
              accounts account0_ 
          where
              account0_.username=? limit ?
      10:49:21,640 INFO  [STDOUT] Accounts created!
      10:49:21,656 INFO  [STDOUT] Security restored...
      10:49:21,656 INFO  [STDOUT] ============= APPLICATION STARTUP ===============
      10:49:21,656 INFO  [STDOUT] Hibernate: 
          insert 
          into
              accounts
              (password, username) 
          values
              (?, ?)
      10:49:21,734 ERROR [webui]] Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener
      java.lang.NullPointerException
           at org.jboss.seam.contexts.Contexts.destroy(Contexts.java:241)
           at org.jboss.seam.contexts.ServletLifecycle.endInitialization(ServletLifecycle.java:118)
           at org.jboss.seam.init.Initialization.init(Initialization.java:740)
           at org.jboss.seam.servlet.SeamListener.contextInitialized(SeamListener.java:36)
           at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3910)
           at org.apache.catalina.core.StandardContext.start(StandardContext.java:4393)
           at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:310)
           at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeploy(TomcatDeployment.java:142)
           at org.jboss.web.deployers.AbstractWarDeployment.start(AbstractWarDeployment.java:461)
           at org.jboss.web.deployers.WebModule.startModule(WebModule.java:118)
           at org.jboss.web.deployers.WebModule.start(WebModule.java:97)
           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
           at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
           at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
           at java.lang.reflect.Method.invoke(Method.java:597)
           at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
           at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
           at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
           at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
           at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
           at org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206)
           at $Proxy38.start(Unknown Source)
           at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:42)
           at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:37)
           at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62)
           at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71)
           at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51)
           at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
           at org.jboss.system.microcontainer.ServiceControllerContext.install(ServiceControllerContext.java:286)
           at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
           at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
           at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
           at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
           at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
           at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
           at org.jboss.system.ServiceController.doChange(ServiceController.java:688)
           at org.jboss.system.ServiceController.start(ServiceController.java:460)
           at org.jboss.system.deployers.ServiceDeployer.start(ServiceDeployer.java:163)
           at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:99)
           at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:46)
           at org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer.internalDeploy(AbstractSimpleRealDeployer.java:62)
           at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
           at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
           at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
           at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
           at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1178)
           at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1210)
           at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
           at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
           at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
           at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
           at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
           at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
           at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
           at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
           at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
           at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:702)
           at org.jboss.system.server.profileservice.repository.MainDeployerAdapter.process(MainDeployerAdapter.java:117)
           at org.jboss.system.server.profileservice.repository.ProfileDeployAction.install(ProfileDeployAction.java:70)
           at org.jboss.system.server.profileservice.repository.AbstractProfileAction.install(AbstractProfileAction.java:53)
           at org.jboss.system.server.profileservice.repository.AbstractProfileService.install(AbstractProfileService.java:361)
           at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
           at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
           at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
           at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
           at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
           at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
           at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
           at org.jboss.system.server.profileservice.repository.AbstractProfileService.activateProfile(AbstractProfileService.java:306)
           at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:271)
           at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:461)
           at org.jboss.Main.boot(Main.java:221)
           at org.jboss.Main$1.run(Main.java:556)
           at java.lang.Thread.run(Thread.java:619)
      10:49:21,734 ERROR [StandardContext] Error listenerStart
      10:49:21,734 ERROR [StandardContext] Context [/prj.webui] startup failed due to previous errors