Autor Thema: LifeRay und Alfresco  (Gelesen 6264 mal)

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
LifeRay und Alfresco
« am: 04.06.07 - 10:57:10 »
aus gegebenem Anlass :-X werde ich mich bald immer mehr mit LifeRay und Alfresco befassen, bis Notes dann ganz weg ist  :'(

Hat jemand Erfahrungen mit diesen Anwendungen? Eine der ersten Anwendungen soll eine Unfallmeldung fürs Intranet werden, die dann eine XML-Schnittstelle für die BG enthält. Kurzer Funktionsüberblick:
Webformular für Unfallmeldung (edit für jedermann) dann ein einfacher Workflow dahinter und ein paar Reports.
Baut man dafür ein Portlet? Muss das in Java sein oder kann man das in Alfresco auch in Javascript und XML machen? Den Workflow will ich jedenfalls mit jBPM machen, da gibt es ja ne GUI für Eclipse. Ist bestimmt nicht so schwer, aber für den Einstieg von null auf hundert ASAP weiß ich momentan noch nicht, wo ich anfangen soll...
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: LifeRay und Alfresco
« Antwort #1 am: 04.06.07 - 12:38:05 »
LifeRay benutzt ziemlich viel Spring, hab ich gehört. Das kann nicht schlecht sein.
Da das eine Portlet-Engine ist, ist es ziemlich wahrscheinlich, dass du Portlets benutzen wirst.
Ich würd mir als erstes die Samples von der LifeRay Seite anschauen und irgendwo gibts sicher eine newsgroup.
Für einen einfachen Workflow macht jBPM das ganze vielleicht eher schwierig als einfach.
Portlet -> Web-Framework -> Service-Layer -> Dao -> Relationale Datenbank Schichtung sollte machbar sein. Ich halte konkrete Schichtung für das wichtigste jeder Java Anwendung. Den Workflow kannst du dann vielleicht einfach im Service Layer programmieren ohne jBPM.
Für RDBMS Zugriffe ibatisSQLMaps oder Hibernate.
Für den Backend-Teil sollte das Workbook Spring & Hibernate von Oates, Langer, Wille, etc. brauchbar sein. Kurz & praxis-orientiert.
Es gibt ein relativ kurzes und gutes deutsches Einführungsbuch zu Portlets.

Gruß Axel
« Letzte Änderung: 04.06.07 - 12:41:06 von Axel Janssen »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: LifeRay und Alfresco
« Antwort #2 am: 04.06.07 - 13:29:28 »
ja, SPRING und Hibernate sind bei Alfresco angesagt. Ich habe auch schon das Buch zu Alfresco (es gibt nur eins weltweit  ;D) und direkt zu LifeRay scheint es auch keine Bücher zu geben. Aber zu Hibernate, SPRING, Portlets und Co gibt es ja mehr Bücher als ich lesen kann.
Dann werde ich mal mit einfachen Portlets starten...  O0
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: LifeRay und Alfresco
« Antwort #3 am: 04.06.07 - 14:28:15 »
Das ist ganz gut für Spring2.0
http://www.javapolis.com/JP05Content/talks/day4/rodjohnson/index.html
(musst du dich aber registrieren, kostet aber nichts).
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: LifeRay und Alfresco
« Antwort #4 am: 04.06.07 - 14:48:23 »
hab mich mal durchgeklickert (mit Ton ist hier nicht möglich) ich glaube ich muss grundlegender einsteigen. Das Problem ist nur dass ich eigentlich gar keine Zeit dafür habe weil meine anderen Aufgaben mich schon zu 90% belegen  >:D

(Registrierung war nicht notwendig)
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: LifeRay und Alfresco
« Antwort #5 am: 04.06.07 - 17:10:06 »
Das ist allein wegen dem australischen Akzent hörenswert und unterhaltsam.  ;D
J2EE/JEE/EE5 heisst bei neuen Anwendungen eigentlich meist Spring/Hibernate oder EJB3 oder Spring/EJB3. Wobei EJB3 so ähnlich wie Spring/Hibernate ist.
Den schnellsten Einstieg bekommst du über das bereits erwähnte Workbook Spring & Hibernate von Oates, Langer, Wille. Ich würd erst mit dem Backend anfangen und dann Portlets.
Spring und Hibernate besitzen beide eine sehr gute Online-Dokumentation.
Lass dich nicht von AOP im spring-umfeld abschrecken. Ich hatte da ein paar Blockaden aber man kommt da schnell rein.
Schwierig für Einsteiger dürften auch die zahlreichen Zusatz-jars beider Frameworks sein und bei den neuesten Versionen behindern sich die asm-libraries gegenseitig, wenn man nicht aufpasst. Da aber beides sehr viel verwendet wird, kommt man über stacktrace in google schnell auf die richtige Lösung.

