You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by ni...@apache.org on 2017/06/04 10:20:30 UTC

[3/4] polygene-java git commit: Configuration can not be Optional, although the individual elements can be.

Configuration can not be Optional, although the individual elements can be.

Signed-off-by: niclas <ni...@hedhman.org>


Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/c782f071
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/c782f071
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/c782f071

Branch: refs/heads/develop
Commit: c782f0713212792eb39b5a73265ab53e1327f078
Parents: 7e83d0b
Author: niclas <ni...@hedhman.org>
Authored: Sun Jun 4 17:30:03 2017 +0800
Committer: niclas <ni...@hedhman.org>
Committed: Sun Jun 4 17:30:03 2017 +0800

----------------------------------------------------------------------
 .../cache/memcache/MemcachePoolMixin.java       |  69 ++++-----
 tools/generator-polygene/app/index.js           | 147 ++++++++++++-------
 .../DomainLayer/DomainModule/Configuration.tmpl |  10 +-
 .../DomainLayer/DomainModule/bootstrap.tmpl     |  19 ++-
 .../DomainModule/config.properties.tmpl         |  22 +++
 .../DomainLayer/DomainModule/config.yaml.tmpl   |  23 ---
 .../DomainLayer/DomainModule/module.js          |  12 +-
 .../DomainLayer/JmxModule/bootstrap.tmpl        |   2 +-
 .../StorageModule/bootstrap.tmpl                |  13 +-
 .../InfrastructureLayer/StorageModule/module.js |  13 +-
 .../DevelopmentKeyManagement.java.tmpl          |  28 +++-
 .../RestAPIApplication/Launcher.java.tmpl       |   6 +
 .../app/templates/RestAPIApplication/app.js     |   4 +-
 .../RestAPIApplication/bootstrap-test.tmpl      |  17 ++-
 .../app/templates/buildtool/gradle-app.tmpl     |  37 +++++
 .../app/templates/buildtool/gradle-root.tmpl    |   4 +
 .../src/docs/yeoman_polygene.txt                |  76 ++++++++--
 17 files changed, 329 insertions(+), 173 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c782f071/extensions/cache-memcache/src/main/java/org/apache/polygene/cache/memcache/MemcachePoolMixin.java
----------------------------------------------------------------------
diff --git a/extensions/cache-memcache/src/main/java/org/apache/polygene/cache/memcache/MemcachePoolMixin.java b/extensions/cache-memcache/src/main/java/org/apache/polygene/cache/memcache/MemcachePoolMixin.java
index dabaea0..3184865 100644
--- a/extensions/cache-memcache/src/main/java/org/apache/polygene/cache/memcache/MemcachePoolMixin.java
+++ b/extensions/cache-memcache/src/main/java/org/apache/polygene/cache/memcache/MemcachePoolMixin.java
@@ -28,7 +28,6 @@ import net.spy.memcached.ConnectionFactoryBuilder.Protocol;
 import net.spy.memcached.MemcachedClient;
 import net.spy.memcached.auth.AuthDescriptor;
 import net.spy.memcached.auth.PlainCallbackHandler;
-import org.apache.polygene.api.common.Optional;
 import org.apache.polygene.api.configuration.Configuration;
 import org.apache.polygene.api.injection.scope.This;
 import org.apache.polygene.spi.cache.Cache;
