Hi Mark, I've been mulling on this. The RO spec defines: * PUT against an existing object http://~/objects/CUS/1234 to do a bulk update of that object, and * POST against an existing object type http://~/objects/CUS to do a persist of a new object
(though I have a feeling that Isis doesn't support this latter one yet). What you are asking for is I think to allow the PUT to automatically create the object if it does not exist? That sounds reasonable, I think. We would need a way to distinguish between the autocreate feature, however (ie distinguish UPSERT vs UPDATE). How about: * PATCH against an existing object http://~/objects/CUS/1234 to do a bulk update of that object (ie what PUT does today), and * PUT against an existing object http://~/objects/CUS/1234 does an upsert. I'll start a discussion over on the RO.Net forum for any thoughts on their side. Dan On 27 January 2013 00:02, MARK <[email protected]> wrote: > I would like to create a generic action which would take a list/map of > fieldname value pairs and update those fields in the object or createthe > object if the key does not exist. Throwing an exception if a specified > field does not exist or the value has the wrong type > Sent from my ASUS Pad > > Jeroen van der Wal <[email protected]> wrote: > > >I don'n know exactly what you're aiming for but you could make that action > >that you call idempotent. > > > >This is a snippet of an api that we use to update and create using a > single > >method: > > > >@Hidden > >public class Api extends AbstractFactoryAndRepository { > > > > ... > > > > @ActionSemantics(Of.IDEMPOTENT) > > public void putPerson( > > @Named("reference") String reference, > > @Named("initials") @Optional String initials, > > @Named("firstName") String firstName, > > @Named("lastName") String lastName) { > > Person person = (Person) parties.findPartyByReference(reference); > > if (person == null) { > > person = parties.newPerson(initials, firstName, lastName); > > person.setReference(reference); > > } > > person.setFirstName(firstName) > > person.setLastName(lastName); > > } > > > > ... > > > > private Parties parties; > > > >public void setPartyRepository(final Parties parties) { > > > > this.parties = parties; > > > > } > > > >} > > > > > >On Sat, Jan 26, 2013 at 6:14 PM, Mark Wood-Patrick > ><[email protected]>wrote: > > > >> Are there any plans for the Restful Objects API to support the patch > http > >> verb (aka upsert) there by saving a round trip? > >> > >> Mark > >> > >> -----Original Message----- > >> From: Mark Wood-Patrick [mailto:[email protected]] > >> Sent: Friday, January 25, 2013 9:57 PM > >> To: '[email protected]' > >> Cc: 'dev' > >> Subject: RE: problem using firefox REST tool with archetype > >> > >> Many thanks, very much appreciated. > >> > >> Mark > >> > >> -----Original Message----- > >> From: Dan Haywood [mailto:[email protected]] > >> Sent: Friday, January 25, 2013 9:16 AM > >> To: [email protected] > >> Cc: dev > >> Subject: Re: problem using firefox REST tool with archetype > >> > >> Glad you are now going, Mark. > >> > >> Nevertheless, I've raised ISIS-318 because this should have returned a > 400, > >> not a 500. > >> > >> fyi, although we've put out RO Viewer 1.0.0, do note that it doesn't yet > >> implement Restful Objects spec 1.0.0. And it's new code, so there are > >> bound > >> to be some rough issues. > >> > >> Jeroen is probably the expert in terms of using it from a client-side > >> perspective; on the project we're working on together, he's using the RO > >> API > >> as a way to migrate all the data from an old system onto the new app. > >> So it is getting a good workout, but in a fairly narrow way. > >> > >> To your question about regression tests, there aren't really any. Which > >> isn't good enough, I know; but when I was writing that code I was also > >> trying to keep up with Richard and Stef who were doing the .NET impl, as > >> well as write the RO spec at the same time... I took some corners. One > or > >> two people on the dev mailing list have offered to backfill these tests, > >> but > >> that was a while ago and there's been no contributions, so I suspect I > may > >> need to get round to it myself. > >> > >> In the meantime, if you do hit any showstoppers, I'll certainly do my > best > >> to resolve them, though you may need to build the code from source for > >> expediency's sake. > >> > >> Cheers > >> Dan > >> > >> On 25 January 2013 16:52, Mark Wood-Patrick <[email protected]> > >> wrote: > >> > >> > Actually that content worked, > >> > > >> > Many thanks > >> > > >> > Very much appreciated > >> > > >> > Mark > >> > > >> > -----Original Message----- > >> > From: Jeroen van der Wal [mailto:[email protected]] > >> > Sent: Friday, January 25, 2013 8:01 AM > >> > To: [email protected] > >> > Subject: Re: problem using firefox REST tool with archetype > >> > > >> > Hi Mark, perhaps you could share the raw respones body which shows the > >> > stacktrace. > >> > > >> > Futhermore, I've tested with > >> > > >> > { > >> > "description": "Eat Seaweed", > >> > "category": "Other", > >> > "dueBy": "20130123T000000000" > >> > } > >> > > >> > and that works fine. > >> > > >> > > >> > > >> > > >> > > >> > On Fri, Jan 25, 2013 at 4:46 PM, Mark Wood-Patrick > >> > <[email protected]>wrote: > >> > > >> > > Anyone know what's going on here? > >> > > > >> > > This is currently blocking for me. Does this work for other folks? > >> > > > >> > > What regression tests do we have to verify that this should work? > >> > > > >> > > Mark > >> > > > >> > > -----Original Message----- > >> > > From: Mark Wood-Patrick [mailto:[email protected]] > >> > > Sent: Thursday, January 24, 2013 11:53 AM > >> > > To: [email protected] > >> > > Subject: RE: problem using firefox REST tool with archetype > >> > > > >> > > No I got a Status Code: 500 Server Error > >> > > > >> > > Changing the capitalization as you suggested did not help > >> > > > >> > > Are you able to repro the issue or does it work for you? > >> > > > >> > > Mark > >> > > > >> > > -----Original Message----- > >> > > From: Dan Haywood [mailto:[email protected]] > >> > > Sent: Thursday, January 24, 2013 9:55 AM > >> > > To: [email protected] > >> > > Subject: Re: problem using firefox REST tool with archetype > >> > > > >> > > Hi Mark, > >> > > > >> > > Just looking at the code, the Category enum is defined as: > >> > > > >> > > public static enum Category { > >> > > Professional, Domestic, Other; > >> > > } > >> > > > >> > > So try "Other" instead of "OTHER". > >> > > > >> > > Did you get a 400 response code (you should have)? > >> > > > >> > > Let me know... > >> > > Dan > >> > > > >> > > On 24 January 2013 17:16, Mark Wood-Patrick > >> > > <[email protected]> > >> > > wrote: > >> > > > >> > > > I was trying to post: > >> > > > > >> > > > { > >> > > > "description": "Eat Seaweed", > >> > > > "category": "OTHER", > >> > > > "dueBy": "Jan 23, 2013" > >> > > > } > >> > > > > >> > > > To an instance of the archetype using URL: > >> > > > > >> > > > > >> > > > > http://l-sim-15-165:8080/restful/objects/objstore.jdo.todo.ToDoIte > >> > > > ms > >> > > > Jd > >> > > > o:1/actions/newToDo/invoke > >> > > > > >> > > > using the Firefox REST tool with current archetype > >> > > > > >> > > > And I got: > >> > > > > >> > > > { > >> > > > "message": "Unknown enum constant 'OTHER'", > >> > > > "stackTrace": [ > >> > > > > >> > > > "org.apache.isis.core.progmodel.facets.object.choices.enums.EnumVa > >> > > > lu eS > >> > > > emanticsProvider.doParse(EnumValueSemanticsProvider.java:63)", > >> > > > > >> > > > "org.apache.isis.core.progmodel.facets.object.choices.enums.EnumVa > >> > > > lu eS > >> > > > emanticsProvider.doRestore(EnumValueSemanticsProvider.java:73)", > >> > > > > >> > > > "org.apache.isis.core.progmodel.facets.object.choices.enums.EnumVa > >> > > > lu eS > >> > > > emanticsProvider.doRestore(EnumValueSemanticsProvider.java:32)", > >> > > > > >> > > > "org.apache.isis.core.progmodel.facets.object.value.ValueSemantics > >> > > > Pr > >> > > > ov > >> > > > iderAndFacetAbstract.fromEncodedString(ValueSemanticsProviderAndFa > >> > > > ce > >> > > > tA > >> > > > bstract.java:261)", > >> > > > > >> > > > "org.apache.isis.core.progmodel.facets.object.encodeable.Encodable > >> > > > Fa > >> > > > ce > >> > > > tUsingEncoderDecoder.fromEncodedString(EncodableFacetUsingEncoderD > >> > > > ec > >> > > > od > >> > > > er.java:60)", > >> > > > > >> > > > > >> "org.apache.isis.viewer.restfulobjects.viewer.resources.domainobjects. > >> > > > JsonValueEncoder.asAdapter(JsonValueEncoder.java:163)", > >> > > > > >> > > > > >> "org.apache.isis.viewer.restfulobjects.viewer.resources.domainobjects. > >> > > > DomainResourceHelper.objectAdapterFor(DomainResourceHelper.java:33 > >> > > > 2) > >> > > > ", > >> > > > > >> > > > > >> "org.apache.isis.viewer.restfulobjects.viewer.resources.domainobjects. > >> > > > DomainResourceHelper.parseArguments(DomainResourceHelper.java:476) > >> > > > ", > >> > > > > >> > > > > >> "org.apache.isis.viewer.restfulobjects.viewer.resources.domainobjects. > >> > > > DomainResourceHelper.parseArguments(DomainResourceHelper.java:463) > >> > > > ", > >> > > > > >> > > > > >> "org.apache.isis.viewer.restfulobjects.viewer.resources.domainobjects. > >> > > > > DomainResourceHelper.invokeActionUsingAdapters(DomainResourceHelper. > >> > > > ja > >> > > > va:270)", > >> > > > > >> > > > > >> "org.apache.isis.viewer.restfulobjects.viewer.resources.domainobjects. > >> > > > DomainResourceHelper.invokeAction(DomainResourceHelper.java:265)", > >> > > > > >> > > > > >> > > > >> > > > "org.apache.isis.viewer.restfulobjects.viewer.resources.domainobjects. > >> > > Domain > >> > > > >> > > ObjectResourceServerside.invokeAction(DomainObjectResourceServerside > >> > > .j > >> > > ava:40 > >> > > 7)", > >> > > > "sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)", > >> > > > > >> > > > > >> "sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. > >> > > > java:57)", > >> > > > > >> > > > > >> > > > >> > > "sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcc > >> > > es > >> > > sorImp > >> > > l.java:43)", > >> > > > "java.lang.reflect.Method.invoke(Method.java:601)", > >> > > > > >> > > > > >> "org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl. > >> > > > java:155)", > >> > > > > >> > > > > >> "org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod. > >> > > > java:257)", > >> > > > > >> > > > "org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java > >> > > > :2 > >> > > > 22 > >> > > > )", > >> > > > > >> > > > "org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java > >> > > > :2 > >> > > > 11 > >> > > > )", > >> > > > > >> > > > "org.jboss.resteasy.core.SynchronousDispatcher.getResponse(Synchro > >> > > > no > >> > > > us > >> > > > Dispatcher.java:525)", > >> > > > > >> > > > "org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousD > >> > > > is > >> > > > pa > >> > > > tcher.java:502)", > >> > > > > >> > > > "org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousD > >> > > > is > >> > > > pa > >> > > > tcher.java:119)", > >> > > > > >> > > > > >> "org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher. > >> > > > service(ServletContainerDispatcher.java:208)", > >> > > > > >> > > > Anyone know what I'm doing wrong? > >> > > > > >> > > > Mark Wood-Patrick > >> > > > Performance Infrastructure Lead > >> > > > e-mail: [email protected]<mailto:[email protected]> > >> > > > Building/Cube: SC B31.3084 > >> > > > Primary Office: please use cell # below (+1 408 486-2757) > >> > > > Cell: 408-627-5025 > >> > > > Fax: 408 486-4757 > >> > > > Mailstop/Mailbox: MS-10 / B307 > >> > > > > >> > > > (\__/) > >> > > > (='.'=) > >> > > > (")_(") > >> > > > > >> > > > > >> > > > > >> > > > > >> > > > > >> > > > ------------------------------------------------------------------ > >> > > > -- > >> > > > -- > >> > > > ------------- This email message is for the sole use of the > >> > > > intended > >> > > > recipient(s) and may contain confidential information. Any > >> > > > unauthorized review, use, disclosure or distribution is > prohibited. > >> > > > If you are not the intended recipient, please contact the sender > >> > > > by reply email and destroy all copies of the original message. > >> > > > > >> > > > ------------------------------------------------------------------ > >> > > > -- > >> > > > -- > >> > > > ------------- > >> > > > > >> > > > >> > > > >> > > > >> > > >> > > >> > >> >
