Andus,
Do you have an example of a non trivial template? How do you access EO  
attributes? I cannot find any example or documentation to get started.  
I am sure there was some at one point but I have downloaded the entire  
source tree and I cannot find it.
Thanks
Pierre
On Jul 23, 2004, at 15:41, Pierre Frisch wrote:
> Andus,
>
> We make extensive use of EOGenerator. Here is our template and the ant  
> task that we use. I would love to get rid of the dependance on  
> EOGenerator.
>
> Thanks
>
> Pierre
>
>     <!-- Generate EOs -->
>     <target name="generate.eos">
>         <exec dir="${project.dir}"  
> executable="/Developer/Tools/eogenerator" vmlauncher="false"  
> outputproperty="eogen.log" logError="true" newenvironment="true">
>             <arg value="-model" />
>             <arg file="${project.dir}/Resources/Catalog.eomodeld" />
>             <arg value="-refmodel" />
>             <arg  
> file="${project.dir}/../sPearWayAccess/Resources/Prototypes.eomodeld"  
> />
>             <arg value="-templatedir" />
>             <arg file="${project.dir}/../sPearWayAccess/Templates" />
>             <arg value="-destination" />
>             <arg file="${project.dir}/Sources/" />
>             <arg value="-packagedirs" />
>             <arg value="-verbose" />
>             <arg value="-java" />
>             <arg value="-define-copyrightYear" />
>             <arg value="1997-2004" />
>             <arg value="-define-copyrightBy" />
>             <arg value="sPearWay Ltd." />
>         </exec>
>         <echo message="EOGenerator ${eogen.log}" />
>     </target>
>
>
> <$comment
> EO Template for use by "eogenerator" based upon MiscMerge engine.
> You may customize this file to modify the templates generated
> by this tool.  See the MiscMerge documentation for a description
> of the parsing language.  The engine gets passed this file and an
> EOEntity to process, so the methods used must be ones that an
> EOEntity can respond to.
>
> BE SURE NOT TO INCLUDE DATES IN THIS FILE.  Since the "eogenerator"
> tool tries to compare the newly generated file with the old file,
> adding dates to this file will guarantee the old file gets
> overridden by the new file, forcing a recompilation of your EO.$>
> //
> // <$GEN_PREFIX$><$classNameWithoutPackage$>.java
> //
> // Created by eogenerator
> // DO NOT EDIT.  Make changes to <$classNameWithoutPackage$>.java  
> instead.
> // copyright <$copyrightYear$> <$copyrightBy$>
>
> <$foreach package classPackage do$>package <$package$>;
>
> <$endforeach do$>
> import com.webobjects.foundation.*;
> import com.webobjects.eocontrol.*;
> import java.math.BigDecimal;
> import java.util.*;
>
> public abstract class <$GEN_PREFIX$><$classNameWithoutPackage$>  
> extends <$if  
> hasParentEntity$><$javaParentClassName$><$else$>EOGenericRecord<$endif$ 
> > {
>     private static org.apache.log4j.Logger logger =  
> org.apache.log4j.Logger.getLogger(<$GEN_PREFIX$><$classNameWithoutPacka 
> ge$>.class);
>
> <$foreach attribute classAttributes..ortedNameArray do$>
>     public static final String  
> <$attribute.name.initialCapitalString$>Key =  
> "<$attribute.name$>";<$endforeach$>
> <$foreach rel classToOneRelationships..ortedNameArray do$>
>     public static final String <$rel.name.initialCapitalString$>Key =  
> "<$rel.name$>";<$endforeach$>
> <$foreach rel classToManyRelationships..ortedNameArray do$>
>     public static final String <$rel.name.initialCapitalString$>Key =  
> "<$rel.name$>";<$endforeach$>
>
>     public <$GEN_PREFIX$><$classNameWithoutPackage$>() {
>         super();
>     }
>
>
> /*
>     // If you add instance variables to store property values you
>     // should add empty implementions of the Serialization methods
>     // to avoid unnecessary overhead (the properties will be
>     // serialized for you in the superclass).
>     private void writeObject(java.io.ObjectOutputStream out) throws  
> java.io.IOException {
>     }
>
>     private void readObject(java.io.ObjectInputStream in) throws  
> java.io.IOException, java.lang.ClassNotFoundException {
>     }
> */
> <$foreach FetchSpec  
> javaBeautifiedFetchSpecificationDictionaries..ortedNameArray do$>
>     public static NSArray  
> objectsFor<$FetchSpec.niceName$>(EOEditingContext context<$foreach  
> Binding FetchSpec.bindings do2$>,  
> <$Binding.codeType$><$Binding.name$>Binding<$endforeach do2$>) {
>         EOFetchSpecification spec =  
> EOFetchSpecification.fetchSpecificationNamed("<$FetchSpec.fetchName$>", 
>  "<$name$>");
> <$if FetchSpec.bindings.count > 0$>
>         NSMutableDictionary bindings = new NSMutableDictionary();
> <$foreach Binding FetchSpec.bindings do2$>
>         if (<$Binding.name$>Binding != null)
>             bindings.setObjectForKey(<$Binding.name$>Binding,  
> "<$Binding.name$>");<$endforeach do2$>
>         spec = spec.fetchSpecificationWithQualifierBindings(bindings);
> <$endif$>
>         return context.objectsWithFetchSpecification(spec);
>     }
> <$endforeach do$>
> <$foreach Attribute classAttributes..ortedNameArray do$>
>     public <$Attribute.javaValueClassName$> <$Attribute.name$>() {
>         return  
> (<$Attribute.javaValueClassName$>)this.storedValueForKey("<$Attribute.n 
> ame$>");
>     }
>
>     public void  
> set<$Attribute.name.initialCapitalString$>(<$Attribute.javaValueClassNa 
> me$> value) {
>         this.takeStoredValueForKey(value, "<$Attribute.name$>");
>     }
>
>     public void  
> initialize<$Attribute.name.initialCapitalString$>(<$Attribute.javaValue 
> ClassName$> value) {
>         this.set<$Attribute.name.initialCapitalString$>(value);
>     }
> <$endforeach do$>
> <$foreach ToOneRelationship classToOneRelationships..ortedNameArray  
> do$>
>     public  
> <$ToOneRelationship.destinationEntity.referenceJavaClassName$>  
> <$ToOneRelationship.name$>() {
>         return  
> (<$ToOneRelationship.destinationEntity.referenceJavaClassName$>)this.st 
> oredValueForKey("<$ToOneRelationship.name$>");
>     }
>
>     public void  
> set<$ToOneRelationship.name.initialCapitalString$>(<$ToOneRelationship. 
> destinationEntity.referenceJavaClassName$> value) {
>         this.takeStoredValueForKey(value,  
> "<$ToOneRelationship.name$>");
>     }
>
>     public  
> <$ToOneRelationship.destinationEntity.referenceJavaClassName$>  
> <$ToOneRelationship.name$>Relationship() {
>         return  
> (<$ToOneRelationship.destinationEntity.referenceJavaClassName$>)this.st 
> oredValueForKey("<$ToOneRelationship.name$>");
>     }
>
>     public void  
> set<$ToOneRelationship.name.initialCapitalString$>Relationship(<$ToOneR 
> elationship.destinationEntity.referenceJavaClassName$> value) {
>         if (value == null) {
>              
> <$ToOneRelationship.destinationEntity.referenceJavaClassName$> object  
> = this.<$ToOneRelationship.name$>();
>             if (object != null)
>                  
> this.removeObjectFromBothSidesOfRelationshipWithKey(object,  
> "<$ToOneRelationship.name$>");
>         } else {
>             this.addObjectToBothSidesOfRelationshipWithKey(value,  
> "<$ToOneRelationship.name$>");
>         }
>     }
>
>     public void  
> initialize<$ToOneRelationship.name.initialCapitalString$>(<$ToOneRelati 
> onship.destinationEntity.referenceJavaClassName$> value) {
>          
> this.set<$ToOneRelationship.name.initialCapitalString$>Relationship(val 
> ue);
>     }
> <$endforeach do$>
> <$foreach ToManyRelationship classToManyRelationships..ortedNameArray  
> do$>
>     public NSArray <$ToManyRelationship.name$>() {
>         return  
> (NSArray)this.storedValueForKey("<$ToManyRelationship.name$>");
>     }
>
>     public void  
> set<$ToManyRelationship.name.initialCapitalString$>(NSArray value) {
>         this.takeStoredValueForKey(value,  
> "<$ToManyRelationship.name$>");
>     }
>
>     public void  
> addTo<$ToManyRelationship.name.initialCapitalString$>(<$ToManyRelations 
> hip.destinationEntity.referenceJavaClassName$> object) {
>         if (logger.isDebugEnabled()) {
>             if ( (this.editingContext() != null) && (object != null)  
> && ( ! this.editingContext().equals(object.editingContext()) ) ) {
>                 try {
>                     throw new Exception("WrongEdidtingContext");
>                 } catch(Exception exception) {
>                      
> logger.warn("addTo<$ToManyRelationship.name.initialCapitalString$>  
> exception " , exception);
>                 }
>             }
>         }
>         this.includeObjectIntoPropertyWithKey(object,  
> "<$ToManyRelationship.name$>");
>     }
>
>     public void  
> removeFrom<$ToManyRelationship.name.initialCapitalString$>(<$ToManyRela 
> tionship.destinationEntity.referenceJavaClassName$> object) {
>         this.excludeObjectFromPropertyWithKey(object,  
> "<$ToManyRelationship.name$>");
>     }
>
>     public void  
> addTo<$ToManyRelationship.name.initialCapitalString$>Relationship(<$ToM 
> anyRelationship.destinationEntity.referenceJavaClassName$> object) {
>         this.addObjectToBothSidesOfRelationshipWithKey(object,  
> "<$ToManyRelationship.name$>");
>     }
>
>     public void  
> removeFrom<$ToManyRelationship.name.initialCapitalString$>Relationship( 
> <$ToManyRelationship.destinationEntity.referenceJavaClassName$>  
> object) {
>         this.removeObjectFromBothSidesOfRelationshipWithKey(object,  
> "<$ToManyRelationship.name$>");
>     }
>
>     public  
> <$ToManyRelationship.destinationEntity.referenceJavaClassName$>  
> create<$ToManyRelationship.name.initialCapitalString$>Relationship() {
>         EOClassDescription classDescription =  
> EOClassDescription.classDescriptionForEntityName("<$ToManyRelationship. 
> destinationEntity.name$>");
>         EOEnterpriseObject object =  
> classDescription.createInstanceWithEditingContext(this.editingContext() 
> , null);
>         this.editingContext().insertObject(object);
>         this.addObjectToBothSidesOfRelationshipWithKey(object,  
> "<$ToManyRelationship.name$>");
>         return  
> (<$ToManyRelationship.destinationEntity.referenceJavaClassName$>)object 
> ;
>     }
>
>     public void  
> delete<$ToManyRelationship.name.initialCapitalString$>Relationship(<$To 
> ManyRelationship.destinationEntity.referenceJavaClassName$> object) {
>         // DeleteRuleNullify = 0;
>         // DeleteRuleCascade = 1;
>         // DeleteRuleDeny = 2;
>         // DeleteRuleNoAction = 3;
>         <$if ToManyRelationship.deleteRule != 2$>
>         this.removeObjectFromBothSidesOfRelationshipWithKey(object,  
> "<$ToManyRelationship.name$>");<$if ToManyRelationship.deleteRule ==  
> 1$>
>         // Cascade delete rule
>         this.editingContext().deleteObject(object);<$else$><$if  
> ToManyRelationship.ownsDestination$>
>         // Own destination delete rule
>         this.editingContext().deleteObject(object);<$endif$><$endif$>
>         <$else$>
>         // Deny delete rule
>         <$endif$>
>     }
>
>     public void  
> deleteAll<$ToManyRelationship.name.initialCapitalString$>Relationships( 
> ) {
>         for ( Iterator objects =  
> this.<$ToManyRelationship.name$>().vector().iterator();  
> objects.hasNext(); )
>              
> this.delete<$ToManyRelationship.name.initialCapitalString$>Relationship 
> ((<$ToManyRelationship.destinationEntity.referenceJavaClassName$>)objec 
> ts.next());
>     }
>
>     public void  
> initialize<$ToManyRelationship.name.initialCapitalString$>(NSArray  
> value) {
>          
> this.set<$ToManyRelationship.name.initialCapitalString$>(value);
>     }
>
>     public void  
> initialize<$ToManyRelationship.name.initialCapitalString$>(<$ToManyRela 
> tionship.destinationEntity.referenceJavaClassName$> value) {
>          
> this.addTo<$ToManyRelationship.name.initialCapitalString$>Relationship( 
> value);
>     }
> <$endforeach do$>}
>
>
>
>
>
> On Jul 23, 2004, at 15:22, Andrus Adamchik wrote:
>
>> Hi Pierre,
>>
>> On Jul 23, 2004, at 5:40 PM, Pierre Frisch wrote:
>>> The last time I looked at WOGen it was a lot less flexible than  
>>> EOGenerator.
>>
>>> Can you parse the same template files?
>>
>> The same - no, but it is based on Velocity templates that are very  
>> flexible. Basically they are as flexible and dynamic as the API  
>> provided by Java objects that sit in the template "context" during  
>> parsing. "Context" objects usually limit what you can and can't  
>> access, otherwise Velocity scripting language is generic, powerful  
>> and rather well documented.
>>
>> BTW, if you have any specifics on what's missing, please open a  
>> feature request via JIRA. Ulrich, please assign any such issues to  
>> me.
>>
>> Andrus
>>
>>
This archive was generated by hypermail 2.0.0 : Sat Jul 24 2004 - 10:46:10 EDT