blob: ae6575af5b075463de4758d3aea6d45594e230b5 [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.reportdsl.validation
import java.util.Collection
import java.util.HashSet
import java.util.LinkedHashSet
import java.util.Set
import org.eclipse.emf.ecore.EObject
import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute
import org.eclipse.osbp.xtext.datamartdsl.DatamartAttribute
import org.eclipse.osbp.xtext.reportdsl.DatamartTable
import org.eclipse.osbp.xtext.reportdsl.DatamartTableAttribute
import org.eclipse.osbp.xtext.reportdsl.DatamartTableDetail
import org.eclipse.osbp.xtext.reportdsl.DatamartTableGroup
import org.eclipse.osbp.xtext.reportdsl.GridCell
import org.eclipse.osbp.xtext.reportdsl.Image
import org.eclipse.osbp.xtext.reportdsl.ImageSourceEnum
import org.eclipse.osbp.xtext.reportdsl.PageFooter
import org.eclipse.osbp.xtext.reportdsl.PageHeader
import org.eclipse.osbp.xtext.reportdsl.PageTemplate
import org.eclipse.osbp.xtext.reportdsl.ReportDSLPackage
import org.eclipse.osbp.xtext.reportdsl.TableAggregation
import org.eclipse.osbp.xtext.reportdsl.TableAttribute
import org.eclipse.osbp.xtext.reportdsl.TableBinaryAggregation
import org.eclipse.osbp.xtext.reportdsl.TableMultipleAggregation
import org.eclipse.osbp.xtext.reportdsl.TableUnaryAggregation
import org.eclipse.xtext.validation.Check
/**
* Custom validation rules.
*
* see http://www.eclipse.org/Xtext/documentation.html#validation
*/
class ReportDSLValidator extends AbstractReportDSLValidator {
@Check
def checkTableAttribute(TableAttribute tableAttribute) {
var eObj = tableAttribute.eContainer
if (tableAttribute.checkPageTemplateBelonging) {
while ((eObj !== null) && !(eObj instanceof DatamartTableAttribute)){
eObj = eObj.eContainer
}
if (eObj instanceof DatamartTableAttribute){
var datamartTableAttribute = eObj as DatamartTableAttribute
error('A table attribute is not allowed in a page template definition', datamartTableAttribute, ReportDSLPackage.Literals.DATAMART_TABLE_ATTRIBUTE__COLUMN)
}
} else {
while ((eObj !== null) && !(eObj instanceof DatamartTableDetail)){
eObj = eObj.eContainer
}
if (eObj instanceof DatamartTableDetail){
var datamartTableDetail = eObj as DatamartTableDetail
var duplicates = datamartTableDetail.columnFormatters.findDuplicates
if (duplicates.contains(tableAttribute.valueRef)) {
error('Duplicated table attributes are not allowed in a table template definition', tableAttribute, ReportDSLPackage.Literals.TABLE_ATTRIBUTE__VALUE_REF)
}
}
}
}
@Check
def checkDatamartTableGroup(DatamartTableGroup datamartTableGroup) {
if (datamartTableGroup.checkPageTemplateBelonging) {
var eObj = datamartTableGroup.eContainer
while ((eObj !== null) && !(eObj instanceof DatamartTable)){
eObj = eObj.eContainer
}
if (eObj instanceof DatamartTable){
var datamartTable = eObj as DatamartTable
error('A table group is not allowed in a page template definition', datamartTable, ReportDSLPackage.Literals.DATAMART_TABLE__GROUPS)
}
}
}
@Check
def checkTable(DatamartTable table) {
var place = ""
var pageTemplateBelonging = table.checkPageTemplateBelonging
var eObj = table.eContainer
while ((eObj !== null) && (!((eObj instanceof PageHeader) || (eObj instanceof PageFooter) || (eObj instanceof GridCell)))){
eObj = eObj.eContainer
}
if (eObj instanceof PageHeader){
var pageHeader = eObj as PageHeader
if (pageTemplateBelonging) {
place = "page"
} else {
place = "header"
}
error(place.errorTxt, pageHeader, ReportDSLPackage.Literals.CONTAINER__ELEMENTS)
} else if (eObj instanceof PageFooter){
var pageFooter = eObj as PageFooter
if (pageTemplateBelonging) {
place = "page"
} else {
place = "footer"
}
error(place.errorTxt, pageFooter, ReportDSLPackage.Literals.CONTAINER__ELEMENTS)
} else if (eObj instanceof GridCell){
val gridCell = eObj as GridCell
if (pageTemplateBelonging) {
place = "page"
} else {
var eObj2 = table.eContainer
while ((eObj2 !== null) && (!((eObj2 instanceof PageHeader) || (eObj2 instanceof PageFooter)))){
eObj2 = eObj2.eContainer
}
if (eObj2 instanceof PageHeader){
place = "header"
} else if (eObj2 instanceof PageFooter){
place = "footer"
}
}
if (!place.isNullOrEmpty){
error(place.errorTxt, gridCell, ReportDSLPackage.Literals.CONTAINER__ELEMENTS)
}
}
}
@Check
def checkTableAggregation(TableAggregation aggregation) {
if (aggregation.checkPageTemplateBelonging) {
error('A table aggregation is not allowed in a page template definition', aggregation, ReportDSLPackage.Literals.TABLE_AGGREGATION__ON_GROUP)
}
}
@Check
def checkTableUnaryAggregation(TableUnaryAggregation aggregation) {
if (aggregation.checkPageTemplateBelonging) {
error('A table unary aggregation is not allowed in a page template definition', aggregation, ReportDSLPackage.Literals.TABLE_UNARY_AGGREGATION__AGGREGATION)
} else if (aggregation.checkPageHeaderBelonging) {
error('A table unary aggregation is not allowed in a page header definition', aggregation, ReportDSLPackage.Literals.TABLE_UNARY_AGGREGATION__AGGREGATION)
} else if (aggregation.checkPageFooterBelonging) {
error('A table unary aggregation is not allowed in a page footer definition', aggregation, ReportDSLPackage.Literals.TABLE_UNARY_AGGREGATION__AGGREGATION)
}
}
@Check
def checkTableMultipleAggregation(TableMultipleAggregation aggregation) {
if (aggregation.checkPageTemplateBelonging) {
error('A table multiple aggregation is not allowed in a page template definition', aggregation, ReportDSLPackage.Literals.TABLE_MULTIPLE_AGGREGATION__AGGREGATION)
} else if (aggregation.checkPageHeaderBelonging) {
error('A table multiple aggregation is not allowed in a page header definition', aggregation, ReportDSLPackage.Literals.TABLE_MULTIPLE_AGGREGATION__AGGREGATION)
} else if (aggregation.checkPageFooterBelonging) {
error('A table multiple aggregation is not allowed in a page footer definition', aggregation, ReportDSLPackage.Literals.TABLE_MULTIPLE_AGGREGATION__AGGREGATION)
}
}
@Check
def checkTableBinaryAggregation(TableBinaryAggregation aggregation) {
if (aggregation.checkPageTemplateBelonging) {
error('A table binary aggregation is not allowed in a page template definition', aggregation, ReportDSLPackage.Literals.TABLE_BINARY_AGGREGATION__AGGREGATION)
} else if (aggregation.checkPageHeaderBelonging) {
error('A table binary aggregation is not allowed in a page header definition', aggregation, ReportDSLPackage.Literals.TABLE_BINARY_AGGREGATION__AGGREGATION)
} else if (aggregation.checkPageFooterBelonging) {
error('A table binary aggregation is not allowed in a page footer definition', aggregation, ReportDSLPackage.Literals.TABLE_BINARY_AGGREGATION__AGGREGATION)
}
}
@Check
def checkImageUrl(Image image) {
if (image.filename.empty){
error('An empty file name is not allowed!', image, ReportDSLPackage.Literals.IMAGE__FILENAME)
} else if (ImageSourceEnum.URL.equals(image.sourceType)) {
if (!(image.filename.startsWith("http://") || image.filename.startsWith("https://"))){
error('A non http URL is not allowed!', image, ReportDSLPackage.Literals.IMAGE__FILENAME)
}
}
}
def private boolean checkPageTemplateBelonging(EObject attribute) {
var eObj = attribute.eContainer
while ((eObj!==null) && !(eObj instanceof PageTemplate)){
eObj = eObj.eContainer
}
if ((eObj instanceof PageTemplate)){
return true
}
return false
}
def private boolean checkPageHeaderBelonging(EObject attribute) {
var eObj = attribute.eContainer
while ((eObj!==null) && !(eObj instanceof PageHeader)){
eObj = eObj.eContainer
}
if ((eObj instanceof PageHeader)){
return true
}
return false
}
def private boolean checkPageFooterBelonging(EObject attribute) {
var eObj = attribute.eContainer
while ((eObj!==null) && !(eObj instanceof PageFooter)){
eObj = eObj.eContainer
}
if ((eObj instanceof PageFooter)){
return true
}
return false
}
def private Set<DatamartAttribute> findDuplicates(Collection<DatamartTableAttribute> list) {
var duplicates = new LinkedHashSet<DatamartAttribute>();
var uniques = new HashSet<LEntityAttribute>();
for(DatamartTableAttribute attribute : list) {
if (attribute.column instanceof TableAttribute){
var tableAttribute = attribute.column as TableAttribute
if(!uniques.add(tableAttribute.valueRef.attributeRef)) {
duplicates.add(tableAttribute.valueRef);
}
}
}
return duplicates;
}
def private String errorTxt(String place) '''A table is not allowed in a �place� template definition'''
}