Hier ist der aktuelle .classpath von dem Spring/Hibernate/JSF/Facelet Projekt  :) :
Code
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="src" path="src"/>
	<classpathentry kind="src" path="testIntegration"/>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
	<classpathentry kind="con" path="com.genuitec.eclipse.j2eedt.core.J2EE14_CONTAINER"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/jstl.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/postgresql-8.2-504.jdbc3.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/commons-beanutils-1.6.1.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/commons-codec-1.2.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/myfaces-all.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/commons-digester-1.5.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/commons-el.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/commons-fileupload-1.0.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/commons-validator.jar"/>
	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3.8.1"/>
	<classpathentry combineaccessrules="false" kind="src" path="/lib-myfaces"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/commons-lang-2.1.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/commons-collections-3.1.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/commons-logging-1.0.4.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/easymock.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/ejb.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/jakarta-oro-2.0.8.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/junit.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/log4j-1.2.9.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/spring-2.0.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/spring-aspects-2.0.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/spring-mock-2.0.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/c3p0-0.9.0.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/commons-dbcp.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/commons-pool.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/dom4j-1.6.1.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/ehcache-1.2.2.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/ejb3-persistence.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/hibernate-3.2.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/hibernate-annotations-3.2.0.GA.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/hsqldb.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/jta.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/aspectjweaver.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/asm-all-2.2.3.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/cglib-nodep-2.1_3.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/tomahawk-1.1.5.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/jsf-facelets.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/el-api.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/el-ri.jar"/>
	<classpathentry kind="lib" path="WebRoot/WEB-INF/lib/antlr-2.7.6.jar"/>
	<classpathentry kind="output" path="WebRoot/WEB-INF/classes"/>
</classpath>

Ansonsten sind aber beide Frameworks sehr gut. Sie sind von Anwendungsprogrammierern geschrieben worden, die aufgehört haben der Allwissenheit des J2EE Standards Commitee zu vertrauen und sie haben sich durchgesetzt. Ich seh die ganze Lotus-on-Eclipse und to-Garnet-or-not-to-Garnet vor dem Hintergrund dieser Geschichte.
Vor allem Spring ist recht schnell ein großer Vereinfacher. Das zentrale Dependency Injection Prinzip ist schnell zu verstehen. Ebenfalls der "Templating Approach". Das Zusammenspiel von Spring-Hibernate hat seine Tücken, aber das wird im kurzen deutschen Workbook gut erläutert. Für Spring eignet sich noch das nicht zu lange Buch von Eberhard Wolff. Für Hibernate solltest du dir mittelfristig den neuen Schinken von Gavin King, Christian Bauer, Java Persistence with Hibernate von Manning zulegen. Aber als 2. Hibernate-Buch nach dem Workbook. Das geht relativ tief rein. Auf den springframework.com Seiten gibts noch Beispielanwendungen wie Petstore. Die sind auf jeden Fall hilfreich, wenn auch leider nicht unbedingt immer auf der neuesten Spring/Hibernate Version.

Alle, die mal ernsthaft mit Hibernate auseinandergesetzt haben, sagen, dass es nicht so einfach ist wies erst aussieht. Aufpassen muss man v.a. mit der Deklaration von 1-n und m-n Beziehungen. Da schlägt schnell das 1+n queries Problem auf, dass es auch für EJB-Entity-Beans gibt.
Beispiel: Du fragst die Aktien von User "Axel" ab. Normal denkt man, dass dies nur einen SQL-Select gegen die Datenbank erzeugt, der eine Liste mit Aktien zurückliefert. Bei ungeschickten mappings kann das aber zu 1 Select für die Liste UND je 1 Select PRO Listen-Entry führen.  ::) und das ist echt inperformant und geht gar nicht.
Man kann das aber mit entsprechenden mappings und Hibernate Queries vermeiden. Ist aber für Anfänger finetuning angesagt.
Schwierig kann auch der RDBMS-Programmierungs-Klassiker konkurrierende Transaktionen sein. Hier musst du unbedingt optimistic und pessimistic locking verstehen.

