diff --git a/_cmls/systematic-service-decomposition-tutorial-1.cml b/_cmls/systematic-service-decomposition-tutorial-1.cml
new file mode 100644
index 0000000..664b43d
--- /dev/null
+++ b/_cmls/systematic-service-decomposition-tutorial-1.cml
@@ -0,0 +1,48 @@
+BoundedContext CargoTracking {
+ Aggregate Cargo {
+ owner CargoPlaner
+
+ Entity Cargo {
+ aggregateRoot
+ - TrackingId trackingId
+ - Location origin
+ - RouteSpecification routeSpecification
+ - Itinerary itinerary
+ - Delivery delivery
+ }
+ /* shortened Aggregate here */
+ }
+ Aggregate Location {
+ owner Administrators
+
+ Entity Location {
+ aggregateRoot
+ - UnLocode unLocode
+ String name
+ }
+ /* shortened Aggregate here */
+ }
+ Aggregate Handling {
+ owner CargoTracker
+
+ DomainEvent HandlingEvent {
+ - HandlingEventType handlingEventType
+ - Voyage voyage
+ - Location location
+ Date completionTime
+ Date registrationTime
+ - Cargo cargo
+ }
+ /* shortened Aggregate here */
+ }
+ Aggregate Voyage {
+ owner VoyageManager
+
+ Entity Voyage {
+ aggregateRoot
+ - VoyageNumber voyageNumber
+ - Schedule schedule
+ }
+ /* shortened Aggregate here */
+ }
+}
diff --git a/_cmls/systematic-service-decomposition-tutorial-1.html b/_cmls/systematic-service-decomposition-tutorial-1.html
new file mode 100644
index 0000000..2e655e8
--- /dev/null
+++ b/_cmls/systematic-service-decomposition-tutorial-1.html
@@ -0,0 +1,49 @@
+
BoundedContext CargoTracking {
+ Aggregate Cargo {
+ owner CargoPlaner
+
+ Entity Cargo {
+ aggregateRoot
+ - TrackingId trackingId
+ - Location origin
+ - RouteSpecification routeSpecification
+ - Itinerary itinerary
+ - Delivery delivery
+ }
+ /* shortened Aggregate here */
+ }
+ Aggregate Location {
+ owner Administrators
+
+ Entity Location {
+ aggregateRoot
+ - UnLocode unLocode
+ String name
+ }
+ /* shortened Aggregate here */
+ }
+ Aggregate Handling {
+ owner CargoTracker
+
+ DomainEvent HandlingEvent {
+ - HandlingEventType handlingEventType
+ - Voyage voyage
+ - Location location
+ Date completionTime
+ Date registrationTime
+ - Cargo cargo
+ }
+ /* shortened Aggregate here */
+ }
+ Aggregate Voyage {
+ owner VoyageManager
+
+ Entity Voyage {
+ aggregateRoot
+ - VoyageNumber voyageNumber
+ - Schedule schedule
+ }
+ /* shortened Aggregate here */
+ }
+}
+
diff --git a/_cmls/systematic-service-decomposition-tutorial-2.cml b/_cmls/systematic-service-decomposition-tutorial-2.cml
new file mode 100644
index 0000000..e7c0591
--- /dev/null
+++ b/_cmls/systematic-service-decomposition-tutorial-2.cml
@@ -0,0 +1,19 @@
+UseCase ViewTracking {
+ reads "Cargo.trackingId", "HandlingEvent.type", "HandlingEvent.location", "HandlingEvent.completionTime", "Delivery.transportStatus", "Delivery.estimatedArrivalTime", "Delivery.misdirected", "Voyage.voyageNumber", "RouteSpecification.destination"
+}
+
+UseCase ViewCargos {
+ reads "Cargo.trackingId", "RouteSpecification.destination", "RouteSpecification.arrivalDeadline", "Delivery.routingStatus", "Itinerary.itineraryNumber"
+}
+
+UseCase BookCargo {
+ reads "Location.unLocode"
+ writes "Cargo.trackingId", "RouteSpecification.origin", "RouteSpecification.arrivalDeadline", "RouteSpecification.destination"
+}
+
+UseCase ChangeCargoDestination {
+ reads "Cargo.trackingId", "RouteSpecification.destination"
+ writes "RouteSpecification.destination"
+}
+
+/* we shortened this listing to save space (find all use cases in the original CML file) */
diff --git a/_cmls/systematic-service-decomposition-tutorial-2.html b/_cmls/systematic-service-decomposition-tutorial-2.html
new file mode 100644
index 0000000..c543cbd
--- /dev/null
+++ b/_cmls/systematic-service-decomposition-tutorial-2.html
@@ -0,0 +1,20 @@
+UseCase ViewTracking {
+ reads "Cargo.trackingId", "HandlingEvent.type", "HandlingEvent.location", "HandlingEvent.completionTime", "Delivery.transportStatus", "Delivery.estimatedArrivalTime", "Delivery.misdirected", "Voyage.voyageNumber", "RouteSpecification.destination"
+}
+
+UseCase ViewCargos {
+ reads "Cargo.trackingId", "RouteSpecification.destination", "RouteSpecification.arrivalDeadline", "Delivery.routingStatus", "Itinerary.itineraryNumber"
+}
+
+UseCase BookCargo {
+ reads "Location.unLocode"
+ writes "Cargo.trackingId", "RouteSpecification.origin", "RouteSpecification.arrivalDeadline", "RouteSpecification.destination"
+}
+
+UseCase ChangeCargoDestination {
+ reads "Cargo.trackingId", "RouteSpecification.destination"
+ writes "RouteSpecification.destination"
+}
+
+/* we shortened this listing to save space (find all use cases in the original CML file) */
+
diff --git a/_cmls/systematic-service-decomposition-tutorial-3.cml b/_cmls/systematic-service-decomposition-tutorial-3.cml
new file mode 100644
index 0000000..ee14fa4
--- /dev/null
+++ b/_cmls/systematic-service-decomposition-tutorial-3.cml
@@ -0,0 +1,28 @@
+BoundedContext CargoTracking {
+ Aggregate Cargo {
+ owner CargoPlaner
+
+ /* removed content here to save space */
+ }
+ Aggregate Location {
+ owner Administrators
+
+ /* removed content here to save space */
+ }
+ Aggregate Handling {
+ owner CargoTracker
+
+ /* removed content here to save space */
+ }
+ Aggregate Voyage {
+ owner VoyageManager
+
+ /* removed content here to save space */
+ }
+}
+
+/* team definitions: */
+BoundedContext CargoPlaner { type TEAM }
+BoundedContext CargoTracker { type TEAM }
+BoundedContext VoyageManager { type TEAM }
+BoundedContext Administrators { type TEAM }
diff --git a/_cmls/systematic-service-decomposition-tutorial-3.html b/_cmls/systematic-service-decomposition-tutorial-3.html
new file mode 100644
index 0000000..2847aed
--- /dev/null
+++ b/_cmls/systematic-service-decomposition-tutorial-3.html
@@ -0,0 +1,29 @@
+BoundedContext CargoTracking {
+ Aggregate Cargo {
+ owner CargoPlaner
+
+ /* removed content here to save space */
+ }
+ Aggregate Location {
+ owner Administrators
+
+ /* removed content here to save space */
+ }
+ Aggregate Handling {
+ owner CargoTracker
+
+ /* removed content here to save space */
+ }
+ Aggregate Voyage {
+ owner VoyageManager
+
+ /* removed content here to save space */
+ }
+}
+
+/* team definitions: */
+BoundedContext CargoPlaner { type TEAM }
+BoundedContext CargoTracker { type TEAM }
+BoundedContext VoyageManager { type TEAM }
+BoundedContext Administrators { type TEAM }
+
diff --git a/_data/docs.yml b/_data/docs.yml
index 024f8d3..06587fb 100644
--- a/_data/docs.yml
+++ b/_data/docs.yml
@@ -70,6 +70,7 @@
- event-storming
- event-sourcing-and-cqrs-modeling
- jhipster-microservice-generation
+ - systematic-service-decomposition
- title: IDE Plugins and Extensions
docs:
diff --git a/_docs/generators/service-cutter.md b/_docs/generators/service-cutter.md
index 37aa51f..7dc4dbd 100644
--- a/_docs/generators/service-cutter.md
+++ b/_docs/generators/service-cutter.md
@@ -12,48 +12,52 @@ For more information about Service Cutter we refer to its projects wiki and two
* [Service Cutter: A Systematic Approach to Service Decomposition (Paper)](https://link.springer.com/chapter/10.1007/978-3-319-44482-6_12)
* [Service Cutter: A Systematic Approach to Service Decomposition (HSR Bachelor Thesis)](https://eprints.hsr.ch/476/)
-
-
Note: The Service Cutter generators are not yet supported in our new Visual Studio Code extension. We continuously work on the extension and will support them soon! To use this generators you have to use the Eclipse plugin for now. You can find a feature support table for Eclipse and VS Code
here.
-
-
## User Guide
The following sections describe how to use the Service Cutter generators and create the input files for Service Cutter.
### Generate Entity Relationship Model File
Service Cutter uses an [Entity-Relationship Model](https://github.com/ServiceCutter/ServiceCutter/wiki/ERM) Diagram (ERD) file that contains entities and nanoentities to describe the applications structure as its first and mandatory input.
-We assume you have a CML file with your model in Eclipse (with our plugin installed). A right-click to the CML-file will guide you to a **Context Mapper** context menu. When selecting the action **Service Cutter: Generate Input File (JSON)**, you generate the Service Cutter ERD file in the required JSON format:
+We assume you have a CML file with your model in your IDE with Context Mapper installed. In the context menu of the editor you find the action **Generate Service Cutter Input (ERD as JSON)**. By running this command, you generate the Service Cutter ERD file in the required JSON format:

-
-Note that the Context Mapper menu entry is also available within the context menu uf the CML editor
-(right-click anywhere in the editor).
-
-
### Generate SCL File
The second input file for Service Cutter deals with additional *User representations*. Service Cutter takes them in JSON format, but there is some manual work required to create these file. Hence, we implemented another DSL which makes this step much easier. These files have the file extension `*.scl*` (for *Service Cutter Language*).
-A SCL file can be generated out of a CML file. Again, a right-click to the CML-file will open the **Context Mapper** context menu. You can initialize your SCL file with the action **Service Cutter: Initialize User Representations File (Exemplary)**:
+An SCL file can be generated out of a CML file. Again, a right-click in the CML editor will allow you to call the action **Generate Service Cutter User Representations (SCL)**:

-**Note:** The generated SCL file is a template that intends to help you by setting the structure expected by Service Cutter. The following generated parts are only examples, and
-will have to be adjusted:
+The SCL grammar allows you to describe all [user representations supported by Service Cutter](https://github.com/ServiceCutter/ServiceCutter/wiki/User-Representations):
+
+ * Entity Relationship Model (ERM)
+ * Use Cases
+ * Shared Owner Groups
+ * Aggregates
+ * Entities
+ * Predefined Services
+ * Separated Security Zones
+ * Security Access Groups
+ * Compatibilities
+
+Most of the user representations we derive from the CML model automatically. The ERM is derived from the Entities and their references in CML. The Use Cases and Shared Owner Groups can be modeled in CML as well (have a look at our [service decomposition tutorial](/docs/systematic-service-decomposition/)). We further derive the Aggregates and Entities for Service Cutter from the corresponding counterparts in CML. In addition, we derive Predefined Services from already existing Bounded Contexts of your CML model. The remaining user representations have to be described manually, in case they are relevant for your application.
+
+However, the generated SCL file already contains most of the representations:
- * **[Use Cases](https://github.com/ServiceCutter/ServiceCutter/wiki/Use-Cases)**
- * **All [Compatibilities](https://github.com/ServiceCutter/ServiceCutter/wiki/Compatibilities)**
- * **[Security Access Groups](https://github.com/ServiceCutter/ServiceCutter/wiki/Security-access-groups)**
- * **[Separated Security Zone](https://github.com/ServiceCutter/ServiceCutter/wiki/Separated-security-zones)**
- * **[Shared Owner Group](https://github.com/ServiceCutter/ServiceCutter/wiki/Shared-owner-groups)**
+
-The following elements are actually derived from the CML model and do not have to be changed:
+**Note:** The automatically derived user representations are overwritten if you call the generator again.
- * **[Aggregates](https://github.com/ServiceCutter/ServiceCutter/wiki/Aggregates)** (derived from your Aggregates in the CML file)
- * **[PredefinedService](https://github.com/ServiceCutter/ServiceCutter/wiki/Predefined-services)** (derived from your bounded contexts in the CML file)
+#### Examplary SCL File
+In case you want to add more user representations that are missing in the automatically generated ones, you can generate an exemplary SCL file that illustrates the syntax for all possible representations. Just call the **Generate Service Cutter User Representation Example File (SCL)** action to generate an example:
+
+
+
+**Note:** This generated SCL file is only exemplary and intended to help you setting up the structure in the actual SCL file generated in the step above.
### Generate User Representations JSON File
-Once you have prepared your SCL file, you can generate the corresponding JSON file with the action **Service Cutter: Generate User Representations File (JSON)** in the context menu:
+Once you have prepared your SCL file, you can generate the corresponding JSON file with the action **Generate Service Cutter User Representation JSON File** in the context menu:

@@ -67,3 +71,8 @@ Have fun with cutting your services :)
*Note:* Service Cutter has not been updated in a while, and only intended to demonstrate the possibilities of criteria-based graph clustering in the context of service decomposition (and establish a method and a first catalog of criteria). So do not expect mature, production-ready cuts to be suggested, but view them as a discussion and design workshop input. Further research is required to harden the approach; such research is ongoing (evidence: [40+ citations of the Service Cutter paper presented at ESOCC 2016](https://www.researchgate.net/publication/307873263_Service_Cutter_A_Systematic_Approach_to_Service_Decomposition)).

+
+## Further Links
+Note that you can also generate new service cuts in Context Mapper directly without using Service Cutter! We integrated the Service Cutter library into Context Mapper so that our users are able to generate new service decompositions out of CML models easily.
+
+ * Have a look at our [Systematic Service Decomposition with Context Mapper and Service Cutter](/docs/systematic-service-decomposition/) tutorial.
diff --git a/_docs/ide-plugins-and-extensions/ide-support.md b/_docs/ide-plugins-and-extensions/ide-support.md
index 4ce2b4a..90b2e76 100644
--- a/_docs/ide-plugins-and-extensions/ide-support.md
+++ b/_docs/ide-plugins-and-extensions/ide-support.md
@@ -3,41 +3,45 @@ title: Feature Support
permalink: /docs/ide/
---
-We currently offer Context Mapper for Visual Studio Code and Eclipse:
+We currently offer Context Mapper for [Visual Studio Code](https://code.visualstudio.com/), in the Online IDE [Gitpod](https://www.gitpod.io/), and [Eclipse](https://www.eclipse.org/):
* [Context Mapper for VS Code](https://marketplace.visualstudio.com/items?itemName=contextmapper.context-mapper-vscode-extension) (Marketplace)
+ * [Context Mapper Online (Gitpod)](/docs/online-ide/)
* [Context Mapper for Eclipse](https://marketplace.eclipse.org/content/context-mapper) (Marketplace)
Note: We have only recently published the VS Code extension and it does not support all the features yet. In case you need all the features, you have to work with Eclipse for now. We work on the VS code extension and hope to support all the features soon!
+Note: The Online IDE is based on our VS Code extension and supports the same features.
+
+
## Supported Features per IDE
The following table illustrates which features are already implemented in VS Code. Both IDEs shall support all features in the future.
-| Feature | Supported in Eclipse Plugin | Supported in VS Code Extension |
-|--------------------------------------------------------------|-----------------------------|--------------------------------|
-| Editor: Syntax Highlighting | yes | yes |
-| Editor: Auto-completion | yes | yes |
-| Editor: Hover texts with pattern descriptions | yes | no |
-| Editor: Semantic validators | yes | yes |
-| Graphical Context Map generator | yes | yes |
-| PlantUML generator | yes | yes |
-| MDSL generator | yes | yes |
-| Generic text file generator | yes | yes |
-| Service Cutter input file generators | yes | no |
-| New service cut generator | yes | no |
-| OOAD transformation: Derive Subdomain from user requirements | yes | yes |
-| OOAD transformation: Derive Bounded Context from Subdomains | yes | yes |
-| OOAD transformation: Derive frontend and backend systems | yes | no |
-| OOAD transformation: Split system context into subsystems | yes | no |
-| AR: "Split Aggregate by Entities" | yes | yes |
-| AR: "Split Bounded Context by Use Cases" | yes | yes |
-| AR: "Split Bounded Context by Owner" | yes | yes |
-| AR: "Extract Aggregates by Volatility" | yes | no |
-| AR: "Extract Aggregates by Cohesion" | yes | no |
-| AR: "Merge Aggregates" | yes | no |
-| AR: "Merge Bounded Contexts" | yes | no |
-| AR: "Extract Shared Kernel" | yes | no |
-| AR: "Suspend Partnership" | yes | no |
-| AR: "Change Shared Kernel to Partnership" | yes | no |
-| AR: "Change Partnership to Shared Kernel" | yes | no |
+| Feature | Supported in Eclipse Plugin | Supported in VS Code Extension (and online) |
+|--------------------------------------------------------------|-----------------------------|---------------------------------------------|
+| Editor: Syntax Highlighting | yes | yes |
+| Editor: Auto-completion | yes | yes |
+| Editor: Hover texts with pattern descriptions | yes | no |
+| Editor: Semantic validators | yes | yes |
+| Graphical Context Map generator | yes | yes |
+| PlantUML generator | yes | yes |
+| MDSL generator | yes | yes |
+| Generic text file generator | yes | yes |
+| Service Cutter input file generators | yes | yes |
+| New service cut generator | yes | yes |
+| OOAD transformation: Derive Subdomain from user requirements | yes | yes |
+| OOAD transformation: Derive Bounded Context from Subdomains | yes | yes |
+| OOAD transformation: Derive frontend and backend systems | yes | no |
+| OOAD transformation: Split system context into subsystems | yes | no |
+| AR: "Split Aggregate by Entities" | yes | yes |
+| AR: "Split Bounded Context by Use Cases" | yes | yes |
+| AR: "Split Bounded Context by Owner" | yes | yes |
+| AR: "Extract Aggregates by Volatility" | yes | no |
+| AR: "Extract Aggregates by Cohesion" | yes | no |
+| AR: "Merge Aggregates" | yes | no |
+| AR: "Merge Bounded Contexts" | yes | no |
+| AR: "Extract Shared Kernel" | yes | no |
+| AR: "Suspend Partnership" | yes | no |
+| AR: "Change Shared Kernel to Partnership" | yes | no |
+| AR: "Change Partnership to Shared Kernel" | yes | no |
diff --git a/_docs/service-cutter/context-map-suggestions.md b/_docs/service-cutter/context-map-suggestions.md
index 9711e72..2cd2bbd 100644
--- a/_docs/service-cutter/context-map-suggestions.md
+++ b/_docs/service-cutter/context-map-suggestions.md
@@ -8,10 +8,6 @@ to 14 prioritized [coupling criteria](https://github.com/ServiceCutter/ServiceCu
graph clustering algorithms to identify possible *service cuts*, which are returned as output. The approach was proposed by
[this paper](https://link.springer.com/chapter/10.1007/978-3-319-44482-6_12).
-
-
Note: This feature is not yet supported in our new Visual Studio Code extension. We continuously work on the extension and will support it soon! To use this feature you have to use the Eclipse plugin for now. You can find a feature support table for Eclipse and VS Code
here.
-
-
## Context Mapper Integration
We provide a [Service Cutter library](https://github.com/ContextMapper/service-cutter-library), which is a fork of the original
[Service Cutter](https://github.com/ServiceCutter/ServiceCutter), to be able to offer its structured decomposition approach in Context Mapper. The library allows you to generate
@@ -38,13 +34,13 @@ The following **preconditions** have to be fulfilled so that we are able to deri
Note that if the _Leung_ algorithm is used, the decompositions can be different every time the generator is called (it is a non-deterministic algorithm).
### Solver Configuration
-A dialog will allow you to configure the following inputs needed by Service Cutter:
+Once you generated your first service cut you will find a `.servicecutter.yml` file in the root directory of your project: (if you work with Eclipse you have to disable the _.* resources_ filter to see the file in the project/file/package explorer)
+
+
- * **The algorithm**: Currently we only provide one algorithm, but others are forseen to be added in future releases (note that the _Girvan-Newman_ algorithm supported by Service Cutter cannot be integrated into Context Mapper due to licence issues).
- * **Coupling criteria priorities**: You can customize the priority of each coupling criterion, as you can in Service Cutter.
- * **User representations (optional)**: The user representations can be provided with our SCL (Service Cutter Language) DSL. You can find out how to create/generate such a file [here](/docs/service-cutter/#generate-scl-file).
+In this file you can customize the priority of each coupling criterion, as you can in Service Cutter.
-
+The user representations can be provided with our SCL (Service Cutter Language) DSL. You can find out how to create/generate such a file [here](/docs/service-cutter/#generate-scl-file). However, calling the service cut generator, will create an SCL file for you automatically. You can adjust it and add more user representations afterwards. Checkout our [service decomposition tutorial](/docs/systematic-service-decomposition/) to see how this works.
### Example Result
When finishing the wizard illustrated above, Context Mapper will create a new CML file with a new decomposition suggestion. Note that the Leung algorithm is non-deterministic and will derive new decompositions every time you execute it.
@@ -53,7 +49,5 @@ This is *one* example decomposition generated for the

-*Known limitation*: Please note that the resulting model does not contain the original data types. We currently loose this information through the cutting process. However, the results still show how the entities are mapped to Bounded Contexts and how the single attributes are mapped to the entities.
-
## Service Cutter Input File Generators
-If you want to work with the original [Service Cutter](http://servicecutter.github.io/) tool, a [JHipster](https://www.jhipster.tech/) application, you can also use our [Service Cutter generators](/docs/service-cutter/) to derive the needed input files in the JSON format from your Context Map. Simply save them here (in Context Mapper) and upload them there (in the original Service Cutter).
+If you want to work with the original [Service Cutter](http://servicecutter.github.io/) tool, a [JHipster](https://www.jhipster.tech/) application, you can also use our [Service Cutter generators](/docs/service-cutter/) to derive the needed input files in the JSON format from your Context Map. Simply save them as JSON files (in Context Mapper) and upload them there (in the original Service Cutter). We also describe this in our [service decomposition tutorial](/docs/systematic-service-decomposition/).
diff --git a/_docs/tutorials/systematic-service-decomposition.md b/_docs/tutorials/systematic-service-decomposition.md
new file mode 100644
index 0000000..463cced
--- /dev/null
+++ b/_docs/tutorials/systematic-service-decomposition.md
@@ -0,0 +1,232 @@
+---
+title: Systematic Service Decomposition with Context Mapper and Service Cutter
+permalink: /docs/systematic-service-decomposition/
+image: /img/cm-og-image.png
+---
+
+Context Mapper provides a generator that decomposes your domain model into Bounded Contexts in a systematic manner. The service decomposition tool is based on [Service Cutter](https://github.com/ServiceCutter/ServiceCutter/). Based on a [catalog of 16 coupling criteria](https://github.com/ServiceCutter/ServiceCutter/wiki/Coupling-Criteria) and a graph clustering algorithm, the generator suggests how an application could be decomposed into Bounded Contexts, services, or components.
+
+Note that it is not our goal to automate the job of domain modelers and software architects! The generated decompositions are just suggestions and can give you hints how your domain objects are coupled. Don't expect that the perfect decomposition is generated for you without questioning it.
+
+This tutorial illustrates how you can use Service Cutter inside Context Mapper, or export your domain model for Service Cutter out of a CML file.
+
+## The Domain Model
+We use the [DDD sample application (Cargo Tracking)](https://github.com/citerus/dddsample-core) for this tutorial. As a first step, we modeled the domain of the application in CML. You can find the model [here](https://github.com/ContextMapper/context-mapper-examples/blob/master/src/main/cml/ddd-service-cutting-sample/DDD-Sample.cml).
+
+We modeled the domain inside one single Bounded Context. The context contains four Aggregates with its Entities and Value Objects:
+
+BoundedContext CargoTracking {
+ Aggregate Cargo {
+ owner CargoPlaner
+
+ Entity Cargo {
+ aggregateRoot
+ - TrackingId trackingId
+ - Location origin
+ - RouteSpecification routeSpecification
+ - Itinerary itinerary
+ - Delivery delivery
+ }
+ /* shortened Aggregate here */
+ }
+ Aggregate Location {
+ owner Administrators
+
+ Entity Location {
+ aggregateRoot
+ - UnLocode unLocode
+ String name
+ }
+ /* shortened Aggregate here */
+ }
+ Aggregate Handling {
+ owner CargoTracker
+
+ DomainEvent HandlingEvent {
+ - HandlingEventType handlingEventType
+ - Voyage voyage
+ - Location location
+ Date completionTime
+ Date registrationTime
+ - Cargo cargo
+ }
+ /* shortened Aggregate here */
+ }
+ Aggregate Voyage {
+ owner VoyageManager
+
+ Entity Voyage {
+ aggregateRoot
+ - VoyageNumber voyageNumber
+ - Schedule schedule
+ }
+ /* shortened Aggregate here */
+ }
+}
+
+
+The CML code above just gives you an impression how the model looks like but is shortened a lot. Find the complete model [here](https://github.com/ContextMapper/context-mapper-examples/blob/master/src/main/cml/ddd-service-cutting-sample/DDD-Sample.cml). The following PlantUML diagram (generated with Context Mapper) illustrates the domain model graphically:
+
+
+
+## Use Case Modeling
+With a Bounded Context definition as the one above you are already able to generate new service decompositions or Service Cutter files. However, we highly recommend the model your use cases as well, since they have a big impact on the ideal service decomposition.
+
+On the [User Requirements](/docs/user-requirements/) page of our language reference you can find out how use cases or user stories are modeled in CML. For this tutorial based on the DDD sample application we modeled the use cases provided by the [Service Cutter sample files](https://github.com/ServiceCutter/ServiceCutter/tree/master/Samples):
+
+UseCase ViewTracking {
+ reads "Cargo.trackingId", "HandlingEvent.type", "HandlingEvent.location", "HandlingEvent.completionTime", "Delivery.transportStatus", "Delivery.estimatedArrivalTime", "Delivery.misdirected", "Voyage.voyageNumber", "RouteSpecification.destination"
+}
+
+UseCase ViewCargos {
+ reads "Cargo.trackingId", "RouteSpecification.destination", "RouteSpecification.arrivalDeadline", "Delivery.routingStatus", "Itinerary.itineraryNumber"
+}
+
+UseCase BookCargo {
+ reads "Location.unLocode"
+ writes "Cargo.trackingId", "RouteSpecification.origin", "RouteSpecification.arrivalDeadline", "RouteSpecification.destination"
+}
+
+UseCase ChangeCargoDestination {
+ reads "Cargo.trackingId", "RouteSpecification.destination"
+ writes "RouteSpecification.destination"
+}
+
+/* we shortened this listing to save space (find all use cases in the original CML file) */
+
+
+Note that we only modeled the _read_ and _written_ nanoentities here. You can model the user requirements in much more detail in CML, but these two attributes are necessary for the Service Cutter generators and tools.
+
+The CML use cases or user stories will be mapped to the Service Cutter's [_Use Case_ definition](https://github.com/ServiceCutter/ServiceCutter/wiki/Use-Cases).
+
+## Define Owners (Teams)
+A Bounded Contexts is not necessarily a system or component. A team can constitute a Bounded Context as well. If you decompose a system you should respect existing teams (code and domain model owners) as well, since they have an influence to the coupling. In CML you can assign owners on the level of Aggregates.
+
+This might not make sense for the DDD sample application, as the domain model is not that big. However, we assigned the Aggregates to four different teams to illustrate how this is done:
+
+BoundedContext CargoTracking {
+ Aggregate Cargo {
+ owner CargoPlaner
+
+ /* removed content here to save space */
+ }
+ Aggregate Location {
+ owner Administrators
+
+ /* removed content here to save space */
+ }
+ Aggregate Handling {
+ owner CargoTracker
+
+ /* removed content here to save space */
+ }
+ Aggregate Voyage {
+ owner VoyageManager
+
+ /* removed content here to save space */
+ }
+}
+
+/* team definitions: */
+BoundedContext CargoPlaner { type TEAM }
+BoundedContext CargoTracker { type TEAM }
+BoundedContext VoyageManager { type TEAM }
+BoundedContext Administrators { type TEAM }
+
+
+The CML team assignments will be mapped to the Service Cutter's [_Shared Owner Group_ definition](https://github.com/ServiceCutter/ServiceCutter/wiki/Shared-owner-groups).
+
+## Additional User Representations
+Besides _Use Cases_ and _Shared Owner Groups_ Service Cutter uses additional user representations that may influence the coupling between your model elements. This is the list of [all supported user representations](https://github.com/ServiceCutter/ServiceCutter/wiki/User-Representations):
+
+ * Entity Relationship Model (ERM)
+ * Use Cases
+ * Shared Owner Groups
+ * Aggregates
+ * Entities
+ * Predefined Services
+ * Separated Security Zones
+ * Security Access Groups
+ * Compatibilities
+
+Most of the user representations we can now derive from our CML model. The ERM is derived from the Entities and their references in CML. As already explained above, the Use Cases and Shared Owner Groups are modeled in CML as well. We further derive the Aggregates and Entities for Service Cutter from the corresponding counterparts in CML. In addition, we derive Predefined Services from already existing Bounded Contexts of your CML model. The remaining user representations have to be added manually, in case they are relevant for your application.
+
+## The Service Cutter Configuration DSL (SCL)
+The Service Cutter tool takes the user representations as a JSON file. In order to ease the description of these representations we created another DSL. Once you created a CML model, you can easily derive an initial SCL file from it. You find two SCL generators in Context Mapper:
+
+
+
+The first generator ("Generate Service Cutter User Representations (SCL)") generates an SCL file that contains the user representations which can be derived from your CML model. You can enhance this file with additional user representations. However, the representations that can be derived from CML code will always be overwritten as soon as you call the generator again or if you generate new Service Cut's in Context Mapper.
+
+**Note:** If you update your CML model (for example you create a new Aggregate with new Entities), you can always call the SCL generator again and it will update your *.scl file.
+
+The second generator ("Generate Service Cutter User Representation Example File (SCL)") only generates an exemplary file that illustrates the SCL syntax. The generated user representations do not make sense and should not be used to generate Service Cut's! In this file you find syntactic examples for all potential user representations you can model:
+
+
+
+Now, having a CML and a SCL model, you have two options how you can proceed:
+
+ * Generate new service cut's in Context Mapper
+ * Analyze your model in [Service Cutter](https://github.com/ServiceCutter/ServiceCutter/)
+
+## Generate Service Cut's
+You can create new CML files with new service decompositions by calling "Generate New Service Cut":
+
+
+
+Note that the graph clustering algorithm that we currently support is non-deterministic, which means that each time you call the generator you may get a different result. However, you can generete multiple suggestions by calling the generator multiple times; it always create a new *.cml file containing a new service decomposition for your model:
+
+
+
+**Note:** The generator always uses the *.scl file with the same name your *.cml file has. For example: if you call the generator for a file called _mymodel.cml_, your SCL file must be called _mymodel.scl_ and it must be stored in the same directory. The SCL file generator already creates the file under the correct file name.
+
+**Note:** If you have not already created an SCL file as described above, the service cut generator will automatically create one for you.
+
+### Criteria Scoring
+Service Cutter allows you to score the individual coupling criteria. Thereby you can define which criteria are more important than others in your specific case. In case you use Service Cutter, you can control the scores on the user interface (see screenshot below). In case you use the service cut generator in Context Mapper, you have to change the scores in the `.servicecutter.yml` file. The file is automatically generated into the root folder of your project when you call the service cut generator for the first time:
+
+
+
+You can change the scoring in the _priorities_ part of the YAML file (see screenshot above). The following values are allowed: _IGNORE_, _XS_, _S_, _M_, _L_, _XL_, and _XXL_.
+
+**Note:** In case you work with Eclipse you have to ensure that the _.* resources_ filter is disabled in the project/file explorer (so that you can see the .servicecutter.yml file):
+
+
+
+## Analyze Model in Service Cutter
+Instead of generating new service cuts in Context Mapper, it is also possible to analyze the decompositions in Service Cutter. While Context Mapper generates new CML models, Service Cutter illustrates the graph clusterings graphically.
+
+To use Service Cutter you need the ERM and user representations as JSON files. Both can now easily be generated with Context Mapper.
+The ERM is generated out of the CML file...
+
+
+
+... and the user representations out of the SCL file:
+
+
+
+Now you can start Service Cutter and import the model to analyze it. You can start Service Cutter easily by cloning the repository and using Docker:
+
+```bash
+git clone git@github.com:ServiceCutter/ServiceCutter.git
+cd ServiceCutter
+docker-compose up
+```
+
+Once the application is up-and-running you can open it in your browser under http://localhost:8080 (user: admin, password: admin).
+Under the _System Specification_ tab you can upload the ERD file first, and then add the user representations:
+
+
+
+After you have imported the two files you can switch to the _Service Cuts_ tab and analyze different decompositions depending on the criteria scoring:
+
+
+
+## Summary
+In this tutorial we have shown how you can use Service Cutter to generate decomposition suggestions for your system modeled in CML. It is important to note that we only understand them as suggestions. They can help to analyze the coupling between objects in your domain model and therefore may help you in finding the right service decomposition and Bounded Contexts. Don't expect that the produced result is the best decomposition without questioning them seriously!
+
+For our DDD sample application we used the generated outputs to discover some parts of the domain model which seem to be loosely coupled from the rest. Concretely, we extracted a Bounded Context for the _Location_ Aggregate and one for the _Voyage_ Aggregate. You can find this CML model [here](https://github.com/ContextMapper/context-mapper-examples/blob/master/src/main/cml/ddd-sample/DDD-Sample-Stage-5.cml).
+
+To extract new Bounded Contexts according to the ideas you have developed by using Service Cutter you may use our [Architectural Refactorings](/docs/architectural-refactorings/). For example, you can extract Aggregates by using [AR-5: Extract Aggregates by Cohesion](/docs/ar-extract-aggregates-by-cohesion/).
+
+In order to present and discuss decomposition suggestions with your colleagues, you can use our [generators](/docs/generators/) to create graphical representations ([graphical Context Map](/docs/context-map-generator/) or [PlantUML diagrams](/docs/plant-uml/)) of the service decompositions.
diff --git a/_news/2020-07-28-v5.14.0-released.md b/_news/2020-07-28-v5.14.0-released.md
new file mode 100644
index 0000000..a6ebb58
--- /dev/null
+++ b/_news/2020-07-28-v5.14.0-released.md
@@ -0,0 +1,16 @@
+---
+layout: news
+title: "v5.14.0 Release Notes"
+author: Stefan Kapferer
+image: /img/cm-og-image.png
+---
+
+Today we released Context Mapper 5.14.0 🥳 This is a minor release which improves the structured service decomposition features based on [Service Cutter](https://github.com/ServiceCutter/ServiceCutter/).
+
+You can now generate new service cut's without losing the data types of all your Entity attributes. We further improved the [Service Cutter generators](/docs/service-cutter/): most of the user representations in the SCL file are now derived from your CML model automatically.
+
+In addition, all Service Cutter features in Context Mapper are now available in our [VS Code extension](/docs/vs-code/) 🙌
+
+Checkout our new [Systematic Service Decomposition with Context Mapper and Service Cutter](/docs/systematic-service-decomposition/) tutorial to learn how you can generate new service decompositions (or service cut's) in Context Mapper!
+
+As always, if you have any issues or other feedback, please [let us know](/getting-involved/).
diff --git a/img/service-cut-generator-config-file.png b/img/service-cut-generator-config-file.png
new file mode 100644
index 0000000..e137b09
Binary files /dev/null and b/img/service-cut-generator-config-file.png differ
diff --git a/img/service-cut-generator-context-menu.png b/img/service-cut-generator-context-menu.png
index c1dd15e..a35fea6 100644
Binary files a/img/service-cut-generator-context-menu.png and b/img/service-cut-generator-context-menu.png differ
diff --git a/img/service-cut-generator-ddd-sample-result.png b/img/service-cut-generator-ddd-sample-result.png
index da049ed..f6091cd 100644
Binary files a/img/service-cut-generator-ddd-sample-result.png and b/img/service-cut-generator-ddd-sample-result.png differ
diff --git a/img/service-cutter-input-generation-1.png b/img/service-cutter-input-generation-1.png
index fc6592e..ada78c5 100644
Binary files a/img/service-cutter-input-generation-1.png and b/img/service-cutter-input-generation-1.png differ
diff --git a/img/service-cutter-input-generation-2-1.png b/img/service-cutter-input-generation-2-1.png
new file mode 100644
index 0000000..bf18884
Binary files /dev/null and b/img/service-cutter-input-generation-2-1.png differ
diff --git a/img/service-cutter-input-generation-2-2.png b/img/service-cutter-input-generation-2-2.png
new file mode 100644
index 0000000..ce9c62e
Binary files /dev/null and b/img/service-cutter-input-generation-2-2.png differ
diff --git a/img/service-cutter-input-generation-2.png b/img/service-cutter-input-generation-2.png
index d44fe59..448396a 100644
Binary files a/img/service-cutter-input-generation-2.png and b/img/service-cutter-input-generation-2.png differ
diff --git a/img/service-cutter-input-generation-3.png b/img/service-cutter-input-generation-3.png
index 0f38e0d..068fb89 100644
Binary files a/img/service-cutter-input-generation-3.png and b/img/service-cutter-input-generation-3.png differ
diff --git a/img/service-cutter-input-generation-4.png b/img/service-cutter-input-generation-4.png
index 7fe0edd..f21d248 100644
Binary files a/img/service-cutter-input-generation-4.png and b/img/service-cutter-input-generation-4.png differ
diff --git a/img/systematic-service-decomposition-tutorial-ddd-sample-plantuml.png b/img/systematic-service-decomposition-tutorial-ddd-sample-plantuml.png
new file mode 100644
index 0000000..29fbdc5
Binary files /dev/null and b/img/systematic-service-decomposition-tutorial-ddd-sample-plantuml.png differ
diff --git a/img/systematic-service-decomposition-tutorial-eclipse-dot-file-filter.png b/img/systematic-service-decomposition-tutorial-eclipse-dot-file-filter.png
new file mode 100644
index 0000000..4606b43
Binary files /dev/null and b/img/systematic-service-decomposition-tutorial-eclipse-dot-file-filter.png differ
diff --git a/img/systematic-service-decomposition-tutorial-generate-erm-json.png b/img/systematic-service-decomposition-tutorial-generate-erm-json.png
new file mode 100644
index 0000000..32d4c61
Binary files /dev/null and b/img/systematic-service-decomposition-tutorial-generate-erm-json.png differ
diff --git a/img/systematic-service-decomposition-tutorial-generate-new-service-cut.png b/img/systematic-service-decomposition-tutorial-generate-new-service-cut.png
new file mode 100644
index 0000000..25b8082
Binary files /dev/null and b/img/systematic-service-decomposition-tutorial-generate-new-service-cut.png differ
diff --git a/img/systematic-service-decomposition-tutorial-generate-ur-json.png b/img/systematic-service-decomposition-tutorial-generate-ur-json.png
new file mode 100644
index 0000000..2ed5c50
Binary files /dev/null and b/img/systematic-service-decomposition-tutorial-generate-ur-json.png differ
diff --git a/img/systematic-service-decomposition-tutorial-multiple-generation-screenshot.png b/img/systematic-service-decomposition-tutorial-multiple-generation-screenshot.png
new file mode 100644
index 0000000..d7be4ff
Binary files /dev/null and b/img/systematic-service-decomposition-tutorial-multiple-generation-screenshot.png differ
diff --git a/img/systematic-service-decomposition-tutorial-scl-example-file.png b/img/systematic-service-decomposition-tutorial-scl-example-file.png
new file mode 100644
index 0000000..47acec3
Binary files /dev/null and b/img/systematic-service-decomposition-tutorial-scl-example-file.png differ
diff --git a/img/systematic-service-decomposition-tutorial-scl-menu-screenshot.png b/img/systematic-service-decomposition-tutorial-scl-menu-screenshot.png
new file mode 100644
index 0000000..e1339c2
Binary files /dev/null and b/img/systematic-service-decomposition-tutorial-scl-menu-screenshot.png differ
diff --git a/img/systematic-service-decomposition-tutorial-service-cuts-in-service-cutter.png b/img/systematic-service-decomposition-tutorial-service-cuts-in-service-cutter.png
new file mode 100644
index 0000000..b6ffb16
Binary files /dev/null and b/img/systematic-service-decomposition-tutorial-service-cuts-in-service-cutter.png differ
diff --git a/img/systematic-service-decomposition-tutorial-service-cutter-upload-files.png b/img/systematic-service-decomposition-tutorial-service-cutter-upload-files.png
new file mode 100644
index 0000000..2a825c3
Binary files /dev/null and b/img/systematic-service-decomposition-tutorial-service-cutter-upload-files.png differ
diff --git a/img/systematic-service-decomposition-tutorial-servicecutter-config-file.png b/img/systematic-service-decomposition-tutorial-servicecutter-config-file.png
new file mode 100644
index 0000000..c2a8c56
Binary files /dev/null and b/img/systematic-service-decomposition-tutorial-servicecutter-config-file.png differ