Kevoree :: Modeling :: Root

Kevoree Modeling Framework

License

License

GroupId

GroupId

org.kevoree.modeling
ArtifactId

ArtifactId

org.kevoree.modeling.root
Last Version

Last Version

4.26.0
Release Date

Release Date

Type

Type

pom
Description

Description

Kevoree :: Modeling :: Root
Kevoree Modeling Framework
Source Code Management

Source Code Management

http://github.com/kevoree-modeling/framework.git

Download org.kevoree.modeling.root

How to add to project

<!-- https://jarcasting.com/artifacts/org.kevoree.modeling/org.kevoree.modeling.root/ -->
<dependency>
    <groupId>org.kevoree.modeling</groupId>
    <artifactId>org.kevoree.modeling.root</artifactId>
    <version>4.26.0</version>
    <type>pom</type>
</dependency>
// https://jarcasting.com/artifacts/org.kevoree.modeling/org.kevoree.modeling.root/
implementation 'org.kevoree.modeling:org.kevoree.modeling.root:4.26.0'
// https://jarcasting.com/artifacts/org.kevoree.modeling/org.kevoree.modeling.root/
implementation ("org.kevoree.modeling:org.kevoree.modeling.root:4.26.0")
'org.kevoree.modeling:org.kevoree.modeling.root:pom:4.26.0'
<dependency org="org.kevoree.modeling" name="org.kevoree.modeling.root" rev="4.26.0">
  <artifact name="org.kevoree.modeling.root" type="pom" />
</dependency>
@Grapes(
@Grab(group='org.kevoree.modeling', module='org.kevoree.modeling.root', version='4.26.0')
)
libraryDependencies += "org.kevoree.modeling" % "org.kevoree.modeling.root" % "4.26.0"
[org.kevoree.modeling/org.kevoree.modeling.root "4.26.0"]

Dependencies

test (1)

Group / Artifact Type Version
junit : junit jar 4.11

Project Modules

  • org.kevoree.modeling.microframework
  • org.kevoree.modeling.microframework.browser
  • org.kevoree.modeling.microframework.umd
  • org.kevoree.modeling.ast
  • org.kevoree.modeling.generator
  • org.kevoree.modeling.generator.standalone
  • org.kevoree.modeling.generator.mavenplugin
  • drivers/org.kevoree.modeling.microframework.drivers.leveldb
  • drivers/org.kevoree.modeling.microframework.drivers.rocksdb
  • drivers/org.kevoree.modeling.microframework.drivers.websocket
  • drivers/org.kevoree.modeling.microframework.drivers.mapdb
  • drivers/org.kevoree.modeling.microframework.drivers.redis
  • drivers/org.kevoree.modeling.microframework.drivers.mongodb
  • addons/org.kevoree.modeling.microframework.addons.blas
  • addons/org.kevoree.modeling.microframework.addons.kolyfill
  • addons/org.kevoree.modeling.microframework.addons.template
  • addons/org.kevoree.modeling.microframework.addons.swing
  • addons/org.kevoree.modeling.microframework.addons.graphview

What's new?

Versions:

The versioning strategy of KMF is lead by the version of the runtime. It means that the runtime version will have a version 4.<RUNTIME_VERSION>.<BUGFIX_VERSION>, like 4.26.4. According to that, all compatible addons with this runtime version will have a version 4.26.x according to corresponding addons version.

27.x

  • introducing indexes!
  • introducing with instanciation = "true" annotation
  • various fixes in the runtime such as bounds management

26.x

  • stable isomorphic compilation

The Kevoree Modeling Framework presentation

The Kevoree Modeling Framework (KMF) started as a research project to create an alternative to the Eclipse Modeling Framework (EMF). Like EMF, KMF is a modeling framework and code generation facility for building complex object-oriented applications based on structured data models. While EMF was primarily designed to support design-time models, KMF is specifically designed to support the [email protected] paradigm and targets runtime models. Runtime models of complex systems usually have high requirements regarding memory usage, runtime performance, and thread safety. KMF was specifically designed with this requirements in mind.

The border between large-scale data management systems and models is becoming less and less strict as [email protected] progressively gains maturity through large-scale and distribution mechanisms. Therefore, since its early days as an EMF alternative KMF evolved to a framework for efficient modeling (structuring), processing, and analyzing large-scale data. It enables models with millions of elements, which no longer must fit completely into main memory, and supports the distribution of models over thousands of nodes.

