Presentation on how to chat with PDF using ChatGPT code interpreter
Building a Simple LIMS with the Eclipse Modeling Framework (EMF) ,my notebook
1. EMF Notebook
Pierre Lindenbaum
@yokofakun
http://plindenbaum.blogspot.com
September 10, 2013
Abstract
EMF (The Eclipse Modeling Framework) is a Java framework and
code generation facility for building tools and other applications based
on a structured model. Once you specify an EMF model, the EMF
generator can create a corresponding set of Java implementation classes.
In the following tutorial I’m going to generate a simple-and-stupid LIMS.
We’re going to create an interface for a simple-and-stupid LIMS.
1
2. • A laboratory contains a list of Families
• A laboratory contains a list of Sequencers
• a family contains a list of Individuals
• an Individual contains a list of Samples
• a Sequencer contains a list of Runs
• a Run contains a list of Sequenced which links to a Sample.
At the end of this tutorial, we’re going to generate the following heavy client
for our model:
1 Install the EMF plugins for Eclipse
see http://wiki.eclipse.org/EMF/Installation#Install_EMF.
2 Creating the Model
A model is created and defined in the Ecore format, which is basically a
sub-set of UML Class diagrams.
2
3. 2.1 Create the Project
• Open Eclipse
• Menu File → New → New Project... → Empty EMF Project
• Name the project EMF03-Model
2.2 Create the ECore model
create a new ’ECore’ file in the model folder in your new modeling project.
• Menu File → New → Other.. → ECore Model
• Wizard: select the folder EMF03-Model/model.
• Wizard: set the filename as lims.ecore.
• Wizard: set Model Object as EPackage.
• Menu Window → Show View → Other → Properties
An EPackage named Lims is created. The package contains 7 EClass and 1
EEnum(s). The EPackage Lims is defined as below:
Key Value
name Lims
nsURI http://univ-nantes.fr/lims/
nsPrefix lims
Next, were going to create the EEnum and the EClass:
• In the tree view right click on the node EPackage ”Lims” , create a new
EEnum and set the name property to ”Gender”.
• In the tree view right click on the node EPackage ”Lims” , create a new
EClass and set the name property to ”Family”.
• In the tree view right click on the node EPackage ”Lims” , create a new
EClass and set the name property to ”Laboratory”.
• In the tree view right click on the node EPackage ”Lims” , create a new
EClass and set the name property to ”Individual”.
• In the tree view right click on the node EPackage ”Lims” , create a new
EClass and set the name property to ”Sequencer”.
• In the tree view right click on the node EPackage ”Lims” , create a new
EClass and set the name property to ”Run”.
• In the tree view right click on the node EPackage ”Lims” , create a new
EClass and set the name property to ”Sample”.
3
4. • In the tree view right click on the node EPackage ”Lims” , create a new
EClass and set the name property to ”Sequenced”.
Then, we complete the structure of each classifier:
2.3 Gender
In the tree view, right-click on the node EEnum ”Gender” and add the
following 3 eLiterals:
Name Literal Value
UNKNOWN UNKNOWN
MALE MALE 1
FEMALE FEMALE 2
2.4 Family
In the tree view, select the node EClass ”Lims” and set the following prop-
erties:
Key Value
name Family
We add some structural features to the EClass ”Family”:
2.4.1 Family:name
In the tree view, right click on the node EClass ”Family” Create a new
EAttribute named ”name” and set its properties:
Key Value
name name
lowerBound 1
eType EString
2.4.2 Family:individuals
In the tree view, right click on the node EClass ”Family” Create a new
EReference named ”individuals” and set its properties:
Key Value
name individuals
upperBound -1 (unbounded)
eType -//Individual
containment true
eOpposite -//Individual/family
4
5. 2.4.3 Family:laboratory
In the tree view, right click on the node EClass ”Family” Create a new
EReference named ”laboratory” and set its properties:
Key Value
name laboratory
lowerBound 1
eType -//Laboratory
eOpposite -//Laboratory/families
2.5 Laboratory
In the tree view, select the node EClass ”Lims” and set the following prop-
erties:
Key Value
name Laboratory
We add some structural features to the EClass ”Laboratory”:
2.5.1 Laboratory:families
In the tree view, right click on the node EClass ”Laboratory” Create a
new EReference named ”families” and set its properties:
Key Value
name families
upperBound -1 (unbounded)
eType -//Family
containment true
eOpposite -//Family/laboratory
2.5.2 Laboratory:sequencers
In the tree view, right click on the node EClass ”Laboratory” Create a
new EReference named ”sequencers” and set its properties:
Key Value
name sequencers
upperBound -1 (unbounded)
eType -//Sequencer
containment true
eOpposite -//Sequencer/laboratory
5
6. 2.6 Individual
In the tree view, select the node EClass ”Lims” and set the following prop-
erties:
Key Value
name Individual
We add some structural features to the EClass ”Individual”:
2.6.1 Individual:gender
In the tree view, right click on the node EClass ”Individual” Create a new
EAttribute named ”gender” and set its properties:
Key Value
name gender
ordered false
unique false
lowerBound 1
eType -//Gender
defaultValueLiteral
2.6.2 Individual:family
In the tree view, right click on the node EClass ”Individual” Create a new
EReference named ”family” and set its properties:
Key Value
name family
unique false
lowerBound 1
eType -//Family
eOpposite -//Family/individuals
2.6.3 Individual:Father
In the tree view, right click on the node EClass ”Individual” Create a new
EReference named ”Father” and set its properties:
Key Value
name Father
eType -//Individual
6
7. 2.6.4 Individual:name
In the tree view, right click on the node EClass ”Individual” Create a new
EAttribute named ”name” and set its properties:
Key Value
name name
eType EString
2.6.5 Individual:Mother
In the tree view, right click on the node EClass ”Individual” Create a new
EReference named ”Mother” and set its properties:
Key Value
name Mother
eType -//Individual
2.6.6 Individual:samples
In the tree view, right click on the node EClass ”Individual” Create a new
EReference named ”samples” and set its properties:
Key Value
name samples
upperBound -1 (unbounded)
eType -//Sample
containment true
eOpposite -//Sample/individual
2.7 Sequencer
In the tree view, select the node EClass ”Lims” and set the following prop-
erties:
Key Value
name Sequencer
We add some structural features to the EClass ”Sequencer”:
7
8. 2.7.1 Sequencer:name
In the tree view, right click on the node EClass ”Sequencer” Create a new
EAttribute named ”name” and set its properties:
Key Value
name name
lowerBound 1
eType EString
2.7.2 Sequencer:runs
In the tree view, right click on the node EClass ”Sequencer” Create a new
EReference named ”runs” and set its properties:
Key Value
name runs
upperBound -1 (unbounded)
eType -//Run
containment true
eOpposite -//Run/sequencer
2.7.3 Sequencer:laboratory
In the tree view, right click on the node EClass ”Sequencer” Create a new
EReference named ”laboratory” and set its properties:
Key Value
name laboratory
lowerBound 1
eType -//Laboratory
eOpposite -//Laboratory/sequencers
2.8 Run
In the tree view, select the node EClass ”Lims” and set the following prop-
erties:
Key Value
name Run
We add some structural features to the EClass ”Run”:
8
9. 2.8.1 Run:name
In the tree view, right click on the node EClass ”Run” Create a new EAt-
tribute named ”name” and set its properties:
Key Value
name name
lowerBound 1
eType EString
2.8.2 Run:date
In the tree view, right click on the node EClass ”Run” Create a new EAt-
tribute named ”date” and set its properties:
Key Value
name date
unique false
eType EDate
2.8.3 Run:sequenced
In the tree view, right click on the node EClass ”Run” Create a new ERef-
erence named ”sequenced” and set its properties:
Key Value
name sequenced
upperBound -1 (unbounded)
eType -//Sequenced
containment true
eOpposite -//Sequenced/run
2.8.4 Run:sequencer
In the tree view, right click on the node EClass ”Run” Create a new ERef-
erence named ”sequencer” and set its properties:
Key Value
name sequencer
lowerBound 1
eType -//Sequencer
eOpposite -//Sequencer/runs
9
10. 2.9 Sample
In the tree view, select the node EClass ”Lims” and set the following prop-
erties:
Key Value
name Sample
We add some structural features to the EClass ”Sample”:
2.9.1 Sample:id
In the tree view, right click on the node EClass ”Sample” Create a new
EAttribute named ”id” and set its properties:
Key Value
name id
lowerBound 1
eType EString
2.9.2 Sample:individual
In the tree view, right click on the node EClass ”Sample” Create a new
EReference named ”individual” and set its properties:
Key Value
name individual
lowerBound 1
eType -//Individual
eOpposite -//Individual/samples
2.10 Sequenced
In the tree view, select the node EClass ”Lims” and set the following prop-
erties:
Key Value
name Sequenced
We add some structural features to the EClass ”Sequenced”:
10
11. 2.10.1 Sequenced:run
In the tree view, right click on the node EClass ”Sequenced” Create a new
EReference named ”run” and set its properties:
Key Value
name run
unique false
lowerBound 1
eType -//Run
eOpposite -//Run/sequenced
2.10.2 Sequenced:sample
In the tree view, right click on the node EClass ”Sequenced” Create a new
EReference named ”sample” and set its properties:
Key Value
name sample
unique false
lowerBound 1
eType -//Sample
All in one, the file lims.ecore looks like this:
1 <?xml version=” 1.0 ” encoding=”UTF−8”?>
2 <ecore:EPackage xmi:version=” 2.0 ”
3 xmlns:xmi=” http: //www. omg . org /XMI” xmlns:xsi=” http: //
www. w3 . org /2001/XMLSchema−instance ”
4 xmlns:ecore=” http: //www. e c l i p s e . org /emf/2002/ Ecore”
name=”Lims”
5 nsURI=” http: //univ−nantes . f r / lims /” nsPrefix=” lims ”>
6 <e C l a s s i f i e r s x s i : t y p e=”ecore:EEnum” name=”Gender”>
7 <e L i t e r a l s name=”UNKNOWN” l i t e r a l=”UNKNOWN”/>
8 <e L i t e r a l s name=”MALE” value=”1” l i t e r a l=”MALE”/>
9 <e L i t e r a l s name=”FEMALE” value=”2” l i t e r a l=”FEMALE”/>
10 </ e C l a s s i f i e r s>
11 <e C l a s s i f i e r s x s i : t y p e=” ecore:EClass ” name=”Family”>
12 <eStructuralFeatures x s i : t y p e=” ecore:EAttribute ” name
=”name” lowerBound=”1” eType=”ecore:EDataType
http: //www. e c l i p s e . org /emf/2002/ Ecore#//EString ”/>
13 <eStructuralFeatures x s i : t y p e=” ecore:EReference ” name
=” i n d i v i d u a l s ” upperBound=”−1”
14 eType=”#//Individual ” containment=” true ”
eOpposite=”#//Individual / family ”/>
11
12. 15 <eStructuralFeatures x s i : t y p e=” ecore:EReference ” name
=” laboratory ” lowerBound=”1”
16 eType=”#//Laboratory ” eOpposite=”#//Laboratory /
f a m i l i e s ”/>
17 </ e C l a s s i f i e r s>
18 <e C l a s s i f i e r s x s i : t y p e=” ecore:EClass ” name=” Laboratory ”
>
19 <eStructuralFeatures x s i : t y p e=” ecore:EReference ” name
=” f a m i l i e s ” upperBound=”−1”
20 eType=”#//Family” containment=” true ” eOpposite=”
#//Family/ laboratory ”/>
21 <eStructuralFeatures x s i : t y p e=” ecore:EReference ” name
=” sequencers ” upperBound=”−1”
22 eType=”#//Sequencer ” containment=” true ” eOpposite
=”#//Sequencer / laboratory ”/>
23 </ e C l a s s i f i e r s>
24 <e C l a s s i f i e r s x s i : t y p e=” ecore:EClass ” name=” Individual ”
>
25 <eStructuralFeatures x s i : t y p e=” ecore:EAttribute ” name
=” gender ” ordered=” f a l s e ”
26 unique=” f a l s e ” lowerBound=”1” eType=”#//Gender”
defaultValueLiteral=””/>
27 <eStructuralFeatures x s i : t y p e=” ecore:EReference ” name
=” family ” unique=” f a l s e ”
28 lowerBound=”1” eType=”#//Family” eOpposite=”#//
Family/ i n d i v i d u a l s ”/>
29 <eStructuralFeatures x s i : t y p e=” ecore:EReference ” name
=”Father” eType=”#//Individual ”/>
30 <eStructuralFeatures x s i : t y p e=” ecore:EAttribute ” name
=”name” eType=”ecore:EDataType http: //www. e c l i p s e .
org /emf/2002/ Ecore#//EString ”/>
31 <eStructuralFeatures x s i : t y p e=” ecore:EReference ” name
=”Mother” eType=”#//Individual ”/>
32 <eStructuralFeatures x s i : t y p e=” ecore:EReference ” name
=” samples ” upperBound=”−1”
33 eType=”#//Sample” containment=” true ” eOpposite=”
#//Sample/ individual ”/>
34 </ e C l a s s i f i e r s>
35 <e C l a s s i f i e r s x s i : t y p e=” ecore:EClass ” name=” Sequencer ”>
36 <eStructuralFeatures x s i : t y p e=” ecore:EAttribute ” name
=”name” lowerBound=”1” eType=”ecore:EDataType
http: //www. e c l i p s e . org /emf/2002/ Ecore#//EString ”/>
37 <eStructuralFeatures x s i : t y p e=” ecore:EReference ” name
=” runs ” upperBound=”−1” eType=”#//Run”
38 containment=” true ” eOpposite=”#//Run/ sequencer ”/>
12
13. 39 <eStructuralFeatures x s i : t y p e=” ecore:EReference ” name
=” laboratory ” lowerBound=”1”
40 eType=”#//Laboratory ” eOpposite=”#//Laboratory /
sequencers ”/>
41 </ e C l a s s i f i e r s>
42 <e C l a s s i f i e r s x s i : t y p e=” ecore:EClass ” name=”Run”>
43 <eStructuralFeatures x s i : t y p e=” ecore:EAttribute ” name
=”name” lowerBound=”1” eType=”ecore:EDataType
http: //www. e c l i p s e . org /emf/2002/ Ecore#//EString ”/>
44 <eStructuralFeatures x s i : t y p e=” ecore:EAttribute ” name
=” date ” unique=” f a l s e ” eType=”ecore:EDataType
http: //www. e c l i p s e . org /emf/2002/ Ecore#//EDate”/>
45 <eStructuralFeatures x s i : t y p e=” ecore:EReference ” name
=” sequenced ” upperBound=”−1”
46 eType=”#//Sequenced” containment=” true ” eOpposite
=”#//Sequenced/run”/>
47 <eStructuralFeatures x s i : t y p e=” ecore:EReference ” name
=” sequencer ” lowerBound=”1”
48 eType=”#//Sequencer ” eOpposite=”#//Sequencer / runs
”/>
49 </ e C l a s s i f i e r s>
50 <e C l a s s i f i e r s x s i : t y p e=” ecore:EClass ” name=”Sample”>
51 <eStructuralFeatures x s i : t y p e=” ecore:EAttribute ” name
=” id ” lowerBound=”1” eType=”ecore:EDataType http:
//www. e c l i p s e . org /emf/2002/ Ecore#//EString ”/>
52 <eStructuralFeatures x s i : t y p e=” ecore:EReference ” name
=” individual ” lowerBound=”1”
53 eType=”#//Individual ” eOpposite=”#//Individual /
samples ”/>
54 </ e C l a s s i f i e r s>
55 <e C l a s s i f i e r s x s i : t y p e=” ecore:EClass ” name=”Sequenced”>
56 <eStructuralFeatures x s i : t y p e=” ecore:EReference ” name
=”run” unique=” f a l s e ” lowerBound=”1”
57 eType=”#//Run” eOpposite=”#//Run/ sequenced ”/>
58 <eStructuralFeatures x s i : t y p e=” ecore:EReference ” name
=”sample” unique=” f a l s e ”
59 lowerBound=”1” eType=”#//Sample”/>
60 </ e C l a s s i f i e r s>
61 </ ecore:EPackage>
3 GenModel
We’re going to generate the Genmodel for our model. The Genmodel
contains additional information for the codegeneration, e.g. the path and file
13
14. information.
3.1 Create the GenModel Project
• Menu File → New → New Project... → EMF Generator Project
• Select the folder EMF03-Model/model
• Set the file name to lims.genmodel
• select a "Model Importer": "Ecore model"
• import the model ”URI: platform:/resource/EMF03/model/lims.ecore”
3.2 Edit the GenModel Project
In the tree view of the Genmodel, click on the root node and edit its
properties:
• set All → Runtime Platform → to ”RCP”.
click on the package node ’Lims’ and edit its properties:
• set All → BasePackage → to ”com.github.lindenb.lims”.
1 <?xml version=” 1.0 ” encoding=”UTF−8”?>
2 <genmodel:GenModel xmi:version=” 2.0 ”
3 xmlns:xmi=” http: //www. omg . org /XMI” xmlns:ecore=” http:
//www. e c l i p s e . org /emf/2002/ Ecore”
4 xmlns:genmodel=” http: //www. e c l i p s e . org /emf/2002/
GenModel” copyrightText=” Pierre Lindenbaum PhD
2013”
5 modelDirectory=”/EMF03/ src ” modelPluginID=”EMF03”
modelName=”Lims” importerID=” org . e c l i p s e . emf .
importer . ecore ”
6 complianceLevel=” 6.0 ” copyrightFields=” f a l s e ”
language=”en” classNamePattern=””
7 runtimePlatform=”RCP”>
8 <foreignModel>lims . ecore</ foreignModel>
9 <genPackages p r e f i x=”Lims” basePackage=”com . github .
lindenb . lims ” disposableProviderFactory=” true ”
10 ecorePackage=” lims . ecore#/”>
11 <genEnums typeSafeEnumCompatible=” f a l s e ” ecoreEnum=”
lims . ecore#//Gender”>
12 <genEnumLiterals ecoreEnumLiteral=” lims . ecore#//
Gender/UNKNOWN”/>
13 <genEnumLiterals ecoreEnumLiteral=” lims . ecore#//
Gender/MALE”/>
14
15. 14 <genEnumLiterals ecoreEnumLiteral=” lims . ecore#//
Gender/FEMALE”/>
15 </genEnums>
16 <genClasses ecoreClass=” lims . ecore#//Family”>
17 <genFeatures createChild=” f a l s e ” ecoreFeature=”
ecore:EAttribute lims . ecore#//Family/name”/>
18 <genFeatures property=”None” children=” true ”
createChild=” true ” ecoreFeature=”
ecore:EReference lims . ecore#//Family/ i n d i v i d u a l s
”/>
19 <genFeatures property=”None” no tify=” f a l s e ”
createChild=” f a l s e ” ecoreFeature=”
ecore:EReference lims . ecore#//Family/ laboratory ”
/>
20 </ genClasses>
21 <genClasses ecoreClass=” lims . ecore#//Laboratory ”>
22 <genFeatures property=”None” children=” true ”
createChild=” true ” ecoreFeature=”
ecore:EReference lims . ecore#//Laboratory /
f a m i l i e s ”/>
23 <genFeatures property=”None” children=” true ”
createChild=” true ” ecoreFeature=”
ecore:EReference lims . ecore#//Laboratory /
sequencers ”/>
24 </ genClasses>
25 <genClasses ecoreClass=” lims . ecore#//Individual ”>
26 <genFeatures createChild=” f a l s e ” ecoreFeature=”
ecore:EAttribute lims . ecore#//Individual / gender ”
/>
27 <genFeatures property=”None” no tify=” f a l s e ”
createChild=” f a l s e ” ecoreFeature=”
ecore:EReference lims . ecore#//Individual / family ”
/>
28 <genFeatures n otify=” f a l s e ” createChild=” f a l s e ”
propertySortChoices=” true ” ecoreFeature=”
ecore:EReference lims . ecore#//Individual /Father”
/>
29 <genFeatures createChild=” f a l s e ” ecoreFeature=”
ecore:EAttribute lims . ecore#//Individual /name”/>
30 <genFeatures n otify=” f a l s e ” createChild=” f a l s e ”
propertySortChoices=” true ” ecoreFeature=”
ecore:EReference lims . ecore#//Individual /Mother”
/>
31 <genFeatures property=”None” children=” true ”
createChild=” true ” ecoreFeature=”
ecore:EReference lims . ecore#//Individual / samples
15
16. ”/>
32 </ genClasses>
33 <genClasses ecoreClass=” lims . ecore#//Sequencer ”>
34 <genFeatures n otify=” f a l s e ” createChild=” f a l s e ”
propertyDescription=”” ecoreFeature=”
ecore:EAttribute lims . ecore#//Sequencer /name”/>
35 <genFeatures property=”None” children=” true ”
createChild=” true ” ecoreFeature=”
ecore:EReference lims . ecore#//Sequencer / runs ”/>
36 <genFeatures property=”None” no tify=” f a l s e ”
createChild=” f a l s e ” ecoreFeature=”
ecore:EReference lims . ecore#//Sequencer /
laboratory ”/>
37 </ genClasses>
38 <genClasses ecoreClass=” lims . ecore#//Run”>
39 <genFeatures createChild=” f a l s e ” ecoreFeature=”
ecore:EAttribute lims . ecore#//Run/name”/>
40 <genFeatures createChild=” f a l s e ” ecoreFeature=”
ecore:EAttribute lims . ecore#//Run/ date ”/>
41 <genFeatures property=”None” children=” true ”
createChild=” true ” ecoreFeature=”
ecore:EReference lims . ecore#//Run/ sequenced ”/>
42 <genFeatures property=”None” children=” true ”
createChild=” true ” ecoreFeature=”
ecore:EReference lims . ecore#//Run/ sequencer ”/>
43 </ genClasses>
44 <genClasses ecoreClass=” lims . ecore#//Sample”>
45 <genFeatures createChild=” f a l s e ” ecoreFeature=”
ecore:EAttribute lims . ecore#//Sample/ id ”/>
46 <genFeatures property=”None” no tify=” f a l s e ”
createChild=” f a l s e ” ecoreFeature=”
ecore:EReference lims . ecore#//Sample/ individual ”
/>
47 </ genClasses>
48 <genClasses ecoreClass=” lims . ecore#//Sequenced”>
49 <genFeatures n otify=” f a l s e ” createChild=” f a l s e ”
propertySortChoices=” true ” ecoreFeature=”
ecore:EReference lims . ecore#//Sequenced/run”/>
50 <genFeatures n otify=” f a l s e ” createChild=” f a l s e ”
propertySortChoices=” true ” ecoreFeature=”
ecore:EReference lims . ecore#//Sequenced/sample”/
>
51 </ genClasses>
52 </genPackages>
53 </genmodel:GenModel>
16
17. 4 Generating the code
In the tree view of the Genmodel, right click the root node: Generate All :
four new Eclipse plugins have been created:
• Model: contains the classes to create the instances of our model.
• EMF03.edit : classes to display a model in a UI (labels... )
• EMF03.editor: The editor plugin is a generated example editor to create
and modify instances of a model.
• EMF03.tests: The test plugin contains templates to write tests for a
model.
Here is an example of the interface com.github.lindenb.lims.Lims.Family
generated by EMF:
1 package com . github . l i n d e n b . l i m s . Lims ;
2
3 import org . e c l i p s e . emf . common . u t i l . EList ;
4
5 import org . e c l i p s e . emf . e c o r e . EObject ;
6
7 /∗∗
8 ∗ A r e p r e s e n t a t i o n o f t h e m o d e l o b j e c t ’<em><b>F a m i l y </b></em > ’.
9 ∗
10 ∗ The f o l l o w i n g f e a t u r e s a r e s u p p o r t e d :
11 ∗ <u l >
12 ∗ <l i >{ @ l i n k com . g i t h u b . l i n d e n b . l i m s . Lims . F a m i l y#g e t N a m e <em>Name</em>}</ l i >
13 ∗ <l i >{ @ l i n k com . g i t h u b . l i n d e n b . l i m s . Lims . F a m i l y# g e t I n d i v i d u a l s <em>I n d i v i d u a l s </
em>}</ l i >
14 ∗ <l i >{ @ l i n k com . g i t h u b . l i n d e n b . l i m s . Lims . F a m i l y# g e t L a b o r a t o r y <em>L a b o r a t o r y </em
>}</ l i >
15 ∗ </ u l >
16 ∗
17 ∗ @ s e e com . g i t h u b . l i n d e n b . l i m s . Lims . L i m s P a c k a g e# g e t F a m i l y ( )
18 ∗ @model
19 ∗ @ g e n e r a t e d
20 ∗/
21 public i n t e r f a c e Family extends EObject
22 {
23 /∗∗
24 ∗ R e t u r n s t h e v a l u e o f t h e ’<em><b>Name</b></em>’ a t t r i b u t e .
25 ∗ I f t h e m e a n i n g o f t h e ’<em>Name</em>’ a t t r i b u t e i s n ’ t c l e a r ,
26 ∗ t h e r e r e a l l y s h o u l d b e more o f a d e s c r i p t i o n h e r e . . .
27 ∗ @ r e t u r n t h e v a l u e o f t h e ’<em>Name</em>’ a t t r i b u t e .
28 ∗ @ s e e #s e t N a m e ( S t r i n g )
29 ∗ @ s e e com . g i t h u b . l i n d e n b . l i m s . Lims . L i m s P a c k a g e#g e t F a m i l y N a m e ( )
30 ∗ @model r e q u i r e d =” t r u e ”
31 ∗ @ g e n e r a t e d
32 ∗/
33 S t r i n g getName ( ) ;
34
35 /∗∗
36 ∗ S e t s t h e v a l u e o f t h e ’{ @ l i n k com . g i t h u b . l i n d e n b . l i m s . Lims . F a m i l y#g e t N a m e
<em>Name</em>}’ a t t r i b u t e .
37 ∗ @param v a l u e t h e new v a l u e o f t h e ’<em>Name</em>’ a t t r i b u t e .
38 ∗ @ s e e #g e t N a m e ( )
39 ∗ @ g e n e r a t e d
40 ∗/
41 void setName ( S t r i n g v a l u e ) ;
42
43 /∗∗
44 ∗ R e t u r n s t h e v a l u e o f t h e ’<em><b>I n d i v i d u a l s </b></em>’ c o n t a i n m e n t
r e f e r e n c e l i s t .
45 ∗ The l i s t c o n t e n t s a r e o f t y p e { @ l i n k com . g i t h u b . l i n d e n b . l i m s . Lims .
I n d i v i d u a l } .
46 ∗ I t i s b i d i r e c t i o n a l and i t s o p p o s i t e i s ’{ @ l i n k com . g i t h u b . l i n d e n b . l i m s .
Lims . I n d i v i d u a l # g e t F a m i l y <em>F a m i l y </em >} ’.
47 ∗ I f t h e m e a n i n g o f t h e ’<em>I n d i v i d u a l s </em>’ c o n t a i n m e n t r e f e r e n c e l i s t
i s n ’ t c l e a r ,
48 ∗ t h e r e r e a l l y s h o u l d b e more o f a d e s c r i p t i o n h e r e . . .
49 ∗ @ r e t u r n t h e v a l u e o f t h e ’<em>I n d i v i d u a l s </em>’ c o n t a i n m e n t r e f e r e n c e
l i s t .
50 ∗ @ s e e com . g i t h u b . l i n d e n b . l i m s . Lims . L i m s P a c k a g e# g e t F a m i l y I n d i v i d u a l s ( )
51 ∗ @ s e e com . g i t h u b . l i n d e n b . l i m s . Lims . I n d i v i d u a l # g e t F a m i l y
52 ∗ @model o p p o s i t e =” f a m i l y ” c o n t a i n m e n t =” t r u e ”
17
18. 53 ∗ @ g e n e r a t e d
54 ∗/
55 EList<I n d i v i d u a l > g e t I n d i v i d u a l s ( ) ;
56
57 /∗∗
58 ∗ R e t u r n s t h e v a l u e o f t h e ’<em><b>L a b o r a t o r y </b></em>’ c o n t a i n e r r e f e r e n c e
.
59 ∗ I t i s b i d i r e c t i o n a l and i t s o p p o s i t e i s ’{ @ l i n k com . g i t h u b . l i n d e n b . l i m s .
Lims . L a b o r a t o r y # g e t F a m i l i e s <em>F a m i l i e s </em >} ’.
60 ∗ I f t h e m e a n i n g o f t h e ’<em>L a b o r a t o r y </em>’ c o n t a i n e r r e f e r e n c e i s n ’ t
c l e a r ,
61 ∗ t h e r e r e a l l y s h o u l d b e more o f a d e s c r i p t i o n h e r e . . .
62 ∗ @ r e t u r n t h e v a l u e o f t h e ’<em>L a b o r a t o r y </em>’ c o n t a i n e r r e f e r e n c e .
63 ∗ @ s e e # s e t L a b o r a t o r y ( L a b o r a t o r y )
64 ∗ @ s e e com . g i t h u b . l i n d e n b . l i m s . Lims . L i m s P a c k a g e# g e t F a m i l y L a b o r a t o r y ( )
65 ∗ @ s e e com . g i t h u b . l i n d e n b . l i m s . Lims . L a b o r a t o r y # g e t F a m i l i e s
66 ∗ @model o p p o s i t e =” f a m i l i e s ” r e q u i r e d =” t r u e ” t r a n s i e n t =” f a l s e ”
67 ∗ @ g e n e r a t e d
68 ∗/
69 Laboratory g e t L a b o r a t o r y ( ) ;
70
71 /∗∗
72 ∗ S e t s t h e v a l u e o f t h e ’{ @ l i n k com . g i t h u b . l i n d e n b . l i m s . Lims . F a m i l y#
g e t L a b o r a t o r y <em>L a b o r a t o r y </em>}’ c o n t a i n e r r e f e r e n c e .
73 ∗ @param v a l u e t h e new v a l u e o f t h e ’<em>L a b o r a t o r y </em>’ c o n t a i n e r
r e f e r e n c e .
74 ∗ @ s e e # g e t L a b o r a t o r y ( )
75 ∗ @ g e n e r a t e d
76 ∗/
77 void s e t L a b o r a t o r y ( Laboratory v a l u e ) ;
78
79 } // F a m i l y
and the implementation of the interface: com.github.lindenb.lims.Lims.impl.FamilyImpl
:
1 package com . github . l i n d e n b . l i m s . Lims . impl ;
2
3 import com . github . l i n d e n b . l i m s . Lims . Family ;
4 import com . github . l i n d e n b . l i m s . Lims . I n d i v i d u a l ;
5 import com . github . l i n d e n b . l i m s . Lims . Laboratory ;
6 import com . github . l i n d e n b . l i m s . Lims . LimsPackage ;
7
8 import j a v a . u t i l . C o l l e c t i o n ;
9
10 import org . e c l i p s e . emf . common . n o t i f y . N o t i f i c a t i o n ;
11 import org . e c l i p s e . emf . common . n o t i f y . N o t i f i c a t i o n C h a i n ;
12
13 import org . e c l i p s e . emf . common . u t i l . EList ;
14
15 import org . e c l i p s e . emf . e c o r e . EClass ;
16 import org . e c l i p s e . emf . e c o r e . I n t e r n a l E O b j e c t ;
17
18 import org . e c l i p s e . emf . e c o r e . impl . E N o t i f i c a t i o n I m p l ;
19 import org . e c l i p s e . emf . e c o r e . impl . EObjectImpl ;
20
21 import org . e c l i p s e . emf . e c o r e . u t i l . EObjectContainmentWithInverseEList ;
22 import org . e c l i p s e . emf . e c o r e . u t i l . E c o r e U t i l ;
23 import org . e c l i p s e . emf . e c o r e . u t i l . I n t e r n a l E L i s t ;
24
25 /∗∗
26 ∗ An i m p l e m e n t a t i o n o f t h e m o d e l o b j e c t ’<em><b>F a m i l y </b></em > ’.
27 ∗ The f o l l o w i n g f e a t u r e s a r e i m p l e m e n t e d :
28 ∗ <u l >
29 ∗ <l i >{ @ l i n k com . g i t h u b . l i n d e n b . l i m s . Lims . i m p l . F a m i l y I m p l#g e t N a m e <em>Name</em
>}</ l i >
30 ∗ <l i >{ @ l i n k com . g i t h u b . l i n d e n b . l i m s . Lims . i m p l . F a m i l y I m p l# g e t I n d i v i d u a l s <em>
I n d i v i d u a l s </em>}</ l i >
31 ∗ <l i >{ @ l i n k com . g i t h u b . l i n d e n b . l i m s . Lims . i m p l . F a m i l y I m p l# g e t L a b o r a t o r y <em>
L a b o r a t o r y </em>}</ l i >
32 ∗ </ u l >
33 ∗
34 ∗ @ g e n e r a t e d
35 ∗/
36 public c l a s s FamilyImpl extends EObjectImpl implements Family
37 {
38 /∗∗
39 ∗ The d e f a u l t v a l u e o f t h e ’{ @ l i n k #g e t N a m e ( ) <em>Name</em>}’ a t t r i b u t e .
40 ∗ @ s e e #g e t N a m e ( )
41 ∗ @ g e n e r a t e d
42 ∗ @ o r d e r e d
43 ∗/
44 protected s t a t i c f i n a l S t r i n g NAME EDEFAULT = null ;
45
46 /∗∗
47 ∗ The c a c h e d v a l u e o f t h e ’{ @ l i n k #g e t N a m e ( ) <em>Name</em>}’ a t t r i b u t e .
48 ∗ @ s e e #g e t N a m e ( )
49 ∗ @ g e n e r a t e d
18
19. 50 ∗ @ o r d e r e d
51 ∗/
52 protected S t r i n g name = NAME EDEFAULT;
53
54 /∗∗
55 ∗ The c a c h e d v a l u e o f t h e ’{ @ l i n k # g e t I n d i v i d u a l s ( ) <em>I n d i v i d u a l s </em>}’
c o n t a i n m e n t r e f e r e n c e l i s t .
56 ∗ @ s e e # g e t I n d i v i d u a l s ( )
57 ∗ @ g e n e r a t e d
58 ∗ @ o r d e r e d
59 ∗/
60 protected EList<I n d i v i d u a l > i n d i v i d u a l s ;
61
62 /∗∗
63 ∗ @ g e n e r a t e d
64 ∗/
65 protected FamilyImpl ( )
66 {
67 super ( ) ;
68 }
69
70 /∗∗
71 ∗ @ g e n e r a t e d
72 ∗/
73 @Override
74 protected EClass e S t a t i c C l a s s ( )
75 {
76 return LimsPackage . L i t e r a l s .FAMILY;
77 }
78
79 /∗∗
80 ∗ @ g e n e r a t e d
81 ∗/
82 public S t r i n g getName ( )
83 {
84 return name ;
85 }
86
87 /∗∗
88 ∗ @ g e n e r a t e d
89 ∗/
90 public void setName ( S t r i n g newName)
91 {
92 S t r i n g oldName = name ;
93 name = newName ;
94 i f ( e N o t i f i c a t i o n R e q u i r e d ( ) )
95 e N o t i f y (new E N o t i f i c a t i o n I m p l ( this , N o t i f i c a t i o n . SET,
LimsPackage . FAMILY NAME, oldName , name ) ) ;
96 }
97
98 /∗∗
99 ∗ @ g e n e r a t e d
100 ∗/
101 public EList<I n d i v i d u a l > g e t I n d i v i d u a l s ( )
102 {
103 i f ( i n d i v i d u a l s == null )
104 {
105 i n d i v i d u a l s = new EObjectContainmentWithInverseEList<
I n d i v i d u a l >( I n d i v i d u a l . class , this , LimsPackage .
FAMILY INDIVIDUALS , LimsPackage . INDIVIDUAL FAMILY) ;
106 }
107 return i n d i v i d u a l s ;
108 }
109
110 /∗∗
111 ∗ @ g e n e r a t e d
112 ∗/
113 public Laboratory g e t L a b o r a t o r y ( )
114 {
115 i f ( eContainerFeatureID ( ) != LimsPackage .FAMILY LABORATORY) return
null ;
116 return ( Laboratory ) eContainer ( ) ;
117 }
118
119 /∗∗
120 ∗ @ g e n e r a t e d
121 ∗/
122 public N o t i f i c a t i o n C h a i n b a s i c S e t L a b o r a t o r y ( Laboratory newLaboratory ,
N o t i f i c a t i o n C h a i n msgs )
123 {
124 msgs = e B a s i c S e t C o n t a i n e r ( ( I n t e r n a l E O b j e c t ) newLaboratory ,
LimsPackage .FAMILY LABORATORY, msgs ) ;
125 return msgs ;
126 }
127
128 /∗∗
129 ∗ @ g e n e r a t e d
130 ∗/
131 public void s e t L a b o r a t o r y ( Laboratory newLaboratory )
132 {
19
20. 133 i f ( newLaboratory != e I n t e r n a l C o n t a i n e r ( ) | | ( eContainerFeatureID ( )
!= LimsPackage .FAMILY LABORATORY && newLaboratory != null ) )
134 {
135 i f ( E c o r e U t i l . i s A n c e s t o r ( this , newLaboratory ) )
136 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( ” R e c u r s i v e
containment not a l l o w e d f o r ” + t o S t r i n g ( ) ) ;
137 N o t i f i c a t i o n C h a i n msgs = null ;
138 i f ( e I n t e r n a l C o n t a i n e r ( ) != null )
139 msgs = eBasicRemoveFromContainer ( msgs ) ;
140 i f ( newLaboratory != null )
141 msgs = ( ( I n t e r n a l E O b j e c t ) newLaboratory ) . eInverseAdd (
this , LimsPackage . LABORATORY FAMILIES,
Laboratory . class , msgs ) ;
142 msgs = b a s i c S e t L a b o r a t o r y ( newLaboratory , msgs ) ;
143 i f ( msgs != null ) msgs . d i s p a t c h ( ) ;
144 }
145 e l s e i f ( e N o t i f i c a t i o n R e q u i r e d ( ) )
146 e N o t i f y (new E N o t i f i c a t i o n I m p l ( this , N o t i f i c a t i o n . SET,
LimsPackage .FAMILY LABORATORY, newLaboratory ,
newLaboratory ) ) ;
147 }
148
149 /∗∗
150 ∗ @ g e n e r a t e d
151 ∗/
152 @SuppressWarnings ( ” unchecked ” )
153 @Override
154 public N o t i f i c a t i o n C h a i n eInverseAdd ( I n t e r n a l E O b j e c t otherEnd , int f e a t u r e I D
, N o t i f i c a t i o n C h a i n msgs )
155 {
156 switch ( f e a t u r e I D )
157 {
158 case LimsPackage . FAMILY INDIVIDUALS :
159 return ( ( I n t e r n a l E L i s t <I n t e r n a l E O b j e c t >)(
I n t e r n a l E L i s t <?>) g e t I n d i v i d u a l s ( ) ) . basicAdd (
otherEnd , msgs ) ;
160 case LimsPackage .FAMILY LABORATORY:
161 i f ( e I n t e r n a l C o n t a i n e r ( ) != null )
162 msgs = eBasicRemoveFromContainer ( msgs ) ;
163 return b a s i c S e t L a b o r a t o r y ( ( Laboratory ) otherEnd , msgs
) ;
164 }
165 return super . eInverseAdd ( otherEnd , f e a t u r e I D , msgs ) ;
166 }
167
168 /∗∗
169 ∗ @ g e n e r a t e d
170 ∗/
171 @Override
172 public N o t i f i c a t i o n C h a i n eInverseRemove ( I n t e r n a l E O b j e c t otherEnd , int
f e a t u r e I D , N o t i f i c a t i o n C h a i n msgs )
173 {
174 switch ( f e a t u r e I D )
175 {
176 case LimsPackage . FAMILY INDIVIDUALS :
177 return ( ( I n t e r n a l E L i s t <?>) g e t I n d i v i d u a l s ( ) ) .
basicRemove ( otherEnd , msgs ) ;
178 case LimsPackage .FAMILY LABORATORY:
179 return b a s i c S e t L a b o r a t o r y ( null , msgs ) ;
180 }
181 return super . eInverseRemove ( otherEnd , f e a t u r e I D , msgs ) ;
182 }
183
184 /∗∗
185 ∗ @ g e n e r a t e d
186 ∗/
187 @Override
188 public N o t i f i c a t i o n C h a i n eBasicRemoveFromContainerFeature ( N o t i f i c a t i o n C h a i n
msgs )
189 {
190 switch ( eContainerFeatureID ( ) )
191 {
192 case LimsPackage .FAMILY LABORATORY:
193 return e I n t e r n a l C o n t a i n e r ( ) . eInverseRemove ( this ,
LimsPackage . LABORATORY FAMILIES, Laboratory .
class , msgs ) ;
194 }
195 return super . eBasicRemoveFromContainerFeature ( msgs ) ;
196 }
197
198 /∗∗
199 ∗ @ g e n e r a t e d
200 ∗/
201 @Override
202 public Object eGet ( int f e a t u r e I D , boolean r e s o l v e , boolean coreType )
203 {
204 switch ( f e a t u r e I D )
205 {
206 case LimsPackage . FAMILY NAME :
207 return getName ( ) ;
208 case LimsPackage . FAMILY INDIVIDUALS :
20
21. 209 return g e t I n d i v i d u a l s ( ) ;
210 case LimsPackage .FAMILY LABORATORY:
211 return g e t L a b o r a t o r y ( ) ;
212 }
213 return super . eGet ( f e a t u r e I D , r e s o l v e , coreType ) ;
214 }
215
216 /∗∗
217 ∗ @ g e n e r a t e d
218 ∗/
219 @SuppressWarnings ( ” unchecked ” )
220 @Override
221 public void e S e t ( int f e a t u r e I D , Object newValue )
222 {
223 switch ( f e a t u r e I D )
224 {
225 case LimsPackage . FAMILY NAME :
226 setName ( ( S t r i n g ) newValue ) ;
227 return ;
228 case LimsPackage . FAMILY INDIVIDUALS :
229 g e t I n d i v i d u a l s ( ) . c l e a r ( ) ;
230 g e t I n d i v i d u a l s ( ) . addAll ( ( C o l l e c t i o n <? extends
I n d i v i d u a l >)newValue ) ;
231 return ;
232 case LimsPackage .FAMILY LABORATORY:
233 s e t L a b o r a t o r y ( ( Laboratory ) newValue ) ;
234 return ;
235 }
236 super . e S e t ( f e a t u r e I D , newValue ) ;
237 }
238
239 /∗∗
240 ∗ @ g e n e r a t e d
241 ∗/
242 @Override
243 public void eUnset ( int f e a t u r e I D )
244 {
245 switch ( f e a t u r e I D )
246 {
247 case LimsPackage . FAMILY NAME :
248 setName (NAME EDEFAULT) ;
249 return ;
250 case LimsPackage . FAMILY INDIVIDUALS :
251 g e t I n d i v i d u a l s ( ) . c l e a r ( ) ;
252 return ;
253 case LimsPackage .FAMILY LABORATORY:
254 s e t L a b o r a t o r y ( ( Laboratory ) null ) ;
255 return ;
256 }
257 super . eUnset ( f e a t u r e I D ) ;
258 }
259
260 /∗∗
261 ∗ @ g e n e r a t e d
262 ∗/
263 @Override
264 public boolean e I s S e t ( int f e a t u r e I D )
265 {
266 switch ( f e a t u r e I D )
267 {
268 case LimsPackage . FAMILY NAME :
269 return NAME EDEFAULT == null ? name != null : !
NAME EDEFAULT. e q u a l s ( name ) ;
270 case LimsPackage . FAMILY INDIVIDUALS :
271 return i n d i v i d u a l s != null && ! i n d i v i d u a l s . isEmpty ( )
;
272 case LimsPackage .FAMILY LABORATORY:
273 return g e t L a b o r a t o r y ( ) != null ;
274 }
275 return super . e I s S e t ( f e a t u r e I D ) ;
276 }
277
278 /∗∗
279 ∗ @ g e n e r a t e d
280 ∗/
281 @Override
282 public S t r i n g t o S t r i n g ( )
283 {
284 i f ( eIsProxy ( ) ) return super . t o S t r i n g ( ) ;
285
286 S t r i n g B u f f e r r e s u l t = new S t r i n g B u f f e r ( super . t o S t r i n g ( ) ) ;
287 r e s u l t . append ( ” ( name : ” ) ;
288 r e s u l t . append ( name ) ;
289 r e s u l t . append ( ’ ) ’ ) ;
290 return r e s u l t . t o S t r i n g ( ) ;
291 }
292
293 } // F a m i l y I m p l
21
22. 5 Create a new eclipse product
• Menu File → New → Other... → Product Configuration
• Wizard: set parent folder: EMF03/model
• Wizard: set the file name: ”lims.product”.
• Wizard: Ask to create a basic config
Open the editor for ’lims.product”.
• in Overview/Product Definition/Product → create a new product .
Defining plugin :”EMF03”, product ID : ”lims”, Application : "EMF03.editor.LimsEditorEdito
• in Depedencies/Plugins and fragments: add EMF03, EMF03.edit, EMF03.editor
• check "include optional dependencies"
• click "Add required plug-in"
• in Lauching/Program Launcher set Launcher Name to ”lims”.
The content of the product file is displayed below:
1 <?xml version=” 1.0 ” encoding=”UTF−8”?>
2 <?pde version=” 3.5 ”?>
3
4 <product name=”Lims” uid=”LIMS” id=”EMF03. lims ”
application=”EMF03. editor . LimsEditorAdvisorApplication
” version=” 1 . 0 . 0 ” useFeatures=” f a l s e ” includeLaunchers
=” true ”>
5
6 <c o n f i g I n i use=” default ”>
7 </ c o n f i g I n i>
8
9 <launcherArgs>
10 <vmArgsMac>−XstartOnFirstThread −Dorg . e c l i p s e . swt .
i n t e r n a l . carbon . smallFonts</vmArgsMac>
11 </ launcherArgs>
12
13 <launcher name=” lims ”>
14 <s o l a r i s />
15 <win useIco=” f a l s e ”>
16 <bmp/>
17 </win>
18 </ launcher>
19
22
23. 20 <vm>
21 </vm>
22
23 <plugins>
24 <plugin id=”EMF03”/>
25 <plugin id=”EMF03. edit ”/>
26 <plugin id=”EMF03. editor ”/>
27 <plugin id=”com . ibm . icu ”/>
28 <plugin id=” javax . s e r v l e t ”/>
29 <plugin id=” javax . transaction ” fragment=” true ”/>
30 <plugin id=” org . e c l i p s e . ant . core ”/>
31 <plugin id=” org . e c l i p s e . core . commands”/>
32 <plugin id=” org . e c l i p s e . core . contenttype ”/>
33 <plugin id=” org . e c l i p s e . core . databinding ”/>
34 <plugin id=” org . e c l i p s e . core . databinding . observable
”/>
35 <plugin id=” org . e c l i p s e . core . databinding . property ”/
>
36 <plugin id=” org . e c l i p s e . core . expressions ”/>
37 <plugin id=” org . e c l i p s e . core . f i l e s y s t e m ”/>
38 <plugin id=” org . e c l i p s e . core . f i l e s y s t e m . linux . x86”
fragment=” true ”/>
39 <plugin id=” org . e c l i p s e . core . jobs ”/>
40 <plugin id=” org . e c l i p s e . core . resources ”/>
41 <plugin id=” org . e c l i p s e . core . runtime”/>
42 <plugin id=” org . e c l i p s e . core . runtime . compatibility .
auth”/>
43 <plugin id=” org . e c l i p s e . core . runtime . compatibility .
r e g i s t r y ” fragment=” true ”/>
44 <plugin id=” org . e c l i p s e . core . v a r i a b l e s ”/>
45 <plugin id=” org . e c l i p s e . emf . common”/>
46 <plugin id=” org . e c l i p s e . emf . common . ui ”/>
47 <plugin id=” org . e c l i p s e . emf . ecore ”/>
48 <plugin id=” org . e c l i p s e . emf . ecore . change”/>
49 <plugin id=” org . e c l i p s e . emf . ecore . xmi”/>
50 <plugin id=” org . e c l i p s e . emf . edit ”/>
51 <plugin id=” org . e c l i p s e . emf . edit . ui ”/>
52 <plugin id=” org . e c l i p s e . equinox . app”/>
53 <plugin id=” org . e c l i p s e . equinox . common”/>
54 <plugin id=” org . e c l i p s e . equinox . p2 . core ”/>
55 <plugin id=” org . e c l i p s e . equinox . p2 . engine ”/>
56 <plugin id=” org . e c l i p s e . equinox . p2 . metadata”/>
57 <plugin id=” org . e c l i p s e . equinox . p2 . metadata .
repository ”/>
58 <plugin id=” org . e c l i p s e . equinox . p2 . repository ”/>
59 <plugin id=” org . e c l i p s e . equinox . preferences ”/>
23
24. 60 <plugin id=” org . e c l i p s e . equinox . r e g i s t r y ”/>
61 <plugin id=” org . e c l i p s e . equinox . s e c u r i t y ”/>
62 <plugin id=” org . e c l i p s e . help ”/>
63 <plugin id=” org . e c l i p s e . j f a c e ”/>
64 <plugin id=” org . e c l i p s e . j f a c e . databinding ”/>
65 <plugin id=” org . e c l i p s e . j f a c e . text ”/>
66 <plugin id=” org . e c l i p s e . osgi ”/>
67 <plugin id=” org . e c l i p s e . osgi . s e r v i c e s ”/>
68 <plugin id=” org . e c l i p s e . swt”/>
69 <plugin id=” org . e c l i p s e . swt . gtk . linux . x86” fragment
=” true ”/>
70 <plugin id=” org . e c l i p s e . text ”/>
71 <plugin id=” org . e c l i p s e . ui ”/>
72 <plugin id=” org . e c l i p s e . ui . forms”/>
73 <plugin id=” org . e c l i p s e . ui . ide ”/>
74 <plugin id=” org . e c l i p s e . ui . views ”/>
75 <plugin id=” org . e c l i p s e . ui . workbench”/>
76 </ plugins>
77
78
79 </ product>
6 Generating the Eclipse Product
• File → Export → Eclipse Product .
• Set configuration : ”EMF03/model/lims.product” .
• Set the destination directory .
• Uncheck "Generate metadata repository" .
• "Finish"
Congratulations, your client has been generated.
7 Running the Lims editor
Go to the generated application directory and run:
$ cd /path/ to /GENERATED
$ ./ lims &
Here is a screenshot of the generated ’lims’ application:
24
25. Here is an example of a data file handled by the ’lims’ application:
1 <?xml version=” 1.0 ” encoding=”UTF−8”?>
2 <lims:Laboratory xmi:version=” 2.0 ” xmlns:xmi=” http: //www.
omg . org /XMI” xmlns:lims=” http: //univ−nantes . f r / lims /”>
3 <f a m i l i e s name=”Family1”>
4 <i n d i v i d u a l s name=” indi1 ”/>
5 <i n d i v i d u a l s Father=”// @families .0/ @individuals .0 ”
name=” indi2 ”>
6 <samples id=”CD00001”/>
7 </ i n d i v i d u a l s>
8 </ f a m i l i e s>
9 <sequencers name=”HiSeq”>
10 <runs name=”CD1786CXX”>
11 <sequenced sample=”// @families .0/ @individuals .1/
@samples .0 ”/>
12 </ runs>
13 </ sequencers>
14 <sequencers name=”miseq”>
15 <runs name=”CXX01”>
16 <sequenced sample=”// @families .0/ @individuals .1/
@samples .0 ”/>
17 </ runs>
18 </ sequencers>
19 </ lims:Laboratory>
That’s it,
Pierre
25