You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by kw...@apache.org on 2020/11/27 09:22:05 UTC

[sling-org-apache-sling-jcr-webconsole] 01/01: SLING-9945 add CND printer

This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch feature/cnd-exporter
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-webconsole.git

commit d01af3cfa4cb1b76eda786bd0fcfc88187239473
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Fri Nov 27 10:21:51 2020 +0100

    SLING-9945 add CND printer
---
 pom.xml                                            |  5 ++
 .../sling/jcr/webconsole/internal/CndPrinter.java  | 74 ++++++++++++++++++++++
 2 files changed, 79 insertions(+)

diff --git a/pom.xml b/pom.xml
index 2bb4899..ca80d59 100644
--- a/pom.xml
+++ b/pom.xml
@@ -83,6 +83,11 @@
             <version>1.0.0</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>jackrabbit-jcr-commons</artifactId>
+            <version>2.14.0</version>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/src/main/java/org/apache/sling/jcr/webconsole/internal/CndPrinter.java b/src/main/java/org/apache/sling/jcr/webconsole/internal/CndPrinter.java
new file mode 100644
index 0000000..523d283
--- /dev/null
+++ b/src/main/java/org/apache/sling/jcr/webconsole/internal/CndPrinter.java
@@ -0,0 +1,74 @@
+/**
+ * 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.sling.jcr.webconsole.internal;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import javax.jcr.NamespaceRegistry;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.nodetype.NodeTypeIterator;
+
+import org.apache.felix.inventory.Format;
+import org.apache.felix.inventory.InventoryPrinter;
+import org.apache.jackrabbit.commons.cnd.CompactNodeTypeDefWriter;
+import org.apache.sling.jcr.api.SlingRepository;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+
+@Component(property = { InventoryPrinter.NAME + "=JCR CND", InventoryPrinter.FORMAT + "=TEXT",
+        InventoryPrinter.TITLE + "=JCR Compact Node Type and Name Space Definition Export" })
+public class CndPrinter implements InventoryPrinter {
+
+    @Reference
+    private SlingRepository slingRepository;
+
+    @Override
+    public void print(PrintWriter printWriter, Format format, boolean isZip) {
+        Session session = null;
+        try {
+            session = slingRepository.loginAdministrative(null);
+            final CompactNodeTypeDefWriter cnd = new CompactNodeTypeDefWriter(printWriter, session, true);
+            List<String> prefixes = Arrays.asList(session.getWorkspace().getNamespaceRegistry().getPrefixes());
+            Collections.sort(prefixes);
+            for (String prefix : prefixes) {
+                if (!prefix.equals(NamespaceRegistry.PREFIX_EMPTY)) {
+                    cnd.writeNamespaceDeclaration(prefix);
+                }
+            }
+            NodeTypeIterator ntIterator = session.getWorkspace().getNodeTypeManager().getAllNodeTypes();
+            while (ntIterator.hasNext()) {
+                cnd.write(ntIterator.nextNodeType());
+            }
+            cnd.close();
+        } catch (RepositoryException | IOException e) {
+            printWriter.println("Unable to output CND.");
+            e.printStackTrace(printWriter);
+        } finally {
+            if (session != null) {
+                session.logout();
+            }
+        }
+    }
+
+}