Skip to content
SimpleOCL is an embeddable OCL implementation
Java GAP Other
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
org.eclipselabs.simpleocl.edit
org.eclipselabs.simpleocl.feature
org.eclipselabs.simpleocl.resource.simpleocl.ui
org.eclipselabs.simpleocl.resource.simpleocl
org.eclipselabs.simpleocl.tests
org.eclipselabs.simpleocl.updatesite Publish version 2.1.0.202001021418 Jan 2, 2020
org.eclipselabs.simpleocl Fix license/copyright Jan 2, 2020
org.emftext.commons.antlr3_4_0
.gitignore Package rename. Oct 3, 2013
README.md

README.md

SimpleOCL

SimpleOCL is an embeddable OCL implementation for inclusion in transformation languages for the EMF Transformation Virtual Machine (EMFTVM). SimpleOCL is built on top of the Eclipse Modeling Framework (EMF) and EMFText.

Below you can find an example of SimpleOCL code:

module test;

metamodel UML : 'http://www.eclipse.org/uml2/3.0.0/UML';

import OCL;

static def : allClasses : Sequence(UML!Class) =
	OclAny::allInstances()->union(
	UML!Class.allInstances());

def : allModuleNames : Set(String) =
	self.modules.getKeys()->map(k | k.toString());

context UML!Class def : umlQualifiedName(sep : String) : String =
	(let parent : OclAny = self.refImmediateComposite() in
	if parent.oclIsUndefined() then
		self.name
	else
		parent.umlQualifiedName() + sep + self.name
	endif)
	+
	let slottest : String = 'test' in slottest;

context Collection(OclAny) def : map(f : Lambda(OclAny):OclAny) : Collection(OclAny) =
	self->collect(e | f(e));


context Collection(OclAny) def : join(f : Lambda(OclAny, OclAny) : OclAny) : OclAny =
	self->iterate(e; acc : OclAny = OclUndefined |
		if acc.oclIsUndefined() then
			e
		else 
			f(acc, e)
		endif
	);

context OclAny def : name() : String =
	'<unnamed>';

context String def : name() : String =
	if self.isEmpty() then
		super.name()
	else
		self
	endif;
	
context OclAny def : name : String =
	self.name();

context String def : name : String =
	super.name;

static def : map : Map(OclAny, OclAny) =
	Map{
		(1, 'one'),
		(2, 'two'),
		(3, 'three')
	};

static def : tuple : Tuple(a : String, b : String) =
	Tuple{
		a = 'one',
		b = 'two'
	};
	
static def : tupleType : TupleType(a : String, b : String) =
	Tuple{
		a = 'one',
		b = 'two'
	};
	
context Env static def : main() : Set(String) =
	(36 + 3.5).toString().debug('arithmetic test') +
	env.allModuleNames->join(x, y | x + ', ' + y).debug('module names') +
	Env::map.debug('map').toString() +
	Env::tuple.debug('tuple').toString();

This code defines a couple of attributes and operations. Note that we've added the Lambda type, so you can define your own iterator expressions, e.g.:

list->map(x | x*2)

More examples can be found in iterators.simpleocl.

To facilitate better integration with Java code, we've also added support for static attributes/operations. These are invoked using the :: operator instead of the . operator. Finally, all attributes/operations without a defined context fall in the Env context, which stands for the environment. The environment has a single runtime instance, which can be accessed using the env keyword.

SimpleOCL does not support OCL's pre, post, and inv declarations. It is intended as a navigation language to be embedded in model transformation languages, and therefore only supports def declarations. That said, EMFTVM's integration with Java allows you to do much more.

Installation

To download and install the SimpleOCL Eclipse plugin, install it from the following Eclipse update site:

Drag to your running Eclipse workspace to install SimpleOCL or https://raw.githubusercontent.com/dwagelaar/simpleocl/master/org.eclipselabs.simpleocl.updatesite/

Running SimpleOCL/EMFTVM modules

Note that SimpleOCL modules don't do anything normally, unless you define a static main operation:

static def : main() : OclAny = ...

EMFTVM includes a separate launch configuration dialog that looks very much like ATL's launch configuration dialog. It can be found via "Run -> Run Configurations...".

EMFTVM launch configuration dialog

Links

You can’t perform that action at this time.