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]

Reply via email to