Details

    • Type: Sub-task
    • Status: Closed (View Workflow)
    • Priority: Major
    • Resolution: Done
    • Affects Version/s: None
    • Fix Version/s: 3.0.0.Beta2
    • Component/s: None
    • Labels:
      None

      Description

      At the moment Forge generates code without having a real notion of a technical stack. For example, creating a JPA Entity for a Java EE 6 application could be different from a Java EE 7 application :

      • The persistence.xml version if different (2.0 / 2.1)
      • The properties are different (e.g. schema generation in 2.1)
      • The syntax is different (List<MyEntity> m = new ArrayList<MyEntity> while it could use diamond syntax for a Java EE 7 stack)

      The stack could be choosen when the project is created :

      • project-new --named myproj : let's the developper use Forge without any special stack
      • project-new --named myproj --stack JavaEE7 : the generated code will follow Java EE 7

      Possible stacks

      A stack would bundle certain facets. Therefore we could have as many stacks as needed. As an example, we could have the following stacks :

      • Java EE 6 : JPA 2.0, CDI 1.0, JSF 2.0, Bean Validation 1.0, JTA 1.1
      • Java EE 7 : JPA 2.1, CDI 1.1, JSF 2.2, Bean Validation 1.1, JTA 1.2, Batch 1.0
      • Micro Java EE 7 Service: JPA 2.1, CDI 1.1, JSF 2.2, Bean Validation 1.1, JTA 1.2, Batch 1.0 (but with special Microservice configuration)
      • Java EE 8 : JPA 2.1, CDI 2.0, JSF 2.3, Bean Validation 1.2, JTA 1.2, Batch 1.0, JCache 1.1, MVC 1.0
      • Spring 3.x
      • Spring 4.x
      • ....

      Differences in having stacks

      Filtering commands

      When you pick up a Stack, it gives you access or not to certain commands. For example, if you create a project with a Java EE 6 stack, you won't have access to any Batch, MVC... commands

      Java EE 6 stack
      $ project-new --named myproj --stack JavaEE6
      $ jpa-new-entity --named MyEntity
      
      Java EE 7 stack
      $ project-new --named myproj --stack JavaEE7
      $ jpa-new-entity --named MyEntity
      $ mvc-new-controller --named MyController // only available on EE7
      

      Setting up command versions

      When you pick up a Stack, it filters the commands that have the right version for the right stack. For example, if you create a Java EE 6 stack, you will get JPA 2.0 commands, for a Java EE 7 stack, the JPA 2.1 commands. Also, the version parameters will be disabled

      No stack
      $ project-new --named myproj
      $ jpa-new-entity --named MyEntity --jpaVersion 2.1
      $ cdi-new-bean --named MyBean --cdiVersion 1.1
      
      Java EE 6 stack
      $ project-new --named myproj --stack JavaEE6
      $ jpa-new-entity --named MyEntity  // no --jpaVersion because it is automatically set to 2.0
      
      Java EE 7 stack
      $ project-new --named myproj --stack JavaEE7
      $ jpa-new-entity --named MyEntity  // no --jpaVersion because it is automatically set to 2.1
      $ jpa-new-converter --named MyConvert  // JPA Converters are only available in 2.1
      

      API to define a Stack

      A stack could be defined with a fluent API such as :

      stack("JavaEE7").includes(JavaEE7Facet).includes(JPA2.1Facet).excludes(SpringFacet)
      stack("JavaEE7").includes(JavaEE7Facet).includes(JPA2.1Facet).allowsFeature(WildflySwarm)
      stack("MyOwnStacks").includes(JavaEE7Stack).includes(MyFacet).includes(YourFacet)
      

        Gliffy Diagrams

          Attachments

            Issue Links

              Activity

                People

                • Assignee:
                  gastaldi George Gastaldi
                  Reporter:
                  agoncal Antonio Goncalves
                • Votes:
                  1 Vote for this issue
                  Watchers:
                  5 Start watching this issue

                  Dates

                  • Created:
                    Updated:
                    Resolved: