Restructured documentation files
[Mograsim.git] / docs / development_environment.md
diff --git a/docs/development_environment.md b/docs/development_environment.md
new file mode 100644 (file)
index 0000000..041c6a2
--- /dev/null
@@ -0,0 +1,246 @@
+# Mograsim Development Environment
+
+<span style="color:grey">_Mograsim Development Documentation Version 0.3 --- 2019-09-27_</span>
+
+A short guide to the Mograsim Maven Tycho configuration and Maven Tycho in general, 
+as well as some information on Eclipse Plugin Development and OSGi.
+
+
+## Maven Tycho
+
+[Maven Tycho](https://www.eclipse.org/tycho/sitedocs/index.html) is a plugin for 
+[Maven](http://maven.apache.org) that allows building Eclipse and OSGi Projects comfortably 
+and automatically using Maven.
+
+Useful links:
+- [eclipse.org/tycho](https://www.eclipse.org/tycho/)
+- [wiki.eclipse.org/Category:Tycho](https://wiki.eclipse.org/Category:Tycho)
+- [vogella.com/tutorials/EclipseTycho](https://www.vogella.com/tutorials/EclipseTycho/article.html)
+- [eclipse.org/tycho/sitedocs](https://www.eclipse.org/tycho/sitedocs/index.html)
+- [Tycho pomless sources](https://git.eclipse.org/c/tycho/org.eclipse.tycho.extras.git/tree/tycho-pomless/src/main/java/org/eclipse/tycho/pomless) 
+  (see *Mapping for naming and other conventions, TychoAggregatorMapping for folders)
+
+## OSGi
+
+OSGi is a module system for Java (completely unrelated to the Java 9 Jigsaw module 
+system) that allows detailed control over modules, dependencies, versions and more. 
+The file associated with OSGi here is a specific MANIFEST.MF in the META-INF directory 
+of each project.
+
+Roughly, an OSGi bundle has:
+- a **symbolic name** that acts as an identifier, therefore it should be unique and 
+  must not be changed, otherwise it a large portion of the configuration would break. 
+  Never change that field after distribution.
+- a **bundle name** and **bundle vendor**; this is only for the users and developers 
+  and is not constrained in any way. You can change that, but it should be consistent 
+  across all Mograsim modules. Both can be externalized to
+- a **bundle version** that denotes current the version of the bundle. The `qualifier` 
+  is replaced during the build process with a timestamp of the format `YYYYMMDDhhmmss`. 
+  The version itself can be set using the maven tycho version plugin, which replaces 
+  not only the maven versions, but all (equivalent) versions in the MANIFEST as well.
+- a **bundle required execution environment** (abbr. BREE) where the bundle's *minimal* 
+  JDK version is set. This is also the one eclipse uses and displays as JRE System 
+  Library in the Eclipse projects.<br> This should be the same as the one the target 
+  definition used for the build and the same that maven is run with ( -> check the 
+  Run Configuration)
+
+## Eclipse Plugins
+
+- Short explanation of the different names and terms used in Eclipse Plugin Dev, 
+  and short introduction to the different mechanisms used.
+
+## Mograsim Structure
+
+The tree of Mograsim projects:
+
+- `plugins` - _This contains all bundles/plugins that provide functionality to Mograsim_
+    - **net.mograsim.logic.core** <br> The core logic for pure simulation. This contains 
+      the most important low-level logic circuits and gates and defines how that 
+      logic gets simulated. The underlying system for simulation in Mograsim is an 
+      event based approach (see `Timeline`), using VHDL-like logic defined in `Bit` 
+      and `BitVector`. More complex ciruits are build out of `Wire`s connecting `Component`s.
+    - **net.mograsim.logic.model** <br>The model describes how that core logic is 
+      displayed and arranged, and allows (de-)serialization to JSON. The core logic 
+      model gets generated based on this. Every basic net.mograsim.logic.core Component 
+      has a model equivalent here that represents it in the GUI and persisted state 
+      (JSON).
+    - **net.mograsim.logic.model.editor** <br> This bundle contains a standalone 
+      SWT-based editor to edit Mograsim JSON-models in a comfortable way. It can 
+      be used to create a new `SubmodelComponent` by arranging existing ones to a 
+      new component. Note that editing and simulation are entirely different processes 
+      in Mograsim, the editor cannot simulate and a running simulation cannot be 
+      edited. (At least in the current state)
+    - **net.mograsim.logic.model.am2900** <br> This plugin contains a model for the 
+      AMD Am2900 Family Microprocessors arranged into a microprogrammable model. 
+      This can be used in the microprogram editor of the Mograsim plugin and in the 
+      Mograsim assembler editor (by using a properly set up instruction set). We 
+      took care that the plugin is independent, meaning that it only provides an 
+      implementation for an extension point of the net.mograsim.machine plugin and 
+      no other Mograsim depends on it.<br> This is also the way to go if you want 
+      to add your own machine definitions to Mograsim and use them there.
+    - **net.mograsim.machine** <br> The machine plugin defines an extension point 
+      that can be extended and implemented in other (your own) plugins to provide 
+      new machines to Mograsim. In addition to the extension point and the most important 
+      interfaces, it contains some commonly required or useful components to build/define 
+      another machine. net.mograsim.logic.model.am2900 for example is such an extension. 
+      The machine plugin itself scans for all available implementations of the interface 
+      given by the extension point, and other parts of the Mograsim plugin get access 
+      to them that way.
+    - **net.mograsim.plugin.core** <br> This is - as the name says - the core plugin 
+      of mograsim. Here lie all the Eclipse Platform specific parts that make Mograsim 
+      as an Eclipse plugin work. This includes the different editors, view, settings 
+      and other functional extension to the Eclipse IDE.
+    - **net.mograsim.plugin.core.nl_de** <br> This optional plugin provides a German 
+      localization for Mograsim.
+    - **net.mograsim.plugin.branding** <br> This contains elements for branding the 
+      feature plugin, and additional resources and raw files (original logo and icon 
+      in SVG and Adobe Illustrator and similar).
+    - **net.mograsim.plugin.docs** <br> The Plugin providing the user documentation.
+    - **net.mograsim.preferences** <br> A plugin for managing and accessing preferences.
+- `features` - _This contains all Mograsim feature plugins_
+    - **net.mograsim.feature** <br> The Mograsim feature plugin, containing all the 
+      plugins above and combining them into a feature. A feature is a plugin collection 
+      with additional properties that allows for easy installation by the end user. 
+      For this purpose, it also contains license information, authors, updatesite 
+      location (allows eclipse to automatically check if updates are available) and 
+      more.
+- `products` - _This contains standalone Mograsim product(s)_
+    - **net.mograsim.product** <br> A product can be pretty much anything (see Eclipse 
+      RCP), in our case, this is simply a pre-configured Eclipse package, comparable 
+      to the packages located at [www.eclipse.org/downloads/packages](https://www.eclipse.org/downloads/packages/).
+- `releng` - _Abbreviation for **Rel**ease **Eng**ineering, contains important configuration_
+    - **net.mograsim.configuration** <br> This contains the configuration for the 
+      Mograsim project and the build in particular. The central Maven configuration 
+      is located here in a single `pom.xml`, that is the super-parent of all others, 
+      including the generated ones.
+    - **net.mograsim.updatesite** <br> This updatesite project collects features 
+      in form of an update site that can be accessed by Eclipse to install new features 
+      or update features. The features are grouped into categories which can come 
+      with further descriptions. The `target/repository/` is the part of the whole 
+      Mograsim project that actually gets deployed. By using Help -> Install New 
+      Software -> Add -> Local, the `repository`-folder can be selected and features 
+      can be installed offline, e.g. to test them.
+    - **net.mograsim.target** <br> The target definition for the build. This is a 
+      well-defined environment that we expect the plugins to work in/with. That includes 
+      all plugin dependencies (like all plugins the Eclipse Platform is comprised 
+      of) and the (minimum) JRE that is expected. Some plugins exclusively for testing 
+      are included here, too.
+- `tests` - _This contains (integration-like) tests in form of plugin fragments_
+    - **net.mograsim.logic.core.tests**
+    - **net.mograsim.logic.model.am2900.tests**
+    - **net.mograsim.machine.tests**
+- `SWTHelper` - _This contains the [SWTHelper](https://github.com/Haspamelodica/SWTHelper) 
+  git submodule._
+    - `bundles` - _This submodule folder needs to be named like that for Tycho pom-less 
+      build to work._
+        - **SWTInput** - Contains type specific input fields for SWT.
+        - **SWTObjectWrappers** - SWT object abstractions to enable zooming and optimizations.
+        - <span style="color:grey">_SWTSystemInOutApplication_</span> - _unused_
+        - <span style="color:grey">_SWTTiledZoomableCanvas_</span> - _unused_
+        - **SWTZoomableCanvas** - The SWT canvas we draw the simulation in.
+
+## Build Mograsim
+
+Use the main aggregator `pom.xml` next to this markdown file to build mograsim, take 
+care to use the correct JDK to run it (see Run Configuration).
+
+A short guide to the [Maven goals (Maven Lifecycle)](https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html):
+- The `clean` goal will remove all `target`-folders and other generated files like 
+  flattened poms and polyglot build artifacts (all are listed in `.gitignore`).
+- The `validate` goal is useful to simply check if the setup itself (Maven Tycho) 
+  is ok and everything needed is available.
+- The `integration-test` goal will run the test plugins, the `test` goal beforehand 
+  **will not.**
+- I recommend running `clean verify` or `verify`, this will do everything up to and 
+  including the testing.
+
+Please note that Tycho 1.5.0 is not released yet, and thus requires a workaround. 
+More information can be found under [Maven Core Extension Problems](#mceps).
+
+## Challenges
+
+Not everything is as simple as it seems at first glance.
+
+### Maven Core Extension Problems <a name="mceps"></a>
+
+The Tycho extra `tycho-pomless` is a Maven core extension allows for simpler structure 
+and less redundancy. Maven core extensions must be available at [the central maven repository](http://repo.maven.apache.org/maven2/) 
+(or already in the local repository), you cannot specify an alternative remote repository 
+in `.mvn/extensions.xml`. If a core extension cannot be resolved, you will get currently 
+(Maven 3.6.2) only a warning like
+
+> [WARNING] The POM for org.eclipse.tycho.extras:tycho-pomless:jar:1.5.0-SNAPSHOT is missing, no dependency information available
+
+This means that the extension was not found, and it cannot be used, which leads to 
+a failure later on. To get around that, create a dummy pom that only serves the purpose 
+to "request" and resolve the extension:
+
+```xml
+<project .. bla .. bla ..>
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>net.mograsim</groupId>
+    <artifactId>net.mograsim.tycho-download</artifactId>
+    <version>1.0.0</version>
+    <packaging>pom</packaging>
+
+    <pluginRepositories>
+        <!-- currently necessary because we are using a SNAPSHOT build of tycho -->
+        <pluginRepository>
+            <id>tycho-snapshots</id>
+            <url>https://repo.eclipse.org/content/repositories/tycho-snapshots/</url>
+            <releases>
+                <enabled>true</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+                <updatePolicy>always</updatePolicy>
+            </snapshots>
+        </pluginRepository>
+    </pluginRepositories>
+
+    <build>
+        <extensions>
+            <extension>
+                <groupId>org.eclipse.tycho.extras</groupId>
+                <artifactId>tycho-pomless</artifactId>
+                <version>1.5.0-SNAPSHOT</version>
+            </extension>
+        </extensions>
+    </build>
+</project>
+``` 
+While that this is not the most compact way, it can be run by the developer and build 
+server equally easy and does not require special CLI knowledge. As developer, you 
+need to run that only once (in Eclipse: right click on pom.xml -> Run As -> Maven 
+clean). For continuous integration, you can insert one more line in the YAML (or 
+equivalent), like in our case ` - mvn $MAVEN_CLI_OPTS clean`.
+
+### Git Submodules
+
+Git submodules are a challenge with a tycho build, because the projects that reside 
+in it need to be build, too. But not only that, they need to use the same configuration 
+for the build, which is problematic if you do not have control over them. The solution 
+only exists with Tycho 1.5.0 (currently only as snapshot), where deep folder structures 
+are automatically scanned and poms get gnereated; not every folder requires an aggregator 
+pom. This however requires (at the moment) certain naming conventions (see section 
+on Tycho itself).
+
+In our case, [SWTHelper](https://github.com/Haspamelodica/SWTHelper) is a git submodule 
+containing several plain Java Eclipse projects with OSGi configuration (MANIFEST.MF), 
+which is the reason this works at all. Due to the naming conventions, the submodule 
+folder is named `bundles`.
+
+### Maven incompatibility
+
+Maven 3.6.2 is currently incompatible with Tycho <= 1.5.0.
+
+If you encounter
+
+> [FATAL] Non-readable POM "somepath"\tests\.polyglot.pom.tycho: input contained no data @ 
+
+or
+
+> [FATAL] Non-readable POM "somepath"\bundles\net.mograsim.logic.core\.polyglot..META-INF_MANIFEST.MF: input contained no data @ 
+
+make sure to use Maven 3.6.1 to fix that (this is the default Eclipse embedded Maven 
+at the moment).