# Customizing und Erweiterbarkeit bei Enterprise-Anwendungen



## fkh (11. Aug 2009)

Erstmal hallo Gemeinde 

Ich steh derzeit am Anfang eines privaten Projekts und würde gern mal eure Meinung dazu lesen. Grundsätzlich geht es um eine Middleware-Anwendung, dazu ein webbasiertes Frontend (am besten mit ajaxifizierten Controls) und die Anbindung eines RDBMS. Mein Problem ist jetzt folgendes: Ich möchte den Anwendern zum einen die Möglichkeit bieten, die vorhandene Formularelemente an ihre Bedürfnisse anzupassen (Stichwort customizing, z. B. soll es möglich sein, zusätzlich Eingabefelder anzulegen und diese entsprechend mit neuen Tabellenfeldern zu verknüpfen oder aber auch bestehende Formularfelder bei Nichtbedarf auszublenden), zum anderen soll der Anwender auch eigene Erweiterungen zum System hinzufügen können (inkl. neuer, dem Plugin zugehöriger Seiten im Frontend). Nachfolgend hab ich euch mal meine bisherigen Gedanken dazu aufgeschrieben. Sollte irgendetwas nicht ganz klar sein, am besten nochmal Fragen, dann versuche ich das ganze noch ausführlicher zu erklären.

Für das Frontend hab ich derzeit GWT (zusammen mit GWT-Ext) ins Auge gefasst. GWT deshalb, weil man hier die Seite programmatisch zusammenbaut und somit die Möglichkeit bestünde, dass jedes Plugin über eine definierte (XML-)Konfigurationsdatei (oder von mir aus DB-basiert) ihr Aussehen selbst bestimmt und ich in GWT den (XML-)Output parse und die Controls entsprechend erzeuge. Zudem bestünde die Möglichkeit, dass man Customizing-Vorgänge, die der Anwender vornimmt, in so einer (XML-)Konfigurationsdatei festhält und somit ein Customizing ermöglicht. Meine Frage wäre jetzt, was ihr von dieser Vorgehensweise haltet oder was ihr anders/besser machen würdet. Ich muss dazu sagen, dass ich bisher lediglich Wissen in Struts, JSF und GWT besitze, aber durchaus bereit wäre mich in andere Webframeworks (wie z. B. ZK) einzuarbeiten, sofern diese für solche Aufgaben besser geeignet sind. Einzige Bedingung ist, dass diese ajaxifizierte Controls bereitstellen (so dass man selbst möglichst wenig mit JavaScript in Berührung kommt) und eben ermöglichen, dass man das Erscheinungsbild verändern kann (womit wohl der Einsatz von Templates wegfällt oder?).

Für die Middleware kommen derzeit ja fast nur EJB 3.0 oder das Spring Framework in Frage (oder gibts noch andere relevante Techniken derzeit?). Wichtig ist hierbei für mich, dass man das o. g. Plugin-Konzept realisieren kann. Da ich bedeutend mehr Erfahrung mit EJB habe als mit Spring (da hab ich nur mal n bissl mit dem Core rumgespielt und WS erzeugt), tendiere ich derzeit zu EJB, bin aber auch hier durchaus bereit, mich weiter mit Spring zu beschäftigen, wenn das sich für mein Vorhaben besser eignet. Ich hatte mir dabei folgendes überlegt. Wird im Frontend eine neue Seite angefordert, erfolgt mittels eines dynamisch gestalteten JNDI-Lookups der Aufruf der jeweiligen EJB, womit eigene Plugins als eigenständige Enterprise- oder EJB-Projekte deployed werden könnten und lediglich der Lookup-Pfad in der Anwendung (z. B. in einer entsprechenden Registry) festgehalten werden müsste. Was mir jetzt an dem beschriebenen Vorgehen nicht gefällt sind die beiden folgenden Punkte. Erstens würde ich den Einsatz von OSGI präferieren, wüsste aber nicht, wie man das mit EJB realisieren könnte (Spring scheint an dieser Stelle mit Dynamic Modules eine Lösung anzubieten --> meine Frage an die Spring-Erfahrenen: Wäre das eine Lösung für mein Vorhaben?).Zweitens gelten die JNDI-Lookups bei EJB als Ressourcenverschwendung, wenn diese in der gleichen VM deployed sind (was bei meiner Anwendung wohl zu erwarten wäre), allerdings benötige ich diese, wenn ich dynamisch die entsprechenden Methoden aufrufen möchte (oder irre ich mich an dieser Stelle?). An der Stelle wieder meine Frage: Was haltet ihr von diesem Vorgehen oder wie würdet ihr das ganze realisieren? Wichtig ist in diesem Zusammenhang vielleicht noch, dass für mich Transaktionen und Sicherheit wichtig sind, aber da scheinen sich beide Frameworks nicht viel zu schenken.

