On 24 June 2014 09:28, <[email protected]> wrote: > Hi Dan, > it is not limitation of OidMarshaller, but of RootOidDefault: > > Ensure.ensureThatArg(identifier, is(not(IsisMatchers.contains("#"))), > "identifier '" + identifier + "' contains a '#' symbol"); > > > Sounds about right.
> > > > Please find below bit more of the stack trace: > > Thanks for providing this; it helps. We can't just remove this constraint, however... as I said, the Oid is serialized as part of the URL, and # is not allowable. So what we need to do instead is provide a mechanism whereby your existing PK string can be encoded (eg base64 encoded). Options are: - that the RootOidDefault automatically makes itself "safe" - that the JdoObjectIdSerializer utility class (that converts from a JDO Id to an Isis identifier) makes the id safe - that the OidMarshaller - general purpose serialization of oids to strings, as used by the wicket viewer, restful objects, bookmarks etc - makes the oid string "safe". I think I like the third option best, because this is really a "presentation" constraint, not something that should be intrinsic to the domain (RootOidDefault) or the persistence layer (JDO). Whatever, I think this will need a new feature/improvement... there isn't something that can just be configured right now. For now, I think you'll need to recompile Isis from source, and try: - removing the check in RootOidDefault - adding in base64 encode/decode stuff in OidMarshaller#marshall and #'unmarshall. If it works for you, I'll use that as the basis for a proper ticket. Sorry it's not better news... Dan > Caused by: java.lang.RuntimeException: java.lang.IllegalArgumentException: > identifier 'com.wipro.wess.ods.munit.MUnitPK_#01' contains a '#' symbol > at > org.apache.isis.objectstore.jdo.datanucleus.persistence.FrameworkSynchronizer.withLogging(FrameworkSynchronizer.java:273) > at > org.apache.isis.objectstore.jdo.datanucleus.persistence.FrameworkSynchronizer.withLogging(FrameworkSynchronizer.java:282) > at > org.apache.isis.objectstore.jdo.datanucleus.persistence.FrameworkSynchronizer.postLoadProcessingFor(FrameworkSynchronizer.java:69) > at > org.apache.isis.objectstore.jdo.datanucleus.persistence.IsisLifecycleListener$1.doRun(IsisLifecycleListener.java:80) > at > org.apache.isis.objectstore.jdo.datanucleus.persistence.IsisLifecycleListener$RunnableAbstract.run(IsisLifecycleListener.java:201) > at > org.apache.isis.objectstore.jdo.datanucleus.persistence.IsisLifecycleListener.withLogging(IsisLifecycleListener.java:180) > at > org.apache.isis.objectstore.jdo.datanucleus.persistence.IsisLifecycleListener.postLoad(IsisLifecycleListener.java:76) > at > org.datanucleus.api.jdo.JDOCallbackHandler.postLoad(JDOCallbackHandler.java:304) > at > org.datanucleus.state.JDOStateManager.postLoad(JDOStateManager.java:4877) > at > org.datanucleus.state.JDOStateManager.loadFieldValues(JDOStateManager.java:2544) > at > org.datanucleus.state.JDOStateManager.initialiseForHollow(JDOStateManager.java:282) > at > org.apache.isis.objectstore.jdo.datanucleus.JDOStateManagerForIsis.initialiseForHollow(JDOStateManagerForIsis.java:60) > at > org.datanucleus.state.ObjectProviderFactoryImpl.newForHollow(ObjectProviderFactoryImpl.java:119) > at > org.datanucleus.ExecutionContextImpl.newObjectProviderForHollowPopulated(ExecutionContextImpl.java:1335) > at > org.datanucleus.ExecutionContextImpl.findObject(ExecutionContextImpl.java:3186) > at > org.datanucleus.store.rdbms.query.PersistentClassROF.getObjectForApplicationId(PersistentClassROF.java:480) > at > org.datanucleus.store.rdbms.query.PersistentClassROF.getObject(PersistentClassROF.java:375) > at > org.datanucleus.store.rdbms.query.ForwardQueryResult.nextResultSetElement(ForwardQueryResult.java:175) > at > org.datanucleus.store.rdbms.query.ForwardQueryResult$QueryResultIterator.next(ForwardQueryResult.java:379) > at > org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryProcessorAbstract.loadAdapters(PersistenceQueryProcessorAbstract.java:79) > at > org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryFindAllInstancesProcessor.process(PersistenceQueryFindAllInstancesProcessor.java:54) > at > org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryFindAllInstancesProcessor.process(PersistenceQueryFindAllInstancesProcessor.java:34) > at > org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore.processPersistenceQuery(DataNucleusObjectStore.java:542) > at > org.apache.isis.objectstore.jdo.datanucleus.DataNucleusObjectStore.loadInstancesAndAdapt(DataNucleusObjectStore.java:537) > at > org.apache.isis.core.runtime.system.persistence.PersistenceSession$1.execute(PersistenceSession.java:461) > at > org.apache.isis.core.runtime.system.persistence.PersistenceSession$1.execute(PersistenceSession.java:458) > at > org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.executeWithinTransaction(IsisTransactionManager.java:217) > at > org.apache.isis.core.runtime.system.persistence.PersistenceSession.getInstancesFromPersistenceLayer(PersistenceSession.java:458) > at > org.apache.isis.core.runtime.system.persistence.PersistenceSession.getInstances(PersistenceSession.java:454) > at > org.apache.isis.core.runtime.system.persistence.PersistenceSession.findInstances(PersistenceSession.java:391) > at > org.apache.isis.core.runtime.system.persistence.PersistenceSession.findInstances(PersistenceSession.java:386) > at > org.apache.isis.core.runtime.persistence.internal.RuntimeContextFromSession$8.allMatchingQuery(RuntimeContextFromSession.java:260) > at > org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault.allMatches(DomainObjectContainerDefault.java:400) > at > org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault.allInstances(DomainObjectContainerDefault.java:361) > at > org.apache.isis.applib.AbstractContainedObject.allInstances(AbstractContainedObject.java:125) > at > com.wipro.wess.ods.uom.UOMMeasurementService.listAllMeasurementUnits(UOMMeasurementService.java:99) > 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 > org.apache.isis.core.progmodel.facets.actions.invoke.ActionInvocationFacetViaMethod.invoke(ActionInvocationFacetViaMethod.java:111) > at > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:56) > at > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction$1.execute(ActionInvocationFacetWrapTransaction.java:53) > at > org.apache.isis.core.runtime.system.transaction.IsisTransactionManager.executeWithinTransaction(IsisTransactionManager.java:217) > at > org.apache.isis.core.runtime.transaction.facets.ActionInvocationFacetWrapTransaction.invoke(ActionInvocationFacetWrapTransaction.java:53) > at > org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionImpl.execute(ObjectActionImpl.java:345) > at > org.apache.isis.viewer.wicket.model.models.ActionModel.executeAction(ActionModel.java:434) > at > org.apache.isis.viewer.wicket.model.models.ActionModel.load(ActionModel.java:419) > at > org.apache.isis.viewer.wicket.model.models.ActionModel.load(ActionModel.java:59) > at > org.apache.wicket.model.LoadableDetachableModel.getObject(LoadableDetachableModel.java:121) > at > org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel.executeActionHandlingApplicationExceptions(ActionPanel.java:287) > at > org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel.executeActionOnTargetAndProcessResults(ActionPanel.java:206) > at > org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel.executeActionAndProcessResults(ActionPanel.java:165) > at > org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel.buildGui(ActionPanel.java:102) > at > org.apache.isis.viewer.wicket.ui.components.actions.ActionPanel.<init>(ActionPanel.java:95) > at > org.apache.isis.viewer.wicket.ui.components.actions.ActionPanelFactory.createComponent(ActionPanelFactory.java:49) > at > org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract.createComponent(ComponentFactoryAbstract.java:82) > at > org.apache.isis.viewer.wicket.viewer.registries.components.ComponentFactoryRegistryDefault.createComponent(ComponentFactoryRegistryDefault.java:120) > at > org.apache.isis.viewer.wicket.viewer.registries.components.ComponentFactoryRegistryDefault.addOrReplaceComponent(ComponentFactoryRegistryDefault.java:105) > at > org.apache.isis.viewer.wicket.ui.pages.PageAbstract.addComponent(PageAbstract.java:281) > at > org.apache.isis.viewer.wicket.ui.pages.PageAbstract.addChildComponents(PageAbstract.java:276) > at > org.apache.isis.viewer.wicket.ui.pages.action.ActionPage.<init>(ActionPage.java:54) > ... 46 more > Caused by: java.lang.IllegalArgumentException: identifier > 'com.wipro.wess.ods.munit.MUnitPK_#01' contains a '#' symbol > at > org.apache.isis.core.commons.ensure.Ensure.ensureThatArg(Ensure.java:75) > at > org.apache.isis.core.metamodel.adapter.oid.RootOidDefault.<init>(RootOidDefault.java:127) > at > org.apache.isis.core.metamodel.adapter.oid.RootOidDefault.<init>(RootOidDefault.java:96) > at > org.apache.isis.core.runtime.system.persistence.OidGenerator.createPersistentOrViewModelOid(OidGenerator.java:106) > at > org.apache.isis.objectstore.jdo.datanucleus.persistence.FrameworkSynchronizer$1.run(FrameworkSynchronizer.java:108) > at > org.apache.isis.objectstore.jdo.datanucleus.persistence.FrameworkSynchronizer$7.call(FrameworkSynchronizer.java:286) > at > org.apache.isis.objectstore.jdo.datanucleus.persistence.FrameworkSynchronizer$7.call(FrameworkSynchronizer.java:282) > at > org.apache.isis.objectstore.jdo.datanucleus.persistence.FrameworkSynchronizer.withLogging(FrameworkSynchronizer.java:271) > ... 107 more > > > Actually it is Legacy data which is master data with pre-filled data. And > its required that this Domain object need to have special symbols and # is > one of them. > > So how to deal with this issue then. Please help. > > -----Original Message----- > From: Dan Haywood [mailto:[email protected]] > Sent: Thursday, June 19, 2014 6:37 PM > To: users > Subject: Re: identifier 'com.wipro.wess.ods.munit.MUnitPK_#01' contains a > '#' symbol > > On 19 June 2014 08:18, <[email protected]> wrote: > > > Hi, > > > > When a domain object has "#" symbol in its Primary key(of String type) > > and try to query it, following exception is thrown: > > Caused by: java.lang.IllegalArgumentException: identifier > > 'com.wipro.wess.ods.munit.MUnitPK_#01' contains a '#' symbol > > at > > org.apache.isis.core.commons.ensure.Ensure.ensureThatArg(Ensure.java:7 > > 5) > > > > > > > A bit more of the stacktrace would be useful.... > > > > > > Why this character be excluded in the identifier. > > > > > ... but I can make a guess. > > My first guess (turns out to be wrong) is that this is a reserved > character for the string form of OIDs. (As you probably know) Isis creates > an Oid as its internal identifier, holding both the object's type and Id; > this is then present in the URL of the Wicket viewer and the Restful > Objects viewer. > > If you look at the OidMarshaller class [1] you can see that there's a > bunch of characters that have special meanings, and so cannot be used in > the primary key of your string. > > > That said, if you look at that list, it doesn't include the '#' symbol, so > in this case it isn't a limitation in the OidMarshaller. So my second > guess is that we don't allow '#' because - as I mentioned just above - OIDs > appear in the URLs of the Wicket and RO viewer. The '#' symbol is used as > an anchor in URLs, so is disallowed for URLs. (Not sure where we actually > enforce that rule, but I guess we are somewhere). > > HTH > Dan > > > [1] > > https://github.com/apache/isis/blob/98fa9f2d9204166c1b9168d1f0839dd161d0e61e/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_unmarshal.java > > > > > > > Please help. > > > > BR > > Ranganath Varma > > > > The information contained in this electronic message and any > > attachments to this message are intended for the exclusive use of the > > addressee(s) and may contain proprietary, confidential or privileged > > information. If you are not the intended recipient, you should not > > disseminate, distribute or copy this e-mail. Please notify the sender > > immediately and destroy all copies of this message and any attachments. > > > > WARNING: Computer viruses can be transmitted via email. The recipient > > should check this email and any attachments for the presence of viruses. > > The company accepts no liability for any damage caused by any virus > > transmitted by this email. > > > > www.wipro.com > > > > The information contained in this electronic message and any attachments > to this message are intended for the exclusive use of the addressee(s) and > may contain proprietary, confidential or privileged information. If you are > not the intended recipient, you should not disseminate, distribute or copy > this e-mail. Please notify the sender immediately and destroy all copies of > this message and any attachments. > > WARNING: Computer viruses can be transmitted via email. The recipient > should check this email and any attachments for the presence of viruses. > The company accepts no liability for any damage caused by any virus > transmitted by this email. > > www.wipro.com >
