Thanks.  That is a big help.  Hopefully I'll be able to get what I want done.  
As soon as my headache goes away.

Thanks again.

Andrew



On Mar 29, 2011, at 4:21 PM, Pascal Robert wrote:

> 
> Le 2011-03-29 à 16:03, Andrew Kinnie a écrit :
> 
>> Thanks for the tip on using create that way.  I didn't know you could do 
>> that.  In any event, that's the problem.  NoteType is basically a lookup 
>> table.  I would want to fetch an existing noteType based on some unique 
>> attribute, such as "typeName" (which ensure is unique in the EO class)  I 
>> don't want to create a new noteType, I want to create the intervening object 
>> (DeviceNoteType) which has a to-one to NoteType and a to-one to Device.  AND 
>> (here's the tough part - for me at least) I want to only create a new one if 
>> one doesn't already exist.  So I need to fetch first, and I want to fetch 
>> based on the value passed in for the name key
> 
> So you will do:
> 
>  new ERXRoute(NoteType.ENTITY_NAME, "/NoteType/{name:String}", 
> ERXRoute.Method.Get, NoteTypesController.class, "fetchByName");
> 
>  public WOActionResults fetchByNameAction() {
>    String typeName = routeObjectForKey("name");
>    NoteType type = NoteType.fetchNoteType(editingContext(), 
> User.NAME.eq(typeName));
>    return response(type, yourerxkeyfilter());
>  }
> 
> If fetchByNameAction didn't find an object, ERRest will return the HTTP code 
> 404, so your client can know that the object was not found, and call:
> 
>  new ERXRoute(NoteType.ENTITY_NAME, "/NoteType/", ERXRoute.Method.Post, 
> NoteTypesController.class, "create");  // If you called addDefaultRoutes for 
> the NoteType entity, that route already exist)
> 
>  public WOActionResults createAction() {
>    NoteType type = create(NoteType.ENTITY_NAME, yourerxkeyfilter());
>    editingContext().saveChanges();
>    return response(type, yourerxkeyfilter());
>  }
> 
> If you get a response with HTTP code in the 20x range, the object was created 
> and now you can create your DeviceNoteType with a route like this:
> 
>  new ERXRoute(DeviceNoteType.ENTITY_NAME, "/DeviceNoteType", 
> ERXRoute.Method.Post, DeviceNoteTypesController.class, "create");
> 
> When you call POST /cgi-bin/WebObjects/MyApp.woa/ra/DeviceNoteType, you will 
> have to pass the a Device and a NoteType object in JSON as the body of the 
> request.
> 
> I feel like I'm writing my WOWODC session in real-time :-P
> 
>> So I need to fetch on the passed in value from the json, get the correct 
>> NoteType at the other end of the many to many, check if there is an existing 
>> row in the join table for the device and noteType, and create a new one, 
>> only if the intervening object doesn't exist. If it does exist, I set it's 
>> status to active and return that, otherwise, I return the new one.
>> 
>> That's my theory at least.
>> 
>> 
>> 
>> On Mar 29, 2011, at 3:47 PM, Pascal Robert wrote:
>> 
>>> 
>>> Le 2011-03-29 à 15:31, Andrew Kinnie a écrit :
>>> 
>>>> Well, first I tried to simply create the intervening object manually, but 
>>>> then I realized I wanted to know if such an object already existed, so I 
>>>> was going to do a fetch, but as random client wouldn't know the primary 
>>>> key of the NoteType, I am not sure how to do that.  I could expose the 
>>>> primary key, but I'd much rather not.
>>>> 
>>>> Presumably, the client could simple call the curl commands to create the 
>>>> intervening object, then add the current object with a second line, but I 
>>>> wanted to be able to do this in the java itself so the client could do 
>>>> something like:
>>>> 
>>>> curl -X PUT -d "{noteType:{type:'NoteType', name:'Alert'}}" 
>>>> http://My-MacBook-Pro.local:9001/cgi-bin/WebObjects/MyApp.woa/ra/Device/1/addNoteType.json
>>>> 
>>>> Then I would get the device, get the NoteType represented by the 
>>>> routeObjectForKey("noteType") and set add the noteType to the relationship.
>>>> 
>>>>    public WOActionResults addNoteTypeAction() {
>>>>            Device device = Device();
>>>>            NoteType type = routeObjectForKey("noteType");
>>>>            // set the relationships and do whatever else
>>>>    ...
>>> 
>>> If you want to create a new NoteType to a Device, you should call the 
>>> create() method in addNoteTypeAction instead of routeObjectForKey, and set 
>>> the relation between the NoteType and the Device:
>>> 
>>> public WOActionResults addNodeTypeAction() {
>>> NoteType nodeType = create(NoteType.ENTITY_NAME, yourerxkeyfilter);
>>> Device device = routeObjectForKey("device");
>>> // set the relationship and call ec.saveObjects();
>>> return response(nodeType, yourerxkeyfilter);
>>> }
>>> 
>>> And your route:
>>> 
>>> requestHandler.addRoute(new ERXRoute(Device.ENTITY_NAME, 
>>> "/Device/{device:Device}/addNoteType", ERXRoute.Method.Put, 
>>> DevicesController.class, "addNoteType"));
>>> 
>>> This is untested, of course.
> 

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to