17 kwietnia 2008

Pierwsze kroki z MDA w wykonaniu AndroMDA

Po komentarzu Krzyśka do wpisu Pierwsze kroki z UML w NetBeans 6.1, w którym wspomniał o MDA i lekturze artykułu Mariusza Wójcika Spring Framework - projektowanie aplikacji w oparciu o koncepcję MDA nie miałem wątpliwości, że po wczorajszej zabawie z UML dzisiaj pora spróbować sił z MDA - Model-Driven Architecture. Podejście MDA pozwala na tworzenie aplikacji bazując na modelach UML niezależnie od docelowego środowiska uruchomieniowego i użytych technologii, które są transformowane do aplikacji wynikowej za pomocą pewnych magicznych transformat. W innych słowach możnaby założyć, że wystarczy jedynie trochę porysować i po dodaniu pewnych atrybutów utworzenie aplikacji to jedynie wydanie polecenia Generate. Trochę się człowiek nasłuchał o tego typu programowaniu, że fajne i takie tam, ale praktycznej wiedzy żadnej. Czas to zmienić.

Rozpocząłem od wspomnianego artykułu Mariusza, a później zajrzałem na strony AndroMDA. Zacząłem od dostępnej dokumentacji, gdzie w Environment Setup napisano:

Install Maven - A repository containing all versioned dependencies. This repository is used during the build and deploy processes (very similar to the .NET Global Assembly Cache concept).

Użycie Mavena do tworzenia aplikacji zawsze spotyka się z moją aprobatą, więc nie miałem złudzeń, że dzisiaj będzie znowu przyjemnie. Wzmianka o .Net w kontekście Mavena była zaskakująca. Może ktoś coś napisać o tym .NET Global Assembly Cache w kilku krótkich, żołnierskich zdaniach? Ja tu wierzę, że pomysły nowatorskie płynące z projektów otwartych, a tu się okazuje, że w .Net to już dawno wszystko (?) było ;-)

Właśnie niedawno wyszła wersja Apache Maven 2.0.9, więc przy okazji uaktualnimy ją i popróbujemy się z AndroMDA.

Uwaga na potencjalny błąd w tandemie Maven-AndroMDA:

(Note that as of this writing, the latest version of Maven is 2.0.7, but it has a minor issue with AndroMDA 3.2 - this has been fixed in the latest snapshot release. Advanced users may wish to install Maven 2.0.7, but you will have to manually delete the section in app\pom.xml.)

Dzisiejszy pomysł to stworzenie aplikacij webowej z wykorzystaniem AndroMDA, które realizuje specyfikację MDA. Zamiast, jak to polecano w dokumentacji AndroMDA, uruchomienia aplikacji na JBAS skorzystam z aktrakcyjniejszej funkcjonalnie oferty serwera Java EE 5, potencjalnie Apache Geronimo (chociaż w obwodzie oczekuje i GlassFish).
 jlaskowski@work /cygdrive/c/projs/sandbox
$ mvn -v
Maven version: 2.0.9
Java version: 1.5.0_14
OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"

jlaskowski@work /cygdrive/c/projs/sandbox
$ mvn archetype:create -DgroupId=pl.jaceklaskowski.jsf.mda -DartifactId=mda-webapp
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO] task-segment: [archetype:create] (aggregator-style)
[INFO] ------------------------------------------------------------------------
...
[INFO] OldArchetype created in dir: c:\projs\sandbox\mda-webapp
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
Uruchamiam NetBeans IDE 6.1 RC1 i importuję projekt, aby zmodyfikować pom.xml (plik konfiguracyjny "serce" projektu mavenowego). Wcześniej zainstalowałem netbeansową wtyczkę wspierającą projekty mavenowe (patrz Tworzenie wtyczek Maven 2 z NetBeans IDE 6.1), więc wystarczy Ctrl+Shift+O i wybrać katalog, który stworzyłem wcześniej ręcznie (auć, przecież mogłem to stworzyć z poziomu NB!).


Po zmianach pom.xml prezentuje się następująco:
 <project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>pl.jaceklaskowski.jsf.mda</groupId>
<artifactId>mda-webapp</artifactId>
<version>1.0</version>
<name>Aplikacja webowa z pomocą (Andro)MDA, Maven2 i NetBeans 6.1</name>
<url>http://www.jaceklaskowski.pl</url>
<build>
<defaultGoal>compile</defaultGoal>
<plugins>
<plugin>
<groupId>org.andromda.maven.plugins</groupId>
<artifactId>andromdapp-maven-plugin</artifactId>
<version>3.2</version>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>andromda</id>
<name>AndroMDA Repository</name>
<url>http://team.andromda.org/maven2</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>andromda</id>
<name>AndroMDA Repository</name>
<url>http://team.andromda.org/maven2</url>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Wybieram Build z menu kontekstowego projektu (zaznaczam projekt w widoku Projects i z menu pod prawym przyciskiem myszki wybieram Build). BUILD SUCCESSFUL w oknie Output upewnia mnie, że wszystko jest jak należy.

W sekcji Install a UML tool proponuje się skorzystanie z narzędzia UML, w którym zobrazuję mój pomysł nowej aplikacji webowej, którą następnie wyeksportuję w odpowiednim formacie zrozumiałym dla AndroMDA. Mam dostęp do wszystkich wymienionych produktów, ale do IBM Rational Software Architect (obecnie w wersji 7.0.0.6), który wspiera UML2/EMF jest mi najbliżej skorzystam z niego (mógłbym również skorzystać z NetBeans IDE 6.1 i jego wsparcia UMLa, ale skoro nie jest wymieniony na stronie na razie odpada).

We wskazanej gotowej aplikacji na stronie TimeTracker Tour można znaleźć plik readme.txt, w którym napisano:

The project located in this directory has been generated by Naresh Bhatia using the andromdapp:generate Maven plugin.

Fajnie wiedzieć, że przynajmniej część mojej pracy mogę zrzucić na barki mavena. Spróbujmy dowiedzieć się więcej o tej wtyczce z pomocą mvn help:describe (tak mógłbym wszystko wyczytać w pliku, albo na stronie, ale pomyślałem, że pochwalę się moją znajomością Maven-Fu ;-)).
 jlaskowski@work ~
$ mvn help:describe -Dplugin=org.andromda.maven.plugins:andromdapp-maven-plugin:3.2
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'help'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO] task-segment: [help:describe] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [help:describe]
[INFO] Plugin: 'org.andromda.maven.plugins:andromdapp-maven-plugin:3.2'
-----------------------------------------------
Group Id: org.andromda.maven.plugins
Artifact Id: andromdapp-maven-plugin
Version: 3.2
Goal Prefix: andromdapp
Description:

A plugin for running AndroMDA's AndroMDApp application generator
to generate Maven2 AndroMDA powered applications.
albo nawet z parametrem -Dmedium=true, który przedstawi funkcjonalność wtyczki w okrojonej postaci (dla czytających o mocnych nerwach proponuje się opcję -Dfull=true. Uprasza się o zapięcie pasów przez uruchomieniem polecenia ;-)).
 jlaskowski@work ~
$ mvn help:describe -Dplugin=org.andromda.maven.plugins:andromdapp-maven-plugin:3.2 -Dmedium=true
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'help'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO] task-segment: [help:describe] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [help:describe]
[INFO] Plugin: 'org.andromda.maven.plugins:andromdapp-maven-plugin:3.2'
-----------------------------------------------
Group Id: org.andromda.maven.plugins
Artifact Id: andromdapp-maven-plugin
Version: 3.2
Goal Prefix: andromdapp
Description:

A plugin for running AndroMDA's AndroMDApp application generator
to generate Maven2 AndroMDA powered applications.

Mojos:

Goal: 'clean-structure'
Description:
Removes the an AndroMDApp generated application structure.

Goal: 'generate'
Description:
AndroMDA application generator Mojo.

Goal: 'build'
Description:
A Mojo used for executing the build goals from the top level project.

Goal: 'deploy'
Description:
Provides the deployment of applications to a given directory.

Goal: 'eclipse'
Description:
Writes the necessary .classpath and .project files for a new eclipse application.

Goal: 'maven'
Description:
Allows the execution of maven from a given project (searches for nested pom.xml files and executes Maven)

Goal: 'schema'
Description:
Provides the ability to drop database schemas.

Goal: 'instrument-scripts'
Description:
Allows for the {@link ScriptClassGenerator} mojo to be invoked. on one or more given classes.

