Allgemeines zur Implementierung

Struktur der Gesamtanwendung

MyCoRe ist entgegen anderen Projekten kein monolitisches Objekt. Vielmehr wurde ein mehrstufiger Ansatz gewählt, um die Vielfalt der Einsatzgebiete sinnvoll abzudecken. Dabei wird strikt zwischen allgemeingültigen Kernbestandteilen und Funktionalitäten und der schlussendlichen Anwendung, welche ggf. mehrstufig sein kann, unterschieden. Innerhalb dieser Bereiche gibt es wieder Teile, welche unabdingbar erforderlich sind und solche, die im Bedarfsfall in die Endanwendung integriert werden können. Ziel der Struktur ist es, in der Anwendung nur noch das Archiv mycore.jar sowie die erforderlichen weiteren externen *.jar Dateien in die Anwendung integrieren zu müssen. Damit ist die Schnittstelle zwischen dem MyCoRe-Kern und den Anwendungen klar definiert. Details des Aufbaus und der Struktur des MyCoRe-Kerns und der Anwendung werden im nächsten Abschnitt detailliert behandelt. Sowohl die benötigte mycore.jar Datei in ihrer entsprechenden Version wie auch die erforderlichen weiteren *.jar-Bibliotheken anderer Hersteller in den passenden Versionen werden über Maven-Repositories durch die Anwendung angefordert und integriert.

Grundstruktur

Abbildung: Grundstruktur des MyCoRe-Projektes

Benutzte externe Bibliotheken

Das MyCoRe-Projekt bemüht sich, bereits etablierte Techniken und Implementationen zu benutzen, um einerseits den eigenen Entwicklungsaufwand so gering wie möglich zu halten, andererseits dem Nachnutzer den Einstieg durch die Verwendung bekannter Komponenten zu erleichtern.

Der Folgende Abschnitt beschreibt alle eingesetzten Bibliotheken. Dabei ist die Lizenzpolitik der Hersteller sehr unterschiedlich. Gemeinsam ist allen jedoch, dass sie den Open Source Gedanken vertreten und für nichtkommerzielle Einsätze frei verfügbar sind. Die Nutzung von MyCoRe unter wirtschaftlichen Aspekten bedarf also einer gesonderten Betrachtung der Lizenzrechte durch den Anwender. Ob hier Rechte verletzt werden, ist im Einzelfall abzuklären.

