Hi Dan. I’m not sure how to use the SudoService inside a FixtureScript.
I have the following: public class DemoWithAllRecordsFixture extends FixtureScript { public DemoWithAllRecordsFixture() { this.withDiscoverability(Discoverability.DISCOVERABLE); } @Override protected void execute( final ExecutionContext executionContext) { executionContext.executeChild(this, new ExcelInheritedConditionsSNPGenotypeFixture()); executionContext.executeChild(this, new ExcelDrugsSNPGenotypeFixture()); executionContext.executeChild(this, new ExcelTraitsSNPGenotypeFixture()); } The ExcelInheritedConditionsSNPGenotypeFixture contains many wrapped action invocations, so the following exception is thrown: Caused by: org.apache.isis.applib.services.wrapper.HiddenException: Reason: Could not locate application user for initialisation. Identifier: com.tellmegen.domain.model.inheritedconditions.InheritedCondition#upsertSNPGenotype(java.lang.Integer,com.tellmegen.domain.model.AppliesToSex,java.lang.String,java.lang.String,com.tellmegen.domain.model.inheritedconditions.InheritedConditionHeredity,com.tellmegen.domain.model.inheritedconditions.InheritedConditionPhenotype,com.tellmegen.domain.model.inheritedconditions.InheritedConditionStatus,java.lang.String,java.lang.String) at org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.toException(DomainObjectInvocationHandler.java:732) at org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.notifyListenersAndVetoIfRequired(DomainObjectInvocationHandler.java:700) at org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.checkVisibility(DomainObjectInvocationHandler.java:682) at org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.handleActionMethod(DomainObjectInvocationHandler.java:607) at org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.invoke(DomainObjectInvocationHandler.java:263) at org.apache.isis.core.wrapper.proxy.ProxyInstantiatorForJavassist$1.invoke(ProxyInstantiatorForJavassist.java:72) at com.tellmegen.domain.model.inheritedconditions.InheritedCondition_$$_jvstcc_7.upsertSNPGenotype(InheritedCondition_$$_jvstcc_7.java) at com.tellmegen.domain.model.importing.ImportInheritedConditionSNPGenotype.saveToDatabase(ImportInheritedConditionSNPGenotype.java:244) at com.tellmegen.domain.model.importing.ImportInheritedConditionsSNPGenotypeService.importInheritedConditionsSNPGenotypes(ImportInheritedConditionsSNPGenotypeService.java:38) at com.tellmegen.fixture.model.inheritedconditionsnpgenotype.ExcelInheritedConditionsSNPGenotypeFixture.execute(ExcelInheritedConditionsSNPGenotypeFixture.java:24) at org.apache.isis.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildIfNotAlready(FixtureScript.java:549) at org.apache.isis.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildT(FixtureScript.java:528) at org.apache.isis.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildT(FixtureScript.java:498) at org.apache.isis.applib.fixturescripts.FixtureScript$ExecutionContext.executeChild(FixtureScript.java:487) at com.tellmegen.fixture.TellMeGenDemoWithAllRecordsFixture.execute(TellMeGenDemoWithAllRecordsFixture.java:34) at org.apache.isis.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildIfNotAlready(FixtureScript.java:549) at org.apache.isis.applib.fixturescripts.FixtureScript$ExecutionContext.access$0(FixtureScript.java:546) at org.apache.isis.applib.fixturescripts.FixtureScript.run(FixtureScript.java:719) at org.apache.isis.applib.fixturescripts.FixtureScript.install(FixtureScript.java:814) at org.apache.isis.core.runtime.fixtures.FixturesInstallerDelegate.installFixture(FixturesInstallerDelegate.java:205) at org.apache.isis.core.runtime.fixtures.FixturesInstallerDelegate.installFixtureInTransaction(FixturesInstallerDelegate.java:171) at org.apache.isis.core.runtime.fixtures.FixturesInstallerDelegate.installFixtures(FixturesInstallerDelegate.java:158) at org.apache.isis.core.runtime.fixtures.FixturesInstallerDelegate.installFixtures(FixturesInstallerDelegate.java:138) at org.apache.isis.core.runtime.fixtures.FixturesInstallerAbstract.installFixtures(FixturesInstallerAbstract.java:42) at org.apache.isis.core.runtime.systemusinginstallers.IsisSystemAbstract.installFixturesIfRequired(IsisSystemAbstract.java:85) at org.apache.isis.core.runtime.system.IsisSystemFixturesHookAbstract.init(IsisSystemFixturesHookAbstract.java:128) at org.apache.isis.core.runtime.runner.IsisInjectModule.provideIsisSystem(IsisInjectModule.java:133) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.google.inject.internal.ProviderMethod.get(ProviderMethod.java:104) at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40) at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031) at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) at com.google.inject.Scopes$1$1.get(Scopes.java:65) at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40) at com.google.inject.internal.SingleFieldInjector.inject(SingleFieldInjector.java:53) at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:110) at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:75) at com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:73) at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1024) at com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:73) at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:60) If try to use them inside a SudoService.sudo(…) call I don’t have access to the “executionContext” (it’s private). So basically, I would need to make the “executionContext” field of FixtureScript “public”, or being able to use SudoService to override the User globally, without needing to use a “Callable” construct. Do you agree? Thanks, Oscar > El 18/4/2015, a las 12:35, GESCONSULTOR <o....@gesconsultor.com> escribió: > > > > Many thanks, Dan. > > I'll try it! > >> El 18/4/2015, a las 12:26, Dan Haywood <d...@haywood-associates.co.uk> >> escribió: >> >> Hi Oscar, >> >> I hit this same issue a couple of weeks ago while refactoring our example >> todoapp, which led me to inventing the "SudoService". >> >> Not yet documented, but you can see its usage here [1] >> >> HTH >> Dan >> >> [1] >> https://github.com/isisaddons/isis-app-todoapp/blob/master/fixture/src/main/java/todoapp/fixture/module/todoitem/ToDoItemCreate.java#L134 >> >>> On 18 April 2015 at 10:17, QUALITEC - Óscar Bou <o...@qualitec.es> wrote: >>> >>> Hi all. >>> >>> I have a FixtureScript that invokes some factory methods that include >>> setters that are invoking by wrapping the domain object (for ensuring that >>> the validateXXX, modifyXXX, etc. methods are also invoked). >>> >>> public class TwentyPercentForTwoOrdersCoupon extends FixtureScript { >>> >>> @Override >>> protected void execute( >>> final FixtureScript.ExecutionContext executionContext) { >>> >>> this.coupons.createCoupon("50€-2ORDERS", LocalDate.now(), >>> LocalDate.now().plusDays(3), 2L, null, new BigDecimal("50")); >>> >>> } >>> >>> @Inject >>> private Coupons coupons; >>> >>> } >>> >>> @DomainService(repositoryFor = Coupon.class) >>> public class Coupons extends AbstractTellmegenService { >>> >>> // {{ createCoupon (action) >>> @MemberOrder(sequence = "2.5.1") >>> public Coupon createCoupon(@ParameterLayout(named = "Code") final >>> String code, >>> @ParameterLayout(named = "Start Date") final LocalDate >>> startDate, >>> @ParameterLayout(named = "Due Date") final LocalDate dueDate, >>> @ParameterLayout(named = "Max Number of Kits") final Long >>> maxNumberOfKits, >>> @ParameterLayout(named = "Percent Discount (0-100)") >>> @Parameter(optionality = Optionality.OPTIONAL) final Integer >>> percentDiscount, >>> @ParameterLayout(named = "Amount Discount (€)") >>> @Parameter(optionality = Optionality.OPTIONAL) final BigDecimal >>> amountDiscount) { >>> final Coupon coupon = this.newTransientInstance(Coupon.class); >>> >>> this.wrap(coupon).setCode(code); >>> this.wrap(coupon).setStartDate(startDate); >>> this.wrap(coupon).setDueDate(dueDate); >>> this.wrap(coupon).setMaxNumberOfOrders(maxNumberOfKits); >>> this.wrap(coupon).setPercentDiscount(percentDiscount); >>> this.wrap(coupon).setAmountDiscount(amountDiscount); >>> >>> // Save DB >>> this.persist(coupon); >>> this.getContainer().flush(); >>> >>> return coupon; >>> } >>> >>> >>> >>> But when executing from the Fixture Script, the following exception is >>> thrown. >>> Any ideas about how to avoid it? >>> >>> I'm using the security add-on. Perhaps it must be initialized somewhere on >>> the Fixture Script? >>> >>> Thanks! >>> >>> >>> 11:06:11,379 [WebAppContext main WARN ] Failed startup of >>> context >>> o.e.j.w.WebAppContext{,file:/Users/oscarboubou/dev/tellmegen/dbtg/webapp/src/main/webapp/},src/main/webapp >>> javax.servlet.ServletException: com.google.inject.ProvisionException: >>> Guice provision errors: >>> >>> 1) Error in custom provider, >>> org.apache.isis.applib.services.wrapper.HiddenException: Reason: Could not >>> locate application user for initialisation. Identifier: >>> com.tellmegen.domain.model.order.coupon.Coupon#code() >>> at >>> org.apache.isis.core.runtime.runner.IsisInjectModule.provideIsisSystem(IsisInjectModule.java:132) >>> at >>> org.apache.isis.core.runtime.runner.IsisInjectModule.provideIsisSystem(IsisInjectModule.java:132) >>> while locating org.apache.isis.core.runtime.system.IsisSystem >>> for field at >>> org.apache.isis.viewer.wicket.viewer.IsisWicketApplication.system(IsisWicketApplication.java:1) >>> while locating webapp.application.TellMeGenApplication >>> >>> 1 error >>> at >>> org.apache.wicket.protocol.http.WicketFilter.init(WicketFilter.java:450) >>> at >>> org.apache.wicket.protocol.http.WicketFilter.init(WicketFilter.java:351) >>> at >>> org.eclipse.jetty.servlet.FilterHolder.doStart(FilterHolder.java:118) >>> at >>> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) >>> at >>> org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:768) >>> at >>> org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:265) >>> at >>> org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1242) >>> at >>> org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:717) >>> at >>> org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:494) >>> at >>> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) >>> at >>> org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:95) >>> at org.eclipse.jetty.server.Server.doStart(Server.java:282) >>> at >>> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:64) >>> at >>> org.apache.isis.core.webserver.WebServerBootstrapper.bootstrap(WebServerBootstrapper.java:86) >>> at org.apache.isis.core.webserver.WebServer.run(WebServer.java:107) >>> at org.apache.isis.core.webserver.WebServer.main(WebServer.java:71) >>> at org.apache.isis.WebServer.main(WebServer.java:25) >>> Caused by: com.google.inject.ProvisionException: Guice provision errors: >>> >>> 1) Error in custom provider, >>> org.apache.isis.applib.services.wrapper.HiddenException: Reason: Could not >>> locate application user for initialisation. Identifier: >>> com.tellmegen.domain.model.order.coupon.Coupon#code() >>> at >>> org.apache.isis.core.runtime.runner.IsisInjectModule.provideIsisSystem(IsisInjectModule.java:132) >>> at >>> org.apache.isis.core.runtime.runner.IsisInjectModule.provideIsisSystem(IsisInjectModule.java:132) >>> while locating org.apache.isis.core.runtime.system.IsisSystem >>> for field at >>> org.apache.isis.viewer.wicket.viewer.IsisWicketApplication.system(IsisWicketApplication.java:1) >>> while locating webapp.application.TellMeGenApplication >>> >>> 1 error >>> at >>> com.google.inject.internal.Errors.throwProvisionExceptionIfErrorsExist(Errors.java:451) >>> at >>> com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:65) >>> at >>> com.google.inject.internal.InjectorImpl.injectMembers(InjectorImpl.java:944) >>> at >>> org.apache.isis.viewer.wicket.viewer.IsisWicketApplication.init(IsisWicketApplication.java:256) >>> at >>> webapp.application.TellMeGenApplication.init(TellMeGenApplication.java:204) >>> at >>> org.apache.wicket.Application.initApplication(Application.java:823) >>> at >>> org.apache.wicket.protocol.http.WicketFilter.init(WicketFilter.java:424) >>> ... 16 more >>> Caused by: org.apache.isis.applib.services.wrapper.HiddenException: >>> Reason: Could not locate application user for initialisation. Identifier: >>> com.tellmegen.domain.model.order.coupon.Coupon#code() >>> at >>> org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.toException(DomainObjectInvocationHandler.java:713) >>> at >>> org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.notifyListenersAndVetoIfRequired(DomainObjectInvocationHandler.java:681) >>> at >>> org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.checkVisibility(DomainObjectInvocationHandler.java:663) >>> at >>> org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.handleSetterMethodOnProperty(DomainObjectInvocationHandler.java:387) >>> at >>> org.apache.isis.core.wrapper.handlers.DomainObjectInvocationHandler.invoke(DomainObjectInvocationHandler.java:216) >>> at >>> org.apache.isis.core.wrapper.proxy.ProxyInstantiatorForJavassist$1.invoke(ProxyInstantiatorForJavassist.java:52) >>> at >>> com.tellmegen.domain.model.order.coupon.Coupon_$$_jvstc93_5.setCode(Coupon_$$_jvstc93_5.java) >>> at >>> com.tellmegen.domain.model.order.coupon.Coupons.createCoupon(Coupons.java:36) >>> at >>> com.tellmegen.fixture.model.orders.TwentyPercentForTwoOrdersCoupon.execute(TwentyPercentForTwoOrdersCoupon.java:35) >>> at >>> org.apache.isis.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildIfNotAlready(FixtureScript.java:549) >>> at >>> org.apache.isis.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildT(FixtureScript.java:528) >>> at >>> org.apache.isis.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildT(FixtureScript.java:498) >>> at >>> org.apache.isis.applib.fixturescripts.FixtureScript$ExecutionContext.executeChild(FixtureScript.java:487) >>> at >>> com.tellmegen.fixture.TellMeGenDemoFixture.execute(TellMeGenDemoFixture.java:58) >>> at >>> org.apache.isis.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildIfNotAlready(FixtureScript.java:549) >>> at >>> org.apache.isis.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildT(FixtureScript.java:528) >>> at >>> org.apache.isis.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildT(FixtureScript.java:498) >>> at >>> org.apache.isis.applib.fixturescripts.FixtureScript$ExecutionContext.executeChild(FixtureScript.java:487) >>> at >>> com.tellmegen.fixture.TellMeGenDemoWithAllRecordsFixture.execute(TellMeGenDemoWithAllRecordsFixture.java:25) >>> at >>> org.apache.isis.applib.fixturescripts.FixtureScript$ExecutionContext.executeChildIfNotAlready(FixtureScript.java:549) >>> at >>> org.apache.isis.applib.fixturescripts.FixtureScript$ExecutionContext.access$0(FixtureScript.java:546) >>> at >>> org.apache.isis.applib.fixturescripts.FixtureScript.run(FixtureScript.java:719) >>> at >>> org.apache.isis.applib.fixturescripts.FixtureScript.install(FixtureScript.java:814) >>> at >>> org.apache.isis.core.runtime.fixtures.FixturesInstallerDelegate.installFixture(FixturesInstallerDelegate.java:205) >>> at >>> org.apache.isis.core.runtime.fixtures.FixturesInstallerDelegate.installFixtureInTransaction(FixturesInstallerDelegate.java:171) >>> at >>> org.apache.isis.core.runtime.fixtures.FixturesInstallerDelegate.installFixtures(FixturesInstallerDelegate.java:158) >>> at >>> org.apache.isis.core.runtime.fixtures.FixturesInstallerDelegate.installFixtures(FixturesInstallerDelegate.java:138) >>> at >>> org.apache.isis.core.runtime.fixtures.FixturesInstallerAbstract.installFixtures(FixturesInstallerAbstract.java:42) >>> at >>> org.apache.isis.core.runtime.systemusinginstallers.IsisSystemAbstract.installFixturesIfRequired(IsisSystemAbstract.java:85) >>> at >>> org.apache.isis.core.runtime.system.IsisSystemFixturesHookAbstract.init(IsisSystemFixturesHookAbstract.java:128) >>> at >>> org.apache.isis.core.runtime.runner.IsisInjectModule.provideIsisSystem(IsisInjectModule.java:133) >>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) >>> at >>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) >>> at >>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) >>> at java.lang.reflect.Method.invoke(Method.java:606) >>> at >>> com.google.inject.internal.ProviderMethod.get(ProviderMethod.java:104) >>> at >>> com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40) >>> at >>> com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) >>> at >>> com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031) >>> at >>> com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) >>> at com.google.inject.Scopes$1$1.get(Scopes.java:65) >>> at >>> com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40) >>> at >>> com.google.inject.internal.SingleFieldInjector.inject(SingleFieldInjector.java:53) >>> at >>> com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:110) >>> at >>> com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:75) >>> at >>> com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:73) >>> at >>> com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1024) >>> at >>> com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:73) >>> at >>> com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:60) >>> ... 21 more >>> 11:06:11,449 [AbstractConnector main INFO ] Started >>> SelectChannelConnector@0.0.0.0:8080 Óscar Bou Bou Responsable de Producto Auditor Jefe de Certificación ISO 27001 en BSI CISA, CRISC, APMG ISO 20000, ITIL-F 902 900 231 / 620 267 520 http://www.twitter.com/oscarbou <http://www.twitter.com/oscarbou> http://es.linkedin.com/in/oscarbou <http://es.linkedin.com/in/oscarbou> http://www.GesConsultor.com <http://www.gesconsultor.com/> Este mensaje y los ficheros anexos son confidenciales. Los mismos contienen información reservada que no puede ser difundida. Si usted ha recibido este correo por error, tenga la amabilidad de eliminarlo de su sistema y avisar al remitente mediante reenvío a su dirección electrónica; no deberá copiar el mensaje ni divulgar su contenido a ninguna persona. Su dirección de correo electrónico junto a sus datos personales constan en un fichero titularidad de Gesdatos Software, S.L. cuya finalidad es la de mantener el contacto con Ud. Si quiere saber de qué información disponemos de Ud., modificarla, y en su caso, cancelarla, puede hacerlo enviando un escrito al efecto, acompañado de una fotocopia de su D.N.I. a la siguiente dirección: Gesdatos Software, S.L. , Paseo de la Castellana, 153 bajo - 28046 (Madrid), y Avda. Cortes Valencianas num. 50, 1ºC - 46015 (Valencia). Asimismo, es su responsabilidad comprobar que este mensaje o sus archivos adjuntos no contengan virus informáticos, y en caso que los tuvieran eliminarlos.