{"id":72,"date":"2012-06-27T15:48:05","date_gmt":"2012-06-27T13:48:05","guid":{"rendered":"http:\/\/marko-seifert.de\/blog\/?p=72"},"modified":"2020-01-15T12:23:37","modified_gmt":"2020-01-15T10:23:37","slug":"open-source-content-management-mit-jackrabbit","status":"publish","type":"post","link":"http:\/\/marko-seifert.de\/blog\/?p=72","title":{"rendered":"Open Source Content Management mit JackRabbit"},"content":{"rendered":"<div>\n<h2>Java Content Repository (JCR)<\/h2>\n<p>Das Java Content Repository ist eine Spezifikation f\u00fcr den einheitlichen Zugriff auf Content , Struktur und Metadaten in einem Repository. Die JCR-Version 1.0 wurde unter <a href=\"http:\/\/jcp.org\/aboutJava\/communityprocess\/review\/jsr170\/index.html\">JSR 170<\/a> und die Version 2.0 unter <a href=\"http:\/\/jcp.org\/aboutJava\/communityprocess\/pr\/jsr283\/\">JSR 283<\/a> ver\u00f6ffentlicht.<br \/>\nDas Repository besteht aus einem oder mehreren Workspaces. Jeder dieser Workspaces enth\u00e4lt eine hierarchische Baumstruktur, die aus Items besteht. Ein Item kann sowohl Node als auch Property sein. Jeder Baum hat genau eine Root Node und kann eine beliebige Tiefe bzw. Breite haben. Eine Node kann Properties und weitere Nodes enthalten.<\/p>\n<p><a href=\"http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/jcr.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-75\" title=\"jcr\" src=\"http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/jcr-300x262.png\" alt=\"\" width=\"300\" height=\"262\" srcset=\"http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/jcr-300x262.png 300w, http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/jcr-342x300.png 342w, http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/jcr.png 553w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><!--more--><\/p>\n<h2>JackRabbit<\/h2>\n<p>JackRabbit ist die Open Source Referenzimplementierung des JCR-Standards von Apache. Im folgenden Beispiel ist der Zugriff aufs Repository dargestellt.<\/p>\n<pre>package de.communardo.jcr;\r\n\r\nimport java.io.IOException;\r\n\r\nimport javax.jcr.LoginException;\r\nimport javax.jcr.NoSuchWorkspaceException;\r\nimport javax.jcr.Node;\r\nimport javax.jcr.Repository;\r\nimport javax.jcr.RepositoryException;\r\nimport javax.jcr.Session;\r\nimport javax.jcr.SimpleCredentials;\r\n\r\nimport org.apache.jackrabbit.core.TransientRepository;\r\n\r\npublic class JCRTester {\r\n\r\n  public static void main(String[] args) throws LoginException, NoSuchWorkspaceException, RepositoryException, IOException {\r\n\r\n    Repository repository = new TransientRepository();\r\n    String user = \"admin\";\r\n    String password = \"admin\";\r\n\r\n    Session session = repository.login(new SimpleCredentials(user, password.toCharArray()), null);\r\n\r\n    Node root = session.getRootNode();\r\n    String primaryNodeTypeName = \"nt:folder\";\r\n    String relPath = \"test1\";\r\n    root.addNode(relPath, primaryNodeTypeName);\r\n    session.save();\r\n\r\n  }\r\n}<\/pre>\n<p>Mit dem <code>TransientRepository <\/code>wird auf ein Repository zugegriffen, welches seine Inhalte im Speicher h\u00e4lt. Mit Ende des Lebenszyklus der Referenz <code>repository <\/code>ist der Inhalt wieder verschwunden. Dieses Repository eignet sich gut f\u00fcr JUnit-Tests.<br \/>\nWenn eine JackRabbit-Instanz l\u00e4uft, kann man diese \u00fcber eine Instanz von <code>RMIRemoteRepository <\/code>ansprechen.<\/p>\n<pre>Repository repository = new RMIRemoteRepository(\"\/\/localhost:1099\/jackrabbit\");<\/pre>\n<p>Wenn der Programmcode erfolgreich gelaufen ist, existiert jetzt Repository ein Ordner \/test1. Dies kann man kontrollieren, indem am Repository per WebDAV anbindet. Nach dem Anmelden mit admin admin sieht man das Ergebnis.<\/p>\n<p><a href=\"http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/repository-webdav.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-76\" title=\"repository-webdav\" src=\"http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/repository-webdav.png\" alt=\"\" width=\"169\" height=\"101\" \/><\/a><br \/>\nMit dem freien Tool JCR-Explorer kann man noch etwas komfortabler mit dem Repository arbeiten. Man kann Knoten mit entsprechendem Typ anlegen, Properties editieren, komplette Teilb\u00e4ume verschieben oder kopieren und einiges mehr.<\/p>\n<p><a href=\"http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/jcr-explorer2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-74\" title=\"jcr-explorer2\" src=\"http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/jcr-explorer2.png\" alt=\"\" width=\"703\" height=\"314\" srcset=\"http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/jcr-explorer2.png 703w, http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/jcr-explorer2-300x133.png 300w, http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/jcr-explorer2-500x223.png 500w\" sizes=\"auto, (max-width: 703px) 100vw, 703px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Java Content Repository (JCR) Das Java Content Repository ist eine Spezifikation f\u00fcr den einheitlichen Zugriff auf Content , Struktur und Metadaten in einem Repository. Die JCR-Version 1.0 wurde unter JSR 170 und die Version 2.0 unter JSR 283 ver\u00f6ffentlicht. Das Repository besteht aus einem oder mehreren Workspaces. Jeder dieser Workspaces enth\u00e4lt eine hierarchische Baumstruktur, die aus Items besteht. Ein Item kann sowohl Node als auch Property sein. Jeder Baum hat genau eine Root Node und kann eine beliebige Tiefe bzw. Breite haben. Eine Node kann Properties und weitere Nodes enthalten.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16,11,4,19],"tags":[162,17,18,163,20,21],"class_list":["post-72","post","type-post","status-publish","format-standard","hentry","category-cms","category-development","category-java","category-jcr","tag-cms","tag-content-management","tag-java-content-repository","tag-jcr","tag-jsr-170","tag-jsr-283"],"_links":{"self":[{"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/72","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=72"}],"version-history":[{"count":6,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/72\/revisions"}],"predecessor-version":[{"id":333,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/72\/revisions\/333"}],"wp:attachment":[{"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=72"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=72"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=72"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}