weitere aktuelle Rod Johnson Interviews/Vorträge:
http://www.infoq.com/presentations/rod-johnson-are-we-there-yet
http://www.redmonk.com/cote/2007/05/30/interface21-video-from-javaone/#comments (Michael Coté und Rod Johnson in E.I.N.E.M. Film. Neelan Choksi hat streckenweise Probleme neben den beiden Bühnensäuen zu Wort zu kommen)
« Letzte Änderung: 04.06.07 - 17:55:37 von Axel Janssen »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: LifeRay und Alfresco
« Antwort #6 am: 04.06.07 - 19:47:23 »
Vielleicht schaffe ich auch nächste Woche Fussi - eine Börsenplattform mit JSF/Spring/Hibernate mit Tomcat und PosgreSQL- auf Google Code hochzuladen. Die schwierigsten Features sind eigentlich fertig.
Von den Core Features Fehlen nur noch:
a) Registrierung (mach ich heute abend)
b) Userprofil ändern
c) Stored Procedure, die alle 2 Stunden die Positionen der Mitspieler als zeitgesteuerten batch process ausrechnet und in die Datenbank schreibt.

Zugegeben ist das html Design nicht existent (s. Screenshots).
Die Internationalisierung ist auch noch nicht da.
Und ich rechne mit deadlocks bei heftigen multi-user Tests

Handeln funktioniert aber schon:

The hotness ->
Bild 1 (s. Screenshots ganz unten):
Bin als User "Axel" eingeloggt. Es gibt zur Aktie Ecuador 1 offene Order vom User "Axel1" für den Preis 20.1.
User "Axel" bietet 2 Aktien zum Preis von 20.0 an. Klicke auf "Sell" Button.
Bild 2:
1 verkauft er an "Axel1" für 20.0.
1 wird in PosgreSQL als offene Order gespeichert.

Die Geld und Aktienkonten beider User werden aufgrund der Transaktion korrekt geändert (sieht man nicht im Screenshot, ist aber so).
Hm. Eigentlich sollte als neuer Preis der Aktie Ecuador 20.0 angezeigt werden. Ein bug.

Hier sind die alle Datenbankaktivitäten dieser Transaktion. Ohne Hibernate würde man vermutlich wahnsinnig werden. Bedenkt, dass bei einer Handelstransaktion eine Menge Tabellen betroffen sind:
Ein user hat danach weniger Bargeld. Der andere mehr.
Ein user hat danach mehr Aktien. Der andere weniger.
1 Order wird aus der Datenbank gelöscht.
1 Offer wird in der Datenbank angelegt.
1 Transaktion wird gespeichert.
Code
Hibernate: 
    select
        user0_.id as id0_0_,
        user0_.name as name0_0_,
        user0_.pwd as pwd0_0_,
        user0_.money as money0_0_,
        user0_.position as position0_0_ 
    from
        public.user user0_ 
    where
        user0_.id=?
Hibernate: 
    select
        stock0_.id as id2_0_,
        stock0_.name as name2_0_,
        stock0_.price as price2_0_ 
    from
        public.stock stock0_ 
    where
        stock0_.id=?
Hibernate: 
    select
        stockposit0_.id as id1_,
        stockposit0_.idstock as idstock1_,
        stockposit0_.idUser as idUser1_,
        stockposit0_.amount as amount1_ 
    from
        public.stockposition stockposit0_ 
    where
        stockposit0_.idstock=? 
        and stockposit0_.idUser=?
Hibernate: 
    select
        orderstock0_.id as id4_,
        orderstock0_.iduser as iduser4_,
        orderstock0_.idstock as idstock4_,
        orderstock0_.price as price4_,
        orderstock0_.amount as amount4_,
        orderstock0_.creation as creation4_ 
    from
        public.orderstock orderstock0_ 
    where
        orderstock0_.idstock=? 
        and orderstock0_.price>=? limit ?
Hibernate: 
    select
        stockposit0_.id as id1_,
        stockposit0_.idstock as idstock1_,
        stockposit0_.idUser as idUser1_,
        stockposit0_.amount as amount1_ 
    from
        public.stockposition stockposit0_ 
    where
        stockposit0_.idstock=? 
        and stockposit0_.idUser=?
