@GenModel(fileExtensions="dto", modelDirectory="/org.eclipse.osbp.dsl.dto.xtext/emf-gen", editDirectory="/org.eclipse.osbp.dsl.dto.xtext.edit/src", childCreationExtenders="true")
@GenModel(modelName="DTO")
@GenModel(prefix="OSBPDto")
@GenModel(suppressEMFModelTags="true")
@GenModel(runtimeVersion="2.9")
@GenModel(loadInitialization="false")
@GenModel(literalsInterface="true")
@GenModel(copyrightText="Copyright (c) 2011, 2016 - Lunifera GmbH (Gross Enzersdorf), Loetz GmbH&Co.KG (Heidelberg)
 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 
 ")
@GenModel(operationReflection="false")
@Ecore(nsURI="http://osbp.eclipse.org/dsl/dto/v1")
@Ecore(nsPrefix="dto")
@Ecore(rootPackage="dto")
package org.eclipse.osbp.dsl.semantic.dto
 
import java.util.ArrayList
import java.util.Collections
import java.util.List
import org.eclipse.emf.ecore.EObject 
import org.eclipse.emf.ecore.InternalEObject
import org.eclipse.osbp.dsl.semantic.common.types.FeaturesList
import org.eclipse.osbp.dsl.semantic.common.types.LAttribute
import org.eclipse.osbp.dsl.semantic.common.types.LClass
import org.eclipse.osbp.dsl.semantic.common.types.LFeature
import org.eclipse.osbp.dsl.semantic.common.types.LFeaturesHolder
import org.eclipse.osbp.dsl.semantic.common.types.LKeyAndValue
import org.eclipse.osbp.dsl.semantic.common.types.LLazyResolver
import org.eclipse.osbp.dsl.semantic.common.types.LMultiplicity
import org.eclipse.osbp.dsl.semantic.common.types.LReference
import org.eclipse.osbp.dsl.semantic.common.types.LScalarType
import org.eclipse.osbp.dsl.semantic.common.types.LType
import org.eclipse.osbp.dsl.semantic.common.types.LTypedPackage
import org.eclipse.osbp.xtext.oxtype.resource.EcoreUtil3
import org.eclipse.xtext.xbase.XExpression
import org.eclipse.xtext.xtype.XImportSection

class LDtoModel {
	contains XImportSection importSection
	contains LTypedPackage[] packages
	op EObject eResolveProxy(InternalEObject proxy) {
		return EcoreUtil3.resolve(proxy, this.eResource().resourceSet);
	}
}
 
/**
 * A bean is an embeddable element that may become added to a entity using the @embedd annotation. 
 */
class LDto extends LClass, LFeaturesHolder, LScalarType {
	contains LDtoFeature[] features
	refers LDto superType opposite subTypes
	refers LDto[] subTypes opposite superType
	refers LType wrappedType
	/** 
 	 * Returns all features of type LOperation
 	 */
	op OperationsList getOperations() {
		features.filter(typeof(LDtoOperation)).toList
	}
	/**
 	 * Returns all features of type LDtoReference
 	 */
	op DtoReferenceList getReferences() {
		features.filter(typeof(LDtoAbstractReference)).toList
	}
	/**
 	 * Returns all features of type LDtoAttribute
 	 */
	op DtoAttributeList getAttributes() {
		features.filter(typeof(LDtoAbstractAttribute)).toList
	}
	/**
	 * Returns all features of the holder and from super types
	 */
	op FeaturesList getAllFeatures() {
		val List<LDtoFeature> result = newArrayList()
		collectAllOSBPFeatures(result)
		return result
	}
	op LAttribute getIdAttribute() {
		val LDtoAbstractAttribute feature = allFeatures.filter(typeof(LDtoAbstractAttribute)).findFirst [
			switch (it) {
				LDtoInheritedAttribute: {
					return it.inheritedFeature?.id || it.inheritedFeature?.uuid
				}
				LDtoAttribute: {
					return it.id || it.uuid
				}
			}
			return false
		]

		switch (feature) {
			LDtoAttribute:
				return feature
			LDtoInheritedAttribute:
				return feature.inheritedFeature
		}
		return null
	}
	op void collectAllOSBPFeatures(LDto current, DtoFeatureList result) {
		if (current === null) {
			return
		}

		// collect from current feature
		result.addAll(current.features)

		// call for super class
		current.superType.collectAllOSBPFeatures(result)
	}
	op LDtoAbstractAttribute getPrimaryKeyAttribute() {
		return allFeatures.filter(typeof(LDtoAbstractAttribute)).findFirst [
			switch (it) {
				LDtoInheritedAttribute:
					return it.inheritedFeature?.id || it.inheritedFeature?.uuid
				LDtoAttribute:
					return it.id || it.uuid
			}
			return false
		]
	}
	op String getIdAttributeName() {
		var attribute = getPrimaryKeyAttribute()
		switch (attribute) {
			LDtoInheritedAttribute:
				return attribute.inheritedFeature.name
			LDtoAttribute:
				return attribute.name
		}
		return null
	}
	op LScalarType getIdAttributeType() {
		var attribute = getPrimaryKeyAttribute()
		switch (attribute) {
			LDtoInheritedAttribute:
				return attribute.inheritedFeature.^type
			case LDtoAttribute:
				return attribute.^type
		}
		return null
	}
}

class LAutoInheritDto extends LDto {
}

class LDtoMapper extends LLazyResolver {
	contains XExpression toDTO
	contains XExpression fromDTO
}

class LDtoFeature extends LFeature {
	contains LDtoMapper mapper
	op LDto getDTO() {

		//		if (eContainer instanceof LFeature) {
		//			return null // this happens since the feature may be the annotation info 
		//		}
		return eContainer as LDto
	}
}
 
abstract class LDtoAbstractAttribute extends LDtoFeature, LAttribute {
	op PropertiesList getResolvedProperties() {
		if (this instanceof LDtoInheritedAttribute) {
			val temp = this as LDtoInheritedAttribute
			if (temp.inheritedFeature === null) {
				return Collections.emptyList()
			}
			val result = new ArrayList<LKeyAndValue>(temp.inheritedFeature.properties)
			result.addAll(properties)
			return result
		} else {
			return properties
		}
	}
	op boolean isVersionAttr() {
		if (this instanceof LDtoInheritedAttribute) {
			val temp = this as LDtoInheritedAttribute
			return temp.inheritedFeature.version
		} else {
			return this.version
		}
	}
 }

class LDtoInheritedAttribute extends LDtoAbstractAttribute{
	refers LAttribute inheritedFeature
	op LScalarType getInheritedType() {
		return inheritedFeature.^type
	}
	op LMultiplicity getInheritedMultiplicity() {
		return inheritedFeature.multiplicity
	}
}

class LDtoAttribute  extends LDtoAbstractAttribute {
}

abstract class LDtoAbstractReference extends LDtoFeature, LReference {
	refers LDto ^type
	op PropertiesList getResolvedProperties() {
		if (this instanceof org.eclipse.osbp.dsl.semantic.dto.LDtoInheritedReference) {
			val temp = this as LDtoInheritedReference
			if (temp.inheritedFeature === null) {
				return Collections.emptyList()
			}
			val result = new ArrayList<LKeyAndValue>(temp.inheritedFeature.properties)
			result.addAll(properties)
			return result
		} else {
			return properties
		}
	}
}

class LDtoInheritedReference extends LDtoAbstractReference{
	refers LReference inheritedFeature
	op LMultiplicity getInheritedMultiplicity() {
		return inheritedFeature.multiplicity
	}
}

class LDtoReference  extends LDtoAbstractReference {
	refers LDtoReference ^opposite
}

class LDtoOperation extends org.eclipse.osbp.dsl.semantic.common.types.LOperation, LDtoFeature {
}

type DtoFeatureList wraps java.util.List<LDtoFeature>

type OperationsList wraps java.util.List<LDtoOperation>

type DtoReferenceList wraps java.util.List<LDtoAbstractReference>

type DtoAttributeList wraps java.util.List<LDtoAbstractAttribute>

type DtoAbstractAttributeList wraps java.util.List<LDtoAbstractAttribute>

type InternalEObject wraps InternalEObject

type PropertiesList wraps java.util.List<LKeyAndValue>
	
	
	
	