Commit 4a35e518 authored by co887baqi's avatar co887baqi

Add OCFL Metadata store

parent 4614f1c0
# AniHealth Installation
Die Anwendung AniHealth dient der Sammlung von digitalen Medien + Metadaten zu Tierkrankheiten. Die Basis für die Installation und Konfigurationen dieses Systems sollte eine Linux / UNIX System sein. Die Software sollte auch unter Windows laufen, die Funktionalität wurde aber dort nicht eingehend verifiziert. Als Betriebssystem-Shell wird /bin/bash angenommen. Getestet wurde diese Anleitung unter folgenden Bedingungen:
| Tool | Version |
| ------------- |-------------|
| Betriebssystem | openSUSE Leap 15.0, Ubuntu 18.04 |
| Java | OpenJDK version "11.x“ |
| Apache Maven | 3.6.0 |
| Apache Solr | 8.4.1 |
| PostgresSQL | 10.x |
| MyCoRe | LTS 2019.06 |
| dptbase | LTS 2019.06 |
**Wichtiger Hinweis: Sollten Sie ein System mit eingeschalteter Firewall betreiben, so müssen alle konfigurierten Ports, vor allem die für den Datei-Upload, entsprechend freigeschaltet sein.**
## Vorraussetzungen
Die aktuelle Java Version inklusive Developer Kit sollte installiert sein. Das Tool Apache Maven muss im Systempfad (z.B.: /usr/local/bin) eingebunden sein. Setzen Sie folgende Umgebungsvariablen (sinnvoller Weise gleich in Ihr Profile ~/.bashrc) entsprechend Ihres Zielsystems:
`export ANIHEALTH_HOME=$HOME/{workspace}/anihealth`
`export INSTALL_HOME=$ANIHEALTH_HOME`
## SQL-Datenbank
Für den Betrieb der Anwendung ist eine professionelle SQL-Datenbank erforderlich. Standardmäßig wird PostgreSQL unterstützt, aber auch andere Datenbankmanagementsysteme wie zum Beispiel DB2 oder MySQL sind denkbar, werden in diesem Beispiel aber nicht verwendet. Legen Sie die Datenbank mit der Zeichenkodierung UTF-8 an, um Umlaute oder auch fernöstliche Schriftzeichen nutzen zu können. Die Applikation erwartet den Zugang zu einer Datenbank `mymss-demoms` unter localhost (127.0.0.1).
### Nutzung von Postgresql 10.5 unter Ubuntu 18.04
Da nicht der Superuser postgres verwendet wird, muss ein neuer Datenbanknutzer inkl. eines Passworts angelegt werden. Diese Informationen sollten mit den Zugangsdaten in der Datei config/persistence.xml übereinstimmen. Mithilfe des Schalters -d kann der Nutzer Datenbanken anlegen.
`sudo -u postgres createuser -P -d NUTZERNAME`
Die eigentliche Datenbank für den entsprechenden Nutzer wird mit folgendem Befehl angelegt und sollte den Namen aus der persistence.xml haben.
`sudo -u postgres createdb -O NUTZERNAME mymss-demoms`
Standardmäßig wird die Datenbank mit der Zeichenkodierung UTF-8 angelegt. Gestartet wird PostGreSQL nun über die üblichen Start/Stop-Skripte:
`sudo /etc/init.d/postgresql (start|stop|reload|restart)`
___
## Einrichten eines Solr-Servers
Die aktuelle Version des Framesworks Apache Solr wird benötigt. Kontrollieren Sie im Anschluss daran, unter `http://localhost:8983/solr/#/` Ihre vorgenommenen Konfigurationen. Eine allgemeingültige Installationsanweisung für MyCoRe-Anwendungen finden Sie [hier](https://www.mycore.de/documentation/getting_started/gs_solr7/).
Erstellen Sie für die Solr-Anwendung einen eigenen Ordner (z.B. solr8), unter dem Sie wiederum die Ordner data und logs anlegen.
`mkdir -p ~/solr8/data`
`mkdir -p ~/solr8/logs`
Nun können Sie sich mit den folgenden Befehlen Solr8 in den Anwendungsordner solr laden und die tar-Datei entpacken. Die Anwendung ist nun im Ordner solr-8.4.1 zu finden.
`cd ~/solr8; wget http://www-eu.apache.org/dist/lucene/solr/8.4.1/solr-8.4.1.tgz`
`tar zxf solr-8.4.1.tgz`
Um Performance-Probleme zu vermeiden, folgen Sie nun bitte der Anleitung auf der [MyCoRe-Homepage](https://www.mycore.de/documentation/search/search_solr_use/), laden Sie die benötigten ConfigSets und starten Sie Solr.
Solr liefert für die weitere Installation bereits Beispielkonfigurationen mit. Unter solr-8.1.0/server/solr muss nun die Datei solr.xml in den bereits angelegten data Ordner kopiert werden. Für die entsprechenden MyCoRe-Anwendungen, wurden die Standardkonfigurationen von MyCoRe erweitert und müssen vom Leipziger Git-Server heruntergeladen werden:
`cd ~/solr8/solr-8.4.1/server/solr/configsets`
`git clone https://git.sc.uni-leipzig.de/mycore_applications/solr_core_templates/dptbase_solr_configset_main.git`
Solr starten: `~/solr8/solr-8.4.1/bin/solr start -s ~/solr8/data -p 8983 -m 2G -v -Dsolr.log.dir=~/solr8/logs`
Solr stopen: `~/solr8/solr-8.4.1/bin/solr stop`
Nun muss noch ein core angelegt werden. Der Name muss identisch mit der Beschreibung in den jeweiligen Anwendungskonfigurationen unter `{$DEMOMS_HOME}/config/mycore.private.properties` sein. Nach der Ausführung des Kommandos sollte im Ordner data der entsprechende Unterordner angelegt sein.
Core anlegen: `~/solr8/solr-8.4.1/bin/solr create -d dptbase_solr_configset_main -c {CORE_NAME}`
Core löschen: `~/solr8/solr-8.4.1/bin/solr delete -c {CORE_NAME}`
___
## Installation des Test-Systems
Wählen Sie vom Leipziger GitLab-Server das jeweilige Programmpaket und checken Sie diese aus.
Download der Anwendung AniHealth: `git checkout https://git.sc.uni-leipzig.de/mycore_applications/collection/anihealth.git`
**Alle weiteren Beschreibungen gehen immer davon aus, dass Sie sich nun im erstellten Verzeichnis der Anwendung befinden (siehe auch angelegte Umgebungsvariabele {$ANIHEALTH_HOME}!**
### Konfiguration des Systems
Im wesentlichen sind anfangs vier Konfigurationsdateien von Interesse, für die im config-Verzeichnis entsprechende Templates vorliegen. Diese können Sie kopieren und als Vorlage nehmen.
`cd config`
`cp log4j2.xml.template log4j2.xml`
`cp persistence.xml.template persistence.xml`
`cp pom.xml.template pom.xml`
`cp mycore.private.properties.template mycore.private.properties`
Bitte beachten Sie, dass diese Dateien bei einem Software-Update nicht mit überschrieben werden. Änderungen in den Templates müssen Sie per Hand nacharbeiten. Passen Sie die angegebenen Werte (vor allem Pfade) Ihrem aktuellen Systemstand an.
**log4j2.xml:** Legt den Log-Level fest, Standard ist DEBUG, andere Log-Level (z. B. Info) können Sie hier umschalten.
**persistence.xml:** Beschreibt die Datenbank-Anbindung. Hier muss die Datenbank-Connection entsprechend oben genannten Abschnitt angegeben werden.
**pom.xml:** Enthält die Abhängigkeiten anderer Bibliotheken. Hier ist der Pfad zu dem lokalen .m2-Verzeichnis anzugeben.
**mycore.private.properties:** Hier müssen die Pfade zu den entsprechenden Dateien und OCFL Verzeichnissen substituiert werden. Weiterhin ist der lokale Solr-Server auf Funktion zu überprüfen.
### Initialisieren des Systems
Nun können Sie das System initialisieren. Im Ergebnis dessen, sollten Sie ein vollständiges, betriebsbereites und leeres System haben. Führen Sie bitte folgende Schritte durch und prüfen Sie nach jedem den Erfolg Ihrer Arbeiten. Alle Ergebnisse des Build-Prozesses stehen in dem Verzeichnis build.
führt Build-Prozess aus: `ant resolve`
legt alle erforderlichen Arbeitsverzeichnisse an: `ant create.directories`
baut alle Commandline-Scripts: `ant create.scripts`
> Die folgenden Kommandos sind nur bei der Initialisierung oder bei Bedarf auszuführen.
> konfiguriert den Core mit der core_id main: `build/cli/bin/mycore.sh reload solr configuration main in core main`
> lädt alle Klassifikationen und initialisiert ggf. die Datenbank: `ant create.class`
> initalisiert das Benutzersystem: `ant create.users`
> lädt alle Klassifikationen: `ant create.default-rules`
erzeugt Ihnen Startup-Scripts für die Nutzung der Servlet-Engine Jetty: `ant create.jetty`
erzeugt schließlich die Web-Applikation: `ant create.webapp`
Jetzt sollten Sie bereits ein auf Kommandozeilen- und Web-Ebene arbeitsfähiges System haben. Bevor Sie die Anwendung starten, können Sie noch die Beispiel-Daten laden.
### Laden der Beispieldaten
Der Distribution wurde ein Skript zum Erzeugen von Testdaten hinzugefügt (`generateSamples.lua`). (`<MCR.savedir>` muss entsprechend ersetzt werden)
Zum Ausführen wird Lua benötigt. (Getestet wurde mit einer LuaVM in der Version 5.3)
```bash
cp generateSamples.lua `<MCR.savedir>`/generateSamples.lua
cd `<MCR.savedir>`
# Zum Anpassen der Anzahl an Objekten & Wahrscheinlichkeit eines Derivates mit Bild.
vi generateSamples.lua
mkdir ULBeeHealth_{anihealth,derivate}_Server
lua generateSamples.lua
```
Die hiermit erzeugten Testdaten können mit den folgenden Befehlen in die AniHealth-Anwendung geladen werden (`<MCR.savedir>` muss wieder entsprechend ersetzt werden):
```bash
./build/bin/mycore.sh delete all objects in topological order
./build/bin/mycore.sh load all objects in topological order from directory `<MCR.savedir>`/ULBeeHealth_anihealth_server/
./build/bin/mycore.sh load all derivates from directory `<MCR.savedir>`/ULBeeHealth_derivates_server/
```
## Start der WEB-Anwendung
Nachdem das System installiert ist, kann eine Servlet-Engine gestartet werden, welche die interaktive Anwendung verwaltet.
Vorher muss jedoch noch ein SSL-Key generiert werden. Dies geht mit
`mkdir -p $HOME/.mycore/anihealth`
`openssl rand 4096 > $HOME/.mycore/anihealth/jwt.secret`
Alle Daten der Anwendung werden per Default in `$HOME/.mycore/anihealth` abgelegt.
Für das Projekt wurde ein Server namens Jetty verwendet. Dieser liegt der Distribution bei. Starten Sie einfach das Script `build/cli/bin/jettystart.sh` . Anschließend können Sie mit einem Web-Browser auf die Anwendung zugreifen, indem Sie die URL bzw. das Property `MCR.baseurl` aus der Datei `config/mycore.private.properties` nutzen. Momentan ist dies:
`http://localhost:8611/`
Der Testnutzer heißt `administrator` mit dem MyCoRe-Default-Login `alleswirdgut`.
......@@ -46,7 +46,8 @@
<target name="resolve" description="resolve libraries" depends="clean, copy.pom">
<echo level="info">Resolve jars with maven</echo>
<exec executable="/usr/local/bin/mvn">
<exec executable="/usr/bin/env">
<arg value="mvn" />
<arg value="-f${stage-one.config}/pom.xml" />
<arg value="-Dbuild.directory=${build.cli}" />
<arg value="dependency:copy-dependencies" />
......
#!/usr/bin/env bash
set -e
set -o pipefail
printf "\e[4mPurging OCFL store contents\e[0m\n"
echo "In MyCoRe:"
./build/bin/mycore.sh delete all objects of type anihealth
printf " \e[4mDone\e[0m\n"
echo "In the FS:"
OCFL_REPOOPTION=$(grep 'MCR.Metadata.Store.OCFL.RepoDir=' config/mycore.private.properties)
if [ x"$OCFL_REPOOPTION" == x ]; then
echo " 'MCR.Metadata.Store.OCFL.RepoDir' not found in 'config/mycore.private.properties'!"
sh -c 'exit 1'
fi
OCFL_REPO=$(echo "$OCFL_REPOOPTION" | cut -d'=' -f2)
rm -rf "$OCFL_REPO"/*
printf " \e[4mDone\e[0m\n"
echo "Purging & rebuilding SOLR contents & database classifications"
echo "
DO \$\$ DECLARE
r RECORD;
BEGIN
FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP
EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
END LOOP;
END \$\$;
" | psql anihealth
ant create.default-rules create.users
./build/bin/mycore.sh reload solr configuration main in core main
sleep 1
./build/bin/mycore.sh clear solr index in core main
sleep 1
ant create.class
sleep 1
./build/bin/mycore.sh rebuild solr metadata and content index in core main
sleep 1
./build/bin/mycore.sh rebuild solr classification index in core main
printf " \e[4mDone\e[0m\n"
......@@ -50,11 +50,29 @@
# Metadata store: Global default configuration for all projects and object types
MCR.Metadata.Store.BaseDir=%MCR.datadir%/metadata
MCR.Module-iview2.DirectoryForTiles=%MCR.datadir%/iview2/tiles
# Metadata store implementation to use
MCR.Metadata.Store.DefaultClass=org.mycore.datamodel.ifs2.MCRMetadataStore
MCR.Metadata.Store.DefaultClass=org.mycore.datamodel.ifs2.MCROCFLVersioningMetadataStore
##############################################################################
# OCFL Parameters
##############################################################################
MCR.Module-iview2.DirectoryForTiles=%MCR.datadir%/iview2/tiles
# Directories for the OCFL metadata repo to store & build its contents
MCR.Metadata.Store.OCFL.RepoDir=%MCR.datadir%/ocfl/anihealth/repo
MCR.Metadata.Store.OCFL.WorkDir=%MCR.datadir%/ocfl/anihealth/work
# What class to use for the repository configuration
MCR.Metadata.Store.OCFL.RepoClass=org.mycore.datamodel.ocfl.MCROCFLDefaultRepo
# Whether deletions are delete-revisions or full object + versioning deletions
MCR.Metadata.Store.OCFLDeletionIsAbsolute=false
# Whether repo builder should create missing directories & initialize non-existent repositories on its own
# or bail if anything is amiss
MCR.Metadata.Store.OCFL.Opinionated=true
##############################################################################
# SOLR Parameter
......
......@@ -2,7 +2,7 @@
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>de.uni-leipzig.urz</groupId>
<artifactId>anihealth</artifactId>
<name>Animal Health Application</name>
......@@ -308,5 +308,15 @@
<artifactId>postgresql</artifactId>
<version>${postgres.version}</version>
</dependency>
<dependency>
<groupId>edu.wisc.library.ocfl</groupId>
<artifactId>ocfl-java-core</artifactId>
<version>${ocfl.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
</dependencies>
</project>
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -11,6 +11,16 @@ SAVE=`cat $INSTALL_HOME/build/cli/config/mycore.properties | grep -v '#' | grep
SAVEDIR=`echo "$SAVE"| cut -f2 -d= `
export SAVEDIR
METASTORE_CLASS_LINE=`cat $INSTALL_HOME/build/cli/config/mycore.properties | grep -v '#' | grep 'MCR.Metadata.Store.DefaultClass='`
METASTORE_CLASS=`echo "$METASTORE_CLASS_LINE" | cut -f2 -d= `
export METASTORE_CLASS
if [ "x$METASTORE_CLASS" == "xorg.mycore.datamodel.ifs2.MCROCFLVersioningMetadataStore" ]; then
OCFLREPO_LINE=`cat $INSTALL_HOME/build/cli/config/mycore.properties | grep -v '#' | grep 'MCR.Metadata.Store.OCFL.RepoDir='`
OCFLREPO_DIR=`echo "$OCFLREPO_LINE" | cut -f2 -d= `
export OCFLREPO_DIR
fi
#rm -Rf $SAVEDIR/*
mkdir -p $SAVEDIR
mkdir -p $SAVEDIR/BKBeeHealth_anihealth_Server
......
......@@ -11,6 +11,16 @@ SAVE=`cat $INSTALL_HOME/build/cli/config/mycore.properties | grep -v '#' | grep
SAVEDIR=`echo "$SAVE"| cut -f2 -d= `
export SAVEDIR
METASTORE_CLASS_LINE=`cat $INSTALL_HOME/build/cli/config/mycore.properties | grep -v '#' | grep 'MCR.Metadata.Store.DefaultClass='`
METASTORE_CLASS=`echo "$METASTORE_CLASS_LINE" | cut -f2 -d= `
export METASTORE_CLASS
if [ "x$METASTORE_CLASS" == "xorg.mycore.datamodel.ifs2.MCROCFLVersioningMetadataStore" ]; then
OCFLREPO_LINE=`cat $INSTALL_HOME/build/cli/config/mycore.properties | grep -v '#' | grep 'MCR.Metadata.Store.OCFL.RepoDir='`
OCFLREPO_DIR=`echo "$OCFLREPO_LINE" | cut -f2 -d= `
export OCFLREPO_DIR
fi
#rm -Rf $SAVEDIR/*
mkdir -p $SAVEDIR
mkdir -p $SAVEDIR/BerlinBeeHealth_anihealth_Server
......
......@@ -11,6 +11,16 @@ SAVE=`cat $INSTALL_HOME/build/cli/config/mycore.properties | grep -v '#' | grep
SAVEDIR=`echo "$SAVE"| cut -f2 -d= `
export SAVEDIR
METASTORE_CLASS_LINE=`cat $INSTALL_HOME/build/cli/config/mycore.properties | grep -v '#' | grep 'MCR.Metadata.Store.DefaultClass='`
METASTORE_CLASS=`echo "$METASTORE_CLASS_LINE" | cut -f2 -d= `
export METASTORE_CLASS
if [ "x$METASTORE_CLASS" == "xorg.mycore.datamodel.ifs2.MCROCFLVersioningMetadataStore" ]; then
OCFLREPO_LINE=`cat $INSTALL_HOME/build/cli/config/mycore.properties | grep -v '#' | grep 'MCR.Metadata.Store.OCFL.RepoDir='`
OCFLREPO_DIR=`echo "$OCFLREPO_LINE" | cut -f2 -d= `
export OCFLREPO_DIR
fi
#rm -Rf $SAVEDIR/*
mkdir -p $SAVEDIR
mkdir -p $SAVEDIR/HDHBeeHealth_anihealth_Server
......
#!/bin/bash
#
# list all saved objects from the server and from the workflow
#
PROJECT=$1
TYPE=$2
L=$3
DATA=`cat $INSTALL_HOME/build/cli/config/mycore.properties | grep -v '#' | grep 'MCR.Metadata.Store.BaseDir='`
DATADIR=`echo "$DATA"| cut -f2 -d= `
export DATADIR
DERIVATEBASE=`echo "$PROJECT" | awk '{printf("%s_derivate_",$1)}'`
DERIVATESERVER=`echo "$PROJECT" | awk '{printf("%s_derivate_Server",$1)}'`
OBJECTBASE=`echo "$PROJECT $TYPE" | awk '{printf("%s_%s_",$1,$2)}'`
OBJECTSERVER=`echo "$PROJECT $TYPE" | awk '{printf("%s_%s_Server",$1,$2)}'`
echo " " >> $L
cd $SAVEDIR
A=`ls $OBJECTSERVER|grep xml|wc|awk '{printf($1)}'`
if [ ! "x$METASTORE_CLASS" == "xorg.mycore.datamodel.ifs2.MCROCFLVersioningMetadataStore" ]; then
export B=`find $OCFLREPO_DIR -type f -name $OBJECTBASE*.xml|wc|awk '{printf($1)}'`
else
export B=$(find $OCFLREPO_DIR -type d -name "$OBJECTBASE*" | wc -l)
fi
echo "$OBJECTSERVER $A $B" | awk '{printf(" %-30.30s : in save %s in DB %s\n", $1,$2,$3)}' >> $L
cd $SAVEDIR
A=`ls $DERIVATESERVER|grep xml|wc|awk '{printf($1)}'`
if [ ! "x$METASTORE_CLASS" == "xorg.mycore.datamodel.ifs2.MCROCFLVersioningMetadataStore" ]; then
export B=`find $DATADIR/$PROJECT/derivate -name $DERIVATEBASE*.xml|wc|awk '{printf($1)}'`
else
export B=$(find $OCFLREPO_DIR -type d -name "$DERIVATEBASE*" | wc -l)
fi
echo "$DERIVATESERVER $A $B" | awk '{printf(" %-30.30s : in save %s in DB %s\n", $1,$2,$3)}' >> $L
echo " " >> $L
#!/bin/bash
#
# list all saved objects from the server and from the workflow
#
PROJECT=$1
TYPE=$2
L=$3
DATA=`cat $INSTALL_HOME/build/cli/config/mycore.properties | grep -v '#' | grep 'MCR.Metadata.Store.BaseDir='`
DATADIR=`echo "$DATA"| cut -f2 -d= `
export DATADIR
OBJECTBASE=`echo "$PROJECT $TYPE" | awk '{printf("%s_%s_",$1,$2)}'`
OBJECTSERVER=`echo "$PROJECT $TYPE" | awk '{printf("%s_%s_Server",$1,$2)}'`
echo " " >> $L
cd $SAVEDIR
A=`ls $OBJECTSERVER|grep xml|wc|awk '{printf($1)}'`
if [ ! "x$METASTORE_CLASS" == "xorg.mycore.datamodel.ifs2.MCROCFLVersioningMetadataStore" ]; then
export B=`find $OCFLREPO_DIR -type f -name $OBJECTBASE*.xml|wc|awk '{printf($1)}'`
else
export B=$(find $OCFLREPO_DIR -type d -name "$OBJECTBASE*" | wc -l)
fi
echo "$OBJECTSERVER $A $B" | awk '{printf(" %-30.30s : in save %s in DB %s\n", $1,$2,$3)}' >> $L
echo " " >> $L
......@@ -11,6 +11,16 @@ SAVE=`cat $INSTALL_HOME/build/cli/config/mycore.properties | grep -v '#' | grep
SAVEDIR=`echo "$SAVE"| cut -f2 -d= `
export SAVEDIR
METASTORE_CLASS_LINE=`cat $INSTALL_HOME/build/cli/config/mycore.properties | grep -v '#' | grep 'MCR.Metadata.Store.DefaultClass='`
METASTORE_CLASS=`echo "$METASTORE_CLASS_LINE" | cut -f2 -d= `
export METASTORE_CLASS
if [ "x$METASTORE_CLASS" == "xorg.mycore.datamodel.ifs2.MCROCFLVersioningMetadataStore" ]; then
OCFLREPO_LINE=`cat $INSTALL_HOME/build/cli/config/mycore.properties | grep -v '#' | grep 'MCR.Metadata.Store.OCFL.RepoDir='`
OCFLREPO_DIR=`echo "$OCFLREPO_LINE" | cut -f2 -d= `
export OCFLREPO_DIR
fi
#rm -Rf $SAVEDIR/*
mkdir -p $SAVEDIR
mkdir -p $SAVEDIR/ULBeeHealth_anihealth_Server
......
......@@ -680,6 +680,12 @@
<xsl:with-param name="staticURL" select="$staticURL" />
<xsl:with-param name="bold" select="true()" />
</xsl:call-template>
<!-- Versioning -->
<xsl:call-template name="printValueLineVersion">
<xsl:with-param name="nodes" select="." />
<xsl:with-param name="bold" select="true()" />
</xsl:call-template>
<!-- License -->
......
<?xml version="1.0" encoding="UTF-8"?>
<!-- =================================================================== -->
<!-- Inventory module build file for use with Apache Ant -->
<!-- Inventory module build file for use with Apache Ant -->
<!-- =================================================================== -->
<project name="MyCoReModule - Animal Health Core" basedir="../.." xmlns:mcr="antlib:org.mycore.buildtools">
......@@ -11,10 +11,11 @@
<property file="${stage-one.modules}/core/config/mycore.properties" />
<!-- =================================================================== -->
<!-- Create all XML schema files from the configuration file -->
<!-- Create all XML schema files from the configuration file -->
<!-- =================================================================== -->
<target name="create.schema" depends="init" description="Generates all schema files from the configuration files">
<target name="create.schema" depends="init"
description="Generates all schema files from the configuration files">
<echo level="info"> building ${ant.project.name} schemas </echo>
<copy todir="${build.cli.schema}">
<fileset dir="${stage-one}/modules/core/config" includes="MCRCondition.xsd" />
......@@ -22,16 +23,40 @@
</target>
<!-- =================================================================== -->
<!-- Create global configuration -->
<!-- Compiles all application classes -->
<!-- =================================================================== -->
<target name="javac" depends="init">
<echo>Compiling ${packages}</echo>
<path id="compile.classpath">
<fileset dir="${build.cli.lib}" includes="*.jar" />
<path refid="build.classpath" />
</path>
<javac srcdir="${stage-one.modules}/core/sources" destdir="${build.cli.classes}" includes="${packages}"
classpathref="compile.classpath" debug="${debug}" optimize="${optimize}" target="${javatarget}"
source="${sourcerelease}" encoding="${sourceencoding}" deprecation="${deprecation}">
</javac>
</target>
<target name="compile" description="Compiles all sources under the build directory">
<echo level="info"> compiling ${ant.project.name} classes </echo>
<antcall target="javac">
<param name="packages" value="org/mycore/**" />
</antcall>
</target>
<!-- =================================================================== -->
<!-- Create global configuration -->
<!-- =================================================================== -->
<target name="config" depends="init" description="Copy the configuration files">
<echo level="info"> copy ${ant.project.name} configuration </echo>
<mcr:config propertyfile="${build.cli.config}/mycore.properties" mergeFile="${stage-one}/modules/core/config/mycore.properties" />
<mcr:config propertyfile="${build.cli.config}/mycore.properties"
mergeFile="${stage-one}/modules/core/config/mycore.properties" />
</target>
<!-- =================================================================== -->
<!-- Create scripts in bin like mycore.cmd/.sh a.s.o. -->
<!-- Create scripts in bin like mycore.cmd/.sh a.s.o. -->
<!-- =================================================================== -->
<target name="create.scripts.unix">
......@@ -42,18 +67,18 @@
</target>
<!-- =================================================================== -->
<!-- Load all classifications -->
<!-- Load all classifications -->
<!-- =================================================================== -->
<target name="create.class" depends="init" description="Copy all classifications">
<target name="create.class" depends="init" description="Copy all classifications">
<echo level="info"> run ${ant.project.name} create.class </echo>
<copy todir="${build.content}/classifications" flatten="false" overwrite="true">
<fileset dir="${stage-one.modules}/core/content/classifications" includes="*.xml" />
</copy>
</target>
<!-- =================================================================== -->
<!-- Load default ACL rules -->
<!-- Load default ACL rules -->
<!-- =================================================================== -->
<target name="pre.create.default-rules" depends="init" description="Prepare default ACL rules">
<copy todir="${build.cli.config}" overwrite="true">
......@@ -79,17 +104,19 @@
</target>
<!-- =================================================================== -->
<!-- Integrate the I18N data -->
<!-- Integrate the I18N data -->
<!-- =================================================================== -->
<target name="i18n">
<echo> building ${ant.project.name} i18n </echo>
<copy file="${stage-one}/modules/core/config/messages_local_de.properties" tofile="${build.cli.config}/messages_de.properties" />
<copy file="${stage-one}/modules/core/config/messages_local_en.properties" tofile="${build.cli.config}/messages_en.properties" />
<copy file="${stage-one}/modules/core/config/messages_local_de.properties"
tofile="${build.cli.config}/messages_de.properties" />
<copy file="${stage-one}/modules/core/config/messages_local_en.properties"
tofile="${build.cli.config}/messages_en.properties" />
</target>
<!-- =================================================================== -->
<!-- Build the web application directory and copy webpages -->
<!-- Build the web application directory and copy webpages -->
<!-- =================================================================== -->
<target name="create.webapp" depends="init">
......@@ -105,6 +132,6 @@
</copy>
</target>
<!-- =================================================================== -->
<!-- =================================================================== -->
</project>
\ No newline at end of file
......@@ -9,6 +9,7 @@
MCR.EventHandler.MCRObject.016.Class=
MCR.EventHandler.MCRObject.017.Class=org.mycore.datamodel.common.MCRDptServiceFlagEventHandler
MCR.EventHandler.MCRObject.020.Class=org.mycore.datamodel.common.MCRXMLMetadataEventHandler
#MCR.EventHandler.MCRObject.021.Class=org.mycore.datamodel.common.MCROCFLMetadataEventHandler
MCR.EventHandler.MCRObject.030.Class=org.mycore.datamodel.common.MCRLinkTableEventHandler
MCR.EventHandler.MCRObject.040.Class=
MCR.EventHandler.MCRObject.060.Class=org.mycore.datamodel.metadata.history.MCRMetadataHistoryManager
......@@ -17,6 +18,7 @@
MCR.EventHandler.MCRDerivate.010.Class=org.mycore.access.MCRRemoveAclEventHandler
MCR.EventHandler.MCRDerivate.020.Class=org.mycore.datamodel.common.MCRXMLMetadataEventHandler
#MCR.EventHandler.MCRDerivate.021.Class=org.mycore.datamodel.common.MCROCFLMetadataEventHandler
MCR.EventHandler.MCRDerivate.050.Class=
MCR.EventHandler.MCRDerivate.070.Class=org.mycore.datamodel.metadata.history.MCRMetadataHistoryManager
MCR.EventHandler.MCRDerivate.100.Class=org.mycore.solr.index.MCRSolrIndexEventHandler
......
/*
* This file is part of *** M y C o R e ***
* See http://www.mycore.de/ for details.
*
* This program is free software; you can use it, redistribute it
* and / or modify it under the terms of the GNU General Public License
* (GPL) as published by the Free Software Foundation; either version 3
* of the License or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program, in a file called gpl.txt or license.txt.
* If not, write to the Free Software Foundation Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA
*/
package org.mycore.datamodel.common;
import java.io.InputStream;
import java.util.Locale;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.mycore.common.MCRException;
import org.mycore.common.MCRUsageException;
import org.mycore.common.content.MCRJDOMContent;
import org.mycore.common.events.MCREvent;
import org.mycore.common.events.MCREventHandlerBase;
import org.mycore.datamodel.metadata.MCRBase;
import org.mycore.datamodel.metadata.MCRDerivate;
import org.mycore.datamodel.metadata.MCRObject;
import edu.wisc.library.ocfl.api.OcflOption;
import edu.wisc.library.ocfl.api.OcflRepository;
import edu.wisc.library.ocfl.api.model.CommitInfo;
import edu.wisc.library.ocfl.api.model.ObjectVersionId;
/**
* This event handler stores MyCoRe object & derivate metadata in an OCFL
* repository.
*
* @author Christoph Neidahl (OPNA2608)
*/
public class MCROCFLMetadataEventHandler extends MCREventHandlerBase {
private static final Logger LOGGER = LogManager.getLogger();
@Override
protected final void handleObjectCreated(MCREvent evt, MCRObject obj) {
LOGGER.debug(evt.getEventType(), evt.getObjectType());
handleCreated((MCRBase) obj);
}
@Override
protected final void handleObjectUpdated(MCREvent evt, MCRObject obj) {
LOGGER.debug(evt.getEventType(), evt.getObjectType());
handleUpdated((MCRBase) obj);
}
@Override
protected void handleObjectDeleted(MCREvent evt, MCRObject obj) {
LOGGER.debug(evt.getEventType(), evt.getObjectType());
handleDeleted((MCRBase) obj);
}
@Override
protected void handleDerivateCreated(MCREvent evt, MCRDerivate der) {
LOGGER.debug(evt.getEventType(), evt.getObjectType());
handleCreated((MCRBase) der);
}
@Override
protected void handleDerivateUpdated(MCREvent evt, MCRDerivate der) {
LOGGER.debug(evt.getEventType(), evt.getObjectType());
handleUpdated((MCRBase) der);
}
@Override
protected void handleDerivateDeleted(MCREvent evt, MCRDerivate der) {
LOGGER.debug(evt.getEventType(), evt.getObjectType());
handleDeleted((MCRBase) der);
}
private static void handleCreated(MCRBase obj) {
OcflRepository repo = MCROCFLRepositoryHandler.instance().getRepository();
String objName = obj.getId().toString();
if (repo.containsObject(objName)) {
throw new MCRException("Refusing to recreate already existing object!");
}
try {
InputStream objectAsStream = new MCRJDOMContent(obj.createXML()).getInputStream();
repo.updateObject(ObjectVersionId.head(objName), new CommitInfo().setMessage(