On 24 June 2014 14:06, <[email protected]> wrote:

> Hi Dan,
> Thanks for the options. It is resolved.
> What I did is:


[snip]


> I think it's better to have this encode/decode in OidMarshaller rather
> than enforcing domain object. What's your opinion?
>
>
I think so too.

Glad you're resolved for now, but would you like to raise a ticket for me
referencing this thread so we can solve this in the framework rather than
require hacky domain logic/boilerplate?

thanks
Dan




>
> -----Original Message-----
> From: Dan Haywood [mailto:[email protected]]
> Sent: Tuesday, June 24, 2014 5:51 PM
> To: users
> Subject: Re: identifier 'com.wipro.wess.ods.munit.MUnitPK_#01' contains a
> '#' symbol
>
> 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/98fa9f2d9204166c1b9168d1f0839dd161
> > d0e61e/core/metamodel/src/test/java/org/apache/isis/core/metamodel/ada
> > pter/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
> >
>
> 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
>

Reply via email to