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

cziegeler pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-contentloader.git


The following commit(s) were added to refs/heads/master by this push:
     new c6c87c8  SLING-11718 : Remove wrongly added file
c6c87c8 is described below

commit c6c87c820ccdce9a4e39fcac353067cd68ac09b5
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Sat Dec 10 09:57:25 2022 +0100

    SLING-11718 : Remove wrongly added file
---
 .../jcr/contentloader/it/BundleContentLoader.java  | 831 ---------------------
 1 file changed, 831 deletions(-)

diff --git 
a/src/test/java/org/apache/sling/jcr/contentloader/it/BundleContentLoader.java 
b/src/test/java/org/apache/sling/jcr/contentloader/it/BundleContentLoader.java
deleted file mode 100644
index 6167e62..0000000
--- 
a/src/test/java/org/apache/sling/jcr/contentloader/it/BundleContentLoader.java
+++ /dev/null
@@ -1,831 +0,0 @@
-/*
- * 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.contentloader.internal;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.URLDecoder;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.StringTokenizer;
-import java.util.function.Predicate;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
-import javax.jcr.Item;
-import javax.jcr.NoSuchWorkspaceException;
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.version.VersionManager;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.sling.jcr.contentloader.ContentReader;
-import org.apache.sling.jcr.contentloader.PathEntry;
-import org.osgi.framework.Bundle;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * The <code>BundleContentLoader</code> loads initial content from the bundle.
- */
-public class BundleContentLoader extends BaseImportLoader {
-
-    public static final String PARENT_DESCRIPTOR = "ROOT";
-
-    private final Logger log = 
LoggerFactory.getLogger(BundleContentLoader.class);
-
-    private BundleHelper bundleHelper;
-
-    // bundles whose registration failed and should be retried
-    private List<Bundle> delayedBundles;
-
-    private final Predicate<String> pathFilter;
-
-    public BundleContentLoader(BundleHelper bundleHelper, 
ContentReaderWhiteboard contentReaderWhiteboard,
-            BundleContentLoaderConfiguration configuration) {
-        super(contentReaderWhiteboard);
-        this.bundleHelper = bundleHelper;
-        this.delayedBundles = new LinkedList<>();
-
-        List<Pattern> includes = Arrays
-                
.stream(Optional.ofNullable(configuration).map(BundleContentLoaderConfiguration::includedTargets)
-                        .orElse(new String[0]))
-                
.filter(Objects::nonNull).map(Pattern::compile).collect(Collectors.toList());
-        List<Pattern> excludes = Arrays
-                
.stream(Optional.ofNullable(configuration).map(BundleContentLoaderConfiguration::excludedTargets)
-                        .orElse(new String[0]))
-                
.filter(Objects::nonNull).map(Pattern::compile).collect(Collectors.toList());
-        this.pathFilter = path -> {
-            if (configuration == null || path == null) {
-                return true;
-            } else {
-                return includes.stream().anyMatch(p -> 
p.matcher(path).matches())
-                        && excludes.stream().noneMatch(p -> 
p.matcher(path).matches());
-            }
-        };
-        log.debug("Using includes: {} and excludes: {}", includes, excludes);
-    }
-
-    public void dispose() {
-        if (delayedBundles != null) {
-            delayedBundles.clear();
-            delayedBundles = null;
-        }
-        bundleHelper = null;
-    }
-
-    /**
-     * Retry loading bundles that have previously been delayed 
-     * @param metadataSession the JCR Session for reading/writing metadata
-     */
-    public void retryDelayedBundles(final Session metadataSession) {
-        // handle delayed bundles, might help now
-        int currentSize = -1;
-        for (int i = delayedBundles.size(); i > 0 && currentSize != 
delayedBundles.size()
-                && !delayedBundles.isEmpty(); i--) {
-            for (Iterator<Bundle> di = delayedBundles.iterator(); 
di.hasNext();) {
-                Bundle delayed = di.next();
-                if (registerBundleInternal(metadataSession, delayed, true, 
false)) {
-                    di.remove();
-                }
-            }
-            currentSize = delayedBundles.size();
-        }
-    }
-
-    /**
-     * Register a bundle and install its content.
-     *
-     * @param metadataSession the JCR Session for reading/writing metadata
-     * @param bundle the bundle to install
-     */
-    public void registerBundle(final Session metadataSession, final Bundle 
bundle, final boolean isUpdate) {
-
-        // if this is an update, we have to uninstall the old content first
-        if (isUpdate) {
-            this.unregisterBundle(metadataSession, bundle);
-        }
-
-        log.debug("Registering bundle {} for content loading.", 
bundle.getSymbolicName());
-
-        if (registerBundleInternal(metadataSession, bundle, false, isUpdate)) {
-            retryDelayedBundles(metadataSession);
-        } else if (!isUpdate) {
-            // add to delayed bundles - if this is not an update!
-            delayedBundles.add(bundle);
-        }
-    }
-
-    private boolean registerBundleInternal(final Session metadataSession, 
final Bundle bundle, final boolean isRetry,
-            final boolean isUpdate) {
-
-        // check if bundle has initial content
-        final Iterator<PathEntry> pathIter = PathEntry.getContentPaths(bundle);
-        if (pathIter == null) {
-            log.debug("Bundle {} has no initial content", 
bundle.getSymbolicName());
-            return true;
-        }
-
-        try {
-            bundleHelper.createRepositoryPath(metadataSession, 
BundleContentLoaderListener.BUNDLE_CONTENT_NODE);
-
-            // check if the content has already been loaded
-            final Map<String, Object> bundleContentInfo = 
bundleHelper.getBundleContentInfo(metadataSession, bundle,
-                    true);
-
-            // if we don't get an info, someone else is currently loading
-            if (bundleContentInfo == null) {
-                return false;
-            }
-
-            boolean success = false;
-            List<String> createdNodes = null;
-            try {
-                final boolean contentAlreadyLoaded = ((Boolean) 
bundleContentInfo
-                        
.get(BundleContentLoaderListener.PROPERTY_CONTENT_LOADED)).booleanValue();
-                boolean isBundleUpdated = false;
-                Calendar lastLoadedAt = (Calendar) bundleContentInfo
-                        
.get(BundleContentLoaderListener.PROPERTY_CONTENT_LOADED_AT);
-                if (lastLoadedAt != null && lastLoadedAt.getTimeInMillis() < 
bundle.getLastModified()) {
-                    isBundleUpdated = true;
-                }
-                if (!isUpdate && !isBundleUpdated && contentAlreadyLoaded) {
-                    log.info("Content of bundle already loaded {}.", 
bundle.getSymbolicName());
-                } else {
-                    createdNodes = installContent(metadataSession, bundle, 
pathIter,
-                            contentAlreadyLoaded && !isBundleUpdated);
-                    if (isRetry) {
-                        // log success of retry
-                        log.info("Retrying to load initial content for bundle 
{} succeeded.", bundle.getSymbolicName());
-                    }
-                }
-
-                success = true;
-                return true;
-            } finally {
-                bundleHelper.unlockBundleContentInfo(metadataSession, bundle, 
success, createdNodes);
-            }
-
-        } catch (ContentReaderUnavailableException crue) {
-            // if we are retrying we already logged this message once, so we
-            // won't log it again
-            if (!isRetry) {
-                log.warn("Cannot load initial content for bundle {} : {}", 
bundle.getSymbolicName(), crue.getMessage());
-            }
-        } catch (RepositoryException re) {
-            // if we are retrying we already logged this message once, so we
-            // won't log it again
-            if (!isRetry) {
-                log.error(
-                        "Cannot load initial content for bundle " + 
bundle.getSymbolicName() + " : " + re.getMessage(),
-                        re);
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Unregister a bundle. Remove installed content.
-     *
-     * @param session the session to read/write the metadata
-     * @param bundle The bundle.
-     */
-    public void unregisterBundle(final Session session, final Bundle bundle) {
-
-        if (delayedBundles.contains(bundle)) {
-            delayedBundles.remove(bundle);
-        } else {
-            try {
-                bundleHelper.createRepositoryPath(session, 
BundleContentLoaderListener.BUNDLE_CONTENT_NODE);
-
-                final Map<String, Object> bundleContentInfo = 
bundleHelper.getBundleContentInfo(session, bundle, false);
-
-                // if we don't get an info, someone else is currently loading 
or unloading
-                // or the bundle is already uninstalled
-                if (bundleContentInfo == null) {
-                    return;
-                }
-
-                try {
-                    uninstallContent(session, bundle,
-                            (String[]) 
bundleContentInfo.get(BundleContentLoaderListener.PROPERTY_UNINSTALL_PATHS));
-                    bundleHelper.contentIsUninstalled(session, bundle);
-                } finally {
-                    bundleHelper.unlockBundleContentInfo(session, bundle, 
false, null);
-                }
-            } catch (RepositoryException re) {
-                log.error("Cannot remove initial content for bundle " + 
bundle.getSymbolicName() + " : "
-                        + re.getMessage(), re);
-            }
-        }
-    }
-
-    // ---------- internal 
-----------------------------------------------------
-
-    /**
-     * Install the content from the bundle.
-     *
-     * @return If the content should be removed on uninstall, a list of top 
nodes
-     */
-    private List<String> installContent(final Session defaultSession, final 
Bundle bundle,
-            final Iterator<PathEntry> pathIter, final boolean 
contentAlreadyLoaded) throws RepositoryException, 
ContentReaderUnavailableException {
-
-        final List<String> createdNodes = new ArrayList<>();
-        final Map<String, Session> createdSessions = new HashMap<>();
-
-        log.debug("Installing initial content from bundle {}", 
bundle.getSymbolicName());
-        final DefaultContentCreator contentCreator = new 
DefaultContentCreator(this.bundleHelper);
-        try {
-            while (pathIter.hasNext()) {
-                final PathEntry pathEntry = pathIter.next();
-
-                if (!pathFilter.test(pathEntry.getTarget())) {
-                    log.debug("Path {} excluded by configuration", 
pathEntry.getPath());
-                    continue;
-                }
-
-                if (pathEntry.isOverwrite() && (pathEntry.getTarget() == null 
|| "/".equals(pathEntry.getTarget()))) {
-                    log.error("Path {} tries to overwrite on the repository 
root level which is not allowed, only use overwrite with a dedicated path 
directive having any value but '/'", pathEntry.getPath());
-                    continue;
-                }
-                if (!contentAlreadyLoaded || pathEntry.isOverwrite()) {
-                    String workspace = pathEntry.getWorkspace();
-                    final Session targetSession;
-                    if (workspace != null) {
-                        if (createdSessions.containsKey(workspace)) {
-                            targetSession = createdSessions.get(workspace);
-                        } else {
-                            targetSession = createSession(workspace);
-                            createdSessions.put(workspace, targetSession);
-                        }
-                    } else {
-                        targetSession = defaultSession;
-                    }
-
-                    final Node targetNode = getTargetNode(targetSession, 
pathEntry.getTarget(), pathEntry.isOverwrite());
-
-                    if (targetNode != null) {
-                        installFromPath(bundle, pathEntry.getPath(), 
pathEntry, targetNode,
-                                pathEntry.isUninstall() ? createdNodes : null, 
contentCreator);
-                    }
-                }
-            }
-
-            // now optimize created nodes list
-            Collections.sort(createdNodes);
-            if (createdNodes.size() > 1) {
-                final Iterator<String> i = createdNodes.iterator();
-                String previous = i.next() + '/';
-                while (i.hasNext()) {
-                    final String current = i.next();
-                    if (current.startsWith(previous)) {
-                        i.remove();
-                    } else {
-                        previous = current + '/';
-                    }
-                }
-            }
-
-            // persist modifications now
-            defaultSession.refresh(true);
-            defaultSession.save();
-
-            for (Session session : createdSessions.values()) {
-                session.refresh(true);
-                session.save();
-            }
-
-            // finally check in versionable nodes
-            for (final Node versionable : contentCreator.getVersionables()) {
-                VersionManager versionManager = 
versionable.getSession().getWorkspace().getVersionManager();
-                versionManager.checkin(versionable.getPath());
-            }
-        } finally {
-            try {
-                if (defaultSession.hasPendingChanges()) {
-                    defaultSession.refresh(false);
-                }
-                for (Session session : createdSessions.values()) {
-                    if (session.hasPendingChanges()) {
-                        session.refresh(false);
-                    }
-                }
-            } catch (RepositoryException re) {
-                log.warn("Failure to rollback partial initial content for 
bundle {}", bundle.getSymbolicName(), re);
-            }
-            contentCreator.clear();
-            for (Session session : createdSessions.values()) {
-                session.logout();
-            }
-        }
-        log.debug("Done installing initial content from bundle {}", 
bundle.getSymbolicName());
-
-        return createdNodes;
-    }
-
-    /**
-     * Handle content installation for a single path.
-     *
-     * @param bundle        The bundle containing the content.
-     * @param path          The path
-     * @param configuration
-     * @param parent        The parent node.
-     * @param createdNodes  An optional list to store all new nodes. This list 
is
-     *                      used for an uninstall
-     * @throws RepositoryException
-     */
-    private void installFromPath(final Bundle bundle, final String path, final 
PathEntry configuration,
-            final Node parent, final List<String> createdNodes, final 
DefaultContentCreator contentCreator)
-            throws RepositoryException, ContentReaderUnavailableException {
-
-        // init content creator
-        contentCreator.init(configuration, getContentReaders(), createdNodes, 
null);
-
-        final Map<String, Node> processedEntries = new HashMap<>();
-
-        Enumeration<String> entries = bundle.getEntryPaths(path);
-        if (entries == null) {
-            // check for single content
-            final URL u = bundle.getEntry(path);
-            if (u == null) {
-                log.info("install: No initial content entries at {} in bundle 
{}", path, bundle.getSymbolicName());
-                return;
-            }
-            // we have a single file content -> this should replace the target 
node fully, i.e. parent is one level above
-            handleFile(path, bundle, processedEntries, configuration, 
parent.getParent(), createdNodes, contentCreator);
-            return;
-        }
-
-        // potential parent node import/extension
-        URL parentNodeDescriptor = importParentNode(bundle, path, parent, 
contentCreator);
-        if (parentNodeDescriptor != null) {
-            processedEntries.put(parentNodeDescriptor.toString(), parent);
-        }
-
-        while (entries.hasMoreElements()) {
-            final String entry = entries.nextElement();
-            log.debug("Processing initial content entry {} in bundle {}", 
entry, bundle.getSymbolicName());
-            if (entry.endsWith("/")) {
-
-                // dir, check for node descriptor, else create dir
-                final String base = entry.substring(0, entry.length() - 1);
-
-                URL nodeDescriptor = null;
-                for (String ext : contentCreator.getContentReaders().keySet()) 
{
-                    nodeDescriptor = bundle.getEntry(base + ext);
-                    if (nodeDescriptor != null) {
-                        break;
-                    }
-                }
-
-                // if we have a descriptor, which has not been processed yet,
-                // otherwise call createFolder, which creates an nt:folder or
-                // returns an existing node (created by a descriptor)
-                final String name = getName(base);
-                Node node = null;
-                if (nodeDescriptor != null) {
-                    node = processedEntries.get(nodeDescriptor.toString());
-                    if (node == null) {
-                        node = createNode(parent, name, nodeDescriptor, 
contentCreator, configuration);
-                        processedEntries.put(nodeDescriptor.toString(), node);
-                    }
-                } else {
-                    node = createFolder(parent, name, 
configuration.isOverwrite());
-                }
-
-                // walk down the line
-                if (node != null) {
-                    installFromPath(bundle, entry, configuration, node, 
createdNodes, contentCreator);
-                }
-
-            } else {
-                // file => create file
-                handleFile(entry, bundle, processedEntries, configuration, 
parent, createdNodes, contentCreator);
-            }
-        }
-    }
-
-    /**
-     * Handle a file entry.
-     *
-     * @param entry
-     * @param bundle
-     * @param processedEntries
-     * @param configuration
-     * @param parent
-     * @param createdNodes
-     * @throws RepositoryException
-     */
-    private void handleFile(final String entry, final Bundle bundle, final 
Map<String, Node> processedEntries,
-            final PathEntry configuration, final Node parent, final 
List<String> createdNodes,
-            final DefaultContentCreator contentCreator) throws 
RepositoryException, ContentReaderUnavailableException {
-
-        final URL file = bundle.getEntry(entry);
-        final String name = getName(entry);
-        try {
-            if (processedEntries.containsKey(file.toString())) {
-                // this is a consumed node descriptor
-                return;
-            }
-
-            // check for node descriptor
-            URL nodeDescriptor = null;
-            for (String ext : contentCreator.getContentReaders().keySet()) {
-                nodeDescriptor = bundle.getEntry(entry + ext);
-                if (nodeDescriptor != null) {
-                    break;
-                }
-            }
-
-            // install if it is a descriptor
-            boolean foundReader = getContentReader(entry, configuration) != 
null;
-
-            Node node = null;
-            if (foundReader) {
-                node = createNode(parent, name, file, contentCreator, 
configuration);
-                if (node != null) {
-                    log.debug("Created node as {} {}", node.getPath(), name);
-                    processedEntries.put(file.toString(), node);
-                } else {
-                    log.warn("No node created for file {} {}", file, name);
-                }
-            } else {
-                // if we require a ContentReader for this entry but didn't 
find one
-                //   then throw an exception to stop processing this bundle 
and put 
-                //   it into the delayedBundles list to retry later
-                if (configuration.isImportProviderRequired(name)) {
-                    throw new 
ContentReaderUnavailableException(String.format("Unable to locate a required 
content reader for entry %s", entry));
-                } else {
-                    log.debug("Can't find content reader for entry {} at {}", 
entry, name);
-                }
-            }
-
-            // otherwise just place as file
-            if (node == null) {
-                try {
-                    createFile(configuration, parent, file, createdNodes, 
contentCreator);
-                    node = parent.getNode(name);
-                } catch (IOException ioe) {
-                    log.warn("Cannot create file node for {}", file, ioe);
-                }
-            }
-            // if we have a descriptor, which has not been processed yet,
-            // process it
-            if (nodeDescriptor != null && 
!processedEntries.containsKey(nodeDescriptor.toString())) {
-                try {
-                    contentCreator.setIgnoreOverwriteFlag(true);
-                    node = createNode(parent, name, nodeDescriptor, 
contentCreator, configuration);
-                    processedEntries.put(nodeDescriptor.toString(), node);
-                } finally {
-                    contentCreator.setIgnoreOverwriteFlag(false);
-                }
-            }
-        } catch (RepositoryException e) {
-            log.error("jakarta.json process file {} from {}", file, name, e);
-            throw e;
-        }
-    }
-
-    /**
-     * Create a new node from a content resource found in the bundle.
-     *
-     * @param parent         The parent node
-     * @param name           The name of the new content node
-     * @param resourceUrl    The resource url.
-     * @param contentCreator the content creator
-     * @param configuration  the configuration for the node that needs to be 
created
-     * @return
-     * @throws RepositoryException
-     */
-    private Node createNode(Node parent, String name, URL resourceUrl, final 
DefaultContentCreator contentCreator,
-            PathEntry configuration) throws RepositoryException {
-
-        final String resourcePath = resourceUrl.getPath().toLowerCase();
-        InputStream contentStream = null;
-        try {
-            // special treatment for system view imports
-            if (resourcePath.endsWith(EXT_JCR_XML)) {
-                contentStream = resourceUrl.openStream();
-                return importJcrXml(parent, name, contentStream, false);
-            }
-
-            // get the node reader for this resource
-            final ContentReader nodeReader = getContentReader(resourcePath, 
configuration);
-
-            // cannot find out the type
-            if (nodeReader == null) {
-                return null;
-            }
-
-            final String contentReaderExtension = 
getContentReaderExtension(name);
-            contentCreator.prepareParsing(parent, toPlainName(name, 
contentReaderExtension));
-            nodeReader.parse(resourceUrl, contentCreator);
-
-            return contentCreator.getCreatedRootNode();
-        } catch (RepositoryException re) {
-            throw re;
-        } catch (Exception t) {
-            throw new RepositoryException(t.getMessage(), t);
-        } finally {
-            IOUtils.closeQuietly(contentStream);
-        }
-    }
-
-    /**
-     * Create a folder
-     *
-     * @param parent    The parent node.
-     * @param name      The name of the folder
-     * @param overwrite If set to true, an existing folder is removed first.
-     * @return The node pointing to the folder.
-     * @throws RepositoryException
-     */
-    private Node createFolder(Node parent, String name, final boolean 
overwrite) throws RepositoryException {
-
-        if (parent.hasNode(name)) {
-            if (overwrite) {
-                parent.getNode(name).remove();
-            } else {
-                return parent.getNode(name);
-            }
-        }
-
-        return parent.addNode(name, "sling:Folder");
-    }
-
-    /**
-     * Create a file from the given url.
-     *
-     * @param configuration
-     * @param parent
-     * @param source
-     * @param createdNodes
-     * @param contentCreator
-     * @throws IOException
-     * @throws RepositoryException
-     */
-    private void createFile(PathEntry configuration, Node parent, URL source, 
List<String> createdNodes,
-            final DefaultContentCreator contentCreator) throws IOException, 
RepositoryException {
-
-        final String srcPath = source.getPath();
-        int pos = srcPath.lastIndexOf('/');
-        final String name = getName(source.getPath());
-        final String path;
-        if (pos == -1) {
-            path = name;
-        } else {
-            path = srcPath.substring(0, pos + 1) + name;
-        }
-
-        contentCreator.init(configuration, getContentReaders(), createdNodes, 
null);
-        contentCreator.prepareParsing(parent, name);
-        final URLConnection conn = source.openConnection();
-        final long lastModified = Math.min(conn.getLastModified(), 
configuration.getLastModified());
-        final String type = conn.getContentType();
-        final InputStream data = conn.getInputStream();
-        contentCreator.createFileAndResourceNode(path, data, type, 
lastModified);
-        contentCreator.finishNode();
-        contentCreator.finishNode();
-    }
-
-    /**
-     * Gets and decodes the name part of the <code>path</code>. The name is 
the part
-     * of the path after the last slash (or the complete path if no slash is
-     * contained). To support names containing unsupported characters such as 
colon
-     * (<code>:</code>), names may be URL encoded (see
-     * <code>java.net.URLEncoder</code>) using the <i>UTF-8</i> character 
encoding.
-     * In this case, this method decodes the name using the
-     * <code>java.net.URLDecoder</code> class with the <i>UTF-8</i> character
-     * encoding.
-     *
-     * @param path The path from which to extract the name part.
-     * @return The URL decoded name part.
-     */
-    private String getName(String path) {
-
-        int lastSlash = path.lastIndexOf('/');
-        String name = (lastSlash < 0) ? path : path.substring(lastSlash + 1);
-
-        // check for encoded characters (%xx)
-        // has encoded characters, need to decode
-        if (name.indexOf('%') >= 0) {
-            try {
-                return URLDecoder.decode(name, "UTF-8");
-            } catch (UnsupportedEncodingException uee) {
-                // actually unexpected because UTF-8 is required by the spec
-                log.error("Cannot decode " + name + " because the platform has 
no support for UTF-8, using undecoded");
-            } catch (Exception e) {
-                // IllegalArgumentException or failure to decode
-                log.error("Cannot decode " + name + ", using undecoded", e);
-            }
-        }
-
-        // not encoded or problems decoding, return the name unmodified
-        return name;
-    }
-
-    private Node getTargetNode(Session session, String path, boolean 
overwrite) throws RepositoryException {
-
-        // not specified path directive
-        if (path == null) {
-            return session.getRootNode();
-        }
-
-        if (!path.startsWith("/")) {
-            // make relative path absolute
-            path = "/" + path;
-        }
-
-        if (!session.itemExists(path)) {
-            Node currentNode = session.getRootNode();
-            final StringTokenizer st = new StringTokenizer(path.substring(1), 
"/");
-            while (st.hasMoreTokens()) {
-                final String name = st.nextToken();
-                if (!currentNode.hasNode(name)) {
-                    currentNode.addNode(name, "sling:Folder");
-                }
-                currentNode = currentNode.getNode(name);
-            }
-            return currentNode;
-        } else {
-            Item item = session.getItem(path);
-            if (!item.isNode()) {
-                log.warn("Cannot use item as target path {} as this is an 
existing property", path);
-                return null;
-            }
-            Node targetNode = session.getNode(path);
-            // overwrite target node itself?
-            if (overwrite) {
-                targetNode = createFolder(targetNode.getParent(), 
targetNode.getName(), true);
-            }
-            return targetNode;
-        }
-    }
-
-    private void uninstallContent(final Session defaultSession, final Bundle 
bundle, final String[] uninstallPaths) {
-
-        final Map<String, Session> createdSessions = new HashMap<>();
-
-        try {
-            log.debug("Uninstalling initial content from bundle {}", 
bundle.getSymbolicName());
-            if (uninstallPaths != null && uninstallPaths.length > 0) {
-                for (String path : uninstallPaths) {
-                    if (!pathFilter.test(path)) {
-                        log.debug("Path {} excluded by configuration", path);
-                        continue;
-                    }
-                    final Session targetSession;
-
-                    final int wsSepPos = path.indexOf(":/");
-                    if (wsSepPos != -1) {
-                        final String workspaceName = path.substring(0, 
wsSepPos);
-                        path = path.substring(wsSepPos + 1);
-                        if 
(workspaceName.equals(defaultSession.getWorkspace().getName())) {
-                            targetSession = defaultSession;
-                        } else if (createdSessions.containsKey(workspaceName)) 
{
-                            targetSession = createdSessions.get(workspaceName);
-                        } else {
-                            targetSession = createSession(workspaceName);
-                            createdSessions.put(workspaceName, targetSession);
-                        }
-                    } else {
-                        targetSession = defaultSession;
-                    }
-
-                    if (targetSession.itemExists(path)) {
-                        targetSession.getItem(path).remove();
-                    }
-                }
-
-                // persist modifications now
-                defaultSession.save();
-
-                for (Session session : createdSessions.values()) {
-                    session.save();
-                }
-            }
-            log.debug("Done uninstalling initial content from bundle {}", 
bundle.getSymbolicName());
-        } catch (RepositoryException re) {
-            log.error("Unable to uninstall initial content from bundle " + 
bundle.getSymbolicName(), re);
-        } finally {
-            try {
-                if (defaultSession.hasPendingChanges()) {
-                    defaultSession.refresh(false);
-                }
-                for (Session session : createdSessions.values()) {
-                    if (session.hasPendingChanges()) {
-                        session.refresh(false);
-                    }
-                }
-            } catch (RepositoryException re) {
-                log.warn("Failure to rollback uninstalling initial content for 
bundle {}", bundle.getSymbolicName(),
-                        re);
-            }
-
-            for (Session session : createdSessions.values()) {
-                session.logout();
-            }
-        }
-    }
-
-    protected static final class Descriptor {
-
-        public URL url;
-
-        private ContentReader contentReader;
-
-    }
-
-    /**
-     * Return the parent node descriptor (ROOT).
-     */
-    private Descriptor getParentNodeDescriptor(final Bundle bundle, final 
String path,
-            final DefaultContentCreator contentCreator) {
-
-        for (Map.Entry<String, ContentReader> entry : 
contentCreator.getContentReaders().entrySet()) {
-            if (entry.getValue() != null) {
-                final StringBuilder filePath = new StringBuilder(path);
-                if (!path.endsWith("/")) {
-                    filePath.append("/");
-                }
-                filePath.append(PARENT_DESCRIPTOR);
-                // add file extension, e.g. .jcr.xml, .xml, .zip (see 
BaseImportLoader)
-                filePath.append(entry.getKey());
-                URL url = bundle.getEntry(filePath.toString());
-                if (url != null) {
-                    final Descriptor descriptor = new Descriptor();
-                    descriptor.url = url;
-                    descriptor.contentReader = entry.getValue();
-                    return descriptor;
-                }
-            }
-        }
-        return null;
-    }
-
-    /**
-     * Imports mixin nodes and properties (and optionally child nodes) of the 
parent
-     * node.
-     */
-    private URL importParentNode(Bundle bundle, String path, Node parent, 
final DefaultContentCreator contentCreator)
-            throws RepositoryException {
-
-        final Descriptor descriptor = getParentNodeDescriptor(bundle, path, 
contentCreator);
-        // no parent descriptor (ROOT) found
-        if (descriptor == null) {
-            return null;
-        }
-
-        try {
-            contentCreator.prepareParsing(parent, null);
-            descriptor.contentReader.parse(descriptor.url, contentCreator);
-            return descriptor.url;
-        } catch (RepositoryException re) {
-            throw re;
-        } catch (Exception t) {
-            throw new RepositoryException(t.getMessage(), t);
-        }
-    }
-
-    private Session createSession(String workspace) throws RepositoryException 
{
-        try {
-            return bundleHelper.getSession(workspace);
-        } catch (NoSuchWorkspaceException e) {
-            Session temp = bundleHelper.getSession();
-            temp.getWorkspace().createWorkspace(workspace);
-            temp.logout();
-            return bundleHelper.getSession(workspace);
-        }
-    }
-
-}


Reply via email to