/**
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 * 
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 * 
 *  This copyright notice shows up in the generated Java code
 */
package org.eclipse.osbp.xtext.entitymock.jvmmodel;

import com.google.inject.Inject;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.WordUtils;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.osbp.core.api.persistence.IPersistenceService;
import org.eclipse.osbp.datainterchange.api.IDataInterchange;
import org.eclipse.osbp.dsl.entity.xtext.extensions.ModelExtensions;
import org.eclipse.osbp.dsl.semantic.common.types.LEnum;
import org.eclipse.osbp.dsl.semantic.common.types.LEnumLiteral;
import org.eclipse.osbp.dsl.semantic.common.types.LScalarType;
import org.eclipse.osbp.dsl.semantic.entity.LBean;
import org.eclipse.osbp.dsl.semantic.entity.LEntity;
import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
import org.eclipse.osbp.runtime.common.event.IEventDispatcher;
import org.eclipse.osbp.ui.api.customfields.IBlobService;
import org.eclipse.osbp.ui.api.datamart.IDataMart;
import org.eclipse.osbp.utils.annotation.CommonUtils;
import org.eclipse.osbp.utils.common.EntityUtils;
import org.eclipse.osbp.utils.entityhelper.DataType;
import org.eclipse.osbp.xtext.datainterchange.jvmmodel.DataDSLJvmModelInferrer;
import org.eclipse.osbp.xtext.entitymock.DateIterate;
import org.eclipse.osbp.xtext.entitymock.EDateStepType;
import org.eclipse.osbp.xtext.entitymock.EntityMock;
import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject;
import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference;
import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeFiller;
import org.eclipse.osbp.xtext.entitymock.EntityMockByResourceAttribute;
import org.eclipse.osbp.xtext.entitymock.EntityMockEntities;
import org.eclipse.osbp.xtext.entitymock.EntityMockEntity;
import org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction;
import org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter;
import org.eclipse.osbp.xtext.entitymock.EntityMockObject;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectArrayValue;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectEmbed;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectEnum;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectFill;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunction;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunctionParameter;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectItemValue;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectPlainValue;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectResourceValue;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjects;
import org.eclipse.osbp.xtext.entitymock.EntityMockPackage;
import org.eclipse.osbp.xtext.entitymock.EntityMockResource;
import org.eclipse.osbp.xtext.entitymock.EntityMockResourceAttribute;
import org.eclipse.osbp.xtext.entitymock.EntityMockResourceDataRow;
import org.eclipse.osbp.xtext.entitymock.EntityMockResources;
import org.eclipse.osbp.xtext.entitymock.EntityMockTemplate;
import org.eclipse.osbp.xtext.entitymock.IEntityMockAttribute;
import org.eclipse.osbp.xtext.entitymock.IEntityMockObjectAttribute;
import org.eclipse.osbp.xtext.entitymock.IEntityMockObjectUsable;
import org.eclipse.osbp.xtext.entitymock.IIterate;
import org.eclipse.osbp.xtext.entitymock.IntegerIterate;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerBoolean;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerDateFuture;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerDatePast;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerDateRange;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRandom;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRandom;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerTextParagraphs;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerTextRandom;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerTextSentences;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerTextWords;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerType;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRandom;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRandom;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange;
import org.eclipse.osbp.xtext.entitymock.RunningDataInterchange;
import org.eclipse.osbp.xtext.entitymock.RunningDataInterchanges;
import org.eclipse.osbp.xtext.entitymock.common.ABaseMockEntity;
import org.eclipse.osbp.xtext.entitymock.common.ABaseMockObject;
import org.eclipse.osbp.xtext.entitymock.common.ABaseMockResource;
import org.eclipse.osbp.xtext.entitymock.common.AEntityMockDataGenerator;
import org.eclipse.osbp.xtext.entitymock.common.IEntityMockDataDbFiller;
import org.eclipse.osbp.xtext.entitymock.common.IEntityMockDataGenerator;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtext.common.types.JvmAnnotationReference;
import org.eclipse.xtext.common.types.JvmConstructor;
import org.eclipse.xtext.common.types.JvmEnumerationType;
import org.eclipse.xtext.common.types.JvmField;
import org.eclipse.xtext.common.types.JvmFormalParameter;
import org.eclipse.xtext.common.types.JvmGenericType;
import org.eclipse.xtext.common.types.JvmMember;
import org.eclipse.xtext.common.types.JvmOperation;
import org.eclipse.xtext.common.types.JvmType;
import org.eclipse.xtext.common.types.JvmTypeReference;
import org.eclipse.xtext.common.types.JvmVisibility;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.xbase.compiler.output.ITreeAppendable;
import org.eclipse.xtext.xbase.jvmmodel.AbstractModelInferrer;
import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor;
import org.eclipse.xtext.xbase.jvmmodel.JvmTypesBuilder;
import org.eclipse.xtext.xbase.lib.Exceptions;
import org.eclipse.xtext.xbase.lib.Extension;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import org.eclipse.xtext.xbase.lib.StringExtensions;
import org.osgi.service.component.annotations.Component;
import org.slf4j.Logger;

/**
 * <p>Infers a JVM model from the source model.</p>
 * 
 * <p>The JVM model should contain all elements that would appear in the Java code
 * which is generated from the source model. Other models link against the JVM model rather than the source model.</p>
 */
@SuppressWarnings("restriction")
public class EntityMockDSLJvmModelInferrer extends AbstractModelInferrer {
  /**
   * convenience API to build and initialize JVM types and their members.
   */
  @Inject
  @Extension
  private JvmTypesBuilder _jvmTypesBuilder;
  
  @Inject
  @Extension
  private DataDSLJvmModelInferrer _dataDSLJvmModelInferrer;
  
  @Inject
  @Extension
  private IQualifiedNameProvider _iQualifiedNameProvider;
  
  @Inject
  @Extension
  private EntityUtils _entityUtils;
  
  @Inject
  private ModelExtensions entityExtensions;
  
  @Inject
  @Extension
  private CommonUtils _commonUtils;
  
  @Inject
  private DataType dtType;
  
  /**
   * The dispatch method {@code infer} is called for each instance of the
   * given element's type that is contained in a resource.
   */
  protected void _infer(final EntityMock mock, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPreIndexingPhase) {
    EntityMockResources _resources = mock.getResources();
    EList<EntityMockResource> _resources_1 = null;
    if (_resources!=null) {
      _resources_1=_resources.getResources();
    }
    if (_resources_1!=null) {
      final Consumer<EntityMockResource> _function = (EntityMockResource mockResource) -> {
        try {
          this.generateMockResource(mock, acceptor, mockResource);
        } catch (final Throwable _t) {
          if (_t instanceof Exception) {
            final Exception e = (Exception)_t;
            e.printStackTrace();
          } else {
            throw Exceptions.sneakyThrow(_t);
          }
        }
      };
      _resources_1.forEach(_function);
    }
    EntityMockObjects _objects = mock.getObjects();
    EList<EntityMockObject> _objects_1 = null;
    if (_objects!=null) {
      _objects_1=_objects.getObjects();
    }
    if (_objects_1!=null) {
      final Consumer<EntityMockObject> _function_1 = (EntityMockObject mockObject) -> {
        try {
          this.generateMockObject(mock, acceptor, mockObject);
        } catch (final Throwable _t) {
          if (_t instanceof Exception) {
            final Exception e = (Exception)_t;
            e.printStackTrace();
          } else {
            throw Exceptions.sneakyThrow(_t);
          }
        }
      };
      _objects_1.forEach(_function_1);
    }
    EntityMockEntities _entities = mock.getEntities();
    EList<EntityMockEntity> _entities_1 = null;
    if (_entities!=null) {
      _entities_1=_entities.getEntities();
    }
    if (_entities_1!=null) {
      final Consumer<EntityMockEntity> _function_2 = (EntityMockEntity mockEntity) -> {
        try {
          this.generateMockEntity(mock, acceptor, mockEntity);
        } catch (final Throwable _t) {
          if (_t instanceof Exception) {
            final Exception e = (Exception)_t;
            e.printStackTrace();
          } else {
            throw Exceptions.sneakyThrow(_t);
          }
        }
      };
      _entities_1.forEach(_function_2);
    }
    try {
      this.generateMockDataGenerator(mock, acceptor);
    } catch (final Throwable _t) {
      if (_t instanceof Exception) {
        final Exception e = (Exception)_t;
        e.printStackTrace();
      } else {
        throw Exceptions.sneakyThrow(_t);
      }
    }
  }
  
  /**
   * generate the full qualified mock package name corresponding to the imported entities
   */
  public String entityMockName(final EntityMock mock) {
    StringConcatenation _builder = new StringConcatenation();
    EObject _eContainer = mock.eContainer();
    String _string = this._iQualifiedNameProvider.getFullyQualifiedName(((EntityMockPackage) _eContainer)).toString();
    _builder.append(_string);
    _builder.append(".");
    String _name = mock.getName();
    _builder.append(_name);
    _builder.append("Mock");
    return _builder.toString();
  }
  
  /**
   * generate the class name for a template mock object
   */
  public String entityMockName(final EntityMockTemplate template, final EntityMock mock) {
    EntityMockObject _object = template.getObject();
    return this.entityMockName(((EntityMockObject) _object), mock);
  }
  
  /**
   * generate the class name for a mock resource class
   */
  public String entityMockName(final EntityMockResource resource, final EntityMock mock) {
    StringConcatenation _builder = new StringConcatenation();
    EObject _eContainer = mock.eContainer();
    String _string = this._iQualifiedNameProvider.getFullyQualifiedName(((EntityMockPackage) _eContainer)).toString();
    _builder.append(_string);
    _builder.append(".");
    String _name = mock.getName();
    _builder.append(_name);
    _builder.append("Resource");
    String _capitalize = WordUtils.capitalize(resource.getName());
    _builder.append(_capitalize);
    return _builder.toString();
  }
  
  /**
   * generate the class name for a mock object class
   */
  public String entityMockName(final EntityMockObject object, final EntityMock mock) {
    StringConcatenation _builder = new StringConcatenation();
    EObject _eContainer = mock.eContainer();
    String _string = this._iQualifiedNameProvider.getFullyQualifiedName(((EntityMockPackage) _eContainer)).toString();
    _builder.append(_string);
    _builder.append(".");
    String _name = mock.getName();
    _builder.append(_name);
    _builder.append("Object");
    String _capitalize = WordUtils.capitalize(object.getName());
    _builder.append(_capitalize);
    return _builder.toString();
  }
  
  /**
   * generate the class name for a mock entity
   */
  public String entityMockName(final EntityMockEntity entity, final EntityMock mock) {
    StringConcatenation _builder = new StringConcatenation();
    EObject _eContainer = mock.eContainer();
    String _string = this._iQualifiedNameProvider.getFullyQualifiedName(((EntityMockPackage) _eContainer)).toString();
    _builder.append(_string);
    _builder.append(".");
    String _name = mock.getName();
    _builder.append(_name);
    _builder.append("Entity");
    String _capitalize = WordUtils.capitalize(entity.getName());
    _builder.append(_capitalize);
    return _builder.toString();
  }
  
  /**
   * get the entity name referenced by a mock entity
   */
  public String entityName(final EntityMockEntity entity) {
    return this.entityName(entity.getEntityRef());
  }
  
  /**
   * get the entity name
   */
  public String entityName(final LEntity entity) {
    return entity.getName();
  }
  
  /**
   * get the entity name
   */
  public String enumName(final LEnum lenum) {
    return lenum.getName();
  }
  
  /**
   * get the full qualified entity name referenced by a mock entity
   */
  public String entityFQN(final EntityMockEntity entity) {
    return EntityUtils.getFQNForLEntity(entity.getEntityRef());
  }
  
  /**
   * get the full qualified dto name referenced by a mock entity
   */
  public String entityDtoFQN(final EntityMockEntity entity) {
    return EntityUtils.getDtoFQNForLEntity(entity.getEntityRef());
  }
  
  /**
   * get the full qualified dto class name referenced by a mock entity
   */
  public String entityDtoFQNClass(final EntityMockEntity entity) {
    return this.entityDtoFQNClass(entity.getEntityRef());
  }
  
  /**
   * get the full qualified entity class name
   */
  public String entityDtoFQNClass(final LEntity entity) {
    StringConcatenation _builder = new StringConcatenation();
    String _dtoFQNForLEntity = EntityUtils.getDtoFQNForLEntity(entity);
    _builder.append(_dtoFQNForLEntity);
    _builder.append(".class");
    return _builder.toString();
  }
  
