This is an automated email from the ASF dual-hosted git repository.

cziegeler pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature.git


The following commit(s) were added to refs/heads/master by this push:
     new b02b7e2  Update feature docs
b02b7e2 is described below

commit b02b7e21a6def8d3381d9a27db503cf4b7571a4d
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Tue Apr 28 14:13:56 2020 +0200

    Update feature docs
---
 docs/features.md | 38 +++++++++++++++++++++-----------------
 1 file changed, 21 insertions(+), 17 deletions(-)

diff --git a/docs/features.md b/docs/features.md
index 835cbf6..52e5933 100644
--- a/docs/features.md
+++ b/docs/features.md
@@ -1,6 +1,7 @@
 # Features
 
 A feature is the central entity for the Feature Model. A feature is described 
through a JSON object and can contain:
+
 * Metadata like a unique identifier, description etc.
 * OSGi bundles
 * OSGi configurations
@@ -13,7 +14,7 @@ Each feature must specify a unique identifier. Other 
attributes like `title`, `d
 
 ## Feature Identity
 
-A feature has a unique identifier. Maven coordinates 
(https://maven.apache.org/pom.html#Maven_Coordinates) provide a well defined 
and accepted way of uniquely defining such an id. The coordinates include at 
least a group id, an artifact id, a version and optionally a type and 
classifier.
+A feature has a unique identifier. [Maven 
coordinates](https://maven.apache.org/pom.html#Maven_Coordinates) provide a 
well defined and accepted way of uniquely defining such an id. The coordinates 
include at least a group id, an artifact id, a version and optionally a type 
and classifier.
 
 While group id, artifact id, version and the optional classifier can be freely 
choosen for a feature, the type/packaging is defined as `slingosgifeature`.
 
@@ -26,7 +27,7 @@ Maven coordinates are used to define the feature id and to 
refer to artifacts co
 
 In some cases only the coordinates are specified as a string in one of the 
above mentioned formats. In other cases, the artifact is described through a 
JSON object. In that case, the *id* property holds the coordinates in one of 
the formats.
 
-```
+```json
 Example for specifying a feature id using a Maven id:
 {
   "id" : 
"org.apache.sling:org.apache.sling.core.feature:slingosgifeature:1.0.0"
@@ -44,7 +45,7 @@ Same id specified as a Maven url:
 Features are defined as a JSON object. An example feature file can be found 
here: [feature-model.json](feature-model.json)
 and the JSON Schema for feature files is available from here: 
[Feature-1.0.0.schema.json](../src/main/resources/META-INF/feature/Feature-1.0.0.schema.json).
 
-Comments in the form of [JSMin (The JavaScript 
Minifier)](https://www.crockford.com/javascript/jsmin.html) comments are 
supported, that is, any text on the same line after // is ignored and any text 
between /* */ is ignored.
+Comments in the form of [JSMin (The JavaScript 
Minifier)](https://www.crockford.com/javascript/jsmin.html) comments are 
supported, that is, any text on the same line after `//` is ignored and any 
text between `/* */` is ignored.
 
 Java API for Serialization/Deserialization into/from this format is part of 
this module.
 
@@ -52,13 +53,13 @@ Java API for Serialization/Deserialization into/from this 
format is part of this
 
 Features typically declare one or more bundles that provide the behaviour of 
the feature. The bundles are not stored inside the feature but referenced via 
their Maven coordinates in the `bundles` section of the feature model. The 
bundles are defined using an array. Each bundle is referenced either by a 
string value in that array or by a JSON object which at least must have an `id` 
property for the bundle coordinates. Additional metadata can also be placed 
inside that object. It is possib [...]
 
