]
Jess Sightler commented on FORGE-2316:
--------------------------------------
The JIRA states that the version parameter will be disabled. I am not sure that is exactly
the right thing to do. It might be desirable in some cases to target one stack (eg, EE 7),
but generate an entity for an older stack that is backwards compatible. Maybe a warning
would be better in this case?
Brainstorming on introducing "Stacks"
-------------------------------------
Key: FORGE-2316
URL:
https://issues.jboss.org/browse/FORGE-2316
Project: Forge
Issue Type: Sub-task
Reporter: Antonio Goncalves
Fix For: 3.x Future
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
h3. 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
* ....
h3. Differences in having stacks
h4. 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
{code:title=Java EE 6 stack}
$ project-new --named myproj --stack JavaEE6
$ jpa-new-entity --named MyEntity
{code}
{code:title=Java EE 7 stack}
$ project-new --named myproj --stack JavaEE7
$ jpa-new-entity --named MyEntity
$ mvc-new-controller --named MyController // only available on EE7
{code}
h4. 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
{code:title=No stack}
$ project-new --named myproj
$ jpa-new-entity --named MyEntity --jpaVersion 2.1
$ cdi-new-bean --named MyBean --cdiVersion 1.1
{code}
{code:title=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
{code}
{code:title=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
{code}
h4. API to define a Stack
A stack could be defined with a fluent API such as :
{code}
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)
{code}