  /**
   * generate a mock object class
   */
  public void generateMockObject(final EntityMock model, final IJvmDeclaredTypeAcceptor acceptor, final EntityMockObject mockObject) {
    JvmGenericType mockClass = this._jvmTypesBuilder.toClass(model, this.entityMockName(mockObject, model));
    final Procedure1<JvmGenericType> _function = (JvmGenericType it) -> {
      this._jvmTypesBuilder.setFileHeader(it, this._jvmTypesBuilder.getDocumentation(model));
      EList<JvmTypeReference> _superTypes = it.getSuperTypes();
      JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(ABaseMockObject.class);
      this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes, _typeRef);
      JvmField field = null;
      final Procedure1<JvmField> _function_1 = (JvmField it_1) -> {
        final Procedure1<ITreeAppendable> _function_2 = (ITreeAppendable it_2) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("LoggerFactory.getLogger(\"mock\")");
          it_2.append(_builder);
        };
        this._jvmTypesBuilder.setInitializer(it_1, _function_2);
      };
      field = this._jvmTypesBuilder.toField(model, "log", this._typeReferenceBuilder.typeRef(Logger.class), _function_1);
      field.setStatic(true);
      EList<JvmMember> _members = it.getMembers();
      this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
      EList<EntityMockObjectEnum> _enumerations = mockObject.getEnumerations();
      for (final EntityMockObjectEnum enumeration : _enumerations) {
        LEnum _usingResource = enumeration.getUsingResource();
        if ((_usingResource instanceof EntityMockResource)) {
          LEnum _usingResource_1 = enumeration.getUsingResource();
          final EntityMockResource resource = ((EntityMockResource) _usingResource_1);
          EList<JvmMember> _members_1 = it.getMembers();
          StringConcatenation _builder = new StringConcatenation();
          String _name = enumeration.getName();
          _builder.append(_name);
          _builder.append("_resource");
          final Procedure1<JvmField> _function_2 = (JvmField it_1) -> {
            final Procedure1<ITreeAppendable> _function_3 = (ITreeAppendable it_2) -> {
              StringConcatenation _builder_1 = new StringConcatenation();
              _builder_1.append("new ");
              String _entityMockName = this.entityMockName(resource, model);
              _builder_1.append(_entityMockName);
              _builder_1.append("()");
              it_2.append(_builder_1);
            };
            this._jvmTypesBuilder.setInitializer(it_1, _function_3);
            this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(enumeration));
            it_1.setVisibility(JvmVisibility.PRIVATE);
            it_1.setStatic(true);
          };
          JvmField _field = this._jvmTypesBuilder.toField(mockObject, _builder.toString(), 
            this._typeReferenceBuilder.typeRef(ABaseMockResource.class), _function_2);
          this._jvmTypesBuilder.<JvmField>operator_add(_members_1, _field);
        }
      }
      EList<IEntityMockObjectAttribute> _attributes = mockObject.getAttributes();
      for (final IEntityMockObjectAttribute attribute : _attributes) {
        boolean _matched = false;
        if (attribute instanceof EntityMockObjectPlainValue) {
          _matched=true;
          final List<String> items = new ArrayList<String>();
          EList<String> _values = ((EntityMockObjectPlainValue)attribute).getValues();
          for (final String value : _values) {
            StringConcatenation _builder_1 = new StringConcatenation();
            _builder_1.append("\"");
            _builder_1.append(value);
            _builder_1.append("\"");
            items.add(_builder_1.toString());
          }
          EList<JvmMember> _members_2 = it.getMembers();
          StringConcatenation _builder_2 = new StringConcatenation();
          String _name_1 = ((EntityMockObjectPlainValue)attribute).getName();
          _builder_2.append(_name_1);
          _builder_2.append("_items");
          final Procedure1<JvmField> _function_3 = (JvmField it_1) -> {
            final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
              StringConcatenation _builder_3 = new StringConcatenation();
              _builder_3.append("{");
              String _join = StringUtils.join(items, ",");
              _builder_3.append(_join);
              _builder_3.append("}");
              it_2.append(_builder_3);
            };
            this._jvmTypesBuilder.setInitializer(it_1, _function_4);
            this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
            it_1.setVisibility(JvmVisibility.PRIVATE);
            it_1.setStatic(true);
          };
          JvmField _field_1 = this._jvmTypesBuilder.toField(mockObject, _builder_2.toString(), 
            this._typeReferenceBuilder.typeRef(Object[].class), _function_3);
          this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_1);
        }
        if (!_matched) {
          if (attribute instanceof EntityMockObjectResourceValue) {
            _matched=true;
          }
        }
        if (!_matched) {
          if (attribute instanceof EntityMockObjectArrayValue) {
            _matched=true;
            final List<String> enums = new ArrayList<String>();
            String _xifexpression = null;
            LEnum _usingResource_2 = ((EntityMockObjectArrayValue)attribute).getEnumeration().getUsingResource();
            if ((_usingResource_2 instanceof EntityMockResource)) {
              _xifexpression = "String";
            } else {
              StringConcatenation _builder_1 = new StringConcatenation();
              String _dtoFQNForLEnum = EntityUtils.getDtoFQNForLEnum(((EntityMockObjectArrayValue)attribute).getEnumeration().getUsingResource());
              _builder_1.append(_dtoFQNForLEnum);
              _xifexpression = _builder_1.toString();
            }
            final String keyType = _xifexpression;
            EList<EntityMockObjectItemValue> _items = ((EntityMockObjectArrayValue)attribute).getItems();
            for (final EntityMockObjectItemValue enumItem : _items) {
              {
                final List<String> items = new ArrayList<String>();
                EList<String> _values = enumItem.getValues();
                for (final String value : _values) {
                  StringConcatenation _builder_2 = new StringConcatenation();
                  _builder_2.append("\"");
                  _builder_2.append(value);
                  _builder_2.append("\"");
                  items.add(_builder_2.toString());
                }
                LEnumLiteral _datarow = enumItem.getDatarow();
                if ((_datarow instanceof EntityMockResourceDataRow)) {
                  StringConcatenation _builder_3 = new StringConcatenation();
                  _builder_3.append("put(\"");
                  String _name_1 = enumItem.getDatarow().getName();
                  _builder_3.append(_name_1);
                  _builder_3.append("\", new Object[] {");
                  String _join = StringUtils.join(items, ",");
                  _builder_3.append(_join);
                  _builder_3.append("});");
                  enums.add(_builder_3.toString());
                } else {
                  StringConcatenation _builder_4 = new StringConcatenation();
                  _builder_4.append("put(");
                  _builder_4.append(keyType);
                  _builder_4.append(".");
                  String _name_2 = enumItem.getDatarow().getName();
                  _builder_4.append(_name_2);
                  _builder_4.append(", new Object[] {");
                  String _join_1 = StringUtils.join(items, ",");
                  _builder_4.append(_join_1);
                  _builder_4.append("});");
                  enums.add(_builder_4.toString());
                }
              }
            }
            EList<JvmMember> _members_2 = it.getMembers();
            StringConcatenation _builder_2 = new StringConcatenation();
            String _name_1 = ((EntityMockObjectArrayValue)attribute).getName();
            _builder_2.append(_name_1);
            _builder_2.append("_items");
            final Procedure1<JvmField> _function_3 = (JvmField it_1) -> {
              final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
                StringConcatenation _builder_3 = new StringConcatenation();
                _builder_3.append("new HashMap<");
                _builder_3.append(keyType);
                _builder_3.append(", Object[]>() {{");
                _builder_3.newLineIfNotEmpty();
                String _join = StringUtils.join(enums, "\r\n");
                _builder_3.append(_join);
                _builder_3.newLineIfNotEmpty();
                _builder_3.append("}}");
                it_2.append(_builder_3);
              };
              this._jvmTypesBuilder.setInitializer(it_1, _function_4);
              this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
              it_1.setVisibility(JvmVisibility.PRIVATE);
              it_1.setStatic(true);
            };
            JvmField _field_1 = this._jvmTypesBuilder.toField(mockObject, _builder_2.toString(), this._typeReferenceBuilder.typeRef(Map.class), _function_3);
            this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_1);
          }
        }
        if (!_matched) {
          if (attribute instanceof EntityMockObjectEmbed) {
            _matched=true;
          }
        }
        if (!_matched) {
          if (attribute instanceof EntityMockObjectFill) {
            _matched=true;
            PropertyFillerType type = ((EntityMockObjectFill)attribute).getFillerType();
            boolean _matched_1 = false;
            if (type instanceof PropertyFillerTextRandom) {
              _matched_1=true;
              final List<String> items = new ArrayList<String>();
              EList<String> _items = ((PropertyFillerTextRandom)type).getItems();
              for (final String item : _items) {
                StringConcatenation _builder_1 = new StringConcatenation();
                _builder_1.append("\"");
                _builder_1.append(item);
                _builder_1.append("\"");
                items.add(_builder_1.toString());
              }
              EList<JvmMember> _members_2 = it.getMembers();
              StringConcatenation _builder_2 = new StringConcatenation();
              String _name_1 = ((EntityMockObjectFill)attribute).getName();
              _builder_2.append(_name_1);
              _builder_2.append("_items");
              final Procedure1<JvmField> _function_3 = (JvmField it_1) -> {
                final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
                  StringConcatenation _builder_3 = new StringConcatenation();
                  _builder_3.append("{");
                  String _join = StringUtils.join(items, ",");
                  _builder_3.append(_join);
                  _builder_3.append("}");
                  it_2.append(_builder_3);
                };
                this._jvmTypesBuilder.setInitializer(it_1, _function_4);
                this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
                it_1.setVisibility(JvmVisibility.PRIVATE);
                it_1.setStatic(true);
              };
              JvmField _field_1 = this._jvmTypesBuilder.toField(mockObject, _builder_2.toString(), 
                this._typeReferenceBuilder.typeRef(Object[].class), _function_3);
              this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_1);
            }
            if (!_matched_1) {
              if (type instanceof PropertyFillerSignedDoubleRandom) {
                _matched_1=true;
                final List<String> items = new ArrayList<String>();
                EList<Double> _items = ((PropertyFillerSignedDoubleRandom)type).getItems();
                for (final Double item : _items) {
                  StringConcatenation _builder_1 = new StringConcatenation();
                  _builder_1.append(item);
                  items.add(_builder_1.toString());
                }
                EList<JvmMember> _members_2 = it.getMembers();
                StringConcatenation _builder_2 = new StringConcatenation();
                String _name_1 = ((EntityMockObjectFill)attribute).getName();
                _builder_2.append(_name_1);
                _builder_2.append("_items");
                final Procedure1<JvmField> _function_3 = (JvmField it_1) -> {
                  final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
                    StringConcatenation _builder_3 = new StringConcatenation();
                    _builder_3.append("{");
                    String _join = StringUtils.join(items, ",");
                    _builder_3.append(_join);
                    _builder_3.append("}");
                    it_2.append(_builder_3);
                  };
                  this._jvmTypesBuilder.setInitializer(it_1, _function_4);
                  this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
                  it_1.setVisibility(JvmVisibility.PRIVATE);
                  it_1.setStatic(true);
                };
                JvmField _field_1 = this._jvmTypesBuilder.toField(mockObject, _builder_2.toString(), 
                  this._typeReferenceBuilder.typeRef(double[].class), _function_3);
                this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_1);
              }
            }
            if (!_matched_1) {
              if (type instanceof PropertyFillerUnsignedDoubleRandom) {
                _matched_1=true;
                final List<String> items = new ArrayList<String>();
                EList<Double> _items = ((PropertyFillerUnsignedDoubleRandom)type).getItems();
                for (final Double item : _items) {
                  StringConcatenation _builder_1 = new StringConcatenation();
                  _builder_1.append(item);
                  items.add(_builder_1.toString());
                }
                EList<JvmMember> _members_2 = it.getMembers();
                StringConcatenation _builder_2 = new StringConcatenation();
                String _name_1 = ((EntityMockObjectFill)attribute).getName();
                _builder_2.append(_name_1);
                _builder_2.append("_items");
                final Procedure1<JvmField> _function_3 = (JvmField it_1) -> {
                  final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
                    StringConcatenation _builder_3 = new StringConcatenation();
                    _builder_3.append("{");
                    String _join = StringUtils.join(items, ",");
                    _builder_3.append(_join);
                    _builder_3.append("}");
                    it_2.append(_builder_3);
                  };
                  this._jvmTypesBuilder.setInitializer(it_1, _function_4);
                  this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
                  it_1.setVisibility(JvmVisibility.PRIVATE);
                  it_1.setStatic(true);
                };
                JvmField _field_1 = this._jvmTypesBuilder.toField(mockObject, _builder_2.toString(), 
                  this._typeReferenceBuilder.typeRef(double[].class), _function_3);
                this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_1);
              }
            }
            if (!_matched_1) {
              if (type instanceof PropertyFillerSignedIntegerRandom) {
                _matched_1=true;
                final List<String> items = new ArrayList<String>();
                EList<Integer> _items = ((PropertyFillerSignedIntegerRandom)type).getItems();
                for (final Integer item : _items) {
                  StringConcatenation _builder_1 = new StringConcatenation();
                  _builder_1.append(item);
                  items.add(_builder_1.toString());
                }
                EList<JvmMember> _members_2 = it.getMembers();
                StringConcatenation _builder_2 = new StringConcatenation();
                String _name_1 = ((EntityMockObjectFill)attribute).getName();
                _builder_2.append(_name_1);
                _builder_2.append("_items");
                final Procedure1<JvmField> _function_3 = (JvmField it_1) -> {
                  final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
                    StringConcatenation _builder_3 = new StringConcatenation();
                    _builder_3.append("{");
                    String _join = StringUtils.join(items, ",");
                    _builder_3.append(_join);
                    _builder_3.append("}");
                    it_2.append(_builder_3);
                  };
                  this._jvmTypesBuilder.setInitializer(it_1, _function_4);
                  this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
                  it_1.setVisibility(JvmVisibility.PRIVATE);
                  it_1.setStatic(true);
                };
                JvmField _field_1 = this._jvmTypesBuilder.toField(mockObject, _builder_2.toString(), 
                  this._typeReferenceBuilder.typeRef(int[].class), _function_3);
                this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_1);
              }
            }
            if (!_matched_1) {
              if (type instanceof PropertyFillerUnsignedIntegerRandom) {
                _matched_1=true;
                final List<String> items = new ArrayList<String>();
                EList<Integer> _items = ((PropertyFillerUnsignedIntegerRandom)type).getItems();
                for (final Integer item : _items) {
                  StringConcatenation _builder_1 = new StringConcatenation();
                  _builder_1.append(item);
                  items.add(_builder_1.toString());
                }
                EList<JvmMember> _members_2 = it.getMembers();
                StringConcatenation _builder_2 = new StringConcatenation();
                String _name_1 = ((EntityMockObjectFill)attribute).getName();
                _builder_2.append(_name_1);
                _builder_2.append("_items");
                final Procedure1<JvmField> _function_3 = (JvmField it_1) -> {
                  final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
                    StringConcatenation _builder_3 = new StringConcatenation();
                    _builder_3.append("{");
                    String _join = StringUtils.join(items, ",");
                    _builder_3.append(_join);
                    _builder_3.append("}");
                    it_2.append(_builder_3);
                  };
                  this._jvmTypesBuilder.setInitializer(it_1, _function_4);
                  this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
                  it_1.setVisibility(JvmVisibility.PRIVATE);
                  it_1.setStatic(true);
                };
                JvmField _field_1 = this._jvmTypesBuilder.toField(mockObject, _builder_2.toString(), 
                  this._typeReferenceBuilder.typeRef(int[].class), _function_3);
                this._jvmTypesBuilder.<JvmField>operator_add(_members_2, _field_1);
              }
            }
          }
        }
      }
      EList<EntityMockObjectFunction> _calculations = mockObject.getCalculations();
      for (final EntityMockObjectFunction calculation : _calculations) {
        EList<JvmMember> _members_2 = it.getMembers();
        StringConcatenation _builder_1 = new StringConcatenation();
        _builder_1.append("calculate_");
        String _name_1 = calculation.getName();
        _builder_1.append(_name_1);
        final Procedure1<JvmOperation> _function_3 = (JvmOperation it_1) -> {
          it_1.setVisibility(JvmVisibility.PROTECTED);
          EList<EntityMockObjectFunctionParameter> _params = calculation.getParams();
          for (final EntityMockObjectFunctionParameter param : _params) {
            {
              JvmTypeReference type = param.getParameterType();
              EList<JvmFormalParameter> _parameters = it_1.getParameters();
              JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(param, this.getName(param.getName()), type);
              this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
            }
          }
          it_1.setFinal(true);
          this._jvmTypesBuilder.setBody(it_1, calculation.getBody());
        };
        JvmOperation _method = this._jvmTypesBuilder.toMethod(mockObject, _builder_1.toString(), calculation.getOftype(), _function_3);
        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, _method);
      }
      EList<JvmMember> _members_3 = it.getMembers();
      StringConcatenation _builder_2 = new StringConcatenation();
      _builder_2.append("generateDataRow");
      final Procedure1<JvmOperation> _function_4 = (JvmOperation it_1) -> {
        it_1.setVisibility(JvmVisibility.PROTECTED);
        it_1.setFinal(true);
        final Procedure1<ITreeAppendable> _function_5 = (ITreeAppendable it_2) -> {
          EList<EntityMockObjectEnum> _enumerations_1 = mockObject.getEnumerations();
          for (final EntityMockObjectEnum enumeration_1 : _enumerations_1) {
            {
              String doc = this._jvmTypesBuilder.getDocumentation(enumeration_1);
              if (((doc instanceof String) && (!doc.trim().isEmpty()))) {
                StringConcatenation _builder_3 = new StringConcatenation();
                _builder_3.append("/** ");
                _builder_3.append(doc);
                _builder_3.append(" */");
                _builder_3.newLineIfNotEmpty();
                it_2.append(_builder_3);
              }
              LEnum _usingResource_2 = enumeration_1.getUsingResource();
              if ((_usingResource_2 instanceof EntityMockResource)) {
                StringConcatenation _builder_4 = new StringConcatenation();
                _builder_4.append("generateAttribute(\"");
                String _name_2 = enumeration_1.getName();
                _builder_4.append(_name_2);
                _builder_4.append("\", ");
                String _name_3 = enumeration_1.getName();
                _builder_4.append(_name_3);
                _builder_4.append("_resource.getDataRows().toArray());");
                _builder_4.newLineIfNotEmpty();
                it_2.append(_builder_4);
              } else {
                final LEnum lenum = enumeration_1.getUsingResource();
                StringConcatenation _builder_5 = new StringConcatenation();
                _builder_5.append("generateAttribute(\"");
                String _name_4 = enumeration_1.getName();
                _builder_5.append(_name_4);
                _builder_5.append("\",");
                String _dtoFQNForLEnum = EntityUtils.getDtoFQNForLEnum(lenum);
                _builder_5.append(_dtoFQNForLEnum);
                _builder_5.append(".values());");
                _builder_5.newLineIfNotEmpty();
                it_2.append(_builder_5);
              }
            }
          }
          EList<IEntityMockObjectAttribute> _attributes_1 = mockObject.getAttributes();
          for (final IEntityMockObjectAttribute attribute_1 : _attributes_1) {
            {
              String doc = this._jvmTypesBuilder.getDocumentation(attribute_1);
              if (((doc instanceof String) && (!doc.trim().isEmpty()))) {
                StringConcatenation _builder_3 = new StringConcatenation();
                _builder_3.append("/** ");
                _builder_3.append(doc);
                _builder_3.append(" */");
                _builder_3.newLineIfNotEmpty();
                it_2.append(_builder_3);
              }
              boolean _matched_1 = false;
              if (attribute_1 instanceof EntityMockObjectPlainValue) {
                _matched_1=true;
                StringConcatenation _builder_4 = new StringConcatenation();
                _builder_4.append("generateAttribute(\"");
                String _name_2 = ((EntityMockObjectPlainValue)attribute_1).getName();
                _builder_4.append(_name_2);
                _builder_4.append("\", ");
                String _name_3 = ((EntityMockObjectPlainValue)attribute_1).getName();
                _builder_4.append(_name_3);
                _builder_4.append("_items);");
                _builder_4.newLineIfNotEmpty();
                it_2.append(_builder_4);
              }
              if (!_matched_1) {
                if (attribute_1 instanceof EntityMockObjectResourceValue) {
                  _matched_1=true;
                  LEnum _usingResource_2 = ((EntityMockObjectResourceValue)attribute_1).getResourceEnum().getUsingResource();
                  if ((_usingResource_2 instanceof EntityMockResource)) {
                    StringConcatenation _builder_4 = new StringConcatenation();
                    _builder_4.append("setFixAttribute(\"");
                    String _name_2 = ((EntityMockObjectResourceValue)attribute_1).getName();
                    _builder_4.append(_name_2);
                    _builder_4.append("\", ");
                    String _name_3 = ((EntityMockObjectResourceValue)attribute_1).getResourceEnum().getName();
                    _builder_4.append(_name_3);
                    _builder_4.append("_resource.getAttribute(getAttribute(\"");
                    String _name_4 = ((EntityMockObjectResourceValue)attribute_1).getResourceEnum().getName();
                    _builder_4.append(_name_4);
                    _builder_4.append("\").toString(), \"");
                    String _name_5 = ((EntityMockObjectResourceValue)attribute_1).getResourceAttribute().getName();
                    _builder_4.append(_name_5);
                    _builder_4.append("\"));");
                    _builder_4.newLineIfNotEmpty();
                    it_2.append(_builder_4);
                  } else {
                    StringConcatenation _builder_5 = new StringConcatenation();
                    _builder_5.append("setFixAttribute(\"");
                    String _name_6 = ((EntityMockObjectResourceValue)attribute_1).getName();
                    _builder_5.append(_name_6);
                    _builder_5.append("\", getAttribute(\"");
                    String _name_7 = ((EntityMockObjectResourceValue)attribute_1).getResourceEnum().getName();
                    _builder_5.append(_name_7);
                    _builder_5.append("\"));");
                    _builder_5.newLineIfNotEmpty();
                    it_2.append(_builder_5);
                  }
                }
              }
              if (!_matched_1) {
                if (attribute_1 instanceof EntityMockObjectArrayValue) {
                  _matched_1=true;
                  StringConcatenation _builder_4 = new StringConcatenation();
                  _builder_4.append("generateAttribute(\"");
                  String _name_2 = ((EntityMockObjectArrayValue)attribute_1).getName();
                  _builder_4.append(_name_2);
                  _builder_4.append("\", \"");
                  String _name_3 = ((EntityMockObjectArrayValue)attribute_1).getEnumeration().getName();
                  _builder_4.append(_name_3);
                  _builder_4.append("\", ");
                  String _name_4 = ((EntityMockObjectArrayValue)attribute_1).getName();
                  _builder_4.append(_name_4);
                  _builder_4.append("_items);");
                  _builder_4.newLineIfNotEmpty();
                  it_2.append(_builder_4);
                }
              }
              if (!_matched_1) {
                if (attribute_1 instanceof EntityMockObjectEmbed) {
                  _matched_1=true;
                  StringConcatenation _builder_4 = new StringConcatenation();
                  _builder_4.append("generateAttribute(\"");
                  String _name_2 = ((EntityMockObjectEmbed)attribute_1).getName();
                  _builder_4.append(_name_2);
                  _builder_4.append("\", new ");
                  String _entityMockName = this.entityMockName(((EntityMockObjectEmbed)attribute_1).getObject(), model);
                  _builder_4.append(_entityMockName);
                  _builder_4.append("());");
                  _builder_4.newLineIfNotEmpty();
                  it_2.append(_builder_4);
                }
              }
              if (!_matched_1) {
                if (attribute_1 instanceof EntityMockObjectFill) {
                  _matched_1=true;
                  PropertyFillerType type = ((EntityMockObjectFill)attribute_1).getFillerType();
                  boolean _matched_2 = false;
                  if (type instanceof PropertyFillerDateFuture) {
                    _matched_2=true;
                    StringConcatenation _builder_4 = new StringConcatenation();
                    _builder_4.append("generateDateAttribute(\"");
                    String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
                    _builder_4.append(_name_2);
                    _builder_4.append("\", 0 ,");
                    int _dateFutureYears = ((PropertyFillerDateFuture)type).getDateFutureYears();
                    _builder_4.append(_dateFutureYears);
                    _builder_4.append(");");
                    _builder_4.newLineIfNotEmpty();
                    it_2.append(_builder_4);
                  }
                  if (!_matched_2) {
                    if (type instanceof PropertyFillerDatePast) {
                      _matched_2=true;
                      StringConcatenation _builder_4 = new StringConcatenation();
                      _builder_4.append("generateDateAttribute(\"");
                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_4.append(_name_2);
                      _builder_4.append("\", -");
                      int _datePastYears = ((PropertyFillerDatePast)type).getDatePastYears();
                      _builder_4.append(_datePastYears);
                      _builder_4.append(", 0);");
                      _builder_4.newLineIfNotEmpty();
                      it_2.append(_builder_4);
                    }
                  }
                  if (!_matched_2) {
                    if (type instanceof PropertyFillerDateRange) {
                      _matched_2=true;
                      StringConcatenation _builder_4 = new StringConcatenation();
                      _builder_4.append("generateDateAttribute(\"");
                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_4.append(_name_2);
                      _builder_4.append("\", ");
                      int _dateBeginYears = ((PropertyFillerDateRange)type).getDateBeginYears();
                      _builder_4.append(_dateBeginYears);
                      _builder_4.append(", ");
                      int _dateEndYears = ((PropertyFillerDateRange)type).getDateEndYears();
                      _builder_4.append(_dateEndYears);
                      _builder_4.append(");");
                      _builder_4.newLineIfNotEmpty();
                      it_2.append(_builder_4);
                    }
                  }
                  if (!_matched_2) {
                    if (type instanceof PropertyFillerBoolean) {
                      _matched_2=true;
                      StringConcatenation _builder_4 = new StringConcatenation();
                      _builder_4.append("generateBooleanAttribute(\"");
                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_4.append(_name_2);
                      _builder_4.append("\");");
                      _builder_4.newLineIfNotEmpty();
                      it_2.append(_builder_4);
                    }
                  }
                  if (!_matched_2) {
                    if (type instanceof PropertyFillerSignedDoubleRange) {
                      _matched_2=true;
                      StringConcatenation _builder_4 = new StringConcatenation();
                      double _beginRange = ((PropertyFillerSignedDoubleRange)type).getBeginRange();
                      _builder_4.append(_beginRange);
                      String beginRange = _builder_4.toString();
                      StringConcatenation _builder_5 = new StringConcatenation();
                      double _endRange = ((PropertyFillerSignedDoubleRange)type).getEndRange();
                      _builder_5.append(_endRange);
                      String endRange = _builder_5.toString();
                      LEntityAttribute _beginRangeRef = ((PropertyFillerSignedDoubleRange)type).getBeginRangeRef();
                      boolean _tripleNotEquals = (_beginRangeRef != null);
                      if (_tripleNotEquals) {
                        StringConcatenation _builder_6 = new StringConcatenation();
                        _builder_6.append("get_\"");
                        String _name_2 = ((PropertyFillerSignedDoubleRange)type).getBeginRangeRef().getName();
                        _builder_6.append(_name_2);
                        _builder_6.append("\"()");
                        beginRange = _builder_6.toString();
                      }
                      LEntityAttribute _endRangeRef = ((PropertyFillerSignedDoubleRange)type).getEndRangeRef();
                      boolean _tripleNotEquals_1 = (_endRangeRef != null);
                      if (_tripleNotEquals_1) {
                        StringConcatenation _builder_7 = new StringConcatenation();
                        _builder_7.append("get_\"");
                        String _name_3 = ((PropertyFillerSignedDoubleRange)type).getEndRangeRef().getName();
                        _builder_7.append(_name_3);
                        _builder_7.append("\"()");
                        endRange = _builder_7.toString();
                      }
                      StringConcatenation _builder_8 = new StringConcatenation();
                      _builder_8.append("generateSignedAttribute(\"");
                      String _name_4 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_8.append(_name_4);
                      _builder_8.append("\", ");
                      int _decimals = ((PropertyFillerSignedDoubleRange)type).getDecimals();
                      _builder_8.append(_decimals);
                      _builder_8.append(", ");
                      _builder_8.append(beginRange);
                      _builder_8.append(", ");
                      _builder_8.append(endRange);
                      _builder_8.append(", ");
                      double _rounded = ((PropertyFillerSignedDoubleRange)type).getRounded();
                      _builder_8.append(_rounded);
                      _builder_8.append(");");
                      _builder_8.newLineIfNotEmpty();
                      it_2.append(_builder_8);
                    }
                  }
                  if (!_matched_2) {
                    if (type instanceof PropertyFillerSignedDoubleRandom) {
                      _matched_2=true;
                      StringConcatenation _builder_4 = new StringConcatenation();
                      _builder_4.append("generateAttribute(\"");
                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_4.append(_name_2);
                      _builder_4.append("\", ");
                      String _name_3 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_4.append(_name_3);
                      _builder_4.append("_items);");
                      _builder_4.newLineIfNotEmpty();
                      it_2.append(_builder_4);
                    }
                  }
                  if (!_matched_2) {
                    if (type instanceof PropertyFillerUnsignedDoubleRange) {
                      _matched_2=true;
                      StringConcatenation _builder_4 = new StringConcatenation();
                      double _beginRange = ((PropertyFillerUnsignedDoubleRange)type).getBeginRange();
                      _builder_4.append(_beginRange);
                      String beginRange = _builder_4.toString();
                      StringConcatenation _builder_5 = new StringConcatenation();
                      double _endRange = ((PropertyFillerUnsignedDoubleRange)type).getEndRange();
                      _builder_5.append(_endRange);
                      String endRange = _builder_5.toString();
                      LEntityAttribute _beginRangeRef = ((PropertyFillerUnsignedDoubleRange)type).getBeginRangeRef();
                      boolean _tripleNotEquals = (_beginRangeRef != null);
                      if (_tripleNotEquals) {
                        StringConcatenation _builder_6 = new StringConcatenation();
                        _builder_6.append("(double)get_\"");
                        String _name_2 = ((PropertyFillerUnsignedDoubleRange)type).getBeginRangeRef().getName();
                        _builder_6.append(_name_2);
                        _builder_6.append("\"()");
                        beginRange = _builder_6.toString();
                      }
                      LEntityAttribute _endRangeRef = ((PropertyFillerUnsignedDoubleRange)type).getEndRangeRef();
                      boolean _tripleNotEquals_1 = (_endRangeRef != null);
                      if (_tripleNotEquals_1) {
                        StringConcatenation _builder_7 = new StringConcatenation();
                        _builder_7.append("(double)get_\"");
                        String _name_3 = ((PropertyFillerUnsignedDoubleRange)type).getEndRangeRef().getName();
                        _builder_7.append(_name_3);
                        _builder_7.append("\"()");
                        endRange = _builder_7.toString();
                      }
                      StringConcatenation _builder_8 = new StringConcatenation();
                      _builder_8.append("generateUnsignedAttribute(\"");
                      String _name_4 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_8.append(_name_4);
                      _builder_8.append("\", ");
                      int _decimals = ((PropertyFillerUnsignedDoubleRange)type).getDecimals();
                      _builder_8.append(_decimals);
                      _builder_8.append(", ");
                      _builder_8.append(beginRange);
                      _builder_8.append(", ");
                      _builder_8.append(endRange);
                      _builder_8.append(", ");
                      double _rounded = ((PropertyFillerUnsignedDoubleRange)type).getRounded();
                      _builder_8.append(_rounded);
                      _builder_8.append(");");
                      _builder_8.newLineIfNotEmpty();
                      it_2.append(_builder_8);
                    }
                  }
                  if (!_matched_2) {
                    if (type instanceof PropertyFillerUnsignedDoubleRandom) {
                      _matched_2=true;
                      StringConcatenation _builder_4 = new StringConcatenation();
                      _builder_4.append("generateAttribute(\"");
                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_4.append(_name_2);
                      _builder_4.append("\", ");
                      String _name_3 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_4.append(_name_3);
                      _builder_4.append("_items);");
                      _builder_4.newLineIfNotEmpty();
                      it_2.append(_builder_4);
                    }
                  }
                  if (!_matched_2) {
                    if (type instanceof PropertyFillerSignedIntegerRange) {
                      _matched_2=true;
                      StringConcatenation _builder_4 = new StringConcatenation();
                      int _beginRange = ((PropertyFillerSignedIntegerRange)type).getBeginRange();
                      _builder_4.append(_beginRange);
                      String beginRange = _builder_4.toString();
                      StringConcatenation _builder_5 = new StringConcatenation();
                      int _endRange = ((PropertyFillerSignedIntegerRange)type).getEndRange();
                      _builder_5.append(_endRange);
                      String endRange = _builder_5.toString();
                      LEntityAttribute _beginRangeRef = ((PropertyFillerSignedIntegerRange)type).getBeginRangeRef();
                      boolean _tripleNotEquals = (_beginRangeRef != null);
                      if (_tripleNotEquals) {
                        StringConcatenation _builder_6 = new StringConcatenation();
                        _builder_6.append("(int)get_\"");
                        String _name_2 = ((PropertyFillerSignedIntegerRange)type).getBeginRangeRef().getName();
                        _builder_6.append(_name_2);
                        _builder_6.append("\"()");
                        beginRange = _builder_6.toString();
                      }
                      LEntityAttribute _endRangeRef = ((PropertyFillerSignedIntegerRange)type).getEndRangeRef();
                      boolean _tripleNotEquals_1 = (_endRangeRef != null);
                      if (_tripleNotEquals_1) {
                        StringConcatenation _builder_7 = new StringConcatenation();
                        _builder_7.append("(int)get_\"");
                        String _name_3 = ((PropertyFillerSignedIntegerRange)type).getEndRangeRef().getName();
                        _builder_7.append(_name_3);
                        _builder_7.append("\"()");
                        endRange = _builder_7.toString();
                      }
                      StringConcatenation _builder_8 = new StringConcatenation();
                      _builder_8.append("generateSignedAttribute(\"");
                      String _name_4 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_8.append(_name_4);
                      _builder_8.append("\", ");
                      _builder_8.append(beginRange);
                      _builder_8.append(", ");
                      _builder_8.append(endRange);
                      _builder_8.append(", ");
                      int _rounded = ((PropertyFillerSignedIntegerRange)type).getRounded();
                      _builder_8.append(_rounded);
                      _builder_8.append(");");
                      _builder_8.newLineIfNotEmpty();
                      it_2.append(_builder_8);
                    }
                  }
                  if (!_matched_2) {
                    if (type instanceof PropertyFillerSignedIntegerRandom) {
                      _matched_2=true;
                      StringConcatenation _builder_4 = new StringConcatenation();
                      _builder_4.append("generateAttribute(\"");
                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_4.append(_name_2);
                      _builder_4.append("\", ");
                      String _name_3 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_4.append(_name_3);
                      _builder_4.append("_items);");
                      _builder_4.newLineIfNotEmpty();
                      it_2.append(_builder_4);
                    }
                  }
                  if (!_matched_2) {
                    if (type instanceof PropertyFillerUnsignedIntegerRange) {
                      _matched_2=true;
                      StringConcatenation _builder_4 = new StringConcatenation();
                      int _beginRange = ((PropertyFillerUnsignedIntegerRange)type).getBeginRange();
                      _builder_4.append(_beginRange);
                      String beginRange = _builder_4.toString();
                      StringConcatenation _builder_5 = new StringConcatenation();
                      int _endRange = ((PropertyFillerUnsignedIntegerRange)type).getEndRange();
                      _builder_5.append(_endRange);
                      String endRange = _builder_5.toString();
                      LEntityAttribute _beginRangeRef = ((PropertyFillerUnsignedIntegerRange)type).getBeginRangeRef();
                      boolean _tripleNotEquals = (_beginRangeRef != null);
                      if (_tripleNotEquals) {
                        StringConcatenation _builder_6 = new StringConcatenation();
                        _builder_6.append("(int)get_\"");
                        String _name_2 = ((PropertyFillerUnsignedIntegerRange)type).getBeginRangeRef().getName();
                        _builder_6.append(_name_2);
                        _builder_6.append("\"()");
                        beginRange = _builder_6.toString();
                      }
                      LEntityAttribute _endRangeRef = ((PropertyFillerUnsignedIntegerRange)type).getEndRangeRef();
                      boolean _tripleNotEquals_1 = (_endRangeRef != null);
                      if (_tripleNotEquals_1) {
                        StringConcatenation _builder_7 = new StringConcatenation();
                        _builder_7.append("(int)get_\"");
                        String _name_3 = ((PropertyFillerUnsignedIntegerRange)type).getEndRangeRef().getName();
                        _builder_7.append(_name_3);
                        _builder_7.append("\"()");
                        endRange = _builder_7.toString();
                      }
                      StringConcatenation _builder_8 = new StringConcatenation();
                      _builder_8.append("generateUnsignedAttribute(\"");
                      String _name_4 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_8.append(_name_4);
                      _builder_8.append("\", ");
                      _builder_8.append(beginRange);
                      _builder_8.append(", ");
                      _builder_8.append(endRange);
                      _builder_8.append(", ");
                      int _rounded = ((PropertyFillerUnsignedIntegerRange)type).getRounded();
                      _builder_8.append(_rounded);
                      _builder_8.append(");");
                      _builder_8.newLineIfNotEmpty();
                      it_2.append(_builder_8);
                    }
                  }
                  if (!_matched_2) {
                    if (type instanceof PropertyFillerUnsignedIntegerRandom) {
                      _matched_2=true;
                      StringConcatenation _builder_4 = new StringConcatenation();
                      _builder_4.append("generateAttribute(\"");
                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_4.append(_name_2);
                      _builder_4.append("\", ");
                      String _name_3 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_4.append(_name_3);
                      _builder_4.append("_items);");
                      _builder_4.newLineIfNotEmpty();
                      it_2.append(_builder_4);
                    }
                  }
                  if (!_matched_2) {
                    if (type instanceof PropertyFillerTextRandom) {
                      _matched_2=true;
                      StringConcatenation _builder_4 = new StringConcatenation();
                      _builder_4.append("generateAttribute(\"");
                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_4.append(_name_2);
                      _builder_4.append("\", ");
                      String _name_3 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_4.append(_name_3);
                      _builder_4.append("_items);");
                      _builder_4.newLineIfNotEmpty();
                      it_2.append(_builder_4);
                    }
                  }
                  if (!_matched_2) {
                    if (type instanceof PropertyFillerTextParagraphs) {
                      _matched_2=true;
                      StringConcatenation _builder_4 = new StringConcatenation();
                      _builder_4.append("generateParagraphsAttribute(\"");
                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_4.append(_name_2);
                      _builder_4.append("\", ");
                      int _count = ((PropertyFillerTextParagraphs)type).getCount();
                      _builder_4.append(_count);
                      _builder_4.append(");");
                      _builder_4.newLineIfNotEmpty();
                      it_2.append(_builder_4);
                    }
                  }
                  if (!_matched_2) {
                    if (type instanceof PropertyFillerTextSentences) {
                      _matched_2=true;
                      StringConcatenation _builder_4 = new StringConcatenation();
                      _builder_4.append("generateSentencesAttribute(\"");
                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_4.append(_name_2);
                      _builder_4.append("\", ");
                      int _count = ((PropertyFillerTextSentences)type).getCount();
                      _builder_4.append(_count);
                      _builder_4.append(");");
                      _builder_4.newLineIfNotEmpty();
                      it_2.append(_builder_4);
                    }
                  }
                  if (!_matched_2) {
                    if (type instanceof PropertyFillerTextWords) {
                      _matched_2=true;
                      StringConcatenation _builder_4 = new StringConcatenation();
                      _builder_4.append("generateWordsAttribute(\"");
                      String _name_2 = ((EntityMockObjectFill)attribute_1).getName();
                      _builder_4.append(_name_2);
                      _builder_4.append("\", ");
                      int _count = ((PropertyFillerTextWords)type).getCount();
                      _builder_4.append(_count);
                      _builder_4.append(");");
                      _builder_4.newLineIfNotEmpty();
                      it_2.append(_builder_4);
                    }
                  }
                }
              }
            }
          }
          EList<EntityMockObjectFunction> _calculations_1 = mockObject.getCalculations();
          for (final EntityMockObjectFunction calculation_1 : _calculations_1) {
            {
              String doc = this._jvmTypesBuilder.getDocumentation(calculation_1);
              if (((doc instanceof String) && (!doc.trim().isEmpty()))) {
                StringConcatenation _builder_3 = new StringConcatenation();
                _builder_3.append("/** ");
                _builder_3.append(doc);
                _builder_3.append(" */");
                _builder_3.newLineIfNotEmpty();
                it_2.append(_builder_3);
              }
              StringConcatenation _builder_4 = new StringConcatenation();
              String paramString = _builder_4.toString();
              EList<EntityMockObjectFunctionParameter> _params = calculation_1.getParams();
              for (final EntityMockObjectFunctionParameter param : _params) {
                {
                  boolean _isEmpty = paramString.isEmpty();
                  boolean _not = (!_isEmpty);
                  if (_not) {
                    StringConcatenation _builder_5 = new StringConcatenation();
                    _builder_5.append(paramString);
                    _builder_5.append(",");
                    paramString = _builder_5.toString();
                  }
                  JvmType _type = param.getParameterType().getType();
                  if ((_type instanceof JvmEnumerationType)) {
                    StringConcatenation _builder_6 = new StringConcatenation();
                    _builder_6.append(paramString);
                    _builder_6.append(" ");
                    String _identifier = param.getParameterType().getIdentifier();
                    _builder_6.append(_identifier);
                    _builder_6.append(".valueOf(getAttribute(\"");
                    String _name_2 = this.getName(param.getName());
                    _builder_6.append(_name_2);
                    _builder_6.append("\").toString())");
                    paramString = _builder_6.toString();
                  } else {
                    StringConcatenation _builder_7 = new StringConcatenation();
                    _builder_7.append(paramString);
                    _builder_7.append("(");
                    String _identifier_1 = param.getParameterType().getIdentifier();
                    _builder_7.append(_identifier_1);
                    _builder_7.append(")getAttribute(\"");
                    String _name_3 = this.getName(param.getName());
                    _builder_7.append(_name_3);
                    _builder_7.append("\")");
                    paramString = _builder_7.toString();
                  }
                }
              }
              StringConcatenation _builder_5 = new StringConcatenation();
              _builder_5.append("try {");
              _builder_5.newLine();
              _builder_5.append("\t");
              _builder_5.append("setFixAttribute(\"");
              String _name_2 = calculation_1.getName();
              _builder_5.append(_name_2, "\t");
              _builder_5.append("\", calculate_");
              String _name_3 = calculation_1.getName();
              _builder_5.append(_name_3, "\t");
              _builder_5.append("(");
              _builder_5.append(paramString, "\t");
              _builder_5.append("));");
              _builder_5.newLineIfNotEmpty();
              _builder_5.append("}");
              _builder_5.newLine();
              _builder_5.append("catch (NullPointerException npe) {}");
              _builder_5.newLine();
              _builder_5.append("catch (Exception e) {");
              _builder_5.newLine();
              _builder_5.append("    ");
              _builder_5.append("log.error(e.getLocalizedMessage()+e.getCause());");
              _builder_5.newLine();
              _builder_5.append("}");
              _builder_5.newLine();
              it_2.append(_builder_5);
            }
          }
        };
        this._jvmTypesBuilder.setBody(it_1, _function_5);
      };
      JvmOperation _method_1 = this._jvmTypesBuilder.toMethod(mockObject, _builder_2.toString(), this._typeReferenceBuilder.typeRef(Void.TYPE), _function_4);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_3, _method_1);
    };
    acceptor.<JvmGenericType>accept(mockClass, _function);
  }
  
  public String getName(final IEntityMockObjectUsable attribute) {
    boolean _matched = false;
    if (attribute instanceof EntityMockObjectFunction) {
      _matched=true;
      StringConcatenation _builder = new StringConcatenation();
      String _name = ((EntityMockObjectFunction)attribute).getName();
      _builder.append(_name);
      return _builder.toString();
    }
    if (!_matched) {
      if (attribute instanceof EntityMockObjectEnum) {
        _matched=true;
        StringConcatenation _builder = new StringConcatenation();
        String _name = ((EntityMockObjectEnum)attribute).getName();
        _builder.append(_name);
        return _builder.toString();
      }
    }
    if (!_matched) {
      if (attribute instanceof EntityMockObjectPlainValue) {
        _matched=true;
        StringConcatenation _builder = new StringConcatenation();
        String _name = ((EntityMockObjectPlainValue)attribute).getName();
        _builder.append(_name);
        return _builder.toString();
      }
    }
    if (!_matched) {
      if (attribute instanceof EntityMockObjectArrayValue) {
        _matched=true;
        StringConcatenation _builder = new StringConcatenation();
        String _name = ((EntityMockObjectArrayValue)attribute).getName();
        _builder.append(_name);
        return _builder.toString();
      }
    }
    if (!_matched) {
      if (attribute instanceof EntityMockObjectEmbed) {
        _matched=true;
        StringConcatenation _builder = new StringConcatenation();
        String _name = ((EntityMockObjectEmbed)attribute).getName();
        _builder.append(_name);
        return _builder.toString();
      }
    }
    if (!_matched) {
      if (attribute instanceof EntityMockObjectFill) {
        _matched=true;
        StringConcatenation _builder = new StringConcatenation();
        String _name = ((EntityMockObjectFill)attribute).getName();
        _builder.append(_name);
        return _builder.toString();
      }
    }
    if (!_matched) {
      if (attribute instanceof EntityMockObjectResourceValue) {
        _matched=true;
        StringConcatenation _builder = new StringConcatenation();
        String _name = ((EntityMockObjectResourceValue)attribute).getName();
        _builder.append(_name);
        return _builder.toString();
      }
    }
    return null;
  }
  
  /**
   * generate a mock entity class
   */
  public void generateMockEntity(final EntityMock model, final IJvmDeclaredTypeAcceptor acceptor, final EntityMockEntity mockEntity) {
    JvmGenericType mockClass = this._jvmTypesBuilder.toClass(model, this.entityMockName(mockEntity, model));
    final Procedure1<JvmGenericType> _function = (JvmGenericType it) -> {
      this._jvmTypesBuilder.setFileHeader(it, this._jvmTypesBuilder.getDocumentation(model));
      EList<JvmTypeReference> _superTypes = it.getSuperTypes();
      JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(ABaseMockEntity.class);
      this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes, _typeRef);
      JvmField field = null;
      final Procedure1<JvmField> _function_1 = (JvmField it_1) -> {
        final Procedure1<ITreeAppendable> _function_2 = (ITreeAppendable it_2) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("LoggerFactory.getLogger(\"mock\")");
          it_2.append(_builder);
        };
        this._jvmTypesBuilder.setInitializer(it_1, _function_2);
      };
      field = this._jvmTypesBuilder.toField(model, "log", this._typeReferenceBuilder.typeRef(Logger.class), _function_1);
      field.setStatic(true);
      EList<JvmMember> _members = it.getMembers();
      this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
      EntityMockResource _byResource = mockEntity.getByResource();
      boolean _tripleNotEquals = (_byResource != null);
      if (_tripleNotEquals) {
        EList<JvmMember> _members_1 = it.getMembers();
        StringConcatenation _builder = new StringConcatenation();
        String _name = mockEntity.getByResource().getName();
        _builder.append(_name);
        _builder.append("_resource");
        final Procedure1<JvmField> _function_2 = (JvmField it_1) -> {
          final Procedure1<ITreeAppendable> _function_3 = (ITreeAppendable it_2) -> {
            StringConcatenation _builder_1 = new StringConcatenation();
            _builder_1.append("new ");
            String _entityMockName = this.entityMockName(mockEntity.getByResource(), model);
            _builder_1.append(_entityMockName);
            _builder_1.append("()");
            it_2.append(_builder_1);
          };
          this._jvmTypesBuilder.setInitializer(it_1, _function_3);
          this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(mockEntity.getByResource()));
          it_1.setVisibility(JvmVisibility.PRIVATE);
          it_1.setStatic(true);
        };
        JvmField _field = this._jvmTypesBuilder.toField(model, _builder.toString(), 
          this._typeReferenceBuilder.typeRef(ABaseMockResource.class), _function_2);
        this._jvmTypesBuilder.<JvmField>operator_add(_members_1, _field);
      }
      EList<JvmMember> _members_2 = it.getMembers();
      final Procedure1<JvmConstructor> _function_3 = (JvmConstructor it_1) -> {
        EList<JvmFormalParameter> _parameters = it_1.getParameters();
        JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(mockEntity, "mockDataGenerator", this._typeReferenceBuilder.typeRef(AEntityMockDataGenerator.class));
        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
        final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
          StringConcatenation _builder_1 = new StringConcatenation();
          _builder_1.append("super(mockDataGenerator, \"");
          String _persistenceUnit = mockEntity.getEntityRef().getPersistenceUnit();
          _builder_1.append(_persistenceUnit);
          _builder_1.append("\");");
          it_2.append(_builder_1);
        };
        this._jvmTypesBuilder.setBody(it_1, _function_4);
      };
      JvmConstructor _constructor = this._jvmTypesBuilder.toConstructor(model, _function_3);
      this._jvmTypesBuilder.<JvmConstructor>operator_add(_members_2, _constructor);
      EList<EntityMockTemplate> _templates = mockEntity.getTemplates();
      for (final EntityMockTemplate template : _templates) {
        EList<JvmMember> _members_3 = it.getMembers();
        StringConcatenation _builder_1 = new StringConcatenation();
        String _name_1 = template.getName();
        _builder_1.append(_name_1);
        _builder_1.append("_template");
        final Procedure1<JvmField> _function_4 = (JvmField it_1) -> {
          final Procedure1<ITreeAppendable> _function_5 = (ITreeAppendable it_2) -> {
            StringConcatenation _builder_2 = new StringConcatenation();
            _builder_2.append("new ");
            String _entityMockName = this.entityMockName(template, model);
            _builder_2.append(_entityMockName);
            _builder_2.append("()");
            it_2.append(_builder_2);
          };
          this._jvmTypesBuilder.setInitializer(it_1, _function_5);
          this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(template));
          it_1.setVisibility(JvmVisibility.PRIVATE);
          it_1.setStatic(true);
        };
        JvmField _field_1 = this._jvmTypesBuilder.toField(model, _builder_1.toString(), 
          this._typeReferenceBuilder.typeRef(ABaseMockObject.class), _function_4);
        this._jvmTypesBuilder.<JvmField>operator_add(_members_3, _field_1);
      }
      EList<IEntityMockAttribute> _attributes = mockEntity.getAttributes();
      for (final IEntityMockAttribute attribute : _attributes) {
        boolean _matched = false;
        if (attribute instanceof EntityMockAttributeByObject) {
          _matched=true;
        }
        if (!_matched) {
          if (attribute instanceof EntityMockAttributeFiller) {
            _matched=true;
            PropertyFillerType type = ((EntityMockAttributeFiller)attribute).getFillerType();
            boolean _matched_1 = false;
            if (type instanceof PropertyFillerTextRandom) {
              _matched_1=true;
              final List<String> items = new ArrayList<String>();
              EList<String> _items = ((PropertyFillerTextRandom)type).getItems();
              for (final String item : _items) {
                StringConcatenation _builder_2 = new StringConcatenation();
                _builder_2.append("\"");
                _builder_2.append(item);
                _builder_2.append("\"");
                items.add(_builder_2.toString());
              }
              EList<JvmMember> _members_4 = it.getMembers();
              StringConcatenation _builder_3 = new StringConcatenation();
              String _name_2 = ((EntityMockAttributeFiller)attribute).getAttributeRef().getName();
              _builder_3.append(_name_2);
              _builder_3.append("_items");
              final Procedure1<JvmField> _function_5 = (JvmField it_1) -> {
                final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_2) -> {
                  StringConcatenation _builder_4 = new StringConcatenation();
                  _builder_4.append("{");
                  String _join = StringUtils.join(items, ",");
                  _builder_4.append(_join);
                  _builder_4.append("}");
                  it_2.append(_builder_4);
                };
                this._jvmTypesBuilder.setInitializer(it_1, _function_6);
                this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
                it_1.setVisibility(JvmVisibility.PRIVATE);
                it_1.setStatic(true);
              };
              JvmField _field_2 = this._jvmTypesBuilder.toField(model, _builder_3.toString(), 
                this._typeReferenceBuilder.typeRef(Object[].class), _function_5);
              this._jvmTypesBuilder.<JvmField>operator_add(_members_4, _field_2);
            }
            if (!_matched_1) {
              if (type instanceof PropertyFillerSignedDoubleRandom) {
                _matched_1=true;
                final List<String> items = new ArrayList<String>();
                EList<Double> _items = ((PropertyFillerSignedDoubleRandom)type).getItems();
                for (final Double item : _items) {
                  StringConcatenation _builder_2 = new StringConcatenation();
                  _builder_2.append(item);
                  items.add(_builder_2.toString());
                }
                EList<JvmMember> _members_4 = it.getMembers();
                StringConcatenation _builder_3 = new StringConcatenation();
                String _name_2 = ((EntityMockAttributeFiller)attribute).getAttributeRef().getName();
                _builder_3.append(_name_2);
                _builder_3.append("_items");
                final Procedure1<JvmField> _function_5 = (JvmField it_1) -> {
                  final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_2) -> {
                    StringConcatenation _builder_4 = new StringConcatenation();
                    _builder_4.append("{");
                    String _join = StringUtils.join(items, ",");
                    _builder_4.append(_join);
                    _builder_4.append("}");
                    it_2.append(_builder_4);
                  };
                  this._jvmTypesBuilder.setInitializer(it_1, _function_6);
                  this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
                  it_1.setVisibility(JvmVisibility.PRIVATE);
                  it_1.setStatic(true);
                };
                JvmField _field_2 = this._jvmTypesBuilder.toField(model, _builder_3.toString(), 
                  this._typeReferenceBuilder.typeRef(double[].class), _function_5);
                this._jvmTypesBuilder.<JvmField>operator_add(_members_4, _field_2);
              }
            }
            if (!_matched_1) {
              if (type instanceof PropertyFillerUnsignedDoubleRandom) {
                _matched_1=true;
                final List<String> items = new ArrayList<String>();
                EList<Double> _items = ((PropertyFillerUnsignedDoubleRandom)type).getItems();
                for (final Double item : _items) {
                  StringConcatenation _builder_2 = new StringConcatenation();
                  _builder_2.append(item);
                  items.add(_builder_2.toString());
                }
                EList<JvmMember> _members_4 = it.getMembers();
                StringConcatenation _builder_3 = new StringConcatenation();
                String _name_2 = ((EntityMockAttributeFiller)attribute).getAttributeRef().getName();
                _builder_3.append(_name_2);
                _builder_3.append("_items");
                final Procedure1<JvmField> _function_5 = (JvmField it_1) -> {
                  final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_2) -> {
                    StringConcatenation _builder_4 = new StringConcatenation();
                    _builder_4.append("{");
                    String _join = StringUtils.join(items, ",");
                    _builder_4.append(_join);
                    _builder_4.append("}");
                    it_2.append(_builder_4);
                  };
                  this._jvmTypesBuilder.setInitializer(it_1, _function_6);
                  this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
                  it_1.setVisibility(JvmVisibility.PRIVATE);
                  it_1.setStatic(true);
                };
                JvmField _field_2 = this._jvmTypesBuilder.toField(model, _builder_3.toString(), 
                  this._typeReferenceBuilder.typeRef(double[].class), _function_5);
                this._jvmTypesBuilder.<JvmField>operator_add(_members_4, _field_2);
              }
            }
            if (!_matched_1) {
              if (type instanceof PropertyFillerSignedIntegerRandom) {
                _matched_1=true;
                final List<String> items = new ArrayList<String>();
                EList<Integer> _items = ((PropertyFillerSignedIntegerRandom)type).getItems();
                for (final Integer item : _items) {
                  StringConcatenation _builder_2 = new StringConcatenation();
                  _builder_2.append(item);
                  items.add(_builder_2.toString());
                }
                EList<JvmMember> _members_4 = it.getMembers();
                StringConcatenation _builder_3 = new StringConcatenation();
                String _name_2 = ((EntityMockAttributeFiller)attribute).getAttributeRef().getName();
                _builder_3.append(_name_2);
                _builder_3.append("_items");
                final Procedure1<JvmField> _function_5 = (JvmField it_1) -> {
                  final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_2) -> {
                    StringConcatenation _builder_4 = new StringConcatenation();
                    _builder_4.append("{");
                    String _join = StringUtils.join(items, ",");
                    _builder_4.append(_join);
                    _builder_4.append("}");
                    it_2.append(_builder_4);
                  };
                  this._jvmTypesBuilder.setInitializer(it_1, _function_6);
                  this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
                  it_1.setVisibility(JvmVisibility.PRIVATE);
                  it_1.setStatic(true);
                };
                JvmField _field_2 = this._jvmTypesBuilder.toField(model, _builder_3.toString(), 
                  this._typeReferenceBuilder.typeRef(int[].class), _function_5);
                this._jvmTypesBuilder.<JvmField>operator_add(_members_4, _field_2);
              }
            }
            if (!_matched_1) {
              if (type instanceof PropertyFillerUnsignedIntegerRandom) {
                _matched_1=true;
                final List<String> items = new ArrayList<String>();
                EList<Integer> _items = ((PropertyFillerUnsignedIntegerRandom)type).getItems();
                for (final Integer item : _items) {
                  StringConcatenation _builder_2 = new StringConcatenation();
                  _builder_2.append(item);
                  items.add(_builder_2.toString());
                }
                EList<JvmMember> _members_4 = it.getMembers();
                StringConcatenation _builder_3 = new StringConcatenation();
                String _name_2 = ((EntityMockAttributeFiller)attribute).getAttributeRef().getName();
                _builder_3.append(_name_2);
                _builder_3.append("_items");
                final Procedure1<JvmField> _function_5 = (JvmField it_1) -> {
                  final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_2) -> {
                    StringConcatenation _builder_4 = new StringConcatenation();
                    _builder_4.append("{");
                    String _join = StringUtils.join(items, ",");
                    _builder_4.append(_join);
                    _builder_4.append("}");
                    it_2.append(_builder_4);
                  };
                  this._jvmTypesBuilder.setInitializer(it_1, _function_6);
                  this._jvmTypesBuilder.setDocumentation(it_1, this._jvmTypesBuilder.getDocumentation(attribute));
                  it_1.setVisibility(JvmVisibility.PRIVATE);
                  it_1.setStatic(true);
                };
                JvmField _field_2 = this._jvmTypesBuilder.toField(model, _builder_3.toString(), 
                  this._typeReferenceBuilder.typeRef(int[].class), _function_5);
                this._jvmTypesBuilder.<JvmField>operator_add(_members_4, _field_2);
              }
            }
          }
        }
        if (!_matched) {
          if (attribute instanceof EntityMockAttributeByReference) {
            _matched=true;
          }
        }
      }
      EntityMockResource _byResource_1 = mockEntity.getByResource();
      boolean _tripleNotEquals_1 = (_byResource_1 != null);
      if (_tripleNotEquals_1) {
        EList<JvmMember> _members_4 = it.getMembers();
        StringConcatenation _builder_2 = new StringConcatenation();
        _builder_2.append("getDataRows");
        final Procedure1<JvmOperation> _function_5 = (JvmOperation it_1) -> {
          it_1.setVisibility(JvmVisibility.PUBLIC);
          it_1.setFinal(true);
          final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_2) -> {
            StringConcatenation _builder_3 = new StringConcatenation();
            _builder_3.append("return ");
            String _name_2 = mockEntity.getByResource().getName();
            _builder_3.append(_name_2);
            _builder_3.append("_resource.getDataRows();");
            it_2.append(_builder_3);
          };
          this._jvmTypesBuilder.setBody(it_1, _function_6);
        };
        JvmOperation _method = this._jvmTypesBuilder.toMethod(model, _builder_2.toString(), this._typeReferenceBuilder.typeRef(Set.class), _function_5);
        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_4, _method);
        EList<JvmMember> _members_5 = it.getMembers();
        StringConcatenation _builder_3 = new StringConcatenation();
        _builder_3.append("generateEntity");
        final Procedure1<JvmOperation> _function_6 = (JvmOperation it_1) -> {
          it_1.setVisibility(JvmVisibility.PUBLIC);
          EList<JvmFormalParameter> _parameters = it_1.getParameters();
          JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(model, "dataRow", this._typeReferenceBuilder.typeRef(Object.class));
          this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
          it_1.setFinal(true);
          final Procedure1<ITreeAppendable> _function_7 = (ITreeAppendable it_2) -> {
            StringConcatenation _builder_4 = new StringConcatenation();
            _builder_4.append("reset();");
            _builder_4.newLine();
            String _entityDtoFQN = this.entityDtoFQN(mockEntity);
            _builder_4.append(_entityDtoFQN);
            _builder_4.append(" internal = new ");
            String _entityDtoFQN_1 = this.entityDtoFQN(mockEntity);
            _builder_4.append(_entityDtoFQN_1);
            _builder_4.append("();");
            _builder_4.newLineIfNotEmpty();
            _builder_4.append("entity = internal;");
            _builder_4.newLine();
            _builder_4.append("generateData();");
            _builder_4.newLine();
            _builder_4.append("try {");
            _builder_4.newLine();
            it_2.append(_builder_4);
            EList<EntityMockByResourceAttribute> _byResourceAttributes = mockEntity.getByResourceAttributes();
            for (final EntityMockByResourceAttribute attribute_1 : _byResourceAttributes) {
              StringConcatenation _builder_5 = new StringConcatenation();
              _builder_5.append("internal.set");
              String _capitalize = WordUtils.capitalize(attribute_1.getAttributeRef().getName());
              _builder_5.append(_capitalize);
              _builder_5.append("(");
              LEntityAttribute _attributeRef = attribute_1.getAttributeRef();
              StringConcatenation _builder_6 = new StringConcatenation();
              String _name_2 = mockEntity.getByResource().getName();
              _builder_6.append(_name_2);
              _builder_6.append("_resource.getAttribute(dataRow.toString(), \"");
              String _name_3 = attribute_1.getResourceAttribute().getName();
              _builder_6.append(_name_3);
              _builder_6.append("\")");
              String _baseMockDataTypeCasting = this.baseMockDataTypeCasting(_attributeRef, _builder_6.toString());
              _builder_5.append(_baseMockDataTypeCasting);
              _builder_5.append(");");
              _builder_5.newLineIfNotEmpty();
              it_2.append(_builder_5);
            }
            StringConcatenation _builder_7 = new StringConcatenation();
            _builder_7.append("}");
            _builder_7.newLine();
            _builder_7.append("catch (Exception e) {");
            _builder_7.newLine();
            _builder_7.append("    ");
            _builder_7.append("log.error(e.getLocalizedMessage()+e.getCause());");
            _builder_7.newLine();
            _builder_7.append("}");
            _builder_7.newLine();
            _builder_7.append("return entity;");
            it_2.append(_builder_7);
          };
          this._jvmTypesBuilder.setBody(it_1, _function_7);
        };
        JvmOperation _method_1 = this._jvmTypesBuilder.toMethod(model, _builder_3.toString(), this._typeReferenceBuilder.typeRef(Object.class), _function_6);
        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_5, _method_1);
      }
      EList<EntityMockEntityFunction> _calculations = mockEntity.getCalculations();
      for (final EntityMockEntityFunction calculation : _calculations) {
        EList<JvmMember> _members_6 = it.getMembers();
        StringConcatenation _builder_4 = new StringConcatenation();
        _builder_4.append("calculate_");
        String _name_2 = calculation.getAttributeRef().getName();
        _builder_4.append(_name_2);
        final Procedure1<JvmOperation> _function_7 = (JvmOperation it_1) -> {
          it_1.setVisibility(JvmVisibility.PROTECTED);
          EList<EntityMockEntityFunctionParameter> _params = calculation.getParams();
          for (final EntityMockEntityFunctionParameter param : _params) {
            EList<JvmFormalParameter> _parameters = it_1.getParameters();
            JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(param, this.getParamName(param, "__"), this.getJvmType(param));
            this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
          }
          it_1.setFinal(true);
          this._jvmTypesBuilder.setBody(it_1, calculation.getBody());
        };
        JvmOperation _method_2 = this._jvmTypesBuilder.toMethod(model, _builder_4.toString(), 
          this.jvmTypeRef(calculation.getAttributeRef()), _function_7);
        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_6, _method_2);
      }
      EList<JvmMember> _members_7 = it.getMembers();
      StringConcatenation _builder_5 = new StringConcatenation();
      _builder_5.append("generateDataRow");
      final Procedure1<JvmOperation> _function_8 = (JvmOperation it_1) -> {
        it_1.setVisibility(JvmVisibility.PROTECTED);
        it_1.setFinal(true);
        final Procedure1<ITreeAppendable> _function_9 = (ITreeAppendable it_2) -> {
          EList<EntityMockTemplate> _templates_1 = mockEntity.getTemplates();
          for (final EntityMockTemplate template_1 : _templates_1) {
            StringConcatenation _builder_6 = new StringConcatenation();
            _builder_6.append("generateAttribute(\"");
            String _name_3 = template_1.getName();
            _builder_6.append(_name_3);
            _builder_6.append("\", ");
            String _name_4 = template_1.getName();
            _builder_6.append(_name_4);
            _builder_6.append("_template);");
            _builder_6.newLineIfNotEmpty();
            it_2.append(_builder_6);
          }
          EList<IEntityMockAttribute> _attributes_1 = mockEntity.getAttributes();
          for (final IEntityMockAttribute attribute_1 : _attributes_1) {
            boolean _matched_1 = false;
            if (attribute_1 instanceof EntityMockAttributeByObject) {
              _matched_1=true;
              String sourceKey = ((EntityMockAttributeByObject)attribute_1).getReference().getTemplate().getName();
              EList<EntityMockObjectEmbed> _embedded = ((EntityMockAttributeByObject)attribute_1).getReference().getEmbedded();
              for (final EntityMockObjectEmbed embed : _embedded) {
                StringConcatenation _builder_7 = new StringConcatenation();
                _builder_7.append(sourceKey);
                _builder_7.append(".");
                String _name_5 = embed.getName();
                _builder_7.append(_name_5);
                sourceKey = _builder_7.toString();
              }
              final IEntityMockObjectUsable refAttribute = ((EntityMockAttributeByObject)attribute_1).getReference().getAttribute();
              if ((refAttribute instanceof EntityMockObjectEnum)) {
                StringConcatenation _builder_8 = new StringConcatenation();
                _builder_8.append(sourceKey);
                _builder_8.append(".");
                String _name_6 = ((EntityMockObjectEnum) refAttribute).getName();
                _builder_8.append(_name_6);
                sourceKey = _builder_8.toString();
              }
              if ((refAttribute instanceof EntityMockObjectPlainValue)) {
                StringConcatenation _builder_9 = new StringConcatenation();
                _builder_9.append(sourceKey);
                _builder_9.append(".");
                String _name_7 = ((EntityMockObjectPlainValue) refAttribute).getName();
                _builder_9.append(_name_7);
                sourceKey = _builder_9.toString();
              }
              if ((refAttribute instanceof EntityMockObjectResourceValue)) {
                StringConcatenation _builder_10 = new StringConcatenation();
                _builder_10.append(sourceKey);
                _builder_10.append(".");
                String _name_8 = ((EntityMockObjectResourceValue) refAttribute).getName();
                _builder_10.append(_name_8);
                sourceKey = _builder_10.toString();
              }
              if ((refAttribute instanceof EntityMockObjectArrayValue)) {
                StringConcatenation _builder_11 = new StringConcatenation();
                _builder_11.append(sourceKey);
                _builder_11.append(".");
                String _name_9 = ((EntityMockObjectArrayValue) refAttribute).getName();
                _builder_11.append(_name_9);
                sourceKey = _builder_11.toString();
              }
              if ((refAttribute instanceof EntityMockObjectEmbed)) {
                StringConcatenation _builder_12 = new StringConcatenation();
                _builder_12.append(sourceKey);
                _builder_12.append(".");
                String _name_10 = ((EntityMockObjectEmbed) refAttribute).getName();
                _builder_12.append(_name_10);
                sourceKey = _builder_12.toString();
              }
              if ((refAttribute instanceof EntityMockObjectFill)) {
                StringConcatenation _builder_13 = new StringConcatenation();
                _builder_13.append(sourceKey);
                _builder_13.append(".");
                String _name_11 = ((EntityMockObjectFill) refAttribute).getName();
                _builder_13.append(_name_11);
                sourceKey = _builder_13.toString();
              }
              if ((refAttribute instanceof EntityMockObjectFunction)) {
                StringConcatenation _builder_14 = new StringConcatenation();
                _builder_14.append(sourceKey);
                _builder_14.append(".");
                String _name_12 = ((EntityMockObjectFunction) refAttribute).getName();
                _builder_14.append(_name_12);
                sourceKey = _builder_14.toString();
              }
              StringConcatenation _builder_15 = new StringConcatenation();
              _builder_15.append("generateAttribute(\"");
              String _name_13 = ((EntityMockAttributeByObject)attribute_1).getAttributeRef().getName();
              _builder_15.append(_name_13);
              _builder_15.append("\", \"");
              _builder_15.append(sourceKey);
              _builder_15.append("\");");
              _builder_15.newLineIfNotEmpty();
              it_2.append(_builder_15);
            }
            if (!_matched_1) {
              if (attribute_1 instanceof EntityMockAttributeFiller) {
                _matched_1=true;
                PropertyFillerType type = ((EntityMockAttributeFiller)attribute_1).getFillerType();
                boolean _matched_2 = false;
                if (type instanceof PropertyFillerDateFuture) {
                  _matched_2=true;
                  StringConcatenation _builder_7 = new StringConcatenation();
                  _builder_7.append("generateDateAttribute(\"");
                  String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                  _builder_7.append(_name_5);
                  _builder_7.append("\", 0 ,");
                  int _dateFutureYears = ((PropertyFillerDateFuture)type).getDateFutureYears();
                  _builder_7.append(_dateFutureYears);
                  _builder_7.append(");");
                  _builder_7.newLineIfNotEmpty();
                  it_2.append(_builder_7);
                }
                if (!_matched_2) {
                  if (type instanceof PropertyFillerDatePast) {
                    _matched_2=true;
                    StringConcatenation _builder_7 = new StringConcatenation();
                    _builder_7.append("generateDateAttribute(\"");
                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_7.append(_name_5);
                    _builder_7.append("\", -");
                    int _datePastYears = ((PropertyFillerDatePast)type).getDatePastYears();
                    _builder_7.append(_datePastYears);
                    _builder_7.append(", 0);");
                    _builder_7.newLineIfNotEmpty();
                    it_2.append(_builder_7);
                  }
                }
                if (!_matched_2) {
                  if (type instanceof PropertyFillerDateRange) {
                    _matched_2=true;
                    StringConcatenation _builder_7 = new StringConcatenation();
                    _builder_7.append("generateDateAttribute(\"");
                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_7.append(_name_5);
                    _builder_7.append("\", ");
                    int _dateBeginYears = ((PropertyFillerDateRange)type).getDateBeginYears();
                    _builder_7.append(_dateBeginYears);
                    _builder_7.append(", ");
                    int _dateEndYears = ((PropertyFillerDateRange)type).getDateEndYears();
                    _builder_7.append(_dateEndYears);
                    _builder_7.append(");");
                    _builder_7.newLineIfNotEmpty();
                    it_2.append(_builder_7);
                  }
                }
                if (!_matched_2) {
                  if (type instanceof PropertyFillerBoolean) {
                    _matched_2=true;
                    StringConcatenation _builder_7 = new StringConcatenation();
                    _builder_7.append("generateBooleanAttribute(\"");
                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_7.append(_name_5);
                    _builder_7.append("\");");
                    _builder_7.newLineIfNotEmpty();
                    it_2.append(_builder_7);
                  }
                }
                if (!_matched_2) {
                  if (type instanceof PropertyFillerSignedDoubleRange) {
                    _matched_2=true;
                    StringConcatenation _builder_7 = new StringConcatenation();
                    double _beginRange = ((PropertyFillerSignedDoubleRange)type).getBeginRange();
                    _builder_7.append(_beginRange);
                    String beginRange = _builder_7.toString();
                    StringConcatenation _builder_8 = new StringConcatenation();
                    double _endRange = ((PropertyFillerSignedDoubleRange)type).getEndRange();
                    _builder_8.append(_endRange);
                    String endRange = _builder_8.toString();
                    LEntityAttribute _beginRangeRef = ((PropertyFillerSignedDoubleRange)type).getBeginRangeRef();
                    boolean _tripleNotEquals_2 = (_beginRangeRef != null);
                    if (_tripleNotEquals_2) {
                      StringConcatenation _builder_9 = new StringConcatenation();
                      _builder_9.append("get_\"");
                      String _name_5 = ((PropertyFillerSignedDoubleRange)type).getBeginRangeRef().getName();
                      _builder_9.append(_name_5);
                      _builder_9.append("\"()");
                      beginRange = _builder_9.toString();
                    }
                    LEntityAttribute _endRangeRef = ((PropertyFillerSignedDoubleRange)type).getEndRangeRef();
                    boolean _tripleNotEquals_3 = (_endRangeRef != null);
                    if (_tripleNotEquals_3) {
                      StringConcatenation _builder_10 = new StringConcatenation();
                      _builder_10.append("get_\"");
                      String _name_6 = ((PropertyFillerSignedDoubleRange)type).getEndRangeRef().getName();
                      _builder_10.append(_name_6);
                      _builder_10.append("\"()");
                      endRange = _builder_10.toString();
                    }
                    StringConcatenation _builder_11 = new StringConcatenation();
                    _builder_11.append("generateSignedAttribute(\"");
                    String _name_7 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_11.append(_name_7);
                    _builder_11.append("\", ");
                    int _decimals = ((PropertyFillerSignedDoubleRange)type).getDecimals();
                    _builder_11.append(_decimals);
                    _builder_11.append(", ");
                    _builder_11.append(beginRange);
                    _builder_11.append(", ");
                    _builder_11.append(endRange);
                    _builder_11.append(", ");
                    double _rounded = ((PropertyFillerSignedDoubleRange)type).getRounded();
                    _builder_11.append(_rounded);
                    _builder_11.append(");");
                    _builder_11.newLineIfNotEmpty();
                    it_2.append(_builder_11);
                  }
                }
                if (!_matched_2) {
                  if (type instanceof PropertyFillerSignedDoubleRandom) {
                    _matched_2=true;
                    StringConcatenation _builder_7 = new StringConcatenation();
                    _builder_7.append("generateAttribute(\"");
                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_7.append(_name_5);
                    _builder_7.append("\", ");
                    String _name_6 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_7.append(_name_6);
                    _builder_7.append("_items);");
                    _builder_7.newLineIfNotEmpty();
                    it_2.append(_builder_7);
                  }
                }
                if (!_matched_2) {
                  if (type instanceof PropertyFillerUnsignedDoubleRange) {
                    _matched_2=true;
                    StringConcatenation _builder_7 = new StringConcatenation();
                    double _beginRange = ((PropertyFillerUnsignedDoubleRange)type).getBeginRange();
                    _builder_7.append(_beginRange);
                    String beginRange = _builder_7.toString();
                    StringConcatenation _builder_8 = new StringConcatenation();
                    double _endRange = ((PropertyFillerUnsignedDoubleRange)type).getEndRange();
                    _builder_8.append(_endRange);
                    String endRange = _builder_8.toString();
                    LEntityAttribute _beginRangeRef = ((PropertyFillerUnsignedDoubleRange)type).getBeginRangeRef();
                    boolean _tripleNotEquals_2 = (_beginRangeRef != null);
                    if (_tripleNotEquals_2) {
                      StringConcatenation _builder_9 = new StringConcatenation();
                      _builder_9.append("(double)get_\"");
                      String _name_5 = ((PropertyFillerUnsignedDoubleRange)type).getBeginRangeRef().getName();
                      _builder_9.append(_name_5);
                      _builder_9.append("\"()");
                      beginRange = _builder_9.toString();
                    }
                    LEntityAttribute _endRangeRef = ((PropertyFillerUnsignedDoubleRange)type).getEndRangeRef();
                    boolean _tripleNotEquals_3 = (_endRangeRef != null);
                    if (_tripleNotEquals_3) {
                      StringConcatenation _builder_10 = new StringConcatenation();
                      _builder_10.append("(double)get_\"");
                      String _name_6 = ((PropertyFillerUnsignedDoubleRange)type).getEndRangeRef().getName();
                      _builder_10.append(_name_6);
                      _builder_10.append("\"()");
                      endRange = _builder_10.toString();
                    }
                    StringConcatenation _builder_11 = new StringConcatenation();
                    _builder_11.append("generateUnsignedAttribute(\"");
                    String _name_7 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_11.append(_name_7);
                    _builder_11.append("\", ");
                    int _decimals = ((PropertyFillerUnsignedDoubleRange)type).getDecimals();
                    _builder_11.append(_decimals);
                    _builder_11.append(", ");
                    _builder_11.append(beginRange);
                    _builder_11.append(", ");
                    _builder_11.append(endRange);
                    _builder_11.append(", ");
                    double _rounded = ((PropertyFillerUnsignedDoubleRange)type).getRounded();
                    _builder_11.append(_rounded);
                    _builder_11.append(");");
                    _builder_11.newLineIfNotEmpty();
                    it_2.append(_builder_11);
                  }
                }
                if (!_matched_2) {
                  if (type instanceof PropertyFillerUnsignedDoubleRandom) {
                    _matched_2=true;
                    StringConcatenation _builder_7 = new StringConcatenation();
                    _builder_7.append("generateAttribute(\"");
                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_7.append(_name_5);
                    _builder_7.append("\", ");
                    String _name_6 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_7.append(_name_6);
                    _builder_7.append("_items);");
                    _builder_7.newLineIfNotEmpty();
                    it_2.append(_builder_7);
                  }
                }
                if (!_matched_2) {
                  if (type instanceof PropertyFillerSignedIntegerRange) {
                    _matched_2=true;
                    StringConcatenation _builder_7 = new StringConcatenation();
                    int _beginRange = ((PropertyFillerSignedIntegerRange)type).getBeginRange();
                    _builder_7.append(_beginRange);
                    String beginRange = _builder_7.toString();
                    StringConcatenation _builder_8 = new StringConcatenation();
                    int _endRange = ((PropertyFillerSignedIntegerRange)type).getEndRange();
                    _builder_8.append(_endRange);
                    String endRange = _builder_8.toString();
                    LEntityAttribute _beginRangeRef = ((PropertyFillerSignedIntegerRange)type).getBeginRangeRef();
                    boolean _tripleNotEquals_2 = (_beginRangeRef != null);
                    if (_tripleNotEquals_2) {
                      StringConcatenation _builder_9 = new StringConcatenation();
                      _builder_9.append("(int)get_\"");
                      String _name_5 = ((PropertyFillerSignedIntegerRange)type).getBeginRangeRef().getName();
                      _builder_9.append(_name_5);
                      _builder_9.append("\"()");
                      beginRange = _builder_9.toString();
                    }
                    LEntityAttribute _endRangeRef = ((PropertyFillerSignedIntegerRange)type).getEndRangeRef();
                    boolean _tripleNotEquals_3 = (_endRangeRef != null);
                    if (_tripleNotEquals_3) {
                      StringConcatenation _builder_10 = new StringConcatenation();
                      _builder_10.append("(int)get_\"");
                      String _name_6 = ((PropertyFillerSignedIntegerRange)type).getEndRangeRef().getName();
                      _builder_10.append(_name_6);
                      _builder_10.append("\"()");
                      endRange = _builder_10.toString();
                    }
                    StringConcatenation _builder_11 = new StringConcatenation();
                    _builder_11.append("generateSignedAttribute(\"");
                    String _name_7 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_11.append(_name_7);
                    _builder_11.append("\", ");
                    _builder_11.append(beginRange);
                    _builder_11.append(", ");
                    _builder_11.append(endRange);
                    _builder_11.append(", ");
                    int _rounded = ((PropertyFillerSignedIntegerRange)type).getRounded();
                    _builder_11.append(_rounded);
                    _builder_11.append(");");
                    _builder_11.newLineIfNotEmpty();
                    it_2.append(_builder_11);
                  }
                }
                if (!_matched_2) {
                  if (type instanceof PropertyFillerSignedIntegerRandom) {
                    _matched_2=true;
                    StringConcatenation _builder_7 = new StringConcatenation();
                    _builder_7.append("generateAttribute(\"");
                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_7.append(_name_5);
                    _builder_7.append("\", ");
                    String _name_6 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_7.append(_name_6);
                    _builder_7.append("_items);");
                    _builder_7.newLineIfNotEmpty();
                    it_2.append(_builder_7);
                  }
                }
                if (!_matched_2) {
                  if (type instanceof PropertyFillerUnsignedIntegerRange) {
                    _matched_2=true;
                    StringConcatenation _builder_7 = new StringConcatenation();
                    int _beginRange = ((PropertyFillerUnsignedIntegerRange)type).getBeginRange();
                    _builder_7.append(_beginRange);
                    String beginRange = _builder_7.toString();
                    StringConcatenation _builder_8 = new StringConcatenation();
                    int _endRange = ((PropertyFillerUnsignedIntegerRange)type).getEndRange();
                    _builder_8.append(_endRange);
                    String endRange = _builder_8.toString();
                    LEntityAttribute _beginRangeRef = ((PropertyFillerUnsignedIntegerRange)type).getBeginRangeRef();
                    boolean _tripleNotEquals_2 = (_beginRangeRef != null);
                    if (_tripleNotEquals_2) {
                      StringConcatenation _builder_9 = new StringConcatenation();
                      _builder_9.append("(int)get_\"");
                      String _name_5 = ((PropertyFillerUnsignedIntegerRange)type).getBeginRangeRef().getName();
                      _builder_9.append(_name_5);
                      _builder_9.append("\"()");
                      beginRange = _builder_9.toString();
                    }
                    LEntityAttribute _endRangeRef = ((PropertyFillerUnsignedIntegerRange)type).getEndRangeRef();
                    boolean _tripleNotEquals_3 = (_endRangeRef != null);
                    if (_tripleNotEquals_3) {
                      StringConcatenation _builder_10 = new StringConcatenation();
                      _builder_10.append("(int)get_\"");
                      String _name_6 = ((PropertyFillerUnsignedIntegerRange)type).getEndRangeRef().getName();
                      _builder_10.append(_name_6);
                      _builder_10.append("\"()");
                      endRange = _builder_10.toString();
                    }
                    StringConcatenation _builder_11 = new StringConcatenation();
                    _builder_11.append("generateUnsignedAttribute(\"");
                    String _name_7 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_11.append(_name_7);
                    _builder_11.append("\", ");
                    _builder_11.append(beginRange);
                    _builder_11.append(", ");
                    _builder_11.append(endRange);
                    _builder_11.append(", ");
                    int _rounded = ((PropertyFillerUnsignedIntegerRange)type).getRounded();
                    _builder_11.append(_rounded);
                    _builder_11.append(");");
                    _builder_11.newLineIfNotEmpty();
                    it_2.append(_builder_11);
                  }
                }
                if (!_matched_2) {
                  if (type instanceof PropertyFillerUnsignedIntegerRandom) {
                    _matched_2=true;
                    StringConcatenation _builder_7 = new StringConcatenation();
                    _builder_7.append("generateAttribute(\"");
                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_7.append(_name_5);
                    _builder_7.append("\", ");
                    String _name_6 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_7.append(_name_6);
                    _builder_7.append("_items);");
                    _builder_7.newLineIfNotEmpty();
                    it_2.append(_builder_7);
                  }
                }
                if (!_matched_2) {
                  if (type instanceof PropertyFillerTextRandom) {
                    _matched_2=true;
                    StringConcatenation _builder_7 = new StringConcatenation();
                    _builder_7.append("generateAttribute(\"");
                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_7.append(_name_5);
                    _builder_7.append("\", ");
                    String _name_6 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_7.append(_name_6);
                    _builder_7.append("_items);");
                    _builder_7.newLineIfNotEmpty();
                    it_2.append(_builder_7);
                  }
                }
                if (!_matched_2) {
                  if (type instanceof PropertyFillerTextParagraphs) {
                    _matched_2=true;
                    StringConcatenation _builder_7 = new StringConcatenation();
                    _builder_7.append("generateParagraphsAttribute(\"");
                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_7.append(_name_5);
                    _builder_7.append("\", ");
                    int _count = ((PropertyFillerTextParagraphs)type).getCount();
                    _builder_7.append(_count);
                    _builder_7.append(");");
                    _builder_7.newLineIfNotEmpty();
                    it_2.append(_builder_7);
                  }
                }
                if (!_matched_2) {
                  if (type instanceof PropertyFillerTextSentences) {
                    _matched_2=true;
                    StringConcatenation _builder_7 = new StringConcatenation();
                    _builder_7.append("generateSentencesAttribute(\"");
                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_7.append(_name_5);
                    _builder_7.append("\", ");
                    int _count = ((PropertyFillerTextSentences)type).getCount();
                    _builder_7.append(_count);
                    _builder_7.append(");");
                    _builder_7.newLineIfNotEmpty();
                    it_2.append(_builder_7);
                  }
                }
                if (!_matched_2) {
                  if (type instanceof PropertyFillerTextWords) {
                    _matched_2=true;
                    StringConcatenation _builder_7 = new StringConcatenation();
                    _builder_7.append("generateWordsAttribute(\"");
                    String _name_5 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                    _builder_7.append(_name_5);
                    _builder_7.append("\", ");
                    int _count = ((PropertyFillerTextWords)type).getCount();
                    _builder_7.append(_count);
                    _builder_7.append(");");
                    _builder_7.newLineIfNotEmpty();
                    it_2.append(_builder_7);
                  }
                }
              }
            }
            if (!_matched_1) {
              if (attribute_1 instanceof EntityMockAttributeByReference) {
                _matched_1=true;
                EntityMockEntity _mockedEntity = ((EntityMockAttributeByReference)attribute_1).getMockedEntity();
                boolean _tripleEquals = (_mockedEntity == null);
                if (_tripleEquals) {
                  StringConcatenation _builder_7 = new StringConcatenation();
                  _builder_7.append("generateAttribute(\"");
                  String _name_5 = ((EntityMockAttributeByReference)attribute_1).getAttributeRef().getName();
                  _builder_7.append(_name_5);
                  _builder_7.append("\", ");
                  String _dtoFQNForLEntity = EntityUtils.getDtoFQNForLEntity(((EntityMockAttributeByReference)attribute_1).getAttributeRef().getType());
                  _builder_7.append(_dtoFQNForLEntity);
                  _builder_7.append(".class, ");
                  int _optionalFor = ((EntityMockAttributeByReference)attribute_1).getOptionalFor();
                  double _divide = (((double) _optionalFor) / 100.0);
                  _builder_7.append(_divide);
                  _builder_7.append(");");
                  _builder_7.newLineIfNotEmpty();
                  it_2.append(_builder_7);
                } else {
                  StringConcatenation _builder_8 = new StringConcatenation();
                  _builder_8.append("generateAttribute(\"");
                  String _name_6 = ((EntityMockAttributeByReference)attribute_1).getAttributeRef().getName();
                  _builder_8.append(_name_6);
                  _builder_8.append("\", \"");
                  String _name_7 = ((EntityMockAttributeByReference)attribute_1).getMockedEntity().getName();
                  _builder_8.append(_name_7);
                  _builder_8.append("\", ");
                  int _optionalFor_1 = ((EntityMockAttributeByReference)attribute_1).getOptionalFor();
                  double _divide_1 = (((double) _optionalFor_1) / 100.0);
                  _builder_8.append(_divide_1);
                  _builder_8.append(");");
                  _builder_8.newLineIfNotEmpty();
                  it_2.append(_builder_8);
                }
              }
            }
          }
          EList<EntityMockEntityFunction> _calculations_1 = mockEntity.getCalculations();
          for (final EntityMockEntityFunction calculation_1 : _calculations_1) {
            {
              String doc = this._jvmTypesBuilder.getDocumentation(calculation_1);
              if (((doc instanceof String) && (!doc.trim().isEmpty()))) {
                StringConcatenation _builder_7 = new StringConcatenation();
                _builder_7.append("/** ");
                _builder_7.append(doc);
                _builder_7.append(" */");
                _builder_7.newLineIfNotEmpty();
                it_2.append(_builder_7);
              }
              StringConcatenation _builder_8 = new StringConcatenation();
              String paramString = _builder_8.toString();
              EList<EntityMockEntityFunctionParameter> _params = calculation_1.getParams();
              for (final EntityMockEntityFunctionParameter param : _params) {
                {
                  boolean _isEmpty = paramString.isEmpty();
                  boolean _not = (!_isEmpty);
                  if (_not) {
                    StringConcatenation _builder_9 = new StringConcatenation();
                    _builder_9.append(paramString);
                    _builder_9.append(",");
                    paramString = _builder_9.toString();
                  }
                  LEntityAttribute _attributeRef = param.getAttributeRef();
                  boolean _tripleNotEquals_2 = (_attributeRef != null);
                  if (_tripleNotEquals_2) {
                    StringConcatenation _builder_10 = new StringConcatenation();
                    _builder_10.append(paramString);
                    _builder_10.append("(");
                    String _identifier = this.getJvmType(param).getIdentifier();
                    _builder_10.append(_identifier);
                    _builder_10.append(")getAttribute(\"");
                    String _paramName = this.getParamName(param, ".");
                    _builder_10.append(_paramName);
                    _builder_10.append("\")");
                    paramString = _builder_10.toString();
                  } else {
                    boolean _isReferenceOnExistingDto = this.isReferenceOnExistingDto(param);
                    if (_isReferenceOnExistingDto) {
                      StringConcatenation _builder_11 = new StringConcatenation();
                      _builder_11.append(paramString);
                      _builder_11.append("(");
                      String _identifier_1 = this.getJvmType(param).getIdentifier();
                      _builder_11.append(_identifier_1);
                      _builder_11.append(")((");
                      String _dtoFQNForLEntity = EntityUtils.getDtoFQNForLEntity(param.getNestedAttribute().getReference().getType());
                      _builder_11.append(_dtoFQNForLEntity);
                      _builder_11.append(")getAttribute(\"");
                      String _name_5 = param.getNestedAttribute().getAttribute().getName();
                      _builder_11.append(_name_5);
                      _builder_11.append("\", mockDataGenerator, persistenceUnit)).get");
                      String _firstUpper = StringExtensions.toFirstUpper(param.getNestedAttribute().getReference().getName());
                      _builder_11.append(_firstUpper);
                      _builder_11.append("()");
                      paramString = _builder_11.toString();
                    } else {
                      StringConcatenation _builder_12 = new StringConcatenation();
                      _builder_12.append(paramString);
                      _builder_12.append("(");
                      String _identifier_2 = this.getJvmType(param).getIdentifier();
                      _builder_12.append(_identifier_2);
                      _builder_12.append(")getAttribute(\"");
                      String _paramName_1 = this.getParamName(param, ".");
                      _builder_12.append(_paramName_1);
                      _builder_12.append("\", mockDataGenerator, persistenceUnit)");
                      paramString = _builder_12.toString();
                    }
                  }
                }
              }
              StringConcatenation _builder_9 = new StringConcatenation();
              _builder_9.append("try {");
              _builder_9.newLine();
              _builder_9.append("\t");
              _builder_9.append("setFixAttribute(\"");
              String _name_5 = calculation_1.getAttributeRef().getName();
              _builder_9.append(_name_5, "\t");
              _builder_9.append("\", calculate_");
              String _name_6 = calculation_1.getAttributeRef().getName();
              _builder_9.append(_name_6, "\t");
              _builder_9.append("(");
              _builder_9.append(paramString, "\t");
              _builder_9.append("));");
              _builder_9.newLineIfNotEmpty();
              _builder_9.append("}");
              _builder_9.newLine();
              _builder_9.append("catch (NullPointerException npe) {}");
              _builder_9.newLine();
              _builder_9.append("catch (Exception e) {");
              _builder_9.newLine();
              _builder_9.append("    ");
              _builder_9.append("log.error(e.getLocalizedMessage()+e.getCause());");
              _builder_9.newLine();
              _builder_9.append("}");
              _builder_9.newLine();
              it_2.append(_builder_9);
            }
          }
        };
        this._jvmTypesBuilder.setBody(it_1, _function_9);
      };
      JvmOperation _method_3 = this._jvmTypesBuilder.toMethod(model, _builder_5.toString(), this._typeReferenceBuilder.typeRef(Void.TYPE), _function_8);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_7, _method_3);
      EntityMockResource _byResource_2 = mockEntity.getByResource();
      boolean _tripleEquals = (_byResource_2 == null);
      if (_tripleEquals) {
        EList<JvmMember> _members_8 = it.getMembers();
        StringConcatenation _builder_6 = new StringConcatenation();
        _builder_6.append("generateEntity");
        final Procedure1<JvmOperation> _function_9 = (JvmOperation it_1) -> {
          it_1.setVisibility(JvmVisibility.PUBLIC);
          EList<JvmFormalParameter> _parameters = it_1.getParameters();
          JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(mockEntity, "dataRow", this._typeReferenceBuilder.typeRef(Object.class));
          this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
          it_1.setFinal(true);
          final Procedure1<ITreeAppendable> _function_10 = (ITreeAppendable it_2) -> {
            StringConcatenation _builder_7 = new StringConcatenation();
            _builder_7.append("reset();");
            _builder_7.newLine();
            it_2.append(_builder_7);
            LEntityAttribute _iterator = mockEntity.getIterator();
            boolean _tripleNotEquals_2 = (_iterator != null);
            if (_tripleNotEquals_2) {
              StringConcatenation _builder_8 = new StringConcatenation();
              _builder_8.append("setFixAttribute(\"");
              String _name_3 = mockEntity.getIterator().getName();
              _builder_8.append(_name_3);
              _builder_8.append("\", dataRow);");
              _builder_8.newLineIfNotEmpty();
              it_2.append(_builder_8);
            }
            StringConcatenation _builder_9 = new StringConcatenation();
            String _entityDtoFQN = this.entityDtoFQN(mockEntity);
            _builder_9.append(_entityDtoFQN);
            _builder_9.append(" internal = new ");
            String _entityDtoFQN_1 = this.entityDtoFQN(mockEntity);
            _builder_9.append(_entityDtoFQN_1);
            _builder_9.append("();");
            _builder_9.newLineIfNotEmpty();
            _builder_9.append("entity = internal;");
            _builder_9.newLine();
            _builder_9.append("generateData();");
            _builder_9.newLine();
            _builder_9.append("mockDataGenerator.addDtoMockData(internal, getMockData());");
            _builder_9.newLine();
            _builder_9.append("try {");
            _builder_9.newLine();
            it_2.append(_builder_9);
            EList<IEntityMockAttribute> _attributes_1 = mockEntity.getAttributes();
            for (final IEntityMockAttribute attribute_1 : _attributes_1) {
              boolean _matched_1 = false;
              if (attribute_1 instanceof EntityMockAttributeByObject) {
                _matched_1=true;
                StringConcatenation _builder_10 = new StringConcatenation();
                _builder_10.append("\t");
                _builder_10.append("internal.set");
                String _capitalize = WordUtils.capitalize(((EntityMockAttributeByObject)attribute_1).getAttributeRef().getName());
                _builder_10.append(_capitalize, "\t");
                _builder_10.append("(");
                LEntityAttribute _attributeRef = ((EntityMockAttributeByObject)attribute_1).getAttributeRef();
                StringConcatenation _builder_11 = new StringConcatenation();
                _builder_11.append("getMockData().get(\"");
                String _name_4 = ((EntityMockAttributeByObject)attribute_1).getAttributeRef().getName();
                _builder_11.append(_name_4);
                _builder_11.append("\")");
                String _baseMockDataTypeCasting = this.baseMockDataTypeCasting(_attributeRef, _builder_11.toString());
                _builder_10.append(_baseMockDataTypeCasting, "\t");
                _builder_10.append(");");
                _builder_10.newLineIfNotEmpty();
                it_2.append(_builder_10);
              }
              if (!_matched_1) {
                if (attribute_1 instanceof EntityMockAttributeFiller) {
                  _matched_1=true;
                  StringConcatenation _builder_10 = new StringConcatenation();
                  _builder_10.append("\t");
                  _builder_10.append("internal.set");
                  String _capitalize = WordUtils.capitalize(((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName());
                  _builder_10.append(_capitalize, "\t");
                  _builder_10.append("(");
                  LEntityAttribute _attributeRef = ((EntityMockAttributeFiller)attribute_1).getAttributeRef();
                  StringConcatenation _builder_11 = new StringConcatenation();
                  _builder_11.append("getMockData().get(\"");
                  String _name_4 = ((EntityMockAttributeFiller)attribute_1).getAttributeRef().getName();
                  _builder_11.append(_name_4);
                  _builder_11.append("\")");
                  String _baseMockDataTypeCasting = this.baseMockDataTypeCasting(_attributeRef, _builder_11.toString());
                  _builder_10.append(_baseMockDataTypeCasting, "\t");
                  _builder_10.append(");");
                  _builder_10.newLineIfNotEmpty();
                  it_2.append(_builder_10);
                }
              }
              if (!_matched_1) {
                if (attribute_1 instanceof EntityMockAttributeByReference) {
                  _matched_1=true;
                  StringConcatenation _builder_10 = new StringConcatenation();
                  _builder_10.append("\t");
                  _builder_10.append("internal.set");
                  String _capitalize = WordUtils.capitalize(((EntityMockAttributeByReference)attribute_1).getAttributeRef().getName());
                  _builder_10.append(_capitalize, "\t");
                  _builder_10.append("((");
                  String _dtoFQNForLEntity = EntityUtils.getDtoFQNForLEntity(((EntityMockAttributeByReference)attribute_1).getAttributeRef().getType());
                  _builder_10.append(_dtoFQNForLEntity, "\t");
                  _builder_10.append(")getMockData().get(\"");
                  String _name_4 = ((EntityMockAttributeByReference)attribute_1).getAttributeRef().getName();
                  _builder_10.append(_name_4, "\t");
                  _builder_10.append("\"));");
                  _builder_10.newLineIfNotEmpty();
                  it_2.append(_builder_10);
                }
              }
            }
            EList<EntityMockEntityFunction> _calculations_1 = mockEntity.getCalculations();
            for (final EntityMockEntityFunction calculation_1 : _calculations_1) {
              StringConcatenation _builder_10 = new StringConcatenation();
              _builder_10.append("\t");
              _builder_10.append("internal.set");
              String _capitalize = WordUtils.capitalize(calculation_1.getAttributeRef().getName());
              _builder_10.append(_capitalize, "\t");
              _builder_10.append("(");
              LEntityAttribute _attributeRef = calculation_1.getAttributeRef();
              StringConcatenation _builder_11 = new StringConcatenation();
              _builder_11.append("getMockData().get(\"");
              String _name_4 = calculation_1.getAttributeRef().getName();
              _builder_11.append(_name_4);
              _builder_11.append("\")");
              String _baseMockDataTypeCasting = this.baseMockDataTypeCasting(_attributeRef, _builder_11.toString());
              _builder_10.append(_baseMockDataTypeCasting, "\t");
              _builder_10.append(");");
              _builder_10.newLineIfNotEmpty();
              it_2.append(_builder_10);
            }
            StringConcatenation _builder_12 = new StringConcatenation();
            _builder_12.append("}");
            _builder_12.newLine();
            _builder_12.append("catch (Exception e) {");
            _builder_12.newLine();
            _builder_12.append("    ");
            _builder_12.append("log.error(e.getLocalizedMessage()+e.getCause());");
            _builder_12.newLine();
            _builder_12.append("}");
            _builder_12.newLine();
            _builder_12.append("return entity;");
            it_2.append(_builder_12);
          };
          this._jvmTypesBuilder.setBody(it_1, _function_10);
        };
        JvmOperation _method_4 = this._jvmTypesBuilder.toMethod(model, _builder_6.toString(), this._typeReferenceBuilder.typeRef(Object.class), _function_9);
        this._jvmTypesBuilder.<JvmOperation>operator_add(_members_8, _method_4);
      }
    };
    acceptor.<JvmGenericType>accept(mockClass, _function);
  }
  
  public boolean isReferenceOnExistingDto(final EntityMockEntityFunctionParameter param) {
    EObject _eContainer = param.eContainer().eContainer();
    final EntityMockEntity entityMock = ((EntityMockEntity) _eContainer);
    EList<IEntityMockAttribute> _attributes = entityMock.getAttributes();
    for (final IEntityMockAttribute attribute : _attributes) {
      if ((attribute instanceof EntityMockAttributeByReference)) {
        EntityMockEntity _mockedEntity = ((EntityMockAttributeByReference)attribute).getMockedEntity();
        boolean _tripleEquals = (_mockedEntity == null);
        if (_tripleEquals) {
          boolean _equals = ((EntityMockAttributeByReference)attribute).getAttributeRef().getType().equals(param.getNestedAttribute().getReference().eContainer());
          if (_equals) {
            return true;
          }
        }
      }
    }
    return false;
  }
  
  public JvmTypeReference getJvmType(final EntityMockEntityFunctionParameter param) {
    LEntityAttribute _attributeRef = param.getAttributeRef();
    boolean _tripleNotEquals = (_attributeRef != null);
    if (_tripleNotEquals) {
      return this.jvmTypeRef(param.getAttributeRef());
    } else {
      return this.entityExtensions.toTypeReference(param.getNestedAttribute().getAttribute());
    }
  }
  
  public String getParamName(final EntityMockEntityFunctionParameter param, final String separator) {
    StringConcatenation _builder = new StringConcatenation();
    String paramName = _builder.toString();
    LEntityAttribute _attributeRef = param.getAttributeRef();
    boolean _tripleNotEquals = (_attributeRef != null);
    if (_tripleNotEquals) {
      StringConcatenation _builder_1 = new StringConcatenation();
      String _name = param.getAttributeRef().getName();
      _builder_1.append(_name);
      paramName = _builder_1.toString();
    } else {
      StringConcatenation _builder_2 = new StringConcatenation();
      String _name_1 = param.getNestedAttribute().getReference().getName();
      _builder_2.append(_name_1);
      _builder_2.append(separator);
      paramName = _builder_2.toString();
      StringConcatenation _builder_3 = new StringConcatenation();
      _builder_3.append(paramName);
      String _name_2 = param.getNestedAttribute().getAttribute().getName();
      _builder_3.append(_name_2);
      paramName = _builder_3.toString();
    }
    return paramName;
  }
  
  /**
   * generate the JVM type reference needed for of the entity attribute
   */
  public JvmTypeReference jvmTypeRef(final LEntityAttribute attribute) {
    IDataMart.EType etype = this.dtType.getBasicType(attribute);
    if (etype != null) {
      switch (etype) {
        case BOOLEAN:
          return this._typeReferenceBuilder.typeRef(boolean.class);
        case BYTE:
          return this._typeReferenceBuilder.typeRef(byte.class);
        case DATE:
          return this._typeReferenceBuilder.typeRef(Date.class);
        case FLOAT:
          return this._typeReferenceBuilder.typeRef(float.class);
        case DOUBLE:
          return this._typeReferenceBuilder.typeRef(double.class);
        case SHORT:
          return this._typeReferenceBuilder.typeRef(short.class);
        case INTEGER:
          return this._typeReferenceBuilder.typeRef(int.class);
        case LONG:
          return this._typeReferenceBuilder.typeRef(long.class);
        case STRING:
          return this._typeReferenceBuilder.typeRef(String.class);
        default:
          return this._typeReferenceBuilder.typeRef(Object.class);
      }
    } else {
      return this._typeReferenceBuilder.typeRef(Object.class);
    }
  }
  
  /**
   * generate the code for casting a mock data to the data type of the entity attribute
   */
  public String baseMockDataTypeCasting(final LEntityAttribute attribute, final String getting) {
    LScalarType _type = attribute.getType();
    if ((_type instanceof LEnum)) {
      StringConcatenation _builder = new StringConcatenation();
      LScalarType _type_1 = attribute.getType();
      String _dtoFQNForLEnum = EntityUtils.getDtoFQNForLEnum(((LEnum) _type_1));
      _builder.append(_dtoFQNForLEnum);
      _builder.append(".valueOf(");
      _builder.append(getting);
      _builder.append(".toString())");
      return _builder.toString();
    }
    LScalarType _type_2 = attribute.getType();
    if ((_type_2 instanceof LBean)) {
      StringConcatenation _builder_1 = new StringConcatenation();
      _builder_1.append("(");
      LScalarType _type_3 = attribute.getType();
      String _dtoFQNForLBean = EntityUtils.getDtoFQNForLBean(((LBean) _type_3));
      _builder_1.append(_dtoFQNForLBean);
      _builder_1.append(")(");
      _builder_1.append(getting);
      _builder_1.append(")");
      return _builder_1.toString();
    }
    IDataMart.EType etype = this.dtType.getBasicType(attribute);
    if (etype != null) {
      switch (etype) {
        case BOOLEAN:
          StringConcatenation _builder_2 = new StringConcatenation();
          _builder_2.append("asBoolean(");
          _builder_2.append(getting);
          _builder_2.append(")");
          return _builder_2.toString();
        case BYTE:
          StringConcatenation _builder_3 = new StringConcatenation();
          _builder_3.append("asByte(");
          _builder_3.append(getting);
          _builder_3.append(")");
          return _builder_3.toString();
        case DATE:
          StringConcatenation _builder_4 = new StringConcatenation();
          _builder_4.append("asDate(");
          _builder_4.append(getting);
          _builder_4.append(")");
          return _builder_4.toString();
        case FLOAT:
          StringConcatenation _builder_5 = new StringConcatenation();
          _builder_5.append("asFloat(");
          _builder_5.append(getting);
          _builder_5.append(")");
          return _builder_5.toString();
        case DOUBLE:
          StringConcatenation _builder_6 = new StringConcatenation();
          _builder_6.append("asDouble(");
          _builder_6.append(getting);
          _builder_6.append(")");
          return _builder_6.toString();
        case SHORT:
          StringConcatenation _builder_7 = new StringConcatenation();
          _builder_7.append("asShort(");
          _builder_7.append(getting);
          _builder_7.append(")");
          return _builder_7.toString();
        case INTEGER:
          StringConcatenation _builder_8 = new StringConcatenation();
          _builder_8.append("asInt(");
          _builder_8.append(getting);
          _builder_8.append(")");
          return _builder_8.toString();
        case LONG:
          StringConcatenation _builder_9 = new StringConcatenation();
          _builder_9.append("asLong(");
          _builder_9.append(getting);
          _builder_9.append(")");
          return _builder_9.toString();
        case TIME:
          StringConcatenation _builder_10 = new StringConcatenation();
          _builder_10.append("asTime(");
          _builder_10.append(getting);
          _builder_10.append(")");
          return _builder_10.toString();
        default:
          StringConcatenation _builder_11 = new StringConcatenation();
          _builder_11.append("asString(");
          _builder_11.append(getting);
          _builder_11.append(")");
          return _builder_11.toString();
      }
    } else {
      StringConcatenation _builder_11 = new StringConcatenation();
      _builder_11.append("asString(");
      _builder_11.append(getting);
      _builder_11.append(")");
      return _builder_11.toString();
    }
  }
  
  public final static String ENTITY_MOCK_GENERATOR = "EntityMockGenerator";
  
  public String asString(final org.eclipse.osbp.xtext.entitymock.Date date) {
    boolean _isYesterday = date.isYesterday();
    if (_isYesterday) {
      StringConcatenation _builder = new StringConcatenation();
      _builder.append("\"yesterday\"");
      return _builder.toString();
    }
    boolean _isToday = date.isToday();
    if (_isToday) {
      StringConcatenation _builder_1 = new StringConcatenation();
      _builder_1.append("\"today\"");
      return _builder_1.toString();
    }
    boolean _isTomorrow = date.isTomorrow();
    if (_isTomorrow) {
      StringConcatenation _builder_2 = new StringConcatenation();
      _builder_2.append("\"tomorrow\"");
      return _builder_2.toString();
    }
    StringConcatenation _builder_3 = new StringConcatenation();
    _builder_3.append("\"");
    String _format = String.format("%04d-%02d-%02d", Integer.valueOf(date.getYear()), Integer.valueOf(date.getMonth()), Integer.valueOf(date.getDay()));
    String _plus = (_builder_3.toString() + _format);
    StringConcatenation _builder_4 = new StringConcatenation();
    _builder_4.append("\"");
    return (_plus + _builder_4);
  }
  
  /**
   * generate the main mock data generator for the EntityMockPackage
   */
  public void generateMockDataGenerator(final EntityMock mock, final IJvmDeclaredTypeAcceptor acceptor) {
    JvmGenericType mockClass = this._jvmTypesBuilder.toClass(mock, this.entityMockName(mock));
    final Procedure1<JvmGenericType> _function = (JvmGenericType it) -> {
      this._jvmTypesBuilder.setFileHeader(it, this._jvmTypesBuilder.getDocumentation(mock));
      JvmAnnotationReference annotationRef = this._annotationTypesBuilder.annotationRef(Component.class);
      JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(IEntityMockDataGenerator.class);
      this._commonUtils.addAnnAttr(annotationRef, mock, "service", ((JvmTypeReference) _typeRef));
      this._commonUtils.addAnnAttr(annotationRef, mock, "immediate", Boolean.valueOf(true));
      EList<JvmAnnotationReference> _annotations = it.getAnnotations();
      this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations, annotationRef);
      EList<JvmTypeReference> _superTypes = it.getSuperTypes();
      JvmTypeReference _typeRef_1 = this._typeReferenceBuilder.typeRef(AEntityMockDataGenerator.class);
      this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes, _typeRef_1);
      it.setFinal(true);
      JvmField field = null;
      final Procedure1<JvmField> _function_1 = (JvmField it_1) -> {
        final Procedure1<ITreeAppendable> _function_2 = (ITreeAppendable it_2) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("LoggerFactory.getLogger(\"mock\")");
          it_2.append(_builder);
        };
        this._jvmTypesBuilder.setInitializer(it_1, _function_2);
      };
      field = this._jvmTypesBuilder.toField(mock, "log", this._typeReferenceBuilder.typeRef(Logger.class), _function_1);
      field.setFinal(true);
      field.setStatic(true);
      EList<JvmMember> _members = it.getMembers();
      this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
      EList<JvmMember> _members_1 = it.getMembers();
      StringConcatenation _builder = new StringConcatenation();
      _builder.append("getRunWithPriority");
      final Procedure1<JvmOperation> _function_2 = (JvmOperation it_1) -> {
        EList<JvmAnnotationReference> _annotations_1 = it_1.getAnnotations();
        JvmAnnotationReference _annotationRef = this._annotationTypesBuilder.annotationRef(Override.class);
        this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations_1, _annotationRef);
        final Procedure1<ITreeAppendable> _function_3 = (ITreeAppendable it_2) -> {
          int count = IEntityMockDataGenerator.DEFAULT_PRIORITY;
          int _runPriority = mock.getRunPriority();
          boolean _greaterThan = (_runPriority > 0);
          if (_greaterThan) {
            count = mock.getRunPriority();
          }
          StringConcatenation _builder_1 = new StringConcatenation();
          _builder_1.append("return ");
          _builder_1.append(count);
          _builder_1.append(";");
          _builder_1.newLineIfNotEmpty();
          it_2.append(_builder_1);
        };
        this._jvmTypesBuilder.setBody(it_1, _function_3);
      };
      JvmOperation _method = this._jvmTypesBuilder.toMethod(mock, _builder.toString(), this._typeReferenceBuilder.typeRef(int.class), _function_2);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_1, _method);
      EList<JvmMember> _members_2 = it.getMembers();
      StringConcatenation _builder_1 = new StringConcatenation();
      _builder_1.append("getDataInterchangeSteps");
      final Procedure1<JvmOperation> _function_3 = (JvmOperation it_1) -> {
        EList<JvmAnnotationReference> _annotations_1 = it_1.getAnnotations();
        JvmAnnotationReference _annotationRef = this._annotationTypesBuilder.annotationRef(Override.class);
        this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations_1, _annotationRef);
        final Procedure1<ITreeAppendable> _function_4 = (ITreeAppendable it_2) -> {
          int count = 0;
          RunningDataInterchanges _datainterchanges = mock.getDatainterchanges();
          boolean _tripleNotEquals = (_datainterchanges != null);
          if (_tripleNotEquals) {
            count = mock.getDatainterchanges().getDatainterchanges().size();
          }
          StringConcatenation _builder_2 = new StringConcatenation();
          _builder_2.append("return ");
          _builder_2.append(count);
          _builder_2.append(";");
          _builder_2.newLineIfNotEmpty();
          it_2.append(_builder_2);
        };
        this._jvmTypesBuilder.setBody(it_1, _function_4);
      };
      JvmOperation _method_1 = this._jvmTypesBuilder.toMethod(mock, _builder_1.toString(), this._typeReferenceBuilder.typeRef(int.class), _function_3);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_2, _method_1);
      EList<JvmMember> _members_3 = it.getMembers();
      StringConcatenation _builder_2 = new StringConcatenation();
      _builder_2.append("getEntityMockSteps");
      final Procedure1<JvmOperation> _function_4 = (JvmOperation it_1) -> {
        EList<JvmAnnotationReference> _annotations_1 = it_1.getAnnotations();
        JvmAnnotationReference _annotationRef = this._annotationTypesBuilder.annotationRef(Override.class);
        this._jvmTypesBuilder.<JvmAnnotationReference>operator_add(_annotations_1, _annotationRef);
        final Procedure1<ITreeAppendable> _function_5 = (ITreeAppendable it_2) -> {
          int count = 0;
          EntityMockEntities _entities = mock.getEntities();
          boolean _tripleNotEquals = (_entities != null);
          if (_tripleNotEquals) {
            count = mock.getEntities().getEntities().size();
          }
          StringConcatenation _builder_3 = new StringConcatenation();
          _builder_3.append("return ");
          _builder_3.append(count);
          _builder_3.append(";");
          _builder_3.newLineIfNotEmpty();
          it_2.append(_builder_3);
        };
        this._jvmTypesBuilder.setBody(it_1, _function_5);
      };
      JvmOperation _method_2 = this._jvmTypesBuilder.toMethod(mock, _builder_2.toString(), this._typeReferenceBuilder.typeRef(int.class), _function_4);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_3, _method_2);
      EList<JvmMember> _members_4 = it.getMembers();
      StringConcatenation _builder_3 = new StringConcatenation();
      _builder_3.append("runDataInterchanges");
      final Procedure1<JvmOperation> _function_5 = (JvmOperation it_1) -> {
        EList<JvmFormalParameter> _parameters = it_1.getParameters();
        JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(mock, "persistenceService", this._typeReferenceBuilder.typeRef(IPersistenceService.class));
        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
        EList<JvmFormalParameter> _parameters_1 = it_1.getParameters();
        JvmFormalParameter _parameter_1 = this._jvmTypesBuilder.toParameter(mock, "dataInterchange", this._typeReferenceBuilder.typeRef(IDataInterchange.class));
        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_1, _parameter_1);
        EList<JvmFormalParameter> _parameters_2 = it_1.getParameters();
        JvmFormalParameter _parameter_2 = this._jvmTypesBuilder.toParameter(mock, "eventDispatcher", this._typeReferenceBuilder.typeRef(IEventDispatcher.class));
        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_2, _parameter_2);
        EList<JvmFormalParameter> _parameters_3 = it_1.getParameters();
        JvmFormalParameter _parameter_3 = this._jvmTypesBuilder.toParameter(mock, "blobService", this._typeReferenceBuilder.typeRef(IBlobService.class));
        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_3, _parameter_3);
        EList<JvmFormalParameter> _parameters_4 = it_1.getParameters();
        JvmFormalParameter _parameter_4 = this._jvmTypesBuilder.toParameter(mock, "entityMockDbFiller", this._typeReferenceBuilder.typeRef(IEntityMockDataDbFiller.class));
        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_4, _parameter_4);
        final Procedure1<ITreeAppendable> _function_6 = (ITreeAppendable it_2) -> {
          RunningDataInterchanges _datainterchanges = mock.getDatainterchanges();
          boolean _tripleNotEquals = (_datainterchanges != null);
          if (_tripleNotEquals) {
            EList<RunningDataInterchange> _datainterchanges_1 = mock.getDatainterchanges().getDatainterchanges();
            for (final RunningDataInterchange runDatainterchange : _datainterchanges_1) {
              StringConcatenation _builder_4 = new StringConcatenation();
              _builder_4.append("try {");
              _builder_4.newLine();
              _builder_4.append("\t");
              _builder_4.append("entityMockDbFiller.notifyInitializationStep(\"datainterchange ");
              String _name = runDatainterchange.getDatainterchangeRef().getName();
              _builder_4.append(_name, "\t");
              _builder_4.append("\", 1, 0.3);");
              _builder_4.newLineIfNotEmpty();
              _builder_4.append("\t");
              String _basicRunConfiguration = this._dataDSLJvmModelInferrer.getBasicRunConfiguration(runDatainterchange.getDatainterchangeRef(), true, runDatainterchange.getFileURL(), "import");
              _builder_4.append(_basicRunConfiguration, "\t");
              _builder_4.newLineIfNotEmpty();
              _builder_4.append("\t");
              _builder_4.append("entityMockDbFiller.notifyInitializationStep(\"datainterchange ");
              String _name_1 = runDatainterchange.getDatainterchangeRef().getName();
              _builder_4.append(_name_1, "\t");
              _builder_4.append("\", 0, 0.4);");
              _builder_4.newLineIfNotEmpty();
              _builder_4.append("\t");
              String _defaultVariableName = this._dataDSLJvmModelInferrer.getDefaultVariableName(runDatainterchange.getDatainterchangeRef());
              _builder_4.append(_defaultVariableName, "\t");
              _builder_4.append(".run(entityMockDbFiller);");
              _builder_4.newLineIfNotEmpty();
              _builder_4.append("\t");
              _builder_4.append("entityMockDbFiller.notifyInitializationStep(\"datainterchange ");
              String _name_2 = runDatainterchange.getDatainterchangeRef().getName();
              _builder_4.append(_name_2, "\t");
              _builder_4.append("\", 0, 0.9);");
              _builder_4.newLineIfNotEmpty();
              _builder_4.append("} ");
              _builder_4.newLine();
              _builder_4.append("catch (Exception e) {");
              _builder_4.newLine();
              _builder_4.append("\t");
              _builder_4.append("log.error(e.getLocalizedMessage()+e.getCause());");
              _builder_4.newLine();
              _builder_4.append("}");
              _builder_4.newLine();
              it_2.append(_builder_4);
            }
          }
        };
        this._jvmTypesBuilder.setBody(it_1, _function_6);
      };
      JvmOperation _method_3 = this._jvmTypesBuilder.toMethod(mock, _builder_3.toString(), this._typeReferenceBuilder.typeRef(Void.TYPE), _function_5);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_4, _method_3);
      EList<JvmMember> _members_5 = it.getMembers();
      StringConcatenation _builder_4 = new StringConcatenation();
      _builder_4.append("getMockData");
      final Procedure1<JvmOperation> _function_6 = (JvmOperation it_1) -> {
        EList<JvmFormalParameter> _parameters = it_1.getParameters();
        JvmFormalParameter _parameter = this._jvmTypesBuilder.toParameter(mock, "entityMockDbFiller", this._typeReferenceBuilder.typeRef(IEntityMockDataDbFiller.class));
        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
        EList<JvmFormalParameter> _parameters_1 = it_1.getParameters();
        JvmFormalParameter _parameter_1 = this._jvmTypesBuilder.toParameter(mock, "persistenceService", this._typeReferenceBuilder.typeRef(IPersistenceService.class));
        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_1, _parameter_1);
        EList<JvmFormalParameter> _parameters_2 = it_1.getParameters();
        JvmFormalParameter _parameter_2 = this._jvmTypesBuilder.toParameter(mock, "blobService", this._typeReferenceBuilder.typeRef(IBlobService.class));
        this._jvmTypesBuilder.<JvmFormalParameter>operator_add(_parameters_2, _parameter_2);
        final Procedure1<ITreeAppendable> _function_7 = (ITreeAppendable it_2) -> {
          StringConcatenation _builder_5 = new StringConcatenation();
          _builder_5.append("initialize();");
          _builder_5.newLine();
          it_2.append(_builder_5);
          ArrayList<EntityMockEntity> mockEntitiesDone = new ArrayList<EntityMockEntity>();
          ArrayList<EntityMockEntity> mockEntitiesToDo = new ArrayList<EntityMockEntity>();
          EntityMockEntities _entities = mock.getEntities();
          EList<EntityMockEntity> _entities_1 = null;
          if (_entities!=null) {
            _entities_1=_entities.getEntities();
          }
          mockEntitiesToDo.addAll(_entities_1);
          boolean breakTodo = false;
          while (((!mockEntitiesToDo.isEmpty()) && (!breakTodo))) {
            {
              int handled = 0;
              Object[] mockEntitesStepping = mockEntitiesToDo.toArray();
              for (final Object mockEntityO : mockEntitesStepping) {
                {
                  EntityMockEntity mockEntity = ((EntityMockEntity) mockEntityO);
                  boolean _canBeHandled = this.canBeHandled(mockEntity, mockEntitiesDone);
                  if (_canBeHandled) {
                    handled++;
                    IIterate _iterate = mockEntity.getIterate();
                    if ((_iterate instanceof IntegerIterate)) {
                      IIterate _iterate_1 = mockEntity.getIterate();
                      IntegerIterate iterate = ((IntegerIterate) _iterate_1);
                      StringConcatenation _builder_6 = new StringConcatenation();
                      _builder_6.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
                      String _entityMockName = this.entityMockName(mockEntity, mock);
                      _builder_6.append(_entityMockName);
                      _builder_6.append("\", 1, 0.3);");
                      _builder_6.newLineIfNotEmpty();
                      String _entityMockName_1 = this.entityMockName(mockEntity, mock);
                      _builder_6.append(_entityMockName_1);
                      _builder_6.append(" entity");
                      String _name = mockEntity.getName();
                      _builder_6.append(_name);
                      _builder_6.append(" = new ");
                      String _entityMockName_2 = this.entityMockName(mockEntity, mock);
                      _builder_6.append(_entityMockName_2);
                      _builder_6.append("(this);");
                      _builder_6.newLineIfNotEmpty();
                      _builder_6.append("Iterator<Integer> iterator");
                      String _name_1 = mockEntity.getName();
                      _builder_6.append(_name_1);
                      _builder_6.append(" = new IntegerIterator(");
                      int _from = iterate.getFrom();
                      _builder_6.append(_from);
                      _builder_6.append(", ");
                      int _until = iterate.getUntil();
                      _builder_6.append(_until);
                      _builder_6.append(", ");
                      int _step = iterate.getStep();
                      _builder_6.append(_step);
                      _builder_6.append(");");
                      _builder_6.newLineIfNotEmpty();
                      _builder_6.append("List list");
                      String _name_2 = mockEntity.getName();
                      _builder_6.append(_name_2);
                      _builder_6.append(" = new ArrayList<");
                      String _entityDtoFQN = this.entityDtoFQN(mockEntity);
                      _builder_6.append(_entityDtoFQN);
                      _builder_6.append(">();");
                      _builder_6.newLineIfNotEmpty();
                      _builder_6.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
                      String _entityMockName_3 = this.entityMockName(mockEntity, mock);
                      _builder_6.append(_entityMockName_3);
                      _builder_6.append("\", 0, 0.6);");
                      _builder_6.newLineIfNotEmpty();
                      _builder_6.append("persistenceService.registerPersistenceUnit(entity");
                      String _name_3 = mockEntity.getName();
                      _builder_6.append(_name_3);
                      _builder_6.append(".getPersistenceUnit(), ");
                      String _entityFQN = this.entityFQN(mockEntity);
                      _builder_6.append(_entityFQN);
                      _builder_6.append(".class);");
                      _builder_6.newLineIfNotEmpty();
                      _builder_6.append("while (iterator");
                      String _name_4 = mockEntity.getName();
                      _builder_6.append(_name_4);
                      _builder_6.append(".hasNext()) {");
                      _builder_6.newLineIfNotEmpty();
                      _builder_6.append("    ");
                      _builder_6.append("list");
                      String _name_5 = mockEntity.getName();
                      _builder_6.append(_name_5, "    ");
                      _builder_6.append(".add(entity");
                      String _name_6 = mockEntity.getName();
                      _builder_6.append(_name_6, "    ");
                      _builder_6.append(".generateEntity(iterator");
                      String _name_7 = mockEntity.getName();
                      _builder_6.append(_name_7, "    ");
                      _builder_6.append(".next()));");
                      _builder_6.newLineIfNotEmpty();
                      _builder_6.append("}");
                      _builder_6.newLine();
                      _builder_6.append("addMockObjects(\"");
                      String _name_8 = mockEntity.getName();
                      _builder_6.append(_name_8);
                      _builder_6.append("\", ");
                      String _entityDtoFQNClass = this.entityDtoFQNClass(mockEntity);
                      _builder_6.append(_entityDtoFQNClass);
                      _builder_6.append(", \"");
                      String _persistenceUnit = mockEntity.getEntityRef().getPersistenceUnit();
                      _builder_6.append(_persistenceUnit);
                      _builder_6.append("\", list");
                      String _name_9 = mockEntity.getName();
                      _builder_6.append(_name_9);
                      _builder_6.append(");");
                      _builder_6.newLineIfNotEmpty();
                      _builder_6.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
                      String _entityMockName_4 = this.entityMockName(mockEntity, mock);
                      _builder_6.append(_entityMockName_4);
                      _builder_6.append("\", 0, 0.9);");
                      _builder_6.newLineIfNotEmpty();
                      it_2.append(_builder_6);
                    }
                    IIterate _iterate_2 = mockEntity.getIterate();
                    if ((_iterate_2 instanceof DateIterate)) {
                      IIterate _iterate_3 = mockEntity.getIterate();
                      DateIterate iterate_1 = ((DateIterate) _iterate_3);
                      StringConcatenation _builder_7 = new StringConcatenation();
                      _builder_7.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
                      String _entityMockName_5 = this.entityMockName(mockEntity, mock);
                      _builder_7.append(_entityMockName_5);
                      _builder_7.append("\", 1, 0.3);");
                      _builder_7.newLineIfNotEmpty();
                      String _entityMockName_6 = this.entityMockName(mockEntity, mock);
                      _builder_7.append(_entityMockName_6);
                      _builder_7.append(" entity");
                      String _name_10 = mockEntity.getName();
                      _builder_7.append(_name_10);
                      _builder_7.append(" = new ");
                      String _entityMockName_7 = this.entityMockName(mockEntity, mock);
                      _builder_7.append(_entityMockName_7);
                      _builder_7.append("(this);");
                      _builder_7.newLineIfNotEmpty();
                      _builder_7.append("Iterator<Date> iterator");
                      String _name_11 = mockEntity.getName();
                      _builder_7.append(_name_11);
                      _builder_7.append(" = new DateIterator(");
                      String _asString = this.asString(iterate_1.getFrom());
                      _builder_7.append(_asString);
                      _builder_7.append(", ");
                      String _asString_1 = this.asString(iterate_1.getUntil());
                      _builder_7.append(_asString_1);
                      _builder_7.append(", ");
                      int _stepCount = iterate_1.getStepCount();
                      _builder_7.append(_stepCount);
                      _builder_7.append(", \"");
                      EDateStepType _stepType = iterate_1.getStepType();
                      _builder_7.append(_stepType);
                      _builder_7.append("\");");
                      _builder_7.newLineIfNotEmpty();
                      _builder_7.append("List list");
                      String _name_12 = mockEntity.getName();
                      _builder_7.append(_name_12);
                      _builder_7.append(" = new ArrayList<");
                      String _entityDtoFQN_1 = this.entityDtoFQN(mockEntity);
                      _builder_7.append(_entityDtoFQN_1);
                      _builder_7.append(">();");
                      _builder_7.newLineIfNotEmpty();
                      _builder_7.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
                      String _entityMockName_8 = this.entityMockName(mockEntity, mock);
                      _builder_7.append(_entityMockName_8);
                      _builder_7.append("\", 0, 0.6);");
                      _builder_7.newLineIfNotEmpty();
                      _builder_7.append("persistenceService.registerPersistenceUnit(entity");
                      String _name_13 = mockEntity.getName();
                      _builder_7.append(_name_13);
                      _builder_7.append(".getPersistenceUnit(), ");
                      String _entityFQN_1 = this.entityFQN(mockEntity);
                      _builder_7.append(_entityFQN_1);
                      _builder_7.append(".class);");
                      _builder_7.newLineIfNotEmpty();
                      _builder_7.append("while (iterator");
                      String _name_14 = mockEntity.getName();
                      _builder_7.append(_name_14);
                      _builder_7.append(".hasNext()) {");
                      _builder_7.newLineIfNotEmpty();
                      _builder_7.append("    ");
                      _builder_7.append("list");
                      String _name_15 = mockEntity.getName();
                      _builder_7.append(_name_15, "    ");
                      _builder_7.append(".add(entity");
                      String _name_16 = mockEntity.getName();
                      _builder_7.append(_name_16, "    ");
                      _builder_7.append(".generateEntity(iterator");
                      String _name_17 = mockEntity.getName();
                      _builder_7.append(_name_17, "    ");
                      _builder_7.append(".next()));");
                      _builder_7.newLineIfNotEmpty();
                      _builder_7.append("}");
                      _builder_7.newLine();
                      _builder_7.append("addMockObjects(\"");
                      String _name_18 = mockEntity.getName();
                      _builder_7.append(_name_18);
                      _builder_7.append("\", ");
                      String _entityDtoFQNClass_1 = this.entityDtoFQNClass(mockEntity);
                      _builder_7.append(_entityDtoFQNClass_1);
                      _builder_7.append(", \"");
                      String _persistenceUnit_1 = mockEntity.getEntityRef().getPersistenceUnit();
                      _builder_7.append(_persistenceUnit_1);
                      _builder_7.append("\", list");
                      String _name_19 = mockEntity.getName();
                      _builder_7.append(_name_19);
                      _builder_7.append(");");
                      _builder_7.newLineIfNotEmpty();
                      _builder_7.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
                      String _entityMockName_9 = this.entityMockName(mockEntity, mock);
                      _builder_7.append(_entityMockName_9);
                      _builder_7.append("\", 0, 0.9);");
                      _builder_7.newLineIfNotEmpty();
                      it_2.append(_builder_7);
                    } else {
                      EntityMockResource _byResource = mockEntity.getByResource();
                      boolean _tripleNotEquals = (_byResource != null);
                      if (_tripleNotEquals) {
                        StringConcatenation _builder_8 = new StringConcatenation();
                        _builder_8.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
                        String _entityMockName_10 = this.entityMockName(mockEntity, mock);
                        _builder_8.append(_entityMockName_10);
                        _builder_8.append("\", 1, 0.3);");
                        _builder_8.newLineIfNotEmpty();
                        String _entityMockName_11 = this.entityMockName(mockEntity, mock);
                        _builder_8.append(_entityMockName_11);
                        _builder_8.append(" entity");
                        String _name_20 = mockEntity.getName();
                        _builder_8.append(_name_20);
                        _builder_8.append(" = new ");
                        String _entityMockName_12 = this.entityMockName(mockEntity, mock);
                        _builder_8.append(_entityMockName_12);
                        _builder_8.append("(this);");
                        _builder_8.newLineIfNotEmpty();
                        _builder_8.append("List list");
                        String _name_21 = mockEntity.getName();
                        _builder_8.append(_name_21);
                        _builder_8.append(" = new ArrayList<");
                        String _entityDtoFQN_2 = this.entityDtoFQN(mockEntity);
                        _builder_8.append(_entityDtoFQN_2);
                        _builder_8.append(">();");
                        _builder_8.newLineIfNotEmpty();
                        _builder_8.append("Iterator iterator");
                        String _name_22 = mockEntity.getName();
                        _builder_8.append(_name_22);
                        _builder_8.append(" = entity");
                        String _name_23 = mockEntity.getName();
                        _builder_8.append(_name_23);
                        _builder_8.append(".getDataRows().iterator();");
                        _builder_8.newLineIfNotEmpty();
                        _builder_8.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
                        String _entityMockName_13 = this.entityMockName(mockEntity, mock);
                        _builder_8.append(_entityMockName_13);
                        _builder_8.append("\", 0, 0.6);");
                        _builder_8.newLineIfNotEmpty();
                        _builder_8.append("persistenceService.registerPersistenceUnit(entity");
                        String _name_24 = mockEntity.getName();
                        _builder_8.append(_name_24);
                        _builder_8.append(".getPersistenceUnit(), ");
                        String _entityFQN_2 = this.entityFQN(mockEntity);
                        _builder_8.append(_entityFQN_2);
                        _builder_8.append(".class);");
                        _builder_8.newLineIfNotEmpty();
                        _builder_8.append("while (iterator");
                        String _name_25 = mockEntity.getName();
                        _builder_8.append(_name_25);
                        _builder_8.append(".hasNext()) {");
                        _builder_8.newLineIfNotEmpty();
                        _builder_8.append("    ");
                        _builder_8.append("list");
                        String _name_26 = mockEntity.getName();
                        _builder_8.append(_name_26, "    ");
                        _builder_8.append(".add(entity");
                        String _name_27 = mockEntity.getName();
                        _builder_8.append(_name_27, "    ");
                        _builder_8.append(".generateEntity(iterator");
                        String _name_28 = mockEntity.getName();
                        _builder_8.append(_name_28, "    ");
                        _builder_8.append(".next()));");
                        _builder_8.newLineIfNotEmpty();
                        _builder_8.append("}");
                        _builder_8.newLine();
                        _builder_8.append("addMockObjects(\"");
                        String _name_29 = mockEntity.getName();
                        _builder_8.append(_name_29);
                        _builder_8.append("\", ");
                        String _entityDtoFQNClass_2 = this.entityDtoFQNClass(mockEntity);
                        _builder_8.append(_entityDtoFQNClass_2);
                        _builder_8.append(", \"");
                        String _persistenceUnit_2 = mockEntity.getEntityRef().getPersistenceUnit();
                        _builder_8.append(_persistenceUnit_2);
                        _builder_8.append("\", list");
                        String _name_30 = mockEntity.getName();
                        _builder_8.append(_name_30);
                        _builder_8.append(");");
                        _builder_8.newLineIfNotEmpty();
                        _builder_8.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
                        String _entityMockName_14 = this.entityMockName(mockEntity, mock);
                        _builder_8.append(_entityMockName_14);
                        _builder_8.append("\", 0, 0.9);");
                        _builder_8.newLineIfNotEmpty();
                        it_2.append(_builder_8);
                        boolean _isCreateBlobMapping = mockEntity.isCreateBlobMapping();
                        if (_isCreateBlobMapping) {
                          StringConcatenation _builder_9 = new StringConcatenation();
                          _builder_9.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
                          String _entityMockName_15 = this.entityMockName(mockEntity, mock);
                          _builder_9.append(_entityMockName_15);
                          _builder_9.append("Blobs\", 0, 0.93);");
                          _builder_9.newLineIfNotEmpty();
                          _builder_9.append("List list");
                          String _name_31 = mockEntity.getName();
                          _builder_9.append(_name_31);
                          _builder_9.append("Blobs = new ArrayList<org.eclipse.osbp.blob.dtos.BlobDto>();");
                          _builder_9.newLineIfNotEmpty();
                          _builder_9.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
                          String _entityMockName_16 = this.entityMockName(mockEntity, mock);
                          _builder_9.append(_entityMockName_16);
                          _builder_9.append("Blobs\", 0, 0.96);");
                          _builder_9.newLineIfNotEmpty();
                          _builder_9.append("for (Object list");
                          String _name_32 = mockEntity.getName();
                          _builder_9.append(_name_32);
                          _builder_9.append("Object : list");
                          String _name_33 = mockEntity.getName();
                          _builder_9.append(_name_33);
                          _builder_9.append(") {");
                          _builder_9.newLineIfNotEmpty();
                          _builder_9.append("    ");
                          _builder_9.append("if  (list");
                          String _name_34 = mockEntity.getName();
                          _builder_9.append(_name_34, "    ");
                          _builder_9.append("Object instanceof org.eclipse.osbp.blob.dtos.BlobMappingDto) {");
                          _builder_9.newLineIfNotEmpty();
                          _builder_9.append("        ");
                          _builder_9.append("org.eclipse.osbp.blob.dtos.BlobMappingDto blobMappingDto = (org.eclipse.osbp.blob.dtos.BlobMappingDto)list");
                          String _name_35 = mockEntity.getName();
                          _builder_9.append(_name_35, "        ");
                          _builder_9.append("Object;");
                          _builder_9.newLineIfNotEmpty();
                          _builder_9.append("        ");
                          _builder_9.append("try {");
                          _builder_9.newLine();
                          _builder_9.append("            ");
                          _builder_9.append("InputStream inputStream = new BufferedInputStream(this.getClass().getClassLoader().getResourceAsStream(\"/resources/entitymock/\"+blobMappingDto.getFileName()));");
                          _builder_9.newLine();
                          _builder_9.append("            ");
                          _builder_9.append("if  (inputStream != null) {");
                          _builder_9.newLine();
                          _builder_9.append("                ");
                          _builder_9.append("List<Object> blobs = blobService.createBlobMappingBlobs(inputStream, blobMappingDto.getMimeTypeId());");
                          _builder_9.newLine();
                          _builder_9.append("                ");
                          _builder_9.append("for(Object obj:blobs) {");
                          _builder_9.newLine();
                          _builder_9.append("\t                ");
                          _builder_9.append("blobMappingDto.addToBlobsRef((org.eclipse.osbp.blob.dtos.BlobDto)obj);");
                          _builder_9.newLine();
                          _builder_9.append("                    ");
                          _builder_9.append("list");
                          String _name_36 = mockEntity.getName();
                          _builder_9.append(_name_36, "                    ");
                          _builder_9.append("Blobs.add((org.eclipse.osbp.blob.dtos.BlobDto)obj);");
                          _builder_9.newLineIfNotEmpty();
                          _builder_9.append("                ");
                          _builder_9.append("}");
                          _builder_9.newLine();
                          _builder_9.append("            ");
                          _builder_9.append("}");
                          _builder_9.newLine();
                          _builder_9.append("        ");
                          _builder_9.append("}");
                          _builder_9.newLine();
                          _builder_9.append("        ");
                          _builder_9.append("catch (Exception e) {");
                          _builder_9.newLine();
                          _builder_9.append("            ");
                          _builder_9.append("log.error(e.getLocalizedMessage()+e.getCause());");
                          _builder_9.newLine();
                          _builder_9.append("        ");
                          _builder_9.append("}");
                          _builder_9.newLine();
                          _builder_9.append("    ");
                          _builder_9.append("}");
                          _builder_9.newLine();
                          _builder_9.append("}");
                          _builder_9.newLine();
                          _builder_9.append("addMockObjects(\"");
                          String _name_37 = mockEntity.getName();
                          _builder_9.append(_name_37);
                          _builder_9.append("Blobs\", org.eclipse.osbp.blob.dtos.BlobDto.class, \"blob\", list");
                          String _name_38 = mockEntity.getName();
                          _builder_9.append(_name_38);
                          _builder_9.append("Blobs);");
                          _builder_9.newLineIfNotEmpty();
                          _builder_9.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
                          String _entityMockName_17 = this.entityMockName(mockEntity, mock);
                          _builder_9.append(_entityMockName_17);
                          _builder_9.append("Blobs\", 0, 0.99);");
                          _builder_9.newLineIfNotEmpty();
                          it_2.append(_builder_9);
                        }
                      } else {
                        StringConcatenation _builder_10 = new StringConcatenation();
                        _builder_10.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
                        String _entityMockName_18 = this.entityMockName(mockEntity, mock);
                        _builder_10.append(_entityMockName_18);
                        _builder_10.append("\", 1, 0.3);");
                        _builder_10.newLineIfNotEmpty();
                        String _entityMockName_19 = this.entityMockName(mockEntity, mock);
                        _builder_10.append(_entityMockName_19);
                        _builder_10.append(" entity");
                        String _name_39 = mockEntity.getName();
                        _builder_10.append(_name_39);
                        _builder_10.append(" = new ");
                        String _entityMockName_20 = this.entityMockName(mockEntity, mock);
                        _builder_10.append(_entityMockName_20);
                        _builder_10.append("(this);");
                        _builder_10.newLineIfNotEmpty();
                        _builder_10.append("Iterator<Integer> iterator");
                        String _name_40 = mockEntity.getName();
                        _builder_10.append(_name_40);
                        _builder_10.append(" = new IntegerIterator(1, getFillerProvider().signedinteger(");
                        int _minRows = mockEntity.getMinRows();
                        _builder_10.append(_minRows);
                        _builder_10.append(", ");
                        int _maxRows = mockEntity.getMaxRows();
                        _builder_10.append(_maxRows);
                        _builder_10.append("));");
                        _builder_10.newLineIfNotEmpty();
                        _builder_10.append("List list");
                        String _name_41 = mockEntity.getName();
                        _builder_10.append(_name_41);
                        _builder_10.append(" = new ArrayList<");
                        String _entityDtoFQN_3 = this.entityDtoFQN(mockEntity);
                        _builder_10.append(_entityDtoFQN_3);
                        _builder_10.append(">();");
                        _builder_10.newLineIfNotEmpty();
                        _builder_10.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
                        String _entityMockName_21 = this.entityMockName(mockEntity, mock);
                        _builder_10.append(_entityMockName_21);
                        _builder_10.append("\", 0, 0.6);");
                        _builder_10.newLineIfNotEmpty();
                        _builder_10.append("persistenceService.registerPersistenceUnit(entity");
                        String _name_42 = mockEntity.getName();
                        _builder_10.append(_name_42);
                        _builder_10.append(".getPersistenceUnit(), ");
                        String _entityFQN_3 = this.entityFQN(mockEntity);
                        _builder_10.append(_entityFQN_3);
                        _builder_10.append(".class);");
                        _builder_10.newLineIfNotEmpty();
                        _builder_10.append("while (iterator");
                        String _name_43 = mockEntity.getName();
                        _builder_10.append(_name_43);
                        _builder_10.append(".hasNext()) {");
                        _builder_10.newLineIfNotEmpty();
                        _builder_10.append("    ");
                        _builder_10.append("list");
                        String _name_44 = mockEntity.getName();
                        _builder_10.append(_name_44, "    ");
                        _builder_10.append(".add(entity");
                        String _name_45 = mockEntity.getName();
                        _builder_10.append(_name_45, "    ");
                        _builder_10.append(".generateEntity(iterator");
                        String _name_46 = mockEntity.getName();
                        _builder_10.append(_name_46, "    ");
                        _builder_10.append(".next()));");
                        _builder_10.newLineIfNotEmpty();
                        _builder_10.append("}");
                        _builder_10.newLine();
                        _builder_10.append("addMockObjects(\"");
                        String _name_47 = mockEntity.getName();
                        _builder_10.append(_name_47);
                        _builder_10.append("\", ");
                        String _entityDtoFQNClass_3 = this.entityDtoFQNClass(mockEntity);
                        _builder_10.append(_entityDtoFQNClass_3);
                        _builder_10.append(", \"");
                        String _persistenceUnit_3 = mockEntity.getEntityRef().getPersistenceUnit();
                        _builder_10.append(_persistenceUnit_3);
                        _builder_10.append("\", list");
                        String _name_48 = mockEntity.getName();
                        _builder_10.append(_name_48);
                        _builder_10.append(");");
                        _builder_10.newLineIfNotEmpty();
                        _builder_10.append("entityMockDbFiller.notifyInitializationStep(\"generate ");
                        String _entityMockName_22 = this.entityMockName(mockEntity, mock);
                        _builder_10.append(_entityMockName_22);
                        _builder_10.append("\", 0, 0.9);");
                        _builder_10.newLineIfNotEmpty();
                        it_2.append(_builder_10);
                      }
                    }
                    mockEntitiesDone.add(((EntityMockEntity) mockEntity));
                    mockEntitiesToDo.remove(mockEntity);
                  }
                }
              }
              breakTodo = (handled == 0);
            }
          }
          StringConcatenation _builder_6 = new StringConcatenation();
          _builder_6.append("return mockDataClassMap;");
          it_2.append(_builder_6);
        };
        this._jvmTypesBuilder.setBody(it_1, _function_7);
      };
      JvmOperation _method_4 = this._jvmTypesBuilder.toMethod(mock, _builder_4.toString(), this._typeReferenceBuilder.typeRef(Map.class), _function_6);
      this._jvmTypesBuilder.<JvmOperation>operator_add(_members_5, _method_4);
    };
    acceptor.<JvmGenericType>accept(mockClass, _function);
  }
  
  /**
   * checks if the mockEntityTodo can be handled, considering all requested references to other mock entities,
   * which may already been mocked
   */
  public boolean canBeHandled(final EntityMockEntity mockEntityTodo, final ArrayList<EntityMockEntity> mockEntitiesDone) {
    EntityMockResource _byResource = mockEntityTodo.getByResource();
    boolean _tripleNotEquals = (_byResource != null);
    if (_tripleNotEquals) {
      return true;
    }
    EList<IEntityMockAttribute> _attributes = mockEntityTodo.getAttributes();
    for (final IEntityMockAttribute attribute : _attributes) {
      if ((attribute instanceof EntityMockAttributeByReference)) {
        EntityMockEntity referencedMockEntity = ((EntityMockAttributeByReference) attribute).getMockedEntity();
        if (((referencedMockEntity != null) && (!mockEntitiesDone.contains(referencedMockEntity)))) {
          return false;
        }
      }
    }
    return true;
  }
  
  /**
   * generate a mock object class
   */
  public void generateMockResource(final EntityMock model, final IJvmDeclaredTypeAcceptor acceptor, final EntityMockResource mockResource) {
    JvmGenericType mockClass = this._jvmTypesBuilder.toClass(model, this.entityMockName(mockResource, model));
    final Procedure1<JvmGenericType> _function = (JvmGenericType it) -> {
      this._jvmTypesBuilder.setFileHeader(it, this._jvmTypesBuilder.getDocumentation(model));
      EList<JvmTypeReference> _superTypes = it.getSuperTypes();
      JvmTypeReference _typeRef = this._typeReferenceBuilder.typeRef(ABaseMockResource.class);
      this._jvmTypesBuilder.<JvmTypeReference>operator_add(_superTypes, _typeRef);
      JvmField field = null;
      final Procedure1<JvmField> _function_1 = (JvmField it_1) -> {
        final Procedure1<ITreeAppendable> _function_2 = (ITreeAppendable it_2) -> {
          StringConcatenation _builder = new StringConcatenation();
          _builder.append("LoggerFactory.getLogger(\"mock\")");
          it_2.append(_builder);
        };
        this._jvmTypesBuilder.setInitializer(it_1, _function_2);
      };
      field = this._jvmTypesBuilder.toField(model, "log", this._typeReferenceBuilder.typeRef(Logger.class), _function_1);
      field.setFinal(true);
      field.setStatic(true);
      EList<JvmMember> _members = it.getMembers();
      this._jvmTypesBuilder.<JvmField>operator_add(_members, field);
      EList<JvmMember> _members_1 = it.getMembers();
      final Procedure1<JvmConstructor> _function_2 = (JvmConstructor it_1) -> {
        final Procedure1<ITreeAppendable> _function_3 = (ITreeAppendable it_2) -> {
          final List<String> attributes = new ArrayList<String>();
          EList<EntityMockResourceAttribute> _attributes = mockResource.getAttributes();
          for (final EntityMockResourceAttribute attribute : _attributes) {
            StringConcatenation _builder = new StringConcatenation();
            _builder.append("\"");
            String _name = attribute.getName();
            _builder.append(_name);
            _builder.append("\"");
            attributes.add(_builder.toString());
          }
          StringConcatenation _builder_1 = new StringConcatenation();
          _builder_1.append("setAttributes(");
          String _join = StringUtils.join(attributes, ",");
          _builder_1.append(_join);
          _builder_1.append(");");
          _builder_1.newLineIfNotEmpty();
          it_2.append(_builder_1);
          EList<EntityMockResourceDataRow> _datarows = mockResource.getDatarows();
          for (final EntityMockResourceDataRow datarow : _datarows) {
            {
              final List<String> values = new ArrayList<String>();
              StringConcatenation _builder_2 = new StringConcatenation();
              _builder_2.append("\"");
              String _name_1 = datarow.getName();
              _builder_2.append(_name_1);
              _builder_2.append("\"");
              values.add(_builder_2.toString());
              EList<String> _values = datarow.getValues();
              for (final String value : _values) {
                StringConcatenation _builder_3 = new StringConcatenation();
                _builder_3.append("\"");
                _builder_3.append(value);
                _builder_3.append("\"");
                values.add(_builder_3.toString());
              }
              StringConcatenation _builder_4 = new StringConcatenation();
              _builder_4.append("addDataRow(");
              String _join_1 = StringUtils.join(values, ",");
              _builder_4.append(_join_1);
              _builder_4.append(");");
              _builder_4.newLineIfNotEmpty();
              it_2.append(_builder_4);
            }
          }
        };
        this._jvmTypesBuilder.setBody(it_1, _function_3);
      };
      JvmConstructor _constructor = this._jvmTypesBuilder.toConstructor(model, _function_2);
      this._jvmTypesBuilder.<JvmConstructor>operator_add(_members_1, _constructor);
    };
    acceptor.<JvmGenericType>accept(mockClass, _function);
  }
  
  public void infer(final EObject mock, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPreIndexingPhase) {
    if (mock instanceof EntityMock) {
      _infer((EntityMock)mock, acceptor, isPreIndexingPhase);
      return;
    } else if (mock != null) {
      _infer(mock, acceptor, isPreIndexingPhase);
      return;
    } else {
      throw new IllegalArgumentException("Unhandled parameter types: " +
        Arrays.<Object>asList(mock, acceptor, isPreIndexingPhase).toString());
    }
  }
}
