blob: 796c5fbfd09545ea4fbcf7b89b7c86e520c4ba42 [file] [log] [blame]
/**
*
* 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.datainterchange.scoping
import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage
import org.eclipse.osbp.xtext.datainterchange.DataInterchange
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeEntityExpression
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookup
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeMarkerEntity
import javax.inject.Inject
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EReference
import org.eclipse.xtext.resource.EObjectDescription
import org.eclipse.xtext.resource.IEObjectDescription
import org.eclipse.xtext.scoping.IScope
import org.eclipse.xtext.scoping.impl.MapBasedScope
import org.eclipse.xtext.xbase.annotations.typesystem.XbaseWithAnnotationsBatchScopeProvider
import org.eclipse.osbp.dsl.entity.xtext.extensions.EntityTypesBuilder
import org.eclipse.osbp.dsl.entity.xtext.extensions.ModelExtensions
import org.eclipse.osbp.dsl.semantic.common.types.LAttribute
import org.eclipse.osbp.dsl.semantic.common.types.LReference
import org.eclipse.osbp.dsl.semantic.entity.LEntity
import org.eclipse.osbp.dsl.semantic.entity.LEntityReference
class DataDSLScopeProvider extends XbaseWithAnnotationsBatchScopeProvider {
@Inject extension ModelExtensions
@Inject extension EntityTypesBuilder
override getScope(EObject context, EReference reference) {
if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_BEAN__LATEST_PROPERTY) {
return getScope_Data_Entity_latest(context, reference)
} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_EXPRESSION__TARGET_PROPERTY) {
return getScope_Data_Target_property(context, reference, true)
} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_FORMAT__TARGET_PROPERTY) {
return getScope_Data_Target_property(context, reference, true)
} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_ENTITY_EXPRESSION__ENTITY) {
return getScope_Data_Expression_entity(context, reference, true)
} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_ENTITY_EXPRESSION__PROPERTY) {
return getScope_Data_Expression_entity(context, reference, false)
} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP__TARGET_PROPERTY) {
return getScope_Data_Target_property(context, reference, false)
} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP__QUERY_PROPERTY) {
return getScope_Data_Lookup_queryProperty(context, reference)
} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP__ENTITY) {
return getScope_Data_Lookup_lookupEntity(context, reference)
} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_BEAN__ENTITY) {
return getScope_Data_Bean_Entity(context, reference)
} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_MAPPING__PROPERTY) {
return getScope_Data_Target_property(context, reference, true)
} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_MARKER_ENTITY__MARKER_ENTITY) {
return getScope_Data_Markerpath_entity(context, reference)
} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_MARKER_ENTITY__MARKER_PROPERTY) {
return getScope_Data_Entity_latest(context, reference)
} else {
super.getScope(context, reference)
}
}
def getScope_Data_Bean_Entity(EObject context, EReference reference) {
var result = <IEObjectDescription>newArrayList
var eObj = context.eContainer
while (!(eObj instanceof DataInterchange)) {
eObj = eObj.eContainer
}
if (eObj != null) {
var DataInterchangeBean previousEntity = null
for(diEntity:(eObj as DataInterchange).path) {
// find me
if (previousEntity != null) {
// remove this entity from result, we already used it
var IEObjectDescription delObj = null
for(r:result) {
if (r.name.toString.equals(previousEntity.entity.name)) {
delObj = r
}
}
if(delObj != null) {
result.remove(delObj)
}
// scoping refers to the previous owner
for(f:previousEntity.entity.features) {
if (f instanceof LReference) {
if (f.cascading && f.toMany) {
var ref = (f as LEntityReference)
result.add(EObjectDescription.create(ref.type.toName, ref.type))
}
}
}
}
if (!diEntity.equals(context)) {
previousEntity = diEntity
}
else if (previousEntity == null) {
return super.getScope(context, reference)
}
}
}
return MapBasedScope.createScope(IScope.NULLSCOPE, result)
}
def getScope_Data_Lookup_queryProperty(EObject context, EReference reference) {
var result = <IEObjectDescription>newArrayList
if (context != null && context instanceof DataInterchangeLookup) {
var entity = (context as DataInterchangeLookup).entity
for (prop : entity.features) {
if (prop instanceof LAttribute && !prop.toMany) {
result.add(EObjectDescription.create((prop as LAttribute).name, (prop as LAttribute)))
}
}
}
return MapBasedScope.createScope(IScope.NULLSCOPE, result)
}
def getScope_Data_Lookup_lookupEntity(EObject context, EReference reference) {
var result = <IEObjectDescription>newArrayList
var targetProperty = (context as DataInterchangeLookup).targetProperty
var eObj = context.eContainer
while (!(eObj instanceof DataInterchangeBean)) {
eObj = eObj.eContainer
}
if (eObj != null) {
var entity = (eObj as DataInterchangeBean).entity
for (prop : entity.features) {
if (prop instanceof LReference && !prop.toMany && (prop as LReference).name.equals(targetProperty.toName)) {
result.add(EObjectDescription.create((prop as LReference).type.name, (prop as LReference).type))
}
}
}
return MapBasedScope.createScope(IScope.NULLSCOPE, result)
}
def getScope_Data_Expression_entity(EObject context, EReference reference, boolean filterEntity) {
var result = <IEObjectDescription>newArrayList
var targetProperty = (context as DataInterchangeEntityExpression).targetProperty
var fromEntity = (context as DataInterchangeEntityExpression).entity
var eObj = context.eContainer
while (!(eObj instanceof DataInterchange)) {
eObj = eObj.eContainer
}
if (eObj != null) {
for (path : (eObj as DataInterchange).path) {
for (f:path.entity.features) {
if (f instanceof LAttribute && (f as LAttribute).type.name.equals(targetProperty.type.name)) {
if (filterEntity) {
result.add(EObjectDescription.create(path.entity.toName, path.entity))
} else if (fromEntity == null || path.entity.toName.equals(fromEntity.toName)) {
result.add(EObjectDescription.create((f as LAttribute).toName, (f as LAttribute)))
}
}
}
}
}
return MapBasedScope.createScope(IScope.NULLSCOPE, result)
}
def getScope_Data_Target_property(EObject context, EReference reference, boolean filterAttributes) {
var result = <IEObjectDescription>newArrayList
var eObj = context.eContainer
while (!(eObj instanceof DataInterchangeBean)) {
eObj = eObj.eContainer
}
if (eObj != null) {
var entity = (eObj as DataInterchangeBean).entity
var marker = (eObj as DataInterchangeBean).latestProperty
for (prop : entity.features) {
if (filterAttributes) {
if (prop instanceof LAttribute && (marker==null || !prop.toName.equals(marker.toName))) {
result.add(EObjectDescription.create((prop as LAttribute).name, (prop as LAttribute)))
}
} else {
if (prop instanceof LReference && !prop.toMany) {
result.add(EObjectDescription.create((prop as LReference).name, (prop as LReference)))
}
}
}
}
return MapBasedScope.createScope(IScope.NULLSCOPE, result)
}
def getScope_Data_Entity_latest(EObject context, EReference reference) {
var result = <IEObjectDescription>newArrayList
var LEntity rootEntity = null
if (context != null) {
switch context {
DataInterchangeBean: {
rootEntity = (context as DataInterchangeBean).entity
}
DataInterchangeMarkerEntity: {
rootEntity = (context as DataInterchangeMarkerEntity).markerEntity
}
}
for (prop : rootEntity.features) {
if (prop instanceof LAttribute && "boolean".equals((prop as LAttribute).type.name)) {
result.add(EObjectDescription.create((prop as LAttribute).name, (prop as LAttribute)))
}
}
}
return MapBasedScope.createScope(IScope.NULLSCOPE, result)
}
def getScope_Data_Markerpath_entity(EObject context, EReference reference) {
var result = <IEObjectDescription>newArrayList
var eObj = context.eContainer
while (!(eObj instanceof DataInterchangeLookup)) {
eObj = eObj.eContainer
}
if (eObj != null) {
var entity = (eObj as DataInterchangeLookup).entity
for (f:entity.references) {
if (!f.toMany) {
result.add(EObjectDescription.create(f.type.toName , f.type))
}
}
}
return MapBasedScope.createScope(IScope.NULLSCOPE, result)
}
}