Modellgetriebene Softwareentwicklung in der Praxis SS14 eJSL

Aus THM-Wiki
Wechseln zu: Navigation, Suche
Kurs
Kursname Modellgetriebene Softwareentwicklung in der Praxis SS 14
Kurstyp Praktikum
Dozent Priefer
Semester SS 14
Studiengang Master
Link http://homepages.thm.de/~dprf53/lehre.html


Diese Seite dokumentiert die Ergebnisse des Gruppenprojektes der Gruppe "eJSL".

Analyse

ExtensionPackage

Ein Package hat folgende Struktur:

Für das Package werden die Erweiterungen entsprechend dem erstellten Model generiert.

Manifest

Die Manifest-Datei ist fast völlig generisch. Die Daten sollen aus dem Model ausgelesen werden.

Quelle

Joomla Package Tutorial

Library

Auf dem Bild ist die Struktur der THM Groups Library dargestellt.

Die Bibliothek soll auf jeden Fall eine Manifest-Datei beinhalten. Die Struktur kann frei gestaltet werden.

Manifest

Schematischwiederkehrend

<?xml version="1.0" encoding="UTF-8"?>
<extension type="library" version="3.4.0" method="upgrade">

Generisch

Im eJSL vordefinierte Tag-Informationen:

  • authors
  • creationdate
  • copyright
  • license
  • link
  • version
  • description

Der Wert "authors" wird auf "Author" referenziert, welcher folgende Werte im Manifest zusätzlich eintragen soll.

  • name
  • authoremail
  • authorurl

Beispiel der Komponente "Weblinks":

<name>com_weblinks</name>
<author>Joomla! Project</author>
<creationDate>April 2006</creationDate>
<copyright>(C) 2005 - 2014 Open Source Matters. All rights reserved.</copyright>
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>
<version>3.0.0</version>
<description>COM_WEBLINKS_XML_DESCRIPTION</description>

Wobei der Inhalt der Description immer am Ende der Installation angezeigt wird.

Nicht im eJSL vordefinierte Tags:

  • files
    • filename
    • foldername
  • languages
  • dependencies
  • updateservers

Quelle

Component am Beispiel von Weblinks ("weblinks")

Frontend-Teil

  • components/com_[weblinks]/
  • Component-Einstiegsdatei: [weblinks].php
  • Manifest: Ist immer im Backendteil
  • Ordner:
    • controllers/
    • helpers/
    • models/
    • views/
  • View-Beispiel für Category-View mit normaler HTML-Anfrage:
    • Einstiegsdatei: /views/[category]/view.[html].php
    • Template: /views/[category]/tmpl/default.php


Backend-Teil

  • administrator/components/com_[weblinks]/
  • Gleiche Struktur, wie Frontend-Teil
  • Aber mit Manifest: [weblinks].xml

Weiterführendes


Templates

Ein Template ist das Aussehen einer Joomla-Seite. Templates haben Felder in denen die Komponenten und Module angezeigt werden können, dabei wird in jedem Feld eine Komponente oder mehrere Module angezeigt.

Es gibt zwei Typen von Templates: Front-end Templates und Back-end Templates.

Ordner Struktur

  • Template
    • site
      • css
      • html (Joomal override files)
      • images
      • templateDetails.xml
      • index.php
    • admin
      • (Siehe site)

templateDetails.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <extension version="3.3" type="template">
 3   <name>mynewtemplate</name>
 4   <creationDate>2008-05-01</creationDate>
 5   <author>John Doe</author>
 6   <authorEmail>john@example.com</authorEmail>
 7   <authorUrl>http://www.example.com</authorUrl>
 8   <copyright>John Doe 2008</copyright>
 9   <license>GNU/GPL</license>
10   <version>1.0.2</version>
11   <description>My New Template</description>
12   <files>
13   <filename>index.php</filename>
14     <filename>templateDetails.xml</filename>
15     <folder>images</folder>
16     <folder>css</folder>
17   </files>
18   <positions>
19    <position>breadcrumb</position>
20    <position>left</position>
21    <position>right</position>
22    <position>top</position>
23    <position>user1</position>
24    <position>user2</position>
25    <position>user3</position>
26    <position>user4</position>
27    <position>footer</position>
28   </positions>
29 </extension>

index.php

 1 <?php defined( '_JEXEC' ) or die( 'Restricted access' );?>
 2 <!DOCTYPE html>
 3 <html xml:lang="<?php echo $this->language; ?>" lang="<?php echo $this->language; ?>" >
 4   <head>
 5     <jdoc:include type="head" />
 6     <link rel="stylesheet" href="<?php echo $this->baseurl ?>/templates/mynewtemplate/css/template.css" type="text/css" />
 7   </head>
 8   <body>
 9     <jdoc:include type="modules" name="top" /> 
10     <jdoc:include type="component" />
11     <jdoc:include type="modules" name="bottom" />
12   </body>
13 </html>

Quellen

Module

Dateistruktur

  • mod_helloworld.php
  • mod_helloworld.xml
  • helper.php
  • tmpl
    • default.php

mod_helloworld.php