@@ -40,8 +39,10 @@ public class MemcachePoolMixin
     implements MemcachePoolService
 {
     private final Map<String, MemcacheImpl<?>> caches = new HashMap<>();
-    @This @Optional
+
+    @This
     private Configuration<MemcacheConfiguration> configuration;
+
     private MemcachedClient client;
     private int expiration;
 
@@ -49,41 +50,32 @@ public class MemcachePoolMixin
     public void activateService()
         throws Exception
     {
-        if( configuration != null )
-        {
-            MemcacheConfiguration config = configuration.get();
-            expiration = ( config.expiration().get() == null )
-                         ? 3600
-                         : config.expiration().get();
-            String addresses = ( config.addresses().get() == null )
-                               ? "localhost:11211"
-                               : config.addresses().get();
-            Protocol protocol = ( config.protocol().get() == null )
-                                ? Protocol.TEXT
-                                : Protocol.valueOf( config.protocol().get().toUpperCase() );
-            String username = config.username().get();
-            String password = config.password().get();
-            String authMech = config.authMechanism().get() == null
-                              ? "PLAIN"
-                              : config.authMechanism().get();
-
-            ConnectionFactoryBuilder builder = new ConnectionFactoryBuilder();
-            builder.setProtocol( protocol );
-            if( username != null && !username.isEmpty() )
-            {
-                builder.setAuthDescriptor(
-                    new AuthDescriptor(
-                        new String[]
-                        {
-                            authMech
-                        },
-                        new PlainCallbackHandler( username, password )
-                    )
-                );
-            }
+        MemcacheConfiguration config = configuration.get();
+        expiration = ( config.expiration().get() == null )
+                     ? 3600
+                     : config.expiration().get();
+        String addresses = ( config.addresses().get() == null )
+                           ? "localhost:11211"
+                           : config.addresses().get();
+        Protocol protocol = ( config.protocol().get() == null )
+                            ? Protocol.TEXT
+                            : Protocol.valueOf( config.protocol().get().toUpperCase() );
+        String username = config.username().get();
+        String password = config.password().get();
+        String authMech = config.authMechanism().get() == null
+                          ? "PLAIN"
+                          : config.authMechanism().get();
 
-            client = new MemcachedClient( builder.build(), AddrUtil.getAddresses( addresses ) );
+        ConnectionFactoryBuilder builder = new ConnectionFactoryBuilder();
+        builder.setProtocol( protocol );
+        if( username != null && !username.isEmpty() )
+        {
+            String[] authType = { authMech };
+            AuthDescriptor to = new AuthDescriptor( authType, new PlainCallbackHandler( username, password ) );
+            builder.setAuthDescriptor( to );
         }
+
+        client = new MemcachedClient( builder.build(), AddrUtil.getAddresses( addresses ) );
     }
 
     @Override
@@ -107,12 +99,7 @@ public class MemcachePoolMixin
         }
         synchronized( caches )
         {
-            MemcacheImpl<?> cache = caches.get( cacheId );
-            if( cache == null )
-            {
-                cache = new MemcacheImpl<>( client, cacheId, valueType, expiration );
-                caches.put( cacheId, cache );
-            }
+            MemcacheImpl<?> cache = caches.computeIfAbsent( cacheId, identity -> new MemcacheImpl<>( client, identity, valueType, expiration ) );
             cache.incRefCount();
             return (Cache<T>) cache;
         }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c782f071/tools/generator-polygene/app/index.js
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/index.js b/tools/generator-polygene/app/index.js
index cb9d214..b933c27 100644
--- a/tools/generator-polygene/app/index.js
+++ b/tools/generator-polygene/app/index.js
@@ -130,9 +130,8 @@ module.exports = generators.Base.extend(
                             choices: [
                                 'BoneCP',
                                 'DBCP'
-                                // 'HikariCP'
                             ],
-                            message: 'Which entity store do you want to use?',
+                            message: 'Which connection pool do you want to use?',
                             default: polygene.dbpool ? polygene.dbpool : "DBCP",
                             when: function (answers) {
                                 return answers.entitystore.indexOf('SQL') > -1;
@@ -245,7 +244,7 @@ module.exports = generators.Base.extend(
                 if (this.options.export) {
                     exportModel(this.options.export);
                 }
-            } catch( exception ) {
+            } catch (exception) {
                 console.log(exception);
                 throw exception;
             }
@@ -282,6 +281,21 @@ function assignFunctions(polygene) {
         return polygene.features.indexOf(feature) >= 0;
     };
 
+    polygene.copyToConfig = function (ctx, from, toName) {
+        polygene.copyTemplate(ctx,
+            from,
+            'app/src/main/config/development/' + toName);
+        polygene.copyTemplate(ctx,
+            from,
+            'app/src/main/config/qa/' + toName);
+        polygene.copyTemplate(ctx,
+            from,
+            'app/src/main/config/staging/' + toName);
+        polygene.copyTemplate(ctx,
+            from,
+            'app/src/main/config/production/' + toName);
+    };
+
     polygene.copyTemplate = function (ctx, from, to) {
         try {
 
@@ -347,12 +361,16 @@ function assignFunctions(polygene) {
         var state = [];
         var imported = {};
         var props = current.clazz.properties;
+        var idx;
+        var assoc;
         if (props) {
             imported["org.apache.polygene.api.property.Property"] = true;
-            for (var idx in props) {
-                var prop = props[idx];
-                state.push('Property' + '<' + polygene.typeNameOnly(prop.type) + "> " + prop.name + "();");
-                imported[prop.type] = true;
+            for (idx in props) {
+                if( props.hasOwnProperty(idx)) {
+                    var prop = props[idx];
+                    state.push('Property' + '<' + polygene.typeNameOnly(prop.type) + "> " + prop.name + "();");
+                    imported[prop.type] = true;
+                }
             }
         } else {
             imported["org.apache.polygene.api.property.Property"] = true;
@@ -361,76 +379,101 @@ function assignFunctions(polygene) {
         var assocs = current.clazz.associations;
         if (assocs) {
             imported["org.apache.polygene.api.association.Association"] = true;
-            for (var idx in assocs) {
-                var assoc = assocs[idx];
-                state.push("Association" + '<' + polygene.typeNameOnly(assoc.type) + "> " + assoc.name + "();");
-                imported[assoc.type] = true;
+            for (idx in assocs) {
+                if( assocs.hasOwnProperty(idx)) {
+                    assoc = assocs[idx];
+                    state.push("Association" + '<' + polygene.typeNameOnly(assoc.type) + "> " + assoc.name + "();");
+                    imported[assoc.type] = true;
+                }
             }
         }
         assocs = current.clazz.manyassociations;
         if (assocs) {
             imported["org.apache.polygene.api.association.ManyAssociation"] = true;
-            for (var idx in assocs) {
-                var assoc = assocs[idx];
-                state.push("ManyAssociation<" + polygene.typeNameOnly(assoc.type) + "> " + assoc.name + "();");
-                imported[assoc.type] = true;
+            for (idx in assocs) {
+                if( assocs.hasOwnProperty(idx)) {
+                    assoc = assocs[idx];
+                    state.push("ManyAssociation<" + polygene.typeNameOnly(assoc.type) + "> " + assoc.name + "();");
+                    imported[assoc.type] = true;
+                }
             }
         }
         assocs = current.clazz.namedassociations;
         if (assocs) {
             imported["org.apache.polygene.api.association.NamedAssociation"] = true;
-            for (var idx in assocs) {
-                var assoc = assocs[idx];
-                state.push("NamedAssociation<" + polygene.typeNameOnly(assoc.type) + "> " + assoc.name + "();");
-                imported[assoc.type] = true;
+            for (idx in assocs) {
+                if( assocs.hasOwnProperty(idx)){
+                    assoc = assocs[idx];
+                    state.push("NamedAssociation<" + polygene.typeNameOnly(assoc.type) + "> " + assoc.name + "();");
+                    imported[assoc.type] = true;
+                }
             }
         }
         current.state = state;
         current.imported = imported;
     };
 
-    polygene.prepareConfigClazz = function (current) {
+    polygene.prepareConfigClazz = function (currentModule, composite) {
         var state = [];
-        var yaml = [];
+        var propertyFile = [];
         var imported = {};
-        var props = current.clazz.configuration;
+        var props = composite.configuration;
         if (props) {
             imported["org.apache.polygene.api.property.Property"] = true;
             for (var idx in props) {
-                var prop = props[idx];
-                state.push('Property' + '<' + polygene.typeNameOnly(prop.type) + "> " + prop.name + "();");
-                imported[prop.type] = true;
-                var yamlDefault;
-                if (prop.type === "java.lang.String") {
-                    yamlDefault = '""';
-                }
-                else if (prop.type === "java.lang.Boolean") {
-                    yamlDefault = 'false';
-                }
-                else if (prop.type === "java.lang.Long") {
-                    yamlDefault = '0';
-                }
-                else if (prop.type === "java.lang.Integer") {
-                    yamlDefault = '0';
-                }
-                else if (prop.type === "java.lang.Double") {
-                    yamlDefault = '0.0';
-                }
-                else if (prop.type === "java.lang.Float") {
-                    yamlDefault = '0.0';
-                }
-                else {
-                    yamlDefault = '\n    # TODO: complex configuration type. ';
+                if (props.hasOwnProperty(idx)) {
+                    var prop = props[idx];
+                    imported[prop.type] = true;
+                    var propertyDefault;
+                    if (prop.default !== undefined) {
+                        propertyDefault = prop.default;
+                    } else {
+                        if (prop.type === "java.lang.String") {
+                            propertyDefault = '';
+                        }
+                        else if (prop.type === "java.lang.Boolean") {
+                            propertyDefault = 'false';
+                        }
+                        else if (prop.type === "java.lang.Long") {
+                            propertyDefault = '0';
+                        }
+                        else if (prop.type === "java.lang.Integer") {
+                            propertyDefault = '0';
+                        }
+                        else if (prop.type === "java.lang.Double") {
+                            propertyDefault = '0.0';
+                        }
+                        else if (prop.type === "java.lang.Float") {
+                            propertyDefault = '0.0';
+                        }
+                        else {
+                            propertyDefault = '\n    # TODO: complex configuration type. ';
+                        }
+                    }
+                    state.push("/**");
+                    for( var idxDesc in prop.description ){
+                        if( prop.description.hasOwnProperty(idxDesc)){
+                            var desc = prop.description[idxDesc];
+                            propertyFile.push("# " + desc);
+                            state.push(" * " + desc )
+                        }
+                    }
+                    state.push(" */");
+                    propertyFile.push(prop.name + "=" + propertyDefault +"\n");
+                    state.push('Property' + '<' + polygene.typeNameOnly(prop.type) + "> " + prop.name + "();\n");
                 }
-                yaml.push(prop.name + " : " + yamlDefault);
             }
         } else {
             imported["org.apache.polygene.api.property.Property"] = true;
-            state.push('Property<String> name();    // TODO: remove sample property');
-            yaml.push('name : "sample config value"');
+            state.push('/** TODO: remove sample property');
+            state.push(' */');
+            state.push('Property<String> name();');
+            propertyFile.push("# This is just the sample configuration value. " );
+            propertyFile.push("# TODO: Remove this config value " );
+            propertyFile.push('name=sample config value');
         }
-        current.state = state;
-        current.yaml = yaml;
-        current.imported = imported;
+        currentModule.state = state;
+        currentModule.propertyLines = propertyFile;
+        currentModule.imported = imported;
     };
 }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c782f071/tools/generator-polygene/app/templates/DomainLayer/DomainModule/Configuration.tmpl
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/templates/DomainLayer/DomainModule/Configuration.tmpl b/tools/generator-polygene/app/templates/DomainLayer/DomainModule/Configuration.tmpl
index b7acd94..e36bffb 100644
--- a/tools/generator-polygene/app/templates/DomainLayer/DomainModule/Configuration.tmpl
+++ b/tools/generator-polygene/app/templates/DomainLayer/DomainModule/Configuration.tmpl
@@ -18,6 +18,7 @@
  *
 -%>
 package <%= polygene.packageName %>.model.<%= polygene.current.name %>;
+
 <%
 for( var imp in polygene.current.imported ) {
     if( !imp.startsWith( "java.lang" )
@@ -26,10 +27,11 @@ for( var imp in polygene.current.imported ) {
 <%
     }
 } %>
-
 public interface <%= polygene.current.clazz.name %>
 {
-<% for( var idx in polygene.current.state ) {
-%>    <%- polygene.current.state[idx]; %>
-<% } %>
+<%
+for( var idx in polygene.current.state ) {
+%>
+    <%- polygene.current.state[idx]; %><%
 }
+%>}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c782f071/tools/generator-polygene/app/templates/DomainLayer/DomainModule/bootstrap.tmpl
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/templates/DomainLayer/DomainModule/bootstrap.tmpl b/tools/generator-polygene/app/templates/DomainLayer/DomainModule/bootstrap.tmpl
index 092d683..5afbdd7 100644
--- a/tools/generator-polygene/app/templates/DomainLayer/DomainModule/bootstrap.tmpl
+++ b/tools/generator-polygene/app/templates/DomainLayer/DomainModule/bootstrap.tmpl
@@ -69,8 +69,8 @@ if( polygene.current.cruds ) {
     for( var value in polygene.current.cruds ) {
         var crud = polygene.current.cruds[value];
 %>
-        <%- "module.values( " + crud.name + ".class )" + (crud.visibility ? ".visibleIn(" + crud.visibility +")" : "" ) %>;
-        <%- "module.entities( " + crud.name + ".class )" + (crud.visibility ? ".visibleIn(" + crud.visibility +")" : "" ) %>;
+        <%- "module.values( " + crud.name + ".class )" + (crud.visibility ? ".visibleIn( " + crud.visibility +" )" : "" ) %>;
+        <%- "module.entities( " + crud.name + ".class )" + (crud.visibility ? ".visibleIn( " + crud.visibility +" )" : "" ) %>;
 <%
     }
 }
@@ -78,7 +78,7 @@ if( polygene.current.values ) {
     for( var value in polygene.current.values ) {
         var v = polygene.current.values[value];
 %>
-        <%- "module.values( " + v.name + ".class )" + (v.visibility ? ".visibleIn(" + v.visibility +")" : "" ) %>;
+        <%- "module.values( " + v.name + ".class )" + (v.visibility ? ".visibleIn(" + v.visibility +" )" : "" ) %>;
 <%
     }
 }
@@ -86,7 +86,7 @@ if( polygene.current.entities ) {
     for( var value in polygene.current.entities ) {
         var entity = polygene.current.entities[value];
 %>
-        <%- "module.entities( " + entity.name + ".class )" + (entity.visibility ? ".visibleIn(" + entity.visibility +")" : "" ) %>;
+        <%- "module.entities( " + entity.name + ".class )" + (entity.visibility ? ".visibleIn( " + entity.visibility +" )" : "" ) %>;
 <%
     }
 }
@@ -94,7 +94,7 @@ if( polygene.current.transients ) {
     for( var value in polygene.current.transients ) {
         var trans = polygene.current.transients[value];
 %>
-        <%- "module.transients( " + trans.name + ".class )" + (trans.visibility ? ".visibleIn(" + trans.visibility +")" : "" ) %>;
+        <%- "module.transients( " + trans.name + ".class )" + (trans.visibility ? ".visibleIn( " + trans.visibility +" )" : "" ) %>;
 <%
     }
 }
@@ -102,7 +102,7 @@ if( polygene.current.objects ) {
     for( var value in polygene.current.objects ) {
         var obj = polygene.current.objects[value];
 %>
-        <%- "module.objects( " + obj.name + ".class )" + (obj.visibility ? ".visibleIn(" + obj.visibility +")" : "" ) %>;
+        <%- "module.objects( " + obj.name + ".class )" + (obj.visibility ? ".visibleIn( " + obj.visibility +" )" : "" ) %>;
 <%
     }
 }
@@ -110,8 +110,11 @@ if( polygene.current.services ) {
     for( var value in polygene.current.services ) {
         var service = polygene.current.services[value];
 %>
-        <%- "module.services( " + service.name + ".class )" + (service.visibility ? ".visibleIn(" + service.visibility + ")" : "" ) %>;
-        <%- "module.entities( " + polygene.configurationClassName(service.name) + ".class )" %>;
+        module.services( <%- service.name %>.class )
+            .identifiedBy("<%- service.name %>")
+        <%- (service.visibility ? "    .visibleIn( " + service.visibility + " )" : "" )
+%>;
+        <%- "module.configurations( " + polygene.configurationClassName(service.name) + ".class )" %>;
 <%
     }
 } %>

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c782f071/tools/generator-polygene/app/templates/DomainLayer/DomainModule/config.properties.tmpl
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/templates/DomainLayer/DomainModule/config.properties.tmpl b/tools/generator-polygene/app/templates/DomainLayer/DomainModule/config.properties.tmpl
new file mode 100644
index 0000000..a20c784
--- /dev/null
+++ b/tools/generator-polygene/app/templates/DomainLayer/DomainModule/config.properties.tmpl
@@ -0,0 +1,22 @@
+<%#
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *
+-%>
+<% for( var idx in polygene.current.propertyLines ) {
+%><%- polygene.current.propertyLines[idx]; %>
+<% } %>

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c782f071/tools/generator-polygene/app/templates/DomainLayer/DomainModule/config.yaml.tmpl
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/templates/DomainLayer/DomainModule/config.yaml.tmpl b/tools/generator-polygene/app/templates/DomainLayer/DomainModule/config.yaml.tmpl
deleted file mode 100644
index e2629d5..0000000
--- a/tools/generator-polygene/app/templates/DomainLayer/DomainModule/config.yaml.tmpl
+++ /dev/null
@@ -1,23 +0,0 @@
-<%#
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- *
--%>
--
-<% for( var idx in polygene.current.yaml ) {
-%>    <%- polygene.current.yaml[idx]; %>
-<% } %>

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c782f071/tools/generator-polygene/app/templates/DomainLayer/DomainModule/module.js
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/templates/DomainLayer/DomainModule/module.js b/tools/generator-polygene/app/templates/DomainLayer/DomainModule/module.js
index 8855bc3..f511c0f 100644
--- a/tools/generator-polygene/app/templates/DomainLayer/DomainModule/module.js
+++ b/tools/generator-polygene/app/templates/DomainLayer/DomainModule/module.js
@@ -49,7 +49,7 @@ function copyPolygeneDomainModule(p, moduleName, moduleDef) {
     copyComposites(p, moduleDef.plainTypes, "Plain");
     copyComposites(p, moduleDef.services, "Configuration");
 
-    copyConfigurationYaml(p, moduleDef.services )
+    copyConfigurationPropertiesFile(p, moduleDef.services )
 }
 
 function copyComposites(p, composites, type) {
@@ -57,7 +57,9 @@ function copyComposites(p, composites, type) {
         if (composites.hasOwnProperty(idx)) {
             if( type === "Configuration"){
                 p.current.clazz.name = p.configurationClassName(composites[idx].name);
-                p.prepareConfigClazz(p.current);
+                delete p.current.type;
+                delete p.current.value;
+                p.prepareConfigClazz(p.current, composites[idx]);
             } else {
                 p.current.clazz = composites[idx];
                 p.prepareClazz(p.current);
@@ -69,14 +71,12 @@ function copyComposites(p, composites, type) {
     }
 }
 
-function copyConfigurationYaml(p, composites) {
+function copyConfigurationPropertiesFile(p, composites) {
     for (var idx in composites) {
         if (composites.hasOwnProperty(idx)) {
             p.current.clazz = composites[idx];
             p.prepareClazz(p.current);
-            p.copyTemplate(p.ctx,
-                'DomainLayer/DomainModule/config.yaml.tmpl',
-                'model/src/main/resources/' + p.javaPackageDir + '/model/' + p.current.name + '/' + p.current.clazz.name + '.yaml');
+            p.copyToConfig(p.ctx,'DomainLayer/DomainModule/config.properties.tmpl', p.current.clazz.name + '.properties');
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c782f071/tools/generator-polygene/app/templates/DomainLayer/JmxModule/bootstrap.tmpl
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/templates/DomainLayer/JmxModule/bootstrap.tmpl b/tools/generator-polygene/app/templates/DomainLayer/JmxModule/bootstrap.tmpl
index 8a9a96f..b53529f 100644
--- a/tools/generator-polygene/app/templates/DomainLayer/JmxModule/bootstrap.tmpl
+++ b/tools/generator-polygene/app/templates/DomainLayer/JmxModule/bootstrap.tmpl
@@ -36,7 +36,7 @@ public class JmxModule
     {
         new JMXAssembler().assemble( module );
         module.services( JMXConnectorService.class ).instantiateOnStartup();
-        module.entities( JMXConnectorConfiguration.class );
+        module.configurations( JMXConnectorConfiguration.class );
         module.forMixin( JMXConnectorConfiguration.class ).declareDefaults().port().set( 1099 );
         return module;
     }

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c782f071/tools/generator-polygene/app/templates/InfrastructureLayer/StorageModule/bootstrap.tmpl
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/templates/InfrastructureLayer/StorageModule/bootstrap.tmpl b/tools/generator-polygene/app/templates/InfrastructureLayer/StorageModule/bootstrap.tmpl
index b2ebb64..ce33d13 100644
--- a/tools/generator-polygene/app/templates/InfrastructureLayer/StorageModule/bootstrap.tmpl
+++ b/tools/generator-polygene/app/templates/InfrastructureLayer/StorageModule/bootstrap.tmpl
@@ -26,6 +26,7 @@ import org.apache.polygene.bootstrap.AssemblyException;
 import org.apache.polygene.bootstrap.LayerAssembly;
 import org.apache.polygene.bootstrap.ModuleAssembly;
 import org.apache.polygene.bootstrap.layered.ModuleAssembler;
+import org.apache.polygene.entitystore.<%- polygene.entitystoremodule %>.<%- polygene.entitystore %>EntityStoreConfiguration;
 import org.apache.polygene.entitystore.<%- polygene.entitystoremodule %>.assembly.<%- polygene.entitystore %>EntityStoreAssembler;
 <%
 if( polygene.entitystore.indexOf('SQL') >= 0 ) {
@@ -73,9 +74,17 @@ if( polygene.entitystore.indexOf( 'SQL' ) >= 0 ) {
             .withConfig( configModule, Visibility.application )
             .identifiedBy( "es-<%- polygene.entitystore.toLowerCase() %>" )
             .assemble( module );
+<%
+if( polygene.entitystore === 'Cassandra' ) {
+%>        configModule.forMixin( CassandraEntityStoreConfiguration.class )
+            .declareDefaults()
+            .createIfMissing().set( true );
+<%
+}
+%>
         module.services( IdentityGenerator.class )
-              .visibleIn( Visibility.application )
-              .withMixins( UuidGeneratorMixin.class );
+            .visibleIn( Visibility.application )
+            .withMixins( UuidGeneratorMixin.class );
         return module;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c782f071/tools/generator-polygene/app/templates/InfrastructureLayer/StorageModule/module.js
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/templates/InfrastructureLayer/StorageModule/module.js b/tools/generator-polygene/app/templates/InfrastructureLayer/StorageModule/module.js
index a9790bb..d26c454 100644
--- a/tools/generator-polygene/app/templates/InfrastructureLayer/StorageModule/module.js
+++ b/tools/generator-polygene/app/templates/InfrastructureLayer/StorageModule/module.js
@@ -31,21 +31,14 @@ module.exports = {
         if (p.entitystore.indexOf('SQL') < 0) {
             fs.stat(__dirname + "/../../" + configurationFile, function (err, stat) {
                 if (err === null) {
-                    p.copyTemplate(p.ctx,
-                        configurationFile,
-                        'app/src/main/resources/' + esFileName);
+                    p.copyToConfig(p.ctx, configurationFile, esFileName);
                 }
             });
         } else {
-            p.copyTemplate(p.ctx,
-                'InfrastructureLayer/StorageModule/storage/es-sql.properties',
-                'app/src/main/resources/' + esFileName);
-
+            p.copyToConfig(p.ctx, 'InfrastructureLayer/StorageModule/storage/es-sql.properties', esFileName);
             var dsFileName = 'ds-es-' + p.entitystore.toLowerCase() + '.properties';
             var datasourceFile = 'InfrastructureLayer/StorageModule/storage/' + dsFileName;
-            p.copyTemplate(p.ctx,
-                datasourceFile,
-                'app/src/main/resources/' + dsFileName);
+            p.copyToConfig(p.ctx, datasourceFile, dsFileName);
         }
     }
 };

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c782f071/tools/generator-polygene/app/templates/RestAPIApplication/DevelopmentKeyManagement.java.tmpl
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/templates/RestAPIApplication/DevelopmentKeyManagement.java.tmpl b/tools/generator-polygene/app/templates/RestAPIApplication/DevelopmentKeyManagement.java.tmpl
index d82eec5..d724253 100644
--- a/tools/generator-polygene/app/templates/RestAPIApplication/DevelopmentKeyManagement.java.tmpl
+++ b/tools/generator-polygene/app/templates/RestAPIApplication/DevelopmentKeyManagement.java.tmpl
@@ -71,16 +71,17 @@ class DevelopmentKeyManagement
         @SuppressWarnings( "unused" )
         KeyStore trustStore = loadKeyStore( new File(TRUSTSTORE_FILENAME), TRUSTSTORE_TYPE, KS_PASSWORD );
 
-        KeyStore keyStore = loadKeyStore( new File(SERVER_KEYSTORE_FILENAME), SERVER_KEYSTORE_TYPE, KS_PASSWORD );
+        File keyFile = new File( SERVER_KEYSTORE_FILENAME );
+        KeyStore keyStore = loadKeyStore( keyFile, SERVER_KEYSTORE_TYPE, KS_PASSWORD );
         initializeKeyManager( keyStore, KS_PASSWORD );
-        createKeyStoreData( keyStore );
+        createKeyStoreData( keyStore, keyFile, SERVER_KEYSTORE_TYPE, KS_PASSWORD );
     }
 
     private static KeyStore loadKeyStore( File keyFile, String type, String password )
     {
         if( !keyFile.exists() )
         {
-            return createKeyStore(keyFile, type, password);
+            createKeyStore(keyFile, type, password);
         }
         try( FileInputStream fis = new FileInputStream( keyFile ) )
         {
@@ -96,7 +97,7 @@ class DevelopmentKeyManagement
     }
 
     @SuppressWarnings( "ResultOfMethodCallIgnored" )
-    private static KeyStore createKeyStore( File keyFile, String type, String password )
+    private static void createKeyStore( File keyFile, String type, String password )
         throws AssemblyException
     {
         if( !keyFile.getParentFile().exists() )
@@ -109,7 +110,6 @@ class DevelopmentKeyManagement
             char[] pwd = password.toCharArray();
             ks.load( null, pwd );
             ks.store( fos, pwd );
-            return ks;
         }
         catch( Exception e )
         {
@@ -130,7 +130,7 @@ class DevelopmentKeyManagement
         }
     }
 
-    private static void createKeyStoreData( KeyStore keyStore )
+    private static void createKeyStoreData( KeyStore keyStore, File keyFile, String type, String password )
     {
         try
         {
@@ -141,6 +141,7 @@ class DevelopmentKeyManagement
             KeyPair keyPair = generateKeyPair();
             X509Certificate certificate = selfSignedCertificate( keyPair, COMMON_NAME, 30 );
             keyStore.setCertificateEntry( COMMON_NAME, certificate );
+            storeKeyStore(keyStore, keyFile, password, type);
 
             System.out.println("Created Self-signed certificated:");
             System.out.println(convertCertificateToPEM( certificate ));
@@ -151,6 +152,21 @@ class DevelopmentKeyManagement
         }
     }
 
+    private static void storeKeyStore( KeyStore keyStore, File keyFile, String password, String type )
+    {
+        try( FileOutputStream fos = new FileOutputStream( keyFile ) )
+        {
+            KeyStore ks = KeyStore.getInstance( type );
+            char[] pwd = password.toCharArray();
+            ks.load( null, pwd );
+            ks.store( fos, pwd );
+        }
+        catch( Exception e )
+        {
+            throw new AssemblyException( "Unable to create keystore.", e );
+        }
+    }
+
     private static KeyPair generateKeyPair()
     {
         try

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c782f071/tools/generator-polygene/app/templates/RestAPIApplication/Launcher.java.tmpl
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/templates/RestAPIApplication/Launcher.java.tmpl b/tools/generator-polygene/app/templates/RestAPIApplication/Launcher.java.tmpl
index 3a66952..2acdca1 100644
--- a/tools/generator-polygene/app/templates/RestAPIApplication/Launcher.java.tmpl
+++ b/tools/generator-polygene/app/templates/RestAPIApplication/Launcher.java.tmpl
@@ -54,6 +54,12 @@ public class <%= polygene.name %>Launcher extends PolygeneRestApplicationLaunche
 %>        return new <%= polygene.name %>ApplicationAssembler( name, version, mode, none -> {} );
     }
 
+    @Override
+    public void shutdown()
+    {
+        super.shutdown();
+    }
+
     protected String entryLayer()
     {
         return ConnectivityLayer.NAME;

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c782f071/tools/generator-polygene/app/templates/RestAPIApplication/app.js
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/templates/RestAPIApplication/app.js b/tools/generator-polygene/app/templates/RestAPIApplication/app.js
index c016bec..ceed39e 100644
--- a/tools/generator-polygene/app/templates/RestAPIApplication/app.js
+++ b/tools/generator-polygene/app/templates/RestAPIApplication/app.js
@@ -36,9 +36,7 @@ module.exports = {
             p.copyTemplate(p.ctx,
                 'RestAPIApplication/DevelopmentKeyManagement.java.tmpl',
                 'app/src/main/java/' + p.javaPackageDir + '/app/DevelopmentKeyManagement.java');
-            p.copyTemplate(p.ctx,
-                'RestAPIApplication/web-shiro.ini.tmpl',
-                'app/src/main/resources/web-shiro.ini');
+            p.copyToConfig(p.ctx, 'RestAPIApplication/web-shiro.ini.tmpl', 'web-shiro.ini');
         }
 
         p.copyTemplate(p.ctx,

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c782f071/tools/generator-polygene/app/templates/RestAPIApplication/bootstrap-test.tmpl
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/templates/RestAPIApplication/bootstrap-test.tmpl b/tools/generator-polygene/app/templates/RestAPIApplication/bootstrap-test.tmpl
index 0eac743..ae03cd6 100644
--- a/tools/generator-polygene/app/templates/RestAPIApplication/bootstrap-test.tmpl
+++ b/tools/generator-polygene/app/templates/RestAPIApplication/bootstrap-test.tmpl
@@ -35,6 +35,8 @@ import org.apache.polygene.bootstrap.layered.LayeredApplicationAssembler;
 import org.apache.polygene.tools.model.descriptor.ApplicationDetailDescriptor;
 import org.apache.polygene.tools.model.descriptor.ApplicationDetailDescriptorBuilder;
 <%
+polygene.needsDelayChecker = false;
+
 if(  polygene.entitystore === 'MySQL' ) {
 %>import java.util.HashMap;
 <%
@@ -89,6 +91,8 @@ public class BootstrapTest
         };
         launcher.initialize();
         System.out.println("Application Launched...");
+        // Thread.sleep( 3600000L );
+        launcher.shutdown();
     }
 
     private void setupTest( ApplicationAssembly assembly )
@@ -186,6 +190,7 @@ if(  polygene.entitystore === 'MongoDB' ) {
     }
 <% }
 if(  polygene.entitystore === 'MySQL' ) {
+    polygene.needsDelayChecker = true;
 %>
     private void entityStoreSetup(ApplicationAssembly assembly )
     {
@@ -205,6 +210,7 @@ if(  polygene.entitystore === 'MySQL' ) {
                                                          .build();
 <% }
 if(  polygene.entitystore === 'PostgreSQL' ) {
+    polygene.needsDelayChecker = true;
 %>
     private void entityStoreSetup(ApplicationAssembly assembly )
     {
@@ -264,6 +270,7 @@ if(  polygene.caching === 'Memcache' ) {
                                                             .imageName( "memcached:latest"  )
                                                             .expose( "11211", "11211" )
                                                             .waitForTimeout( 120 )
+                                                            .waitFor( WaitFor.tcpPort(11211) )
                                                             .build();
 
 <% }
@@ -272,8 +279,9 @@ if(  polygene.caching === 'EhCache' ) {
     @ClassRule
     public static final DockerRule CACHE_DOCKER = DockerRule.builder()
                                                             .imageName( "terracotta/terracotta-server-oss:latest"  )
-                                                            .publishAllPorts( true )
+                                                            .expose( "9510", "9510" )
                                                             .waitForTimeout( 120 )
+                                                            .waitFor( WaitFor.tcpPort(9510) )
                                                             .build();
 <% }
 if(  polygene.indexing === 'ElasticSearch' ) {
@@ -286,7 +294,8 @@ if(  polygene.indexing === 'ElasticSearch' ) {
                                                                .build();
 <%
 } %>
-
+<% if( polygene.needsDelayChecker ) {
+%>
     private static class DelayChecker
         implements StartCondition
     {
@@ -304,7 +313,6 @@ if(  polygene.indexing === 'ElasticSearch' ) {
         {
             return new StartConditionCheck()
             {
-
                 @Override
                 public boolean check()
                 {
@@ -324,4 +332,5 @@ if(  polygene.indexing === 'ElasticSearch' ) {
             };
         }
     }
-}
+<% }
+%>}

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c782f071/tools/generator-polygene/app/templates/buildtool/gradle-app.tmpl
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/templates/buildtool/gradle-app.tmpl b/tools/generator-polygene/app/templates/buildtool/gradle-app.tmpl
index 0d8431a..14b3510 100644
--- a/tools/generator-polygene/app/templates/buildtool/gradle-app.tmpl
+++ b/tools/generator-polygene/app/templates/buildtool/gradle-app.tmpl
@@ -18,6 +18,24 @@
  *
 -%>
 
+
+apply plugin: 'application'
+
+mainClassName="<%= polygene.packageName %>.app.<%= polygene.name %>Launcher"
+
+applicationDefaultJvmArgs=[]
+// GC Tuning strategies, see https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/
+// Strict memory bound
+// applicationDefaultJvmArgs << "-Xmx512M -Xms512M"
+//
+// Goal oriented, "throughput" and "max pause"
+// applicationDefaultJvmArgs << "-XX:MaxGCPauseMillis=300 -XX:GCTimeRatio=19"
+//
+// Garbage Collector
+// OneOf; -XX:+UseG1GC, -XX:+UseConcMarkSweepGC, -XX:-UseParallelOldGC, -XX:+UseSerialGC
+applicationDefaultJvmArgs << "-XX:+UseG1GC"
+
+
 dependencies {
   implementation project( ":bootstrap" )
   implementation project( ":model" )
@@ -89,3 +107,22 @@ if( polygene.entitystore == 'SQLite'  ) {
   testImplementation "org.apache.polygene.core:org.apache.polygene.core.testsupport:$polygeneVersion"
   testImplementation "com.github.tdomzal:junit-docker-rule:0.3"
 }
+
+
+task createConfigs {
+  def config = file("src/main/config")
+  outputs.dir config
+  doLast {
+    config.mkdirs()
+  }
+}
+
+distributions {
+  main {
+    contents {
+      from(createConfigs) {
+        into "config"
+      }
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c782f071/tools/generator-polygene/app/templates/buildtool/gradle-root.tmpl
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/app/templates/buildtool/gradle-root.tmpl b/tools/generator-polygene/app/templates/buildtool/gradle-root.tmpl
index d8f215e..357b607 100644
--- a/tools/generator-polygene/app/templates/buildtool/gradle-root.tmpl
+++ b/tools/generator-polygene/app/templates/buildtool/gradle-root.tmpl
@@ -25,7 +25,11 @@ if( project.version == 'unspecified' )
 
 rootProject.ext {
   polygeneVersion = "<%= polygene.version %>"
+<% if( polygene.applicationtype === "Rest API" ) {
+%>  jettyVersion = "9.2.17.v20160517"
+<%
 }
+%>}
 
 allprojects() {
   apply plugin: 'java-library'

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/c782f071/tools/generator-polygene/src/docs/yeoman_polygene.txt
----------------------------------------------------------------------
diff --git a/tools/generator-polygene/src/docs/yeoman_polygene.txt b/tools/generator-polygene/src/docs/yeoman_polygene.txt
index cff7882..19cca52 100644
--- a/tools/generator-polygene/src/docs/yeoman_polygene.txt
+++ b/tools/generator-polygene/src/docs/yeoman_polygene.txt
@@ -19,8 +19,8 @@
 
 [[tools-shell,Command Line Shell]]
 = Polygene Generator =
-Apache Polygene comes with a Yeoman code generator, to quickly set up a development
-environment for Polygene applications.
+Apache Polygene comes with a Yeoman code generator, to quickly set up a
+project for Polygene applications.
 
 [source,shell]
 ----
@@ -90,6 +90,15 @@ number of implementations to choose from. Not that "memory" is not persistent, b
   SQLite
 ----
 
+If one of the SQL options are given, then a question of connection pool will pop up.
+
+[source,shell]
+----
+? Which connection pool do you want to use?
+  BoneCP
+> DBCP
+----
+
 === Indexing/Query system ===
 Select of a pluggable Indexing and Query subsystem.
 
@@ -272,7 +281,11 @@ where the content of the +../model.json+ is as follows,
           "visibility": "application",
           "configuration" : [
             { "name": "backend", "type": "java.lang.String" },
-            { "name": "connectString", "type": "java.lang.String" }
+            { "name": "connectString", "type": "java.lang.String",
+              "description": [
+                  "The connection string to the authentication and authorization backend system."
+              ]
+            }
           ]
         }
       ]
@@ -325,11 +338,19 @@ we will create a complete project, like this
 
 [source,shell]
 ----
-  create bootstrap/src/main/java/com/sensetif/sink/bootstrap/config/ConfigurationLayer.java
+   create bootstrap/src/main/java/com/sensetif/sink/bootstrap/config/ConfigurationLayer.java
    create bootstrap/src/main/java/com/sensetif/sink/bootstrap/infrastructure/InfrastructureLayer.java
    create bootstrap/src/main/java/com/sensetif/sink/bootstrap/domain/DomainLayer.java
    create bootstrap/src/main/java/com/sensetif/sink/bootstrap/connectivity/ConnectivityLayer.java
-   create app/src/main/webapp/WEB-INF/web.xml
+   create rest/src/main/java/com/sensetif/sink/rest/FloodRestApplication.java
+   create app/src/main/java/com/sensetif/sink/app/FloodLauncher.java
+   create app/src/main/java/com/sensetif/sink/app/DevelopmentKeyManagement.java
+   create app/src/main/config/development/web-shiro.ini
+   create app/src/main/config/qa/web-shiro.ini
+   create app/src/main/config/staging/web-shiro.ini
+   create app/src/main/config/production/web-shiro.ini
+   create app/src/test/java/com/sensetif/sink/app/BootstrapTest.java
+   create bootstrap/src/main/java/com/sensetif/sink/bootstrap/FloodApplicationAssembler.java
    create app/build.gradle
    create bootstrap/build.gradle
    create model/build.gradle
@@ -343,34 +364,53 @@ we will create a complete project, like this
    create bootstrap/src/main/java/com/sensetif/sink/bootstrap/config/ConfigModule.java
    create bootstrap/src/main/java/com/sensetif/sink/bootstrap/infrastructure/MemcacheCachingModule.java
    create bootstrap/src/main/java/com/sensetif/sink/bootstrap/infrastructure/FileConfigurationModule.java
-   create bootstrap/src/main/java/com/sensetif/sink/bootstrap/infrastructure/SQLIndexingModule.java
+   create bootstrap/src/main/java/com/sensetif/sink/bootstrap/infrastructure/RdfIndexingModule.java
    create bootstrap/src/main/java/com/sensetif/sink/bootstrap/infrastructure/CodahaleMetricsModule.java
    create bootstrap/src/main/java/com/sensetif/sink/bootstrap/infrastructure/JavaxJsonSerializationModule.java
    create bootstrap/src/main/java/com/sensetif/sink/bootstrap/infrastructure/CassandraStorageModule.java
    create bootstrap/src/main/java/com/sensetif/sink/bootstrap/domain/CrudModule.java
    create bootstrap/src/main/java/com/sensetif/sink/bootstrap/domain/UserModule.java
-   create model/src/main/java/com/sensetif/sink/model/user/Users.java
-   create model/src/main/java/com/sensetif/sink/model/user/Roles.java
    create model/src/main/java/com/sensetif/sink/model/user/User.java
+   create model/src/main/java/com/sensetif/sink/model/user/Users.java
    create model/src/main/java/com/sensetif/sink/model/user/Role.java
+   create model/src/main/java/com/sensetif/sink/model/user/Roles.java
    create model/src/main/java/com/sensetif/sink/model/user/Permission.java
+   create model/src/main/java/com/sensetif/sink/model/user/Permissions.java
    create model/src/main/java/com/sensetif/sink/model/user/Group.java
    create model/src/main/java/com/sensetif/sink/model/user/Groups.java
    create model/src/main/java/com/sensetif/sink/model/user/AuthService.java
+   create model/src/main/java/com/sensetif/sink/model/user/AuthBackend.java
    create model/src/main/java/com/sensetif/sink/model/user/AuthConfiguration.java
-   create model/src/main/resources/com/sensetif/sink/model/user/AuthConfiguration.yaml
+   create app/src/main/config/development/AuthService.properties
+   create app/src/main/config/qa/AuthService.properties
+   create app/src/main/config/staging/AuthService.properties
+   create app/src/main/config/production/AuthService.properties
    create bootstrap/src/main/java/com/sensetif/sink/bootstrap/domain/OrganizationModule.java
-   create model/src/main/java/com/sensetif/sink/model/organization/Organizations.java
    create model/src/main/java/com/sensetif/sink/model/organization/Organization.java
    create model/src/main/java/com/sensetif/sink/model/organization/Project.java
+   create model/src/main/java/com/sensetif/sink/model/organization/Contract.java
+   create model/src/main/java/com/sensetif/sink/model/organization/ContractPart.java
+   create model/src/main/java/com/sensetif/sink/model/organization/Order.java
+   create model/src/main/java/com/sensetif/sink/model/organization/OrderConfirmation.java
    create model/src/main/java/com/sensetif/sink/model/organization/Invoice.java
    create model/src/main/java/com/sensetif/sink/model/organization/CreditLimit.java
-   create model/src/main/java/com/sensetif/sink/model/organization/OrderConfirmation.java
+   create model/src/main/java/com/sensetif/sink/model/organization/Label.java
    create model/src/main/java/com/sensetif/sink/model/organization/PaypalNotification.java
    create bootstrap/src/main/java/com/sensetif/sink/bootstrap/domain/SensorModule.java
-   create model/src/main/java/com/sensetif/sink/model/sensor/SensorData.java
-   create model/src/main/java/com/sensetif/sink/model/sensor/Sensor.java
+   create model/src/main/java/com/sensetif/sink/model/sensor/SensorDetails.java
+   create model/src/main/java/com/sensetif/sink/model/sensor/SensorPoll.java
+   create model/src/main/java/com/sensetif/sink/model/sensor/Access.java
+   create model/src/main/java/com/sensetif/sink/model/sensor/JsonDocumentAddress.java
+   create model/src/main/java/com/sensetif/sink/model/sensor/XmlDocumentAddress.java
+   create model/src/main/java/com/sensetif/sink/model/sensor/ModbusDeviceAddress.java
+   create model/src/main/java/com/sensetif/sink/model/sensor/JsonPathSelector.java
+   create model/src/main/java/com/sensetif/sink/model/sensor/XPathSelector.java
+   create model/src/main/java/com/sensetif/sink/model/sensor/ModbusSelector.java
    create model/src/main/java/com/sensetif/sink/model/sensor/PollSchedule.java
+   create model/src/main/java/com/sensetif/sink/model/sensor/AccessType.java
+   create model/src/main/java/com/sensetif/sink/model/sensor/Address.java
+   create model/src/main/java/com/sensetif/sink/model/sensor/Selector.java
+   create bootstrap/src/main/java/com/sensetif/sink/bootstrap/domain/JmxModule.java
    create bootstrap/src/main/java/com/sensetif/sink/bootstrap/domain/SecurityModule.java
    create model/src/main/java/com/sensetif/sink/model/security/CryptoConfiguration.java
    create model/src/main/java/com/sensetif/sink/model/security/CryptoException.java
@@ -381,8 +421,18 @@ we will create a complete project, like this
    create model/src/main/java/com/sensetif/sink/model/security/SecurityRepository.java
    create model/src/main/java/com/sensetif/sink/model/security/User.java
    create model/src/main/java/com/sensetif/sink/model/security/UserFactory.java
+   create bootstrap/src/main/java/com/sensetif/sink/bootstrap/connectivity/HttpServerModule.java
    create bootstrap/src/main/java/com/sensetif/sink/bootstrap/connectivity/RestApiModule.java
    create rest/src/main/java/com/sensetif/sink/rest/security/DefaultEnroler.java
    create rest/src/main/java/com/sensetif/sink/rest/security/DefaultVerifier.java
+   create app/src/main/config/development/es-cassandra.properties
+   create app/src/main/config/qa/es-cassandra.properties
+   create app/src/main/config/staging/es-cassandra.properties
+   create app/src/main/config/production/es-cassandra.properties
 ----
 
+Notice that there is a ++app/src/main/config++ directory with 4 sub-directories. Each of those subdirectories
+represents one of the modes in ++Application.Mode++. The start script will look for the environment variable
+SYS_ENVIRONMENT and select the ++Application.Mode++ accordingly and set the configuration directory
+(i.e. make it part of the CLASSPATH) to such.
+