Files Beschreibung Lizenz
activation.jar ? ?
ant-antlr-xxx.jar ANother Tool for Language Recognition. ?
ant-contrib.jar ? ?
antlr-xxx.jar ANother Tool for Language Recognition.
asm.jarA Java bytecode manipulation framework. ASM
asm-attrs.jar A Java bytecode manipulation framework. ASM
avalon-framework-xxx.jar ? ?
axis.jar Apache Axis is an implementation of the SOAP for Web services support AL 2.0
axis-ant.jar Apache Axis is an implementation of the SOAP for Web services support AL 2.0
batik.jar ? ?
c3p0-xxx.jar c3p0 is an easy-to-use library for making traditional JDBC drivers "enterprise-ready" by augmenting them with functionality defined by the jdbc3 spec and the optional extensions to jdbc2. LGPL
cglib-xxx.jar Byte Code Generation Library is high level API to generate and transform JAVA byte code. It is used by AOP, testing, data access frameworks to generate dynamic proxy objects and intercept field access. AL 2.0
commons-beanutils.jar Apache Jakarta Common - ? AL 2.0
commons-collections-xxx.jar Apache Jakarta Common - Extends or augments the Java Collections Framework. AL 2.0
commons-discovery-xxx.jar Apache Jakarta Common - ? AL 2.0
commons-fileupload-xxx.jar Apache Jakarta Common - File upload capability for your servlets and web applications. AL 2.0
commons-httpclient-xxx.jar Apache Jakarta Common - Framework for working with the client-side of the HTTP protocol. AL 2.0
commons-io-xxx.jar Apache Jakarta Common - ? AL 2.0
commons-lang-xxx.jar Apache Jakarta Common - Provides extra functionality for classes in java.lang. AL 2.0
commons-logging.jar Apache Jakarta Common - Wrapper around a variety of logging API implementations. AL 2.0
commons-logging-adapters-xxx.jar Apache Jakarta Common - ? AL 2.0
commons-logging-api-xxx.jar Apache Jakarta Common - ? AL 2.0
commons-net-xxx.jar Apache Jakarta Common - Collection of network utilities and protocol implementations. AL 2.0
commons-vfs-xxx-dev.jar Apache Jakarta Common - Virtual File System component for treating files, FTP, SMB, ZIP and such like as a single logical file system. AL 2.0
connector.jar ? ?
dom4j-xxx.jar dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the Java Collections Framework and with full support for DOM, SAX and JAXP. W3C
ehcache-xxx.jar Ehcache is a widely used java distributed cache for general purpose caching, J2EE and light-weight containers. AL 2.0
ezmorph-xxx.jar ? ?
fckEditor.zip This HTML text editor brings to the web many of the powerful functionalities of desktop editors like MS Word. It's lightweight and doesn't require any kind of installation on the client computer. LGPL
fop.jar A library to transform formatting objects. ?
lib/ftp.jar Java FTP client library. LGPL
hibernate3.jar Hibernate is a powerful, high performance object/relational persistence and query service. LGPL
hsqldb_xxx.jar Lightweight 100% Java SQL Database Engine. HS
icu4j_xxx.jar ICU is a mature, widely used set of Java libraries for Unicode support, software internationalization and globalization (i18n/g11n). IBM
jai_codec.jar ? ?
jai_core.jar ? ?
jaxen-xxx.jar The Jaxen Java XPath Engine is an open source cross-API (DOM, JDOM, dom4j, and ElectricXML) XPath library for Java.
jaxrpc.jar ? ?
jcifs-1.2.0.jar JCIFS is an Open Source client library that implements the CIFS/SMB networking protocol in 100% Java. LGPL
jdom-1.0.jar To provide a complete, Java-based solution for accessing, manipulating, and outputting XML data from Java code. JDOM
jid3lib-xxx.jar ? ?
joda-time-xxx.jar Joda-Time provides a quality replacement for the Java date and time classes. AL 2.0
jsch-xxx.jar JSch allows you to connect to an sshd server and use port forwarding, X11 forwarding, file transfer, etc., and you can integrate its functionality into your own Java programs. BSD
json-lib-xxx.jar ? ?
jta.jar JTA specifies standard Java interfaces between a transaction manager and the parties involved in a distributed transaction system: the resource manager, the application server, and the transactional applications. SUN
jtidy.jar We have two primary goals. First, to provide a home where all the patches and fixes that folks contribute can be collected and incorporated into the program. Second, a library form of Tidy has been created to make it easier to incorporate Tidy into other software. W3C
junit-xxx.jar JUnit is a regression testing framework written by Erich Gamma and Kent Beck. CPL
log4j-xxx.jar Inserting log statements into your code is a low-tech method for debugging it. AL 2.0
lucene-analyzers-xxx.jar Apache Lucene is a high-performance, full-featured text search engine library written entirely in Java. AL 2.0
lucene-core-xxx.jarApache Lucene is a high-performance, full-featured text search engine library written entirely in Java. AL 2.0
lucene-queries-xxx.jarApache Lucene is a high-performance, full-featured text search engine library written entirely in Java. AL 2.0
mail.jar The JavaMail API provides a platform-independent and protocol-independent framework to build mail and messaging applications. SUN
metadata-extractor-xxx.jar ? ?
mlibwrapper_jai.jar ? ?
mysql-connector-java.jar The JDBC connector for MySQL. This will be used only if MySQL is installed. ?
opensaml-xxx.jar ? ?
PDFBox-xxx.jar ? ?
saaj.jar ? ?
saxpath.jar ? ?
serializer_xxx.jar This is a part of Xalan. AL 2.0
servlet-api-xxx.jar ? ?
tm-extractors-0.4.jar tm-extractors wraps the Word extraction from POI in a nice API. AL 2.0
wsdl4j-xxx.jar ? ?
wss4j.jar ? ?
xalan_xxx.jarThe Apache Xalan Project is a collaborative software development project dedicated to providing robust, full-featured, commercial-quality, and freely available XSLT support on a wide variety of platforms. AL 2.0
xercesImpl_xxx.jar The Xerces Java Parser 1.4.4 supports the XML 1.0 recommendation and contains advanced parser functionality, such as support for the W3C's XML Schema recommendation version 1.0, DOM Level 2 version 1.0, and SAX Version 2, in addition to supporting the industry-standard DOM Level 1 and SAX version 1 APIs. AL 2.0
xmlsec-xxx.jar ? ?
xmltask-xxx.jar ? ?

