This project has retired. For details please refer to its Attic page.
Polygene Generator Starter Template for Bootstrap
Highlights
Polygene Generator
Background
What is COP?
What’s an Object anyway?
Polygene™ and state modeling
Related publications & projects

Polygene Generator

Apache Polygene comes with a Yeoman code generator, to quickly set up a development environment for Polygene applications.

mkdir projectdirname
cd projectdirname
yo polygene

It will ask a lot of questions. For choice questions, you operate up and down, and with multi-choice, you select with space bar.

First Trial

Project Name

It starts with the Project name. This will be the project name in Gradle and any gradle driven naming of the project such as in IDEs. It defaults to current directory with initial uppercase letter.

? Your project name
Java Package Name

This is the root of the package names in the multi-module, multi-package project.

? Java package name
Application Type

The Application Type that you want to create.

Note

Command Line is currently not implemented correctly, and the Rest API is still not complete.

? what type of application do you want to create?
  Command Line
❯ Rest API
Entity Store

Polygene has built-in persistence, and that is backed by entity store plugins. There are currently a fair number of implementations to choose from. Not that "memory" is not persistent, but looses the content on shutdown.

? Which entity store do you want to use?
  Cassandra
  File
  DerbySQL
  Geode
  H2SQL
  Hazelcast
  JClouds
  Jdbm
  LevelDB
> Memory
  MongoDB
  MySQL
  Preferences
  Redis
  Riak
  PostgreSQL
  SQLite
Indexin/Query system

Select of a pluggable Indexing and Query subsystem.

In Polygene, the indexing/query system is separated from store and retrieve. This allows us to optimize direct fetches for navigating object graphs. In practical Polygene applications, we find that querying is not nearly as common as in, say, JPA applications. The query layout in the underlying indexing system is also very different from the document-oriented approach of most entity stores.

Note

Not all indexing subsystems support all of the specified Indexing/Query SPI.

? Which indexing system do you want to use?
> Rdf
  ElasticSearch
  Solr
  SQL
Caching System

Some of the entity stores rely on a Polygene level caching SPI. This caching subsystem is pluggable and will be used by any of the entity stores that uses the internal MapEntityStore SPI

? Which caching system do you want to use?
> None
  Memcache
  EhCache
Serialization system

Serialization is a key concept in business applications, and in Polygene that is a pluggable subsystem.

? Which serialization system do you want to use?

> JavaxJson
  JavaxXml
  MessagePack
Metrics System

Metrics is the SPI for measuring the performance and health of an Polygene application. Currently only one implementation is available.

? Which metrics capturing system do you want to use?

> None
  Codahale
Other Features

JMX feature installs the MBean server and registers all Services with it, in the application structure defined.

Mixin Scripting is allowing Mixin methods to be implemented in other languages parallel to Java.

Security installs Apache Shiro and binds Users, Groups and Roles to entity store.

? Other features?
 ◯ jmx
 ◯ mixin scripting
 ◯ security
Example
~/dev/sensetif/sink$ yo polygene
? Your project name Sink
? Java package name com.sensetif.sink
? what type of application do you want to create? Rest API
? Which entity store do you want to use? Cassandra
? Which indexing system do you want to use? Rdf
? Which caching system do you want to use? None
? Which serialization system do you want to use? JavaxJson
? Which metrics capturing system do you want to use? Codahale
? Other features? jmx, security
app name Sink
Entity Stores: Cassandra
Indexing: Rdf
Caching: None
Serialization: JavaxJson
Features: [ 'jmx', 'security' ]
   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 app/build.gradle
   create bootstrap/build.gradle
   create model/build.gradle
   create rest/build.gradle
   create build.gradle
   create settings.gradle
   create gradlew
   create gradlew.bat
   create gradle/wrapper/gradle-wrapper.jar
   create gradle/wrapper/gradle-wrapper.properties
   create bootstrap/src/main/java/com/sensetif/sink/bootstrap/config/ConfigModule.java
   create bootstrap/src/main/java/com/sensetif/sink/bootstrap/infrastructure/FileConfigurationModule.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/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
   create model/src/main/java/com/sensetif/sink/model/security/CryptoService.java
   create model/src/main/java/com/sensetif/sink/model/security/EncryptedStringPropertyConcern.java
   create model/src/main/java/com/sensetif/sink/model/security/Group.java
   create model/src/main/java/com/sensetif/sink/model/security/RealmService.java
   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/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

Command Line Options

--import=<modelfile>   Imports the model from a JSON file and creates a project descibed therein.
--export=<modelfile>   Exports the generated model to a JSON file in the same format as the import model.
--noPrompt             If this option is not provided for --import-model, the user can still
                       input answers, which will override the values in the imported model
Example

If we run the following,

$ yo polygene --import=../model.json --noPrompt

where the content of the ../model.json is as follows,

{
  "name": "Sink",
  "packageName": "com.sensetif.sink",
  "applicationtype": "Rest API",
  "features": [
    "security"
  ],
  "entitystore": "MongoDB",
  "indexing": "SQL",
  "caching": "Memcache",
  "serialization": "JavaxJson",
  "metrics": "Codahale",
  "modules": {
    "user": {
      "cruds": [
        { "name": "Users" },
        {"name": "Roles"},
        {"name": "User"},
        {"name": "Role"},
        {"name": "Permission"},
        {"name": "Group"},
        {"name": "Groups"}
      ],
      "services": [
        {
          "name": "AuthService",
          "visibility": "application",
          "configuration" : [
            { "name": "backend", "type": "java.lang.String" },
            { "name": "connectString", "type": "java.lang.String" }
          ]
        }
      ]
    },
    "organization": {
      "cruds": [
        {"name": "Organizations"},
        {
          "name": "Organization",
          "properties": [
            { "name": "name", "type": "java.lang.String" },
            { "name": "created", "type": "java.time.Instant" }
          ]
        },
        { "name": "Project" }
      ],
      "entities": [
        { "name": "Invoice" }
      ],
      "values": [
        {
          "name": "CreditLimit",
          "properties" : [
            { "name" : "amount", "type" : "java.math.BigDecimal" },
            { "name" : "currency", "type" : "java.lang.String" }
          ]
        }
      ],
      "transients": [
        { "name": "OrderConfirmation" }
      ],
      "objects": [
        { "name": "PaypalNotification" }
      ]
    },
    "sensor": {
      "cruds": [
        { "name": "SensorData" }
      ],
      "entities": [
        { "name": "Sensor" },
        { "name": "PollSchedule" }
      ]
    }
  }
}

we will create a complete project, like this

  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 app/build.gradle
   create bootstrap/build.gradle
   create model/build.gradle
   create rest/build.gradle
   create build.gradle
   create settings.gradle
   create gradlew
   create gradlew.bat
   create gradle/wrapper/gradle-wrapper.jar
   create gradle/wrapper/gradle-wrapper.properties
   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/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/Role.java
   create model/src/main/java/com/sensetif/sink/model/user/Permission.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/AuthConfiguration.java
   create model/src/main/resources/com/sensetif/sink/model/user/AuthConfiguration.yaml
   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/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/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/PollSchedule.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
   create model/src/main/java/com/sensetif/sink/model/security/CryptoService.java
   create model/src/main/java/com/sensetif/sink/model/security/EncryptedStringPropertyConcern.java
   create model/src/main/java/com/sensetif/sink/model/security/Group.java
   create model/src/main/java/com/sensetif/sink/model/security/RealmService.java
   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/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