Letzte Unklarheit wäre für mich jetzt der Einsatz eines OR-Mappers. Immer wieder liest man ja, dass man bei neuen Projekten gleich auf ORM (Hibernate, JDO und Co) setzen sollte und zudem gefällt mir die Vorstellung, damit eine Vielzahl der gängigen RDBMS abzudecken, ohne eigene Layer schreiben zu müssen. Allerdings hatte ich ja bereits erwähnt, dass der Anwender eigene Formularfelder anlegen können soll. Jetzt bin ich mir nicht sicher, ob das mit ORM-Frameworks möglich ist (Annotationen dürften wegfallen und ein stat. XML-Configurationfile eigentlich auch, sofern das nicht dynamisch angepasst wird oder?). Wie würdet ihr in diesem Punkt verfahren? Hab da leider keine gute Idee, wie ich das an dieser Stelle machen soll.

Ich hoffe, ihr könnt mir bei den o. g. Problemstellungen weiterhelfen, bin für jede Hilfe dankbar.

Gruß
fkh


----------



## fkh (12. Aug 2009)

Hab noch was vergessen. Und zwar hatte ich ja geschrieben, dass es möglich sein soll, dass der Anwender eigene Formularfelder anlegen können soll. Dadurch ändern sich aber auch die Parameter der Schnittstelle der aufzurufenden Methode in der Middleware. Ich dachte jetzt daran, dass die Methoden als Parameter eine einzelne generische Liste (damit beliebig viele Objekte übergeben werden können) erhalten, welche wiederum ein bestimmtes Objekt (nennen wir die Klasse mal Parameter) beinhalten kann. Diese Klasse Parameter wiederum besitzt jetzt 2 Attribute (name = Name des Parameters zur Identifikation, object = darin verbirgt sich das zu übergebende Parameterobjekt, welches später dann entsprechend gecasted werden muss). Ist das ein gängiges Vorgehen oder gibt es hierfür elegantere Wege? Habt ihr sowas schonmal realisiert und falls ja, wie habt ihr das gelöst? Bin für alle Anregungen, Verbesserungsvorschläge etc. dankbar.

Viele Grüße
fkh


----------



## HLX (13. Aug 2009)

Sorry, mir fehlt leider die Zeit, deinen ganzen Beitrag durchzuarbeiten, aber beim Überfliegen ist mir aufgefallen, dass du GWT mit GWT-Ext verwenden möchtest.

Soviel dazu:
M.E. ist GWT-Ext ein Auslaufmodell.  Es basiert auf der Bibliothek ExtJS, welche seit einiger Zeit unter GPLv3 weiterentwickelt wird. GWT-Ext unterstützt daher nur den letzten LGPL-Stand von ExtJS (Version 2.0.2). Dieser entwickelt sich natürlich nicht weiter und wird bestimmt bald auch nicht mehr unterstützt.

Schau dir stattdessen mal ExtGWT oder SmartGWT an. ExtGWT ist in Java geschrieben, während SmartGWT genau wie GWT-Ext ein Wrapper ist. Beides sind sehr leistungsfähige Bibliotheken.


----------



## fkh (13. Aug 2009)

Hallo HLX,