Goal: 'undeploy'
Description:
Provides the undeployment of applications from a given directory.
Importuję aplikację timetracker-completed do NB i wykonuję Clean and Build (przecież nie będę tego robił z linii poleceń, kiedy dotykam MDA, nieprawdaż?). Jedna uwaga, projekt TimeTracker po zaimportowaniu zostanie oznaczony przez NB jako posiadający błędy i wykonanie budowania spowoduje rozwiązanie problemów (niedostępności bibliotek w lokalnym repozytorium mavena). Trochę to trwa zanim aplikacja zostanie zbudowana, aż po około 2-3 minutach pojawia się [ERROR]BUILD FAILURE. Hmm, czyżbym tracił cierpliwość? Próbuję innymi technikami - z menu kontekstowego projektu TimeTracker wybieram Open Required Projects (wcześniej jedynie otworzyłem projekt główny) i sprawdzam klasę UserVOComparator (projekt TimeTracker Common (jar)). Najwyraźniej nie ma klasy UserVO w projekcie. Wykonanie polecenia
 jlaskowski@work /cygdrive/c/temp/timetracker-completed
$ find . -name UserVO.java -print
nie napawa optymizmem. Może ten plik jest tworzony dynamicznie podczas budowania? Zgodnie z dokumentacją powinienem mvn install w katalogu głównym aplikacji. Niech będzie.
 jlaskowski@work /cygdrive/c/temp/timetracker-completed
$ mvn install
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] An invalid artifact was detected.

This artifact might be in your project's POM, or it might have been included transitively
during the resolution process. Here is the information we do have for

o GroupID: org.andromda.timetracker
o ArtifactID: timetracker-common
o Version: <<< MISSING >>>
o Type: jar

[INFO] ------------------------------------------------------------------------
[INFO] Trace
org.apache.maven.artifact.InvalidArtifactRTException: For artifact {org.andromda.timetracker:timetracker-common:null:jar}:
The version cannot be empty.
at org.apache.maven.artifact.DefaultArtifact.validateIdentity(DefaultArtifact.java:147)
at org.apache.maven.artifact.DefaultArtifact.<init>(DefaultArtifact.java:122)
at org.apache.maven.artifact.factory.DefaultArtifactFactory.createArtifact(DefaultArtifactFactory.java:158)
at org.apache.maven.artifact.factory.DefaultArtifactFactory.createDependencyArtifact(DefaultArtifactFactory.java:58)
at org.apache.maven.project.DefaultMavenProjectBuilder.createManagedVersionMap(DefaultMavenProjectBuilder.java:452)
at org.apache.maven.project.DefaultMavenProjectBuilder.buildInternal(DefaultMavenProjectBuilder.java:912)
at org.apache.maven.project.DefaultMavenProjectBuilder.buildFromSourceFileInternal(DefaultMavenProjectBuilder.java:506)
at org.apache.maven.project.DefaultMavenProjectBuilder.build(DefaultMavenProjectBuilder.java:198)
at org.apache.maven.DefaultMaven.getProject(DefaultMaven.java:583)
at org.apache.maven.DefaultMaven.collectProjects(DefaultMaven.java:461)
at org.apache.maven.DefaultMaven.collectProjects(DefaultMaven.java:534)
at org.apache.maven.DefaultMaven.getProjects(DefaultMaven.java:365)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:292)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:129)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:287)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Pięknie! Napawa optymizmem do dalszej ewaluacji, co?

Kończę rozdział i po chwili jestem w Starter App. Zamiast jednak tworzyć aplikację z linii poleceń, skorzystam z NB.

Ctrl+Shift+N i z kategorii Maven wybieram Maven Project. Wciskam przycisk Add... gdzie podaję dane wtyczki, którą wykorzystam do tworzenia aplikacji.


Jak się okazuje takie podejście nie przejdzie, gdyż NB zakończy pracę z:
 [ERROR]BUILD ERROR
------------------------------------------------------------------------
Error creating from archetype

Embedded error: The META-INF/maven/archetype.xml descriptor cannot be found.
Wracam na linię poleceń. Już będę grzeczny.
 jlaskowski@work /cygdrive/c/projs/sandbox
$ mvn org.andromda.maven.plugins:andromdapp-maven-plugin:3.2:generate
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO] task-segment: [org.andromda.maven.plugins:andromdapp-maven-plugin:3.2:generate] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [andromdapp:generate]
log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester).
log4j:WARN Please initialize the log4j system properly.
INFO [AndroMDA] discovered andromdapp type --> 'j2ee'
INFO [AndroMDA] discovered andromdapp type --> 'richclient'

Please choose the type of application to generate [j2ee, richclient]
j2ee

Please enter the location in which your new application will be created (i.e. f:/java/development):
c:/projs/sandbox

Please enter your first and last name (i.e. Chad Brandon):
Jacek Laskowski

Which kind of modeling tool will you use? [uml1.4, uml2, emf-uml2]:
emf-uml2

Please enter the name of your J2EE project (i.e. Animal Quiz):
Powitanie

Please enter an id for your J2EE project (i.e. animalquiz):
mda-powitanie

Please enter a version for your project (i.e. 1.0-SNAPSHOT):
1.0

Please enter the root package name for your J2EE project (i.e. org.andromda.samples.animalquiz):
pl.jaceklaskowski.powitanie

Would you like an EAR or standalone WAR? [ear, war]:
ear

Please enter the type of transactional/persistence cartridge to use [hibernate, ejb, ejb3, spring, none]:
ejb3

Please enter the database backend for the persistence layer
[hypersonic, mysql, oracle, db2, informix, mssql, pointbase, postgres, sybase, sabdb, progress, derby]:
derby

Will your project need workflow engine capabilities? (it uses jBPM and Hibernate3)? [yes, no]:
no

Will your project have a web user interface? [yes, no]:
yes

Would you like your web user interface to use JSF or Struts? [jsf, struts]:
jsf

Would you like to use Facelets or JSP as your view type for JSF? [facelets, jsp]:
facelets

Would you like to use the JBoss Seam application framework? [yes, no]:
yes

Would you like to be able to expose your services as web services? [yes, no]:
yes

Would you like to use the JSR181 (webservice defined by annotations) EJB3 cartridge specific implementation? [yes, no]:
yes
-------------------------------------------------------------------------------------
G e n e r a t i n g A n d r o M D A P o w e r e d A p p l i c a t i o n
-------------------------------------------------------------------------------------
Output: 'file:/c:/projs/sandbox/mda-powitanie/app/src/main/application/META-INF/jboss-app.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/app/src/main/config/mda-powitanie-ds.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/app/pom.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/core/target/classes/META-INF/ejb-jar.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/core/pom.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/pom.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/readme.txt'
Output: 'file:/c:/projs/sandbox/mda-powitanie/common/pom.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/mda/src/main/config/mappings/WebMergeMappings.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/mda/src/main/config/andromda.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/mda/src/main/uml/mda-powitanie.uml2'
Output: 'file:/c:/projs/sandbox/mda-powitanie/mda/pom.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/web/src/main/properties/messages.properties'
Output: 'file:/c:/projs/sandbox/mda-powitanie/web/pom.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/web/target/mda-powitanie-web-1.0/WEB-INF/web.xml'
-------------------------------------------------------------------------------------
New application generated to --> 'file:/c:/projs/sandbox/mda-powitanie/'
Instructions for your new application --> 'file:/c:/projs/sandbox/mda-powitanie/readme.txt'
-------------------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
Otwieram projekt mda-powitanie i projekty zależne w NB (Ctrl+Shift+O). Teraz jest czysto (z ostrzeżeniami, których udam, że nie zauważam).


Jak w poprzednim projekcie w katalogu głównym znajduje się plik readme.txt (widoczny w NB w oknie Files, gdyż Projects ukrywa pliki, których nierozpoznaje).

Wykonuję mvn install w wydaniu NB, tj. Clean and Build. W pobieranych zależnościach, podczas budowania, pojawiają się myfaces-impl-1.1.1, tomahawk-1.1.1, aż kończę z
 ------------------------------------------------------------------------
[ERROR]BUILD ERROR
------------------------------------------------------------------------
Failed to resolve artifact.

Missing:
----------
1) org.andromda.profiles.uml14:andromda-profile-seam:xml.zip:1.0-SNAPSHOT

Try downloading the file manually from the project website.