Tabelle: Übersicht der benutzten externen Bibliotheken

Lizenzen:

Allgemeine Festlegungen zur Struktur des MyCoRe-Kerns und der Anwendung

Definitionen

  • Common parts sind die Teile des MyCoRe-Kerns, welche von vielen/allen Komponenten und Modulen verwendet werden und die elementaren Grundfunktionalitäten von MyCoRe bereitstellen. U. a. beinhaltet dies die APIs zur Speicherung der Daten, Klassifikationen, der ACLs und Nutzer, Store-Zugriffe und Klassen, die allgemeiner Natur sind und als API-Funktionalitäten bereitgestellt werden (MCRServlet, XML-Parser usw.).
  • Components sind Teile des MyCoRe-Kerns welche als Funktionalität in sich abgrenzbar sind. Sie bauen auf den Common parts auf und enthalten alle zur Funktionalität gehörenden Klassen und Dateien. Alle Komponenten haben eine fest vorgegebene Struktur (siehe unten) und können über ein Property ausgeschaltet werden (wie bisher bei den Modulen des Kerns). Die in den Komponenten enthaltenen Vorlagen (Templates) können durch anwendungsseitige Dateien überschrieben werden. Komponenten werden vom Entwickler-Team bereitgestellt und sind Bestandteil von mycore.jar. Komponenten werden über einen automatischen Prozess in die Anwendung integriert, wenn sie nicht explizit deaktiviert wurden.
  • Modules sind austauschbare/abschaltbare Teile der Nutzeranwendung, welche alle wichtigen Dinge zur Gestaltung konkreter Anwendungen enthalten, die nicht als generisch anzusehen sind (Datenmodelle, statische Seiten, Layouts usw.). Module werden von den Anwendern entwickelt und bauen auf dem mycore.jar auf. Module können auch Komponenten überschreiben bzw. ergänzen. Die Dateibaumstruktur vom Modulen und Komponenten soll analog zueinander sein.

Aufbau der Datei mycore.jar

Die Datei mycore.jar ist die Schnittstelle des MyCoRe-Kerns zu den Anwendungen. Eine Anwendung integriert NUR diese Datei! Externe JAR-Files werden direkt über Maven von der Anwendung nachgeladen. Alle Komponenten werden per default integriert, auszuschaltende Komponenten müssen in der Anwendung spezifiziert werden. Welche Teile dabei von einer Komponente bei Nennung in der Konfiguration kopiert werden, zeigt die Tabelle.

Komponententeil Kopieren
Java-Klassen werden immer kopiert
Stylesheets, Web-Seiten werden nur bei Auswahl kopiert
web.xml, I18N, properties werden nur bei Auswahl eingebunden

Tabelle: Verwendung der Komponententeile

Der Aufbau der JAR-Datei für die JAVA-Klassen ist von uns nicht änderbar, sondern ergibt sich aus der Package-Struktur. Für Hibernate Mappings ist es gängiger Standard, dass diese genauso heißen wie die Klassen - mit der Endung .hbm.xml und in dem gleichen Package liegen, also zusammen mit den *.class-Dateien. Eine Komponente in MyCoRe enthält Klassen, Webseiten, I18N-Dateien, Properties, Hibernate-Mappings, Stylesheets, XSD- und DTD-Dateien.

    