vielen Dank für deinen Hinweis. Hast du bereits mit beiden Varianten gearbeitet und falls ja, gibt es für dich Punkte, die die eine Bibliothek von der anderen abheben? Bei oberflächlicher Betrachtung der Demos scheinen ja beide einen ähnlichen Umfang an Controls anzubieten, lediglich SmartGWT scheint etwas weniger Code zu benötigen. Werd mir jetzt gleich mal beide etwas genauer anschauen. Vielen Dank auf jeden Fall für den Tip. 

@alle

Hat keiner ne Idee zu meinem zuvor beschriebenen Problem?

Gruß
fkh


----------



## maki (13. Aug 2009)

> Hat keiner ne Idee zu meinem zuvor beschriebenen Problem?


Du willst ein CMS mit BusinessLogik.. wenn du das fertig hast wirst du damit reich 

Mal ernsthaft, denke nicht dass das umsetzbar ist.

Warum?
User erstellen Felder, Formulare, Logik... und die SW fügt diese dann dynamisch ein, erstellt passende EJB samt Schnittstellen/Interfaces, erzeugt daraus EJBs und startet diese dann im AppServer, passt das ORM an, die DB, Mapping.. und das alles wie von Geisterhand 

Hoffe du fast da nicht falsch auf, aber da sehe ich keine realistische Chance.


----------



## HLX (14. Aug 2009)

fkh hat gesagt.:


> Hallo HLX,
> 
> vielen Dank für deinen Hinweis. Hast du bereits mit beiden Varianten gearbeitet und falls ja, gibt es für dich Punkte, die die eine Bibliothek von der anderen abheben? Bei oberflächlicher Betrachtung der Demos scheinen ja beide einen ähnlichen Umfang an Controls anzubieten, lediglich SmartGWT scheint etwas weniger Code zu benötigen. Werd mir jetzt gleich mal beide etwas genauer anschauen. Vielen Dank auf jeden Fall für den Tip.


Ich habe mir beide Bibliotheken vor kurzem näher angesehen. Ich persönlich präferiere ExtGWT, obwohl es auch unter GPLv3 steht. Mit dem Umfang der Widget-Bibliotheken beider Frameworks kann man m.E. ansprechende Web-Anwendungen erstellen. Bei SmartGWT ist der Umfang zwar größer, jedoch ist die Bibliothek trotzdem nicht vollständig. Bei Performance, Optik und Browserunabhängigkeit hat sich für mich keiner der Beiden nennenswert hervorgehoben. 

Bei ExtGWT sind die Widgets bzw. der Umfang an Widgetes leicht erweiterbar, da es in Java geschrieben ist. Man ist somit in der Entwicklung flexibler. Bei der Erstellung eigener Widgets ist man bei SmartGWT mehr auf den Hersteller der Bibliothek angewiesen. 

SmartGWT ist zwar kostenlos, jedoch wenn man die volle Leistungsfähigkeit ausschöpfen möchte (Binding etc.) benötigt man ein kostenpflichtiges Servermodul.

Bei der Entwicklung halte ich ExtGWT ebenfalls für deutlich Effizienter: 
Da SmartGWT ein Wrapper ist, wird die Fehlersuche erschwert. Während man bei ExtGWT beim Debuggen tief ins Framework schauen kann, hört die Fehlersuche in der IDE bereits beim ersten Methodenaufruf auf. SmartGWT ist sehr auf die darunterliegende Bibliothek abgestimmt. Diese liefert für jede Kleinigkeit Stellschrauben. Man kann sozusagen alles und damit mehr als man möchte. Ich finde diesen Methodenwald jedenfalls unüberschaubar. Die Entwicklung in ExtGWT halte ich für deutlich intuitiver.

Für SmartGWT spricht m.E. nur, dass die darunterliegende Bibliothek bereits eine gewisse Reife hat und somit etwas stabiler sein sollte. Das dürfte jedoch nur ein temporärer Zustand sein.


----------



## fkh (16. Aug 2009)

@HLX

Vielen Dank für deine kurze Zusammenfassung 

@maki

Erstmal danke für deine Antwort. Ich weiß jetzt aber nicht, ob wir uns genau verstehen. Der Anwender soll natürlich nicht eigene Logik hinterlegen können, sondern einfache Formularfelder, welche wiederum mit einfachen CRUD-Anweisungen verknüpft sind, verwalten können. Jedoch ist das Customizing von Formularen kein must have, hab das nur mal bei Compiere ERP gesehen und fand das ne schicke Sache (und nein, ich bin nicht so verrückt und will allein ein ERP entwickeln ).

