001/**
002 * Copyright 2014 The Sculptor Project Team, including the original
003 * author or authors.
004 * 
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 * 
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 * 
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017package org.sculptor.generator.cartridge.mongodb;
018
019import javax.inject.Inject;
020import org.eclipse.xtend2.lib.StringConcatenation;
021import org.eclipse.xtext.xbase.lib.Extension;
022import org.sculptor.generator.cartridge.mongodb.MongoDbHelper;
023import org.sculptor.generator.cartridge.mongodb.MongoDbProperties;
024import org.sculptor.generator.chain.ChainOverride;
025import org.sculptor.generator.ext.Helper;
026import org.sculptor.generator.ext.Properties;
027import org.sculptor.generator.template.domain.DomainObjectReferenceTmpl;
028import org.sculptor.generator.util.HelperBase;
029import sculptormetamodel.DomainObject;
030import sculptormetamodel.Module;
031import sculptormetamodel.Reference;
032
033@ChainOverride
034@SuppressWarnings("all")
035public class DomainObjectReferenceTmplExtension extends DomainObjectReferenceTmpl {
036  @Inject
037  @Extension
038  private MongoDbHelper mongoDbHelper;
039  
040  @Inject
041  @Extension
042  private HelperBase helperBase;
043  
044  @Inject
045  @Extension
046  private Helper helper;
047  
048  @Inject
049  @Extension
050  private MongoDbProperties mongoDbProperties;
051  
052  @Inject
053  @Extension
054  private Properties properties;
055  
056  @Override
057  public String oneReferenceAttributeUnownedReference(final Reference it) {
058    DomainObjectReferenceTmpl headObj = getMethodsDispatchHead()[org.sculptor.generator.template.domain.DomainObjectReferenceTmplMethodIndexes.ONEREFERENCEATTRIBUTEUNOWNEDREFERENCE_REFERENCE];
059    return headObj._chained_oneReferenceAttributeUnownedReference(it);
060  }
061  
062  @Override
063  public String oneUnownedReferenceGetter(final Reference it) {
064    DomainObjectReferenceTmpl headObj = getMethodsDispatchHead()[org.sculptor.generator.template.domain.DomainObjectReferenceTmplMethodIndexes.ONEUNOWNEDREFERENCEGETTER_REFERENCE];
065    return headObj._chained_oneUnownedReferenceGetter(it);
066  }
067  
068  private String oneReferenceMongoDbLazyGetter(final Reference it) {
069    StringConcatenation _builder = new StringConcatenation();
070    String _formatJavaDoc = this.helper.formatJavaDoc(it);
071    _builder.append(_formatJavaDoc, "");
072    _builder.newLineIfNotEmpty();
073    String _visibilityLitteralGetter = this.helper.getVisibilityLitteralGetter(it);
074    _builder.append(_visibilityLitteralGetter, "");
075    String _typeName = this.helperBase.getTypeName(it);
076    _builder.append(_typeName, "");
077    _builder.append(" get");
078    String _name = it.getName();
079    String _firstUpper = this.helperBase.toFirstUpper(_name);
080    _builder.append(_firstUpper, "");
081    _builder.append("() {");
082    _builder.newLineIfNotEmpty();
083    _builder.append("\t");
084    _builder.append("if (");
085    String _name_1 = it.getName();
086    _builder.append(_name_1, "\t");
087    _builder.append("IsLoaded) {");
088    _builder.newLineIfNotEmpty();
089    _builder.append("\t\t");
090    _builder.append("return ");
091    String _name_2 = it.getName();
092    _builder.append(_name_2, "\t\t");
093    _builder.append(";");
094    _builder.newLineIfNotEmpty();
095    _builder.append("\t");
096    _builder.append("}");
097    _builder.newLine();
098    _builder.append("\t");
099    _builder.append("if (");
100    String _name_3 = it.getName();
101    _builder.append(_name_3, "\t");
102    String _unownedReferenceSuffix = this.helper.unownedReferenceSuffix(it);
103    _builder.append(_unownedReferenceSuffix, "\t");
104    _builder.append(" == null) {");
105    _builder.newLineIfNotEmpty();
106    _builder.append("\t\t");
107    String _name_4 = it.getName();
108    _builder.append(_name_4, "\t\t");
109    _builder.append("IsLoaded = true;");
110    _builder.newLineIfNotEmpty();
111    _builder.append("\t\t");
112    _builder.append("return null;");
113    _builder.newLine();
114    _builder.append("\t");
115    _builder.append("}");
116    _builder.newLine();
117    _builder.append("\t");
118    String _fw = this.properties.fw("accessimpl.mongodb.DbManager");
119    _builder.append(_fw, "\t");
120    _builder.append(" dbManager = ");
121    String _fw_1 = this.properties.fw("accessimpl.mongodb.DbManager");
122    _builder.append(_fw_1, "\t");
123    _builder.append(".getThreadInstance();");
124    _builder.newLineIfNotEmpty();
125    _builder.append("\t");
126    _builder.append("if (dbManager == null) {");
127    _builder.newLine();
128    _builder.append("\t\t");
129    _builder.append("throw new IllegalStateException(\"Lazy loading of ");
130    DomainObject _from = it.getFrom();
131    String _name_5 = _from.getName();
132    _builder.append(_name_5, "\t\t");
133    _builder.append(".");
134    String _name_6 = it.getName();
135    _builder.append(_name_6, "\t\t");
136    _builder.append(" failed due to missing DbManager.getThreadInstance()\");");
137    _builder.newLineIfNotEmpty();
138    _builder.append("\t");
139    _builder.append("}");
140    _builder.newLine();
141    _builder.append("\t");
142    _builder.append("String dbCollectionName = ");
143    DomainObject _to = it.getTo();
144    Module _module = _to.getModule();
145    String _mapperPackage = this.mongoDbHelper.getMapperPackage(_module);
146    _builder.append(_mapperPackage, "\t");
147    _builder.append(".");
148    DomainObject _to_1 = it.getTo();
149    String _name_7 = _to_1.getName();
150    _builder.append(_name_7, "\t");
151    _builder.append("Mapper.getInstance().getDBCollectionName();");
152    _builder.newLineIfNotEmpty();
153    _builder.append("\t");
154    _builder.append("com.mongodb.DBRef dbRef = new com.mongodb.DBRef(dbManager.getDB(), dbCollectionName,");
155    _builder.newLine();
156    _builder.append("\t\t");
157    _builder.append("org.bson.types.ObjectId.massageToObjectId(");
158    String _name_8 = it.getName();
159    _builder.append(_name_8, "\t\t");
160    String _unownedReferenceSuffix_1 = this.helper.unownedReferenceSuffix(it);
161    _builder.append(_unownedReferenceSuffix_1, "\t\t");
162    _builder.append("));");
163    _builder.newLineIfNotEmpty();
164    _builder.append("\t");
165    String _name_9 = it.getName();
166    _builder.append(_name_9, "\t");
167    _builder.append(" = (");
168    String _typeName_1 = this.helperBase.getTypeName(it);
169    _builder.append(_typeName_1, "\t");
170    _builder.append(")");
171    DomainObject _to_2 = it.getTo();
172    Module _module_1 = _to_2.getModule();
173    String _mapperPackage_1 = this.mongoDbHelper.getMapperPackage(_module_1);
174    _builder.append(_mapperPackage_1, "\t");
175    _builder.append(".");
176    DomainObject _to_3 = it.getTo();
177    String _name_10 = _to_3.getName();
178    _builder.append(_name_10, "\t");
179    _builder.append("Mapper.getInstance().toDomain(dbRef.fetch());");
180    _builder.newLineIfNotEmpty();
181    _builder.append("\t");
182    String _name_11 = it.getName();
183    _builder.append(_name_11, "\t");
184    _builder.append("IsLoaded = true;");
185    _builder.newLineIfNotEmpty();
186    _builder.append("\t");
187    _builder.append("return ");
188    String _name_12 = it.getName();
189    _builder.append(_name_12, "\t");
190    _builder.append(";");
191    _builder.newLineIfNotEmpty();
192    _builder.append("};");
193    _builder.newLine();
194    _builder.newLine();
195    String _visibilityLitteralGetter_1 = this.helper.getVisibilityLitteralGetter(it);
196    _builder.append(_visibilityLitteralGetter_1, "");
197    _builder.append(" boolean is");
198    String _name_13 = it.getName();
199    String _firstUpper_1 = this.helperBase.toFirstUpper(_name_13);
200    _builder.append(_firstUpper_1, "");
201    _builder.append("Loaded() {");
202    _builder.newLineIfNotEmpty();
203    _builder.append("\t");
204    _builder.append("return ");
205    String _name_14 = it.getName();
206    _builder.append(_name_14, "\t");
207    _builder.append("IsLoaded;");
208    _builder.newLineIfNotEmpty();
209    _builder.append("}");
210    _builder.newLine();
211    return _builder.toString();
212  }
213  
214  @Override
215  public String oneUnownedReferenceSetter(final Reference it) {
216    DomainObjectReferenceTmpl headObj = getMethodsDispatchHead()[org.sculptor.generator.template.domain.DomainObjectReferenceTmplMethodIndexes.ONEUNOWNEDREFERENCESETTER_REFERENCE];
217    return headObj._chained_oneUnownedReferenceSetter(it);
218  }
219  
220  private String oneReferenceMongoDbLazySetter(final Reference it) {
221    StringConcatenation _builder = new StringConcatenation();
222    {
223      boolean _isSetterNeeded = this.helper.isSetterNeeded(it);
224      if (_isSetterNeeded) {
225        String _formatJavaDoc = this.helper.formatJavaDoc(it);
226        _builder.append(_formatJavaDoc, "");
227        _builder.newLineIfNotEmpty();
228        String _visibilityLitteralSetter = this.helper.getVisibilityLitteralSetter(it);
229        _builder.append(_visibilityLitteralSetter, "");
230        _builder.append("void set");
231        String _name = it.getName();
232        String _firstUpper = this.helperBase.toFirstUpper(_name);
233        _builder.append(_firstUpper, "");
234        _builder.append("(");
235        String _typeName = this.helperBase.getTypeName(it);
236        _builder.append(_typeName, "");
237        _builder.append(" ");
238        String _name_1 = it.getName();
239        _builder.append(_name_1, "");
240        _builder.append(") {");
241        _builder.newLineIfNotEmpty();
242        _builder.append("\t");
243        _builder.append("this.");
244        String _name_2 = it.getName();
245        _builder.append(_name_2, "\t");
246        _builder.append(" = ");
247        String _name_3 = it.getName();
248        _builder.append(_name_3, "\t");
249        _builder.append(";");
250        _builder.newLineIfNotEmpty();
251        _builder.append("\t");
252        String _name_4 = it.getName();
253        _builder.append(_name_4, "\t");
254        _builder.append("IsLoaded = true;");
255        _builder.newLineIfNotEmpty();
256        _builder.append("\t\t");
257        _builder.append("this.");
258        String _name_5 = it.getName();
259        _builder.append(_name_5, "\t\t");
260        String _unownedReferenceSuffix = this.helper.unownedReferenceSuffix(it);
261        _builder.append(_unownedReferenceSuffix, "\t\t");
262        _builder.append(" = (");
263        String _name_6 = it.getName();
264        _builder.append(_name_6, "\t\t");
265        _builder.append(" == null ? null : ");
266        String _name_7 = it.getName();
267        _builder.append(_name_7, "\t\t");
268        _builder.append(".getId());");
269        _builder.newLineIfNotEmpty();
270        _builder.append("};");
271        _builder.newLine();
272      }
273    }
274    return _builder.toString();
275  }
276  
277  @Override
278  public String oneReferenceIdGetterBody(final Reference it) {
279    DomainObjectReferenceTmpl headObj = getMethodsDispatchHead()[org.sculptor.generator.template.domain.DomainObjectReferenceTmplMethodIndexes.ONEREFERENCEIDGETTERBODY_REFERENCE];
280    return headObj._chained_oneReferenceIdGetterBody(it);
281  }
282  
283  @Override
284  public String oneReferenceIdSetterBody(final Reference it) {
285    DomainObjectReferenceTmpl headObj = getMethodsDispatchHead()[org.sculptor.generator.template.domain.DomainObjectReferenceTmplMethodIndexes.ONEREFERENCEIDSETTERBODY_REFERENCE];
286    return headObj._chained_oneReferenceIdSetterBody(it);
287  }
288  
289  @Override
290  public String manyUnownedReferenceAttribute(final Reference it) {
291    DomainObjectReferenceTmpl headObj = getMethodsDispatchHead()[org.sculptor.generator.template.domain.DomainObjectReferenceTmplMethodIndexes.MANYUNOWNEDREFERENCEATTRIBUTE_REFERENCE];
292    return headObj._chained_manyUnownedReferenceAttribute(it);
293  }
294  
295  @Override
296  public String manyReferenceIdsGetterBody(final Reference it) {
297    DomainObjectReferenceTmpl headObj = getMethodsDispatchHead()[org.sculptor.generator.template.domain.DomainObjectReferenceTmplMethodIndexes.MANYREFERENCEIDSGETTERBODY_REFERENCE];
298    return headObj._chained_manyReferenceIdsGetterBody(it);
299  }
300  
301  @Override
302  public String manyReferenceAccessorsUnownedReference(final Reference it) {
303    DomainObjectReferenceTmpl headObj = getMethodsDispatchHead()[org.sculptor.generator.template.domain.DomainObjectReferenceTmplMethodIndexes.MANYREFERENCEACCESSORSUNOWNEDREFERENCE_REFERENCE];
304    return headObj._chained_manyReferenceAccessorsUnownedReference(it);
305  }
306  
307  private String manyReferenceMongoDbLazyGetter(final Reference it) {
308    StringConcatenation _builder = new StringConcatenation();
309    String _formatJavaDoc = this.helper.formatJavaDoc(it);
310    _builder.append(_formatJavaDoc, "");
311    _builder.newLineIfNotEmpty();
312    String _visibilityLitteralGetter = this.helper.getVisibilityLitteralGetter(it);
313    _builder.append(_visibilityLitteralGetter, "");
314    String _collectionInterfaceType = this.helperBase.getCollectionInterfaceType(it);
315    _builder.append(_collectionInterfaceType, "");
316    _builder.append("<");
317    String _typeName = this.helperBase.getTypeName(it);
318    _builder.append(_typeName, "");
319    _builder.append("> get");
320    String _name = it.getName();
321    String _firstUpper = this.helperBase.toFirstUpper(_name);
322    _builder.append(_firstUpper, "");
323    _builder.append("() {");
324    _builder.newLineIfNotEmpty();
325    _builder.append("\t");
326    _builder.append("if (");
327    String _name_1 = it.getName();
328    _builder.append(_name_1, "\t");
329    _builder.append(" != null) {");
330    _builder.newLineIfNotEmpty();
331    _builder.append("\t\t");
332    _builder.append("return ");
333    String _name_2 = it.getName();
334    _builder.append(_name_2, "\t\t");
335    _builder.append(";");
336    _builder.newLineIfNotEmpty();
337    _builder.append("\t");
338    _builder.append("}");
339    _builder.newLine();
340    _builder.append("\t");
341    String _collectionInterfaceType_1 = this.helperBase.getCollectionInterfaceType(it);
342    _builder.append(_collectionInterfaceType_1, "\t");
343    _builder.append("<");
344    String _typeName_1 = this.helperBase.getTypeName(it);
345    _builder.append(_typeName_1, "\t");
346    _builder.append("> result = new ");
347    String _collectionImplType = this.helperBase.getCollectionImplType(it);
348    _builder.append(_collectionImplType, "\t");
349    _builder.append("<");
350    String _typeName_2 = this.helperBase.getTypeName(it);
351    _builder.append(_typeName_2, "\t");
352    _builder.append(">();");
353    _builder.newLineIfNotEmpty();
354    _builder.append("\t");
355    _builder.append("java.util.List<org.bson.types.ObjectId> ids = new java.util.ArrayList<org.bson.types.ObjectId>();");
356    _builder.newLine();
357    _builder.append("\t");
358    _builder.append("for (");
359    String _javaType = this.helperBase.getJavaType("IDTYPE");
360    _builder.append(_javaType, "\t");
361    _builder.append(" each : ");
362    String _name_3 = it.getName();
363    _builder.append(_name_3, "\t");
364    String _unownedReferenceSuffix = this.helper.unownedReferenceSuffix(it);
365    _builder.append(_unownedReferenceSuffix, "\t");
366    _builder.append(") {");
367    _builder.newLineIfNotEmpty();
368    _builder.append("\t\t");
369    _builder.append("ids.add(org.bson.types.ObjectId.massageToObjectId(each));");
370    _builder.newLine();
371    _builder.append("\t");
372    _builder.append("}");
373    _builder.newLine();
374    _builder.append("\t");
375    _builder.append("String dbCollectionName = ");
376    DomainObject _to = it.getTo();
377    Module _module = _to.getModule();
378    String _mapperPackage = this.mongoDbHelper.getMapperPackage(_module);
379    _builder.append(_mapperPackage, "\t");
380    _builder.append(".");
381    DomainObject _to_1 = it.getTo();
382    String _name_4 = _to_1.getName();
383    _builder.append(_name_4, "\t");
384    _builder.append("Mapper.getInstance().getDBCollectionName();");
385    _builder.newLineIfNotEmpty();
386    _builder.append("\t");
387    String _fw = this.properties.fw("accessimpl.mongodb.DbManager");
388    _builder.append(_fw, "\t");
389    _builder.append(" dbManager = ");
390    String _fw_1 = this.properties.fw("accessimpl.mongodb.DbManager");
391    _builder.append(_fw_1, "\t");
392    _builder.append(".getThreadInstance();");
393    _builder.newLineIfNotEmpty();
394    _builder.append("\t");
395    _builder.append("if (dbManager == null) {");
396    _builder.newLine();
397    _builder.append("\t\t");
398    _builder.append("throw new IllegalStateException(\"Lazy loading of ");
399    DomainObject _from = it.getFrom();
400    String _name_5 = _from.getName();
401    _builder.append(_name_5, "\t\t");
402    _builder.append(".");
403    String _name_6 = it.getName();
404    _builder.append(_name_6, "\t\t");
405    _builder.append(" failed due to missing DbManager.getThreadInstance()\");");
406    _builder.newLineIfNotEmpty();
407    _builder.append("\t");
408    _builder.append("}");
409    _builder.newLine();
410    _builder.append("\t");
411    _builder.append("com.mongodb.DBCollection dbCollection = dbManager.getDBCollection(dbCollectionName);");
412    _builder.newLine();
413    _builder.append("\t");
414    _builder.append("com.mongodb.DBCursor cur = dbCollection.find(new com.mongodb.BasicDBObject(\"_id\", new com.mongodb.BasicDBObject(\"$in\", ids)));");
415    _builder.newLine();
416    _builder.append("\t");
417    _builder.append("while (cur.hasNext()) {");
418    _builder.newLine();
419    _builder.append("\t\t");
420    _builder.append("com.mongodb.DBObject each = cur.next();");
421    _builder.newLine();
422    _builder.append("\t\t");
423    _builder.append("result.add(");
424    DomainObject _to_2 = it.getTo();
425    Module _module_1 = _to_2.getModule();
426    String _mapperPackage_1 = this.mongoDbHelper.getMapperPackage(_module_1);
427    _builder.append(_mapperPackage_1, "\t\t");
428    _builder.append(".");
429    DomainObject _to_3 = it.getTo();
430    String _name_7 = _to_3.getName();
431    _builder.append(_name_7, "\t\t");
432    _builder.append("Mapper.getInstance().toDomain(each));");
433    _builder.newLineIfNotEmpty();
434    _builder.append("\t");
435    _builder.append("}");
436    _builder.newLine();
437    _builder.newLine();
438    _builder.append("\t");
439    String _name_8 = it.getName();
440    _builder.append(_name_8, "\t");
441    _builder.append(" = result;");
442    _builder.newLineIfNotEmpty();
443    _builder.append("\t");
444    _builder.append("return result;");
445    _builder.newLine();
446    _builder.append("};");
447    _builder.newLine();
448    _builder.newLine();
449    String _visibilityLitteralGetter_1 = this.helper.getVisibilityLitteralGetter(it);
450    _builder.append(_visibilityLitteralGetter_1, "");
451    _builder.append(" boolean is");
452    String _name_9 = it.getName();
453    String _firstUpper_1 = this.helperBase.toFirstUpper(_name_9);
454    _builder.append(_firstUpper_1, "");
455    _builder.append("Loaded() {");
456    _builder.newLineIfNotEmpty();
457    _builder.append("\t");
458    _builder.append("return ");
459    String _name_10 = it.getName();
460    _builder.append(_name_10, "\t");
461    _builder.append(" != null;");
462    _builder.newLineIfNotEmpty();
463    _builder.append("}");
464    _builder.newLine();
465    return _builder.toString();
466  }
467  
468  public DomainObjectReferenceTmplExtension(final DomainObjectReferenceTmpl next, final DomainObjectReferenceTmpl[] methodsDispatchNext) {
469    super(next);
470  }
471  
472  public String _chained_oneReferenceAttributeUnownedReference(final Reference it) {
473    StringConcatenation _builder = new StringConcatenation();
474    DomainObjectReferenceTmpl _next = this.getNext();
475    String _oneReferenceAttributeUnownedReference = _next.oneReferenceAttributeUnownedReference(it);
476    _builder.append(_oneReferenceAttributeUnownedReference, "");
477    _builder.newLineIfNotEmpty();
478    {
479      boolean _mongoDb = this.mongoDbProperties.mongoDb();
480      if (_mongoDb) {
481        String _oneReferenceLazyAttribute = this.oneReferenceLazyAttribute(it);
482        _builder.append(_oneReferenceLazyAttribute, "");
483        _builder.newLineIfNotEmpty();
484      }
485    }
486    return _builder.toString();
487  }
488  
489  public String _chained_oneUnownedReferenceGetter(final Reference it) {
490    StringConcatenation _builder = new StringConcatenation();
491    DomainObjectReferenceTmpl _next = this.getNext();
492    String _oneUnownedReferenceGetter = _next.oneUnownedReferenceGetter(it);
493    _builder.append(_oneUnownedReferenceGetter, "");
494    _builder.newLineIfNotEmpty();
495    {
496      boolean _mongoDb = this.mongoDbProperties.mongoDb();
497      if (_mongoDb) {
498        String _oneReferenceMongoDbLazyGetter = this.oneReferenceMongoDbLazyGetter(it);
499        _builder.append(_oneReferenceMongoDbLazyGetter, "");
500        _builder.newLineIfNotEmpty();
501      }
502    }
503    return _builder.toString();
504  }
505  
506  public String _chained_oneUnownedReferenceSetter(final Reference it) {
507    StringConcatenation _builder = new StringConcatenation();
508    DomainObjectReferenceTmpl _next = this.getNext();
509    String _oneUnownedReferenceSetter = _next.oneUnownedReferenceSetter(it);
510    _builder.append(_oneUnownedReferenceSetter, "");
511    _builder.newLineIfNotEmpty();
512    {
513      boolean _mongoDb = this.mongoDbProperties.mongoDb();
514      if (_mongoDb) {
515        String _oneReferenceMongoDbLazySetter = this.oneReferenceMongoDbLazySetter(it);
516        _builder.append(_oneReferenceMongoDbLazySetter, "");
517        _builder.newLineIfNotEmpty();
518      }
519    }
520    return _builder.toString();
521  }
522  
523  public String _chained_oneReferenceIdGetterBody(final Reference it) {
524    StringConcatenation _builder = new StringConcatenation();
525    {
526      boolean _mongoDb = this.mongoDbProperties.mongoDb();
527      if (_mongoDb) {
528        _builder.append("if (!");
529        String _name = it.getName();
530        _builder.append(_name, "");
531        _builder.append("IsLoaded) {");
532        _builder.newLineIfNotEmpty();
533        _builder.append("\t");
534        _builder.append("return ");
535        String _name_1 = it.getName();
536        _builder.append(_name_1, "\t");
537        String _unownedReferenceSuffix = this.helper.unownedReferenceSuffix(it);
538        _builder.append(_unownedReferenceSuffix, "\t");
539        _builder.append(";");
540        _builder.newLineIfNotEmpty();
541        _builder.append("} else {");
542        _builder.newLine();
543        _builder.append("\t");
544        _builder.append("// associated instance has been loaded, or set, id was maybe not assigned when associated instance was set");
545        _builder.newLine();
546        _builder.append("\t");
547        _builder.append("if (");
548        String _name_2 = it.getName();
549        _builder.append(_name_2, "\t");
550        _builder.append(" == null) {");
551        _builder.newLineIfNotEmpty();
552        _builder.append("\t\t");
553        _builder.append("return null;");
554        _builder.newLine();
555        _builder.append("\t");
556        _builder.append("} else if (");
557        String _name_3 = it.getName();
558        _builder.append(_name_3, "\t");
559        _builder.append(".getId() == null) {");
560        _builder.newLineIfNotEmpty();
561        _builder.append("\t\t");
562        _builder.append("throw new IllegalStateException(\"Reference ");
563        DomainObject _from = it.getFrom();
564        String _name_4 = _from.getName();
565        _builder.append(_name_4, "\t\t");
566        _builder.append(".");
567        String _name_5 = it.getName();
568        _builder.append(_name_5, "\t\t");
569        _builder.append(" is unsaved instance. Cascade not supported. Save ");
570        DomainObject _to = it.getTo();
571        String _name_6 = _to.getName();
572        _builder.append(_name_6, "\t\t");
573        _builder.append(" before saving ");
574        DomainObject _from_1 = it.getFrom();
575        String _name_7 = _from_1.getName();
576        _builder.append(_name_7, "\t\t");
577        _builder.append(".\");");
578        _builder.newLineIfNotEmpty();
579        _builder.append("\t");
580        _builder.append("} else {");
581        _builder.newLine();
582        _builder.append("\t\t");
583        _builder.append("return ");
584        String _name_8 = it.getName();
585        _builder.append(_name_8, "\t\t");
586        _builder.append(".getId();");
587        _builder.newLineIfNotEmpty();
588        _builder.append("\t");
589        _builder.append("}");
590        _builder.newLine();
591        _builder.append("}");
592        _builder.newLine();
593      } else {
594        DomainObjectReferenceTmpl _next = this.getNext();
595        String _oneReferenceIdGetterBody = _next.oneReferenceIdGetterBody(it);
596        _builder.append(_oneReferenceIdGetterBody, "");
597        _builder.newLineIfNotEmpty();
598      }
599    }
600    return _builder.toString();
601  }
602  
603  public String _chained_oneReferenceIdSetterBody(final Reference it) {
604    StringConcatenation _builder = new StringConcatenation();
605    DomainObjectReferenceTmpl _next = this.getNext();
606    String _oneReferenceIdSetterBody = _next.oneReferenceIdSetterBody(it);
607    _builder.append(_oneReferenceIdSetterBody, "");
608    _builder.newLineIfNotEmpty();
609    {
610      boolean _mongoDb = this.mongoDbProperties.mongoDb();
611      if (_mongoDb) {
612        String _name = it.getName();
613        _builder.append(_name, "");
614        _builder.append("IsLoaded = false;");
615        _builder.newLineIfNotEmpty();
616        String _name_1 = it.getName();
617        _builder.append(_name_1, "");
618        _builder.append(" = null;");
619        _builder.newLineIfNotEmpty();
620      }
621    }
622    return _builder.toString();
623  }
624  
625  public String _chained_manyUnownedReferenceAttribute(final Reference it) {
626    StringConcatenation _builder = new StringConcatenation();
627    DomainObjectReferenceTmpl _next = this.getNext();
628    String _manyUnownedReferenceAttribute = _next.manyUnownedReferenceAttribute(it);
629    _builder.append(_manyUnownedReferenceAttribute, "");
630    _builder.newLineIfNotEmpty();
631    {
632      boolean _mongoDb = this.mongoDbProperties.mongoDb();
633      if (_mongoDb) {
634        String _manyReferenceLazyAttribute = this.manyReferenceLazyAttribute(it);
635        _builder.append(_manyReferenceLazyAttribute, "");
636        _builder.newLineIfNotEmpty();
637      }
638    }
639    return _builder.toString();
640  }
641  
642  public String _chained_manyReferenceIdsGetterBody(final Reference it) {
643    StringConcatenation _builder = new StringConcatenation();
644    {
645      boolean _mongoDb = this.mongoDbProperties.mongoDb();
646      if (_mongoDb) {
647        _builder.append("if (");
648        String _name = it.getName();
649        _builder.append(_name, "");
650        _builder.append(" == null) {");
651        _builder.newLineIfNotEmpty();
652        _builder.append("\t");
653        _builder.append("return ");
654        String _name_1 = it.getName();
655        _builder.append(_name_1, "\t");
656        String _unownedReferenceSuffix = this.helper.unownedReferenceSuffix(it);
657        _builder.append(_unownedReferenceSuffix, "\t");
658        _builder.append(";");
659        _builder.newLineIfNotEmpty();
660        _builder.append("} else {");
661        _builder.newLine();
662        _builder.append("\t");
663        _builder.append("// associated instances have been loaded, and possibly changed");
664        _builder.newLine();
665        _builder.append("\t");
666        String _collectionInterfaceType = this.helperBase.getCollectionInterfaceType(it);
667        _builder.append(_collectionInterfaceType, "\t");
668        _builder.append("<");
669        String _javaType = this.helperBase.getJavaType("IDTYPE");
670        _builder.append(_javaType, "\t");
671        _builder.append("> result = new ");
672        String _collectionImplType = this.helperBase.getCollectionImplType(it);
673        _builder.append(_collectionImplType, "\t");
674        _builder.append("<");
675        String _javaType_1 = this.helperBase.getJavaType("IDTYPE");
676        _builder.append(_javaType_1, "\t");
677        _builder.append(">();");
678        _builder.newLineIfNotEmpty();
679        _builder.append("\t");
680        _builder.append("for (");
681        String _typeName = this.helperBase.getTypeName(it);
682        _builder.append(_typeName, "\t");
683        _builder.append(" each : ");
684        String _name_2 = it.getName();
685        _builder.append(_name_2, "\t");
686        _builder.append(") {");
687        _builder.newLineIfNotEmpty();
688        _builder.append("\t\t");
689        _builder.append("if (each.getId() == null) {");
690        _builder.newLine();
691        _builder.append("\t\t\t");
692        _builder.append("throw new IllegalStateException(\"Reference ");
693        DomainObject _from = it.getFrom();
694        String _name_3 = _from.getName();
695        _builder.append(_name_3, "\t\t\t");
696        _builder.append(".");
697        String _name_4 = it.getName();
698        _builder.append(_name_4, "\t\t\t");
699        _builder.append(" contains unsaved instance. Cascade not supported. Save ");
700        DomainObject _to = it.getTo();
701        String _name_5 = _to.getName();
702        _builder.append(_name_5, "\t\t\t");
703        _builder.append(" before saving ");
704        DomainObject _from_1 = it.getFrom();
705        String _name_6 = _from_1.getName();
706        _builder.append(_name_6, "\t\t\t");
707        _builder.append(".\");");
708        _builder.newLineIfNotEmpty();
709        _builder.append("\t\t");
710        _builder.append("}");
711        _builder.newLine();
712        _builder.append("\t\t");
713        _builder.append("result.add(each.getId());");
714        _builder.newLine();
715        _builder.append("\t");
716        _builder.append("}");
717        _builder.newLine();
718        _builder.append("\t");
719        String _name_7 = it.getName();
720        _builder.append(_name_7, "\t");
721        String _unownedReferenceSuffix_1 = this.helper.unownedReferenceSuffix(it);
722        _builder.append(_unownedReferenceSuffix_1, "\t");
723        _builder.append(" = result;");
724        _builder.newLineIfNotEmpty();
725        _builder.append("\t");
726        _builder.append("return java.util.Collections.unmodifiable");
727        String _collectionType = it.getCollectionType();
728        String _firstUpper = this.helperBase.toFirstUpper(_collectionType);
729        _builder.append(_firstUpper, "\t");
730        _builder.append("(result);");
731        _builder.newLineIfNotEmpty();
732        _builder.append("}");
733        _builder.newLine();
734      } else {
735        DomainObjectReferenceTmpl _next = this.getNext();
736        String _manyReferenceIdsGetterBody = _next.manyReferenceIdsGetterBody(it);
737        _builder.append(_manyReferenceIdsGetterBody, "");
738        _builder.newLineIfNotEmpty();
739      }
740    }
741    return _builder.toString();
742  }
743  
744  public String _chained_manyReferenceAccessorsUnownedReference(final Reference it) {
745    StringConcatenation _builder = new StringConcatenation();
746    DomainObjectReferenceTmpl _next = this.getNext();
747    String _manyReferenceAccessorsUnownedReference = _next.manyReferenceAccessorsUnownedReference(it);
748    _builder.append(_manyReferenceAccessorsUnownedReference, "");
749    _builder.newLineIfNotEmpty();
750    {
751      boolean _mongoDb = this.mongoDbProperties.mongoDb();
752      if (_mongoDb) {
753        String _manyReferenceMongoDbLazyGetter = this.manyReferenceMongoDbLazyGetter(it);
754        _builder.append(_manyReferenceMongoDbLazyGetter, "");
755        _builder.newLineIfNotEmpty();
756        String _additionalManyReferenceAccessors = this.additionalManyReferenceAccessors(it);
757        _builder.append(_additionalManyReferenceAccessors, "");
758        _builder.newLineIfNotEmpty();
759      }
760    }
761    return _builder.toString();
762  }
763  
764  public DomainObjectReferenceTmpl[] _getOverridesDispatchArray() {
765    org.sculptor.generator.template.domain.DomainObjectReferenceTmpl[] result = new org.sculptor.generator.template.domain.DomainObjectReferenceTmpl[org.sculptor.generator.template.domain.DomainObjectReferenceTmplMethodIndexes.NUM_METHODS];
766    result[org.sculptor.generator.template.domain.DomainObjectReferenceTmplMethodIndexes.ONEREFERENCEATTRIBUTEUNOWNEDREFERENCE_REFERENCE] = this; 
767    result[org.sculptor.generator.template.domain.DomainObjectReferenceTmplMethodIndexes.ONEUNOWNEDREFERENCEGETTER_REFERENCE] = this; 
768    result[org.sculptor.generator.template.domain.DomainObjectReferenceTmplMethodIndexes.ONEUNOWNEDREFERENCESETTER_REFERENCE] = this; 
769    result[org.sculptor.generator.template.domain.DomainObjectReferenceTmplMethodIndexes.ONEREFERENCEIDGETTERBODY_REFERENCE] = this; 
770    result[org.sculptor.generator.template.domain.DomainObjectReferenceTmplMethodIndexes.ONEREFERENCEIDSETTERBODY_REFERENCE] = this; 
771    result[org.sculptor.generator.template.domain.DomainObjectReferenceTmplMethodIndexes.MANYUNOWNEDREFERENCEATTRIBUTE_REFERENCE] = this; 
772    result[org.sculptor.generator.template.domain.DomainObjectReferenceTmplMethodIndexes.MANYREFERENCEIDSGETTERBODY_REFERENCE] = this; 
773    result[org.sculptor.generator.template.domain.DomainObjectReferenceTmplMethodIndexes.MANYREFERENCEACCESSORSUNOWNEDREFERENCE_REFERENCE] = this; 
774    return result;
775  }
776}