Hibernate: 
    select
        user0_.id as id0_0_,
        user0_.name as name0_0_,
        user0_.pwd as pwd0_0_,
        user0_.money as money0_0_,
        user0_.position as position0_0_ 
    from
        public.user user0_ 
    where
        user0_.id=?
Hibernate: 
    update
        public.user 
    set
        name=?,
        pwd=?,
        money=?,
        position=? 
    where
        id=?
Hibernate: 
    update
        public.stockposition 
    set
        idstock=?,
        idUser=?,
        amount=? 
    where
        id=?
Hibernate: 
    update
        public.user 
    set
        name=?,
        pwd=?,
        money=?,
        position=? 
    where
        id=?
Hibernate: 
    delete 
    from
        public.orderstock 
    where
        id=?
Hibernate: 
    select
        stockposit0_.id as id1_,
        stockposit0_.idstock as idstock1_,
        stockposit0_.idUser as idUser1_,
        stockposit0_.amount as amount1_ 
    from
        public.stockposition stockposit0_ 
    where
        stockposit0_.idstock=? 
        and stockposit0_.idUser=?
Hibernate: 
    select
        nextval ('hibernate_sequence')
Hibernate: 
    select
        nextval ('hibernate_sequence')
Hibernate: 
    insert 
    into
        public.transactionstock
        (buyer, seller, idstock, price, amount, creation, id) 
    values
        (?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        public.offerstock
        (iduser, idstock, price, amount, creation, id) 
    values
        (?, ?, ?, ?, ?, ?)
Hibernate: 
    update
        public.stock 
    set
        name=?,
        price=? 
    where
        id=?
Hibernate: 
    update
        public.stockposition 
    set
        idstock=?,
        idUser=?,
        amount=? 
    where
        id=?
Hibernate: 
    select
        offerstock0_.id as id3_0_,
        user1_.id as id0_1_,
        offerstock0_.iduser as iduser3_0_,
        offerstock0_.idstock as idstock3_0_,
        offerstock0_.price as price3_0_,
        offerstock0_.amount as amount3_0_,
        offerstock0_.creation as creation3_0_,
        user1_.name as name0_1_,
        user1_.pwd as pwd0_1_,
        user1_.money as money0_1_,
        user1_.position as position0_1_ 
    from
        public.offerstock offerstock0_ 
    left outer join
        public.user user1_ 
            on offerstock0_.iduser=user1_.id 
    where
        offerstock0_.idstock=? 
    order by
        offerstock0_.price desc limit ?
Hibernate: 
    select
        orderstock0_.id as id4_0_,
        user1_.id as id0_1_,
        orderstock0_.iduser as iduser4_0_,
        orderstock0_.idstock as idstock4_0_,
        orderstock0_.price as price4_0_,
        orderstock0_.amount as amount4_0_,
        orderstock0_.creation as creation4_0_,
        user1_.name as name0_1_,
        user1_.pwd as pwd0_1_,
        user1_.money as money0_1_,
        user1_.position as position0_1_ 
    from
        public.orderstock orderstock0_ 
    left outer join
        public.user user1_ 
            on orderstock0_.iduser=user1_.id 
    where
        orderstock0_.idstock=? 
    order by
        orderstock0_.price asc limit ?
« Letzte Änderung: 04.06.07 - 22:30:23 von Axel Janssen »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Das ganze wird effektiv durch Modularisierung.
In dem Usecase werden Dinge wie
- JDBC/SQL Aufrufe
- Transaktionsklammern (beginTransaction, endTransaction)
- Beziehungen zwischen Instanzen
nicht mehr stumpf in den Java Code, sondern nach draussen in xml Dateien verlagert. Neuerdings kann man auch viele Sachen mit Annotations an die Methoden binden. Das bin ich aber noch nicht so fit drin. In Spring geht das auch erst richtig mit Spring2.1 (ich benutze 2.0).

Die Architektur ist sehr geschichtet. Auf JSF geh ich jetzt weniger ein.
Worum geht es?
-> den Code rein halten von infrastrukturellen Zeugs wie Transaktionsklammern, Security (Autorisierung, Authentifizierung, Rollen), Beziehungen zu anderen Klassen, Internationalisierung oder SQL-Zeugs.

Usecase:
1. Der user gibt die gewünschten Felder für username/Password in eine Webmaske ein und klickt einen Button "registrieren"
2. Der User erhält einen bestimmten Betrag Geld und von allen existierenden Aktien eine bestimmte Menge.

Datenbankoperationen:
Transaktionsklammer auf ->
Die Daten des users: name, pwd, money, etc. werden in die Datenbank-Tabelle User gespeichert.
Es wird für jeden Stock im System eine Zeile der Tabelle Stockposition erzeugt. Diese hat je 1 foreign key auf einen stock der Tabelle Stock und user der Tabelle User.
<- Transaktionsklammer zu.

In der per jsf magic aufgerufene Methode registerNewUser() der Klasse UserAuthHandler siehts so aus:
Die ist noch nicht fertig. Fehlt Errorhandling (für z.B. ein User mit dem Namen gibts schon). Die Daten für name und pwd kommen aus der Webmaske.
Code
public String registerNewUser() {
		User user = new User();
		user.setName(name);
		user.setPwd(pwd);
		user.setPosition(new Long(0));
		user.setMoney(User.DEFAULT_MONEY);
		user = userService.registerNewUser(user);
		
		context().getExternalContext().getSessionMap().put("user", user);
		// errorhandling
		return "success";
		
	}
Interessant ist nun die von hier aufgerufene Methode registerNewUser(user) der Klasse userService.
Wie kommt die Instanz der Klasse userService in die Klasse UserAuthHandler?
Mit dependency Injection. Das wird extern in einer xml Datei deklariert. Verwirrenderweise in faces-config.xml. Die hat erstmal wenig mit Spring zu tun. Ist für JSF. JSF benutzt aber auch dependency injection und kann SpringBeans referenzieren.
Code
<managed-bean>
		<managed-bean-name>userReg</managed-bean-name>
		<managed-bean-class>
			de.aja.fussi.auth.UserAuthHandler
		</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
		<managed-property>
    		<property-name>userService</property-name>
    		<value>#{userServiceTarget}</value>
  		</managed-property>
	</managed-bean>
Ok. der Instanzvariable userService wird also automatisch userServiceTarget zugewiesen. Wo kommt das her? Aus der Spring BeanContainer Config Datei "applicationContext.xml"

Code
<bean id="userServiceTarget" class="de.aja.fussi.market.UserServiceImpl">
    	<property name="transactionManager" ref="transactionManager"/>
    	<property name="userDao" ref="userDao"/>
    	<property name="stockDao" ref="stockDao"/>
    	<property name="stockpositionDao" ref="stockpositionDao"/>
    	<property name="stockofferDao" ref="stockofferDao"/>
    	<property name="stockorderDao" ref="stockorderDao"/>
    	
    </bean>
Was sollen diese ganzen DAO properties? Das sind andere Instanzen die in die userServiceTarget-Instanz der Klasse de.aja.fussi.market.UserServiceImpl reingeschossen werden.

Z.B. ist userDao auch in applicationContext.xml deklariert:
Code
<bean id="userDao" class="de.aja.fussi.persistence.UserDaoImpl">
	<property name="sessionFactory" ref="sessionFactory"/>
		
	</bean>
und stockpositionDao auch:
Code
<bean id="stockpositionDao"
		class="de.aja.fussi.persistence.StockpositionDaoImpl">
		<property name="sessionFactory" ref="sessionFactory"/>
	</bean>
Die übrigen auch.

Ergebnis: Ich brauch mir komplexe Objektbäume nicht mehr umständlich selbst im Code zusammensuchen. Das macht für mich der BeanContainer, der durch applicationContext.xml gesteuert wird.

Gut. Aus der JSF Klasse (BackingBean) wird also auf UserServiceImpl zugegriffen. Wie der Name schon andeutet gehört UserServiceImpl zur Service Schicht. Die Service Schicht greift wiederum auf verschiedene DAO-Instanzen (Data Access Object Pattern) zu.

Transaktionsklammern werden in der ServiceSchicht gesetzt. Die Service Schicht steuert die DAOs.
Werden die Transaktionsklammern in den code der Methode userService.registerNewUser(user) geschrieben? Nein. Sie werden extern per aop gesetzt. Die Einbindung des Aspekts wird wiederum in die in applicationContext.xml eingebundene transactionContext.xml mit aspectJ-Sprache erledigt:
Code
<tx:advice id="txAdvice" transaction-manager="transactionManager">  
		<tx:attributes>
			<tx:method name="get*" read-only="true" propagation="REQUIRED"/> 
			<tx:method name="find*" read-only="true" propagation="REQUIRED"/> 
			<tx:method name="select*" read-only="true" propagation="REQUIRED"/> 
			<tx:method name="*" propagation="REQUIRED"/> 
		</tx:attributes>
	</tx:advice>
<aop:config>
		<aop:pointcut id="txServiceMethodsUser" expression="execution(* de.aja.fussi.market.UserService*.*(..))"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txServiceMethodsUser"/>
	</aop:config>
Da steht drin: Alle Methoden aller Instanzen im Paket de.aja.fussi.market, deren Klassen-Namen mit UserService anfängt starten eine Transaktion, wenn die aufrufende Methode nicht in einer Transaktion läuft oder sie nehmen Teil an einer Transaktion, wenn die aufrufende Methode an einer Transaktion teilnimmt. Methoden deren Namen, die mit get, find oder select anfangen werden mit readOnly gekennzeichnet.
ALSO insgesamt: Ziemlich mächtig und das erspart Tipparbiet.

Der code von userService.registerNewUser(User user) ist frei von Transaktionscode, läuft aber dank aop stets in einer Transaktion.
Code
public User registerNewUser(User user) {
		
		List<Stock> allStock = stockDao.findAll();
		
		Iterator <Stock>itAllStock = allStock.iterator();
		user = userDao.save(user);
		while (itAllStock.hasNext()) {
			Stock stock = (Stock) itAllStock.next();
			Stockposition stockPosition = new Stockposition(user.getId(),stock, 100);
			user.addStockposition(stockPosition);
			
			
			stockpositionDao.save(stockPosition);
			
		}
		return user;
	}
Hier werden zunächst per stockDao.findAll() aus PosgresSQL alle vorhandenen Aktien-Typen besorgt, um dem neu registrierten User von jedem 100 Stück zu geben.
Wie sieht stockDao.findAll() aus?
Code
public List<Stock> findAll() {
    	log.debug("getting all Stock instances");
    	 try {
    		
             List<Stock> allInstances = (List<Stock>) getHibernateTemplate()
                     .find("from Stock s order by s.price desc");
            return allInstances;
         } catch (RuntimeException re) {
             log.error("get failed", re);
             throw re;
         }
Wo ist der SQL code?
Hibernate sorgt sich drum. Kein Mensch braucht ResultSets. Mit getHibernateTemplate().find("from Stock s order by s.price desc"); werden die Inhalte des Resultsets direkt in Objekte der Klasse de.aja.fussi.model.Stock geschrieben.
Dann wird das User-Objekt in die Datenbank mit userDao.save gespeichert. Wie sieht userDao.save aus?
Code
public User save(User user) {
		log.debug("saving User instance");
		try {

			getHibernateTemplate().save(user);

			// getHibernateTemplate().saveOrUpdate(transientInstance);

			log.debug("save successful");
			return user;
		} catch (RuntimeException re) {
			log.error("save failed", re);
			throw re;
		}
	}
Der Rest sollte klar sein:
Code
while (itAllStock.hasNext()) {
			Stock stock = (Stock) itAllStock.next();
			Stockposition stockPosition = new Stockposition(user.getId(),stock, 100);
			user.addStockposition(stockPosition);
			
			
			stockpositionDao.save(stockPosition);
			
		}
In dem code ist z.Zt. weder Internationalisierung noch Errorhandling drin.
Aber die 2 Dinge, um die es geht:
-> den Code rein halten von infrastrukturellen Zeugs wie Transaktionsklammern, Security (Autorisierung, Authentifizierung, Rollen), Beziehungen zu anderen Klassen, Internationalisierung oder SQL-Zeugs.
All dies technische Zeugs wickeln die Frameworks ab und ich deklarier das nur noch in xml-Dateien.

Der Code ist geschichtet in JSF-BackingBeans->ServiceLayer->DaoLayer. Die Beziehungen zwischen den Instanzen der Klassen der Schichten wird per Dependency Injection geregelt. Dependency Injection kann mit annotations oder xml-ConfigDateien deklariert werden.

Spring besitzt zudem hervorragende Unterstützung zum Unit- und Integrations-Testen der einzelnen Schichten.

Spring unterstützt:
AspectJ, allemöglichen Datenbankframeworks, EJB2, EJB3, Webservices, HttpClient, quartz, JMS, JMX, Portlets, Groovy, JRuby, BeanShell, JSF, Struts1+2, hat ein eigenes Webframework, JasperReports, PDF-Umwandlung, Tapestry, RMI, HTTP Austausch von Daten mit Hessian, Burlap oder HttpClient, JCA, Java Mail Api, Portlets, Acegi-Security, etc.
« Letzte Änderung: 04.06.07 - 23:25:58 von Axel Janssen »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
bei mir übrigens auch Wandel
« Antwort #8 am: 06.06.07 - 14:33:31 »
Als Programmierer/Entwickler/Developer/Project Manager/Consultant oder wie immer sich diese von uns ausgeübte Tätigkeiten auch immer bezeichnet werden, sollte man sich dann irgendwie doch um eine realistische Haltung bemühen.
Mein Opa hat sich als erst 1951 aus der KPD ausgetretener Schlosser durch die Weimarer Republik und nach eigenen Erzählungen arbeiterlieder-singend durch die Wilhemshavener Bunker 1944/45 geschlagen. Zwischendurch hat er voll-traumatisierte U-Boot-Besatzungen gesehen, deren Gefährt er dann reparierte. Erst ab den 70ern oder 80ern konnte er seine ca. 1920 in die USA emigrierten Brüder besuchen. Die hat er vorher das letzte Mal 1929 gesehen, als die naiverweise glaubten, es gäbe in Deutschland nach der großen Depression an der Wall Street mehr bezahlte Arbeit als in Wisconsin.
So ist das natürlich heute nicht. Aber voll erreicht haben wir den sozialdemokratischen Traum nach geordneteren Arbeits- und Sozialverhältnissen auch nicht.
Ohne jetzt einen Klassenkampf starten zu wollen (an den ich sowieso nicht glaube). Aber es ist erstmal einfacher zu sagen: Wir machen jetzt LifeRay und Alfresco als "walk the talk". Letztlich hängt das Management natürlich dann wieder von den Ergebnissen ab.
Irgendwie hab ich auch das Gefühl, dass meine schwersten Kunden dann 2 bis 3 Jahre später aufgrund von Massenentlassungen in den Schlagzeilen stehen. Es gibt mehr als ein Beispiel. Ich will die nicht nennen.
Es gibt auch kein Patentrezept. Schnell neue Technologien lernen? Immer 5 Minuten vor den Kunden herfliegen? Ich glaub dran mach das (in kapitalistischen Gesellschaften macht man und versucht nicht). Sonst könnt ich mich nicht am Markt verkaufen. Bernhard zeigt, dass es über Vertiefung auch anders geht. Beide Wege haben seine Risiken, über die man sich oft nur ex-post klar wird.
Das Erlernen von komplexen technischen Systemen erfordert Zeit. Das hat Opportunitätskosten. Vielleicht liest man besser ein Buch über Wirtschaftspsychologie, The Secrets of Consulting, Die Kunst des Krieges oder über Verhandlungsführung. Oder mehr davon als ohnehin.
Ein zukunftsträchtigen Java-Job, in dem du ein bischen mit Java daddelst dürfte schwer zu finden sein. Es ist normal, den Mekong oder den Kongo full-stack hochgeschickt zu werden. Und wir sind verantwortlich für die Qualität unserer Arbeit. Und Arbeit ist Zeit * Energie. Eigentlich beginnt die Auseinandersetzung mit jeder Technologie erstmal mit der Konsumption der bahnbrechenden Effizienzvorteile, die diese bringt. Das ist dann aber immer nur der Beginn der Auseinandersetzung.
Der Java-Markt erlebt einen Frühling. Right now. Right here. Ich weiss das, da ich aus gegebenen Anlaß (letztlich Unzufriedenheit über zu viel Abschirmung durch Projektmanager) mit ein paar Unternehmen gesprochen habe. Meine Zeit der Unklarheit ist übrigens vorbei. Ewig wird der Frühling nicht halten. So das ist eine Chance, in interessante Projekte zu kommen.   

Nach diesen staatstragenden, leicht pathetischen Worten ein paar praktische Tipps:
- Besorg dir alle interessanten Samples und Beispielapplikationen zu LifeRay und Alfresco, die du ergattern kannst.
- Wichtig ist aus meiner Sicht immer das Verständnis für die Frameworks unter der Haube.

viel Glück

Axel
« Letzte Änderung: 06.06.07 - 14:51:04 von Axel Janssen »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: LifeRay und Alfresco
« Antwort #9 am: 06.06.07 - 15:00:39 »
bevor ich richtig in LifeRay und Alfresco einsteigen kann (die Systeme gibt es noch gar nicht auf denen ich mal entwickeln soll evt) muss ich mich leider mit Alltag rumschlagen, und der sieht momentan so aus:

ich muss eine Webanwendung, die ein Student in php (FrontEnd) hingeschlunzt hat (der natürlich jetzt weg ist) bei unseren Kollegen in USA implementieren die immer schlafen wenn ich wach bin. Das ganze läuft auf einer Linux-Box in USA mit DB-Anbindung an MS SQL (über FreeTDS) und ich als Linux-Neuling darf nun auf den Server zugreifen, indem ich auf meinem lokalen LifeRay-Server ein NetworkUtilities-Portlet nutze, mit dem ich über SSH und SFTP auf dem Linuxserver arbeite. Das ist natürlich komplett krank aber so ist der Alltag heutzutage. Und warum mache ich das? Weil die Amis keine Zeit oder keine Ahnung haben wie das geht. Immerhin habe ich nebenbei mein erstes Portlet in der ext-Umgebung von LifeRay gebaut, leider stimmen in meiner view.jsp irgendwelche Pfade nicht, da ant mir zwar alles gebaut hat, aber die Verquickung zwischen portal-Umgebung und ext-Umgebung bei mir irgendwie durcheinander ist.
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: LifeRay und Alfresco
« Antwort #10 am: 06.06.07 - 15:37:12 »
Kenn ich. Mein Vater meint immer, dass damals die guten Chef-Berater bei den IBM-Mainframern, die haben immer detailliert auf alle Projektrisiken und Behinderungsgründe Punkt für Punkt hingewiesen. Sicher richtig, aber die Umsetzung im konkreten Einzelfall da draussen...  ::)
Vielleicht finde ich in den Ratgebern zur Verhandlungsführung gute Tipps wie das kommuniziert werden kann. Die Gefahr ist, dass man schnell das Image eines Moser-Heinis (engl.: complainer, sp: quejico) bekommt.  :-:
« Letzte Änderung: 06.06.07 - 16:58:38 von Axel Janssen »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: LifeRay und Alfresco
« Antwort #11 am: 07.06.07 - 01:23:54 »
Mark,
Ich kann nicht Jack of all traits sein(spell?).
Wenn ich mich auf 2 Plattformen mit hibernate/spring/jBPL unter der Haube beschäftigen soll, dann hätt ich keinen Kopf mehr für PHP. Dafür muss Zeit freigeräumt werden. Das ist kein point-and-click programming oder 4gl sondern verteiltes, serverseitiges programmieren. Die Freelancer-Preise für einen dem vergleichbaren dev-stack auf jobserve.com bewegen sich zwischen 30 und 60 Pfund Sterling die Stunde (einfach Spring hibernate in Jobserve.com eingeben). Vielleicht mal ein Argument, das ein bischen ernst zu nehmen für das Management? Und dann muß natürlich eine vernünftige Entwicklungsumgebung da sein. Sonst kann es vielleicht so aussehen, als wär ich produktiv. Irgendwann sind dann aber so viele Lücken in der Arbeit, dass ich feststelle, dass ich es nicht bin. Und andere auch. Wenn das Management zu wenig Bereitschaft hat, ernsthaft über Arbeitsbedingungen zu verhandeln, wechsele ich die Firma. Egal welche Gründe vorgegeben werden. Gründe sind immer einfach zu finden.
Wenn auf Servern buggy php von einem Studenten läuft, hat der Student sein Zeugnis und ihr einen starken Indikator dafür, dass euer QM bezüglich Code-Review Raum für Verbesserungen hat.
« Letzte Änderung: 07.06.07 - 02:01:16 von Axel Janssen »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz