blob: a7018706c09ff1c48f8a8cf9d69d805180de4e9c [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
*
*/
grammar org.eclipse.osbp.xtext.datainterchange.DataDSL with org.eclipse.osbp.xtext.oxtype.OXtype
import "http://osbp.eclipse.org/xtext/datainterchange/DataDSL"
import "http://osbp.eclipse.org/dsl/common/types/v1" as types
import "http://osbp.eclipse.org/dsl/entity/v1" as entity
import "http://www.eclipse.org/emf/2002/Ecore" as ecore
DataInterchangeModel:
importSection=XImportSection?
packages+=DataInterchangePackage*;
DataInterchangePackage:
{DataInterchangePackage} 'package' name=QualifiedName
('{' (groups+=DataInterchangeGroup)* '}' )?;
DataInterchangeGroup:
{DataInterchangeGroup} 'group' name=TRANSLATABLEID
('{' (datInts+=DataInterchange)* '}' )?;
DataInterchange:
{DataInterchange} 'interchange' name=TRANSLATABLEID
(description?='describedBy' descriptionValue=TRANSLATABLESTRING)?
mode=EntityManagerMode
(hasVectorName?='vectorName' vectorName=STRING)?
(createReport?='report')?
('elementSize' elementSize=INT)?
(deleteFileAfterImport?='deleteFileAfterImport')?
'file' fileEndpoint=DataInterchangeFile 'path' '{' (path+=DataInterchangeBean)* '}';
DataInterchangeFile:
DataInterchangeFileXML | DataInterchangeFileCSV | DataInterchangeFileEDI | DataInterchangeFileFixed;
DataInterchangeFileXML:
{DataInterchangeFileXML} 'XML' fileURL=STRING ((byAttribute?='mapByAttribute')? & ('encoding' encoding=STRING)? & ('locale' locale=STRING)?);
DataInterchangeFileCSV:
{DataInterchangeFileCSV} 'CSV' fileURL=STRING
(
('delimiter' delimiter=STRING)? & ('quoteCharacter' quoteCharacter=STRING)? & ('skipLines' skipLines=INT)? &
(indent?='indent')? & ('encoding' encoding=STRING)? & ('locale' locale=STRING)?
);
DataInterchangeFileEDI:
{DataInterchangeFileEDI} 'EDI' fileURL=STRING (('encoding' encoding=STRING)? & ('locale' locale=STRING)?) 'mappingModel' mappingModel=STRING (validate?='validate')?;
DataInterchangeFileFixed:
{DataInterchangeFileFixed} 'Fixed' fileURL=STRING (('encoding' encoding=STRING)? & ('locale' locale=STRING)?);
DataInterchangeBean:
{DataInterchangeBean}
'entity' entity=[entity::LEntity|LFQN]
('referencedBy' refDataSource=[entity::LEntityFeature])?
('nodeName' nodeName=STRING)?
('createOn' elementMap=STRING)?
(markLatestImport?='latestImport' latestProperty=[entity::LEntityAttribute])?
(markLatestExport?='latestExport' latestExpProperty=[entity::LEntityAttribute])?
(('expression' '{' (expression+=DataInterchangeExpression)* '}')?
('lookup' '{' (lookup+=DataInterchangeLookup)* '}')?
('format' '{' (format+=DataInterchangeFormat)* '}')?
('expose' '{' (exportExposes+=DataInterchangeExpose)* '}')?
('mapping' '{' (mappings+=DataInterchangeMapping)* '}')?
('keys' '{' (lookupKeys+=DataInterchangeKey)* '}')?
('exportFilter' '{' exportFilter=DataInterchangeExportFilter '}')?)
;
DataInterchangeKey:
{DataInterchangeKey} 'key' property=[entity::LEntityAttribute];
DataInterchangeLookup:
{DataInterchangeLookup}
'for' targetProperty=[entity::LEntityReference]
'in' entity=[entity::LEntity]
'createOn' elementMap=STRING
'mapFrom' dataMap=STRING
((allowNoResult?='allowNoResult')? & (markerPath=DataInterchangeMarkerPath)?)
'mapTo' queryProperty=[entity::LEntityAttribute]
(cached?='cacheSize' cacheSize=INT)?
('where' '{' condition=DataInterchangeLookupFilterCondition'}')?;
DataInterchangeMarkerPath:
{DataInterchangeMarkerPath}
'markerPath' '{' (path+=DataInterchangeMarkerEntity)* '}';
DataInterchangeMarkerEntity:
{DataInterchangeMarkerEntity}
'markerEntity' markerEntity=[entity::LEntity|LFQN]
(markLatest?='markedBy' markerProperty=[entity::LEntityAttribute])?;
DataInterchangeFormat:
{DataInterchangeFormat} 'for' targetProperty=[entity::LEntityAttribute] 'coding' format=STRING;
DataInterchangeExpression:
DataInterchangeEntityExpression | DataInterchangePredefinedExpression;
DataInterchangeEntityExpression:
{DataInterchangeEntityExpression} 'copy' targetProperty=[entity::LEntityAttribute] 'from' entity=[entity::LEntity|LFQN] 'property' property=[entity::LEntityAttribute];
DataInterchangeExpose:
{DataInterchangeExpose}
'ref' refEntity=[entity::LEntityReference] ('on' refProperty=[entity::LEntityAttribute] | 'expose' '{' subExpose=DataInterchangeExpose '}');
DataInterchangeExportFilter:
{DataInterchangeExportFilter}
('where' '{' condition=DataInterchangeExportFilterCondition'}')?
('hide' hiddenproperties+=DataInterchangeExportHide*)?;
DataInterchangeExportFilterCondition:
refProperty=[entity::LEntityFeature] operator=Operator
(value=STRING)?
(operator2=Junction subcondition=DataInterchangeExportFilterCondition )?;
DataInterchangeLookupFilterCondition:
refProperty=[entity::LEntityFeature] operator=Operator
(operand=DataInterchangeLookupFilterOperand)?
(operator2=Junction subcondition=DataInterchangeLookupFilterCondition )?;
DataInterchangeLookupFilterOperand:
DataInterchangeLookupFilterOperandString | DataInterchangeLookupFilterOperandProperty;
DataInterchangeLookupFilterOperandProperty:
{DataInterchangeLookupFilterOperandProperty}
refProperty=[entity::LEntityFeature];
DataInterchangeLookupFilterOperandString:
{DataInterchangeLookupFilterOperandString} value=STRING;
DataInterchangeExportHide:
{DataInterchangeExportHide} property=[entity::LEntityFeature];
DataInterchangePredefinedExpression:
{DataInterchangePredefinedExpression} 'assign' targetProperty=[entity::LEntityAttribute] 'with' bean=PredefinedBeanEnum 'as' beanType=PredefinedBeanTypeEnum;
DataInterchangeMapping:
DataInterchangeValueMapping | DataInterchangeBlobMapping | DataInterchangeFixedColumnMapping;
DataInterchangeValueMapping:
{DataInterchangeValueMapping} 'map' property=[entity::LEntityAttribute] 'to' data=STRING;
DataInterchangeBlobMapping:
{DataInterchangeBlobMapping} 'mapBlob' property=[entity::LEntityAttribute]
'to' data=STRING ('extension' blobFileExtension=STRING)? ('path' blobPath=STRING)?
'mimeType' mimeType=PredefinedBlobMimeTypeEnum ; // it would be better if the mime type can be optional and deduced from extension
DataInterchangeFixedColumnMapping:
{DataInterchangeFixedColumnMapping} 'mapFixedLength' property=[entity::LEntityAttribute] 'length' length=INT
(
((trim?='trim') | (leftTrim?='leftTrim') | (rightTrim?='rightTrim'))? &
((lowerCase?='lowerCase') | (upperCase?='upperCase') | (capFirst?='capitalizeFirstWord') | (uncapFirst?='uncapitalizeFirstWord') | (capitalize?='capitalize'))?
);
LFQN:
ID ('.' ID)*;
TRANSLATABLESTRING:
STRING;
TRANSLATABLEID:
ID;
enum PredefinedBlobMimeTypeEnum:
plain = "plain"|
jpg = "jpg"|
png = "png"|
mpeg = "mpeg"|
octetstream = "octet-stream"|
pdf = "pdf";
enum PredefinedBeanEnum:
now = 'NowDate'|
start = 'StartDate'|
UUID = 'UniversallyUniqueIdentifier';
enum PredefinedBeanTypeEnum:
Date = 'Date'|
Millis = 'Milliseconds'|
Nanos = 'Nanoseconds'|
random = 'Random'|
execContext = 'ExecuteContext';
enum EntityManagerMode:
persist = 'persist'|
merge = 'merge'|
remove = 'remove';
enum Operator:
equals = '=' |
notequals = '!=' |
greaterthen = '>' |
greaterthenorequalto = '>=' |
lessthen = '<' |
lessthenorequalto = '<=' |
isnull = 'isnull' |
isnotnull = 'isnotnull';
enum Junction:
and = 'and'|
or = 'or';