KMF provides developers a powerful toolset to model, structure, and reason about complex data (during design- and runtime), while still being a 'lightweight' framework trying to introduce as less overhead as possible. Advanced features like a notion of time, a native per object based versioning concept, distribution support, and easy-to-plug machine learning algorithms make KMF a powerful toolset for structuring, processing, and analyzing data. A main focus of KMF is on performance and scalability, which are often neglected to a great extend by modeling frameworks.

KMF supports the definition of formal meta models (inspired by Ecore) with a simple DSL and generates, based on this meta model definition, the necessary facilities to create and manipulate business objects (runtime entities). Code can be generated in different programming languages, currently we support Java and JavaScript. By using isomorphic models (models in different languages which use the same API) the same model can be used for example in a backend server and browser front-end.

For a more light-weight approach KMF also supports the definition of dynamic meta models, which can be defined and instantiated with a simple API - no formal definition and code generation step is necessary.

Design Principles and Features

As a main design principle KMF was from the beginning designed with strict memory usage, runtime performance, and thread safety requirements in mind. KMF takes efficiency seriously. This includes implementing custom versions of internal core data structures, like hash maps and red-black trees backed by primitive arrays, to improve performance and memory usage.
To cope at the same time with the large-scale, distributed, and constantly changing nature of modern applications the design of KMF combines ideas from reactive programming, peer-to-peer distribution, big data management, and machine learning. The distributed aspect of many modern applications lead to the decision to design a completely asynchronous core for KMF. Models are defined as observable streams of chunks that are exchanged between nodes in a peer-to-peer manner. A lazy loading strategy allows to transparently access the complete virtual model from every node, although chunks are actually distributed across nodes. Observers and automatic reloading of chunks enable a reactive programming style.

Features:

  • native support for temporal data and reasoning
  • asynchronous method calls
  • support for Java and JavaScript
  • code generation based on a meta model definition and dynamically instantiated meta models
  • easy-to-use API to traverse models
  • native mechanisms for distribution
  • native versioning of models on a per-object basis
  • ...

Core Modules:

Storage Addons:

Presentation Addons:

Advanced Computation Addons:

Publications:

Within the scope of the KMF project several research papers have been published:

