项目作者: i-BP

项目描述 :
Builder Of Emf Models
高级语言: Java
项目地址: git://github.com/i-BP/boem.git
创建时间: 2017-06-19T14:43:56Z
项目社区:https://github.com/i-BP/boem

开源协议:Eclipse Public License 1.0

下载


BOEM

Builder Of EMF Models

The aim of the BOEM library is to provide an API that eases the creation of EMF Model using XTend syntax. Using such syntax helps to:

  • Speed up the creation of tests
  • Improve the readability of the tests
  • Improve maintainability when the tested metamodel changes
  • Ease the creation of inter-connected models

It has been created and used in industrial project to ease the creation input for JUnit tests on the metamodel and business rules.

Installation

Install the feature BOEM Feature (fr.ibp.odv.boem.feature) from one of the following update sites:

1.0.0 Nightly Update Site

Usage

How to start

Create a BOEM factory

  1. extension BoemFactory factory = new BoemFactory(YourMM.eINSTANCE)

Use the keyword extension in order to use all public methods from the BOEM factory anywhere in your class

Import static APIs

  1. import static extension fr.ibp.odv.boem.lib.Boems.*

Examples

All the examples use the following metamodel:
BOEM Test Metamodel

How to create an element

  1. // Simple creation
  2. val model = A.build [
  3. name = "AName"
  4. ].buildTree

How to add children

  1. val model = A.build [
  2. name = "AName";
  3. // Single valued containment feature
  4. childNodeA = Node.build [
  5. name = "SingleChildName"
  6. ]
  7. // Adds one child
  8. childrenNodeA += Node.build [
  9. name = "ANodeName0"
  10. ]
  11. // Adds several children at once
  12. childrenNodeA += #[
  13. Node.build [
  14. name = "ANodeName1"
  15. ],
  16. Node.build [
  17. name = "ANodeName2"
  18. ]
  19. ]
  20. ].buildTree

How to add pointers to created objects

  1. val model = B.build [
  2. name = "AName"
  3. // Adds one child with reference
  4. childrenNodeA += "id0" >> Node.build [
  5. name = "ANodeName0"
  6. ]
  7. // Adds several children at once with references
  8. childrenNodeA += #[
  9. "id1" >> Node.build [
  10. name = "ANodeName1"
  11. ],
  12. "id2" >> Node.build [
  13. name = "ANodeName2"
  14. ]
  15. ]
  16. // Adds several children at once with references
  17. childrenNodeB += #[
  18. "id3" >> Node.build [
  19. name = "ANodeName3"
  20. ],
  21. "id4" >> Node.build [
  22. name = "ANodeName4"
  23. ]
  24. ]
  25. ].buildTree
  26. // Accessing node
  27. assertEquals("ANodeName0", model.access(Node, "id0").name)
  28. assertEquals("ANodeName1", model.access(Node, "id1").name)
  29. assertEquals("ANodeName2", model.access(Node, "id2").name)
  30. assertEquals(2, model.root.childrenNodeB.size)
  31. assertEquals("ANodeName3", model.access(Node, "id3").name)
  32. assertEquals("ANodeName4", model.access(Node, "id4").name)

You can even register an id provider against the BoemFactory. It will compute an id for each element (at build time) using your rules. For example:

  1. extension BoemFactory factory = new BoemFactory(BoemTestPackage.eINSTANCE).registerIdProvider([
  2. if (it instanceof NamedElement) {
  3. return it.name
  4. }
  5. return null
  6. ])
  7. //...
  8. val model = B.build [
  9. name = "AName"
  10. // Adds one child with reference
  11. childrenNodeA += Node.build [
  12. name = "ANodeName0"
  13. ]
  14. // Adds several children at once with references
  15. childrenNodeA += #[
  16. Node.build [
  17. name = "ANodeName1"
  18. ],
  19. Node.build [
  20. name = "ANodeName2"
  21. ]
  22. ]
  23. // Adds several children at once with references
  24. childrenNodeB += #[
  25. Node.build [
  26. name = "ANodeName3"
  27. ],
  28. Node.build [
  29. name = "ANodeName4"
  30. ]
  31. ]
  32. ].buildTree
  33. // Accessing node
  34. assertEquals("ANodeName0", model.access(Node, "ANodeName0").name)
  35. assertEquals("ANodeName1", model.access(Node, "ANodeName1").name)
  36. assertEquals("ANodeName2", model.access(Node, "ANodeName2").name)
  37. assertEquals(2, model.root.childrenNodeB.size)
  38. assertEquals("ANodeName3", model.access(Node, "ANodeName3").name)
  39. assertEquals("ANodeName4", model.access(Node, "ANodeName4").name)

You can also use a shorter syntax to access your elements

  1. val model = A.build [
  2. name = "AName"
  3. childrenNodeA += "id1" >> Node.build [
  4. name = "ANode"
  5. ]
  6. ].buildTree
  7. val target = model.access(Node, "id1");
  8. val target2 = ("id1" => model) as Node
  9. assertTrue(target2 == target)
  10. val target3 = model.access("id1")
  11. assertTrue(target3 == target)
  12. assertTrue(target == "id1" => model)

How to create references

  1. val it = A.build [
  2. name = "AName"
  3. autoContainementA += "id0" >> B.build [
  4. referenceNodeA = Node.buildRef("id1")
  5. ]
  6. childrenNodeA += "id1" >> Node.build [
  7. name = "ANode"
  8. ]
  9. ].buildTree

or with a shorter syntax

  1. val it = A.build [
  2. name = "AName"
  3. autoContainementA += "id0" >> B.build [
  4. referenceNodeA = Node << "id1"
  5. ]
  6. childrenNodeA += "id1" >> Node.build [
  7. name = "ANode"
  8. ]
  9. ].buildTree

How to update an element

  1. val model = A.build [
  2. autoContainementA += "B" >> B.build [
  3. autoContainementA += "D" >> C.build
  4. ]
  5. ].buildTree
  6. assertEquals(null, model.root.name)
  7. assertEquals(null, model.access(NamedElement, "B").name)
  8. assertEquals(null, model.access(A, "C").name)
  9. model.update [
  10. name = "NameA"
  11. autoContainementA.get(0).with [
  12. name = "NameB"
  13. autoContainementA.get(0).with [
  14. name = "NameD"
  15. ]
  16. ]
  17. ]
  18. assertEquals("NameA", model.root.name)
  19. assertEquals("NameB", model.access(B, "B").name)
  20. assertEquals("NameC", model.access(C, "C").name)
  21. model.access(B, "B").name = "NameB2"
  22. model.access(C, "C").name = "NameB2"
  23. assertEquals("NameB2", model.access(B, "B").name)
  24. assertEquals("NameC2", model.access(C, "C").name)

Presentations

Contributing

  1. Fork it!
  2. Create your feature branch: git checkout -b my-new-feature
  3. Commit your changes: git commit -am 'Add some feature'
  4. Push to the branch: git push origin my-new-feature
  5. Submit a pull request :smiley:

License

Eclipse Public License - v 1.0
Contribution guidelines for this project