blob: c8b399785293d9d23b55bdb2d58cb977e8607890 [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 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:
* 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 javax.inject.Inject
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EReference
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.LEntityAttribute
import org.eclipse.osbp.dsl.semantic.entity.LEntityFeature
import org.eclipse.osbp.dsl.semantic.entity.LEntityReference
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.DataInterchangeExpose
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookup
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeMarkerEntity
import org.eclipse.osbp.xtext.datainterchange.EntityManagerMode
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.osbp.dsl.entity.xtext.services.EntityGrammarGrammarAccess.EntityModelElements
class DataDSLScopeProvider extends AbstractDataDSLScopeProvider {
@Inject extension ModelExtensions
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_BEAN__LATEST_EXP_PROPERTY) {
return getScope_Data_Entity_latest(context, reference)
}
else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_FILTER_CONDITION__REF_PROPERTY){
return getScope_Data_ExportFilterAttributes_entity(context, reference)
}
else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_EXPORT_HIDE__PROPERTY) {
return getScope_Data_ExportFilterAttributes_hide(context, reference)
}
else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR2) {
return getScope_Data_ExportFilterAttributes_entity(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__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_EXPOSE__REF_ENTITY){
return getScope_Data_Expose_entity(context, reference)
} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_EXPOSE__REF_PROPERTY) {
return getScope_Data_Expose_queryProperty(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 if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_BEAN__ENTITY) {
return getScope_Data_Entity_next(context, reference)
} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_KEY__PROPERTY) {
return getScope_keyProperty(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.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_keyProperty(EObject context, EReference reference) {
val result = <IEObjectDescription>newArrayList
var eObj = context.eContainer
while (!(eObj instanceof DataInterchangeBean)) {
eObj = eObj.eContainer
}
if (eObj !== null && eObj instanceof DataInterchangeBean) {
var entity = (eObj as DataInterchangeBean).entity
entity.allAttributes.forEach[result.add(EObjectDescription.create(it.name, it))]
}
return MapBasedScope.createScope(IScope.NULLSCOPE, result)
}
def getScope_Data_Lookup_queryProperty(EObject context, EReference reference) {
val result = <IEObjectDescription>newArrayList
if (context !== null && context instanceof DataInterchangeLookup) {
var entity = (context as DataInterchangeLookup).entity
entity.allAttributes.forEach[result.add(EObjectDescription.create(it.name, it))]
}
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
if (filterAttributes) {
for (prop : entity.allAttributes) {
if (marker === null || !prop.toName.equals(marker.toName)) {
result.add(EObjectDescription.create((prop as LAttribute).name, (prop as LAttribute)))
}
}
} else {
for (prop : entity.allReferences) {
if (!prop.toMany) {
result.add(EObjectDescription.create((prop as LReference).name, (prop as LReference)))
}
}
}
}
return MapBasedScope.createScope(IScope.NULLSCOPE, result)
}
def getScope_Data_Expose_entity(EObject context, EReference reference) {
var result = <IEObjectDescription>newArrayList
var eObj = context.eContainer
var LEntity entity
if(eObj instanceof DataInterchangeBean){
entity = eObj.entity
}else if(eObj instanceof DataInterchangeExpose){
entity = (eObj as DataInterchangeExpose).refEntity.type
}
if (entity !== null) {
for (prop : entity.allReferences) {
if (!prop.toMany) {
result.add(EObjectDescription.create((prop as LReference).name, (prop as LReference)))
}
}
}
return MapBasedScope.createScope(IScope.NULLSCOPE, result)
}
def getScope_Data_Expose_queryProperty(EObject context, EReference reference) {
val result = <IEObjectDescription>newArrayList
if (context !== null && context instanceof DataInterchangeExpose) {
var entity = (context as DataInterchangeExpose).refEntity.getType
if(entity !== null){
entity.allAttributes.forEach[result.add(EObjectDescription.create(it.name, it))]
}
}
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_Entity_next(EObject context, EReference reference) {
val result = <IEObjectDescription>newArrayList
var eObj = context
while (!(eObj instanceof DataInterchange)) {
eObj = eObj.eContainer
}
val prevObjects = <DataInterchangeBean>newArrayList
val rootObjects = <LEntity>newArrayList
for(obj:(eObj as DataInterchange).path) {
if(obj.equals(context)) {
prevObjects.forall[rootObjects.add(it.entity)]
}
prevObjects += obj
}
if(rootObjects.empty) {
return super.getScope(context, reference)
}
rootObjects.forEach[
it.allReferences.filter(it|it.toMany && !rootObjects.contains(it.type)).forEach[
result.add(EObjectDescription.create(it.type.name, it.type))
]
]
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)
}
def getScope_Data_ExportFilterAttributes_entity(EObject context, EReference reference) {
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.allFeatures) {
if(prop instanceof LEntityAttribute && (marker === null || !prop.toName.equals(marker.toName))) {
result.add(EObjectDescription.create((prop as LEntityFeature).name, (prop as LAttribute)))
}
else if(prop instanceof LEntityReference && !prop.toMany) {
result.add(EObjectDescription.create((prop as LEntityFeature).name, (prop as LReference)))
}
}
}
return MapBasedScope.createScope(IScope.NULLSCOPE, result)
}
def getScope_Data_ExportFilterAttributes_hide(EObject context, EReference reference) {
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
var EntityManagerMode mode;
if(eObj.eContainer instanceof DataInterchange){
mode = (eObj.eContainer as DataInterchange).mode
}
for (prop : entity.allFeatures) {
if(prop instanceof LEntityAttribute && (marker === null || !prop.toName.equals(marker.toName))) {
if(mode.equals(EntityManagerMode.PERSIST) && prop.isUUID || (prop as LEntityAttribute).isId){
// do nothing
}else{
result.add(EObjectDescription.create((prop as LEntityFeature).name, (prop as LAttribute)))
}
}
else if(prop instanceof LEntityReference && !prop.toMany) {
result.add(EObjectDescription.create((prop as LEntityFeature).name, (prop as LReference)))
}
}
}
return MapBasedScope.createScope(IScope.NULLSCOPE, result)
}
}