Changes for page EOF-Using EOF-EOGenerator

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

From version 27.1
edited by Quinton Dolan
on 2007/07/09 06:52
Change comment: There is no comment for this version
To version 13.1
edited by smmccraw
on 2007/07/08 09:44
Change comment: There is no comment for this version

Summary

Details

Page properties
Author
... ... @@ -1,1 +1,1 @@
1 -XWiki.qdolan
1 +XWiki.smmccraw
Content
... ... @@ -1,8 +6,3 @@
1 -|=Contents
2 -|
3 -
4 -{{toc style="disc" minLevel="2"}}{{/toc}}
5 -
6 6  == Overview ==
7 7  
8 8  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.
... ... @@ -26,8 +26,7 @@
26 26  
27 27  {{panel}}
28 28  
29 -eogenerator -model /path/to/model/YourModel.eomodeld -destination /path/to/source/folder
30 - -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
31 31  
32 32  {{/panel}}
33 33  
... ... @@ -51,7 +51,7 @@
51 51  
52 52  Allow setting nulls on a to-one relationship (and turn it into a remove). Note, this is also included in Jonathan Rentzsch's templates.
53 53  
54 -{{code}}
48 +{{panel}}
55 55  
56 56   public void save<$ToOneRelationship.name.initialCapitalString$>(<$ToOneRelationship.destinationEntity.referenceJavaClassName$> value)
57 57   {
... ... @@ -67,13 +67,13 @@
67 67   }
68 68   }
69 69  
70 -{{/code}}
64 +{{/panel}}
71 71  
72 72  === Chuck Hill ===
73 73  
74 74  Return the list of changes between the current EO and the last committed version of the EO:
75 75  
76 -{{code}}
70 +{{panel}}
77 77  
78 78   public NSDictionary changedProperties() {
79 79   NSDictionary commitedValues = editingContext().committedSnapshotForObject(this);
... ... @@ -80,7 +80,7 @@
80 80   return changesFromSnapshot(commitedValues);
81 81   }
82 82  
83 -{{/code}}
77 +{{/panel}}
84 84  
85 85  === Jonathan Rentzsch ===
86 86  
... ... @@ -93,22 +93,32 @@
93 93  Constants for all attributes and relationships. This allows compile time error checking in situations like
94 94  addObjecttoBothSidesOfRelationshipWithKey(myObject, Person.TO//MANY//Children)
95 95  
96 -{{code}}
90 +{{panel}}
97 97  
98 98   <$foreach attribute classAttributes.@reversedArray do$>
99 99   public static final String ATTRIBUTE_<$attribute.name$> = "<$attribute.name$>";<$endforeach do$>
100 100  
95 +{{/panel}}
96 +
101 101   <$foreach ToOneRelationship classToOneRelationships.@reversedArray do$>
98 +
99 +{{panel}}
100 +
102 102   public static final String TO_ONE_<$ToOneRelationship.name$> = "<$ToOneRelationship.name$>";<$endforeach do$>
103 103  
103 +{{/panel}}
104 +
104 104   <$foreach ToManyRelationship classToManyRelationships.@reversedArray do$>
106 +
107 +{{panel}}
108 +
105 105   public static final String TO_MANY_<$ToManyRelationship.name$> = "<$ToManyRelationship.name$>";<$endforeach do$>
106 106  
107 -{{/code}}
111 +{{/panel}}
108 108  
109 109  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".
110 110  
111 -{{code}}
115 +{{panel}}
112 112  
113 113   <$if attribute.userInfo.usage h1. booleanFlag $> // boolean accessors
114 114   public void <$attribute.userInfo.setterName$>(boolean newBoolean) {
... ... @@ -131,111 +131,69 @@
131 131   }
132 132   <$endif$>
133 133  
134 -{{/code}}
138 +{{/panel}}
135 135  
136 136  === Mike Schrag ===
137 137  
138 138  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)~://
139 139  
140 -{{code}}
144 +{{panel}}
141 141  
142 142   public static final String ENTITY_NAME = "<$name$>";
143 143  
144 -{{/code}}
148 +{{/panel}}
145 145  
146 146  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):
147 147  
148 -{{code}}
152 +{{panel}}
149 149  
150 - public static <$classNameWithoutPackage$> create<$classNameWithoutPackage$>(EOEditingContext _editingContext<
151 - $foreach Attribute classAttributes.@sortedNameArray do$><
152 - $if !Attribute.allowsNull$>, <$Attribute.javaValueClassName$> _<$Attribute.name$><$endif$><
153 - $endforeach do$><
154 - $foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><
155 - $if ToOneRelationship.isMandatory$>, <$ToOneRelationship.destinationEntity.referenceJavaClassName$> _<$ToOneRelationship.name$><$endif$><
156 - $endforeach do$>) {
157 - <$classNameWithoutPackage$> eoObject = (<$classNameWithoutPackage$>)EOUtilities.createAndInsertInstance(_editingContext,
158 - <$GEN_PREFIX$><$classNameWithoutPackage$>.ENTITY_NAME);<
159 - $foreach Attribute classAttributes.@sortedNameArray do$><
160 - $if !Attribute.allowsNull$>
161 - eoObject.set<$Attribute.name.initialCapitalString$>(_<$Attribute.name$>);<
162 - $endif$><
163 - $endforeach do$><
164 - $foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><
165 - $if ToOneRelationship.isMandatory$>
166 - eoObject.set<$ToOneRelationship.name.initialCapitalString$>Relationship(_<$ToOneRelationship.name$>);<
167 - $endif$><
168 - $endforeach do$>
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$>
169 169   return eoObject;
170 170   }
171 171  
172 -{{/code}}
161 +{{/panel}}
173 173  
174 174  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):
175 175  
176 -{{code}}
165 +{{panel}}
177 177  
178 -public static <$classNameWithoutPackage$> create<$classNameWithoutPackage$>(EOEditingContext editingContext<
179 - $foreach Attribute classAttributes.@sortedNameArray do$><
180 - $if !Attribute.allowsNull$>, <$Attribute.javaValueClassName$> <$Attribute.name$><$endif$><
181 - $endforeach do$><
182 - $foreach Attribute parentEntity.classAttributes.@sortedNameArray do$><
183 - $if !Attribute.allowsNull$><$set RestrictingQualifierKey = false$><
184 - $foreach QualifierKey restrictingQualifier.allQualifierKeys do$><
185 - $if Attribute.name = QualifierKey$><$set RestrictingQualifierKey = true$><$endif$><
186 - $endforeach do$><$if RestrictingQualifierKey = false$>, <$Attribute.javaValueClassName$> <$Attribute.name$><$endif$><
187 - $endif$><
188 - $endforeach do$><
189 - $foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><
190 - $if ToOneRelationship.isMandatory$>, <$ToOneRelationship.destinationEntity.referenceJavaClassName$> <$ToOneRelationship.name$><$endif$><
191 - $endforeach do$><
192 - $foreach ToOneRelationship parentEntity.classToOneRelationships.@sortedNameArray do$><
193 - $if ToOneRelationship.isMandatory$>, <$ToOneRelationship.destinationEntity.referenceJavaClassName$> <$ToOneRelationship.name$><$endif$><
194 - $endforeach do$>) {
195 - <$classNameWithoutPackage$> eoObject = (<$classNameWithoutPackage$>)EOUtilities.createAndInsertInstance(editingContext, <$GEN_PREFIX$><$classNameWithoutPackage$>.ENTITY_NAME);<
196 - $foreach Attribute classAttributes.@sortedNameArray do$><
197 - $if !Attribute.allowsNull$>
198 - eoObject.set<$Attribute.name.initialCapitalString$>(<$Attribute.name$>);<
199 - $endif$><
200 - $endforeach do$><
201 - $foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><
202 - $if ToOneRelationship.isMandatory$>
203 - eoObject.set<$ToOneRelationship.name.initialCapitalString$>Relationship(<$ToOneRelationship.name$>);<
204 - $endif$><
205 - $endforeach do$><
206 - $foreach Attribute parentEntity.classAttributes.@sortedNameArray do$><
207 - $if !Attribute.allowsNull$><$set RestrictingQualifierKey = false$><
208 - $foreach QualifierKey restrictingQualifier.allQualifierKeys do$><
209 - $if Attribute.name = QualifierKey$><$set RestrictingQualifierKey = true$><$endif$><
210 - $endforeach do$><
211 - $if RestrictingQualifierKey = false$>
212 - eoObject.set<$Attribute.name.initialCapitalString$>(<$Attribute.name$>);<
213 - $endif$><
214 - $endif$><
215 - $endforeach do$><
216 - $foreach ToOneRelationship parentEntity.classToOneRelationships.@sortedNameArray do$><
217 - $if ToOneRelationship.isMandatory$>
218 - eoObject.set<$ToOneRelationship.name.initialCapitalString$>Relationship(<$ToOneRelationship.name$>);<
219 - $endif$><
220 - $endforeach do$>
221 - return eoObject;
222 -}
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 + }
223 223  
224 -{{/code}}
176 +{{/panel}}
225 225  
226 226  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:
227 227  
228 -{{code}}
180 +{{panel}}
229 229  
230 230   public static NSArray fetchAll<$classNameWithoutPackage$>s(EOEditingContext _editingContext) {
231 231   return <$GEN_PREFIX$><$classNameWithoutPackage$>.fetchAll<$classNameWithoutPackage$>s(_editingContext, null);
232 232   }
233 233  
234 - public static NSArray fetchAll<$classNameWithoutPackage$>s(EOEditingContext _editingContext, NSArray _sortOrderings) {
186 +{{/panel}}
187 +
188 + public static NSArray fetchAll<$classNameWithoutPackage$>s(EOEditingContext //editingContext, NSArray //sortOrderings) {
189 +
190 +{{panel}}
191 +
235 235   return <$GEN_PREFIX$><$classNameWithoutPackage$>.fetch<$classNameWithoutPackage$>s(_editingContext, null, _sortOrderings);
236 236   }
237 237  
238 - public static NSArray fetch<$classNameWithoutPackage$>s(EOEditingContext _editingContext, EOQualifier _qualifier, NSArray _sortOrderings) {
195 +{{/panel}}
196 +
197 + public static NSArray fetch<$classNameWithoutPackage$>s(EOEditingContext //editingContext, EOQualifier //qualifier, NSArray //sortOrderings) {//
198 +
199 +{{panel}}
200 +
239 239   EOFetchSpecification fetchSpec = new EOFetchSpecification(<$GEN_PREFIX$><$classNameWithoutPackage$>.ENTITY_NAME, _qualifier, _sortOrderings);
240 240   fetchSpec.setIsDeep(true);
241 241   NSArray eoObjects = _editingContext.objectsWithFetchSpecification(fetchSpec);
... ... @@ -242,11 +242,21 @@
242 242   return eoObjects;
243 243   }
244 244  
245 - public static <$classNameWithoutPackage$> fetch<$classNameWithoutPackage$>(EOEditingContext _editingContext, String _keyName, Object _value) {
207 +{{/panel}}
208 +
209 + public static <$classNameWithoutPackage$> fetch<$classNameWithoutPackage$>(EOEditingContext //editingContext, String //keyName, Object //value) {//
210 +
211 +{{panel}}
212 +
246 246   return <$GEN_PREFIX$><$classNameWithoutPackage$>.fetch<$classNameWithoutPackage$>(_editingContext, new EOKeyValueQualifier(_keyName, EOQualifier.QualifierOperatorEqual, _value));
247 247   }
248 248  
249 - public static <$classNameWithoutPackage$> fetch<$classNameWithoutPackage$>(EOEditingContext _editingContext, EOQualifier _qualifier) {
216 +{{/panel}}
217 +
218 + public static <$classNameWithoutPackage$> fetch<$classNameWithoutPackage$>(EOEditingContext //editingContext, EOQualifier //qualifier) {
219 +
220 +{{panel}}
221 +
250 250   NSArray eoObjects = <$GEN_PREFIX$><$classNameWithoutPackage$>.fetch<$classNameWithoutPackage$>s(_editingContext, _qualifier, null);
251 251   <$classNameWithoutPackage$> eoObject;
252 252   int count = eoObjects.count();
... ... @@ -266,7 +266,12 @@
266 266   return <$GEN_PREFIX$><$classNameWithoutPackage$>.fetchRequired<$classNameWithoutPackage$>(_editingContext, new EOKeyValueQualifier(_keyName, EOQualifier.QualifierOperatorEqual, _value));
267 267   }
268 268  
269 - public static <$classNameWithoutPackage$> fetchRequired<$classNameWithoutPackage$>(EOEditingContext _editingContext, EOQualifier _qualifier) {
241 +{{/panel}}
242 +
243 + public static <$classNameWithoutPackage$> fetchRequired<$classNameWithoutPackage$>(EOEditingContext //editingContext, EOQualifier //qualifier) {
244 +
245 +{{panel}}
246 +
270 270   <$classNameWithoutPackage$> eoObject = <$GEN_PREFIX$><$classNameWithoutPackage$>.fetch<$classNameWithoutPackage$>(_editingContext, _qualifier);
271 271   if (eoObject h1. null) {
272 272   throw new NoSuchElementException("There was no <$classNameWithoutPackage$> that matched the qualifier '" + _qualifier + "'.");
... ... @@ -274,25 +274,30 @@
274 274   return eoObject;
275 275   }
276 276  
277 -{{/code}}
254 +{{/panel}}
278 278  
279 279  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):
280 280  
281 -{{code}}
258 +{{panel}}
282 282  
283 283   public <$classNameWithoutPackage$> localInstanceOf<$classNameWithoutPackage$>(EOEditingContext _editingContext) {
284 284   return (<$classNameWithoutPackage$>)EOUtilities.localInstanceOfObject(_editingContext, this);
285 285   }
286 286  
287 - public static <$classNameWithoutPackage$> localInstanceOf<$classNameWithoutPackage$>(EOEditingContext _editingContext, <$classNameWithoutPackage$> _eo) {
264 +{{/panel}}
265 +
266 + public static <$classNameWithoutPackage$> localInstanceOf<$classNameWithoutPackage$>(EOEditingContext //editingContext, <$classNameWithoutPackage$> //eo) {
267 +
268 +{{panel}}
269 +
288 288   return (_eo null) ? null : (<$classNameWithoutPackage$>)EOUtilities.localInstanceOfObject(_editingContext, _eo);
289 289   }
290 290  
291 -{{/code}}
273 +{{/panel}}
292 292  
293 293  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:
294 294  
295 -{{code}}
277 +{{panel}}
296 296  
297 297   <$if !ToManyRelationship.inverseRelationship$>
298 298   public NSArray <$ToManyRelationship.name$>(EOQualifier qualifier) {
... ... @@ -314,8 +314,7 @@
314 314   <$if ToManyRelationship.inverseRelationship$>
315 315   if (fetch) {
316 316   EOQualifier fullQualifier;
317 - EOQualifier inverseQualifier = new EOKeyValueQualifier(<$ToManyRelationship.destination.className$>.
318 - <$ToManyRelationship.inverseRelationship.name.uppercaseUnderbarString$>_KEY, EOQualifier.QualifierOperatorEqual, this);
299 + EOQualifier inverseQualifier = new EOKeyValueQualifier(<$ToManyRelationship.destination.className$>.<$ToManyRelationship.inverseRelationship.name.uppercaseUnderbarString$>_KEY, EOQualifier.QualifierOperatorEqual, this);
319 319   if (qualifier == null) {
320 320   fullQualifier = inverseQualifier;
321 321   }
... ... @@ -342,35 +342,35 @@
342 342   return results;
343 343   }
344 344  
345 -{{/code}}
326 +{{/panel}}
346 346  
347 347  === John Huss ===
348 348  
349 349  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).//
350 350  
351 -{{code}}
332 +{{panel}}
352 352  
353 353   @SuppressWarnings("all")
354 354   public class _Invoice extends ERXGenericRecord {
355 355   }
356 356  
357 -{{/code}}
338 +{{/panel}}
358 358  
359 359  === Guido Neitzer ===
360 360  
361 361  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:
362 362  
363 -{{code}}
344 +{{panel}}
364 364  
365 -/**
366 - * Initialization of the instance while inserting it into an editing context
367 - */
368 -public void awakeFromInsertion (EOEditingContext editingContext) {
369 - super.awakeFromInsertion (editingContext);
370 - // initialize your object here
371 -}
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 + }
372 372  
373 -{{/code}}
354 +{{/panel}}
374 374  
375 375  This is from my JavaSubclassSourceTemplate.eotemplate
376 376