blob: a5cd3c5790389aba8fda4380601a1e5127aa3c9c [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;
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')?;
DataInterchangeBean:
{DataInterchangeBean}
'entity' entity=[entity::LEntity|LFQN]
('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]
'on' entity=[entity::LEntity]
('createOn' elementMap=STRING)?
'with' queryProperty=[entity::LEntityAttribute]
(cached?='cacheSize' cacheSize=INT)?
('mapTo' dataMap=STRING)?
(
(allowNoResult?='allowNoResult')? &
(allowNonuniqueResult?='allowNonuniqueResult')? &
(markerPath=DataInterchangeMarkerPath)?
);
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=DataInterchangeFilterCondition'}')?
('hide' hiddenproperties+=DataInterchangeExportHide*)?
;
DataInterchangeFilterCondition:
refProperty=[entity::LEntityFeature] operator=ConditionAndOperator1
(value=STRING)?
(operator2=ConditionAndOperator2 subcondition=DataInterchangeFilterCondition )?
;
DataInterchangeExportHide:
{DataInterchangeExportHide} property=[entity::LEntityFeature]
;
DataInterchangePredefinedExpression:
{DataInterchangePredefinedExpression} 'assign' targetProperty=[entity::LEntityAttribute] 'with' bean=PredefinedBeanEnum 'as' beanType=PredefinedBeanTypeEnum;
DataInterchangeMapping:
DataInterchangeValueMapping | DataInterchangeBlobMapping;
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
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 ConditionAndOperator1:
equals = '=' |
notequals = '!=' |
greaterthen = '>' |
greaterthenorequalto = '>=' |
lessthen = '<' |
lessthenorequalto = '<=' |
isnull = 'isnull' |
isnotnull = 'isnotnull'
// in = 'in' |
// between = 'between'|
// exists = 'exists' |
// not = 'not
// like = 'like'
;
enum ConditionAndOperator2:
and = 'and'|
or = 'or';