Foundation papers:

  • Francois Fouquet, Gregory Nain, Brice Morin, Erwan Daubert, Olivier Barais, Noel Plouzeau, and Jean-Marc Jézéquel. An Eclipse Modelling Framework Alternative to Meet the Models@Runtime Requirements. In ASM/IEEE 15th Model Driven Engineering Languages ​​and Systems (MODELS'12), 2012. Get the paper here
  • Thomas Hartmann, Francois Fouquet, Gregory Nain, Jacques Klein, Brice Morin, and Yves Le Traon. Reasoning at runtime using time-distorted contexts: A [email protected] based approach. In 26th International Conference on Software Engineering and Knowledge Engineering (SEKE'14), 2014. Get the paper here
  • Thomas Hartmann, Francois Fouquet, Gregory Nain, Brice Morin, Jacques Klein, Olivier Barais, and Yves Le Traon. A Native Versioning Concept to Support Historized Models at Runtime. In ASM/IEEE 17th International Conference on Model Driven Engineering Languages ​​and Systems (MODELS'14), 2014. Get the paper here
  • Assaad Moawad, Thomas Hartmann, Francois Fouquet, Gregory Nain, Jacques Klein, and Johann Bourcier. A Model-Driven Approach for Simpler, Safer, and Evolutive Multi-Objective Optimization Development. In 3rd International Conference on Model-Driven Engineering and Software Development (MODELSWARD'15), 2015. Get the paper here
  • Thomas Hartmdann, Assaad Moawad, Francois Fouquet, Gregory Nain, Jacques Klein, and Yves Le Traon. Stream my Models: Reactive Peer-to-Peer Distributed [email protected]. Get the paper here.
  • Assaad Moawad, Thomas Hartmann, Francois Fouquet, Gregory Nain, Jacques Klein, and Yves Le Traon. Beyond Discrete Modeling: Continuous and Efficient [email protected] for IoT. Get the paper here.

Application papers:

  • Thomas Hartmann, Francois Fouquet, Jacques Klein, Gregory Nain, and Yves Le Traon. Reactive Security for Smart Grids Using [email protected] Simulation and Reasoning. In Second Open EIT ICT Labs Workshop on Smart Grid Security (SmartGridSec'14), 2014. Get the paper here
  • Thomas Hartmann, Francois Fouquet, Jacques Klein, and Yves Le Traon, Alexander Pelov, Laurent Toutain, and Tanguy Ropitault. Generating Realistic Smart Grid Communication Topologies Based on Real-Data. In IEEE 5th International Conference on Smart Grid Communications (SmartGridComm'14), 2014. Get the paper here
  • Thomas Hartmann, Assaad Moawad, Francois Fouquet, Yves Reckinger, Tejeddine Mouelhi, Jacques Klein, and Yves Le Traon. Suspicious Electric Consumption Detection Based on Multi-Profiling Using Live Machine Learning. In IEEE 6th International Conference on Smart Grid Communications (SmartGridComm'15), 2015. Get the paper here.
  • Thomas Hartmann, Assaad Moawad, Francois Fouquet, Yves Reckinger, Jacques Klein, Yves Le Traon. Near Real-Time Electric Load Approximation in Low Voltage Cables of Smart Grids with [email protected]. (will appear soon)

Getting started

Requirements

For impatient: the reflexive Quick and Dirty way

For long term project: custom api generation

TODO

Annotations

TODO

Traverse and Query data graph

From a graph object (aka KObject), a classical operation consist in traversing the graph to collect related information. For instance from a node, a developer can reach subNodes and subSubNodes and so on. KMF offers two consistent and optimized APIs to perform such operations:

  • KTraversal: typed, using the Java or JavaScript with a fluent API to declare the collecting behaviour.
  • Queries: untyped, using plain String an a pipe mechanism similar to UNIX pipe to declare collection and filter

Un a nutshell, Queries are textual version of the KTraversal API

TODO

Avoid callback hell using KDefer

All KMF methods are build around the common asynchronous principle. This means that all results will be given in a KCallback closure (or anonymous function in javascript). Chaining severals operations or collecting severals KObject trough different method calls can leads to a huge nested hierarchy of callback. To avoid this callback hell effect KMF introduces an API named KDefer. In a nutshell, KDefer are barrier object than can be created on demand from the model and able to wait and collector several asynchronous results. The API is death simple, you create a KDefer object and then from it you can create various callbacks that you can inject in various query methods for instance.

The following code snippet illustrates the use of this API in Java code:

KDefer myDefer = myModel.defer();
model.select("nodes[n=n1]", myDefer.waitResult());
model.select("nodes[n=n2]", myDefer.waitResult());

and similarly in JavaScript:

var myDefer = myModel.defer();
model.select("nodes[name=N1]", myDefer.waitResult());
model.select("nodes[name=N2]", myDefer.waitResult());

Once all necessary callbacks have injected, you can end the KDefer by giving the final KCallback that will be called once all results are ready:

Here is the example in Java:

myDefer.then(new KCallback<KObject[]>{
	void on(KObject[] objects){
		objects[0] //contains objects with name N0
		objects[1] //contains objects with name N1
	};
});

And similarly here is the example in JavaScript:

myDefer.then(function(objects){
	objects[0] //contains objects with name N0
	objects[1] //contains objects with name N1
});

Related work

Facebook relay

https://facebook.github.io/relay/

Netflix Falcor

http://netflix.github.io/falcor/

WithEve

http://witheve.com/

org.kevoree.modeling

Versions

Version
4.26.0
4.25.0
4.24.0
4.23.0
4.22.0
4.21.0
4.20.1
4.20.0
4.19.0
4.18.4
4.18.3
4.18.2
4.18.1
4.18.0
4.17.1
4.17.0
4.16.0
4.15.2
4.15.1
4.15.0
4.14.0
4.13.0
4.12.0
4.11.0
4.10.1
4.10.0
4.9.1
4.9.0
4.8.1
4.8.0
4.7.0
4.6.0
4.5.2
4.5.1
4.5.0
4.4.0
4.3.2
4.3.1
4.3.0
4.2.0
4.1.0
4.0.1
4.0.0
3.5.12
3.5.11
3.5.10
3.5.9
3.5.8
3.5.7
3.5.6
3.5.5
3.5.4
3.5.3
3.5.1
3.5.0
3.4.0
3.3.0
3.2.2
3.2.1
3.2.0
3.1.1
3.1.0
3.0.0
2.4.1
2.4.0
2.3.1
2.3.0
2.2.0
2.1.0
2.0.1
2.0.0
1.10.4
1.10.3
1.10.2
1.10.0
1.9.12
1.9.11
1.9.8
1.9.7
1.9.6
1.9.5
1.9.4
1.9.3
1.9.2
1.9.1
1.9.0
1.8.1
1.8.0
1.7.0
1.6.2
1.6.1
1.6.0
1.5.8
1.5.7
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.3.5
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.3.0-BETA5
1.3.0-BETA4
1.3.0-BETA3
1.3.0-BETA2