mycore.jar \ META-INF \ \ Manifest.mf (mit Datums- und Revisionangabe) \ org.mycore (alle Klassen) \ xsl (alle Stylesheets) \ components | \ [component] | \ config (Konfigurationen / Templates) | | \ mycore.properties | | \ messages_de.properties | | \ messages_en.properties | \ web | | \ css | | \ images | | \ js | \ integrate.xml \ *.dtd | *.xsd (alle DTD- und XSD-Schema-Dateien) \ license.txt \ integrate.xml

Festlegungen

  • Die Dateien messages_xx.properties und mycore.properties werden erst durch die Anwendung abhängig von den verwendeten Komponenten zusammengefügt.
  • Bei Updates von einer Version zur nächsten ist es notwendig alte Libs (inkl der alten MyCoRe-Version) zu entfernen, dafuer ist ein eigenes ant-target ant resolve vorhanden.

Die Struktur des mycore-Verzeichnisses

Die Struktur des mycore-Verzeichnisses ergibt sich aus der Struktur der MyCoRe-JAR-Datei und der eines Maven-Projektes.

    

##################################################### # The component mycore.property file ##################################################### MCR.[component-name].propertyName = ...

Festlegungen für den Aufbau der Anwendung

  • Alle Anwendungsmodule sollten sich in ihrer Struktur an den Vorgaben für Komponenten orientieren.
  • Der Mechanismus zur Integration der Komponenten in die Anwendung wird über ANT Tasks und entsprechende Targets realisiert.
  • Die unten stehende Tabelle beschreibt die Integrationspunkte an Hand der öffentliche Targets, die eine Anwendung haben muss.
  • Komponenten muessen explizit ausgeschalten werden via MCR.Components.Exclude.
  • Die ImageViewer-Komponente ist ebenfalls per default aktiviert und prüft selbst, ob die entsprechenden Klassen verfügbar sind oder nicht.
  • Alle I18N Properties haben eine feste Namenskonvention (siehe oben). Zur Anpassung an ältere Codestände gibt es einen deprecated.properties Mechanismus, so dass die Umbenennung ohne zwingenden Migrationsaufwand machbar ist.
  • Alle I18N-Properties eines Modules haben den Namen modul.[modul-name].xxx
  • Alle Properties eines Modules haben den Namen MCR.[modul-name].xxx .
Target Beschreibung
clean Löscht die Programmdaten der Anwendung.
clean.data Löscht ALLE Daten der Anwendung.
clean.libs Löscht alle benutzten *.jar Archive aus der Anwendung.
create.class Initialisiert oder update der Klassifikationen.
create.default-rules Setzt die Standard-ACLs (ist in create.users enthalten).
create.jar Läd und erzeugt alle erforderlichen *.jar Dateien.
create.schema Erzeugt alle XML-Schema Dateien.
create.scripts Zusammensetzen der Konfigurationen und Zusammenbau aller für die Arbeit mit dem CLI wichtigen Teile.
create.searchmask Generiert eine Suchmaske.
create.users Initialisiert das Benutzersystem. (Nur einmal verwenden!)
create.war Erzeugt ein WAR-Archiv der Anwendung.
create.webapp Baut die Web-Anwendung zusammen.
info Listet allgemeine Informationen zum Build-Prozess.
javadoc Erzeugt Javadocs.
resolve Löscht alle Bibliotheken und installiert mittels Maven und der config/pom.xml alle neu
usage Listet öffentliche Targets (diese hier).
webservice.deploy Macht die WebServices bekannt.
webservice.undeploy Entfernt die WebServices.

Tabelle: Application integration targets

Target Beschreibung
init Initialisiert Build-Umgebung.
compile Compiliert alle Java-Programme.
config Kopiert wichtige Konfigurationen nach build/config.
i18n Zusammenfügen der Properties für einzelne Sprachen.
genkey Erzeugt die Signatur für Applets - wird implizit von create.webapp aufgerufen.
weitere Targest zur Unterstützung von SVN

Tabelle: Application internal targets

Antwendungs-Module als JAR-Datei

Anwendungsmodule können seit DocPortal 2.1 nicht nur im "modules"-Verzeichnis existieren, sondern auch als JAR-Datei eingebunden werden. Das geschieht über das "maven"-Modul, dass dafür in der mycore.private.properties Datei unter MCR.Modules.Application eingetragen werden muss.

