Changes for page EOF-Using EOF-EOGenerator

Last modified by Pascal Robert on 2012/01/21 22:03

From version 30.1
edited by Pascal Robert
on 2012/01/21 22:03
Change comment: There is no comment for this version
To version 12.1
edited by smmccraw
on 2007/07/08 09:44
Change comment: There is no comment for this version

Summary

Details

Page properties
Title
... ... @@ -1,1 +1,1 @@
1 -EOF-Using EOF-EOGenerator
1 +Programming__WebObjects-EOF-Using EOF-EOGenerator
Author
... ... @@ -1,1 +1,1 @@
1 -XWiki.probert
1 +XWiki.smmccraw
Content
... ... @@ -1,22 +1,9 @@
1 -{{warning}}
2 -This is deprecated information!
3 -{{/warning}}
1 +== Overview ==
4 4  
5 -|= Contents
6 -| {{toc style="disc" minLevel="2"}}{{/toc}}
3 +If you've ever used EOModeler's Java source code generator, you know how much of a pain it can be when you make changes to your model objects and have to merge changes in later. One solution for this is to use [[EOGenerator>>http://www.rubicode.com/Software/EOGenerator/]], an application developed by Rubicode Software, which uses the Generation Gap pattern to create your Java files from your EOModels. EOGenerator produces TWO java files for each Entity rather than one. Take the example of a Person entity. The first java file is //Person.java, which contains all of the autogenerated methods. The second java file is Person.java, and Person extends //Person. The second file is where you place all of your customizations. Any time your model changes, only your //Xxx.java files are updated, and your customizations are left untouched. Additionally, EOGenerator allows for the creation of extensive custom templates for your files, which provides the ability to place convenience methods in your //Xxx.java files.
7 7  
8 -== Overview ==
5 +== Advantages ==
9 9  
10 -If you've ever used EOModeler's Java source code generator, you know how much of a pain it can be when you make changes to your model objects and have to merge changes in later. One solution for this is to use [[EOGenerator>>http://www.rubicode.com/Software/EOGenerator/]], an application developed by Rubicode Software, which uses the Generation Gap pattern to create your Java files from your EOModels. EOGenerator produces TWO java files for each Entity rather than one. Take the example of a Person entity. The first java file is Person.java, which contains all of the autogenerated methods. The second java file is Person.java, and Person extends Person. The second file is where you place all of your customizations. Any time your model changes, only your Xxx.java files are updated, and your customizations are left untouched. Additionally, EOGenerator allows for the creation of extensive custom templates for your files, which provides the ability to place convenience methods in your Xxx.java files.
11 -
12 -{{warning}}
13 -
14 -EOGenerator doesn't work on Mac OS X 10.5. You have to use [JavaEOGenerator|http://developer.apple.com/samplecode/JavaEOGenerator/] or [Velocity EOGenerator|WOL:Velocity EOGenerator (Veogen)].
15 -
16 -{{/warning}}
17 -
18 -== Advantages ==
19 -
20 20  There are several advantages to using EOGenerator over EOModeler's default Java file generation and merging with FileMerge.
21 21  
22 22  * EOGenerator uses the Generation Gap pattern, which provides a much cleaner separation of autogenerated vs customized code with no need to deal with merging at all. There are border cases with FileMerge that can cause you to deal with annoying conflicts.
... ... @@ -23,7 +23,7 @@
23 23  * EOGenerator uses the MiscMerge language for its templates. This allows you to extend the core templates with extensive customizations (see the EOGenerator Mods section below), better supporting your own custom development process and workflow.
24 24  * As David LaBer put it, "all the cool kids use it - and we all know looking cool is the **most** important criteria".
25 25  
26 -== How To Use It ==
13 +== How To Use It ==
27 27  
28 28  Kieran Kelleher has writtten an [[Introduction to EOGenerator>>http://homepage.mac.com/kelleherk/iblog/C1837526061/E1908382110/index.html]] on his blog.
29 29  
... ... @@ -34,34 +34,33 @@
34 34  
35 35  {{panel}}
36 36  
37 -eogenerator \-model /path/to/model/YourModel.eomodeld \-destination /path/to/source/folder
38 -\-subclassDestination /path/to/source/folder \-templatedir /path/to/EOGenerator/templates \-java \-packagedirs
24 + eogenerator -model /path/to/model/YourModel.eomodeld -destination /path/to/source/folder -subclassDestination /path/to/source/folder -templatedir /path/to/EOGenerator/templates -java -packagedirs
39 39  
40 40  {{/panel}}
41 41  
42 42  Voila. EOGenerator will spit out your Java files for you. Let's break down the commands you can pass in:
43 43  
44 -* define-EOGenericRecord <class>, allows you to specify the Person class's superclass. For instance, if you use Project Wonder, you would specify define-EOGenericRecord er.extensions.ERXGenericRecord
45 -* destination <path>, the folder that Person.java-style java files will be produced in (the non-editable files)
46 -* java, produce java files
47 -* javaTemplate <filename>, the name of the Java template to use inside of the template dir (//Person)//
48 -* model <path>, Passes in the path of a .eomodeld you would like to generate Java files for. You can actually include multiple model commands on the commandline
49 -* packagedirs, produce package directory for any package statements defined in your Java files (not necessary if you don't specify package names on your entities. By the way, you should specify packages on your entities :-) )
50 -* refmodel <path>, Passes in the path of an .eomodeld that is required for generating Java files, but that won't actually have Java files generated for it. For instance, you should refmodel any prototypes, or any models in other frameworks that you depend on
51 -* subclassDestination <path>, the folder that Person.java-style java files will be produced in (the editable files)
52 -* subclassJavaTemplate <filename>, the name of the Java subclass template to use inside of the template dir (Person)
53 -* templatedir <path>, the path to the folder that contains EOGenerator templates
54 -* verbose, turn on verbose output
30 +* --define--EOGenericRecord <class>, allows you to specify the //Person class's superclass. For instance, if you use Project Wonder, you would specify --define--EOGenericRecord er.extensions.ERXGenericRecord//
31 +* --destination <path>, the folder that //Person.java//--//style java files will be produced in (the non-editable files)//
32 +* --java, produce java files--
33 +* --javaTemplate <filename>, the name of the Java template to use inside of the template dir (//Person)//--
34 +* --model <path>, Passes in the path of a .eomodeld you would like to generate Java files for. You can actually include multiple --model commands on the commandline
35 +* --packagedirs, produce package directory for any package statements defined in your Java files (not necessary if you don't specify package names on your entities. By the way, you should specify packages on your entities :) )--
36 +* --refmodel <path>, Passes in the path of an .eomodeld that is required for generating Java files, but that won't actually have Java files generated for it. For instance, you should --refmodel any prototypes, or any models in other frameworks that you depend on
37 +* --subclassDestination <path>, the folder that Person.java--style java files will be produced in (the editable files)
38 +* --subclassJavaTemplate <filename>, the name of the Java subclass template to use inside of the template dir (Person)--
39 +* --templatedir <path>, the path to the folder that contains EOGenerator templates--
40 +* --verbose, turn on verbose output--
55 55  
56 -== Custom EOGenerator Mods ==
42 +== Custom EOGenerator Mods ==
57 57  
58 -=== Zak Burke ===
44 +=== Zak Burke ===
59 59  
60 60  Allow setting nulls on a to-one relationship (and turn it into a remove). Note, this is also included in Jonathan Rentzsch's templates.
61 61  
62 -{{code}}
48 +{{panel}}
63 63  
64 -public void save<$ToOneRelationship.name.initialCapitalString$>(<$ToOneRelationship.destinationEntity.referenceJavaClassName$> value)
50 + public void save<$ToOneRelationship.name.initialCapitalString$>(<$ToOneRelationship.destinationEntity.referenceJavaClassName$> value)
65 65   {
66 66   if (value == null)
67 67   {
... ... @@ -75,58 +75,68 @@
75 75   }
76 76   }
77 77  
78 -{{/code}}
64 +{{/panel}}
79 79  
80 -=== Chuck Hill ===
66 +=== Chuck Hill ===
81 81  
82 82  Return the list of changes between the current EO and the last committed version of the EO:
83 83  
84 -{{code}}
70 +{{panel}}
85 85  
86 -public NSDictionary changedProperties() {
72 + public NSDictionary changedProperties() {
87 87   NSDictionary commitedValues = editingContext().committedSnapshotForObject(this);
88 88   return changesFromSnapshot(commitedValues);
89 89   }
90 90  
91 -{{/code}}
77 +{{/panel}}
92 92  
93 -=== Jonathan Rentzsch ===
79 +=== Jonathan Rentzsch ===
94 94  
95 95  Jonathan Rentzsch has provided his base EOGenerator templates, which are a must-have:
96 96  
97 -[[http://rentzsch.com/share/eogenerator52templates.zip]]
83 +http:~/~/rentzsch.com/share/eogenerator52templates.zip
98 98  
99 -=== Markus Ruggiero ===
85 +=== Markus Ruggiero ===
100 100  
101 101  Constants for all attributes and relationships. This allows compile time error checking in situations like
102 102  addObjecttoBothSidesOfRelationshipWithKey(myObject, Person.TO//MANY//Children)
103 103  
104 -{{code}}
90 +{{panel}}
105 105  
106 -<$foreach attribute classAttributes.@reversedArray do$>
92 + <$foreach attribute classAttributes.@reversedArray do$>
107 107   public static final String ATTRIBUTE_<$attribute.name$> = "<$attribute.name$>";<$endforeach do$>
108 108  
95 +{{/panel}}
96 +
109 109   <$foreach ToOneRelationship classToOneRelationships.@reversedArray do$>
98 +
99 +{{panel}}
100 +
110 110   public static final String TO_ONE_<$ToOneRelationship.name$> = "<$ToOneRelationship.name$>";<$endforeach do$>
111 111  
103 +{{/panel}}
104 +
112 112   <$foreach ToManyRelationship classToManyRelationships.@reversedArray do$>
106 +
107 +{{panel}}
108 +
113 113   public static final String TO_MANY_<$ToManyRelationship.name$> = "<$ToManyRelationship.name$>";<$endforeach do$>
114 114  
115 -{{/code}}
111 +{{/panel}}
116 116  
117 117  We also make heavy use of the user info dictionary on entity and attribute level. Allows to generate customized methods and what not. One example is booleans that are stored in the DB as strings with values "true" and "false".
118 118  
119 -{{code}}
115 +{{panel}}
120 120  
121 -<$if attribute.userInfo.usage h1. booleanFlag $> // boolean accessors
117 + <$if attribute.userInfo.usage h1. booleanFlag $> // boolean accessors
122 122   public void <$attribute.userInfo.setterName$>(boolean newBoolean) {
123 123   set<$attribute.name.initialCapitalString$>(newBoolean ? "true" : "false");
124 124   }
125 -
121 +
126 126   public boolean <$attribute.userInfo.getterName$>() {
127 127   return "true".equals(<$attribute.name$>()) ? true : false;
128 128   }
129 -
125 +
130 130   // validation
131 131   public String validate<$attribute.name.initialCapitalString$>(String newValue) {
132 132   if ( newValue null ) {
... ... @@ -139,67 +139,69 @@
139 139   }
140 140   <$endif$>
141 141  
142 -{{/code}}
138 +{{/panel}}
143 143  
144 -=== Mike Schrag ===
140 +=== Mike Schrag ===
145 145  
146 146  Add a constant that represents the name of the entity so that you can refer to Person.ENTITY//NAME in fetches rather than the String (allows refactoring support in Eclipse)~://
147 147  
148 -{{code}}
144 +{{panel}}
149 149  
150 -public static final String ENTITY_NAME = "<$name$>";
146 + public static final String ENTITY_NAME = "<$name$>";
151 151  
152 -{{/code}}
148 +{{/panel}}
153 153  
154 154  Add a static factory method to your EO's ( Person createPerson(...) ) that shows you what required attributes and relationships are configured for you entity (attempts to provide a replacement "constructor" since EO constructors are empty):
155 155  
156 -{{code}}
152 +{{panel}}
157 157  
158 -public static <$classNameWithoutPackage$> create<$classNameWithoutPackage$>(EOEditingContext _editingContext<$foreach Attribute classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$>, <$Attribute.javaValueClassName$> _<$Attribute.name$><$endif$><$endforeach do$><$foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>, <$ToOneRelationship.destinationEntity.referenceJavaClassName$> _<$ToOneRelationship.name$><$endif$><$endforeach do$>) {
159 - <$classNameWithoutPackage$> eoObject = (<$classNameWithoutPackage$>)EOUtilities.createAndInsertInstance(_editingContext, <$GEN_PREFIX$><$classNameWithoutPackage$>.ENTITY_NAME);<$foreach Attribute classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$>
160 - eoObject.set<$Attribute.name.initialCapitalString$>(_<$Attribute.name$>);<$endif$><$endforeach do$><$foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>
161 - eoObject.set<$ToOneRelationship.name.initialCapitalString$>Relationship(_<$ToOneRelationship.name$>);<$endif$><$endforeach do$>
162 - return eoObject;
163 -}
154 + public static <$classNameWithoutPackage$> create<$classNameWithoutPackage$>(EOEditingContext _editingContext<$foreach Attribute classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$>, <$Attribute.javaValueClassName$> _<$Attribute.name$><$endif$><$endforeach do$><$foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>, <$ToOneRelationship.destinationEntity.referenceJavaClassName$> _<$ToOneRelationship.name$><$endif$><$endforeach do$>) {
155 + <$classNameWithoutPackage$> eoObject = (<$classNameWithoutPackage$>)EOUtilities.createAndInsertInstance(_editingContext, <$GEN_PREFIX$><$classNameWithoutPackage$>.ENTITY_NAME);<$foreach Attribute classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$>
156 + eoObject.set<$Attribute.name.initialCapitalString$>(_<$Attribute.name$>);<$endif$><$endforeach do$><$foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>
157 + eoObject.set<$ToOneRelationship.name.initialCapitalString$>Relationship(_<$ToOneRelationship.name$>);<$endif$><$endforeach do$>
158 + return eoObject;
159 + }
164 164  
165 -{{/code}}
161 +{{/panel}}
166 166  
167 167  Here's a little bitty fancier (read: nastier) version that also handles superclass mandatory attributes and fields (one level). It skips any attribute that is referenced in the restricting qualifier of your subclass (since you are probably going to set that in your awakeFromInsertion):
168 168  
169 -{{code}}
165 +{{panel}}
170 170  
171 -public static <$classNameWithoutPackage$> create<$classNameWithoutPackage$>(EOEditingContext editingContext<$foreach Attribute classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$>, <$Attribute.javaValueClassName$> <$Attribute.name$><$endif$><$endforeach do$><$foreach Attribute parentEntity.classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$><$set RestrictingQualifierKey = false$><$foreach QualifierKey restrictingQualifier.allQualifierKeys do$><$if Attribute.name = QualifierKey$><$set RestrictingQualifierKey = true$><$endif$><$endforeach do$><$if RestrictingQualifierKey = false$>, <$Attribute.javaValueClassName$> <$Attribute.name$><$endif$><$endif$><$endforeach do$><$foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>, <$ToOneRelationship.destinationEntity.referenceJavaClassName$> <$ToOneRelationship.name$><$endif$><$endforeach do$><$foreach ToOneRelationship parentEntity.classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>, <$ToOneRelationship.destinationEntity.referenceJavaClassName$> <$ToOneRelationship.name$><$endif$><$endforeach do$>) {
172 - <$classNameWithoutPackage$> eoObject = (<$classNameWithoutPackage$>)EOUtilities.createAndInsertInstance(editingContext, <$GEN_PREFIX$><$classNameWithoutPackage$>.ENTITY_NAME);<$foreach Attribute classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$>
173 - eoObject.set<$Attribute.name.initialCapitalString$>(<$Attribute.name$>);<$endif$><$endforeach do$><$foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>
174 - eoObject.set<$ToOneRelationship.name.initialCapitalString$>Relationship(<$ToOneRelationship.name$>);<$endif$><$endforeach do$><$foreach Attribute parentEntity.classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$><$set RestrictingQualifierKey = false$><$foreach QualifierKey restrictingQualifier.allQualifierKeys do$><$if Attribute.name = QualifierKey$><$set RestrictingQualifierKey = true$><$endif$><$endforeach do$><$if RestrictingQualifierKey = false$>
175 - eoObject.set<$Attribute.name.initialCapitalString$>(<$Attribute.name$>);<$endif$><$endif$><$endforeach do$><$foreach ToOneRelationship parentEntity.classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>
176 - eoObject.set<$ToOneRelationship.name.initialCapitalString$>Relationship(<$ToOneRelationship.name$>);<$endif$><$endforeach do$>
177 - return eoObject;
178 -}
167 + public static <$classNameWithoutPackage$> create<$classNameWithoutPackage$>(EOEditingContext editingContext<$foreach Attribute classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$>, <$Attribute.javaValueClassName$> <$Attribute.name$><$endif$><$endforeach do$><$foreach Attribute parentEntity.classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$><$set RestrictingQualifierKey = false$><$foreach QualifierKey restrictingQualifier.allQualifierKeys do$><$if Attribute.name = QualifierKey$><$set RestrictingQualifierKey = true$><$endif$><$endforeach do$><$if RestrictingQualifierKey = false$>, <$Attribute.javaValueClassName$> <$Attribute.name$><$endif$><$endif$><$endforeach do$><$foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>, <$ToOneRelationship.destinationEntity.referenceJavaClassName$> <$ToOneRelationship.name$><$endif$><$endforeach do$><$foreach ToOneRelationship parentEntity.classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>, <$ToOneRelationship.destinationEntity.referenceJavaClassName$> <$ToOneRelationship.name$><$endif$><$endforeach do$>) {
168 + <$classNameWithoutPackage$> eoObject = (<$classNameWithoutPackage$>)EOUtilities.createAndInsertInstance(editingContext, <$GEN_PREFIX$><$classNameWithoutPackage$>.ENTITY_NAME);<$foreach Attribute classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$>
169 + eoObject.set<$Attribute.name.initialCapitalString$>(<$Attribute.name$>);<$endif$><$endforeach do$><$foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>
170 + eoObject.set<$ToOneRelationship.name.initialCapitalString$>Relationship(<$ToOneRelationship.name$>);<$endif$><$endforeach do$><$foreach Attribute parentEntity.classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$><$set RestrictingQualifierKey = false$><$foreach QualifierKey restrictingQualifier.allQualifierKeys do$><$if Attribute.name = QualifierKey$><$set RestrictingQualifierKey = true$><$endif$><$endforeach do$><$if RestrictingQualifierKey = false$>
171 + eoObject.set<$Attribute.name.initialCapitalString$>(<$Attribute.name$>);<$endif$><$endif$><$endforeach do$><$foreach ToOneRelationship parentEntity.classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>
172 + eoObject.set<$ToOneRelationship.name.initialCapitalString$>Relationship(<$ToOneRelationship.name$>);<$endif$><$endforeach do$>
173 + return eoObject;
174 + }
179 179  
180 -{{/code}}
176 +{{/panel}}
181 181  
182 182  Add a bunch of convience fetch methods (fetchAllPersons, fetchRequiredPerson, and other variants). It's not smart about pluralization, so it's just going to put an "s" on the end of the entity name:
183 183  
184 -{{code}}
180 +{{panel}}
185 185  
186 -public static NSArray fetchAll<$classNameWithoutPackage$>s(EOEditingContext _editingContext) {
182 + public static NSArray fetchAll<$classNameWithoutPackage$>s(EOEditingContext _editingContext) {
187 187   return <$GEN_PREFIX$><$classNameWithoutPackage$>.fetchAll<$classNameWithoutPackage$>s(_editingContext, null);
188 188   }
189 189  
190 -{{/code}}
186 +{{/panel}}
191 191  
192 -{{code}}
188 + public static NSArray fetchAll<$classNameWithoutPackage$>s(EOEditingContext //editingContext, NSArray //sortOrderings) {
193 193  
194 -public static NSArray fetchAll<$classNameWithoutPackage$>s(EOEditingContext _editingContext, NSArray _sortOrderings) {
190 +{{panel}}
191 +
195 195   return <$GEN_PREFIX$><$classNameWithoutPackage$>.fetch<$classNameWithoutPackage$>s(_editingContext, null, _sortOrderings);
196 196   }
197 197  
198 -{{/code}}
195 +{{/panel}}
199 199  
200 -{{code}}
197 + public static NSArray fetch<$classNameWithoutPackage$>s(EOEditingContext //editingContext, EOQualifier //qualifier, NSArray //sortOrderings) {//
201 201  
202 -public static NSArray fetch<$classNameWithoutPackage$>s(EOEditingContext _editingContext, EOQualifier _qualifier, NSArray _sortOrderings) {
199 +{{panel}}
200 +
203 203   EOFetchSpecification fetchSpec = new EOFetchSpecification(<$GEN_PREFIX$><$classNameWithoutPackage$>.ENTITY_NAME, _qualifier, _sortOrderings);
204 204   fetchSpec.setIsDeep(true);
205 205   NSArray eoObjects = _editingContext.objectsWithFetchSpecification(fetchSpec);
... ... @@ -206,19 +206,21 @@
206 206   return eoObjects;
207 207   }
208 208  
209 -{{/code}}
207 +{{/panel}}
210 210  
211 -{{code}}
209 + public static <$classNameWithoutPackage$> fetch<$classNameWithoutPackage$>(EOEditingContext //editingContext, String //keyName, Object //value) {//
212 212  
213 -public static <$classNameWithoutPackage$> fetch<$classNameWithoutPackage$>(EOEditingContext _editingContext, String _keyName, Object _value) {
211 +{{panel}}
212 +
214 214   return <$GEN_PREFIX$><$classNameWithoutPackage$>.fetch<$classNameWithoutPackage$>(_editingContext, new EOKeyValueQualifier(_keyName, EOQualifier.QualifierOperatorEqual, _value));
215 215   }
216 216  
217 -{{/code}}
216 +{{/panel}}
218 218  
219 -{{code}}
218 + public static <$classNameWithoutPackage$> fetch<$classNameWithoutPackage$>(EOEditingContext //editingContext, EOQualifier //qualifier) {
220 220  
221 -public static <$classNameWithoutPackage$> fetch<$classNameWithoutPackage$>(EOEditingContext _editingContext, EOQualifier _qualifier) {
220 +{{panel}}
221 +
222 222   NSArray eoObjects = <$GEN_PREFIX$><$classNameWithoutPackage$>.fetch<$classNameWithoutPackage$>s(_editingContext, _qualifier, null);
223 223   <$classNameWithoutPackage$> eoObject;
224 224   int count = eoObjects.count();
... ... @@ -233,52 +233,50 @@
233 233   }
234 234   return eoObject;
235 235   }
236 -
237 -{{/code}}
238 -
239 -{{code}}
240 -
241 -public static <$classNameWithoutPackage$> fetchRequired<$classNameWithoutPackage$>(EOEditingContext _editingContext, String _keyName, Object _value) {
236 +
237 + public static <$classNameWithoutPackage$> fetchRequired<$classNameWithoutPackage$>(EOEditingContext _editingContext, String _keyName, Object _value) {
242 242   return <$GEN_PREFIX$><$classNameWithoutPackage$>.fetchRequired<$classNameWithoutPackage$>(_editingContext, new EOKeyValueQualifier(_keyName, EOQualifier.QualifierOperatorEqual, _value));
243 243   }
244 244  
245 -{{/code}}
241 +{{/panel}}
246 246  
247 -{{code}}
243 + public static <$classNameWithoutPackage$> fetchRequired<$classNameWithoutPackage$>(EOEditingContext //editingContext, EOQualifier //qualifier) {
248 248  
249 -public static <$classNameWithoutPackage$> fetchRequired<$classNameWithoutPackage$>(EOEditingContext _editingContext, EOQualifier _qualifier) {
245 +{{panel}}
246 +
250 250   <$classNameWithoutPackage$> eoObject = <$GEN_PREFIX$><$classNameWithoutPackage$>.fetch<$classNameWithoutPackage$>(_editingContext, _qualifier);
251 - if (eoObject == null) {
248 + if (eoObject h1. null) {
252 252   throw new NoSuchElementException("There was no <$classNameWithoutPackage$> that matched the qualifier '" + _qualifier + "'.");
253 253   }
254 254   return eoObject;
255 255   }
256 256  
257 -{{/code}}
254 +{{/panel}}
258 258  
259 259  Add methods for getting local instances of EO's. The static one is handy if you have a reference to an EO that might be null (it does a null check first):
260 260  
261 -{{code}}
258 +{{panel}}
262 262  
263 -public <$classNameWithoutPackage$> localInstanceOf<$classNameWithoutPackage$>(EOEditingContext _editingContext) {
260 + public <$classNameWithoutPackage$> localInstanceOf<$classNameWithoutPackage$>(EOEditingContext _editingContext) {
264 264   return (<$classNameWithoutPackage$>)EOUtilities.localInstanceOfObject(_editingContext, this);
265 265   }
266 266  
267 -{{/code}}
264 +{{/panel}}
268 268  
269 -{{code}}
266 + public static <$classNameWithoutPackage$> localInstanceOf<$classNameWithoutPackage$>(EOEditingContext //editingContext, <$classNameWithoutPackage$> //eo) {
270 270  
271 -public static <$classNameWithoutPackage$> localInstanceOf<$classNameWithoutPackage$>(EOEditingContext _editingContext, <$classNameWithoutPackage$> _eo) {
272 - return (_eo == null) ? null : (<$classNameWithoutPackage$>)EOUtilities.localInstanceOfObject(_editingContext, _eo);
268 +{{panel}}
269 +
270 + return (_eo null) ? null : (<$classNameWithoutPackage$>)EOUtilities.localInstanceOfObject(_editingContext, _eo);
273 273   }
274 274  
275 -{{/code}}
273 +{{/panel}}
276 276  
277 277  If you've ever wanted to be able to qualify a toMany relationship on your EO's, but sometimes you want to fetch them w/ a fetch spec, and sometimes you want to filter in-memory, you can use the following:
278 278  
279 -{{code}}
277 +{{panel}}
280 280  
281 -<$if !ToManyRelationship.inverseRelationship$>
279 + <$if !ToManyRelationship.inverseRelationship$>
282 282   public NSArray <$ToManyRelationship.name$>(EOQualifier qualifier) {
283 283   return <$ToManyRelationship.name$>(qualifier, null);
284 284   }
... ... @@ -287,19 +287,18 @@
287 287   public NSArray <$ToManyRelationship.name$>(EOQualifier qualifier) {
288 288   return <$ToManyRelationship.name$>(qualifier, null, false);
289 289   }
290 -
291 - public NSArray <$ToManyRelationship.name$>(EOQualifier qualifier, boolean fetch) {
288 +
289 + public NSArray <$ToManyRelationship.name$>(EOQualifier qualifier, boolean fetch) {
292 292   return <$ToManyRelationship.name$>(qualifier, null, fetch);
293 293   }
294 294   <$endif$>
295 -
293 +
296 296   public NSArray <$ToManyRelationship.name$>(EOQualifier qualifier, NSArray sortOrderings<$if ToManyRelationship.inverseRelationship$>, boolean fetch<$endif$>) {
297 297   NSArray results;
298 298   <$if ToManyRelationship.inverseRelationship$>
299 299   if (fetch) {
300 300   EOQualifier fullQualifier;
301 - EOQualifier inverseQualifier = new EOKeyValueQualifier(<$ToManyRelationship.destination.className$>.
302 - <$ToManyRelationship.inverseRelationship.name.uppercaseUnderbarString$>_KEY, EOQualifier.QualifierOperatorEqual, this);
299 + EOQualifier inverseQualifier = new EOKeyValueQualifier(<$ToManyRelationship.destination.className$>.<$ToManyRelationship.inverseRelationship.name.uppercaseUnderbarString$>_KEY, EOQualifier.QualifierOperatorEqual, this);
303 303   if (qualifier == null) {
304 304   fullQualifier = inverseQualifier;
305 305   }
... ... @@ -326,34 +326,36 @@
326 326   return results;
327 327   }
328 328  
329 -{{/code}}
326 +{{/panel}}
330 330  
331 -=== John Huss ===
328 +=== John Huss ===
332 332  
333 -I wanted to share a wonderful bit of knowledge I learned today. If you're using Java 1.5 you can add @SuppressWarnings("all") to the template for your EO base classes and eliminate annoying compiler messages (usually uneeded import statements).
330 +I wanted to share a wonderful bit of knowledge I learned today. If you're using Java 1.5 you can add @SuppressWarnings("all") to the template for your //EO base classes and eliminate annoying compiler messages (usually uneeded import statements).//
334 334  
335 -{{code}}
332 +{{panel}}
336 336  
337 -@SuppressWarnings("all")
334 + @SuppressWarnings("all")
338 338   public class _Invoice extends ERXGenericRecord {
339 339   }
340 340  
341 -{{/code}}
338 +{{/panel}}
342 342  
343 -=== Guido Neitzer ===
340 +=== Guido Neitzer ===
344 344  
345 345  Create awakeFromInsertion() and awakeFromFetch() in your EOGenerator template as a method stub that only calls super() and has a comment for "initialize your object here ...". You only have to put in the code at that place and can't possibly forget to call super(). Here is an example:
346 346  
347 -{{code}}
344 +{{panel}}
348 348  
349 -/**
350 - * Initialization of the instance while inserting it into an editing context
351 - */
352 -public void awakeFromInsertion (EOEditingContext editingContext) {
353 - super.awakeFromInsertion (editingContext);
354 - // initialize your object here
355 -}
346 + /**
347 + * Initialization of the instance while inserting it into an editing context
348 + */
349 + public void awakeFromInsertion (EOEditingContext editingContext) {
350 + super.awakeFromInsertion (editingContext);
351 + // initialize your object here
352 + }
356 356  
357 -{{/code}}
354 +{{/panel}}
358 358  
359 359  This is from my JavaSubclassSourceTemplate.eotemplate
357 +
358 +Category:WebObjects