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
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
on 2007/07/08 09:44
Change comment:
There is no comment for this version
Summary
-
Page properties (2 modified, 0 added, 0 removed)
Details
- Page properties
-
- Author
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki. qdolan1 +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