Diese Datei ist der Haupteinstieg in das Modul. Sie führt alle nötigen Initialisierungs-Routinen aus, führt Helper-Routinen aus, um nötwendige Daten zu sammeln, und includiert das Template, welches die Ausgaben des Moduls anzeigt.

 1 <?php
 2  
 3 // no direct access
 4 defined( '_JEXEC' ) or die( 'Restricted access' );
 5 // Include the syndicate functions only once
 6 require_once( dirname(__FILE__).'/helper.php' );
 7  
 8 $hello = modHelloWorldHelper::getHello( $params );
 9 require( JModuleHelper::getLayoutPath( 'mod_helloworld' ) );
10 ?>

helper.php

Diese Datei beinhaltet die Helfer-Klassen welche benutz werden um die eigentliche Arbeit zu erledigen, vom erhalten der Informationen bis zum Darstellen im Modul (normalerweise von einer Datenbank oder einer anderen Quelle).


 1 <?php
 2 class modHelloWorldHelper{
 3     /**
 4      * Retrieves the hello message
 5      *
 6      * @param array $params An object containing the module parameters
 7      * @access public
 8      */    
 9     public static function getHello( $params )
10     {
11         return 'Hello, World!';
12     }
13 }
14 ?>

tmpl/default.php

Das ist das Module-Template. Diese Datei nimmt die Daten von mod_helloworld.php un generiert den HTML-Text der auf der Seite angezeigt wird.

1 <?php 
2 // no direct access
3 defined( '_JEXEC' ) or die( 'Restricted access' ); 
4 echo $hello; 
5 ?>

mod_helloworld.xml

Diese Datei enthält Informationen über das Modul. Es definiert die Dateien die vom Joomla! installer installiert werden müssen und spezifiziert die Konfigurationsparameter für das Modul.


 1 <?xml version="1.0" encoding="utf-8"?>
 2 <extension type="module" version="3.1.0" client="site" method="upgrade">
 3   <name>Hello, World!</name>
 4   <author>John Doe</author>
 5   <version>1.0.0</version>
 6   <description>A simple Hello, World! module.</description>
 7   <files>
 8     <filename>mod_helloworld.xml</filename>
 9     <filename module="mod_helloworld">mod_helloworld.php</filename>
10     <filename>index.html</filename>
11     <filename>helper.php</filename>
12     <filename>tmpl/default.php</filename>
13     <filename>tmpl/index.html</filename>
14   </files>
15   <config>
16   </config>
17 </extension>

Quellen

Plugin

Quellen

Generatoren

Template-Generator

Der Template-Generator generiert ein Template-Extension die in Joomla 3.3 installiert und verwendet werden kann. Hierbei wird nur das Grundgerüst des Modules generiert, individuelle Inhalte müssen vom Entwickler selber implementiert werden.

Wiederkehrende Teile

Die die "TemplateDetails.xml" ist bei jedem Template gleich, daher wird die Grundstruktur dieser Datei vom Generator erstellt und mit den Daten aus dem Model gefüllt. Es werden auserdem Ordner für CSS, JavaScritp, fonts, imagesm language erstellt. Dieser Ordner haben aber keinen Inhalt, da dieser Inhalt individuell ist und nur von einem Anwendungsentwickler gefüllt werden kann. Der Language-Ordner wird mit den in der Instanz erstellten Sprachen gefüllt.

In die component.php Datei werden alle in der Instanz des Models angegebenen Possitionen eingetragen. An diese Positionen können später Componenten oder Module eingebunden und angezeigt werden.

Im CSS-Ordner werden bereits vordefinierte CSS Einträge erstellt. Diese CSS-Dateien werden auch in der component.php eingebunden. Im CSS-Ordner werden die Dateien mod_name.css, mod_name_rtl.css mit den aus dem Model erstellten CSS-Informationen gefüllt. Diese konnten mit Key-Value-Paaren definiert werden. Der Generator schreibt diese Paare auch in eine der dafür angelegten CSS-Dateien.

Die Language-Dateien werden auch mit Key-Value-Paaren gefüllt.

Generierte Ordner und Dateien

  • index.php
  • component.php
  • templateDetails.xml
  • css
    • general.css
    • offline.css
    • error.css
    • mod_name.css
    • mod_name_rtl.css
  • fonts
  • html
    • modules.php
  • javascript
  • images
    • dummyImage
  • language
    • lang_name
      • lang_name.ini
      • lang_name.sys

In jedem Ordner wird durch die Methode generateJoomlaDirectory eine index.html erstellt.

Module-Generator

Der Module-Generator generiert eine Module-Extension die in Joomla 3.3 installiert und verwendet werden kann. Hierbei wird nur das Grundgerüst des Modules generiert, individuelle Inhalte müssen vom Entwickler selber implementiert werden.

Generische und wiederkehrende Teile