Die Anwendungs-Module sind im Aufbau ähnlich den MyCoRe-Komponenten, d.h. sie enthalten alle Dateien die zur Build-Zeit und zur Laufzeit benötigt werden. Erkannt werden die JAR-Dateien an ihrem Manifest und Eigenschaft MCR-Application-Module, die den Namen des Moduls enthält. Über ant resolve werden alle Module unter build/modules entpackt. Dort werden aber nur die Verzeichnisse classifications, config und web entpackt.

    

application-module.jar \ META-INF \ \ Manifest.mf (mit Datums- und Revisionangabe) \ (alle Klassen) \ xsl (alle Stylesheets) \ classifications (evtl. Klassifikationen) \ config | \ [module] | \ mycore.properties | \ messages_de.properties | \ messages_en.properties | \ build.xml | \ build.properties \ web \ *.dtd | *.xsd (alle DTD- und XSD-Schema-Dateien)

Die build.xml wird nur benötigt, wenn die targets create.users, create.default-rules erweitert werden sollen oder wenn create.webapp zusätzlich zum einfachen Kopieren der Daten aus dem web-Verzeichnis noch Aktionen ausführen soll.

In build.properties können Properties definiert werden, die beim Einbinden von Kommandos und XSL-Dateien helfen:

internal.commands Kommaseparierte Liste von Kommandoklassen
xsl.include Kommaseparierte Liste von XSL-Dateien, die bei jeder Web-Seite eingebunden werden sollen

Ein großer Unterschied zu Modulen im moduldes-Verzeichnis ist, dass bei der JAR-Datei kein Build-Prozess mehr laufen muss, sondern nur noch ein Integrationsprozess, weswegen Java-Class- und Schema-Dateien schon fertig erzeugt in der JAR-Datei liegen.

Beispiele für Anwendungsmodule, die mittels Maven erstellt werden, finden sie hier:

Das Datenmodell-Konzept allgemein

Das MyCoRe-Datenmodell kennt im seiner Grundkonzeption drei Komponenten. Zum einen gibt es Metadaten. Sie enthalten nur beschreibende Daten sowie ggf. strukturelle und organisatorische Informationen zu einem Datenobjekt. Dabei ist es nicht relevant, ob die Metadaten alleine stehen oder mit einem Anhang eines digitalen Objektes versehen werden sollen. Beispielsweise können Personendaten alleine existieren und die sie referenzierenden Dokumente besitzen noch zugeordnete digitale Objekte (Bilder, Dokumente, Videos usw.). Diese digitalen Objekte werden in MyCoRe als Derivate bezeichnet, da ein Objekt ggf. in mehreren Darstellungsvarianten an den selben Metadatensatz angebunden werden kann. Ein Derivat seinerseits besteht aus einem XML-Datensatz, welcher für den Im- und Export sowie die Präsentation der digitalen Objekte benötigt wird sowie den eigentlichen Daten in Form von Einzeldateien oder Dateibäumen. Im XML der Derivate wird zukünftig auch optional das METS-Format als Tag mit abgelegt. So wird eine direkte Nutzung von Bildbetrachtern wie dem DFG-Viewer einfach integrierbar sein. Die dritte Art von Daten stellen Klassifikationen (in Bibliothekskreisen auch als Normdateien bezeichnet) dar. Sie definieren Sammlungen feststehender Begriffe auf die seitens der anderen Metadaten referenziert werden kann.

Die Verknüpfung der Metadaten untereinander und zu den Klassifikationen erfolgt mittels einer einheitlichen ID. Für Klassifikationen kommt hierzu noch die Kategorie-ID. Der Syntax einer MyCoReID - im Programmiergebrauch die Klasse MCRObjectID - hat folgenden Syntax:

ProjectID_Type_Number

ProjectIDStringIt describes the special project type like MyProject, CollectionA or so.
TypeStringThis is the datamodel type like document, author, ... The types class and derivate ar fix.
NumberIntegerThis is the dataset number. It is a number as String and it is a good idea to use leading zeros like 00000001. In practices we use 8 digits.

