1. Enterprise 2.0 Portale mit Grails. Geht das?
Java Forum Stuttgart
04.07.2013
Manuel Breitfeld, Tobias Kraft
2. 2
Redner
● IT-Berater bei exensio GmbH (Karlsruhe)
● Mehrere Jahre Erfahrung mit der Umsetzung von Enterprise-Portalen.
● Neben Java-Technologien kommt mehr das leichtgewichtige Grails-
Framework zum Einsatz.
● Aktuelle technische Erkenntnisse und Erfahrungsberichte werden
regelmäßig auf http://blog.exensio.de/ veröffentlicht.
Tobias KraftManuel Breitfeld
8. 8
Probleme von Portalen
● Schwergewichtig
● Nach Möglichkeit alles integrieren
● Unterstützung von Standards durch Portalhersteller
● Portlet-API veraltet
● Teilweise hohe Lizenzkosten
● Testing
10. 10
Was ist Grails?
A Full-Stack Web (MVC) Framework
● Install & GO!
● Nahtlose Java Integration, wird auf der Java Virtual Machine (JVM)
ausgeführt
● Ursprünglich inspiriert von Ruby on Rails
● Open Source
● Grails Historie
● Projekt-Beginn 2005
● Grails 1.0 (02/2008)
● Grails 2.2.2 (04/2013)
● Basiert auf Groovy
11. 11
Groovy
● Dynamische typisierte Sprache
● Basiert auf JVM
● Zusätzliche Features zu Java
def names = ["Peter", "Manuel", "Tobias"]
println names
def shortNames = names.findAll { it.size() <= 5 }
println shortNames.size()
shortNames.each { println it }
Beispiel:
12. 12
Rapid development
Der Standard-Weg ist konfiguriert, aber Änderungen sind möglich
● Convention over Configuration (CoC)
● Don’t repeat Yourself (DRY)
Beispiele:
● Aufbau Projekt-Struktur
● DB-Mapping
● Klassennamen
● Logging
● Autowiring
15. 15
GORM – für die Persistenz
● Hibernate ist der Standard
● Austausch Persistenzschicht ist möglich
● DB-Operationen erfolgen direkt am Domain-Objekt
● Queries einfach und intuitiv
Portlet.findAllByPageAndPortal(‘Home’, portalname)
PortletInst.where{
year(published) == 2013 && right != ‘public’
}
Where-Queries
Dynamic Finders
Portlet.delete()
Portlet.save(flush:true)
16. 16
CoC-Beispiel anhand von Services
● SpringBeans als einfache POJOs
● Einfacher Zugriff über DI
● Management von Transaktionen
def portalService
def calculateMenu() {
def page = portalService.getHome()
….
}
static transactional = false
@Transactional(propagation = Propagation.REQUIRES_NEW)
def fooMethod() {…}
17. 17
Controller und Views
● Controller
● Direkter Zugriff auf Services
● Standardmethoden wie render()
● Groovy Server Pages
● Ähnlich JSP’s
● Zusätzliche Tagslibs und Variablen
● Model-Zugriff
● Taglibs
● Integration weiterer Oberflächen-Libraries als Plugins (bspw. Vaadin, …)
18. 18
Full-Stack und Continuous Integration
● Test
● Testdaten (Fixtures, Build Test Data Plugin)
● JUnit, Spock
● Build
● Gant / Ivy
● Gradle
● Analyse-Werkzeuge
● Cobertura
● Codenarc
● Jenkins / Hudson
19. 19
Integrationsbeispiele
● JSON-Slurper
● File-Handling
def jsonText = '''{
"message": {
"header": { "from": "bud@spencer.com"},
"body": "Hello Java Forum Stuttgart."
}
}'''
def mail = new JsonSlurper().parseText(jsonText)
assert mail.message.body == "Hello Java Forum Stuttgart."
new File('/data/').eachFileMatch( ~".*xml" ) { f ->
if ( f.lastModified() <= yesterday ) {
f.delete()
}
}
21. 21
Was ist cool an Grails?
http://www.morguefile.com/archive/display/196579
● Runterladen und loslegen
● Groovy macht vieles kürzer und schneller
● Zahlreiche Plugins steigern die Produktivität
● Full-Stack Unterstützung / Continous Integration
● Testing
● Coverage
● Build
22. 22
Was ist bei Grails zu beachten?
● Unsauberer Code ist schnell produziert
● Schichtentrennung
● Schwergewichtige Taglibs
● Zu viel Logik in Controllern
● Vernachlässigung der Tests (Nicht typisiert)
● Versions-Upgrades detailliert testen
23. 23
Warum Grails für ein Portal einsetzen?
● Einfache Integration von Drittsystemen
● Schnelle Umsetzung neuer Anforderungen
● Enterprise-Fähigkeit
● Einfaches Testing
● CI-Unterstützung
25. 25
Tagging
● Kennzeichnung / Kategorisierung verschiedener Themen
● Funktionsübergreifendes Tagging
● Blog Posts, Dokumente, Micro Messages, Wiki,…
● Hierarchie
● Gültigkeitsbereiche
● Blog Post befasst sich mit anderen Themen als das Wiki
● Realisiert ohne „direkte Abhängigkeit“ im Datenmodell
● Entwicklung auf Basis des Taggable-Plugins
27. 27
Enterprise Suche
● Suche über mehrere fachliche Komponenten
● Unterschiedliche Darstellung je nach Inhaltstyp
• Bild mit Kontaktdaten für Personen
• Vorschau für Dokumente
● Facettensuche, u.a. mit Hierarchie und Date Range
● Highlighting, Autocomplete, Fuzzy Search,…
● Tag Cloud zu passenden Suchbegriffen
● Realisiert mit Apache Solr und Elasticsearch
● Einbindung in Grails über die (angepassten) gleichnamigen Plugins
29. 29
Content / Document Management System
● Verschiedene Inhaltstypen
● Unstrukturiert (WYSIWYG Editor), Strukturiert und Templates
● Navigation innerhalb eines Kapitels („Context Navigation“)
● Neben der Portal-Navigation, kann innerhalb von Inhalten eine Navigation aufgebaut
werden
● Workflow
● Freigabe basierend auf dem Vieraugen-Prinzip
● Versionierung
● Inline-Editing innerhalb des Portals
● Realisiert durch eine eigene Lösung (Integration von anderen CMS-Systemen
wie Adobe CQ5, o.ä. möglich)
31. 31
Web 2.0 Funktionalitäten
● Blog
● Wiki
● Micro Messages
● Activity Stream
● Teilen von Dokumenten
● Kommentieren von Inhalten
● Bewerten von Inhalten (Voting)
● Integration von anderen Diensten wie Twitter
36. 36
Portalseiten und Portlets
● Navigation und Portalseiten können
zur Laufzeit definiert werden
● Templates
● Container für die Portlets
● Instanzen von Portlets werden zu
einer Portalseite hinzugefügt
● Positionierung über definierte Container
● Angabe von zusätzlichen Parametern
(Portlet Preferences)
38. 38
Umsetzung neuer Anforderungen
● Einfach!
1. Funktionalität in Grails umsetzen (Controller, View, Service,…)
2. Neues Portlet im Admin-Backend definieren
3. Portlet auf gewünschte Seite „ziehen“
39. 39
Fazit
● Schnelle Entwicklung dank Grails
● Grails ist Enterprise fähig
● Tragfähigkeit in der Praxis erprobt
● Reduzierte Komplexität
40. Vielen Dank!
exensio Gesellschaft für Informationstechnologie mbH
Am Rüppurrer Schloß 12
76199 Karlsruhe
http://www.exensio.de
http://blog.exensio.de
http://twitter.com/exensio