Es muss nicht immer eine relationale Datenbank sein, um Inhalte persistieren zu können. JCR (derzeit ist nur 1.0 bzw. JSR 170 freigegeben) bietet eine viel reichhaltigere Datenhaltung an. In diesem Artikel wird eine Übersicht über die Fähigkeiten dieser Spezifikation gegeben. Zudem geht es darum, die Spezifikation im Zusammenhang mit der Anbindung an ein DMS und die daraus folgenden Vorteile darzustellen. Zu Beginn werden Philosophie und Ziele der JCR erklärt und einige Eigenschaften der JCR vorgestellt, die traditionelle Persistenz mit Datenbanken oder File-Systemen erweitern. Darauf folgend wird auf das Thema DMS und im Speziellen auf die neuen Möglichkeiten eingegangen, die ein DMS mit Implementierung der JCR hat.
JSR 170 (283) – Ziele der Spezifikation
Mit der Veröffentlichung des JSR 170 wurde eine uniformelle API, ein Interface für den Zugriff auf einen Content-Speicherort, bereitgestellt, die für Anwender herstellerunabhängig ist. Das heißt, das Austauschen von Verkäuferlösungen besteht nur im Austauschen von Bibliotheken, jedoch nicht für aufgerufene Repository-Methoden. Derzeit wird an Version 2.0 der Spezifikation (JSR 283) gearbeitet, die viele Veränderungen, wie die Verwaltung von Metainformationen, neue Benutzerrechte, Workspace- und Nodetype-Funktionalität, mit sich bringen soll und somit als Ablöser der JSR 170 gilt.
JCR-Philosophie
Die JCR-API definiert eine einfache hierarchische Struktur: Das Repository besteht aus einem bis mehreren Workspaces. Jedes Workspace hat eine Baumstruktur, die aus Nodes und Items besteht, ein Workspace hat also genau einen Root Node, an die andere Items angehängt werden können. Der Node-Baum kann eine beliebige Tiefe bzw. Breite haben. Ein Item kann sowohl Node als auch Property sein. Der Unterschied zwischen Nodes und Properties besteht darin, dass an ein Node Properties sowie weitere Nodes angefügt werden können, an eine Property jedoch nicht. Property und Node stehen immer in einer OneToOne-Beziehung. Ausschließlich Properties besitzen Inhalte: von kleinen Strings oder Numbers bis großen Dateien (Bilder, PDF-Dokumente etc.). Abhängig vom Zugriffslevel (Level I: Lesender Zugriff und Level II: Schreibender Zugriff) stellt das Repository vier Grundoperationen zur Verfügung: Lesen, Schreiben, Suchen und Löschen. Mit Listing 1 lässt sich diese grundlegende Funktionalität veranschaulichen.
Listing 1Repository repository = (Repository)InitialContext.lookup("repository");// Get a Credentials objectCredentials credentials = new SimpleCredentials("name", "***".toCharArray());// Get a SessionSession session = repository.login(credentials, "my_workspace");// Get the root nodeNode root = session.getRootNode();// Traverse to the node you wantNode nodeA = root.getNode("NodeA");// Retrieve a property of NodeAProperty property = nodeA.getProperty("property1");// Get the value of the propertyValue value = property.getValue();// Convert the value to the desired typeString stringValue = value.getString();// Add a child nodeNode nodeB = nodeA.addNode("nodeB");// Add a propertynodeB.setProperty("property1", "Property String");// Persist the changessession.save();// Remove the node NodeA (and its subtree: NodeB)nodeA.remove();// Persist the changessession.save();
Als fortgeschrittene JSR-170-Features zur Verwaltung von Inhalten zählen Observation Management, Nodetype Management, Versionierung und Transaktionsverwaltung.




