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

rombert pushed a commit to annotated tag 
org.apache.sling.jcr.contentloader-2.0.4-incubator
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-contentloader.git

commit 32d477e34d2a40d3ce1e1ae8d497f973f0ece560
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Mon Jun 23 16:42:47 2008 +0000

    SLING-548: Refactor code and provide a mechanism to disable import 
providers.
    
    git-svn-id: 
https://svn.apache.org/repos/asf/incubator/sling/trunk/jcr/contentloader@670670 
13f79535-47bb-0310-9956-ffa450edef68
---
 .../jcr/contentloader/internal/ContentCreator.java |   2 +
 .../jcr/contentloader/internal/ContentLoader.java  |  57 +++++++++++-
 .../sling/jcr/contentloader/internal/Loader.java   | 103 ++++++++++-----------
 .../jcr/contentloader/internal/PathEntry.java      |  32 ++++---
 .../jcr/contentloader/internal/ZipReader.java      |  14 ++-
 5 files changed, 129 insertions(+), 79 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentCreator.java 
b/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentCreator.java
index 86b2476..4390f4e 100644
--- 
a/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentCreator.java
+++ 
b/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentCreator.java
@@ -25,6 +25,8 @@ import javax.jcr.RepositoryException;
 /**
  * The <code>ContentCreator</code>
  * is used by the {@link ContentReader} to create the actual content.
+ *
+ * @since 2.0.4
  */
 interface ContentCreator {
 
diff --git 
a/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentLoader.java 
b/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentLoader.java
index bb1827e..e89389c 100644
--- 
a/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentLoader.java
+++ 
b/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentLoader.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Stack;
@@ -38,6 +39,7 @@ import javax.jcr.ValueFactory;
 
 /**
  * The <code>ContentLoader</code> creates the nodes and properties.
+ * @since 2.0.4
  */
 public class ContentLoader implements ContentCreator {
 
@@ -62,21 +64,39 @@ public class ContentLoader implements ContentCreator {
 
     private final ContentLoaderService jcrContentHelper;
 
+    private Map<String, ImportProvider> importProviders;
+
     public ContentLoader(ContentLoaderService jcrContentHelper) {
         this.jcrContentHelper = jcrContentHelper;
     }
 
     /**
      * Initialize this component.
-     * If the defaultRootName is null, we are in ROOT_NODE import mode.
      * @param pathEntry
-     * @param parentNode
-     * @param defaultRootName
      */
     public void init(final PathEntry pathEntry,
-                     final Node parentNode,
-                     final String defaultRootName) {
+                     final Map<String, ImportProvider> defaultImportProviders) 
{
+
         this.configuration = pathEntry;
+        // create list of allowed import providers
+        this.importProviders = new HashMap<String, ImportProvider>();
+        final Iterator<Map.Entry<String, ImportProvider>> entryIter = 
defaultImportProviders.entrySet().iterator();
+        while ( entryIter.hasNext() ) {
+            final Map.Entry<String, ImportProvider> current = entryIter.next();
+            if (!configuration.isIgnoredImportProvider(current.getKey()) ) {
+                importProviders.put(current.getKey(), current.getValue());
+            }
+        }
+    }
+
+    /**
+     *
+     * If the defaultRootName is null, we are in ROOT_NODE import mode.
+     * @param parentNode
+     * @param defaultRootName
+     */
+    public void prepareParsing(final Node parentNode,
+                               final String defaultRootName) {
         this.parentNodeStack.clear();
         this.parentNodeStack.push(parentNode);
         this.defaultRootName = defaultRootName;
@@ -105,6 +125,33 @@ public class ContentLoader implements ContentCreator {
         return this.rootNode;
     }
 
+    public Map<String, ImportProvider> getImportProviders() {
+        return this.importProviders;
+    }
+
+    public ImportProvider getImportProvider(String name) {
+        ImportProvider provider = null;
+        final Iterator<String> ipIter = importProviders.keySet().iterator();
+        while (provider == null && ipIter.hasNext()) {
+            final String ext = ipIter.next();
+            if (name.endsWith(ext)) {
+                provider = importProviders.get(ext);
+            }
+        }
+        return provider;
+    }
+
+    public String getImportProviderExtension(String name) {
+        String providerExt = null;
+        final Iterator<String> ipIter = importProviders.keySet().iterator();
+        while (providerExt == null && ipIter.hasNext()) {
+            final String ext = ipIter.next();
+            if (name.endsWith(ext)) {
+                providerExt = ext;
+            }
+        }
+        return providerExt;
+    }
 
     /**
      * @see 
org.apache.sling.jcr.contentloader.internal.ContentCreator#createNode(java.lang.String,
 java.lang.String, java.lang.String[])
diff --git 
a/src/main/java/org/apache/sling/jcr/contentloader/internal/Loader.java 
b/src/main/java/org/apache/sling/jcr/contentloader/internal/Loader.java
index ac58191..fa7c191 100644
--- a/src/main/java/org/apache/sling/jcr/contentloader/internal/Loader.java
+++ b/src/main/java/org/apache/sling/jcr/contentloader/internal/Loader.java
@@ -57,6 +57,10 @@ public class Loader {
 
     public static final String EXT_JSON = ".json";
 
+    public static final String EXT_JAR = ".jar";
+
+    public static final String EXT_ZIP = ".zip";
+
     public static final String ROOT_DESCRIPTOR = "/ROOT";
 
     /** default log */
@@ -64,7 +68,8 @@ public class Loader {
 
     private ContentLoaderService jcrContentHelper;
 
-    private Map<String, ImportProvider> importProviders;
+    /** All available import providers. */
+    private Map<String, ImportProvider> defaultImportProviders;
 
     private final ContentLoader contentCreator;
 
@@ -76,12 +81,12 @@ public class Loader {
         this.contentCreator = new ContentLoader(jcrContentHelper);
         this.delayedBundles = new LinkedList<Bundle>();
 
-        importProviders = new LinkedHashMap<String, ImportProvider>();
-        importProviders.put(EXT_JCR_XML, null);
-        importProviders.put(EXT_JSON, JsonReader.PROVIDER);
-        importProviders.put(EXT_XML, XmlReader.PROVIDER);
-        importProviders.put(".jar", ZipReader.JAR_PROVIDER);
-        importProviders.put(".zip", ZipReader.ZIP_PROVIDER);
+        defaultImportProviders = new LinkedHashMap<String, ImportProvider>();
+        defaultImportProviders.put(EXT_JCR_XML, null);
+        defaultImportProviders.put(EXT_JSON, JsonReader.PROVIDER);
+        defaultImportProviders.put(EXT_XML, XmlReader.PROVIDER);
+        defaultImportProviders.put(EXT_JAR, ZipReader.JAR_PROVIDER);
+        defaultImportProviders.put(EXT_ZIP, ZipReader.ZIP_PROVIDER);
     }
 
     public void dispose() {
@@ -90,7 +95,7 @@ public class Loader {
             delayedBundles = null;
         }
         jcrContentHelper = null;
-        importProviders.clear();
+        defaultImportProviders = null;
     }
 
     /**
@@ -290,11 +295,12 @@ public class Loader {
             log.info("install: No initial content entries at {}", path);
             return;
         }
+        //  init content creator
+        this.contentCreator.init(configuration, this.defaultImportProviders);
 
-        Map<URL, Node> processedEntries = new HashMap<URL, Node>();
-
+        final Map<URL, Node> processedEntries = new HashMap<URL, Node>();
         // potential root node import/extension
-        URL rootNodeDescriptor = importRootNode(parent.getSession(), bundle, 
path, configuration);
+        URL rootNodeDescriptor = importRootNode(parent.getSession(), bundle, 
path);
         if (rootNodeDescriptor != null) {
             processedEntries.put(rootNodeDescriptor,
                 parent.getSession().getRootNode());
@@ -310,7 +316,7 @@ public class Loader {
                 String name = getName(base);
 
                 URL nodeDescriptor = null;
-                for (String ext : importProviders.keySet()) {
+                for (String ext : 
this.contentCreator.getImportProviders().keySet()) {
                     nodeDescriptor = bundle.getEntry(base + ext);
                     if (nodeDescriptor != null) {
                         break;
@@ -325,7 +331,7 @@ public class Loader {
                     node = processedEntries.get(nodeDescriptor);
                     if (node == null) {
                         node = createNode(parent, name, nodeDescriptor,
-                            configuration);
+                                          configuration);
                         processedEntries.put(nodeDescriptor, node);
                     }
                 } else {
@@ -347,14 +353,8 @@ public class Loader {
                 }
 
                 // install if it is a descriptor
-                boolean foundProvider = false;
-                final Iterator<String> ipIter = 
importProviders.keySet().iterator();
-                while (!foundProvider && ipIter.hasNext()) {
-                    final String ext = ipIter.next();
-                    if (entry.endsWith(ext)) {
-                        foundProvider = true;
-                    }
-                }
+                boolean foundProvider = 
this.contentCreator.getImportProvider(entry) != null;
+
                 if (foundProvider) {
                     Node node = null;
                     if ((node = createNode(parent, getName(entry), file, 
configuration)) != null) {
@@ -398,20 +398,18 @@ public class Loader {
             }
 
             // get the node reader for this resource
-            ContentReader nodeReader = null;
-            for (Map.Entry<String, ImportProvider> e : 
importProviders.entrySet()) {
-                if (resourcePath.endsWith(e.getKey())) {
-                    nodeReader = e.getValue().getReader();
-                    break;
-                }
+            final ImportProvider ip = 
this.contentCreator.getImportProvider(resourcePath);
+            if ( ip == null ) {
+                return null;
             }
+            final ContentReader nodeReader = ip.getReader();
 
             // cannot find out the type
             if (nodeReader == null) {
                 return null;
             }
 
-            this.contentCreator.init(configuration, parent, toPlainName(name));
+            this.contentCreator.prepareParsing(parent, toPlainName(name));
             ins = resourceUrl.openStream();
             nodeReader.parse(ins, this.contentCreator);
 
@@ -487,7 +485,8 @@ public class Loader {
             path = srcPath.substring(0, pos + 1) + name;
         }
 
-        this.contentCreator.init(configuration, parent, name);
+        this.contentCreator.init(configuration, defaultImportProviders);
+        this.contentCreator.prepareParsing(parent, name);
         final URLConnection conn = source.openConnection();
         final long lastModified = conn.getLastModified();
         final String type = conn.getContentType();
@@ -575,7 +574,7 @@ public class Loader {
                 if (entry.isUninstall()) {
                     Node targetNode = getTargetNode(session, 
entry.getTarget());
                     if (targetNode != null)
-                        uninstallFromPath(bundle, entry.getPath(), targetNode);
+                        uninstallFromPath(bundle, entry.getPath(), entry, 
targetNode);
                 } else {
                     log.debug(
                         "Ignoring to uninstall content at {}, uninstall 
directive is not set.",
@@ -611,15 +610,19 @@ public class Loader {
      * @param parent The parent node.
      * @throws RepositoryException
      */
-    private void uninstallFromPath(final Bundle bundle, final String path,
-            final Node parent) throws RepositoryException {
+    private void uninstallFromPath(final Bundle bundle,
+                                   final String path,
+                                   final PathEntry configuration,
+                                   final Node parent) throws 
RepositoryException {
         @SuppressWarnings("unchecked")
         Enumeration<String> entries = bundle.getEntryPaths(path);
         if (entries == null) {
             return;
         }
 
-        Set<URL> ignoreEntry = new HashSet<URL>();
+        this.contentCreator.init(configuration, defaultImportProviders);
+
+        final Set<URL> ignoreEntry = new HashSet<URL>();
 
         // potential root node import/extension
         Descriptor rootNodeDescriptor = getRootNodeDescriptor(bundle, path);
@@ -636,7 +639,7 @@ public class Loader {
                 String name = getName(base);
 
                 URL nodeDescriptor = null;
-                for (String ext : importProviders.keySet()) {
+                for (String ext : 
this.contentCreator.getImportProviders().keySet()) {
                     nodeDescriptor = bundle.getEntry(base + ext);
                     if (nodeDescriptor != null) {
                         break;
@@ -657,7 +660,7 @@ public class Loader {
 
                 if (node != null) {
                     // walk down the line
-                    uninstallFromPath(bundle, entry, node);
+                    uninstallFromPath(bundle, entry, configuration, node);
                 }
 
                 if (delete) {
@@ -674,14 +677,7 @@ public class Loader {
                 }
 
                 // uninstall if it is a descriptor
-                boolean foundProvider = false;
-                final Iterator<String> ipIter = 
importProviders.keySet().iterator();
-                while (!foundProvider && ipIter.hasNext()) {
-                    final String ext = ipIter.next();
-                    if (entry.endsWith(ext)) {
-                        foundProvider = true;
-                    }
-                }
+                boolean foundProvider = 
this.contentCreator.getImportProvider(entry) != null;
                 if (foundProvider) {
                     deleteNode(parent, toPlainName(getName(entry)));
                     ignoreEntry.add(file);
@@ -710,13 +706,15 @@ public class Loader {
      * @throws IOException If an IO error occurrs reading the XML file.
      */
     private Node importSystemView(Node parent, String name, URL nodeXML)
-            throws IOException {
+    throws IOException {
 
         InputStream ins = null;
         try {
 
             // check whether we have the content already, nothing to do then
-            name = toPlainName(name);
+            if ( name.endsWith(EXT_JCR_XML) ) {
+                name = name.substring(0, name.length() - EXT_JCR_XML.length());
+            }
             if (parent.hasNode(name)) {
                 log.debug(
                     "importSystemView: Node {} for XML {} already exists, 
nothing to to",
@@ -773,7 +771,7 @@ public class Loader {
                                              final String path) {
         URL rootNodeDescriptor = null;
 
-        for (Map.Entry<String, ImportProvider> e : importProviders.entrySet()) 
{
+        for (Map.Entry<String, ImportProvider> e : 
this.contentCreator.getImportProviders().entrySet()) {
             if (e.getValue() != null) {
                 rootNodeDescriptor = bundle.getEntry(path + ROOT_DESCRIPTOR
                     + e.getKey());
@@ -798,7 +796,7 @@ public class Loader {
      * Imports mixin nodes and properties (and optionally child nodes) of the
      * root node.
      */
-    private URL importRootNode(Session session, Bundle bundle, String path, 
PathEntry configuration)
+    private URL importRootNode(Session session, Bundle bundle, String path)
     throws RepositoryException {
         final Descriptor descriptor = getRootNodeDescriptor(bundle, path);
         // no root descriptor found
@@ -810,7 +808,7 @@ public class Loader {
         try {
 
             ins = descriptor.rootNodeDescriptor.openStream();
-            this.contentCreator.init(configuration, session.getRootNode(), 
null);
+            this.contentCreator.prepareParsing(session.getRootNode(), null);
             descriptor.nodeReader.parse(ins, this.contentCreator);
 
             return descriptor.rootNodeDescriptor;
@@ -830,14 +828,7 @@ public class Loader {
     }
 
     private String toPlainName(String name) {
-        String providerExt = null;
-        final Iterator<String> ipIter = importProviders.keySet().iterator();
-        while (providerExt == null && ipIter.hasNext()) {
-            final String ext = ipIter.next();
-            if (name.endsWith(ext)) {
-                providerExt = ext;
-            }
-        }
+        final String providerExt = 
this.contentCreator.getImportProviderExtension(name);
         if (providerExt != null) {
             return name.substring(0, name.length() - providerExt.length());
         }
diff --git 
a/src/main/java/org/apache/sling/jcr/contentloader/internal/PathEntry.java 
b/src/main/java/org/apache/sling/jcr/contentloader/internal/PathEntry.java
index 937462b..64213c5 100644
--- a/src/main/java/org/apache/sling/jcr/contentloader/internal/PathEntry.java
+++ b/src/main/java/org/apache/sling/jcr/contentloader/internal/PathEntry.java
@@ -21,6 +21,7 @@ package org.apache.sling.jcr.contentloader.internal;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.StringTokenizer;
 
 import org.apache.sling.commons.osgi.ManifestHeader;
 import org.osgi.framework.Bundle;
@@ -55,12 +56,12 @@ public class PathEntry {
     public static final String CHECKIN_DIRECTIVE = "checkin";
 
     /**
-     * The expand directive specifying whether the available {@link 
ImportProvider}s
-     * should be used during content loading. This is a boolean value that
-     * defaults to true.
+     * The ignore import providers directive specifying whether the available 
{@link ImportProvider}s
+     * should be used during content loading. This is a string value that 
defaults to the empty
+     * string..
      * @since 2.0.4
      */
-    public static final String EXPAND_DIRECTIVE = "expand";
+    public static final String IGNORE_IMPORT_PROVIDERS_DIRECTIVE = 
"ignoreImportProviders";
 
     /** The path for the initial content. */
     private final String path;
@@ -74,8 +75,8 @@ public class PathEntry {
     /** Should versionable nodes be checked in? */
     private final boolean checkin;
 
-    /** Should archives be expanded? @since 2.0.4 */
-    private final boolean expand;
+    /** Which import providers should be ignored? @since 2.0.4 */
+    private final List<String> ignoreImportProviders;
 
     /**
      * Target path where initial content will be loaded. If it´s null then
@@ -138,11 +139,13 @@ public class PathEntry {
         }
 
         // expand directive
-        final String expandValue = entry.getDirectiveValue(EXPAND_DIRECTIVE);
-        if ( expandValue != null ) {
-            this.expand = Boolean.valueOf(expandValue);
-        } else {
-            this.expand = true;
+        this.ignoreImportProviders = new ArrayList<String>();
+        final String expandValue = 
entry.getDirectiveValue(IGNORE_IMPORT_PROVIDERS_DIRECTIVE);
+        if ( expandValue != null && expandValue.length() > 0 ) {
+            final StringTokenizer st = new StringTokenizer(expandValue, ",");
+            while ( st.hasMoreTokens() ) {
+                this.ignoreImportProviders.add(st.nextToken());
+            }
         }
     }
 
@@ -162,8 +165,11 @@ public class PathEntry {
         return this.checkin;
     }
 
-    public boolean isExpand() {
-        return this.expand;
+    public boolean isIgnoredImportProvider(String extension) {
+        if ( extension.startsWith(".") ) {
+            extension = extension.substring(1);
+        }
+        return this.ignoreImportProviders.contains(extension);
     }
 
     public String getTarget() {
diff --git 
a/src/main/java/org/apache/sling/jcr/contentloader/internal/ZipReader.java 
b/src/main/java/org/apache/sling/jcr/contentloader/internal/ZipReader.java
index 70e661c..a47d5b8 100644
--- a/src/main/java/org/apache/sling/jcr/contentloader/internal/ZipReader.java
+++ b/src/main/java/org/apache/sling/jcr/contentloader/internal/ZipReader.java
@@ -29,10 +29,14 @@ import org.apache.commons.io.input.CloseShieldInputStream;
 
 
 /**
- * The <code>JsonReader</code> TODO
+ * The <code>ZipReader</code> TODO
+ *
+ * @since 2.0.4
  */
 class ZipReader implements ContentReader {
 
+    private static final String NT_FOLDER = "nt:folder";
+
     static final ImportProvider ZIP_PROVIDER = new ImportProvider() {
         private ZipReader zipReader;
 
@@ -56,10 +60,10 @@ class ZipReader implements ContentReader {
     };
 
     /** Is this a jar reader? */
-    private final boolean jarReader;
+    //private final boolean jarReader;
 
     public ZipReader(boolean jarReader) {
-        this.jarReader = jarReader;
+        //this.jarReader = jarReader;
     }
 
     /**
@@ -67,7 +71,7 @@ class ZipReader implements ContentReader {
      */
     public void parse(InputStream ins, ContentCreator creator)
     throws IOException, RepositoryException {
-        creator.createNode(null, "nt:folder", null);
+        creator.createNode(null, NT_FOLDER, null);
         final ZipInputStream zis = new ZipInputStream(ins);
         final InputStream dataIS = new CloseShieldInputStream(zis);
         ZipEntry entry;
@@ -78,7 +82,7 @@ class ZipReader implements ContentReader {
                     String name = entry.getName();
                     int pos = name.lastIndexOf('/');
                     if ( pos != -1 ) {
-                        creator.switchCurrentNode(name.substring(0, pos), 
"nt:folder");
+                        creator.switchCurrentNode(name.substring(0, pos), 
NT_FOLDER);
                     }
                     creator.createFileAndResourceNode(name, dataIS, null, 
entry.getTime());
                     creator.finishNode();

-- 
To stop receiving notification emails like this one, please contact
"[email protected]" <[email protected]>.

Reply via email to