Then, install it using the command:
mvn install:install-file -DgroupId=org.andromda.profiles.uml14 -DartifactId=andromda-profile-seam \
-Dversion=1.0-SNAPSHOT -Dpackaging=xml.zip -Dfile=/path/to/file

Path to dependency:
1) pl.jaceklaskowski.powitanie:mda-powitanie-mda:pom:1.0
2) org.andromda.profiles.uml14:andromda-profile-seam:xml.zip:1.0-SNAPSHOT

----------
1 required artifact is missing.

for artifact:
pl.jaceklaskowski.powitanie:mda-powitanie-mda:pom:1.0

from the specified remote repositories:
central (http://repo1.maven.org/maven2),
andromda (http://team.andromda.org/maven2)
Ech, znowu kłopoty. Kasuję projekt i zaczynam jeszcze raz, tyle że bez Seama i Web Services (po tylu problemach stałem się mniej wymagający).
 jlaskowski@work /cygdrive/c/projs/sandbox
$ mvn org.andromda.maven.plugins:andromdapp-maven-plugin:3.2:generate
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO] task-segment: [org.andromda.maven.plugins:andromdapp-maven-plugin:3.2:generate] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [andromdapp:generate]
log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester).
log4j:WARN Please initialize the log4j system properly.
INFO [AndroMDA] discovered andromdapp type --> 'j2ee'
INFO [AndroMDA] discovered andromdapp type --> 'richclient'

Please choose the type of application to generate [j2ee, richclient]
j2ee

Please enter the location in which your new application will be created (i.e. f:/java/development):
c:/projs/sandbox

Please enter your first and last name (i.e. Chad Brandon):
Jacek Laskowski

Which kind of modeling tool will you use? [uml1.4, uml2, emf-uml2]:
emf-uml2

Please enter the name of your J2EE project (i.e. Animal Quiz):
Powitanie

Please enter an id for your J2EE project (i.e. animalquiz):
mda-powitanie

Please enter a version for your project (i.e. 1.0-SNAPSHOT):
1.0

Please enter the root package name for your J2EE project (i.e. org.andromda.samples.animalquiz):
pl.jaceklaskowski.powitanie

Would you like an EAR or standalone WAR? [ear, war]:
ear

Please enter the type of transactional/persistence cartridge to use [hibernate, ejb, ejb3, spring, none]:
ejb3

