@GenModel(fileExtensions="blip")
@GenModel(modelName="BlipDSL")
@GenModel(prefix="BlipDSL")
@GenModel(updateClasspath="false")
@GenModel(copyrightText="Copyright (c) 2014, Loetz GmbH&Co.KG (Heidelberg)
 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 

 Based on ideas from Xtext, Xtend, Xcore
  
 Contributors:  
 		Loetz GmbH&Co.KG - Initial implementation 
 ")
@Ecore(nsURI="http://osbp.eclipse.org/xtext/blip/BlipDSL")
@Ecore(nsPrefix="blipdsl")
@Ecore(rootPackage="blipdsl")
package org.eclipse.osbp.xtext.blip

import org.eclipse.bpmn2.CallActivity
import org.eclipse.bpmn2.Event
import org.eclipse.bpmn2.Gateway
import org.eclipse.bpmn2.Process
import org.eclipse.bpmn2.ScriptTask
import org.eclipse.bpmn2.SequenceFlow
import org.eclipse.bpmn2.ServiceTask
import org.eclipse.bpmn2.Task
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.InternalEObject
import org.eclipse.osbp.dsl.semantic.common.types.LPackage
import org.eclipse.osbp.dsl.semantic.dto.LDto
import org.eclipse.osbp.dsl.xtext.lazyresolver.api.EcoreUtil3
import org.eclipse.osbp.xtext.blip.common.BlipHelper
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryBlipGroup
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryFunction
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryTest
import org.eclipse.xtext.xtype.XImportSection

class BlipModel{
	contains LPackage[] packages
}

type InternalEObject wraps InternalEObject

class BlipLazyResolver {
	op EObject eResolveProxy(InternalEObject proxy) {
		return EcoreUtil3.resolve(proxy, this.eResource().resourceSet);
	}
}

class BlipPackage extends LPackage{
	contains XImportSection importSection
	contains Blip[] blips
}

class BlipBase extends BlipLazyResolver{
	String name
}

class Blip extends BlipBase{
	//String resourceName
	refers Process process
	boolean description
	String descriptionValue
	boolean hasImage
	String image
	boolean hasIcon
	IconsEnum icon
	boolean hasLogging
	refers FunctionLibraryBlipGroup functionGroup
	contains BlipWorkload workload
	contains BlipItem[] items
}

class BlipWorkload extends BlipLazyResolver{
	contains BlipDto source
	contains BlipFilter[] filters
}

class BlipFilter extends BlipLazyResolver{
	String filterName
	String filterValue
}

class BlipDto extends BlipLazyResolver{
	refers LDto dtoRef
}

class BlipDtoPath {
	String dtoPath
}

class BlipItem {
	String name
	contains BlipDtoPath dtoPath
	/** get the operative LDto defined by the dtoPath */
	op LDto getOperativeLDto() {
		BlipHelper.getOperativeLDto(this)
	}
}

class BlipEvent extends BlipItem {
	refers Event event
}

class BlipStartEvent extends BlipEvent {
}

enum EndEventHandlingEnum {
	TERMINATES_PROCESS as 'terminates process'
	ENDS_TOKEN_PATH as 'ends token path'
}

class BlipEndEvent extends BlipEvent {
	EndEventHandlingEnum endHandling 
}

class BlipUserTask extends BlipItem {
	refers Task task
	refers FunctionLibraryFunction onEntry
	refers FunctionLibraryFunction onExit
}

class BlipCallActivity extends BlipItem {
	refers CallActivity callActivity
	refers FunctionLibraryFunction onEntry
	refers FunctionLibraryFunction onExit
}

class BlipScript extends BlipItem {
	refers ScriptTask task
	refers FunctionLibraryFunction function
}

class BlipScriptTask extends BlipScript {
}

class BlipPersistTask extends BlipScript {
}

class BlipServiceTask extends BlipItem {
	refers ServiceTask task
	refers FunctionLibraryFunction onEntry
	refers FunctionLibraryFunction onExit
	ServiceExecutionModeEnum executionMode
	int timeoutInSecs
	refers FunctionLibraryFunction function
	String webServiceInterface
	String webServiceOperation
}

class BlipOutGoing extends BlipItem {
	refers SequenceFlow sequenceFlow
	refers FunctionLibraryTest constraint
	boolean isDefault
}

class BlipOutGoingDefault extends BlipOutGoing {
}

class BlipSplitGateway extends BlipItem {
	refers Gateway gateway
	contains BlipOutGoing[] outgoings
}

class BlipExclusiveSplitGateway extends BlipSplitGateway {
}

class BlipInclusiveSplitGateway extends BlipSplitGateway {
}

enum ServiceExecutionModeEnum {
	SYNC as "synchron",
	// ASYNCHRON as "asynchron",
	ONEWAY as "oneway"
}

enum IconsEnum{
ICON_PLUS as 'plus'
ICON_MINUS as 'minus'
ICON_INFO as 'info'
ICON_LEFT as 'left'
ICON_UP as 'up'
ICON_RIGHT as 'right'
ICON_DOWN as 'down'
ICON_EXCHANGE as 'exchange'
ICON_HOME as 'home'
ICON_HOME_1 as 'home-1'
ICON_UP_DIR as 'up-dir'
ICON_RIGHT_DIR as 'right-dir'
ICON_DOWN_DIR as 'down-dir'
ICON_LEFT_DIR as 'left-dir'
ICON_STAR as 'star'
ICON_STAR_EMPTY as 'star-empty'
ICON_TH_LIST as 'th-list'
ICON_HEART_EMPTY as 'heart-empty'
ICON_HEART as 'heart'
ICON_MUSIC as 'music'
ICON_TH as 'th'
ICON_FLAG as 'flag'
ICON_COG as 'cog'
ICON_ATTENTION as 'attention'
ICON_MAIL as 'mail'
ICON_EDIT as 'edit'
ICON_PENCIL as 'pencil'
ICON_OK as 'ok'
ICON_CANCEL_1 as 'cancel-1'
ICON_CANCEL as 'cancel'
ICON_CANCEL_CIRCLE as 'cancel-circle'
ICON_HELP as 'help'
ICON_PLUS_CIRCLE as 'plus-circle'
ICON_MINUS_CIRCLE as 'minus-circle'
ICON_RIGHT_THIN as 'right-thin'
ICON_FORWARD as 'forward'
ICON_CW as 'cw'
ICON_LEFT_THIN as 'left-thin'
ICON_UP_THIN as 'up-thin'
ICON_DOWN_THIN as 'down-thin'
ICON_LEFT_BOLD as 'left-bold'
ICON_RIGHT_BOLD as 'right-bold'
ICON_UP_BOLD as 'up-bold'
ICON_DOWN_BOLD as 'down-bold'
ICON_USER_ADD as 'user-add'
ICON_HELP_CIRCLE as 'help-circle'
ICON_INFO_CIRCLE as 'info-circle'
ICON_BACK as 'back'
ICON_EYE as 'eye'
ICON_TAG as 'tag'
ICON_UPLOAD_CLOUD as 'upload-cloud'
ICON_REPLY as 'reply'
ICON_EXPORT as 'export'
ICON_PRINT as 'print'
ICON_RETWEET as 'retweet'
ICON_COMMENT as 'comment'
ICON_VCARD as 'vcard'
ICON_LOCATION as 'location'
ICON_TRASH as 'trash'
ICON_RESIZE_FULL as 'resize-full'
ICON_RESIZE_SMALL as 'resize-small'
ICON_DOWN_OPEN as 'down-open'
ICON_LEFT_OPEN as 'left-open'
ICON_RIGHT_OPEN as 'right-open'
ICON_UP_OPEN as 'up-open'
ICON_ARROWS_CW as 'arrows-cw'
ICON_CHART_PIE as 'chart-pie'
ICON_SEARCH_1 as 'search-1'
ICON_USER as 'user'
ICON_USERS as 'users'
ICON_MONITOR as 'monitor'
ICON_FOLDER as 'folder'
ICON_DOC as 'doc'
ICON_CALENDAR as 'calendar'
ICON_CHART as 'chart'
ICON_ATTACH as 'attach'
ICON_UPLOAD as 'upload'
ICON_DOWNLOAD as 'download'
ICON_MOBILE as 'mobile'
ICON_CAMERA as 'camera'
ICON_LOCK as 'lock'
ICON_LOCK_OPEN as 'lock-open'
ICON_BELL as 'bell'
ICON_LINK as 'link'
ICON_CLOCK as 'clock'
ICON_BLOCK as 'block'
}
