blob: 083e4c10394cd02b33390cb94b6800d00768c874 [file] [log] [blame]
/**
* Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), 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 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Florian Pirchner - Initial implementation
*/
package org.eclipse.osbp.dsl.dto.xtext.jvmmodel;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.osbp.dsl.common.datatypes.IDto;
import org.eclipse.osbp.dsl.common.datatypes.IDtoHistorized;
import org.eclipse.osbp.dsl.dto.lib.IMapper;
import org.eclipse.osbp.dsl.dto.lib.IMapperAccess;
import org.eclipse.osbp.dsl.dto.xtext.extensions.AnnotationExtension;
import org.eclipse.osbp.dsl.dto.xtext.extensions.DtoModelExtensions;
import org.eclipse.osbp.dsl.dto.xtext.extensions.DtoTypesBuilder;
import org.eclipse.osbp.dsl.dto.xtext.extensions.MethodNamingExtensions;
import org.eclipse.osbp.dsl.dto.xtext.jvmmodel.AnnotationCompiler;
import org.eclipse.osbp.dsl.semantic.common.types.LAttribute;
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.LOperation;
import org.eclipse.osbp.dsl.semantic.common.types.LReference;
import org.eclipse.osbp.dsl.semantic.common.types.LType;
import org.eclipse.osbp.dsl.semantic.common.types.LTypedPackage;
import org.eclipse.osbp.dsl.semantic.dto.LDto;
import org.eclipse.osbp.dsl.semantic.dto.LDtoAbstractAttribute;
import org.eclipse.osbp.dsl.semantic.dto.LDtoAbstractReference;
import org.eclipse.osbp.dsl.semantic.dto.LDtoFeature;
import org.eclipse.osbp.dsl.semantic.dto.LDtoMapper;
import org.eclipse.osbp.dsl.semantic.dto.LDtoOperation;
import org.eclipse.osbp.xtext.oxtype.logger.TimeLogger;
import org.eclipse.osbp.xtext.oxtype.resource.ExtendedModelInferrer;
import org.eclipse.xtend2.lib.StringConcatenation;
import org.eclipse.xtend2.lib.StringConcatenationClient;
import org.eclipse.xtext.common.types.JvmConstructor;
import org.eclipse.xtext.common.types.JvmDeclaredType;
import org.eclipse.xtext.common.types.JvmEnumerationLiteral;
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.JvmParameterizedTypeReference;
import org.eclipse.xtext.common.types.JvmType;
import org.eclipse.xtext.common.types.JvmTypeConstraint;
import org.eclipse.xtext.common.types.JvmTypeParameter;
import org.eclipse.xtext.common.types.JvmTypeReference;
import org.eclipse.xtext.common.types.JvmUpperBound;
import org.eclipse.xtext.common.types.TypesFactory;
import org.eclipse.xtext.common.types.util.TypeReferences;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.xbase.XExpression;
import org.eclipse.xtext.xbase.jvmmodel.IJvmDeclaredTypeAcceptor;
import org.eclipse.xtext.xbase.lib.Extension;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* <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("all")
public class DtoGrammarJvmModelInferrer extends ExtendedModelInferrer {
protected final Logger log = LoggerFactory.getLogger(this.getClass());
@Inject
private AnnotationCompiler annotationCompiler;
@Inject
@Extension
private IQualifiedNameProvider _iQualifiedNameProvider;
@Inject
@Extension
private DtoTypesBuilder _dtoTypesBuilder;
@Inject
@Extension
private MethodNamingExtensions _methodNamingExtensions;
@Inject
@Extension
private DtoModelExtensions _dtoModelExtensions;
@Inject
private TypeReferences references;
@Inject
private AnnotationExtension annExt;
protected void _inferFullState(final JvmType type, final EObject element, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPrelinkingPhase, final String selector) {
}
protected void _infer(final LDto dto, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPrelinkingPhase) {
final JvmGenericType type = this._dtoTypesBuilder.toJvmType(dto);
this.inferDtoFullState(type, dto, acceptor, isPrelinkingPhase);
LType _wrappedType = dto.getWrappedType();
boolean _tripleNotEquals = (_wrappedType != null);
if (_tripleNotEquals) {
final JvmGenericType mapperType = this._dtoTypesBuilder.toMapperJvmType(dto);
this.inferMapperFullState(mapperType, dto, acceptor, isPrelinkingPhase);
}
}
protected void _inferTypesOnly(final LDto dto, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPrelinkingPhase) {
final JvmGenericType type = this._dtoTypesBuilder.toJvmType(dto);
acceptor.<JvmGenericType>accept(type);
LType _wrappedType = dto.getWrappedType();
boolean _tripleNotEquals = (_wrappedType != null);
if (_tripleNotEquals) {
final JvmGenericType mapperType = this._dtoTypesBuilder.toMapperJvmType(dto);
acceptor.<JvmGenericType>accept(mapperType);
}
this.inferTypesOnlyByDelegates(dto, acceptor, isPrelinkingPhase);
}
protected void _inferFullState(final JvmGenericType type, final LDto dto, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPrelinkingPhase, final String selector) {
boolean _equals = selector.equals("Mapper");
if (_equals) {
this.inferMapperFullState(type, dto, acceptor, isPrelinkingPhase);
} else {
this.inferDtoFullState(type, dto, acceptor, isPrelinkingPhase);
}
}
public void inferDtoFullState(final JvmDeclaredType type, final LDto dto, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPrelinkingPhase) {
final Procedure1<JvmDeclaredType> _function = (JvmDeclaredType it) -> {
final TimeLogger doInferLog = TimeLogger.start(it.getClass());
it.setAbstract(dto.isAbstract());
this.annotationCompiler.processAnnotation(dto, it);
LAttribute idAttribute = null;
JvmField idField = null;
JvmField versionField = null;
EObject _eContainer = dto.eContainer();
this._dtoTypesBuilder.setFileHeader(it, this._dtoTypesBuilder.getDocumentation(((LTypedPackage) _eContainer)));
this._dtoTypesBuilder.setDocumentation(it, this._dtoTypesBuilder.getDocumentation(dto));
if (((dto.getSuperType() != null) && (!this._iQualifiedNameProvider.getFullyQualifiedName(dto.getSuperType()).toString().isEmpty()))) {
EList<JvmTypeReference> _superTypes = it.getSuperTypes();
JvmTypeReference _typeReference = this._dtoModelExtensions.toTypeReference(dto.getSuperType());
this._dtoTypesBuilder.<JvmTypeReference>operator_add(_superTypes, _typeReference);
}
boolean _isHistorizedOrTimedependent = dto.isHistorizedOrTimedependent();
if (_isHistorizedOrTimedependent) {
EList<JvmTypeReference> _superTypes_1 = it.getSuperTypes();
JvmTypeReference _typeForName = this.references.getTypeForName(IDtoHistorized.class, dto, null);
this._dtoTypesBuilder.<JvmTypeReference>operator_add(_superTypes_1, _typeForName);
} else {
EList<JvmTypeReference> _superTypes_2 = it.getSuperTypes();
JvmTypeReference _typeForName_1 = this.references.getTypeForName(IDto.class, dto, null);
this._dtoTypesBuilder.<JvmTypeReference>operator_add(_superTypes_2, _typeForName_1);
}
EList<JvmTypeReference> _superTypes_3 = it.getSuperTypes();
JvmTypeReference _typeForName_2 = this.references.getTypeForName(Serializable.class, dto, null);
this._dtoTypesBuilder.<JvmTypeReference>operator_add(_superTypes_3, _typeForName_2);
EList<JvmTypeReference> _superTypes_4 = it.getSuperTypes();
JvmTypeReference _typeForName_3 = this.references.getTypeForName(PropertyChangeListener.class, dto, null);
this._dtoTypesBuilder.<JvmTypeReference>operator_add(_superTypes_4, _typeForName_3);
LDto _superType = dto.getSuperType();
boolean _tripleEquals = (_superType == null);
if (_tripleEquals) {
EList<JvmMember> _members = it.getMembers();
JvmField _propertyChangeSupportField = this._dtoTypesBuilder.toPropertyChangeSupportField(dto);
this._dtoTypesBuilder.<JvmField>operator_add(_members, _propertyChangeSupportField);
EList<JvmMember> _members_1 = it.getMembers();
JvmField _diposeField = this._dtoTypesBuilder.toDiposeField(dto);
this._dtoTypesBuilder.<JvmField>operator_add(_members_1, _diposeField);
EList<JvmMember> _members_2 = it.getMembers();
JvmField _dirtyField = this._dtoTypesBuilder.toDirtyField(dto);
this._dtoTypesBuilder.<JvmField>operator_add(_members_2, _dirtyField);
}
EList<LDtoFeature> _features = dto.getFeatures();
for (final LDtoFeature f : _features) {
boolean _matched = false;
if (f instanceof LAttribute) {
_matched=true;
if ((((!((LAttribute)f).isDerived()) && (this._iQualifiedNameProvider.getFullyQualifiedName(f) != null)) && (!this._iQualifiedNameProvider.getFullyQualifiedName(f).toString().isEmpty()))) {
boolean _isIDorUUID = this._dtoModelExtensions.isIDorUUID(((LAttribute)f));
if (_isIDorUUID) {
idAttribute = ((LAttribute)f);
idField = this._dtoTypesBuilder.toField(f);
EList<JvmMember> _members_3 = it.getMembers();
this._dtoTypesBuilder.<JvmField>operator_add(_members_3, idField);
} else {
boolean _isVersionAttr = ((LDtoAbstractAttribute) f).isVersionAttr();
if (_isVersionAttr) {
versionField = this._dtoTypesBuilder.toField(f);
EList<JvmMember> _members_4 = it.getMembers();
this._dtoTypesBuilder.<JvmField>operator_add(_members_4, versionField);
} else {
EList<JvmMember> _members_5 = it.getMembers();
JvmField _field = this._dtoTypesBuilder.toField(f);
this._dtoTypesBuilder.<JvmField>operator_add(_members_5, _field);
}
}
}
}
if (!_matched) {
if (f instanceof LReference) {
_matched=true;
if (((this._iQualifiedNameProvider.getFullyQualifiedName(f) != null) && (!this._iQualifiedNameProvider.getFullyQualifiedName(f).toString().isEmpty()))) {
EList<JvmMember> _members_3 = it.getMembers();
JvmField _field = this._dtoTypesBuilder.toField(f);
this._dtoTypesBuilder.<JvmField>operator_add(_members_3, _field);
}
}
}
}
EList<JvmMember> _members_3 = it.getMembers();
final Procedure1<JvmConstructor> _function_1 = (JvmConstructor it_1) -> {
StringConcatenationClient _client = new StringConcatenationClient() {
@Override
protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
_builder.append("installLazyCollections();");
}
};
this._dtoTypesBuilder.setBody(it_1, _client);
};
JvmConstructor _constructor = this._dtoTypesBuilder.toConstructor(dto, _function_1);
this._dtoTypesBuilder.<JvmConstructor>operator_add(_members_3, _constructor);
EList<JvmMember> _members_4 = it.getMembers();
JvmOperation _installLazyCollections = this._dtoTypesBuilder.toInstallLazyCollections(dto);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_4, _installLazyCollections);
LDto _superType_1 = dto.getSuperType();
boolean _tripleEquals_1 = (_superType_1 == null);
if (_tripleEquals_1) {
EList<JvmMember> _members_5 = it.getMembers();
JvmOperation _isDisposed = this._dtoTypesBuilder.toIsDisposed(dto);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_5, _isDisposed);
EList<JvmMember> _members_6 = it.getMembers();
JvmOperation _addPropertyChangeListener = this._dtoTypesBuilder.toAddPropertyChangeListener(dto);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_6, _addPropertyChangeListener);
EList<JvmMember> _members_7 = it.getMembers();
JvmOperation _addPropertyChangeListenerWithProperty = this._dtoTypesBuilder.toAddPropertyChangeListenerWithProperty(dto);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_7, _addPropertyChangeListenerWithProperty);
EList<JvmMember> _members_8 = it.getMembers();
JvmOperation _removePropertyChangeListener = this._dtoTypesBuilder.toRemovePropertyChangeListener(dto);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_8, _removePropertyChangeListener);
EList<JvmMember> _members_9 = it.getMembers();
JvmOperation _removePropertyChangeListenerWithProperty = this._dtoTypesBuilder.toRemovePropertyChangeListenerWithProperty(dto);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_9, _removePropertyChangeListenerWithProperty);
EList<JvmMember> _members_10 = it.getMembers();
JvmOperation _firePropertyChange = this._dtoTypesBuilder.toFirePropertyChange(dto, (versionField != null));
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_10, _firePropertyChange);
EList<JvmMember> _members_11 = it.getMembers();
JvmOperation _isDirty = this._dtoTypesBuilder.toIsDirty(dto);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_11, _isDirty);
EList<JvmMember> _members_12 = it.getMembers();
JvmOperation _setDirty = this._dtoTypesBuilder.toSetDirty(dto);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_12, _setDirty);
}
EList<JvmMember> _members_13 = it.getMembers();
JvmOperation _checkDisposed = this._dtoTypesBuilder.toCheckDisposed(dto);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_13, _checkDisposed);
EList<JvmMember> _members_14 = it.getMembers();
JvmOperation _dispose = this._dtoTypesBuilder.toDispose(dto);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_14, _dispose);
EList<LDtoFeature> _features_1 = dto.getFeatures();
for (final LDtoFeature f_1 : _features_1) {
boolean _matched_1 = false;
if (f_1 instanceof LAttribute) {
_matched_1=true;
EList<JvmMember> _members_15 = it.getMembers();
JvmOperation _getter = this._dtoTypesBuilder.toGetter(f_1);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_15, _getter);
boolean _isDerived = ((LAttribute)f_1).isDerived();
boolean _not = (!_isDerived);
if (_not) {
boolean _isToMany = this._dtoModelExtensions.isToMany(f_1);
if (_isToMany) {
EList<JvmMember> _members_16 = it.getMembers();
JvmOperation _internalCollectionGetter = this._dtoTypesBuilder.toInternalCollectionGetter(f_1, this._dtoModelExtensions.toName(f_1));
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_16, _internalCollectionGetter);
EList<JvmMember> _members_17 = it.getMembers();
JvmOperation _adder = this._dtoTypesBuilder.toAdder(f_1, this._dtoModelExtensions.toName(f_1));
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_17, _adder);
EList<JvmMember> _members_18 = it.getMembers();
JvmOperation _remover = this._dtoTypesBuilder.toRemover(f_1, this._dtoModelExtensions.toName(f_1));
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_18, _remover);
EList<JvmMember> _members_19 = it.getMembers();
JvmOperation _internalAdder = this._dtoTypesBuilder.toInternalAdder(f_1);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_19, _internalAdder);
EList<JvmMember> _members_20 = it.getMembers();
JvmOperation _internalRemover = this._dtoTypesBuilder.toInternalRemover(f_1);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_20, _internalRemover);
EList<JvmMember> _members_21 = it.getMembers();
JvmOperation _setter = this._dtoTypesBuilder.toSetter(f_1);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_21, _setter);
} else {
boolean _isVersionAttr = ((LDtoAbstractAttribute) f_1).isVersionAttr();
if (_isVersionAttr) {
EList<JvmMember> _members_22 = it.getMembers();
JvmOperation _versionSetter = this._dtoTypesBuilder.toVersionSetter(((LDtoAbstractAttribute) f_1));
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_22, _versionSetter);
} else {
EList<JvmMember> _members_23 = it.getMembers();
JvmOperation _setter_1 = this._dtoTypesBuilder.toSetter(f_1);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_23, _setter_1);
}
}
}
}
if (!_matched_1) {
if (f_1 instanceof LReference) {
_matched_1=true;
EList<JvmMember> _members_15 = it.getMembers();
JvmOperation _getter = this._dtoTypesBuilder.toGetter(f_1);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_15, _getter);
boolean _isToMany = this._dtoModelExtensions.isToMany(f_1);
if (_isToMany) {
EList<JvmMember> _members_16 = it.getMembers();
JvmOperation _internalCollectionGetter = this._dtoTypesBuilder.toInternalCollectionGetter(f_1, this._dtoModelExtensions.toName(f_1));
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_16, _internalCollectionGetter);
EList<JvmMember> _members_17 = it.getMembers();
JvmOperation _adder = this._dtoTypesBuilder.toAdder(f_1, this._dtoModelExtensions.toName(f_1));
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_17, _adder);
EList<JvmMember> _members_18 = it.getMembers();
JvmOperation _remover = this._dtoTypesBuilder.toRemover(f_1, this._dtoModelExtensions.toName(f_1));
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_18, _remover);
EList<JvmMember> _members_19 = it.getMembers();
JvmOperation _internalAdder = this._dtoTypesBuilder.toInternalAdder(f_1);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_19, _internalAdder);
EList<JvmMember> _members_20 = it.getMembers();
JvmOperation _internalRemover = this._dtoTypesBuilder.toInternalRemover(f_1);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_20, _internalRemover);
EList<JvmMember> _members_21 = it.getMembers();
JvmOperation _setter = this._dtoTypesBuilder.toSetter(f_1);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_21, _setter);
} else {
EList<JvmMember> _members_22 = it.getMembers();
JvmOperation _setter_1 = this._dtoTypesBuilder.toSetter(f_1);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_22, _setter_1);
if ((f_1.isCascading() || (this._dtoModelExtensions.opposite(f_1) != null))) {
EList<JvmMember> _members_23 = it.getMembers();
JvmOperation _internalSetter = this._dtoTypesBuilder.toInternalSetter(f_1);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_23, _internalSetter);
}
}
}
}
}
List<LDtoOperation> _operations = dto.getOperations();
for (final LDtoOperation op : _operations) {
EList<JvmMember> _members_15 = it.getMembers();
final Procedure1<JvmOperation> _function_2 = (JvmOperation it_1) -> {
this._dtoTypesBuilder.setDocumentation(it_1, this._dtoTypesBuilder.getDocumentation(op));
EList<JvmFormalParameter> _params = op.getParams();
for (final JvmFormalParameter p : _params) {
EList<JvmFormalParameter> _parameters = it_1.getParameters();
JvmFormalParameter _parameter = this._dtoTypesBuilder.toParameter(p, p.getName(), p.getParameterType());
this._dtoTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
}
this._dtoTypesBuilder.setBody(it_1, op.getBody());
};
JvmOperation _method = this._dtoTypesBuilder.toMethod(op, this._dtoModelExtensions.toName(op), op.getType(), _function_2);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_15, _method);
}
if ((idAttribute != null)) {
EList<JvmMember> _members_16 = it.getMembers();
JvmOperation _equalVersionsMethod = this._dtoTypesBuilder.toEqualVersionsMethod(idAttribute, it, false, idField, versionField);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_16, _equalVersionsMethod);
boolean _isHistorizedOrTimedependent_1 = dto.isHistorizedOrTimedependent();
if (_isHistorizedOrTimedependent_1) {
EList<JvmMember> _members_17 = it.getMembers();
JvmOperation _newIdVersion = this._dtoTypesBuilder.toNewIdVersion(dto, idField.getSimpleName());
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_17, _newIdVersion);
}
}
final JvmParameterizedTypeReference typeRef = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
typeRef.setType(it);
EList<JvmMember> _members_18 = it.getMembers();
final Procedure1<JvmOperation> _function_3 = (JvmOperation it_1) -> {
EList<JvmFormalParameter> _parameters = it_1.getParameters();
JvmFormalParameter _parameter = this._dtoTypesBuilder.toParameter(dto, "event", this._dtoTypesBuilder.newTypeRef(it_1, PropertyChangeEvent.class.getName(), null));
this._dtoTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
StringConcatenationClient _client = new StringConcatenationClient() {
@Override
protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
_builder.append("Object source = event.getSource();");
_builder.newLine();
_builder.newLine();
_builder.append("// forward the event from embeddable beans to all listeners. So the parent of the embeddable");
_builder.newLine();
_builder.append("// bean will become notified and its dirty state can be handled properly");
_builder.newLine();
{
final Function1<LDtoFeature, Boolean> _function = (LDtoFeature it_2) -> {
return Boolean.valueOf((!(it_2 instanceof LOperation)));
};
final Function1<LDtoFeature, Boolean> _function_1 = (LDtoFeature it_2) -> {
return Boolean.valueOf(DtoGrammarJvmModelInferrer.this._dtoModelExtensions.isBean(DtoGrammarJvmModelInferrer.this._dtoModelExtensions.toRawType(it_2)));
};
Iterable<LDtoFeature> _filter = IterableExtensions.<LDtoFeature>filter(IterableExtensions.<LDtoFeature>filter(dto.getFeatures(), _function), _function_1);
for(final LDtoFeature ref : _filter) {
_builder.newLine();
_builder.newLine();
_builder.append("\t");
_builder.append("if(source == ");
String _name = DtoGrammarJvmModelInferrer.this._dtoModelExtensions.toName(ref);
_builder.append(_name, "\t");
_builder.append("){");
_builder.newLineIfNotEmpty();
_builder.append("\t\t");
_builder.append("firePropertyChange(\"");
String _name_1 = DtoGrammarJvmModelInferrer.this._dtoModelExtensions.toName(ref);
_builder.append(_name_1, "\t\t");
_builder.append("\" + \"_\" + event.getPropertyName(), event.getOldValue(), event.getNewValue());");
_builder.newLineIfNotEmpty();
_builder.append("\t");
_builder.append("} else ");
_builder.newLine();
}
}
_builder.append("{ ");
_builder.newLine();
{
LDto _superType = dto.getSuperType();
boolean _tripleNotEquals = (_superType != null);
if (_tripleNotEquals) {
_builder.append("\t");
_builder.append("super.propertyChange(event);");
_builder.newLine();
} else {
_builder.append("\t");
_builder.append("// no super class available to forward event");
_builder.newLine();
}
}
_builder.append("}");
_builder.newLine();
}
};
this._dtoTypesBuilder.setBody(it_1, _client);
};
JvmOperation _method_1 = this._dtoTypesBuilder.toMethod(dto, "propertyChange", this.references.getTypeForName(Void.TYPE, dto), _function_3);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_18, _method_1);
String _name = dto.getName();
String _plus = ("Inferring dto " + _name);
doInferLog.stop(this.log, _plus);
};
acceptor.<JvmDeclaredType>accept(type).initializeLater(_function);
}
public void inferMapperFullState(final JvmGenericType type, final LDto dto, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPrelinkingPhase) {
final Procedure1<JvmGenericType> _function = (JvmGenericType it) -> {
final TimeLogger doInferLog = TimeLogger.start(it.getClass());
EObject _eContainer = dto.eContainer();
this._dtoTypesBuilder.setFileHeader(it, this._dtoTypesBuilder.getDocumentation(((LTypedPackage) _eContainer)));
StringConcatenation _builder = new StringConcatenation();
_builder.append("This class maps the dto {@link ");
String _name = this._dtoModelExtensions.toName(dto);
_builder.append(_name);
_builder.append("} to and from the entity {@link ");
String _name_1 = this._dtoModelExtensions.toName(dto.getWrappedType());
_builder.append(_name_1);
_builder.append("}.");
_builder.newLineIfNotEmpty();
this._dtoTypesBuilder.setDocumentation(it, _builder);
EList<JvmMember> _members = it.getMembers();
final Procedure1<JvmConstructor> _function_1 = (JvmConstructor it_1) -> {
};
JvmConstructor _constructor = this._dtoTypesBuilder.toConstructor(dto, _function_1);
this._dtoTypesBuilder.<JvmConstructor>operator_add(_members, _constructor);
LType _wrappedType = dto.getWrappedType();
boolean _tripleNotEquals = (_wrappedType != null);
if (_tripleNotEquals) {
final JvmTypeParameter dtoParam = TypesFactory.eINSTANCE.createJvmTypeParameter();
dtoParam.setName("DTO");
final JvmUpperBound dtoUpper = TypesFactory.eINSTANCE.createJvmUpperBound();
dtoUpper.setTypeReference(this._dtoTypesBuilder.findDtoTypeReference(dto));
EList<JvmTypeConstraint> _constraints = dtoParam.getConstraints();
this._dtoTypesBuilder.<JvmUpperBound>operator_add(_constraints, dtoUpper);
EList<JvmTypeParameter> _typeParameters = it.getTypeParameters();
this._dtoTypesBuilder.<JvmTypeParameter>operator_add(_typeParameters, dtoParam);
final JvmTypeParameter entityParam = TypesFactory.eINSTANCE.createJvmTypeParameter();
entityParam.setName("ENTITY");
final JvmUpperBound entityUpper = TypesFactory.eINSTANCE.createJvmUpperBound();
LType _wrappedType_1 = dto.getWrappedType();
JvmTypeReference _typeReference = null;
if (_wrappedType_1!=null) {
_typeReference=this._dtoModelExtensions.toTypeReference(_wrappedType_1);
}
entityUpper.setTypeReference(_typeReference);
EList<JvmTypeConstraint> _constraints_1 = entityParam.getConstraints();
this._dtoTypesBuilder.<JvmUpperBound>operator_add(_constraints_1, entityUpper);
EList<JvmTypeParameter> _typeParameters_1 = it.getTypeParameters();
this._dtoTypesBuilder.<JvmTypeParameter>operator_add(_typeParameters_1, entityParam);
final JvmParameterizedTypeReference entityType = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
entityType.setType(entityParam);
final JvmParameterizedTypeReference dtoType = TypesFactory.eINSTANCE.createJvmParameterizedTypeReference();
dtoType.setType(dtoParam);
LDto _superType = dto.getSuperType();
boolean _tripleNotEquals_1 = (_superType != null);
if (_tripleNotEquals_1) {
EList<JvmTypeReference> _superTypes = it.getSuperTypes();
JvmParameterizedTypeReference _findSuperDtoMapperType = this._dtoTypesBuilder.findSuperDtoMapperType(dto, dtoType, entityType);
this._dtoTypesBuilder.<JvmParameterizedTypeReference>operator_add(_superTypes, _findSuperDtoMapperType);
} else {
EList<JvmTypeReference> _superTypes_1 = it.getSuperTypes();
JvmTypeReference _typeForName = this.references.getTypeForName(IMapper.class, dto, dtoType, entityType);
this._dtoTypesBuilder.<JvmTypeReference>operator_add(_superTypes_1, _typeForName);
EList<JvmMember> _members_1 = it.getMembers();
JvmField _field = this._dtoTypesBuilder.toField(dto, "mapperAccess", this.references.getTypeForName(IMapperAccess.class, dto, null));
this._dtoTypesBuilder.<JvmField>operator_add(_members_1, _field);
EList<JvmMember> _members_2 = it.getMembers();
JvmOperation _getToDtoMapperAccess = this._dtoTypesBuilder.toGetToDtoMapperAccess(dto);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_2, _getToDtoMapperAccess);
EList<JvmMember> _members_3 = it.getMembers();
JvmOperation _getToEntityMapperAccess = this._dtoTypesBuilder.toGetToEntityMapperAccess(dto);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_3, _getToEntityMapperAccess);
EList<JvmMember> _members_4 = it.getMembers();
JvmOperation _mapperBindMethod = this._dtoTypesBuilder.toMapperBindMethod(dto);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_4, _mapperBindMethod);
EList<JvmMember> _members_5 = it.getMembers();
JvmOperation _mapperUnbindMethod = this._dtoTypesBuilder.toMapperUnbindMethod(dto);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_5, _mapperUnbindMethod);
}
EList<JvmMember> _members_6 = it.getMembers();
final Procedure1<JvmOperation> _function_2 = (JvmOperation it_1) -> {
StringConcatenation _builder_1 = new StringConcatenation();
_builder_1.append("Creates a new instance of the entity");
this._dtoTypesBuilder.setDocumentation(it_1, _builder_1);
StringConcatenationClient _client = new StringConcatenationClient() {
@Override
protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
{
boolean _isAbstract = DtoGrammarJvmModelInferrer.this._dtoModelExtensions.isAbstract(dto.getWrappedType());
if (_isAbstract) {
_builder.append("throw new UnsupportedOperationException(\"Subclass needs to provide dto.\");");
} else {
_builder.append("return new ");
String _name = DtoGrammarJvmModelInferrer.this._dtoModelExtensions.toName(dto.getWrappedType());
_builder.append(_name);
_builder.append("();");
}
}
_builder.newLineIfNotEmpty();
}
};
this._dtoTypesBuilder.setBody(it_1, _client);
};
JvmOperation _method = this._dtoTypesBuilder.toMethod(dto, "createEntity", this._dtoModelExtensions.toTypeReference(dto.getWrappedType()), _function_2);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_6, _method);
EList<JvmMember> _members_7 = it.getMembers();
final Procedure1<JvmOperation> _function_3 = (JvmOperation it_1) -> {
StringConcatenation _builder_1 = new StringConcatenation();
_builder_1.append("Creates a new instance of the dto");
this._dtoTypesBuilder.setDocumentation(it_1, _builder_1);
StringConcatenationClient _client = new StringConcatenationClient() {
@Override
protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
{
boolean _isAbstract = dto.isAbstract();
if (_isAbstract) {
_builder.append("throw new UnsupportedOperationException(\"Subclass needs to provide dto.\");");
} else {
_builder.append("return new ");
String _name = DtoGrammarJvmModelInferrer.this._dtoModelExtensions.toName(dto);
_builder.append(_name);
_builder.append("();");
}
}
_builder.newLineIfNotEmpty();
}
};
this._dtoTypesBuilder.setBody(it_1, _client);
};
JvmOperation _method_1 = this._dtoTypesBuilder.toMethod(dto, "createDto", this._dtoTypesBuilder.findDtoTypeReference(dto), _function_3);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_7, _method_1);
EList<JvmMember> _members_8 = it.getMembers();
JvmOperation _mapToDto = this._dtoTypesBuilder.toMapToDto(dto);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_8, _mapToDto);
EList<JvmMember> _members_9 = it.getMembers();
JvmOperation _mapToEntity = this._dtoTypesBuilder.toMapToEntity(dto);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_9, _mapToEntity);
EList<LDtoFeature> _features = dto.getFeatures();
for (final LDtoFeature f : _features) {
boolean _matched = false;
if ((f instanceof LDtoAbstractAttribute)) {
_matched=true;
final LDtoAbstractAttribute att = ((LDtoAbstractAttribute) f);
boolean _or = false;
boolean _inherited = this._dtoModelExtensions.inherited(att);
if (_inherited) {
_or = true;
} else {
LDtoMapper _mapper = att.getMapper();
XExpression _toDTO = null;
if (_mapper!=null) {
_toDTO=_mapper.getToDTO();
}
boolean _tripleNotEquals_2 = (_toDTO != null);
_or = _tripleNotEquals_2;
}
if (_or) {
EList<JvmMember> _members_10 = it.getMembers();
JvmOperation _mapToDtoProperty = this._dtoTypesBuilder.toMapToDtoProperty(att);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_10, _mapToDtoProperty);
}
boolean _or_1 = false;
boolean _inherited_1 = this._dtoModelExtensions.inherited(att);
if (_inherited_1) {
_or_1 = true;
} else {
LDtoMapper _mapper_1 = att.getMapper();
XExpression _fromDTO = null;
if (_mapper_1!=null) {
_fromDTO=_mapper_1.getFromDTO();
}
boolean _tripleNotEquals_3 = (_fromDTO != null);
_or_1 = _tripleNotEquals_3;
}
if (_or_1) {
EList<JvmMember> _members_11 = it.getMembers();
JvmOperation _mapToEntityProperty = this._dtoTypesBuilder.toMapToEntityProperty(att);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_11, _mapToEntityProperty);
}
}
if (!_matched) {
if ((f instanceof LDtoAbstractReference)) {
_matched=true;
final LDtoAbstractReference att_1 = ((LDtoAbstractReference) f);
boolean _or_2 = false;
boolean _inherited_2 = this._dtoModelExtensions.inherited(att_1);
if (_inherited_2) {
_or_2 = true;
} else {
LDtoMapper _mapper_2 = att_1.getMapper();
XExpression _toDTO_1 = null;
if (_mapper_2!=null) {
_toDTO_1=_mapper_2.getToDTO();
}
boolean _tripleNotEquals_4 = (_toDTO_1 != null);
_or_2 = _tripleNotEquals_4;
}
if (_or_2) {
EList<JvmMember> _members_12 = it.getMembers();
JvmOperation _mapToDtoProperty_1 = this._dtoTypesBuilder.toMapToDtoProperty(att_1);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_12, _mapToDtoProperty_1);
}
boolean _or_3 = false;
boolean _inherited_3 = this._dtoModelExtensions.inherited(att_1);
if (_inherited_3) {
_or_3 = true;
} else {
LDtoMapper _mapper_3 = att_1.getMapper();
XExpression _fromDTO_1 = null;
if (_mapper_3!=null) {
_fromDTO_1=_mapper_3.getFromDTO();
}
boolean _tripleNotEquals_5 = (_fromDTO_1 != null);
_or_3 = _tripleNotEquals_5;
}
if (_or_3) {
EList<JvmMember> _members_13 = it.getMembers();
JvmOperation _mapToEntityProperty_1 = this._dtoTypesBuilder.toMapToEntityProperty(att_1);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_13, _mapToEntityProperty_1);
}
}
}
}
final LAttribute idAtt = this.findIdProperty(dto);
EList<JvmMember> _members_14 = it.getMembers();
final Procedure1<JvmOperation> _function_4 = (JvmOperation it_1) -> {
EList<JvmFormalParameter> _parameters = it_1.getParameters();
JvmFormalParameter _parameter = this._dtoTypesBuilder.toParameter(dto, "in", this.references.getTypeForName(Object.class, dto, null));
this._dtoTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
if ((idAtt != null)) {
StringConcatenationClient _client = new StringConcatenationClient() {
@Override
protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
_builder.append("return org.eclipse.osbp.runtime.common.hash.HashUtil.createObjectWithIdHash(");
String _name = DtoGrammarJvmModelInferrer.this._dtoModelExtensions.toName(dto);
_builder.append(_name);
_builder.append(".class, in);");
_builder.newLineIfNotEmpty();
}
};
this._dtoTypesBuilder.setBody(it_1, _client);
} else {
StringConcatenationClient _client_1 = new StringConcatenationClient() {
@Override
protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
_builder.append("throw new UnsupportedOperationException(\"No id attribute available\");");
_builder.newLine();
}
};
this._dtoTypesBuilder.setBody(it_1, _client_1);
}
};
JvmOperation _method_2 = this._dtoTypesBuilder.toMethod(dto, "createDtoHash", this.references.getTypeForName(String.class, dto, null), _function_4);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_14, _method_2);
EList<JvmMember> _members_15 = it.getMembers();
final Procedure1<JvmOperation> _function_5 = (JvmOperation it_1) -> {
EList<JvmFormalParameter> _parameters = it_1.getParameters();
JvmFormalParameter _parameter = this._dtoTypesBuilder.toParameter(dto, "in", this.references.getTypeForName(Object.class, dto, null));
this._dtoTypesBuilder.<JvmFormalParameter>operator_add(_parameters, _parameter);
if ((idAtt != null)) {
StringConcatenationClient _client = new StringConcatenationClient() {
@Override
protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
_builder.append("return org.eclipse.osbp.runtime.common.hash.HashUtil.createObjectWithIdHash(");
String _name = DtoGrammarJvmModelInferrer.this._dtoModelExtensions.toName(dto.getWrappedType());
_builder.append(_name);
_builder.append(".class, in);");
_builder.newLineIfNotEmpty();
}
};
this._dtoTypesBuilder.setBody(it_1, _client);
} else {
StringConcatenationClient _client_1 = new StringConcatenationClient() {
@Override
protected void appendTo(StringConcatenationClient.TargetStringConcatenation _builder) {
_builder.append("throw new UnsupportedOperationException(\"No id attribute available\");");
_builder.newLine();
}
};
this._dtoTypesBuilder.setBody(it_1, _client_1);
}
};
JvmOperation _method_3 = this._dtoTypesBuilder.toMethod(dto, "createEntityHash", this.references.getTypeForName(String.class, dto, null), _function_5);
this._dtoTypesBuilder.<JvmOperation>operator_add(_members_15, _method_3);
}
String _name_2 = dto.getName();
String _plus = ("Inferring mapper " + _name_2);
doInferLog.stop(this.log, _plus);
};
acceptor.<JvmGenericType>accept(type).initializeLater(_function);
}
public LAttribute findIdProperty(final LDto dto) {
final Function1<LAttribute, LAttribute> _function = (LAttribute it) -> {
return ((LAttribute) it);
};
Iterable<LAttribute> _map = IterableExtensions.<LAttribute, LAttribute>map(Iterables.<LAttribute>filter(dto.getAllFeatures(), LAttribute.class), _function);
for (final LAttribute att : _map) {
boolean _isIDorUUID = this._dtoModelExtensions.isIDorUUID(att);
if (_isIDorUUID) {
return att;
}
}
return null;
}
protected void _infer(final LEnum enumX, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPrelinkingPhase) {
final JvmEnumerationType type = this._dtoTypesBuilder.toEnumerationType(enumX, this._iQualifiedNameProvider.getFullyQualifiedName(enumX).toString(), null);
this.inferFullState(type, enumX, acceptor, isPrelinkingPhase, "");
}
protected void _inferTypesOnly(final LEnum enumX, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPrelinkingPhase) {
final JvmEnumerationType type = this._dtoTypesBuilder.toEnumerationType(enumX, this._iQualifiedNameProvider.getFullyQualifiedName(enumX).toString(), null);
acceptor.<JvmEnumerationType>accept(type);
this.inferTypesOnlyByDelegates(enumX, acceptor, isPrelinkingPhase);
}
protected void _inferFullState(final JvmDeclaredType type, final LEnum enumX, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPrelinkingPhase, final String selector) {
final Procedure1<JvmDeclaredType> _function = (JvmDeclaredType it) -> {
final TimeLogger doInferLog = TimeLogger.start(it.getClass());
EObject _eContainer = enumX.eContainer();
this._dtoTypesBuilder.setFileHeader(it, this._dtoTypesBuilder.getDocumentation(((LTypedPackage) _eContainer)));
this._dtoTypesBuilder.setDocumentation(it, this._dtoTypesBuilder.getDocumentation(enumX));
EList<LEnumLiteral> _literals = enumX.getLiterals();
for (final LEnumLiteral f : _literals) {
{
this._dtoTypesBuilder.setDocumentation(it, this._dtoTypesBuilder.getDocumentation(f));
EList<JvmMember> _members = it.getMembers();
JvmEnumerationLiteral _enumerationLiteral = this._dtoTypesBuilder.toEnumerationLiteral(f, f.getName());
this._dtoTypesBuilder.<JvmEnumerationLiteral>operator_add(_members, _enumerationLiteral);
}
}
String _name = enumX.getName();
String _plus = ("Inferring enum " + _name);
doInferLog.stop(this.log, _plus);
};
acceptor.<JvmDeclaredType>accept(type).initializeLater(_function);
}
public void inferFullState(final JvmType type, final EObject dto, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPrelinkingPhase, final String selector) {
if (type instanceof JvmGenericType
&& dto instanceof LDto) {
_inferFullState((JvmGenericType)type, (LDto)dto, acceptor, isPrelinkingPhase, selector);
return;
} else if (type instanceof JvmDeclaredType
&& dto instanceof LEnum) {
_inferFullState((JvmDeclaredType)type, (LEnum)dto, acceptor, isPrelinkingPhase, selector);
return;
} else if (type != null
&& dto != null) {
_inferFullState(type, dto, acceptor, isPrelinkingPhase, selector);
return;
} else {
throw new IllegalArgumentException("Unhandled parameter types: " +
Arrays.<Object>asList(type, dto, acceptor, isPrelinkingPhase, selector).toString());
}
}
public void infer(final EObject enumX, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPrelinkingPhase) {
if (enumX instanceof LEnum) {
_infer((LEnum)enumX, acceptor, isPrelinkingPhase);
return;
} else if (enumX instanceof LDto) {
_infer((LDto)enumX, acceptor, isPrelinkingPhase);
return;
} else if (enumX != null) {
_infer(enumX, acceptor, isPrelinkingPhase);
return;
} else {
throw new IllegalArgumentException("Unhandled parameter types: " +
Arrays.<Object>asList(enumX, acceptor, isPrelinkingPhase).toString());
}
}
public void inferTypesOnly(final EObject enumX, final IJvmDeclaredTypeAcceptor acceptor, final boolean isPrelinkingPhase) {
if (enumX instanceof LEnum) {
_inferTypesOnly((LEnum)enumX, acceptor, isPrelinkingPhase);
return;
} else if (enumX instanceof LDto) {
_inferTypesOnly((LDto)enumX, acceptor, isPrelinkingPhase);
return;
} else if (enumX != null) {
_inferTypesOnly(enumX, acceptor, isPrelinkingPhase);
return;
} else {
throw new IllegalArgumentException("Unhandled parameter types: " +
Arrays.<Object>asList(enumX, acceptor, isPrelinkingPhase).toString());
}
}
}