• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Webobjects design: multiple editing contexts
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Webobjects design: multiple editing contexts


  • Subject: Re: Webobjects design: multiple editing contexts
  • From: "Ricardo J. Parada" <email@hidden>
  • Date: Tue, 24 Mar 2009 10:24:26 -0400


On Mar 24, 2009, at 8:44 AM, Mark Wardle wrote:

When is the appropriate time to create an editingcontext - within a
component's constructor?

I do the same thing that Kieran suggested. My component has an editingContext() method which creates its own editing context.


If so, is it appropriate to pass a handle to
the editingcontext between components? For example, I have a UserEdit
component, that takes a User as a binding, and allows a user to edit
that user's details (subject to permissions).

You could do that as long as it's okay to mess with that editing context. But you could run into trouble, for example if you start editing your User object and then go somewhere else in the application, modify something and save then if the editing context is the same as the one used for these components then you may be saving the pending edits to the User object as a side effect and not exactly what the user would expect.


Soo... what I do is, if your UserEdit component is being handed the User object then it can simply get a copy of of the user object into the UserEdit's local editing context. I do this in a couple of different ways. Here's the one with less code:

/** Returns copy of user object in the UserEdit's local editing context */

public User user() {
	User user = (User) valueForBinding("user");
	return user.localInstanceIn(editingContext());
}

But you could have trouble here when they start editing the user object and then in a subsequent request you are handed in a different user object. All of a sudden you will start editing a different user object and you still have pending edits for the other user object.

So what I do is usually the version that involves a bit more code. I you are using project Wonder and your component inherits from ERXComponent then I usually do this in preAppendToResponse as follows :

public preAppendToResponse(WOResponse response, WOContext context) {
	// See what user object we're being handed in
	User aUser = (User) valueForBinding("user");

	// Convert it to our local editing context
	aUser.localInstanceIn(editingContext());

// If the user handed in is a different user from the one we're currently editing...

	if (user != aUser) ) {
		// ... then throw away any pending edits ...
		editingContext().revert();

		// ... and start using that user object
		user = aUser;
	}
}

public User user() {
	return user;
}


Now in the real world sometimes I get handed in a brand new object which was created in an external editing context and which is okay to mess with. For example let's say the parent component is the one that hands in the user object to the UserEdit component, and let's say that it was created like this prior to be handed in to UserEdit:


	EOEditingContext newEditingContext = ERXEC.newEditingContext();
	User aUser = new User();
	newEditingContext.insertObject(aUser);
	aUser.setFoo("foo");

Then your user edit is handed in this user object. In this case I assume that I can use that editing context and can have the following bit of code in preAppendToResponse():

	// See what user object we're being handed in
	User aUser = (User) valueForBinding("user");

// See if it's a new object and not exactly the one we're currently editing
if (aUser.isNewObject() && aUser != user) {
// use the externally created editing context as the local editing context
_editingContext = aUser.editingContext();
user = aUser;
}



Ok... so that's close to what I do normally. Not sure if it's the best way, but it seems to work for me.




What if I then have subcomponents that need to use the parent editing context? Is it appropriate to get the parent's editingcontext from the EO itself?


I document this for the component. For example, in your UserEdit component documentation I would mention that it uses its own editing context for editing unless the user object handed in is a new object that has not been saved to the database yet.


Once I start thinking about that, it looks like I'm writing lots of
code which is fairly repetitive and thought that there must be a
better way? Am I missing something obvious? I don't want to make
things highly modal, and I usually don't wish to preserve state
between components unless the user specifically requests it.

Yes I've thought about abstracting that code so I don't repeat it. The user i-var and binding could be called document.
And have that code in a superclass in preAppendToResponse(). Then the UserEdit component would extend that component. If your subclass has some code in preAppendToResponse then you would have to call super.preAppendToResponse() to make sure that logic is not skipped.



_______________________________________________ Do not post admin requests to the list. They will be ignored. Webobjects-dev mailing list (email@hidden) Help/Unsubscribe/Update your Subscription: This email sent to email@hidden
  • Follow-Ups:
    • Re: Webobjects design: multiple editing contexts
      • From: Mark Wardle <email@hidden>
    • Re: Webobjects design: multiple editing contexts
      • From: "Ricardo J. Parada" <email@hidden>
References: 
 >Webobjects design: multiple editing contexts (From: Mark Wardle <email@hidden>)

  • Prev by Date: Re: Webobjects design: multiple editing contexts
  • Next by Date: Webobjects design: primary keys with business meaning and allowing users to type them in!
  • Previous by thread: Re: Webobjects design: multiple editing contexts
  • Next by thread: Re: Webobjects design: multiple editing contexts
  • Index(es):
    • Date
    • Thread