blob: 3299b60194e930df85607893b3a722b58cd9e86e [file] [log] [blame]
/*
*
* Copyright (c) 2013, 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
*
*/
package org.eclipse.osbp.xtext.datamartdsl.scoping;
import java.util.ArrayList
import javax.inject.Inject
import org.eclipse.emf.common.util.BasicEList
import org.eclipse.emf.common.util.EList
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EReference
import org.eclipse.emf.ecore.InternalEObject
import org.eclipse.osbp.dsl.common.xtext.extensions.ModelExtensions
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.cubedsl.CubeDimension
import org.eclipse.osbp.xtext.cubedsl.CubeDimensionEntityEntity
import org.eclipse.osbp.xtext.cubedsl.CubeDimensionUsage
import org.eclipse.osbp.xtext.cubedsl.CubeHierarchy
import org.eclipse.osbp.xtext.cubedsl.CubeLevel
import org.eclipse.osbp.xtext.cubedsl.CubeMeasure
import org.eclipse.osbp.xtext.cubedsl.CubeType
import org.eclipse.osbp.xtext.datamartdsl.DatamartCube
import org.eclipse.osbp.xtext.datamartdsl.DatamartDSLPackage
import org.eclipse.osbp.xtext.datamartdsl.DatamartDefineDerivedMeasure
import org.eclipse.osbp.xtext.datamartdsl.DatamartDefinition
import org.eclipse.osbp.xtext.datamartdsl.DatamartEntity
import org.eclipse.osbp.xtext.datamartdsl.DatamartHierarchy
import org.eclipse.osbp.xtext.datamartdsl.DatamartMember
import org.eclipse.osbp.xtext.datamartdsl.DatamartOwner
import org.eclipse.osbp.xtext.datamartdsl.DatamartReference
import org.eclipse.xtext.scoping.IScope
import org.eclipse.xtext.scoping.Scopes
import org.eclipse.xtext.scoping.impl.FilteringScope
/**
* This class contains custom scoping description.
*
* see : http://www.eclipse.org/Xtext/documentation/latest/xtext.html#scoping
* on how and when to use it
*
*/
@SuppressWarnings("restriction")
public class DatamartDSLScopeProvider extends AbstractDatamartDSLScopeProvider {
@Inject extension ModelExtensions
@Override
override IScope getScope(EObject context, EReference reference) {
if (reference == DatamartDSLPackage.Literals.DATAMART_HIERARCHY__HIERARCHY_REF) {
return getDatamartHierarchy_hierarchyRef(context)
} else if (reference == DatamartDSLPackage.Literals.DATAMART_MEASURE__MEASURE_REF) {
return getDatamartMeasure_measureRef(context)
} else if (reference == DatamartDSLPackage.Literals.DATAMART_DERIVED_MEASURE__DERIVED_REF) {
return getDatamartDerivedMeasure_derivedRef(context)
} else if (reference == DatamartDSLPackage.Literals.DATAMART_HIERARCHY_LEVEL_SINGLE__LEVEL_REF) {
return getDatamartHierarchy_levelRef(context)
} else if (reference == DatamartDSLPackage.Literals.DATAMART_HIERARCHY__EXCEPT_REF) {
return getDatamartHierarchy_levelRef(context)
} else if (reference == DatamartDSLPackage.Literals.DATAMART_HIERARCHY__ORDER_REF) {
return getDatamartMeasure_measureRef(context)
} else if (reference == DatamartDSLPackage.Literals.DATAMART_ATTRIBUTE_BASE__ATTRIBUTE_REF) {
return getDatamartAttribute_attributeRef(context)
} else if (reference == DatamartDSLPackage.Literals.DATAMART_REFERENCE_BASE__REFERENCE_REF) {
return getDatamartAttribute_referenceRef(context)
} else if (reference == DatamartDSLPackage.Literals.DATAMART_ORDER__ORDER_BY) {
return getDatamartAttribute_attributeRef(context)
} else if (reference == DatamartDSLPackage.Literals.DATAMART_REFERENCE__REF) {
return getDatamartEntity_datamartReferenceRef(context, reference)
} else if (reference == DatamartDSLPackage.Literals.DATAMART_ENTITY__ENTITY_REF) {
return getDatamartEntity_datamartEntityRef(context, reference)
} else {
val scope = super.getScope(context, reference);
return scope
}
}
def IScope getDatamartEntity_filterEntityRef(EObject context, EReference reference) {
val scope = super.getScope(context, reference);
return new FilteringScope(scope, [
val entityProxy = it.EObjectOrProxy
var LEntity entity = null;
if (entityProxy.eIsProxy) {
// This is the resolving solution as XTend itself uses in
// org.eclipse.xtend.core.macro.declaration.XtendAnnotationReferenceImpl.getAnnotationType()
// This provokes no problems of loops or cycling linking.
val uri = (entityProxy as InternalEObject).eProxyURI
entity = context.eResource.resourceSet.getEObject(uri, true) as LEntity
} else {
entity = entityProxy as LEntity;
}
var inheritedClass = false
if (entity !== null) {
if (entity.superType !== null &&
(!entity.superType.isMappedSuperclass()/* || entity.superType.superType !== null */)) {
inheritedClass = true;
}
if (!inheritedClass && !entity.isMappedSuperclass) {
return true
}
}
return false
])
}
def void iterateEntity(DatamartEntity entity, ArrayList<EObject> result) {
for (prop : entity.attributes) {
result.add(prop.attributeRef)
}
for (navigation : entity.navigations) {
switch (navigation) {
DatamartMember: (navigation as DatamartMember).datamartEntity.iterateEntity(result)
DatamartOwner: (navigation as DatamartOwner).datamartEntity.iterateEntity(result)
}
}
}
/**
*
* @param context
* @return LEntity
*/
def LEntity getDatamartEntity(EObject context) {
var eObj = context.eContainer()
while (eObj !== null && !(eObj instanceof DatamartEntity)) {
eObj = eObj.eContainer()
}
if (eObj !== null) {
return (eObj as DatamartEntity).entityRef
} else {
return null
}
}
/**
*
* @param context
* @return
*/
def IScope getDatamartAttribute_attributeRef(EObject context) {
var result = <EObject>newArrayList
var entity = context.datamartEntity
if (entity !== null) {
for (LEntityAttribute attr : entity.allAttributes) {
if (attr.name !== null && !(attr.isId || attr.isUuid) && !(attr.transient)) {
result.add(attr)
}
}
}
return Scopes::scopeFor(result)
}
/**
*
* @param context
* @return
*/
def IScope getDatamartAttribute_referenceRef(EObject context) {
var result = <EObject>newArrayList
var entity = context.datamartEntity
if (entity !== null) {
for (LEntityReference ref : entity.allReferences) {
result.add(ref)
}
}
return Scopes::scopeFor(result)
}
def getDatamartEntity_datamartReferenceRef(EObject context, EReference reference) {
var result = <EObject>newArrayList
var eObj = context.eContainer
while (!(eObj instanceof DatamartEntity)) {
eObj = eObj.eContainer
if (eObj === null) {
return Scopes::scopeFor(result)
}
}
if (eObj instanceof DatamartEntity) {
for (ref : (eObj as DatamartEntity).entityRef.allReferences) {
if ((context as DatamartReference).eContainer instanceof DatamartOwner) {
if (!(ref as LEntityFeature).toMany) {
result.add(ref)
}
} else {
if ((ref as LEntityFeature).toMany) {
result.add(ref)
}
}
}
}
return Scopes::scopeFor(result)
}
def getDatamartEntity_datamartEntityRef(EObject context, EReference reference) {
var result = <EObject>newArrayList
var eObj = context.eContainer
while (!(eObj instanceof DatamartEntity)) {
eObj = eObj.eContainer
if (eObj === null) {
return super.getScope(context, reference);
}
}
if (eObj instanceof DatamartEntity) {
for (ref : (eObj as DatamartEntity).entityRef.allReferences) {
if ((context as DatamartEntity).eContainer instanceof DatamartOwner) {
if (!(ref as LEntityFeature).toMany) {
result.add(ref.type)
}
} else {
if ((ref as LEntityFeature).toMany) {
result.add(ref.type)
}
}
}
}
return Scopes::scopeFor(result)
}
def IScope getDatamartHierarchy_hierarchyRef(EObject context) {
var result = <EObject>newArrayList
var eObj = context.eContainer
while (!(eObj instanceof DatamartDefinition)) {
eObj = eObj.eContainer
}
if (eObj !== null) {
if (eObj instanceof DatamartDefinition) {
if ((eObj as DatamartDefinition).source !== null) {
var datamartSource = eObj.source
if (datamartSource instanceof DatamartCube) {
if ((datamartSource).cubeRef !== null) {
var cube = datamartSource.cubeRef
if (cube !== null) {
if (cube.getCubeTypeEntity() !== null) {
var hierList = new BasicEList<CubeHierarchy>();
for (CubeDimensionUsage ccCubeDimensionUsage : cube.getCubeTypeEntity().getDimensionUsages()) {
hierList.addAll(ccCubeDimensionUsage.sourceValue.hierarchies)
}
result = getHierarchyList(hierList, result);
}
}
}
}
}
}
}
return Scopes.scopeFor(result)
}
def IScope getDatamartHierarchy_levelRef(EObject eObj) {
var result = <EObject>newArrayList
var eObjLocal = eObj
while (!(eObjLocal instanceof DatamartHierarchy)) {
eObjLocal = eObjLocal.eContainer()
}
if (eObjLocal !== null) {
if (eObjLocal instanceof DatamartHierarchy) {
var hierarchy = eObjLocal.hierarchyRef
if (hierarchy !== null) {
if (hierarchy instanceof CubeHierarchy) {
var entity = hierarchy.cubeDimEntity
if (entity !== null) {
for (CubeLevel ccCubeLevel : entity.hierarchLevels) {
if (ccCubeLevel.name !== null) {
result.add(ccCubeLevel)
}
}
if (entity.dimEntity !== null) {
entity.dimEntity.recurseLevels(result)
}
}
}
}
}
}
return Scopes.scopeFor(result)
}
def void recurseLevels(CubeDimensionEntityEntity dimEntity, ArrayList<EObject> result) {
if (dimEntity !== null) {
for (CubeLevel ccCubeLevel : dimEntity.hierarchLevels) {
if (ccCubeLevel.name !== null) {
result.add(ccCubeLevel);
}
}
dimEntity.dimEntity.recurseLevels(result)
}
}
def IScope getDatamartMeasure_measureRef(EObject eObj) {
var result = <EObject>newArrayList
var eObjLocal = eObj.eContainer();
while (!(eObjLocal instanceof DatamartDefinition)) {
eObjLocal = eObjLocal.eContainer();
}
if (eObjLocal !== null) {
if (eObjLocal instanceof DatamartDefinition) {
if (eObjLocal.source !== null) {
var datamartSource = eObjLocal.source
if (datamartSource instanceof DatamartCube) {
if (datamartSource.cubeRef !== null) {
var cube = datamartSource.cubeRef
if (cube !== null) {
if (cube instanceof CubeType) {
if (cube.cubeTypeEntity !== null) {
for (CubeMeasure ccCubeMeasure : cube.cubeTypeEntity.measures) {
if (ccCubeMeasure.name !== null) {
result.add(ccCubeMeasure);
}
}
}
}
}
}
}
}
}
}
return Scopes.scopeFor(result)
}
def IScope getDatamartDerivedMeasure_derivedRef(EObject eObj) {
val result = <EObject>newArrayList
var eObjLocal = eObj.eContainer();
while (!(eObjLocal instanceof DatamartCube)) {
eObjLocal = eObjLocal?.eContainer();
}
if (eObjLocal !== null) {
val cube = eObjLocal as DatamartCube
cube.axisslicer.filter(typeof(DatamartDefineDerivedMeasure)).forEach [
result += it
]
}
return Scopes.scopeFor(result)
}
def ArrayList<EObject> getHierarchyList(EList<CubeHierarchy> hierList, ArrayList<EObject> result) {
for (CubeHierarchy ccCubeHierarchy : hierList) {
var name = ccCubeHierarchy.name
if ((name === null) || (name.length() == 0)) {
var eObj = ccCubeHierarchy.eContainer
while (!(eObj instanceof CubeDimension)) {
eObj = eObj.eContainer
}
name = (eObj as CubeDimension).name
ccCubeHierarchy.name = name
}
result.add(ccCubeHierarchy)
}
return result;
}
}