-```
+```json
 A feature with bundles:
 {
   "id" : 
"org.apache.sling:org.apache.sling.core.feature:slingosgifeature:1.0.0",
   "bundles" : [
       // defining a bundle by just using the id
-      "org.apache.sling:org.apache.sling.api:2.1.14",      
+      "org.apache.sling:org.apache.sling.api:2.1.14",
       // defining a bundle by using an object
       {
         "id" : "org.apache.sling:org.apache.sling.engine:2.5.0",
@@ -79,7 +80,7 @@ 
specification](https://osgi.org/specification/osgi.cmpn/7.0.0/service.configurat
 
 The configuration section contains set of configuration dictionaries each with 
a `persistence identifier` (PID) key to target a specific PID in the 
`Configuration Admin Service` and zero or more configuration values for this 
PID. Factory configurations can be addressed using the `factory PID` and a name 
by starting with the factory PID, appending a tilde, and then appending the 
name. This ensures a well-known name for the factory configuration instance. In 
the case of single configuratio [...]
 
-```
+```json
 A feature with configurations:
 {
   "id" : 
"org.apache.sling:org.apache.sling.core.feature:slingosgifeature:1.0.0",
@@ -105,7 +106,7 @@ In most cases, configurations belong to a bundle. The most 
common use case is a
 
 Instead of defining configurations globally for the feature as seen above, a 
configuration can be specified as part of a bundle.
 
-```
+```json
 A feature with a configuration attached to a bundle:
 {
   "id" : 
"org.apache.sling:org.apache.sling.core.feature:slingosgifeature:1.0.0",
@@ -120,14 +121,14 @@ A feature with a configuration attached to a bundle:
       }
     }
   ]
-```
 }
+```
 
 ## OSGi Framework properties
 
 Apart from OSGi configurations, sometimes OSGi framework properties are used 
for configurations. Framework properties are key value pairs where the value is 
a string. They can be specified with the 'framework-properties' key in the 
feature:
 
-```
+```json
 A feature with framework properties:
 {
   "id" : 
"org.apache.sling:org.apache.sling.core.feature:slingosgifeature:1.0.0",
@@ -144,7 +145,7 @@ In order to avoid a concept like *Require-Bundle* a feature 
does not explicitly
 
 Features can also explicitly declare additional requirements they have over 
and above the ones coming from the bundles. This is done in the `requirements` 
section of the feature. Each requirement has a namespace and optional 
directives and attributes.
 
-```
+```json
 A feature declaring additional requirements:
 {
   "id" : 
"org.apache.sling:org.apache.sling.core.feature:slingosgifeature:1.0.0",
@@ -161,7 +162,7 @@ A feature declaring additional requirements:
 
 Features can declare additional capabilities that are provided by the feature 
in addition to the capabilities provided by the bundles. For example a number 
of bundles might together provide an `osgi.implementation` capability, which is 
not provided by any of those bundles individually. The Feature can be used to 
add this capability to the provided set. These additional capabilities are 
specified in the `capabilities` section of the feature. Each capability has a 
namespace and optional di [...]
 
-```
+```json
 A feature declaring additional capabilities:
 {
   "id" : 
"org.apache.sling:org.apache.sling.core.feature:slingosgifeature:1.0.0",
@@ -191,19 +192,20 @@ Custom content can have one of the following 
formats/types:
 * An array of artifacts
 
 The extension can have one of the following states:
+
 * 'required' : Required extensions need to be processed by tooling
 * 'optional' : Optional extensions might be processed by tooling, for example 
they might contain environment specific parts
 * 'transient': Transient extensions are cache like extensions where tooling 
can store additional information to avoid reprocessing of down stream tooling. 
However such tooling must work without the transient extension being available.
 
 Extensions are declared in the feature by adding a JSON structure with a key 
following this syntax:
 
-```
+```json
 "extention-name:<type>|{optional|required|transient}": JSON Structure
 ```
 
 For example, the following declaration defines an extension with name 
`api-regions` using the type `JSON`. The declaration also states that if no 
plugin is present that knows about this extension it should be ignored and 
execution should continue.
 
-```
+```json
 "api-regions:JSON|optional" : [
    {"name": "global"}
 ]
@@ -213,7 +215,7 @@ For example, the following declaration defines an extension 
with name `api-regio
 
 Variables can be declared with the 'variables' key in the feature. This can be 
used for late binding of values, for example when launching a feature.
 
-```
+```json
 A feature declaring variables:
 {
   "id" : 
"org.apache.sling:org.apache.sling.core.feature:slingosgifeature:1.0.0",
@@ -232,7 +234,7 @@ Variables can be used in the values of framework properties 
and in the values of
 
 Features can be declared _from scratch_ or they can use another pre-existing 
feature as a prototype. Using a prototype is especially useful to make minor 
adjustments to an existing feature and use the modified feature instead of the 
original, for example replacing a single bundle.
 
-```
+```json
 A feature using a prototype:
 {
   "id" : "org.apache.sling:my-sling-core-feature:slingosgifeature:1.0.0",
@@ -246,6 +248,7 @@ A feature using a prototype:
 ```
 
 If a feature uses a prototype, the following parts are copied from the 
prototype into the feature:
+
 * Variables
 * Bundles
 * Configurations
@@ -256,6 +259,7 @@ If a feature uses a prototype, the following parts are 
copied from the prototype
 Then the removal instructions of the prototype object are handled next.
 
 Finally, the contents from the prototype is then overlayed with the 
definitions from the feature using the prototype. In detail this means:
+
 * Variables from the feature overwrite variables from the prototype.
 * A clash of artifacts (such as bundles) between the prototype and the feature 
is resolved by picking the version from the feature, not its prototype. 
Artifact clashes are detected based on Maven Coordinates, not on the content of 
the artifact. So if a prototype defines a bundle with artifact ID 
`org.sling:somebundle:1.2.0` and the feature itself declares 
`org.sling:somebundle:1.0.1` in its `bundles` section, the bundle with version 
`1.0.1` is used.
 * Configurations will be merged by default, the ones from the feature 
potentially overwriting configurations from the prototype:
@@ -269,7 +273,7 @@ Finally, the contents from the prototype is then overlayed 
with the definitions
 A feature might be self-contained, for example a feature describing a complete 
application has no external dependencies. Such a feature can be marked as 
`complete` indicating
 that all its dependencies and requirements are met by capabilities inside the 
feature.
 
-```
+```json
 A feature marked as complete
 {
   "id" : 
"org.apache.sling:org.apache.sling.core.feature:slingosgifeature:1.0.0",
@@ -279,7 +283,7 @@ A feature marked as complete
 
 Features can also be marked as `final`. Such a feature cannot be used as a 
prototype for another feature, similar to the final classifier on a class file 
in Java.
 
-```
+```json
 A feature marked as final
 {
   "id" : 
"org.apache.sling:org.apache.sling.core.feature:slingosgifeature:1.0.0",

Reply via email to