You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by re...@apache.org on 2015/04/14 15:13:04 UTC

[29/87] [abbrv] [partial] clerezza git commit: CLEREZZA-966: removed platform. prefix of folder names

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/documentation.viewer/pom.xml
----------------------------------------------------------------------
diff --git a/platform/documentation.viewer/pom.xml b/platform/documentation.viewer/pom.xml
new file mode 100644
index 0000000..1d9be7c
--- /dev/null
+++ b/platform/documentation.viewer/pom.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.clerezza</groupId>
+        <artifactId>clerezza</artifactId>
+        <version>0.5</version>
+        <relativePath>../parent</relativePath>
+    </parent>
+    <groupId>org.apache.clerezza</groupId>
+    <artifactId>platform.documentation.viewer</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+
+    <name>Clerezza - Platform Documentation Viewer</name>
+    <description>Presents the documentation of the Clerezza Platform
+    </description>
+    <dependencies>
+        <dependency>
+            <groupId>javax.ws.rs</groupId>
+            <artifactId>jsr311-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.clerezza</groupId>
+            <artifactId>rdf.utils</artifactId>
+            <version>0.14</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.clerezza</groupId>
+            <artifactId>platform.documentation</artifactId>
+            <version>0.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.clerezza</groupId>
+            <artifactId>jaxrs.utils</artifactId>
+            <version>0.9</version>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/documentation.viewer/src/main/java/org/apache/clerezza/platform/documentation/viewer/DocumentationViewer.java
----------------------------------------------------------------------
diff --git a/platform/documentation.viewer/src/main/java/org/apache/clerezza/platform/documentation/viewer/DocumentationViewer.java b/platform/documentation.viewer/src/main/java/org/apache/clerezza/platform/documentation/viewer/DocumentationViewer.java
new file mode 100644
index 0000000..32ad8d7
--- /dev/null
+++ b/platform/documentation.viewer/src/main/java/org/apache/clerezza/platform/documentation/viewer/DocumentationViewer.java
@@ -0,0 +1,238 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.platform.documentation.viewer;
+
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Stack;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import org.apache.clerezza.jaxrs.utils.TrailingSlash;
+import org.apache.clerezza.platform.documentation.DocumentationProvider;
+import org.apache.clerezza.rdf.core.BNode;
+import org.apache.clerezza.rdf.core.Graph;
+import org.apache.clerezza.rdf.core.LiteralFactory;
+import org.apache.clerezza.rdf.core.MGraph;
+import org.apache.clerezza.rdf.core.Triple;
+import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.access.TcManager;
+import org.apache.clerezza.rdf.core.impl.PlainLiteralImpl;
+import org.apache.clerezza.rdf.core.impl.SimpleMGraph;
+import org.apache.clerezza.rdf.core.impl.TripleImpl;
+import org.apache.clerezza.rdf.ontologies.DISCOBITS;
+import org.apache.clerezza.rdf.ontologies.RDF;
+import org.apache.clerezza.rdf.ontologies.DOCUMENTATION;
+import org.apache.clerezza.rdf.utils.GraphNode;
+import org.apache.clerezza.rdf.utils.UnionMGraph;
+
+/**
+ *
+ * The documentation viewer provides a webpage that shows the available
+ * documentation.
+ *
+ * @scr.component
+ * @scr.service interface="java.lang.Object"
+ * @scr.property name="javax.ws.rs" type="Boolean" value="true"
+ *
+ * @author mir
+ */
+@Path("/documentation")
+public class DocumentationViewer {
+
+    /**
+     * @scr.reference
+     */
+    private TcManager tcManager;
+        
+    /**
+     * Redirects to the overview page
+     *
+     * @return {@link Response}
+     *
+     */
+    @GET
+    public GraphNode documentationPage(@Context UriInfo uriInfo) {
+        TrailingSlash.enforcePresent(uriInfo);
+        Graph documentations = tcManager.getGraph(
+                DocumentationProvider.DOCUMENTATION_GRAPH_URI);        
+        Collection<DocumentationItem> docItems = getDocItems(documentations);        
+        List<DocumentationItem> sortedDocItems = sortDocItems(docItems);        
+        MGraph mGraph = new SimpleMGraph();
+        BNode orderedContent = createOrderedContent(sortedDocItems, mGraph);
+        BNode titledContent = createTitledContent(orderedContent, mGraph);
+        MGraph resultGraph = new UnionMGraph(mGraph, documentations);
+        GraphNode resultNode = new GraphNode(titledContent, resultGraph);
+        return resultNode;
+    }
+
+    private Collection<DocumentationItem> getDocItems(Graph documentations) {
+        Iterator<Triple> docs = documentations.filter(null, 
+                DOCUMENTATION.documentation, null);        
+
+        Map<UriRef,DocumentationItem> uri2docItemObj = 
+            new HashMap<UriRef,DocumentationItem>();
+        
+        while (docs.hasNext()) {
+            Triple docc = docs.next();
+            UriRef docItem = (UriRef) docc.getObject();
+            Iterator<Triple> afterDocItemsIter = documentations.filter(docItem,
+                DOCUMENTATION.after, null);
+            Set<UriRef> afterDocItems = new HashSet<UriRef>();
+            while (afterDocItemsIter.hasNext()) {
+                afterDocItems.add((UriRef) afterDocItemsIter.next().getObject());
+            }
+            DocumentationItem docItemObj = new DocumentationItem(
+                    docItem, afterDocItems, uri2docItemObj);
+            uri2docItemObj.put(docItem, docItemObj);
+        }        
+        return uri2docItemObj.values();
+    }
+
+    protected List<DocumentationItem> sortDocItems(
+        Collection<DocumentationItem> docItems) {
+        List<DocumentationItem> result = 
+                new ArrayList<DocumentationItem>();
+        Iterator<DocumentationItem> items = docItems.iterator();
+
+        OUTER: while (items.hasNext()) {
+            DocumentationItem item = items.next();
+            for (int i = 0; i < result.size(); i++ ) {
+                if (result.get(i).isAfer(item.documentationItem)) {
+                    result.add(i, item);
+                    continue OUTER;
+                }
+            }
+            result.add(item);
+        }
+        return result;
+    }
+
+    private BNode createOrderedContent(List<DocumentationItem> sortedDocItems,
+        MGraph mGraph) {
+        BNode orderedContent = new BNode();
+        mGraph.add(new TripleImpl(orderedContent, RDF.type, DISCOBITS.OrderedContent));
+        Integer pos = 0;
+        Iterator<DocumentationItem> docItemObjsIter = sortedDocItems.iterator();
+        while (docItemObjsIter.hasNext()) {
+            DocumentationItem docItemObj = docItemObjsIter.next();
+            BNode containedDoc = new BNode();
+            mGraph.add(new TripleImpl(orderedContent, DISCOBITS.contains,
+                    containedDoc));
+            mGraph.add(new TripleImpl(containedDoc, DISCOBITS.pos,
+                    new PlainLiteralImpl(pos.toString())));
+            mGraph.add(new TripleImpl(containedDoc, DISCOBITS.holds,
+                    docItemObj.documentationItem));
+            pos++;
+        }
+        return orderedContent;
+    }
+
+    private BNode createTitledContent(BNode orderedContent, MGraph mGraph) {
+        BNode titledContent = new BNode();
+        mGraph.add(new TripleImpl(titledContent, RDF.type, DISCOBITS.TitledContent));
+        BNode title = new BNode();
+        mGraph.add(new TripleImpl(title, DISCOBITS.pos, new PlainLiteralImpl("0")));
+        BNode titleXml = new BNode();
+        mGraph.add(new TripleImpl(titleXml, RDF.type, DISCOBITS.XHTMLInfoDiscoBit));
+        mGraph.add(new TripleImpl(titleXml, DISCOBITS.infoBit,
+                LiteralFactory.getInstance().createTypedLiteral("Documentation")));
+        mGraph.add(new TripleImpl(title, DISCOBITS.holds, titleXml));
+        mGraph.add(new TripleImpl(title, RDF.type, DISCOBITS.Entry));
+        mGraph.add(new TripleImpl(titledContent, DISCOBITS.contains, title));        
+        BNode content = new BNode();
+        mGraph.add(new TripleImpl(content, DISCOBITS.pos, new PlainLiteralImpl("1")));
+        mGraph.add(new TripleImpl(content, DISCOBITS.holds, orderedContent));
+        mGraph.add(new TripleImpl(content, RDF.type, DISCOBITS.Entry));
+        mGraph.add(new TripleImpl(titledContent, DISCOBITS.contains, content));        
+        return titledContent;
+    }
+
+    protected static class DocumentationItem {
+
+        private UriRef documentationItem;
+        private Set<UriRef> afterDocItems;
+        
+        private boolean transitiveAfterDocItemsAdded = false;
+        private Map<UriRef, DocumentationItem> uri2docItemObj;
+
+        DocumentationItem(UriRef doumentationItem, Set<UriRef> explicitAfterDocItems,
+            Map<UriRef, DocumentationItem> uri2docItemObj) {
+            this.documentationItem = doumentationItem;
+            this.afterDocItems = explicitAfterDocItems;
+            this.uri2docItemObj = uri2docItemObj;
+        }
+
+        public boolean isAfer(UriRef docItem) {
+            return getAfterDocItems().contains(docItem);
+        }
+        
+        private Set<UriRef> getAfterDocItems() {
+            Stack<DocumentationItem> stack = new Stack<DocumentationItem>();
+            stack.add(this);
+            return getAfterDocItems(stack);
+        }
+        
+        private Set<UriRef> getAfterDocItems(Stack<DocumentationItem> stack) {
+            if (!transitiveAfterDocItemsAdded) {
+                Iterator<UriRef> afterDocUrisIter = afterDocItems.iterator();
+                while (afterDocUrisIter.hasNext()) {
+                    UriRef uriRef = afterDocUrisIter.next();
+                    DocumentationItem docItem = uri2docItemObj.get(uriRef);
+                    if (stack.contains(docItem)) {
+                        throw new RuntimeException("Documentation: cycle detected!\n"
+                            + stack.toString());
+                    }
+                    stack.add(docItem);
+                    afterDocItems.addAll(docItem.getAfterDocItems(stack));
+                    
+                }
+                transitiveAfterDocItemsAdded = true;
+            }             
+            return afterDocItems;
+        }
+
+        @Override
+        public String toString() {
+            StringWriter writer = new StringWriter();
+            writer.append("[");
+            writer.append(documentationItem.getUnicodeString());
+            writer.append(" is after (");
+            Iterator<UriRef> afterDocs = afterDocItems.iterator();
+            while (afterDocs.hasNext()) {
+                UriRef uriRef = afterDocs.next();
+                writer.append(uriRef.getUnicodeString());
+                if (afterDocs.hasNext()) {
+                    writer.append(",");
+                }
+            }
+            writer.append(")]");
+            return writer.toString();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/documentation.viewer/src/main/resources/META-INF/documentation.nt
----------------------------------------------------------------------
diff --git a/platform/documentation.viewer/src/main/resources/META-INF/documentation.nt b/platform/documentation.viewer/src/main/resources/META-INF/documentation.nt
new file mode 100644
index 0000000..1a3a6f4
--- /dev/null
+++ b/platform/documentation.viewer/src/main/resources/META-INF/documentation.nt
@@ -0,0 +1,26 @@
+<bundle:///intro-content-el/0> <http://discobits.org/ontology#infoBit> "The documentation viewer provides access to the documentation (provided by the different modules) at <a xmlns=\"http://www.w3.org/1999/xhtml\" href=\"/documentation\">/documentation</a>."^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> .
+<bundle:///intro-content-el/0> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#XHTMLInfoDiscoBit> .
+<bundle:///intro-content-el/1> <http://discobits.org/ontology#infoBit> "The documentation is ordered so that the after properties http://clerezza.org/2009/08/documentation#after are satisfied. When the documentation is written with the discobits editor such a property is typically set by adding something like the folleowing in the RDF editing mode to the xml element representing the resource: &lt;after xmlns=\"http://clerezza.org/2009/08/documentation#\" rdf:resource=\"bundle://org.apache.clerezza.platform.content/discobits-editor\"/ /&gt;"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> .
+<bundle:///intro-content-el/1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#XHTMLInfoDiscoBit> .
+<bundle:///intro-content> <http://discobits.org/ontology#contains> _:1e27a3b4f21eada7ec61fd7c55f2bd221 . 
+<bundle:///intro-content> <http://discobits.org/ontology#contains> _:86e4309edd82a6d415338546caff2d551 . 
+<bundle:///intro-content> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#OrderedContent> .
+<bundle:///intro-title> <http://discobits.org/ontology#infoBit> "Documentation Viewer"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> .
+<bundle:///intro-title> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#XHTMLInfoDiscoBit> .
+<bundle:///intro> <http://clerezza.org/2009/08/documentation#after> <bundle://org.apache.clerezza.platform.content/discobits-editor> .
+<bundle:///intro> <http://clerezza.org/2009/08/documentation#after> <bundle://org.apache.clerezza.platform.documentation/intro> .
+<bundle:///intro> <http://discobits.org/ontology#contains> _:cc06f094ff0d735a332291b856b0d4ae1 . 
+<bundle:///intro> <http://discobits.org/ontology#contains> _:ccd6d577f99d82c53d5323fdbe4b6ba31 . 
+<bundle:///intro> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#TitledContent> .
+_:1e27a3b4f21eada7ec61fd7c55f2bd221 <http://discobits.org/ontology#holds> <bundle:///intro-content-el/0> . 
+_:1e27a3b4f21eada7ec61fd7c55f2bd221 <http://discobits.org/ontology#pos> "0" . 
+_:1e27a3b4f21eada7ec61fd7c55f2bd221 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#Entry> . 
+_:86e4309edd82a6d415338546caff2d551 <http://discobits.org/ontology#holds> <bundle:///intro-content-el/1> . 
+_:86e4309edd82a6d415338546caff2d551 <http://discobits.org/ontology#pos> "1" . 
+_:86e4309edd82a6d415338546caff2d551 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#Entry> . 
+_:cc06f094ff0d735a332291b856b0d4ae1 <http://discobits.org/ontology#holds> <bundle:///intro-content> . 
+_:cc06f094ff0d735a332291b856b0d4ae1 <http://discobits.org/ontology#pos> "1" . 
+_:cc06f094ff0d735a332291b856b0d4ae1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#Entry> . 
+_:ccd6d577f99d82c53d5323fdbe4b6ba31 <http://discobits.org/ontology#holds> <bundle:///intro-title> . 
+_:ccd6d577f99d82c53d5323fdbe4b6ba31 <http://discobits.org/ontology#pos> "0" . 
+_:ccd6d577f99d82c53d5323fdbe4b6ba31 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#Entry> . 

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/documentation.viewer/src/test/java/org/apache/clerezza/platform/documentation/viewer/SortTest.java
----------------------------------------------------------------------
diff --git a/platform/documentation.viewer/src/test/java/org/apache/clerezza/platform/documentation/viewer/SortTest.java b/platform/documentation.viewer/src/test/java/org/apache/clerezza/platform/documentation/viewer/SortTest.java
new file mode 100644
index 0000000..a980223
--- /dev/null
+++ b/platform/documentation.viewer/src/test/java/org/apache/clerezza/platform/documentation/viewer/SortTest.java
@@ -0,0 +1,143 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.platform.documentation.viewer;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.junit.Assert;
+import org.junit.Test;
+import org.apache.clerezza.rdf.core.UriRef;
+
+/**
+ *
+ * @author mir
+ */
+public class SortTest {
+
+    @Test
+    public void sortTest() {
+        DocumentationViewer docViewer = new DocumentationViewer();
+
+        Map<UriRef,DocumentationViewer.DocumentationItem> uri2docItemObj =
+            new HashMap<UriRef,DocumentationViewer.DocumentationItem>();
+        UriRef ref1 = new UriRef("ref1");
+        UriRef ref2 = new UriRef("ref2");
+        UriRef ref3 = new UriRef("ref3");
+        UriRef ref4 = new UriRef("ref4");
+        UriRef ref5 = new UriRef("ref5");
+
+        Set<UriRef> set1 = new HashSet<UriRef>();
+        DocumentationViewer.DocumentationItem a =
+            new DocumentationViewer.DocumentationItem(ref1, set1, uri2docItemObj);
+
+        Set<UriRef> set2 = new HashSet<UriRef>();
+        set2.add(ref1);
+        DocumentationViewer.DocumentationItem b =
+            new DocumentationViewer.DocumentationItem(ref2, set2, uri2docItemObj);
+
+        Set<UriRef> set3 = new HashSet<UriRef>();
+        set3.add(ref2);
+        DocumentationViewer.DocumentationItem c =
+            new DocumentationViewer.DocumentationItem(ref3, set3, uri2docItemObj);
+
+        Set<UriRef> set4 = new HashSet<UriRef>();
+        set4.add(ref3);
+        DocumentationViewer.DocumentationItem d =
+            new DocumentationViewer.DocumentationItem(ref4, set4, uri2docItemObj);
+
+        Set<UriRef> set5 = new HashSet<UriRef>();
+        set5.add(ref4);
+        DocumentationViewer.DocumentationItem e =
+            new DocumentationViewer.DocumentationItem(ref5, set5, uri2docItemObj);
+
+        uri2docItemObj.put(ref2, b);
+        uri2docItemObj.put(ref4, d);
+        uri2docItemObj.put(ref1, a);
+        uri2docItemObj.put(ref3, c);
+        uri2docItemObj.put(ref5, e);
+
+        List<DocumentationViewer.DocumentationItem> orderedList = 
+            docViewer.sortDocItems(uri2docItemObj.values());
+
+        Iterator<DocumentationViewer.DocumentationItem> iter =
+            orderedList.iterator();
+
+        Object[] expecteds =
+            new DocumentationViewer.DocumentationItem[5];
+
+        expecteds[0] = a;
+        expecteds[1] = b;
+        expecteds[2] = c;
+        expecteds[3] = d;
+        expecteds[4] = e;
+
+        Assert.assertArrayEquals(expecteds, orderedList.toArray());
+    }
+
+    @Test(expected=RuntimeException.class)
+    public void cycleTest() {
+        DocumentationViewer docViewer = new DocumentationViewer();
+
+        Map<UriRef,DocumentationViewer.DocumentationItem> uri2docItemObj =
+            new HashMap<UriRef,DocumentationViewer.DocumentationItem>();
+        UriRef ref1 = new UriRef("ref1");
+        UriRef ref2 = new UriRef("ref2");
+        UriRef ref3 = new UriRef("ref3");
+        UriRef ref4 = new UriRef("ref4");
+        UriRef ref5 = new UriRef("ref5");
+
+        Set<UriRef> set1 = new HashSet<UriRef>();
+        set1.add(ref5);
+        DocumentationViewer.DocumentationItem a =
+            new DocumentationViewer.DocumentationItem(ref1, set1, uri2docItemObj);
+
+        Set<UriRef> set2 = new HashSet<UriRef>();
+        set2.add(ref1);
+        DocumentationViewer.DocumentationItem b =
+            new DocumentationViewer.DocumentationItem(ref2, set2, uri2docItemObj);
+
+        Set<UriRef> set3 = new HashSet<UriRef>();
+        set3.add(ref2);
+        DocumentationViewer.DocumentationItem c =
+            new DocumentationViewer.DocumentationItem(ref3, set3, uri2docItemObj);
+
+        Set<UriRef> set4 = new HashSet<UriRef>();
+        set4.add(ref3);
+        DocumentationViewer.DocumentationItem d =
+            new DocumentationViewer.DocumentationItem(ref4, set4, uri2docItemObj);
+
+        Set<UriRef> set5 = new HashSet<UriRef>();
+        set5.add(ref4);
+        DocumentationViewer.DocumentationItem e =
+            new DocumentationViewer.DocumentationItem(ref5, set5, uri2docItemObj);
+
+        uri2docItemObj.put(ref2, b);
+        uri2docItemObj.put(ref4, d);
+        uri2docItemObj.put(ref1, a);
+        uri2docItemObj.put(ref3, c);
+        uri2docItemObj.put(ref5, e);
+        
+        List<DocumentationViewer.DocumentationItem> orderedList =
+            docViewer.sortDocItems(uri2docItemObj.values());
+    }
+}

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/documentation/LICENSE
----------------------------------------------------------------------
diff --git a/platform/documentation/LICENSE b/platform/documentation/LICENSE
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/platform/documentation/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/documentation/pom.xml
----------------------------------------------------------------------
diff --git a/platform/documentation/pom.xml b/platform/documentation/pom.xml
new file mode 100644
index 0000000..cd4b989
--- /dev/null
+++ b/platform/documentation/pom.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <artifactId>clerezza</artifactId>
+        <groupId>org.apache.clerezza</groupId>
+        <version>0.5</version>
+        <relativePath>../parent</relativePath>
+    </parent>
+    <groupId>org.apache.clerezza</groupId>
+    <artifactId>platform.documentation</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+    <name>Clerezza - Platform Documentation</name>
+    <description>Manages the documentation of the Clerezza Platform
+    </description>
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.ws.rs</groupId>
+            <artifactId>jsr311-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.clerezza</groupId>
+            <artifactId>rdf.utils</artifactId>
+            <version>0.14</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.clerezza</groupId>
+            <artifactId>platform.graphprovider.content</artifactId>
+            <version>0.7</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.clerezza</groupId>
+            <artifactId>platform.config</artifactId>
+            <version>0.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.scr.annotations</artifactId>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/documentation/src/main/java/org/apache/clerezza/platform/documentation/DocumentationInContentGraph.java
----------------------------------------------------------------------
diff --git a/platform/documentation/src/main/java/org/apache/clerezza/platform/documentation/DocumentationInContentGraph.java b/platform/documentation/src/main/java/org/apache/clerezza/platform/documentation/DocumentationInContentGraph.java
new file mode 100644
index 0000000..ad0ad8a
--- /dev/null
+++ b/platform/documentation/src/main/java/org/apache/clerezza/platform/documentation/DocumentationInContentGraph.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.platform.documentation;
+
+import org.osgi.service.component.ComponentContext;
+import org.apache.clerezza.platform.graphprovider.content.ContentGraphProvider;
+
+/**
+ * Registers the documentation graph as addition to the content graph
+ * 
+ * @scr.component
+ * 
+ * @author rbn, hasan
+ */
+public class DocumentationInContentGraph {
+
+
+    /**
+     * we have this dependency to make sure we get started after the documentatinProvider
+     *
+     * @scr.reference
+     */
+    private DocumentationProvider documentationProvider;
+
+    /**
+     * @scr.reference
+     */
+    private ContentGraphProvider cgProvider;
+
+    protected void activate(final ComponentContext componentContext) {
+        cgProvider.addTemporaryAdditionGraph(DocumentationProvider.DOCUMENTATION_GRAPH_URI);
+    }
+
+    protected void deactivate(final ComponentContext componentContext) {
+        cgProvider.removeTemporaryAdditionGraph(DocumentationProvider.DOCUMENTATION_GRAPH_URI);
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/documentation/src/main/java/org/apache/clerezza/platform/documentation/DocumentationProvider.java
----------------------------------------------------------------------
diff --git a/platform/documentation/src/main/java/org/apache/clerezza/platform/documentation/DocumentationProvider.java b/platform/documentation/src/main/java/org/apache/clerezza/platform/documentation/DocumentationProvider.java
new file mode 100644
index 0000000..3923a8b
--- /dev/null
+++ b/platform/documentation/src/main/java/org/apache/clerezza/platform/documentation/DocumentationProvider.java
@@ -0,0 +1,274 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.platform.documentation;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.felix.scr.annotations.Services;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleListener;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.clerezza.platform.config.PlatformConfig;
+import org.apache.clerezza.rdf.core.Graph;
+import org.apache.clerezza.rdf.core.MGraph;
+import org.apache.clerezza.rdf.core.NonLiteral;
+import org.apache.clerezza.rdf.core.Triple;
+import org.apache.clerezza.rdf.core.TripleCollection;
+import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.access.EntityAlreadyExistsException;
+import org.apache.clerezza.rdf.core.access.EntityUndeletableException;
+import org.apache.clerezza.rdf.core.access.NoSuchEntityException;
+import org.apache.clerezza.rdf.core.access.WeightedTcProvider;
+import org.apache.clerezza.rdf.core.impl.SimpleGraph;
+import org.apache.clerezza.rdf.core.impl.SimpleMGraph;
+import org.apache.clerezza.rdf.core.impl.TripleImpl;
+import org.apache.clerezza.rdf.core.serializedform.Parser;
+import org.apache.clerezza.rdf.core.serializedform.SupportedFormat;
+import org.apache.clerezza.rdf.ontologies.DISCOBITS;
+import org.apache.clerezza.rdf.ontologies.DOCUMENTATION;
+import org.apache.clerezza.rdf.ontologies.OSGI;
+import org.apache.clerezza.rdf.ontologies.RDF;
+import org.apache.clerezza.rdf.utils.UnionMGraph;
+
+/**
+ * The DocumentationProvider gathers the documentations of bundles and provides
+ * a graph containing all documentations.
+ * It is an implementation of <code>WeightedTcProvider</code> with the default
+ * weight 30. 
+ * @author mir, hasan
+ */
+@Component
+@Services({
+    @Service(WeightedTcProvider.class),
+    @Service(DocumentationProvider.class)})
+@Property(name="weight", intValue=30)
+
+public class DocumentationProvider implements WeightedTcProvider, BundleListener {
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * File path to the file containing the documentation of the bundle
+     */
+    private static final String DOCUMENTATION_FILE = "/META-INF/documentation.nt";
+
+    @Reference
+    private PlatformConfig config;
+    
+    @Reference
+    private Parser parser;
+
+    /**
+     * Contains the map between bundles and their documentation-graph
+     */
+    private Map<Bundle, MGraph> bundle2DocGraphMap = new HashMap<Bundle, MGraph>();
+
+    /**
+     * UnionGraph which contains all documenation-graphs of the registered
+     * bundles
+     */
+    private Graph unitedDocumentations;
+
+    /**
+     * The URI of the graph containing the documentations
+     */
+    public static final UriRef DOCUMENTATION_GRAPH_URI =
+            new UriRef("urn:x-localinstance:/documentation.graph");
+
+    private int weight = 30;    
+
+    @Override
+    public int getWeight() {
+        return weight;
+    }
+
+    @Override
+    public Graph getGraph(UriRef name) throws NoSuchEntityException {
+        if (name.equals(DOCUMENTATION_GRAPH_URI)) {
+            return unitedDocumentations;
+        }
+        throw new NoSuchEntityException(name);
+    }
+
+    @Override
+    public MGraph getMGraph(UriRef name) throws NoSuchEntityException {
+        throw new NoSuchEntityException(name);
+    }
+
+    @Override
+    public TripleCollection getTriples(UriRef name) throws NoSuchEntityException {
+        return getGraph(name);
+    }
+
+    @Override
+    public Set<UriRef> listGraphs() {
+        return Collections.singleton(DOCUMENTATION_GRAPH_URI);
+    }
+
+    @Override
+    public Set<UriRef> listMGraphs() {
+        return new HashSet<UriRef>();
+    }
+
+    @Override
+    public Set<UriRef> listTripleCollections() {
+        return Collections.singleton(DOCUMENTATION_GRAPH_URI);
+    }
+
+    @Override
+    public MGraph createMGraph(UriRef name)
+            throws UnsupportedOperationException, EntityAlreadyExistsException {
+        throw new UnsupportedOperationException("Not supported.");
+    }
+
+    @Override
+    public Graph createGraph(UriRef name, TripleCollection triples)
+            throws UnsupportedOperationException, EntityAlreadyExistsException {
+        throw new UnsupportedOperationException("Not supported.");
+    }
+
+    @Override
+    public void deleteTripleCollection(UriRef name)
+            throws UnsupportedOperationException, NoSuchEntityException,
+            EntityUndeletableException {
+        throw new UnsupportedOperationException("Not supported.");
+    }
+
+    @Override
+    public Set<UriRef> getNames(Graph graph) {
+        final HashSet<UriRef> result = new HashSet<UriRef>();
+        if (unitedDocumentations.equals(graph)) {
+            result.add(DOCUMENTATION_GRAPH_URI);
+        }
+        return result;
+    }
+
+    @Override
+    public void bundleChanged(BundleEvent event) {
+        Bundle bundle = event.getBundle();
+        switch (event.getType()) {
+            case BundleEvent.STARTED:
+                registerDocumentation(bundle);
+                break;
+            case BundleEvent.STOPPED:
+                unregisterDocumentation(bundle);
+                break;
+        }
+        createUnionGraph();
+    }
+
+    protected void activate(final ComponentContext componentContext) {
+        componentContext.getBundleContext().addBundleListener(this);
+        weight = (Integer) componentContext.getProperties().get("weight");
+        registerExistingDocumentations(componentContext);
+        createUnionGraph();
+    }
+
+    protected void deactivate(final ComponentContext componentContext) {
+        componentContext.getBundleContext().removeBundleListener(this);
+    }    
+
+    private void registerExistingDocumentations(ComponentContext componentContext) {
+        Bundle[] bundles = componentContext.getBundleContext().getBundles();
+        for (Bundle bundle : bundles) {
+            if (bundle.getState() == Bundle.ACTIVE) {
+                registerDocumentation(bundle);
+            }
+        }
+    }
+
+    private void registerDocumentation(Bundle bundle) {
+        URL entry = bundle.getEntry(DOCUMENTATION_FILE);
+        if (entry == null) {
+            return;
+        }
+        MGraph docMGraph = getDocumentationMGraph(entry, bundle.getSymbolicName());
+        addAdditionalTriples(bundle, docMGraph);
+        bundle2DocGraphMap.put(bundle, docMGraph);
+        logger.info("Registered documentation of bundle: {}",
+                bundle.getSymbolicName());
+    }
+
+    private MGraph getDocumentationMGraph(URL docUrl, String symbolicName) {
+        try {
+            Graph parsedGraph = parser.parse(docUrl.openStream(),
+                    SupportedFormat.N_TRIPLE);
+            UriRef baseUri = config.getDefaultBaseUri();
+            return new SimpleMGraph(new UriMutatorIterator(
+                    parsedGraph.iterator(), baseUri.getUnicodeString(), symbolicName));
+        } catch (IOException ex) {
+            logger.warn("Cannot parse documentation at URL: {}", docUrl);
+            throw new RuntimeException(ex);
+        }
+    }
+
+    /**
+     * Adds triples that point from the bundle resource to its documentations.
+     *
+     * @param bundle
+     * @param docMGraph
+     */
+    private void addAdditionalTriples(Bundle bundle, MGraph docMGraph) {
+        UriRef bundleUri = new UriRef(bundle.getLocation());
+        Triple triple = new TripleImpl(bundleUri, RDF.type, OSGI.Bundle);
+        docMGraph.add(triple);
+        Iterator<Triple> titledContents = docMGraph.filter(null, RDF.type,
+                DISCOBITS.TitledContent);
+        Set<Triple> newTriples = new HashSet<Triple>();
+        for (Iterator<Triple> it = titledContents; it.hasNext();) {
+            NonLiteral titledContent = it.next().getSubject();
+            if (docMGraph.filter(null, DISCOBITS.holds, titledContent).hasNext()) {
+                continue;
+            }
+            triple = new TripleImpl(bundleUri, DOCUMENTATION.documentation,
+                    titledContent);
+            newTriples.add(triple);
+        }
+        docMGraph.addAll(newTriples);
+    }
+
+    private void unregisterDocumentation(Bundle bundle) {
+        bundle2DocGraphMap.remove(bundle);
+        logger.info("Unregistered documentation of bundle: {}",
+                bundle.getSymbolicName());
+    }
+
+    private void createUnionGraph() {
+        MGraph[] docGraphs = bundle2DocGraphMap.values().
+                toArray(new MGraph[bundle2DocGraphMap.size()]);
+        if (docGraphs.length > 0) {
+            unitedDocumentations = new SimpleGraph(new UnionMGraph(docGraphs), true);
+        } else {
+            unitedDocumentations = new SimpleGraph(new SimpleMGraph(), true);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/documentation/src/main/java/org/apache/clerezza/platform/documentation/UriMutatorIterator.java
----------------------------------------------------------------------
diff --git a/platform/documentation/src/main/java/org/apache/clerezza/platform/documentation/UriMutatorIterator.java b/platform/documentation/src/main/java/org/apache/clerezza/platform/documentation/UriMutatorIterator.java
new file mode 100644
index 0000000..c728a76
--- /dev/null
+++ b/platform/documentation/src/main/java/org/apache/clerezza/platform/documentation/UriMutatorIterator.java
@@ -0,0 +1,176 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.platform.documentation;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.Iterator;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.clerezza.rdf.core.NonLiteral;
+import org.apache.clerezza.rdf.core.Resource;
+import org.apache.clerezza.rdf.core.Triple;
+import org.apache.clerezza.rdf.core.TypedLiteral;
+import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.impl.TripleImpl;
+import org.apache.clerezza.rdf.core.impl.TypedLiteralImpl;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+/**
+ * Replaces the <code>BASE_URI_PLACEHOLDER</code> in the <code>UriRef</code>s 
+ * as well as in the XML Literal of the <code>Triple</code>s provided by the
+ * specified <code>Iterator</code>s with the specified base URI.
+ *
+ * @author mir, hasan
+ */
+public class UriMutatorIterator implements Iterator<Triple> {
+
+    public static final Logger logger = LoggerFactory.getLogger(UriMutatorIterator.class);
+
+    private DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+
+    public static final UriRef XML_LITERAL =
+            new UriRef("http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral");
+
+    public static final String BASE_URI_PLACEHOLDER = "bundle://";
+    private Iterator<Triple> wrapped;
+    private String baseUri;
+    /*
+     * The symbolic name of the bundle from which the documentation origins.
+     */
+    private String originBundleSymbName;
+
+    UriMutatorIterator(Iterator<Triple> wrapped, String baseUri,
+            String bundleSymbolicName) {
+        this.wrapped = wrapped;
+        this.baseUri = baseUri;
+        this.originBundleSymbName = bundleSymbolicName;
+    }
+
+    @Override
+    public boolean hasNext() {
+        return wrapped.hasNext();
+    }
+
+    @Override
+    public Triple next() {
+        Triple triple = wrapped.next();
+
+        NonLiteral subject = triple.getSubject();
+        if (subject instanceof UriRef) {
+            subject = replacePlaceHolder((UriRef) subject);
+        }
+        UriRef predicate = replacePlaceHolder(triple.getPredicate());
+
+        Resource object = triple.getObject();
+        if (object instanceof UriRef) {
+            object = replacePlaceHolder((UriRef) object);
+        } else if (object instanceof TypedLiteral) {
+            TypedLiteral literal = (TypedLiteral) object;
+            if (literal.getDataType().equals(XML_LITERAL)) {
+                object = replacePlaceHolderInUrl(literal);
+            }
+        }
+        return new TripleImpl(subject, predicate, object);
+    }
+
+    @Override
+    public void remove() {
+        throw new UnsupportedOperationException("Not supported.");
+    }
+
+    private UriRef replacePlaceHolder(UriRef uriRef) {
+        String orig = uriRef.getUnicodeString();
+        if (orig.startsWith(BASE_URI_PLACEHOLDER)) {
+            int nextSlash = orig.indexOf("/", BASE_URI_PLACEHOLDER.length());
+            String bundleSymbolicName;
+            if (nextSlash != BASE_URI_PLACEHOLDER.length()) {
+                bundleSymbolicName = orig.subSequence(
+                        BASE_URI_PLACEHOLDER.length(), nextSlash).toString();
+            } else {
+                bundleSymbolicName = originBundleSymbName;
+            }
+            return new UriRef(baseUri + "bundle-doc/" + bundleSymbolicName +
+                    orig.substring(nextSlash));
+        }
+        return uriRef;
+    }
+
+    private TypedLiteral replacePlaceHolderInUrl(TypedLiteral xmlLiteral) {
+        final String tagName = "infoBit";
+        final String openingTag = "<" + tagName + ">";
+        final String closingTag = "</" + tagName + ">";
+        String text = openingTag + xmlLiteral.getLexicalForm() + closingTag;
+
+        InputStream styleSheet = getClass().getResourceAsStream("baseUriTransformation.xsl");
+        TransformerFactory transformerFactory = TransformerFactory.newInstance();
+        StreamSource styleSource = new StreamSource(styleSheet);
+        try {
+            Transformer transformer = transformerFactory.newTransformer(styleSource);
+
+            DocumentBuilder builder = factory.newDocumentBuilder();
+            Document document = builder.parse(new ByteArrayInputStream(text.getBytes("UTF-8")));
+            Source source = new DOMSource(document);
+
+            ByteArrayOutputStream baos = new ByteArrayOutputStream(text.length());
+            Result result = new StreamResult(baos);
+
+            transformer.setParameter("baseUri", baseUri);
+            transformer.setParameter("originBundleSymbolicName", originBundleSymbName);
+            transformer.transform(source, result);
+
+            String resultedText = baos.toString("UTF-8");
+            int startIdx = resultedText.indexOf(openingTag) + openingTag.length();
+            int endIdx = resultedText.lastIndexOf(closingTag);
+            return new TypedLiteralImpl(resultedText.substring(startIdx, endIdx),
+                    XML_LITERAL);
+        } catch (SAXException se) {
+            logger.warn("SAXException {} while transforming xml literal: {}",
+                    se.getMessage(), text);
+        } catch (ParserConfigurationException pce) {
+            logger.warn("ParserConfigurationException {} while transforming xml literal: {}",
+                    pce.getMessage(), text);
+        } catch (TransformerException te) {
+            logger.warn("TransformerException {} while transforming xml literal: {}",
+                    te.getMessage(), text);
+        } catch (UnsupportedEncodingException uee) {
+            logger.warn("UnsupportedEncodingException {} while transforming xml literal: {}",
+                    uee.getMessage(), text);
+        } catch (IOException ioe) {
+            logger.warn("IOException {} while transforming xml literal: {}",
+                    ioe.getMessage(), text);
+        }
+        return xmlLiteral;
+    }
+}

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/documentation/src/main/resources/META-INF/documentation.nt
----------------------------------------------------------------------
diff --git a/platform/documentation/src/main/resources/META-INF/documentation.nt b/platform/documentation/src/main/resources/META-INF/documentation.nt
new file mode 100644
index 0000000..3f473b5
--- /dev/null
+++ b/platform/documentation/src/main/resources/META-INF/documentation.nt
@@ -0,0 +1,47 @@
+<bundle:///intro-content-el/0> <http://discobits.org/ontology#infoBit> "Any bundle may provide some user documentation. This documentation is provided by a file named \"documentation.nt\" in the META-INF directory of the bundle-jar. This file can provide multiple documentation resources described using the discobits ontology. The resources have UriRefs starting with \"bundle:///\", this will be replaced with http://&lt;hostname&gt;/bundle-doc/&lt;Bundle-SymbolicName&gt; by the documentation aggregator which provides the graph urn:x-localinstance:/documentation.graph containing the documentation of all installed bundles. To reference a documentation entry from another bundle the bundle-uri can contain a Borundle-SymbolicName after the second slash, e.g. bundle://org.apache.clerezza.platform.content/intro."^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> .
+<bundle:///intro-content-el/0> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#XHTMLInfoDiscoBit> .
+<bundle:///intro-content-el/1> <http://discobits.org/ontology#infoBit> "By convention any bundle documentation provides a resource named bundle:///intro introducing the functionality of the bundle."^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> .
+<bundle:///intro-content-el/1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#XHTMLInfoDiscoBit> .
+<bundle:///intro-content-el/2-content-el/0> <http://discobits.org/ontology#infoBit> "The recommended way to create and edit the documentation of a bundle is as follows:<ul xmlns=\"http://www.w3.org/1999/xhtml\"><li>Launch clerezza (in the following we assume its running on localhost:8080)</li><li>Install and start the stable n-triples serialization provider (to make the stored files more suitable for version control) by entering on the commmand line: <code>start(\"mvn:org.apache.clerezza/rdf.stable.serializer\")</code></li>\n<li>Install and start the file storage provider(to access local rdf files as named graphs)  by entering on the commmand line: <code>start(\"mvn:org.apache.clerezza/rdf.file.storage\")</code><code></code></li><li>If it doesn't exist yet create an empty file src/main/resources/META-INF/documentation.nt in the project to be documented and </li><li>Open http://localhost:8080/tools/editor/, enter the file-uri of the previously created file as Graph and a bundle-uri (
 such as bundle:///intro) as resource</li><li>edit, save, ship your bundle</li></ul>"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> .
+<bundle:///intro-content-el/2-content-el/0> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#XHTMLInfoDiscoBit> .
+<bundle:///intro-content-el/2-content> <http://discobits.org/ontology#contains> _:dca98a68e3413be1e9bb3f4e56f5cc561 . 
+<bundle:///intro-content-el/2-content> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#OrderedContent> .
+<bundle:///intro-content-el/2-title> <http://discobits.org/ontology#infoBit> "Writing Documentation"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> .
+<bundle:///intro-content-el/2-title> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#XHTMLInfoDiscoBit> .
+<bundle:///intro-content-el/2> <http://discobits.org/ontology#contains> _:005cab2e8f532d75dbe6021467d5f7191 . 
+<bundle:///intro-content-el/2> <http://discobits.org/ontology#contains> _:3682407f1c90d02dcf9dbf4e83d964f51 . 
+<bundle:///intro-content-el/2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#TitledContent> .
+<bundle:///intro-content> <http://discobits.org/ontology#contains> _:0c33aa960ad81e72549c579dd55074231 . 
+<bundle:///intro-content> <http://discobits.org/ontology#contains> _:16fd3882eda078006a6b02abb28816da1 . 
+<bundle:///intro-content> <http://discobits.org/ontology#contains> _:da78c47eff7d6e6f75a17d01572cb4d81 . 
+<bundle:///intro-content> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#OrderedContent> .
+<bundle:///intro-title> <http://discobits.org/ontology#infoBit> "Platform Documentation Aggregator"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> .
+<bundle:///intro-title> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#XHTMLInfoDiscoBit> .
+<bundle:///intro> <bundle:///nullafter> <bundle://org.apache.clerezza.platform.content/discobits-editor> .
+<bundle:///intro> <http://discobits.org/ontology#contains> _:2d0db51a9a2a40d89460edf6544edbad1 . 
+<bundle:///intro> <http://discobits.org/ontology#contains> _:566a75916142ac411441d067f09a49f71 . 
+<bundle:///intro> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#TitledContent> .
+_:005cab2e8f532d75dbe6021467d5f7191 <http://discobits.org/ontology#holds> <bundle:///intro-content-el/2-content> . 
+_:005cab2e8f532d75dbe6021467d5f7191 <http://discobits.org/ontology#pos> "1" . 
+_:005cab2e8f532d75dbe6021467d5f7191 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#Entry> . 
+_:0c33aa960ad81e72549c579dd55074231 <http://discobits.org/ontology#holds> <bundle:///intro-content-el/2> . 
+_:0c33aa960ad81e72549c579dd55074231 <http://discobits.org/ontology#pos> "2" . 
+_:0c33aa960ad81e72549c579dd55074231 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#Entry> . 
+_:16fd3882eda078006a6b02abb28816da1 <http://discobits.org/ontology#holds> <bundle:///intro-content-el/0> . 
+_:16fd3882eda078006a6b02abb28816da1 <http://discobits.org/ontology#pos> "0" . 
+_:16fd3882eda078006a6b02abb28816da1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#Entry> . 
+_:2d0db51a9a2a40d89460edf6544edbad1 <http://discobits.org/ontology#holds> <bundle:///intro-title> . 
+_:2d0db51a9a2a40d89460edf6544edbad1 <http://discobits.org/ontology#pos> "0" . 
+_:2d0db51a9a2a40d89460edf6544edbad1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#Entry> . 
+_:3682407f1c90d02dcf9dbf4e83d964f51 <http://discobits.org/ontology#holds> <bundle:///intro-content-el/2-title> . 
+_:3682407f1c90d02dcf9dbf4e83d964f51 <http://discobits.org/ontology#pos> "0" . 
+_:3682407f1c90d02dcf9dbf4e83d964f51 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#Entry> . 
+_:566a75916142ac411441d067f09a49f71 <http://discobits.org/ontology#holds> <bundle:///intro-content> . 
+_:566a75916142ac411441d067f09a49f71 <http://discobits.org/ontology#pos> "1" . 
+_:566a75916142ac411441d067f09a49f71 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#Entry> . 
+_:da78c47eff7d6e6f75a17d01572cb4d81 <http://discobits.org/ontology#holds> <bundle:///intro-content-el/1> . 
+_:da78c47eff7d6e6f75a17d01572cb4d81 <http://discobits.org/ontology#pos> "1" . 
+_:da78c47eff7d6e6f75a17d01572cb4d81 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#Entry> . 
+_:dca98a68e3413be1e9bb3f4e56f5cc561 <http://discobits.org/ontology#holds> <bundle:///intro-content-el/2-content-el/0> . 
+_:dca98a68e3413be1e9bb3f4e56f5cc561 <http://discobits.org/ontology#pos> "0" . 
+_:dca98a68e3413be1e9bb3f4e56f5cc561 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://discobits.org/ontology#Entry> . 

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/documentation/src/main/resources/org/apache/clerezza/platform/documentation/baseUriTransformation.xsl
----------------------------------------------------------------------
diff --git a/platform/documentation/src/main/resources/org/apache/clerezza/platform/documentation/baseUriTransformation.xsl b/platform/documentation/src/main/resources/org/apache/clerezza/platform/documentation/baseUriTransformation.xsl
new file mode 100644
index 0000000..9767343
--- /dev/null
+++ b/platform/documentation/src/main/resources/org/apache/clerezza/platform/documentation/baseUriTransformation.xsl
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+	<xsl:param name="baseUri"/>
+	<xsl:param name="originBundleSymbolicName"/>
+	<xsl:template match="@*|node()">
+		<xsl:copy>
+			<xsl:apply-templates select="@*|node()"/>
+		</xsl:copy>
+	</xsl:template>
+
+	<xsl:template match="@href[parent::a]">
+		<xsl:attribute name="href">
+			<xsl:choose>
+				<xsl:when test="starts-with(.,'bundle:///')">
+					<xsl:value-of select="concat($baseUri,'bundle-doc/',$originBundleSymbolicName,substring-after(.,'bundle://'))"/>
+				</xsl:when>
+				<xsl:when test="starts-with(.,'bundle://')">
+					<xsl:value-of select="concat($baseUri,'bundle-doc/',substring-after(.,'bundle://'))"/>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:value-of select="."/>
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:attribute>
+	</xsl:template>
+</xsl:stylesheet>

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/documentation/src/test/java/org/apache/clerezza/platform/documentation/UriMutatorIteratorTest.java
----------------------------------------------------------------------
diff --git a/platform/documentation/src/test/java/org/apache/clerezza/platform/documentation/UriMutatorIteratorTest.java b/platform/documentation/src/test/java/org/apache/clerezza/platform/documentation/UriMutatorIteratorTest.java
new file mode 100644
index 0000000..652dd1c
--- /dev/null
+++ b/platform/documentation/src/test/java/org/apache/clerezza/platform/documentation/UriMutatorIteratorTest.java
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.clerezza.platform.documentation;
+
+import java.util.Iterator;
+import org.junit.Assert;
+import org.junit.Test;
+import org.apache.clerezza.rdf.core.Literal;
+import org.apache.clerezza.rdf.core.MGraph;
+import org.apache.clerezza.rdf.core.Triple;
+import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.impl.SimpleMGraph;
+import org.apache.clerezza.rdf.core.impl.TripleImpl;
+import org.apache.clerezza.rdf.core.impl.TypedLiteralImpl;
+
+/**
+ *
+ * @author mir
+ */
+public class UriMutatorIteratorTest {
+
+    private static final String HOST = "http://localhost:8282/";
+
+    private static String ORIGIN_BUNDLE_NAME = "my.symbolic.name";
+
+    private static String REFERENCED_BUNDLE_NAME = "your.symbolic.name";
+
+    @Test
+    public void testMutator() {
+        MGraph mGraph = new SimpleMGraph();
+        UriRef uriRef = new UriRef(UriMutatorIterator.BASE_URI_PLACEHOLDER +
+                REFERENCED_BUNDLE_NAME + "/bla#Test");
+        UriRef expectedUriRef = new UriRef(HOST + 
+                "bundle-doc/"+ REFERENCED_BUNDLE_NAME +"/bla#Test");
+        mGraph.add(new TripleImpl(uriRef, uriRef, uriRef));
+        Iterator<Triple> it = new UriMutatorIterator(mGraph.iterator(), HOST,
+                ORIGIN_BUNDLE_NAME);
+        Triple expectedTriple = new TripleImpl(expectedUriRef, expectedUriRef,
+                expectedUriRef);
+        Assert.assertEquals(expectedTriple, it.next());        
+    }
+
+    @Test
+    public void testMutatorNoSymbolicName() {
+        MGraph mGraph = new SimpleMGraph();
+        UriRef uriRef = new UriRef(UriMutatorIterator.BASE_URI_PLACEHOLDER +
+                "/bla#Test");
+        UriRef expectedUriRef = new UriRef(HOST +
+                "bundle-doc/"+ ORIGIN_BUNDLE_NAME +"/bla#Test");
+        mGraph.add(new TripleImpl(uriRef, uriRef, uriRef));
+        Iterator<Triple> it = new UriMutatorIterator(mGraph.iterator(), HOST,
+                ORIGIN_BUNDLE_NAME);
+        Triple expectedTriple = new TripleImpl(expectedUriRef, expectedUriRef,
+                expectedUriRef);
+        Assert.assertEquals(expectedTriple, it.next());
+    }
+
+    @Test
+    public void baseUriTransformation() {
+        MGraph mGraph = new SimpleMGraph();
+        String xml = "<a href=\"" + UriMutatorIterator.BASE_URI_PLACEHOLDER +
+            REFERENCED_BUNDLE_NAME + "/bla\"/>";
+        Literal literal = new TypedLiteralImpl(xml,
+                    UriMutatorIterator.XML_LITERAL);
+        String expectedXml = "<a href=\"" + HOST + 
+            "bundle-doc/"+ REFERENCED_BUNDLE_NAME +"/bla\"/>";
+        Literal expectedLiteral = new TypedLiteralImpl(expectedXml,
+                    UriMutatorIterator.XML_LITERAL);
+        UriRef uriRef = new UriRef("bla");
+            mGraph.add(new TripleImpl(uriRef, uriRef, literal));
+        Iterator<Triple> it = new UriMutatorIterator(mGraph.iterator(), HOST,
+                ORIGIN_BUNDLE_NAME);
+        Triple expectedTriple = new TripleImpl(uriRef, uriRef,
+                expectedLiteral);
+        Assert.assertEquals(expectedTriple, it.next());
+    }
+
+    @Test
+    public void baseUriTransformationNoSymbolicName() {
+        MGraph mGraph = new SimpleMGraph();
+        String xml = "<a href=\"" + UriMutatorIterator.BASE_URI_PLACEHOLDER +
+            "/bla\"/>";
+        Literal literal = new TypedLiteralImpl(xml,
+                    UriMutatorIterator.XML_LITERAL);
+        String expectedXml = "<a href=\"" + HOST +
+            "bundle-doc/"+ ORIGIN_BUNDLE_NAME +"/bla\"/>";
+        Literal expectedLiteral = new TypedLiteralImpl(expectedXml,
+                    UriMutatorIterator.XML_LITERAL);
+        UriRef uriRef = new UriRef("bla");
+            mGraph.add(new TripleImpl(uriRef, uriRef, literal));
+        Iterator<Triple> it = new UriMutatorIterator(mGraph.iterator(), HOST,
+                ORIGIN_BUNDLE_NAME);
+        Triple expectedTriple = new TripleImpl(uriRef, uriRef,
+                expectedLiteral);
+        Assert.assertEquals(expectedTriple, it.next());
+    }
+}

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/editor/LICENSE
----------------------------------------------------------------------
diff --git a/platform/editor/LICENSE b/platform/editor/LICENSE
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/platform/editor/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

http://git-wip-us.apache.org/repos/asf/clerezza/blob/70220239/platform/editor/nbactions.xml
----------------------------------------------------------------------
diff --git a/platform/editor/nbactions.xml b/platform/editor/nbactions.xml
new file mode 100644
index 0000000..9690e1a
--- /dev/null
+++ b/platform/editor/nbactions.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<actions>
+  <action>
+    <actionName>CUSTOM-deploy to localhost:8080</actionName>
+    <displayName>deploy to localhost:8080</displayName>
+    <goals>
+      <goal>install</goal>
+      <goal>org.apache.sling:maven-sling-plugin:install</goal>
+    </goals>
+  </action>
+</actions>