Please enter the database backend for the persistence layer
[hypersonic, mysql, oracle, db2, informix, mssql, pointbase, postgres, sybase, sabdb, progress, derb
derby

Will your project need workflow engine capabilities? (it uses jBPM and Hibernate3)? [yes, no]:
no

Will your project have a web user interface? [yes, no]:
yes

Would you like your web user interface to use JSF or Struts? [jsf, struts]:
jsf

Would you like to use Facelets or JSP as your view type for JSF? [facelets, jsp]:
facelets

Would you like to use the JBoss Seam application framework? [yes, no]:
no

Would you like to be able to expose your services as web services? [yes, no]:
no
-------------------------------------------------------------------------------------
G e n e r a t i n g A n d r o M D A P o w e r e d A p p l i c a t i o n
-------------------------------------------------------------------------------------
Output: 'file:/c:/projs/sandbox/mda-powitanie/app/src/main/application/META-INF/jboss-app.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/app/src/main/config/mda-powitanie-ds.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/app/pom.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/core/target/classes/META-INF/ejb-jar.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/core/pom.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/pom.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/readme.txt'
Output: 'file:/c:/projs/sandbox/mda-powitanie/common/pom.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/mda/src/main/config/mappings/WebMergeMappings.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/mda/src/main/config/andromda.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/mda/src/main/uml/mda-powitanie.uml2'
Output: 'file:/c:/projs/sandbox/mda-powitanie/mda/pom.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/web/src/main/properties/messages.properties'
Output: 'file:/c:/projs/sandbox/mda-powitanie/web/pom.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/web/target/mda-powitanie-web-1.0/WEB-INF/web.xml'
-------------------------------------------------------------------------------------
New application generated to --> 'file:/c:/projs/sandbox/mda-powitanie/'
Instructions for your new application --> 'file:/c:/projs/sandbox/mda-powitanie/readme.txt'
-------------------------------------------------------------------------------------
Ponownie otwarcie projektu w NB i Clean and Build, które kończy się:
 INFO  [AndroMDA] completed model processing --> TIME: 10.688[s], RESOURCES WRITTEN: 118
[andromdapp:eclipse {execution: default}]
Project file written --> 'C:\projs\sandbox\mda-powitanie\.project'
found project pl.jaceklaskowski.powitanie:mda-powitanie-common:jar:1.0
found project pl.jaceklaskowski.powitanie:mda-powitanie-core:ejb:1.0
found project pl.jaceklaskowski.powitanie:mda-powitanie-web:war:1.0
------------------------------------------------------------------------
[ERROR]BUILD ERROR
------------------------------------------------------------------------
Error creating eclipse configuration

Embedded error: Unable to download the artifact from any repository

Try downloading the file manually from the project website.

Then, install it using the command:
mvn install:install-file -DgroupId=org.jboss -DartifactId=jboss-remoting \
-Dversion=4.0.4-GA -Dpackaging=jar -Dfile=/path/to/file


org.jboss:jboss-remoting:jar:4.0.4-GA

from the specified remote repositories:
central (http://repo1.maven.org/maven2),
andromda (http://team.andromda.org/maven2)
co jednak mnie nie przeraża, bo sam projekt został zbudowany, a jedynie projekt eclipsowy się nie utworzył.

..po chwili...

No dobrze, dobrze - zajmę się i tym (co, jak się zaraz okaże, nie było właściwą decyzją). Do głównego pom.xml projektu dodaję
 <repository>
<id>jboss.com</id>
<name>JBoss Repository</name>
<url>http://repository.jboss.com/maven2/</url>
</repository>
i ponownie podchodzę do Clean and Build. Znowu błąd. Dziwne, ale tego jboss-remoting nie ma w repozytorium jboss.com. Jest jednak w wersji 4.0.5-GA w repozytorium andromda (http://team.andromda.org/maven2). Wniosek: wtyczka andromdapp-maven-plugin w wersji 3.2 tworzy projekt z przestarzałymi (i niedostępnymi) zależnościami. Na stronie wtyczki andromdapp-maven-plugin data ostatniej publikacji to 01 Mar 2008 11:53 CET, jednakże jest to dla wersji 3.3-SNAPSHOT. Nie ma wielkiego wyboru jak popróbować jej.

Na szczęście projekt AndroMDA przewidział taką sytuację, że chciałbym skorzystać z wtyczki poza projektem, gdzie w pom.xml mógłbym zdefiniować zależność i udostępnił gotowy plik zip z koniecznymi artefaktami mavenowymi do rozpakowania w lokalnym repozytorium mavena.
 jlaskowski@work /cygdrive/c/projs/sandbox
$ cd c:/.m2

jlaskowski@work /cygdrive/c/.m2
$ wget -c \
http://team.andromda.org/maven2/org/andromda/maven/plugins/\
andromdapp-maven-plugin/3.3-SNAPSHOT/andromdapp-maven-plugin-install-3.3-SNAPSHOT.zip
...
12:13:49 (153.83 KB/s) - `andromdapp-maven-plugin-install-3.3-SNAPSHOT.zip' saved [80881/80881]

jlaskowski@work /cygdrive/c/.m2
$ jar -xvf andromdapp-maven-plugin-install-3.3-SNAPSHOT.zip
created: org/
created: org/andromda/
created: org/andromda/maven/
created: org/andromda/maven/plugins/
created: org/andromda/maven/plugins/andromdapp-maven-plugin/
created: org/andromda/maven/plugins/andromdapp-maven-plugin/3.3-SNAPSHOT/
inflated: org/andromda/maven/plugins/andromdapp-maven-plugin/3.3-SNAPSHOT/andromdapp-maven-plugin-3.3-SNAPSHOT.jar
inflated: org/andromda/maven/plugins/andromdapp-maven-plugin/3.3-SNAPSHOT/andromdapp-maven-plugin-3.3-SNAPSHOT.pom
inflated: org/andromda/maven/plugins/andromdapp-maven-plugin/maven-metadata-local.xml
Gotowe! Znowu podchodzę do stworzenia projektu z wtyczką andromdapp-maven-plugin w wersji 3.3-SNAPSHOT.
 jlaskowski@work /cygdrive/c/projs/sandbox
$ mvn org.andromda.maven.plugins:andromdapp-maven-plugin:3.3-SNAPSHOT:generate
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.

GroupId: org.andromda.maven.plugins
ArtifactId: andromda-maven-plugins
Version: 3.3-SNAPSHOT

Reason: Unable to download the artifact from any repository

org.andromda.maven.plugins:andromda-maven-plugins:pom:3.3-SNAPSHOT

from the specified remote repositories:
ibiblio.org (http://repo1.maven.org/maven2)
Tego już za wiele! Wracam do wtyczki w wersji 3.2 i rezygnuję z EJB3, co powinno znieść wymaganie odnośnie jakichkolwiek zależności jbossowych.
 jlaskowski@work /cygdrive/c/projs/sandbox
$ mvn org.andromda.maven.plugins:andromdapp-maven-plugin:3.2:generate
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO] task-segment: [org.andromda.maven.plugins:andromdapp-maven-plugin:3.2:generate] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [andromdapp:generate]
log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester).
log4j:WARN Please initialize the log4j system properly.
INFO [AndroMDA] discovered andromdapp type --> 'j2ee'
INFO [AndroMDA] discovered andromdapp type --> 'richclient'

Please choose the type of application to generate [j2ee, richclient]
j2ee

Please enter the location in which your new application will be created (i.e. f:/java/development):
c:/projs/sandbox

Please enter your first and last name (i.e. Chad Brandon):
Jacek Laskowski

Which kind of modeling tool will you use? [uml1.4, uml2, emf-uml2]:
emf-uml2

Please enter the name of your J2EE project (i.e. Animal Quiz):
Powitanie

Please enter an id for your J2EE project (i.e. animalquiz):
mda-powitanie

Please enter a version for your project (i.e. 1.0-SNAPSHOT):
1.0

Please enter the root package name for your J2EE project (i.e. org.andromda.samples.animalquiz):
pl.jaceklaskowski.powitanie

Would you like an EAR or standalone WAR? [ear, war]:
ear

Please enter the type of transactional/persistence cartridge to use [hibernate, ejb, ejb3, spring, none]:
none

Will your project need workflow engine capabilities? (it uses jBPM and Hibernate3)? [yes, no]:
no

Will your project have a web user interface? [yes, no]:
yes

Would you like your web user interface to use JSF or Struts? [jsf, struts]:
jsf

Would you like to use Facelets or JSP as your view type for JSF? [facelets, jsp]:
jsp

Would you like to be able to expose your services as web services? [yes, no]:
no
-------------------------------------------------------------------------------------
G e n e r a t i n g A n d r o M D A P o w e r e d A p p l i c a t i o n
-------------------------------------------------------------------------------------
Output: 'file:/c:/projs/sandbox/mda-powitanie/app/src/main/application/META-INF/jboss-app.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/app/src/main/config/mda-powitanie-ds.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/app/pom.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/pom.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/readme.txt'
Output: 'file:/c:/projs/sandbox/mda-powitanie/common/pom.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/mda/src/main/config/mappings/WebMergeMappings.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/mda/src/main/config/andromda.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/mda/src/main/uml/mda-powitanie.uml2'
Output: 'file:/c:/projs/sandbox/mda-powitanie/mda/pom.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/web/src/main/properties/messages.properties'
Output: 'file:/c:/projs/sandbox/mda-powitanie/web/pom.xml'
Output: 'file:/c:/projs/sandbox/mda-powitanie/web/target/mda-powitanie-web-1.0/WEB-INF/web.xml'
-------------------------------------------------------------------------------------
New application generated to --> 'file:/c:/projs/sandbox/mda-powitanie/'
Instructions for your new application --> 'file:/c:/projs/sandbox/mda-powitanie/readme.txt'
-------------------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
Ponownie Clean and Build w NB.
 ------------------------------------------------------------------------
[ERROR]BUILD ERROR
------------------------------------------------------------------------
Failed to resolve artifact.

Missing:
----------
1) org.andromda.cartridges:andromda-jsf-cartridge-components:jar:unknown

Try downloading the file manually from the project website.

Then, install it using the command:
mvn install:install-file -DgroupId=org.andromda.cartridges -DartifactId=andromda-jsf-cartridge-components \
-Dversion=unknown -Dpackaging=jar -Dfile=/path/to/file

Path to dependency:
1) pl.jaceklaskowski.powitanie:mda-powitanie-web:war:1.0
2) org.andromda.cartridges:andromda-jsf-cartridge-components:jar:unknown

2) oracle.adf.view.faces:adf-faces-api:jar:unknown

Try downloading the file manually from the project website.

Then, install it using the command:
mvn install:install-file -DgroupId=oracle.adf.view.faces -DartifactId=adf-faces-api \
-Dversion=unknown -Dpackaging=jar -Dfile=/path/to/file

Path to dependency:
1) pl.jaceklaskowski.powitanie:mda-powitanie-web:war:1.0
2) oracle.adf.view.faces:adf-faces-api:jar:unknown

3) org.apache.myfaces:tomahawk:jar:unknown

Try downloading the file manually from the project website.

Then, install it using the command:
mvn install:install-file -DgroupId=org.apache.myfaces -DartifactId=tomahawk \
-Dversion=unknown -Dpackaging=jar -Dfile=/path/to/file

Path to dependency:
1) pl.jaceklaskowski.powitanie:mda-powitanie-web:war:1.0
2) org.apache.myfaces:tomahawk:jar:unknown

4) org.apache.myfaces:myfaces-api:jar:unknown

Try downloading the file manually from the project website.

Then, install it using the command:
mvn install:install-file -DgroupId=org.apache.myfaces -DartifactId=myfaces-api \
-Dversion=unknown -Dpackaging=jar -Dfile=/path/to/file

Path to dependency:
1) pl.jaceklaskowski.powitanie:mda-powitanie-web:war:1.0
2) org.apache.myfaces:myfaces-api:jar:unknown

----------
4 required artifacts are missing.

for artifact:
pl.jaceklaskowski.powitanie:mda-powitanie-web:war:1.0

from the specified remote repositories:
central (http://repo1.maven.org/maven2),
andromda (http://team.andromda.org/maven2)
Teraz jest jeszcze gorzej. Na dzisiaj koniec tego ewaluowania AndroMDA. Teraz już wiem, dlaczego tak niewielu korzysta z MDA. Fajne w założeniach, ale po prostu nie działa (albo ja coś pokręciłem i zamiast dać się prowadzić za rękę to przekombinowałem). Może ktoś ma jakieś sugestie gdzie, co i jak należałoby wykonać, aby skorzystać jednak z AndroMDA? Jakieś doświadczenia z narzędziem, albo jego konkurentami mile widziane.

I pytanie konkursowe: Co oznacza skrót MDA?
  1. "Moja Droga Agatko!" (szczęśliwi, którzy mogą tak tytułować listy do swej ukochanej)
  2. Mam Dość, Ale się nie poddaję
  3. Model-Driven Architecture
  4. ManDarynA gwarowo
Nagród nie ma.

22 komentarze:

  1. Oj za szybko się poddajesz, prawdziwa walka rozpoczyna się gdy infrastruktura już działa ;)

    Ideą MDSD (lub jak to mówią w OMG - MDA) jest traktowanie modelu jako kodu źródłowego. Jeżeli uda mi się pojechać na Javarsovię to postawię browara każdemu kto z powodzeniem zastosował w ten sposób UML'a (z profilami lub bez) w środowisku produkcyjnym (walidacja, refaktoringi meta-modelu, wersjonowanie modeli etc.)

    Co oczywiście nie oznacza że jestem wrogiem MDSD a wręcz odwrotnie ;D

    OdpowiedzUsuń
  2. UML nie taki straszny...
    najgorsze jest to co ma zamiar zrobić MS. Oni stawiają w .NET 3.0 na coś co nazywają WorkFlow czyli budowa aplikacji od grafu. Układając te klocuszki z funkcjami np if/else tworzy sie aplikacje programując te klocuszki - dla osoby przyzwyczajonej do "zwykłego" programowania i na takowym wychowanej wymaga to początkowo nie lada gimnastyki umysłowej. Fakt ze przyspiesza to pisanie (wszelkie aktualizacje sprowadzają sie do poprawek w danym bloczku w grafie) ale póki co jest dla mnie abstrakcyjne.

    Czytając ten tekst utwierdza mnie on w moich obserwacjach ze całość rynku developerskiego podąża w tym kierunku.... ciekawe jaki będzie efekt końcowy :)

    OdpowiedzUsuń
  3. a)
    Prawde mowiac AndroMDA unikam ;). Teraz porzucili architekture z wersji 3.2 i robia projekt praktycznie od nowa w wersji 4 (na zabawkach z Eclipse). Mimo to sa ciekawsze projekty :]

    b)
    Przewaznie projekty nazywajace sie MDSD traktuja model jako kod. Przewaznie model nie jest w UML w takich narzedziach. UML jest niepotrzebnie zlozony wewnetrznie.

    Prawdziwa walka jest gdy przeksztalcenia pisze sie samemu :)

    MDA zaklada wrecz odwrotnie, ze mamy model ktory jest bardzo daleko od kodu... Potem taki co jest blisko... A model powinien byc w UML.

    c)
    Workflow jest bardzo ladny :) i zdecydowanie bardziej User Friendly niz UML, rowniez zdecydowanie bardziej uzyteczny (w klasie czegos co dziala, a nie tylko wyglada). Ogolnie C# jako jezyk zaczyna Javie uciekac, a ORM ktory MS juz niedlugo wyda spowoduje, ze (niestety) Hibernate bedzie wygladac jak przestarzala zabawka (w Javie, bo w C# 3.0 i .Net 3.5 nHibernate szybko nadgoni).

    Odnosnie przyszlosci... wiekszosc Eclipse jest tworzone na podstawie roznych modeli. Takie male narzedzie jak Rational Software Architect i jego edytor UML tez zostal w duzej czesci wygenerowany z kilku modeli.

    Pozdrawiam,
    Krzysiek

    OdpowiedzUsuń
  4. Ostatnio sporo bawię się AndroMDA i mam całkowicie odmienne zdanie. Uważam że framework ma potencjał i można go fajnie wpisać w cykl produkcyjny oprogramowania JEE. Faktycznie ma problemy z przestarzałymi zależnościami, ale i tak jest ciekawą propozycją dla entuzjastów MDA :)

    OdpowiedzUsuń
  5. Cześć mario! Przypomniałeś mi tym komentarzem o dawnym zwyczaju opisywania moich doświadczeń w kilkustonicowych wpisach na blogu, które teraz zwykle skracam do pół strony, a większe tematy umieszczam w Wiki.

    Ciekaw jestem w jakim konkretnie użyciu AndroMDA pomaga Tobie. Możesz opisać swój przypadek? Gdzie widzisz jego użycie przy tworzeniu aplikacji z JEE?

    OdpowiedzUsuń
  6. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  7. Wuu, AndroMDA powinien być zakazany ;) bo odstrasza ludzi od modelowania.

    Z mojego doświadczenia UML nie jest i nie będzie drogą do tworzenia modeli z których można generować kod lub go wykonywać, ponieważ "prawdziwy" UML jest makabrycznie wewnętrznie złożony a OMG ma bajzel w swoich metamodelach.

    EMF z kolei jest tworem który jest bardzo trudny do ogarnięcia dla ludzi którzy nie natknęli się na wszystkie problemy które rozwiązuje...

    Jednak na EMF jest mnóstwo dobrych narzędzi zbudowanych i z pudełka dostarcza mnóstwo zabawek (dlatego też Eclipse 4 jest na nim oparty w znacznie większym stopniu).

    W praktyce to w systemach wbudowanych "UML" a właściwie maszyny stanów mają się bardzo dobrze.
    Jednak przekształcenie PIM - PSM wymaga istnienia dużej liczby elementów których nie ma, nie będzie (jest za dużo rzeczy które można by modelować) a dla wielu stworzenie tych modeli samemu to za dużo pracy.

    Na dzień dzisiejszy lepiej sprawdzają się w małej i średniej skali proste rozwiązania np. nurt MDSD, z którego między innymi wywodzi się Xtext.

    Jeśli zestaw koncepcji naszej pracy jest zrozumiały i stabilny (np. korzystanie z JPA takie jest, podobnie robienie setek identycznych formularzy z walidacją) mamy powtarzające się konwencje lub idiomy (robienie 3 klas z których każda ma nazwę różniącą się tylko fragmentem, pliki XML z wpisami itp.) to...

    to MDA nam wcale nie pomoże :) bo pojawią się przypadki brzegowe, wyjątki, konwencje się zmienią, coś trzeba będzie zrobić młotkiem i siekierą. Jednak jeśli sami tworzymy model i transformację (wtedy i tak nie ma gotowej transformacji) lub istniejąca prezentacja i model jest łatwa w modyfikacji to możemy mieć duży zwrot z inwestycji.

    Dalej jeśli pracujemy w zespole to modele powinny mieć również wersję tekstową (nie XML!) która tak czy inaczej umożliwia prostszą i szybszą edycję a przede wszystkim synchronizację zmian.

    Modele graficzne są fajne "ale". Ale są różne w zależności kogo pytamy, myślę, że teraz więcej modeli będzie miało formę tekstową z wizualizacją, ale ograniczoną (czyli nie będzie to pełny edytor, bardziej Zest niż UML Tools).

    Swoją drogą o ile MDA/MDSD w Stanach praktycznie nie istnieje to w Europie ma się nawet dobrze :)

    A i jakby na to nie patrzeć w znakomita większość badań, eksperymentów i duża część praktyki opiera się na EMF.

    OdpowiedzUsuń
  8. Krzyśku, niestety nie znam EMFa na tyle by móc dyskutować na temat wymienionych
    przez Ciebie zalet EMF-a. Podszedłem kiedyś do zrozumienia go, ale dokumentacja
    na stronie projektu jest (według mnie) jakaś taka mało strawna. Wymieniają ileś
    podprojeków, które coś tam robią... tak do końca to nie wiadomo jak z nich
    skorzystać i jak wpisują się one we framework. Przyznam Ci szczerze że trochę
    się zniechęciłem i temat zarzuciłem... ale wracając do Twojego wpisu.

    Według mnie, model projektu to coś znacznie szerszego niż zbiór artefaktów,
    które przekształcone zostaną na klasy w kodzie wynikowym. Ma on być dawać
    wielopłaszczyznowy obraz całości prowadzonych prac. Pokazywać sposób w jaki
    zrealizowane zostały wymagania klienta. Każdy byt implementacyjny powinien mieć
    swe uzasadnienie. Czytający model powinien być w stanie powiedzieć, w realizację
    jakiego kawałka funkcjonalnego zaangażowana jest dana klasa.
    Nie wyobrażam sobie, by wymagania te można było zrealizować inaczej niż przy
    użyciu UMLa(chociaż wydaje mi się że EMF nie wyklucza używania UMLa do
    przechowywania modelu). Druga kwestia to narzędzia do projektowania. Nie wiem
    jak EMF wspiera UMLa w zakresie innym niż reprezentacja klas(pod tym kątem
    przeglądałem eclipsowe narzędzia do projektowania np. projekty Papyrus i MOSKitt
    - i one naprawdę wyglądają na bardzo niedojrzałe - chociaż być może wyrobiłem
    sobie pogląd na skutek zbyt pobieżnego rozpoznania ). No ale załóżmy że
    niepotrzebnie czepiam się tego UMLa i model trzymamy w plikach tekstowych lub
    db. Jak wygląda wtedy praca z dużym modelem (no załóżmy sobie że posiada on 10
    tys artefaktów) i pracuje nad nim, no powiedzmy zespół 30 projektantów i
    deweloperów. Jak ustrzec się przed dodawaniem redundantnych klas, jak dociec w
    jakich relacjach względem siebie znajdują się klasy? No i jak powiązać je z
    artefaktami analitycznymi, na rzecz których powstały?

    Kolejna sprawa to współpraca z narzędziami, które nie potrafią zapisywać modelu
    w formacie ECORE(czyli z tego co wiem, wszystkie poza eclipsowymi oraz Rational
    Rose). Czy żeby ich model był przetwarzany nie trzeba pisać dodatkowych
    kosztownych transformat xmi2ECORE ?(np. dawny projekt OpenArchitectureWare EA2Ecore , który
    teraz został włączony do jednego z podprojektów EMF).

    Piszesz że metamodel UMLa jest skomplikowany. Zgadzam się, ale wydaje mi się że
    wynika to z jego wielopłaszczynowości. Ma on pozwolić na opisanie wielu aspektów
    aplikacji i dać się zastosować w dowolnej dziedzinie problemowej.
    W przypadku danej aplikacji wykorzystuje się tylko pewien podzbiór elementów(najczęściej ograniczony profilem przygotowanym pod dany projekt), dlatego transformata PIM2PSM wcale nie musi być rozbudowana.
    Przygotowanie takiej transformaty pod kątem zastosowania jej w danym projekcie(prowadzonym w oparciu o MDA) jest jego nieuniknionym kosztem.

    Krzyśku, być może napisałem tu wiele herezji wynikającej z mojej nieznajomości
    EMF, mam nadzieje że wtedy mnie poprawisz, a ja lepiej zrozumiem o co chodzi w
    tej koncepcji.

    OdpowiedzUsuń
  9. Oj, ale mi się rozrósł komentarz, aż mi bloger go nie trawi, pójdzie w kawałkach.

    Właśnie dlatego, że model ma być czymś więcej niż zbiór artefaktów i że 30 osób może nad nim pracować, UML staje się problemem ;)

    A tak serio, to poważna wymagania masz, nie znam narzędzie komercyjnego które wspiera śledzenie wymagań, przez model po sam kod. Najbliżej jest zdaje się Rational Requirement Composer, który zdaje się dalej wymaga Requisite Pro do definicji wymagań. Pozwala korzystać z Modeler / Architect które z kolei mają wsparcie do synchornizacji modeli po SVN i tym podobnych.

    Widziałem jednak darmowe narzędzie oparte na Eclipse tworzone przez jakiś uniwersytet, które robiło dokładnie coś takiego - miało wsparcie dla łączenia wymagań, modelu uml, dokumentów i kodu. Niestety nie mogę tego znaleźć, możliwe, że już włączyło się do Eclipse i siedzi w jakimś podprojekcie, nie wiem. Jest to zasadniczo całkiem proste, ponieważ każdy model stworzony w Ecore pozwala na odwoływanie się do elementów z innych modeli Ecore. Wymaga jednak istnienia tych modeli. Ostatni krok (model - kod) jest kłopotliwy, bo albo ma się konwencje, albo jakieś adnotacje, albo ma się rozwiązanie generyczne i można pisać dowolne szablony. Komercyjna stara wersja Acceleo (język model -> kod) potrafiła trzymać informację skąd każda linijka kodu się wzięła. Nie wiem czy w nowym Acceleo - darmowym i rozwijanym w ramach Eclipse i bliższym standardu OMG, jest taka funkcjonalność, bardzo możliwe.

    OdpowiedzUsuń
  10. Co prawda PIM, PSM można różnie definiować (i czasem coś co jest PIM jest PSM dla czegoś innego), ja jednak miałem na myśli, że jeśli robimy generację kodu/tekstu/konfiguracji to jest to PSM -> kod, a nie PIM -> PSM.

    Z grubsza moje podejście to: jeśli komuś coś działa to dobrze. I nie twierdzę, że jest jedna słuszna droga. Zgodzę się też, że darmowe narzędzia do UML w tej chwili to porażka. Zasadniczo zaczyna się od nowa ich tworzenie w Eclipse od czasu gdy Borland przestał istnieć w starej formie( i zarzucił kilka projektów). Szczerze to nie znam dobrego narzędzia do UML w ogóle, jeszcze MagicDraw nie próbowałem ;)

    Osobiście lubię UML do komunikacji, ale nie cierpię do modelowania, ponieważ model powinien być jak najbliżej dziedziny, a kwadraty z setką stereotypów, kilkoma profilami i narzędziami które i tak nie wspierają profili przyzwoicie, każą edytować wartości stereotypów w jakiś dziwnych okienkach, wcale nie ułatwiają życia.

    Na dodatek UML nie jest do końca wewnętrznie spójny, hierarchia elementów jest bardzo złożona i zwykły kwadracik ma kilkadziesiąt atrybutów (a najlepiej jest gdy się chce je zmieniać w transformacji, bo spora część jest wyliczana i żeby je zmienić to trzeba dodać coś gdzieś indziej).

    Metamodel UMLa jest na tyle złożony, że każde narzędzia implementują go inaczej i nie są ze sobą kompatybilne przez to.

    O ile pamiętam model uml2 z Eclipse jest obsługiwany przez każde liczące się narzędzie, bo hm, jest na swój sposób standardem.

    RationalRose to był jednak uml 1.4 dlatego oAW wymagał transformacji by to strawić (najlepiej pracuje na UML2) lub metamodelu w Java.

    Na forum OpenArchitectureWare częstą poradą było otwierać sobie pliki XMI i na ich podstawie wywnioskować, pod jakimi nazwami co siedzi w modelu. Bo to co użytkownik widzi, a to co dzieje się pod spodem jest daleko. Na dodatek różne narzędzia różnie podchodzą do tworzenia i wizualizacji niektórych rzeczy (np. asocjacje i properties, swoją drogą utworzenie poprawnej asocjacji bez pomocy funkcji też jest wyzwaniem, Eclipse UML2 dostarcza metody na modelu ułatwiające takie zadania).

    Bliżej są mi podejścia jak Xtext czy Obeo Designer (oczywiście narzędzia do DSL są nie tylko dla Eclipse, jak Microsoft DSL Tools, z wołającym o pomstę do nieba językiem generacji, czy MetaEdit+ i inne). W nich utworzony model jest prostszy, szybciej się go edytuje a jak ktoś się uprze może zrobić transformację do UML z profilami.

    OdpowiedzUsuń
  11. Odnośnie EMF. Jeśli ktoś próbuję zrozumieć samo EMF no to popadł w ciężkie tarapaty...

    Aktualnie jestem niepraktykujący więc coś mogłem pomieszać, nie korzystałem z wszystkiego więc gdzieś mogłem skłamać ;)

    EMF to taki bardziej rozbudowany model obiektowy dla Java, który pozwala na wielodziedziczenie, automatycznie wspiera ustalanie odpowiednich końców asocjacji, ma bardziej efektywną refleksję, pozwala na narzucać ograniczenia na model, pozwala przechwytywać zmiany na polach itp. EMF został wydzielony z projektu programistycznego w IBM i jest wykorzystywane w wielu pluginach do Eclipse do budowy modelu czegoś. "za darmo" wspiera serializację do XML (z pudełka 2 implementacje bardziej rozbudowanego systemu presystencji), ponów/cofnij, powiadomienia o zmianach itp. Jego budowa pozwala dorzucać nowe funkcjonalności do modelu np. projekty w ramach EMF:

    Teneo - pozwala wykorzystywać Hibernate lub EclipseLink do odczytu i zapisu modelu.

    CDO - pozwala wielu osobom pracować nad jednym modelem, zajmuje się przesyłaniem zmian po sieci, rozwiązywaniem konfliktów i zapisywaniem centralnego modelu (np. z pomocą Hibernate, ale w odróżnieniu od Teneo, hmm ukrywa to przed użytkownikem, Teneo pozwala na pełną konfigurację mapowania (ale nie wymaga))

    Compare - na semantyczne porównywanie zmian w modelach EMF (potrafi np. zarejestrować się w narzędziach do kontroli wersji i pokazywać na drzewku jakie wartości się zmieniły)

    Transaction, Validation- jak nazwy wskazują ;)

    W praktyce, ktoś kto to opanował, może zrobić w jeden dzień złożony model dziedzinowy (wyklikać, bo do modeli EMF jest edytor podobny do modeli klas w UML), zrobić do niego edytor drzewiasty (EMF wspiera generację takich edytorów, poza tym każdy model EMF można edytować jednym z 3 generycznych edytorów refleksyjnych) który chodzi na kilku komputerach i każdy widzi zmiany które zrobił ktoś inny.

    Jest to więc dość poważny framework do tworzenia narzędzi (zdecydowanie bardziej narzędzi niż np. serwisów webowych ;) ). Czemu jest tak modny w modelowaniu? Czemu Eclipse Modeling Project jest największym projektem w Eclipse?

    OdpowiedzUsuń
  12. EMF miał pewne zabawne założenie na początku. Pozwalał by model dziedzinowy był opisany w:
    - Java (interfejsy z ewentualnymi dodatkowymi komentarzami)
    - UML / RationalRose (podzbiór modelu klas)
    - XSD (tak stworzony model miał z automatu serializację i deserializację do xml zgodnego z XSD)
    Później doszedł jeszcze format Ecore (~XMI).

    Mając jedną rzecz potrafił wygenerować kod Java realizujący tak zdefiniowany model, z interfejsami, klasami, fabrykami tych klas, pomocnikami do refleksji, edycji, poleceń gui itp. Użytkownik korzysta z interfejsów i fabryk, zwykle nie powinien ruszać implementacji. Co ciekawe wygenerowany kod można edytować (trzeba gdy mamy wartości wyliczane) i zmiany zostaną automatycznie zachowane, ponieważ generator (Eclipse JET) rozumie kod Java. Ok częściowo rozumie, nie do końca automatycznie i właściwie nie generator a merger, ale efekt jest naprawdę dobry zadziwiająco dobry. Do tego instancja modelu zawsze potrafił zapisać się do XMI, czasem też w czytelnym XML. Model jest wydajny, wiele rzeczy jest pisana z myślą o pamięci a nawet o JIT. Kod jest też mega rozszerzalny bo może informować o każdej operacji, zmianie wartości, a nawet zmieniać swoje zachowanie dynamicznie (coś jak AOP).

    Teraz odnośnie XMI jest pewien problem. OMG twierdzi, że XMI jest pewnym standardem zapisu. Niestety XMI opiera się na MOF, który w teorii miał być jednym modelem który wszystkie inne modele zdefiniuje, w praktyce tylko w ciemności je trzyma. W teorii (http://en.wikipedia.org/wiki/File:M0-m3.png) MOF powinien być opisany w sobie, a UML w MOF, w praktyce... eh, długo by tłumaczyć.

    MOF jest takim podstawowym obiektowym modelem który pozwala opisywać klasy i relacje. Jego zadaniem jest definicja modelu innych modeli. Czyli jest to meta-metamodel. W teorii główny standard do ich opisu, w praktyce jak się wejdzie na strony OMG to część modeli jest opisana w Ecore :)

    Tak jak to bywa ze standardami wymyślanymi przez komitety, część z nich ma błędy, część jest sprzeczna, część wybrakowana, część w ogóle nie działa w praktyce. Dlatego każde narzędzie do UML jest z "każdym" innym nie kompatybilne (przynajmniej tak to było kiedyś, gdy każde implementowało metamodel UML po swojemu, teraz są narzędzie na Eclipse i reszta świata). EMF był narzędziem praktycznym w sumie o bardzo zbliżonym zastosowaniu (modelowanie) i zakresie - obiektowość, stąd XMI, ale by działał potrzeba jeszcze porządnego spójnego modelu, stąd Ecore.

    MOF jest aktualnie podzielony na eMOF (essential) i cMOF (complete). Ecore w dużym stopniu odpowiada semantycznie eMOF, właściwie to o ile dobrze pamiętam przyczynił się do jego powstania. Ecore jest opisany w Ecore i jest aktualnie "najlepszym" sposobem na definicję modeli EMF, poza wersją XMI, jest edytor graficzny w EMF Tools i czytelna wersja tekstowa Emfatic.

    OdpowiedzUsuń
  13. EMF może być wykorzystany jak framework do definicji metamodeli i ich implementacji.

    To stworzyło bazę dla innych narzędzi, które wreszcie mogły być wzajemnie kompatybilne.

    Biorąc pod uwagę wyłącznie projekty w Eclipse mamy np.:
    Języki do generacji kodu:
    Xpand (2 wersje ;)), Xtend2, Acceleo (implementacja standardu OMG), JET, Epsilon

    Języki do transformacji między modelami:
    Xtend, Xtend 2, QVTo, QVTr (standardy OMG), ATL, Epsilon

    Frameworki do definicji języków dziedzinowych:
    Xtext (tekstowe), GMF (graficzne)

    Gotowe generatory:
    GMF (to jest bardzo duży generator nad GEF, niestety nie najpiękniejszy), Extended Editing Framework, Presentation Modeling Framework

    Różne metamodele
    standardy: UML2, model metryk(SMM), model ast (GASTM), model wymagań (ReqIF / RIF), OCL
    nie standardowe: Feature Model, XSD, model JSP, Java 5 (pełny model z transformacją tam i z powrotem),

    Transformacje
    ATL Zoo, Java 5 -> KDM -> UML2, model Java 5 -> kod

    Tych projektów jest mnóstwo, nie znam ponad połowy. Większość to badania i eksperymenty, więc tylko niektóre są naprawdę wartę uwagi dla praktyków. I to wszystko jakoś ze sobą współpracuje :)

    Eclipse UML2 jest aktualnie najlepszym standardem zapisu modeli (samej treści) UML, najwięcej narzędzi go wspiera (po rational rose ;) ) i jest całkiem dobry. Poza tym daje dostęp do największej liczby narzędzi do generacji kodu, które każde jedno potrafi współpracować z innym wspierającym EMF. Rational Architect / Modeler tak naprawdę zapisuje wszystko w UML2+swoje dodatki, dlatego generatory można łatwo skonfigurować dla niego.

    Eh, się rozpisałem. Podsumowując, EMF jest trudny do ogarnięcia i przeważnie nie potrzebny bezpośrednio. Można się bawić w modelowanie w Ecore/EMF, ale to jest przede wszystkim framework do definicji innych modeli. Zresztą nie trzeba korzystać z niego bezpośrednio. Można stworzyć sobie dsl w Xtext, automatycznie wygeneruje się nam do niego model i taki model wykorzystać w GMF a potem generować kod w jednym z kilkunastu dostępnych języków (tylko 5 jest wartych uwagi). Lub po prostu eksportować model do Eclipse UML2 i wykorzystać najlepsze języki do transformacji i generacji kodu jakie są zaimplementowane (niektóre poza Eclipse).

    OdpowiedzUsuń
  14. Krzysiek dzięki za przygotowanie tak uporządkowanych informacji. Przyznam Ci się że koncepcja którą tak fajnie opisałeś na razie jest mi trochę obca, ale sprzedałeś ją w taki sposób że wydaje mi się ona szalenie ciekawa. Mam naprawdę duży problem z poruszaniem się po dokumentacji EMF i podczas mojego rozpoznania nie udało mi się zbliżyć do odnalezienia informacji, które pokazywałyby te projekty jako kolejne klocki tego samego frameworka. Mam do Ciebie jeszcze dwa małe pytania... przede wszystkim czy widziałeś ten framework w praktyce, w jakimś większym projekcie, oraz czy framework jest przewidywany jako konfigurowalny moduł mavenowy który działa poza środowiskiem eclipse (coś na zasadzie AndroMDA ;) )?

    Pozdrawiam i jeszcze raz dzięki :)

    OdpowiedzUsuń
  15. Eh, zastrzele się komentarz mi zjadło :/
    Możliwe, że odpowiem dopiero za parę dni ;)

    OdpowiedzUsuń
  16. Grzesiek z deepdiveinto.blogspot.com ma spore komercyjne doświadczenie w wykorzystaniu EMF i Xpand. Znam jeszcze jedną firmę we Wrocławiu gdzie korzystają z EMF i Acceleo ale nie znam szczegółów.

    O wykorzystaniu tych narzędzi wewnątrz firm, trudno czegoś się dowiedzieć ale jest kilka otwartych projektów.

    Takim trochę korporacyjnym jest http://www.artop.org/artext/ projekt zasadniczo dla "samochodów", Xtext, Xpand.

    Ciekawym jest http://code.google.com/a/eclipselabs.org/p/redopen/ to nie jest twór teoretyczny oparty na MDA, ale projekt wydzielony przez jednego(http://ekkescorner.wordpress.com/), bądź dwóch kolesi , którzy chcieli jak najbardziej przyśpieszyć sobie pracę nad projektem http://redview.org/ i aplikacjami ERP.

    Odnośnie Mavena, działa ale... Zależy z jakim zestawem komponentów i modeli przyjdzie nam żyć, Xpand2 nie wymaga niczego poza Java i jedną biblioteką więc może równie dobrze generować tekst na konsole ;) ale niektóre modele wymagają rejestrów itp. itd.

    Ogólnie w przypadku Xtext, coraz częściej korzysta się z konfiguracji, w której kod generuje się przyrostowo w czasie rzeczywistym, w trakcie edycji (i np. JRebel i programiści się cieszą). Jeśli ktoś nie ma nic przeciwko wersjonowaniu generowanego kodu (ja wolę z różnych powodów) to maven wtedy problemem nie jest ;)

    Jakieś wsparcie dla mavena było w Fornax, przykładowo http://www.fornax-platform.org/confluence/display/fornax/Sculptor+(CSC) to DSL do generacji kodu w oparciu o Hibernate, Spring w zgodzie z Domain Driven Design. Również wywodzi się jeszcze ze starego oAW i wytworzyło trochę narzędzi do radzenia sobie z problemami z prawdziwego świata (jak modele UML z różnych programów), korzystanie z mavena w projekcie, model hibernate, formatowanie kodu, organizowanie importów po generacji itp. Nie korzystałem ostatecznie, ale trochę wiedzy od ludzi z tego projektu wyciągnąłem jeszcze na starym forum oAW.

    Swoją drogą GMF, czyli projekt na którym chodzi pewnie ponad połowa wszystkich edytorów graficznych do eclipse, jest oparta na dziwnej wersji Xpand, QVTo, 5 czy 6 modelach, tranformacjach, generacjach itp. Nie jestem jednak przekonany do tego projektu (np. dlatego, że istnieją osobne generatoru ułatwiające pracę z generatorami: http://code.google.com/p/gmftools/ albo zupełnie inne generatory: http://www.eclipse.org/gmt/epsilon/doc/eugenia/ , no i narzędzia do edycji modeli mnie nie przekonały, ale może coś się poprawiło). GMF był projektem prowadzonym przez dawnego Borland-a AFAIK, i nie wiem czy jest dalej prężnie rozwijany.
    Jeśli UML2 Tools są kiepskie to głównie dlatego, że są testowym projektem dla GMF ;)

    Jednak idea jest fajna i wraca. Przykładowo teraz jest projekt Spray - http://code.google.com/a/eclipselabs.org/p/spray/ , projekt który powstał gdy na jednej konferencji jakieś trzy zespoły zaprezentowały to samo (generację modeli graficznych w oparciu o dsl i http://www.eclipse.org/graphiti/). Projekt dopiero powstaje i pewnie chętnie skorzystają z pomocy ;) na swój sposób jest konkurencją dla GMF (właściwie samo Graphiti już jest częściowo).

    GMF i Graphiti specjalizują się w tworzeniu graficznych edytorów dla modeli EMF.
    Dodatkowym projektem jest EEF http://www.eclipse.org/modeling/emft/?project=eef który ułatwia tworzenie edytorków properties do takich modeli w połączeniu np. z GMF.

    OdpowiedzUsuń
  17. Niestety głównie skupiłem się na dawnym oAW, więc większość zastosowań znam z tej bajki, a języków i technologii jest mnóstwo, np .Eclipse Epsilon dostarcza jakieś 6 języków które pozwalają od generacji tekstu przez transformację, definicję modeli graficznych, po definicję wizardów do refaktoryzacji. ma dobrą dokumentację i ciekawe pomysły. Poza Eclipse też się coś dzieje. Czyli w sprawie innych zestawów trzeba by gdzieś indziej sprawdzać. Ogólnie ATL, Acceleo, QVTo to głównie francuska szkoła (obeo, inria, mia-software), Xpand, Xtext, Xtend - niemiecka (itemis, kilku niezależnych). QVTo to spadek po Borland, EMF powstał w IBM jak sam Eclipse.

    Jednym ze źródeł informacji jest forum Eclipse, mam tam nawet stary post w którym porównuje różne języki:
    http://www.eclipse.org/forums/index.php/mv/msg/136140/428689/#msg_428689

    Ale jest on nie aktualny, jeśli ktoś nie wie czego szuka to teraz bym polecał albo MWE2/Xpand/Xtext albo Epsilon (jedyne kompletne rozwiązania od góry do dołu, epsilon ma jedną z nalepszych stron i dokumentacji w ramach Eclipse), z naciskiem na pierwsze (http://www.eclipse.org/forums/index.php/m/108154/#msg_108154). Jak ktoś ma jakieś swoje zdanie to może sprawdzić Acceleo i QVTo (http://eclipse.org/acceleo/ ma świetne ide http://www.obeo.fr/videos/acceleo-eclipse/eclipse-modeling-runaway-acceleo.htm , wsparcie dla traceablity. Jednak w praktyce bardzo często się robi jakieś funkcje pomocnicze i korzysta z obu: M2M i M2T, a obawiam się, że pracując z Acceleo może tu być problem z definicji powinno korzystać z funkji QVT, a QVT w Eclipse mnie nie przekonuje. Niemniej nie pracowałem od lat z Acceleo, więc może np. z ATL współpracuje teraz?.

    Swoją drogą bardzo dużo można wynioskować po projektach w Eclipse po ich stronach. Np: http://www.eclipse.org/m2m/qvto/doc/


    Są też inne posty które mogą się przydać (maven i xtend2) ;)
    http://www.eclipse.org/forums/index.php/t/207651/

    Inne zasoby które przychodzą mi do głowy to:

    Przykładowe transformacje w ATL
    http://www.eclipse.org/m2m/atl/atlTransformations/

    Trochę bardziej rozbudowane przykłady
    http://www.eclipse.org/m2m/atl/usecases/

    A jedna uwaga, pod żadnym pozorem nie kupuj książki o EMF (http://www.amazon.com/x/dp/0321331885) mam ją ;) skupia się na części programistycznej EMF, z którą prawie nigdy nie powinieneś się stykać ;).
    Jest też http://www.amazon.com/x/dp/0321534077 ale obawiam się, że zupełnie nie aktualna ;) Grzesiek może wiedzieć coś na ten temat.


    Zamiast podsumowania
    Najłatwiej zacząć od http://www.eclipse.org/Xtext/

    jest najbardziej modnym dzieckiem Eclipse Modeling Project, na forach jest ruch, na blogach jest ruch, na konferencjach i Jug-ach się pojawia itd. Co prawda każdy kocha swoje dzieci tak samo, ale... Xtext jest faworytem itemis bo na nim zarabiają (mają klientów korporacyjnych, którzy płacą za konsultacje) ;)
    Zrobienie własnego dsl-a pozwoli szybko przejść do samej generacji pomijając resztę. A łatwo można wrócić do szczegółów, albo bawić się w łączenie edytorów tekstowych i graficznych.

    Widać to po wyglądzie samej strony głównej ;)

    Jeśli bardzo chcesz coś jeszcze dziś wygenerować z UMLa stworzonego w Eclipse i zrobić dobre wrażenie na kimś kto patrzy przez ramie to najlepsze będzie pewnie Acceleo.

    OdpowiedzUsuń
  18. Krzysiek po raz kolejny dziękuję, a jednocześnie gratuluję tak posiadania tak solidnej i rozległej znajomości zagadnienia. W tych postach zrobiłeś coś czego brakuje w dokumentacji projektu EMF - pokazałeś jego logikę...

    P.S.
    To czekam na ten rachunek, bo na razie to jestem Twoim dłużnikiem

    Pozdrawiam

    OdpowiedzUsuń
  19. Rozległą może, ale solidną raczej nie ;)

    Zawsze może się okazać, że u Ciebie lepiej zadziała AndroMDA i tylko głowę Ci zawracam ;)

    Grunt byś opisał swoje wrażenia i może pokusił się o porównanie.

    OdpowiedzUsuń
  20. >> Zawsze może się okazać, że u Ciebie lepiej zadziała AndroMDA

    Myślę że tak jak to w życiu ... znajdą się przypadki gdy lepiej sprawdzi się MDA, ale też sytuacje gdy bardziej opłacalne będzie użycie EMF... grunt to poczuć słabe i mocne strony obydwu koncepcji...a co do zawracania głowy ;)... to jedyne co mi się wywróciło to mój własny światopogląd, bo uświadomiłeś mi moją ignorancję ;)

    >>Grunt byś opisał swoje wrażenia i może pokusił się o porównanie.

    Dokładnie to mi chodzi po głowie :), ale po tym co napisałeś widzę że nieprędko będę gotowy :)

    OdpowiedzUsuń
  21. Czepiając się słówek, bardziej opłacalne będzie MDD / MDSD itp. niż MDA. MDA tak jak MDD, MDSD i dużo podejść opartych o DSLe jest pewnym podejściem do tworzenia oprogramowania opartego na modelach (czyli MDE). Różnią się trochę filozofią co i ile modelować, na jakim poziomie, technikami (generacja, interpretacja) itp. MDA ma standardy, m.in. UML a EMF jest biblioteką do definicji modeli i również MDA wspiera ;) Zresztą jest spora współpraca między Eclipse a OMG (możliwe, że OMG zdecyduje się w końcu na implementacje referencyjne jak JEE).

    OdpowiedzUsuń