Tabelle: Syntax of the MCRObjectID

Das Datenmodell ist durch seine Gestaltung in XML-Strukturen so angelegt, dass es leicht möglich ist, Informationen in mehreren Sprachen gemeinsam abzulegen. Hierfür wird konsequent eine Kodierung mit UTF-8 angewendet. Bei zunehmender Globalisierung ist die Mehrsprachigkeit für viele Projekte zwingend erforderlich. Auch die Klassifikationen können mehrsprachig gespeichert werden.

Datenmodell-Graphik

Das Vererbungsmodell

In MyCoRe ist innerhalb des Datenmodells für die Metadaten die Möglichkeit einer Vererbung vorgesehen. Diese ist fest in den Kern implementiert und wird ausschließlich durch die steuernden Metadaten des jeweiligen Datensatzes festgelegt. Das heißt, für eine Datenmodell-Definition (z.B. document) können Datensätze mit (Buch mit Kapiteln) und ohne (Dokument) nebeneinander eingestellt werden. Wichtig ist nur, dass die Vererbung nur innerhalb eines Datenmodells oder eines, welches die gleiche Struktur aufweist, jedoch andere Pflichtfelder hat, funktioniert. Vererbung zwischen Datenmodellen mit verschieden Metadaten ist ausgeschlossen.

Im Folgenden soll die Vererbung anhand der XML-Syntax zweier Metadaten-Objekte verdeutlicht werden. Beim Laden der Daten wird dann eine Eltern-Kind-Beziehung im System aufgebaut und abgespeichert.

Die beiden Datensätze (Abbildung 1.2 und 1.3) sollen folgendes Szenario widerspiegeln:

  • Der Titel soll für die Kind-Daten übernommen werden und durch diese um die Kapitelüberschriften ergänzt werden.
  • Die Autorendaten sind an alle Kinder zu vererben.
  • Der Umfang des Werkes ist je nach Stufe anzugeben, also für das gesamte Buch die Gesamtzahl der Seiten und für ein Kapitel die Anzahl dessen Seiten.
Metadaten-Objekt-Auszug

Abbildung 1.2: Auszug aus dem Metadaten-Objektes des Elternsatzes

Entscheidend für die Umsetzung sind folgende Dinge:

  • Das Attribut heritable sagt, ob ein Metadatum vererbbar (true) oder nicht (false) sein soll.
  • Das Attribut notinherit sagt, ob das Metadatum von dem Elterndatensatz nicht geerbt werden soll (true). Andernfalls wird geerbt (false).
  • Es muss erst der Elterndatensatz eingespielt werden. Anschließend können die Kinddatensätze der nächsten Vererbungsebene eingespielt werden. Enkeldatensätze folgen darauf, usw. Bitte beachten Sie das unbedingt beim Restore von Sicherungen in das System. MyCoRe ergänzt intern die Daten der Kind-Datensätze für die Suchanfragen um die geerbten Daten.
  • Das Attribut inherited ist per Default auf 0 gesetzt und beschreibt die Anzahl der geerbten Daten. Das Attribut wird vom System automatisch gesetzt. Kinder erhalten, wenn sie Daten geerbt haben, inherited=1 usw., je nach Stufe.
Metadatenobjekt-Auszug

Abbildung 1.3: Auszug aus dem Metadaten-Objektes des Kindsatzes

Die Ausgabe des Eltern-Datensatzes nach einer Query entspricht dem der Dateneingabe, lediglich im XML-structure-Teil wurde ein Verweis auf die Kinddaten eingetragen (siehe XML-Syntax im User Guide).

Metadaten-Objekt-Auszug

Abbildung 1.4: XML-Syntax eines Kind-Datensatzes als Query-Resultat

Die Abbildung 1.4 zeigt den Kind-Datensatz, wie er vom System nach einer erfolgreichen Anfrage im Resultats-Container zurückgegeben wird. Dabei ist deutlich die Funktionalität der MyCoRe-Vererbungsmechanismen zu erkennen.