Changes for page EOF-Using EOF-EOGenerator

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

From version 29.1
edited by Quinton Dolan
on 2007/07/16 22:26
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,59 +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 bar="true"}}
152 +{{panel}}
149 149  
150 -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$>) {
151 - <$classNameWithoutPackage$> eoObject = (<$classNameWithoutPackage$>)EOUtilities.createAndInsertInstance(_editingContext, <$GEN_PREFIX$><$classNameWithoutPackage$>.ENTITY_NAME);<$foreach Attribute classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$>
152 - eoObject.set<$Attribute.name.initialCapitalString$>(_<$Attribute.name$>);<$endif$><$endforeach do$><$foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>
153 - eoObject.set<$ToOneRelationship.name.initialCapitalString$>Relationship(_<$ToOneRelationship.name$>);<$endif$><$endforeach do$>
154 - return eoObject;
155 -}
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 + }
156 156  
157 -{{/code}}
161 +{{/panel}}
158 158  
159 159  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):
160 160  
161 -{{code bar="true"}}
165 +{{panel}}
162 162  
163 -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$>) {
164 - <$classNameWithoutPackage$> eoObject = (<$classNameWithoutPackage$>)EOUtilities.createAndInsertInstance(editingContext, <$GEN_PREFIX$><$classNameWithoutPackage$>.ENTITY_NAME);<$foreach Attribute classAttributes.@sortedNameArray do$><$if !Attribute.allowsNull$>
165 - eoObject.set<$Attribute.name.initialCapitalString$>(<$Attribute.name$>);<$endif$><$endforeach do$><$foreach ToOneRelationship classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>
166 - 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$>
167 - eoObject.set<$Attribute.name.initialCapitalString$>(<$Attribute.name$>);<$endif$><$endif$><$endforeach do$><$foreach ToOneRelationship parentEntity.classToOneRelationships.@sortedNameArray do$><$if ToOneRelationship.isMandatory$>
168 - eoObject.set<$ToOneRelationship.name.initialCapitalString$>Relationship(<$ToOneRelationship.name$>);<$endif$><$endforeach do$>
169 - return eoObject;
170 -}
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 + }
171 171  
172 -{{/code}}
176 +{{/panel}}
173 173  
174 174  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:
175 175  
176 -{{code}}
180 +{{panel}}
177 177  
178 178   public static NSArray fetchAll<$classNameWithoutPackage$>s(EOEditingContext _editingContext) {
179 179   return <$GEN_PREFIX$><$classNameWithoutPackage$>.fetchAll<$classNameWithoutPackage$>s(_editingContext, null);
180 180   }
181 181  
182 - 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 +
183 183   return <$GEN_PREFIX$><$classNameWithoutPackage$>.fetch<$classNameWithoutPackage$>s(_editingContext, null, _sortOrderings);
184 184   }
185 185  
186 - 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 +
187 187   EOFetchSpecification fetchSpec = new EOFetchSpecification(<$GEN_PREFIX$><$classNameWithoutPackage$>.ENTITY_NAME, _qualifier, _sortOrderings);
188 188   fetchSpec.setIsDeep(true);
189 189   NSArray eoObjects = _editingContext.objectsWithFetchSpecification(fetchSpec);
... ... @@ -190,11 +190,21 @@
190 190   return eoObjects;
191 191   }
192 192  
193 - 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 +
194 194   return <$GEN_PREFIX$><$classNameWithoutPackage$>.fetch<$classNameWithoutPackage$>(_editingContext, new EOKeyValueQualifier(_keyName, EOQualifier.QualifierOperatorEqual, _value));
195 195   }
196 196  
197 - 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 +
198 198   NSArray eoObjects = <$GEN_PREFIX$><$classNameWithoutPackage$>.fetch<$classNameWithoutPackage$>s(_editingContext, _qualifier, null);
199 199   <$classNameWithoutPackage$> eoObject;
200 200   int count = eoObjects.count();
... ... @@ -214,7 +214,12 @@
214 214   return <$GEN_PREFIX$><$classNameWithoutPackage$>.fetchRequired<$classNameWithoutPackage$>(_editingContext, new EOKeyValueQualifier(_keyName, EOQualifier.QualifierOperatorEqual, _value));
215 215   }
216 216  
217 - 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 +
218 218   <$classNameWithoutPackage$> eoObject = <$GEN_PREFIX$><$classNameWithoutPackage$>.fetch<$classNameWithoutPackage$>(_editingContext, _qualifier);
219 219   if (eoObject h1. null) {
220 220   throw new NoSuchElementException("There was no <$classNameWithoutPackage$> that matched the qualifier '" + _qualifier + "'.");
... ... @@ -222,25 +222,30 @@
222 222   return eoObject;
223 223   }
224 224  
225 -{{/code}}
254 +{{/panel}}
226 226  
227 227  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):
228 228  
229 -{{code}}
258 +{{panel}}
230 230  
231 231   public <$classNameWithoutPackage$> localInstanceOf<$classNameWithoutPackage$>(EOEditingContext _editingContext) {
232 232   return (<$classNameWithoutPackage$>)EOUtilities.localInstanceOfObject(_editingContext, this);
233 233   }
234 234  
235 - 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 +
236 236   return (_eo null) ? null : (<$classNameWithoutPackage$>)EOUtilities.localInstanceOfObject(_editingContext, _eo);
237 237   }
238 238  
239 -{{/code}}
273 +{{/panel}}
240 240  
241 241  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:
242 242  
243 -{{code}}
277 +{{panel}}
244 244  
245 245   <$if !ToManyRelationship.inverseRelationship$>
246 246   public NSArray <$ToManyRelationship.name$>(EOQualifier qualifier) {
... ... @@ -262,8 +262,7 @@
262 262   <$if ToManyRelationship.inverseRelationship$>
263 263   if (fetch) {
264 264   EOQualifier fullQualifier;
265 - EOQualifier inverseQualifier = new EOKeyValueQualifier(<$ToManyRelationship.destination.className$>.
266 - <$ToManyRelationship.inverseRelationship.name.uppercaseUnderbarString$>_KEY, EOQualifier.QualifierOperatorEqual, this);
299 + EOQualifier inverseQualifier = new EOKeyValueQualifier(<$ToManyRelationship.destination.className$>.<$ToManyRelationship.inverseRelationship.name.uppercaseUnderbarString$>_KEY, EOQualifier.QualifierOperatorEqual, this);
267 267   if (qualifier == null) {
268 268   fullQualifier = inverseQualifier;
269 269   }
... ... @@ -290,35 +290,35 @@
290 290   return results;
291 291   }
292 292  
293 -{{/code}}
326 +{{/panel}}
294 294  
295 295  === John Huss ===
296 296  
297 297  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).//
298 298  
299 -{{code}}
332 +{{panel}}
300 300  
301 301   @SuppressWarnings("all")
302 302   public class _Invoice extends ERXGenericRecord {
303 303   }
304 304  
305 -{{/code}}
338 +{{/panel}}
306 306  
307 307  === Guido Neitzer ===
308 308  
309 309  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:
310 310  
311 -{{code}}
344 +{{panel}}
312 312  
313 -/**
314 - * Initialization of the instance while inserting it into an editing context
315 - */
316 -public void awakeFromInsertion (EOEditingContext editingContext) {
317 - super.awakeFromInsertion (editingContext);
318 - // initialize your object here
319 -}
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 + }
320 320  
321 -{{/code}}
354 +{{/panel}}
322 322  
323 323  This is from my JavaSubclassSourceTemplate.eotemplate
324 324