Auch sollen keine EJBs neu ertellt und automatisch deployed werden, sondern die Idee war, dass man eigenständige EJB-Projekte händisch entwickelt und auf nem AppServer deployed und ihren JNDI-Pfad anschließend in einer Registry hinterlegt, um so eine Erweiterbarkeit von EJB-Middleware-Projekten zu erreichen. Hier war die Frage, ob es bessere Wege gibt, eine Erweiterbarkeit zu erreichen (hab bisher nirgendwo vernünftige Infos zu OSGI mit EJB gefunden). Aber ich denke ich werd mir hierfür einfach mal Spring mit DM anschauen.

Gruß
fkh


----------



## maki (16. Aug 2009)

Ach so, dachte schon 

OSGi mit EJB hab ich noch nicht gesehen (allerdings nutzen viele AppServer einen OSGi Kernel), aber gute Erfahrungen mit SpringDM hab ich gemacht.
Es gibt übrigens einen Maven Archetype für SpringDM, falls du Maven nutzt.
Du kannst ein nacktes Equinox als Runtime nutzen, es muss nicht der SpringDM Server sein, letzterer ist nämlich GPL in seiner freien Version.


----------



## Noctarius (16. Aug 2009)

Als Alternative zum SpringDM kann man auch den ServiceMix 4 empfehlen. Auch dieser unterstützt SpringDM und ist aus meiner Sicht einfacher in der Konfiguration und Verwaltung. Abgesehen davon kann der ServiceMix 4 auch Bundles aus einem Maven Repo nachziehen beim Deploy.

@maki: Kann SpringDM Server das auch? Weiß es garnicht genau


----------



## fkh (16. Aug 2009)

Danke euch zweien für eure Antwort. Ich denke, ich werde mir erstmal Spring DM (auch in Verbund mit Equinox, hab in Sachen OSGI bisher nur mit Apache Felix gearbeitet) anschauen und sobald ich mich dort eingearbeitet habe, die Variante mit ServiceMix 4 in Betracht ziehen (Erfahrungen mit ServiceMix 3 sind bereits aus nem Semesterprojekt vorhanden, bleibt zu hoffen dass sich zu Version 4 nicht allzu viel verändert hat).

Danke & Gruß
fkh


----------



## maki (16. Aug 2009)

> @maki: Kann SpringDM Server das auch? Weiß es garnicht genau


K.A. ehrlich, haben wir nicht eingesetzt da Equinox  ausreichend war.
Werde mir mal ServiceMix4 ansehen


----------



## JanHH (16. Aug 2009)

Könnte mir vorstellen dass man bei so einer Aufgabenstellung am besten vorankommt, wenn man wirklich alles selber programmiert.

Vor allem was das Frontend angeht könnte ich mir gut vorstellen, für sowas einen eigenen Satz an bspws. JSF-Komponenten zu schreiben, die entsprechend erweiterbar sind.

Für die Datenbank gilt ja wohl, dass es ziemlich ungünstig ist, bestehende Tabellen ständig zu verändern (wenn jemand zu einer Komponente neue Eigenschaften hinzufügt oder so). Daher wäre da vielleicht ein zweistufiger Prozess sinnvoll.. Die Objekte werden erst auf eine interne Struktur gemappt, die dann ihrerseits auf feste, nicht veränderbare Datenbank-Entities "umgebrochen" werden. Dadurch könnte man dann auch mit Hibernate arbeiten. Also z.B. nur eine Tabelle "ObjectProperties", in der ALLE Properties aller Objekte gespeichert werden, quasi "untereinander" statt (wie sonst) "nebeneinander". Wäre ziemlich viel Overhead, aber grenzenlos flexibel. Habe selber auch eine Anwendung, wo ich nicht vorher weiss, wieviele Variablen zu einem Datensatz eines Projektes gehören, da ist das auch so gelöst.


----------

