Last modified by David Avendasora on 2009/04/07 07:17

Show last authors
1 This template implements many of the same features as the Server-Side template, but eliminats any use of EOUtilities calls since the com.webobjects.eoaccess package is not included in the Client-Side WO libraries. These templates also require a custom EOGenericRecord class and an addition to the Session class to implement Stateless RMI for Model-Defined FetchSpecifications.
2
3 {{warning title="Caution"}}
4 Due to security concerns you cannot call FetchSpecifications from the client-side that use a Raw SQL Expression without implementing the delegate method [[distributionContextShouldFetchObjectsWithFetchSpecification>>url:http://developer.apple.com/documentation/MacOSXServer/Reference/WO54_Reference/com/webobjects/eodistribution/EODistributionContext.Delegate.html||shape="rect"]] which this code does NOT do.
5
6 Because of this, this template ignores any FetchSpecifications that are defined in the model that use a Raw SQL Expression.
7
8 If you try call these FetchSpecifications, you will get the following exception in the server log:
9
10 (% style="color: red;" %)Server exception: The fetchSpecification YourFetchSpecificationWithRawSQLExpression was not allowed to execute on the server. If your application needs to execute this method, the security needs to be relaxed by implementing the delegate method distributionContextShouldFetchObjectsWithFetchSpecification
11
12 and the [[code addition to the Session class>>doc:WOL.Home.EOGenerator.EOGenerator Templates and Additions.Session\.java Addition.WebHome]] will return null to the client instead of the expected FetchSpecification.
13 {{/warning}}
14
15 {{code}}
16
17 // DO NOT EDIT. Make changes to ${entity.classNameWithOptionalPackage}.java instead.
18 #if ($entity.superclassPackageName)
19 package $entity.superclassPackageName;
20
21 #end
22 import com.webobjects.eocontrol.*;
23 import com.webobjects.foundation.*;
24 import java.math.*;
25 import java.util.*;
26 import org.apache.log4j.Logger;
27
28 @SuppressWarnings("serial")
29 public abstract class ${entity.prefixClassNameWithoutPackage} extends #if ($entity.parentSet)${entity.parent.classNameWithDefault}#elseif ($EOGenericRecord)${EOGenericRecord}#else EOGenericRecord#end {
30
31 public static final String ENTITY_NAME = "$entity.name";
32
33 // Client-Side Attributes
34 #foreach ($attribute in $entity.sortedClientClassAttributes)
35 public static final String ${attribute.uppercaseUnderscoreName}_KEY = "$attribute.name";
36 #end
37
38 // Client-Side Relationships
39 #foreach ($relationship in $entity.sortedClientClassRelationships)
40 public static final String ${relationship.uppercaseUnderscoreName}_KEY = "$relationship.name";
41 #end
42
43 private static Logger LOG = Logger.getLogger(${entity.prefixClassNameWithoutPackage}.class);
44
45
46 // Client-Side Attribute Getters and Setters
47 #foreach ($attribute in $entity.sortedClientClassAttributes)
48 #if (!$attribute.inherited)
49 #if ($attribute.userInfo.ERXConstantClassName)
50 public $attribute.userInfo.ERXConstantClassName ${attribute.name}() {
51 Number value = (Number)storedValueForKey(${attribute.uppercaseUnderscoreName}_KEY);
52 return ($attribute.userInfo.ERXConstantClassName)value;
53 }
54
55 public void set${attribute.capitalizedName}($attribute.userInfo.ERXConstantClassName value) {
56 takeStoredValueForKey(value, ${attribute.uppercaseUnderscoreName}_KEY);
57 }
58 #else
59 public $attribute.javaClassName ${attribute.name}() {
60 return ($attribute.javaClassName) storedValueForKey(${attribute.uppercaseUnderscoreName}_KEY);
61 }
62
63 public void set${attribute.capitalizedName}($attribute.javaClassName ${attribute.name}) {
64 #if ($attribute.javaClassName == "java.math.BigDecimal")
65 if (${attribute.name} != null) {
66 ${attribute.name} = ${attribute.name}.setScale(${attribute.scale}, RoundingMode.HALF_UP);
67 }
68 #end
69 if (${entity.prefixClassNameWithoutPackage}.LOG.isDebugEnabled()) {
70 ${entity.prefixClassNameWithoutPackage}.LOG.debug( "updating $attribute.name from " + ${attribute.name}() + " to " + ${attribute.name});
71 }
72 takeStoredValueForKey(${attribute.name}, ${attribute.uppercaseUnderscoreName}_KEY);
73 }
74 #end
75 #end
76 #end
77
78 // Client-Side To-One Relationship Getters and Setters
79 #foreach ($relationship in $entity.sortedClientClassToOneRelationships)
80 #if (!$relationship.inherited)
81 public $relationship.actualDestination.classNameWithDefault ${relationship.name}() {
82 return ($relationship.actualDestination.classNameWithDefault) storedValueForKey(${relationship.uppercaseUnderscoreName}_KEY);
83 }
84
85 public void set${relationship.capitalizedName}($relationship.actualDestination.classNameWithDefault value) {
86 if (${entity.prefixClassNameWithoutPackage}.LOG.isDebugEnabled()) {
87 ${entity.prefixClassNameWithoutPackage}.LOG.debug("updating $relationship.name from " + ${relationship.name}() + " to " + value);
88 }
89 takeStoredValueForKey(value, ${relationship.uppercaseUnderscoreName}_KEY);
90 }
91
92 public void set${relationship.capitalizedName}Relationship($relationship.actualDestination.classNameWithDefault value) {
93 if (${entity.prefixClassNameWithoutPackage}.LOG.isDebugEnabled()) {
94 ${entity.prefixClassNameWithoutPackage}.LOG.debug("updating $relationship.name from " + ${relationship.name}() + " to " + value);
95 }
96 if (value == null) {
97 if (${relationship.name}() != null) {
98 removeObjectFromBothSidesOfRelationshipWithKey(${relationship.name}(), ${relationship.uppercaseUnderscoreName}_KEY);
99 }
100 } else {
101 addObjectToBothSidesOfRelationshipWithKey(value, ${relationship.uppercaseUnderscoreName}_KEY);
102 }
103 }
104
105 #end
106 #end
107
108 // Client-Side To-Many Relationship Getters and Setters
109 #foreach ($relationship in $entity.sortedClientClassToManyRelationships)
110 #if (!$relationship.inherited)
111 @SuppressWarnings("unchecked")
112 public NSArray<${relationship.actualDestination.classNameWithDefault}> ${relationship.name}() {
113 return (NSArray<${relationship.actualDestination.classNameWithDefault}>) storedValueForKey(${relationship.uppercaseUnderscoreName}_KEY);
114 }
115
116 #if (!$relationship.inverseRelationship || $relationship.flattened)
117 public NSArray<${relationship.actualDestination.classNameWithDefault}> ${relationship.name}(EOQualifier qualifier) {
118 return ${relationship.name}(qualifier, null);
119 }
120 #else
121 public NSArray<${relationship.actualDestination.classNameWithDefault}> ${relationship.name}(EOQualifier qualifier) {
122 return ${relationship.name}(qualifier, null, false);
123 }
124
125 public NSArray<${relationship.actualDestination.classNameWithDefault}> ${relationship.name}(EOQualifier qualifier, boolean fetch) {
126 return ${relationship.name}(qualifier, null, fetch);
127 }
128 #end
129
130 @SuppressWarnings("unchecked")
131 public NSArray<${relationship.actualDestination.classNameWithDefault}> ${relationship.name}(EOQualifier qualifier,
132 NSArray<EOSortOrdering> sortOrderings
133 #if ($relationship.inverseRelationship && !$relationship.flattened && $relationship.inverseRelationship.classProperty)
134 , boolean fetch#end) {
135 NSArray<${relationship.actualDestination.classNameWithDefault}> results;
136 #if ($relationship.inverseRelationship && !$relationship.flattened && $relationship.inverseRelationship.classProperty)
137 if (fetch) {
138 EOQualifier fullQualifier;
139 #if (${relationship.actualDestination.genericRecord})
140 EOQualifier inverseQualifier = new EOKeyValueQualifier("${relationship.inverseRelationship.name}", EOQualifier.QualifierOperatorEqual, this);
141 #else
142 EOQualifier inverseQualifier = new EOKeyValueQualifier(${relationship.actualDestination.classNameWithDefault}.${relationship.inverseRelationship.uppercaseUnderscoreName}_KEY, EOQualifier.QualifierOperatorEqual, this);
143 #end
144
145 if (qualifier == null) {
146 fullQualifier = inverseQualifier;
147 } else {
148 NSMutableArray<EOQualifier> qualifiers = new NSMutableArray<EOQualifier>();
149 qualifiers.addObject(qualifier);
150 qualifiers.addObject(inverseQualifier);
151 fullQualifier = new EOAndQualifier(qualifiers);
152 }
153
154 #if (${relationship.actualDestination.genericRecord})
155 EOFetchSpecification fs = new EOFetchSpecification("${relationship.actualDestination.name}", qualifier, sortOrderings);
156 fs.setIsDeep(true);
157 results = (NSArray<${relationship.actualDestination.classNameWithDefault}>) editingContext().objectsWithFetchSpecification(fs);
158 #else
159 results = ${relationship.actualDestination.classNameWithDefault}.fetch${relationship.actualDestination.pluralName}(editingContext(), fullQualifier, sortOrderings);
160 #end
161 } else {
162 #end
163 results = ${relationship.name}();
164 if (qualifier != null) {
165 results = (NSArray<${relationship.actualDestination.classNameWithDefault}>) EOQualifier.filteredArrayWithQualifier(results, qualifier);
166 }
167 if (sortOrderings != null) {
168 results = (NSArray<${relationship.actualDestination.classNameWithDefault}>) EOSortOrdering.sortedArrayUsingKeyOrderArray(results, sortOrderings);
169 }
170 #if ($relationship.inverseRelationship && !$relationship.flattened && $relationship.inverseRelationship.classProperty)
171 }
172 #end
173 return results;
174 }
175
176 public void addTo${relationship.capitalizedName}Relationship($relationship.actualDestination.classNameWithDefault object) {
177 if (${entity.prefixClassNameWithoutPackage}.LOG.isDebugEnabled()) {
178 ${entity.prefixClassNameWithoutPackage}.LOG.debug("adding " + object + " to ${relationship.name} relationship");
179 }
180 addObjectToBothSidesOfRelationshipWithKey(object, ${relationship.uppercaseUnderscoreName}_KEY);
181 }
182
183 public void removeFrom${relationship.capitalizedName}Relationship($relationship.actualDestination.classNameWithDefault object) {
184 if (${entity.prefixClassNameWithoutPackage}.LOG.isDebugEnabled()) {
185 ${entity.prefixClassNameWithoutPackage}.LOG.debug("removing " + object + " from ${relationship.name} relationship");
186 }
187 removeObjectFromBothSidesOfRelationshipWithKey(object, ${relationship.uppercaseUnderscoreName}_KEY);
188 }
189
190 public $relationship.actualDestination.classNameWithDefault create${relationship.capitalizedName}Relationship() {
191 EOClassDescription eoClassDesc = EOClassDescription.classDescriptionForEntityName("${relationship.actualDestination.name}");
192 EOEnterpriseObject eo = eoClassDesc.createInstanceWithEditingContext(editingContext(), null);
193 editingContext().insertObject(eo);
194 addObjectToBothSidesOfRelationshipWithKey(eo, ${relationship.uppercaseUnderscoreName}_KEY);
195 return ($relationship.actualDestination.classNameWithDefault) eo;
196 }
197
198 public void delete${relationship.capitalizedName}Relationship($relationship.actualDestination.classNameWithDefault object) {
199 removeObjectFromBothSidesOfRelationshipWithKey(object, ${relationship.uppercaseUnderscoreName}_KEY);
200 #if (!$relationship.ownsDestination)
201 editingContext().deleteObject(object);
202 #end
203 }
204
205 public void deleteAll${relationship.capitalizedName}Relationships() {
206 Enumeration<?> objects = ${relationship.name}().immutableClone().objectEnumerator();
207 while (objects.hasMoreElements()) {
208 delete${relationship.capitalizedName}Relationship(($relationship.actualDestination.classNameWithDefault)objects.nextElement());
209 }
210 }
211 #end
212 #end
213 #if (!$entity.abstractEntity)
214 public ${entity.classNameWithOptionalPackage} create${entity.name}(EOEditingContext ec
215 #foreach ($attribute in $entity.sortedClientClassAttributes)
216 #if (!$attribute.allowsNull)
217 #set ($restrictingQualifierKey = 'false')
218 #foreach ($qualifierKey in $entity.restrictingQualifierKeys)
219 #if ($attribute.name == $qualifierKey)
220 #set ($restrictingQualifierKey = 'true')
221 #end
222 #end
223 #if ($restrictingQualifierKey == 'false')
224 #if ($attribute.userInfo.ERXConstantClassName)
225 , ${attribute.userInfo.ERXConstantClassName}
226 #else
227 , ${attribute.javaClassName}#end ${attribute.name}
228 #end
229 #end
230 #end
231 #foreach ($relationship in $entity.sortedClientClassToOneRelationships)
232 #if ($relationship.mandatory && !($relationship.ownsDestination && $relationship.propagatesPrimaryKey))
233 , ${relationship.actualDestination.classNameWithDefault} ${relationship.name}
234 #end
235 #end
236 ) {
237 ${entity.classNameWithOptionalPackage} new${entity.name} = new ${entity.classNameWithOptionalPackage}();
238 ec.insertObject(new${entity.name});
239
240 #foreach ($attribute in $entity.sortedClientClassAttributes)
241 #if (!$attribute.allowsNull)
242 #set ($restrictingQualifierKey = 'false')
243 #foreach ($qualifierKey in $entity.restrictingQualifierKeys)
244 #if ($attribute.name == $qualifierKey)
245 #set ($restrictingQualifierKey = 'true')
246 #end
247 #end
248 #if ($restrictingQualifierKey == 'false')
249 new${entity.name}.set${attribute.capitalizedName}(${attribute.name});
250 #end
251 #end
252 #end
253 #foreach ($relationship in $entity.sortedClientClassToOneRelationships)
254 #if ($relationship.mandatory && !($relationship.ownsDestination && $relationship.propagatesPrimaryKey))
255 new${entity.name}.set${relationship.capitalizedName}Relationship(${relationship.name});
256 #end
257 #end
258 return new${entity.name};
259 }
260 #end
261
262 public static NSArray<${entity.classNameWithOptionalPackage}> fetchAll${entity.pluralName}(EOEditingContext editingContext) {
263 return ${entity.prefixClassNameWithoutPackage}.fetchAll${entity.pluralName}(editingContext, null);
264 }
265
266 public static NSArray<${entity.classNameWithOptionalPackage}> fetchAll${entity.pluralName}(EOEditingContext editingContext, NSArray<EOSortOrdering> sortOrderings) {
267 return ${entity.prefixClassNameWithoutPackage}.fetch${entity.pluralName}(editingContext, null, sortOrderings);
268 }
269
270 @SuppressWarnings("unchecked")
271 public static NSArray<${entity.classNameWithOptionalPackage}> fetch${entity.pluralName}(EOEditingContext editingContext, EOQualifier qualifier, NSArray<EOSortOrdering> sortOrderings) {
272 EOFetchSpecification fetchSpec = new EOFetchSpecification(${entity.prefixClassNameWithoutPackage}.ENTITY_NAME, qualifier, sortOrderings);
273 fetchSpec.setIsDeep(true);
274 NSArray<${entity.classNameWithOptionalPackage}> eoObjects = (NSArray<${entity.classNameWithOptionalPackage}>)editingContext.objectsWithFetchSpecification(fetchSpec);
275 return eoObjects;
276 }
277
278 public static ${entity.classNameWithOptionalPackage} fetch${entity.name}(EOEditingContext editingContext, String keyName, Object value) {
279 return ${entity.prefixClassNameWithoutPackage}.fetch${entity.name}(editingContext, new EOKeyValueQualifier(keyName, EOQualifier.QualifierOperatorEqual, value));
280 }
281
282 public static ${entity.classNameWithOptionalPackage} fetch${entity.name}(EOEditingContext editingContext, EOQualifier qualifier) {
283 NSArray<${entity.classNameWithOptionalPackage}> eoObjects = ${entity.prefixClassNameWithoutPackage}.fetch${entity.pluralName}(editingContext, qualifier, null);
284 ${entity.classNameWithOptionalPackage} eoObject;
285 int count = eoObjects.count();
286 if (count == 0) {
287 eoObject = null;
288 } else if (count == 1) {
289 eoObject = (${entity.classNameWithOptionalPackage})eoObjects.objectAtIndex(0);
290 } else {
291 throw new IllegalStateException("There was more than one ${entity.name} that matched the qualifier '" + qualifier + "'.");
292 }
293 return eoObject;
294 }
295
296 public static ${entity.classNameWithOptionalPackage} fetchRequired${entity.name}(EOEditingContext editingContext, String keyName, Object value) {
297 return ${entity.prefixClassNameWithoutPackage}.fetchRequired${entity.name}(editingContext, new EOKeyValueQualifier(keyName, EOQualifier.QualifierOperatorEqual, value));
298 }
299
300 public static ${entity.classNameWithOptionalPackage} fetchRequired${entity.name}(EOEditingContext editingContext, EOQualifier qualifier) {
301 ${entity.classNameWithOptionalPackage} eoObject = ${entity.prefixClassNameWithoutPackage}.fetch${entity.name}(editingContext, qualifier);
302 if (eoObject == null) {
303 throw new NoSuchElementException("There was no ${entity.name} that matched the qualifier '" + qualifier + "'.");
304 }
305 return eoObject;
306 }
307
308 // Fetch Specifications
309 #foreach ($fetchSpecification in $entity.sortedFetchSpecs)
310 #if (!$fetchSpecification.usingCustomQuery)
311
312 @SuppressWarnings("unchecked")
313 public static NSArray<${entity.classNameWithOptionalPackage}> fetch${fetchSpecification.capitalizedName}(EOEditingContext ec#foreach ($binding in $fetchSpecification.distinctBindings), ${binding.javaClassName} ${binding.name}Binding#end) {
314 EOFetchSpecification fs = (EOFetchSpecification) _distributedObjectStore().invokeStatelessRemoteMethodWithKeyPath(
315 "session",
316 "clientSideRequestGetFetchSpecification",
317 new Class[] {String.class, String.class },
318 new String[] {"${fetchSpecification.name}", "${entity.classNameWithoutPackage}"});
319 #if ($fetchSpecification.distinctBindings.size() > 0)
320 NSMutableDictionary<Object,String> bindings = new NSMutableDictionary<Object,String>($fetchSpecification.distinctBindings.size());
321 #foreach ($binding in $fetchSpecification.distinctBindings)
322 bindings.takeValueForKey(${binding.name}Binding, "${binding.name}");
323 #end
324 fs = fs.fetchSpecificationWithQualifierBindings(bindings);
325 #end
326 return (NSArray<${entity.classNameWithOptionalPackage}>)ec.objectsWithFetchSpecification(fs);
327 }
328
329 public static ${entity.classNameWithOptionalPackage} fetchOne${fetchSpecification.capitalizedName}(EOEditingContext ec#foreach ($binding in $fetchSpecification.distinctBindings), ${binding.javaClassName} ${binding.name}Binding#end) {
330 NSArray<${entity.classNameWithOptionalPackage}> fetch${fetchSpecification.capitalizedName}Results = fetch${fetchSpecification.capitalizedName}(ec#foreach ($binding in $fetchSpecification.distinctBindings), ${binding.name}Binding#end);
331 if (fetch${fetchSpecification.capitalizedName}Results.count() > 0) {
332 return (${entity.classNameWithoutPackage})fetch${fetchSpecification.capitalizedName}Results.objectAtIndex(0);
333 } else {
334 return null;
335 }
336 }
337
338 #end
339 #end
340 }
341
342 {{/code}}