I see that the root EOEnterpriseObjectClazz has a bunch of utility methods. For example, createAndInsertObject(), allObjects(), objectFromRawRow(), objectWithPrimaryKeyValue(), entityName(), entity(), createFetchSpecification(), objectCountWithQualifier(), etc.
And they are only defined once instead of each and every _Foo.java. On Dec 15, 2010, at 5:31 PM, David Holt wrote: > > On 2010-12-15, at 1:43 PM, Ricardo J. Parada wrote: > >> Thanks David. >> >> I noticed those __Clazz classes are then declared in the EOs as "public >> static class". I read the article below to figure what that meant. I'm >> still learning java I guess :-) >> >> http://www.javaworld.com/javaworld/javaqa/2001-08/01-qa-0817-static.html?page=1 >> >> So I'm trying to put it together. My Foo.java would have a clazz static >> variable referencing an instance of FooClazz. I can add methods to FooClazz >> in my Foo.java. >> So then FooClazz extends _FooClazz which could have some static methods. >> >> Are we saying that when I define my FooClazz methods I implement them by >> calling _FooClazz static methods or I can rewrite (i.e. override) if needed? >> >> I think I'm getting there... I ought to try it I guess. :-) > > I think the key to the use of Clazz in EOs is this line from the article > above: > > "Instead, instances of Justification act as constants that work with any > instance of Text. That's why we can get away with declaring Justification > static; it is independent of any specific Text instances." > > The methods inside whatever class (Clazz) you declare as static inside an EO > should be independent of any specific instance. You can call something like > People.clazz.currentUser located inside the Person class because it isn't > dependent on an instance of the Person class. The "currentUser" should return > the same result regardless of where you're calling the accessor from, whereas > something like a fullName() method can't be in the static member class > because it relies on a specific Person instance to be able to give you a > result. > > If you look at Bug.java, you'll see the static BugClazz contains things like > qualifiers, fetchSpecification and arrays of objects that shouldn't be > dependent on a specific instance of Bug. > > That's my understanding from reading the above article and watching the > errors that Eclipse gives me when I try to access a static method or variable > incorrectly. > > HTH, > > David > > >> >> >> >> On Dec 14, 2010, at 5:57 PM, David Holt wrote: >> >>> >>> On 2010-12-14, at 2:20 PM, Ricardo J. Parada wrote: >>> >>>> >>>> I've always wondered what that clazz thingy is. I'm still not sure. I >>>> read the javadoc on EOEnterpriseObjectClazz but still I don't quite get it. >>>> What is it? Maybe a little example will go a long way in understanding. >>>> :-) >>> >>> Hi Ricardo, >>> >>> You're not alone :-) >>> >>> To date I've been following BugTracker as an example to let me integrate >>> the pattern into my D2W applications to give me really fine control of what >>> objects I'm displaying in lists. >>> >>> I'm probably not understanding all that the Clazz pattern adds to the mix, >>> but using it has allowed me to start understanding Anjo's example >>> BusinessLogic in BugTracker and use the patterns I've found in my own code, >>> and I know that it has improved my D2W applications considerably. >>> >>> Here is an example I use inside DocumentClazz >>> >>> // Class methods go here >>> public static class DocumentClazz extends _Document._DocumentClazz { >>> >>> public EOFetchSpecification >>> fetchSpecificationForWorkingGroupDocumentsForDeletion(WorkingGroup wg) { >>> // selected working group, marked for Deletion >>> EOFetchSpecification fs = >>> Document.fetchSpec().qualify(Document.WORKING_GROUP.eq(wg).and(Document.IS_FOR_DELETION.eq(true))); >>> return fs; >>> } >>> } >>> >>> Now when I need to get a list of documents from an action triggered from a >>> navigation tab in my application I can use a method such as: >>> >>> // DELETION TAB >>> public WOComponent listDocumentsForDeletion() { >>> EOEditingContext ec = ERXEC.newEditingContext(); >>> ec.lock(); >>> WorkingGroup selectedWG = (WorkingGroup) WorkingGroup.wg(ec); >>> try { >>> EODatabaseDataSource ds = Document.clazz.newDatabaseDataSource(ec); >>> EOFetchSpecification fs = >>> Document.clazz.fetchSpecificationForWorkingGroupDocumentsForDeletion(selectedWG); >>> ds.setFetchSpecification(fs); >>> return (WOComponent) listPageNamed("ListDocumentsForDeletion", ds); >>> } >>> finally { >>> ec.unlock(); >>> } >>> >>> } >>> >>> David >>> >>> >>>> >>>> >>>> On Dec 14, 2010, at 5:15 PM, David Holt wrote: >>>> >>>>> Hi Anjo, >>>>> >>>>> On 2010-12-14, at 1:34 PM, Anjo Krank wrote: >>>>> >>>>>> There is a reason why stuff in BT is done as it is. >>>>>> >>>>>> I.e. there is a People.class.setCurrentUser(People user) and >>>>>> People.class.currentUser(EOEditingContext ec). Basically it puts all the >>>>>> thread storage code (including the key) in People, which is, like, good >>>>>> style? >>>>> >>>>> Absolutely agree. But it was difficult for me to wrap my head around >>>>> ERXThreadStorage AND Clazz pattern AND ERCoreBusinessLogic at the same >>>>> time. I was just trying to simplify it a little for Jesse. There is no >>>>> question that all three together are much more powerful and useful. >>>>> >>>>>> >>>>>> Also, ERXThreadStorage already handles EOs and faulting. >>>>> >>>>> >>>>> Thanks, >>>>> >>>>> David >>>>> >>>>>> >>>>>> Cheers, Anjo >>>>>> >>>>>> >>>>>> >>>>>> Am 14.12.2010 um 21:57 schrieb David Holt: >>>>>> >>>>>>> public static Person currentUser(EOEditingContext ec) { >>>>>>> Person currentUser = currentUser(); >>>>>>> if (currentUser != null && currentUser.editingContext() >>>>>>> != ec) { >>>>>>> EOEditingContext currentUserEc = >>>>>>> currentUser.editingContext(); >>>>>>> currentUserEc.lock(); >>>>>>> try { >>>>>>> Person localUser = (Person) >>>>>>> ERXEOControlUtilities >>>>>>> >>>>>>> .localInstanceOfObject(ec, currentUser); >>>>>>> currentUser = localUser; >>>>>>> } finally { >>>>>>> currentUserEc.unlock(); >>>>>>> } >>>>>>> } >>>>>>> return currentUser; >>>>>>> } >>>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> 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/programmingosx%40mac.com >>>>>> >>>>>> This email sent to [email protected] >>>>> >>>>> _______________________________________________ >>>>> 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/rparada%40mac.com >>>>> >>>>> This email sent to [email protected] >>>> >>> >> >
_______________________________________________ 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]