Der Generator erstellt die Manifest-Datei und füllt diese mit generischem Inhalt aus dem Model. Dazu gehören Eigenschaften wie: creationDate, copyright, license, version, description. Werte die im Model nicht angegeben sind, werden mit Standardwerte die im Generator eingebaut sind gefüllt. Es wird eine Liste mit Files in der Manifest erstellt. Hierbei sind aber nur die Dateien eingetragen, die auch durch den Generator erstellt wurden. Benutzer erstellte Dateien müssen dann an dieser Stelle per Hand eingefügt werden, da diese immer individuell sind. Auch der Inhalt der verschiedenen PHP Dateien (z.B. der helper.php) müssen per Hand ausgefüllt werden, da diese Daten komplett individuell sind. Der Generator erstellt hier nur die Dateien und füllt sie mit einer Grundstruktur die dann aber vom Anwendungsentwickler ausgefüllt werden müssen.

Es werden für alle Sprachen, die in der Instanz des Models angegeben sind ein Language-Tag in der Manifest-Datei und die zugehörigen Language-Dateien erstellt. Sind keine Sprachen angegeben, wird der Ordner und die Tags nicht generiert.

Generierte Ordner und Dateien

  • mod_name.php
  • helper.php
  • mod_name.xml
  • tmpl
    • default.php

Component-Generator

Der Generator für die „Component“-Erweiterung ist einer der aufwendigsten Generatoren, da „Component“ eine Erweiterung mit vielen Dateien und Komponenten ist. Wie alle Erweiterungsgeneratoren baut er auf „AbstractExtensionGenerator“ auf und erbt so die Funktions-Infrastruktur für die Pfadverwaltung und die Datei- und Ordnergeneratoren.

Die Komponente wird mit dem Namen „com_NAME“ benannt. Es werden nach und nach folgende Dateien mit generierbaren Inhalt und Grundgerüst erstellt, dabei entstehen drei Ordner (Sprachen, Frontend, Backend). Der generierbare Inhalt wird aus dem eJSL-Modell entnommen oder statischer Inhalt eingesetzt, der überall gleich ist.

  • com_NAME.xml (Manifest)
  • language/ (Sprachen)
    • de_DE/ (Sprachordner und Dateien, für jede definierte Sprache)
      • de_DE.com_NAME.ini
      • de_DE.com_NAME.sys.ini
  • admin/ (fürs Backend)
    • sql/ (Datenbank-Schema für Installation etc.)
      • install.mysql.utf8.sql
      • uninstall.mysql.utf8.sql
      • updates/mysql/0.0.1.mysql.utf8.sql
    • views/
      • com_NAME/
        • view.html.php
        • tmpl/default.php
      • PAGE/ (für jede Page, die definiert ist)
        • view.html.php
        • tmpl/default.php
    • models/
      • PAGE.php (für jede Page, die definiert ist)
    • controllers/
      • PAGE.php (für jede Page, die definiert ist)
    • NAME.php (Start-Datei)
    • controller.php (Default-Controller)
  • site/ (fürs Frontend)
    • views/
      • com_NAME/
        • view.html.php
        • tmpl/default.php
      • PAGE/ (für jede Page, die definiert ist)
        • view.html.php
        • tmpl/default.php
    • models/
      • PAGE.php (für jede Page, die definiert ist)
    • controllers/
      • PAGE.php (für jede Page, die definiert ist)
    • NAME.php (Start-Datei)
    • controller.php (Default-Controller)

Für die Datenmodelle werden schon passende Ansichten im Front- und Backend zur Präsentation der Daten generiert. Dies geschieht mit JTable. Für Erweiterungen (nicht generische Teile) werden Platzhalter generiert, die vom Anwendungsentwickler ausgefüllt werden können.

Ziel dieses Generators ist, ein Component-Skelett aus einem eJSL-Modell generieren zu können, welches direkt in Joomla installiert werden kann.


Validierung

Mithilfe von Validierung können Prüfungen für das Modell durch geführt werden, die mit einer Grammatik nicht oder nur schwer umsetzbar wären. Anhand einer Grammatik kann die syntaktische Korrektheit eines Modells geprüft werden. Bei der Validierung liegt der Fokus hingegen auf der Prüfung von Modellen auf logische Korrektheit.

Für die Implementierung von Validierung für eJSL wurden mehrere Alternativen in Betracht gezogen:

  • OCL
  • XText
  • Java (mit EMF Validation Framework)

Eine Java-Umsetzung mithilfe des EMF Validation Frameworks wurde von vornherein ausgeschlossen, da ... Letztendlich fiel die Entscheidung auf XText, weil ...

Constraints

Vor der Implementierung wurden zunächst das Metamodell und das Referenzmodell analysiert. Dabei wurden folgende Constraints gefunden:

  • Eindeutigkeit von Bezeichnern
    • Attributnamen
    • Autornamen
    • Klassennamen
    • Datentypen
    • Entitätsnamen
    • Erweiterungsnamen
    • Schlüsselnamen
    • Sprachbezeichner
    • Methodennamen
    • Seitennamen
  • Einmalige Referenzierung
    • Entitäten, Seiten
  • Schema für Strings
    • E-Mail von Autoren
    • URL von Autoren
  • Kardinalitäten und Rekursion
    • nur jeweils ein Backend und Frontend
    • Erweiterungspakete dürfen nicht weitere Erweiterungspakete enthalten

Schweregrad von Validierungsfehlern

Implementierung

QuickFixes

Formatter