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.2-incubator in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-contentloader.git
commit 97fa6059301d398d6a37cf6b30e426db1ce8fd07 Author: Felix Meschberger <[email protected]> AuthorDate: Wed May 21 08:43:58 2008 +0000 SLING-365 Implement support for initial checkin of mix:versionable nodes on-demand git-svn-id: https://svn.apache.org/repos/asf/incubator/sling/trunk/jcr/contentloader@658601 13f79535-47bb-0310-9956-ffa450edef68 --- .../internal/ContentLoaderService.java | 2 +- .../sling/jcr/contentloader/internal/Loader.java | 420 +++++++++++++-------- .../jcr/contentloader/internal/PathEntry.java | 60 ++- 3 files changed, 300 insertions(+), 182 deletions(-) diff --git a/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentLoaderService.java b/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentLoaderService.java index af3c267..2d0612b 100644 --- a/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentLoaderService.java +++ b/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentLoaderService.java @@ -303,7 +303,7 @@ public class ContentLoaderService implements SynchronousBundleListener { return info; } - public void unlockBundleContentInto(final Session session, + public void unlockBundleContentInfo(final Session session, final Bundle bundle, final boolean contentLoaded) throws RepositoryException { 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 6dd1cb0..ca6c28f 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 @@ -88,48 +88,56 @@ public class Loader { } public void dispose() { - this.delayedReferences = null; - if (this.delayedBundles != null) { - this.delayedBundles.clear(); - this.delayedBundles = null; + delayedReferences = null; + if (delayedBundles != null) { + delayedBundles.clear(); + delayedBundles = null; } - this.jcrContentHelper = null; - this.importProviders.clear(); + jcrContentHelper = null; + importProviders.clear(); } /** * Register a bundle and install its content. + * * @param session * @param bundle */ - public void registerBundle(final Session session, final Bundle bundle, final boolean isUpdate) { - log.debug("Registering bundle {} for content loading.", bundle.getSymbolicName()); - if (this.registerBundleInternal(session, bundle, false, isUpdate)) { + public void registerBundle(final Session session, final Bundle bundle, + final boolean isUpdate) { + + log.debug("Registering bundle {} for content loading.", + bundle.getSymbolicName()); + + if (registerBundleInternal(session, bundle, false, isUpdate)) { + // handle delayed bundles, might help now int currentSize = -1; - for (int i = this.delayedBundles.size(); i > 0 - && currentSize != this.delayedBundles.size() - && !this.delayedBundles.isEmpty(); i--) { - for (Iterator<Bundle> di = this.delayedBundles.iterator(); di.hasNext();) { + 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 (this.registerBundleInternal(session, delayed, true, false)) { + if (registerBundleInternal(session, delayed, true, false)) { di.remove(); } + } - currentSize = this.delayedBundles.size(); + + currentSize = delayedBundles.size(); } - } else { + + } else if (!isUpdate) { // add to delayed bundles - if this is not an update! - if ( !isUpdate ) { - this.delayedBundles.add(bundle); - } + delayedBundles.add(bundle); } } private boolean registerBundleInternal(final Session session, - final Bundle bundle, - final boolean isRetry, - final boolean isUpdate) { + 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) { @@ -139,32 +147,48 @@ public class Loader { } try { + // check if the content has already been loaded - final Map<String, Object> bundleContentInfo = this.jcrContentHelper.getBundleContentInfo(session, bundle); + final Map<String, Object> bundleContentInfo = jcrContentHelper.getBundleContentInfo( + session, bundle); + // if we don't get an info, someone else is currently loading - if ( bundleContentInfo == null ) { + if (bundleContentInfo == null) { return false; } boolean success = false; try { - final boolean contentAlreadyLoaded = ((Boolean)bundleContentInfo.get(ContentLoaderService.PROPERTY_CONTENT_LOADED)).booleanValue(); - if ( !isUpdate && contentAlreadyLoaded ) { - log.info("Content of bundle already loaded {}.", bundle.getSymbolicName()); + + final boolean contentAlreadyLoaded = ((Boolean) bundleContentInfo.get(ContentLoaderService.PROPERTY_CONTENT_LOADED)).booleanValue(); + + if (!isUpdate && contentAlreadyLoaded) { + + log.info("Content of bundle already loaded {}.", + bundle.getSymbolicName()); + } else { - this.installContent(session, bundle, pathIter, contentAlreadyLoaded); + + installContent(session, bundle, pathIter, + contentAlreadyLoaded); + if (isRetry) { // log success of retry log.info( "Retrytring to load initial content for bundle {} succeeded.", bundle.getSymbolicName()); } + } + success = true; return true; + } finally { - this.jcrContentHelper.unlockBundleContentInto(session, bundle, success); + jcrContentHelper.unlockBundleContentInfo(session, bundle, + success); } + } catch (RepositoryException re) { // if we are retrying we already logged this message once, so we // won't log it again @@ -178,44 +202,62 @@ public class Loader { } /** - * Unregister a bundle. - * Remove installed content. + * Unregister a bundle. Remove installed content. + * * @param bundle The bundle. */ public void unregisterBundle(final Session session, final Bundle bundle) { + // check if bundle has initial content final Iterator<PathEntry> pathIter = PathEntry.getContentPaths(bundle); - if (this.delayedBundles.contains(bundle)) { - this.delayedBundles.remove(bundle); + if (delayedBundles.contains(bundle)) { + + delayedBundles.remove(bundle); + } else { - if ( pathIter != null ) { - this.uninstallContent(session, bundle, pathIter); - this.jcrContentHelper.contentIsUninstalled(session, bundle); + + if (pathIter != null) { + uninstallContent(session, bundle, pathIter); + jcrContentHelper.contentIsUninstalled(session, bundle); } + } } // ---------- internal ----------------------------------------------------- - private void installContent(final Session session, - final Bundle bundle, - final Iterator<PathEntry> pathIter, - final boolean contentAlreadyLoaded) - throws RepositoryException { + private void installContent(final Session session, final Bundle bundle, + final Iterator<PathEntry> pathIter, + final boolean contentAlreadyLoaded) throws RepositoryException { log.debug("Installing initial content from bundle {}", - bundle.getSymbolicName()); + bundle.getSymbolicName()); try { - while (pathIter.hasNext() ) { + + // the nodes marked to be checked-in after import + List<Node> versionables = new ArrayList<Node>(); + + while (pathIter.hasNext()) { final PathEntry entry = pathIter.next(); - if ( !contentAlreadyLoaded || entry.isOverwrite() ) { - Node targetNode = this.getTargetNode(session, entry.getTarget()); - if (targetNode != null) - this.installFromPath(bundle, entry.getPath(), entry.isOverwrite(), targetNode); + if (!contentAlreadyLoaded || entry.isOverwrite()) { + + Node targetNode = getTargetNode(session, entry.getTarget()); + + if (targetNode != null) { + installFromPath(bundle, entry.getPath(), + entry.isOverwrite(), versionables, + entry.isCheckin(), targetNode); + } } } // persist modifications now session.save(); + + // finally checkin versionable nodes + for (Node versionable : versionables) { + versionable.checkin(); + } + } finally { try { if (session.hasPendingChanges()) { @@ -228,23 +270,24 @@ public class Loader { } } log.debug("Done installing initial content from bundle {}", - bundle.getSymbolicName()); + bundle.getSymbolicName()); } /** * Handle content installation for a single path. + * * @param bundle The bundle containing the content. - * @param path The path + * @param path The path * @param overwrite Should the content be overwritten. * @param parent The parent node. * @throws RepositoryException */ - private void installFromPath(final Bundle bundle, - final String path, - final boolean overwrite, - final Node parent) - throws RepositoryException { + private void installFromPath(final Bundle bundle, final String path, + final boolean overwrite, List<Node> versionables, + final boolean checkin, final Node parent) + throws RepositoryException { + @SuppressWarnings("unchecked") Enumeration<String> entries = bundle.getEntryPaths(path); if (entries == null) { @@ -255,7 +298,8 @@ public class Loader { Set<URL> ignoreEntry = new HashSet<URL>(); // potential root node import/extension - URL rootNodeDescriptor = importRootNode(parent.getSession(), bundle, path); + URL rootNodeDescriptor = importRootNode(parent.getSession(), bundle, + path, versionables, checkin); if (rootNodeDescriptor != null) { ignoreEntry.add(rootNodeDescriptor); } @@ -264,9 +308,10 @@ public class Loader { final String entry = entries.nextElement(); log.debug("Processing initial content entry {}", entry); if (entry.endsWith("/")) { + // dir, check for node descriptor , else create dir String base = entry.substring(0, entry.length() - 1); - String name = this.getName(base); + String name = getName(base); URL nodeDescriptor = null; for (String ext : importProviders.keySet()) { @@ -282,18 +327,21 @@ public class Loader { Node node = null; if (nodeDescriptor != null && !ignoreEntry.contains(nodeDescriptor)) { - node = this.createNode(parent, name, nodeDescriptor, overwrite); + node = createNode(parent, name, nodeDescriptor, overwrite, + versionables, checkin); ignoreEntry.add(nodeDescriptor); } else { - node = this.createFolder(parent, name, overwrite); + node = createFolder(parent, name, overwrite); } // walk down the line if (node != null) { - this.installFromPath(bundle, entry, overwrite, node); + installFromPath(bundle, entry, overwrite, versionables, + checkin, node); } } else { + // file => create file URL file = bundle.getEntry(entry); if (ignoreEntry.contains(file)) { @@ -303,15 +351,16 @@ public class Loader { // install if it is a descriptor boolean foundProvider = false; - final Iterator<String> ipIter = this.importProviders.keySet().iterator(); - while ( !foundProvider && ipIter.hasNext() ) { + final Iterator<String> ipIter = importProviders.keySet().iterator(); + while (!foundProvider && ipIter.hasNext()) { final String ext = ipIter.next(); - if ( entry.endsWith(ext) ) { + if (entry.endsWith(ext)) { foundProvider = true; } } if (foundProvider) { - if (this.createNode(parent, this.getName(entry), file, overwrite) != null) { + if (createNode(parent, getName(entry), file, overwrite, + versionables, checkin) != null) { ignoreEntry.add(file); continue; } @@ -319,7 +368,7 @@ public class Loader { // otherwise just place as file try { - this.createFile(parent, file); + createFile(parent, file); } catch (IOException ioe) { log.warn("Cannot create file node for {}", file, ioe); } @@ -327,29 +376,9 @@ public class Loader { } } - /** - * 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, "nt:folder"); - } - - private Node createNode(Node parent, String name, URL nodeXML, boolean overwrite) - throws RepositoryException { + private Node createNode(Node parent, String name, URL nodeXML, + boolean overwrite, List<Node> versionables, boolean checkin) + throws RepositoryException { InputStream ins = null; try { @@ -359,7 +388,7 @@ public class Loader { } NodeReader nodeReader = null; - for (Map.Entry<String, ImportProvider> e: importProviders.entrySet()) { + for (Map.Entry<String, ImportProvider> e : importProviders.entrySet()) { if (nodeXML.getPath().toLowerCase().endsWith(e.getKey())) { nodeReader = e.getValue().getReader(); break; @@ -384,7 +413,7 @@ public class Loader { clNode.setName(toPlainName(name)); } - return this.createNode(parent, clNode, overwrite); + return createNode(parent, clNode, overwrite, versionables, checkin); } catch (RepositoryException re) { throw re; } catch (Throwable t) { @@ -401,24 +430,25 @@ public class Loader { /** * Delete the node from the initial content. + * * @param parent * @param name * @param nodeXML * @throws RepositoryException */ private void deleteNode(Node parent, String name) - throws RepositoryException { - if ( parent.hasNode(name) ) { + throws RepositoryException { + if (parent.hasNode(name)) { parent.getNode(name).remove(); } } - private Node createNode(Node parentNode, - NodeDescription clNode, - final boolean overwrite) - throws RepositoryException { + private Node createNode(Node parentNode, NodeDescription clNode, + final boolean overwrite, List<Node> versionables, boolean checkin) + throws RepositoryException { + // if node already exists but should be overwritten, delete it - if ( overwrite && parentNode.hasNode(clNode.getName()) ) { + if (overwrite && parentNode.hasNode(clNode.getName())) { parentNode.getNode(clNode.getName()).remove(); } @@ -441,11 +471,11 @@ public class Loader { clNode.getPrimaryNodeType()); } - return setupNode(node, clNode); + return setupNode(node, clNode, versionables, checkin); } - private Node setupNode(Node node, - NodeDescription clNode) + private Node setupNode(Node node, NodeDescription clNode, + List<Node> versionables, boolean checkin) throws RepositoryException { // ammend mixin node types @@ -457,6 +487,10 @@ public class Loader { } } + // check if node is versionable + boolean addToVersionables = checkin + && node.isNodeType("mix:versionable"); + if (clNode.getProperties() != null) { for (PropertyDescription prop : clNode.getProperties()) { if (node.hasProperty(prop.getName()) @@ -466,44 +500,91 @@ public class Loader { int type = PropertyType.valueFromName(prop.getType()); if (prop.isMultiValue()) { + String[] values = prop.getValues().toArray( new String[prop.getValues().size()]); node.setProperty(prop.getName(), values, type); + } else if (type == PropertyType.REFERENCE) { + // need to resolve the reference String propPath = node.getPath() + "/" + prop.getName(); - String uuid = this.getUUID(node.getSession(), propPath, + String uuid = getUUID(node.getSession(), propPath, prop.getValue()); if (uuid != null) { node.setProperty(prop.getName(), uuid, type); } + + } else if ("jcr:isCheckedOut".equals(prop.getName())) { + + // don't try to write the property but record its state + // for later checkin if set to false + boolean checkedout = Boolean.valueOf(prop.getValue()); + if (!checkedout) { + addToVersionables = true; + } + } else { + node.setProperty(prop.getName(), prop.getValue(), type); + } } } + // add the current node to the list of versionables to be checked + // in at the end. This is done if checkin is true and the node is + // versionable or if the jcr:isCheckedOut property is false + if (addToVersionables) { + versionables.add(node); + } + + // create child nodes from the descriptor if (clNode.getChildren() != null) { for (NodeDescription child : clNode.getChildren()) { - this.createNode(node, child, false); + createNode(node, child, false, versionables, checkin); } } - this.resolveReferences(node); + // resolve REFERENCE property values pointing to this node + resolveReferences(node); return node; } /** + * 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, "nt:folder"); + } + + /** * Create a file from the given url. + * * @param parent * @param source * @throws IOException * @throws RepositoryException */ - private void createFile(Node parent, URL source) - throws IOException, RepositoryException { - String name = this.getName(source.getPath()); + private void createFile(Node parent, URL source) throws IOException, + RepositoryException { + String name = getName(source.getPath()); if (parent.hasNode(name)) { return; } @@ -515,7 +596,7 @@ public class Loader { // ensure content type if (type == null) { - type = this.jcrContentHelper.getMimeType(name); + type = jcrContentHelper.getMimeType(name); if (type == null) { log.info( "createFile: Cannot find content type for {}, using {}", @@ -538,14 +619,15 @@ public class Loader { /** * Delete the file from the given url. + * * @param parent * @param source * @throws IOException * @throws RepositoryException */ - private void deleteFile(Node parent, URL source) - throws IOException, RepositoryException { - String name = this.getName(source.getPath()); + private void deleteFile(Node parent, URL source) throws IOException, + RepositoryException { + String name = getName(source.getPath()); if (parent.hasNode(name)) { parent.getNode(name).remove(); } @@ -563,10 +645,10 @@ public class Loader { } } else { // not existing yet, keep for delayed setting - List<String> current = this.delayedReferences.get(referencePath); + List<String> current = delayedReferences.get(referencePath); if (current == null) { current = new ArrayList<String>(); - this.delayedReferences.put(referencePath, current); + delayedReferences.put(referencePath, current); } current.add(propPath); } @@ -576,7 +658,7 @@ public class Loader { } private void resolveReferences(Node node) throws RepositoryException { - List<String> props = this.delayedReferences.remove(node.getPath()); + List<String> props = delayedReferences.remove(node.getPath()); if (props == null || props.size() == 0) { return; } @@ -590,8 +672,8 @@ public class Loader { String uuid = node.getUUID(); for (String property : props) { - String name = this.getName(property); - Node parentNode = this.getParentNode(session, property); + String name = getName(property); + Node parentNode = getParentNode(session, property); if (parentNode != null) { parentNode.setProperty(name, uuid, PropertyType.REFERENCE); } @@ -607,7 +689,7 @@ public class Loader { * encoding. In this case, this method decodes the name using the * <code>java.netURLDecoder</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. */ @@ -658,36 +740,37 @@ public class Loader { Item item = session.getItem(path); return (item.isNode()) ? (Node) item : null; } - + private Node getTargetNode(Session session, String path) - throws RepositoryException { - - // not specyfied path directive - if (path == null) - return session.getRootNode(); - - int firstSlash = path.indexOf("/"); - - // it´s a relative path - if (firstSlash != 0) - path = "/" + path; - - Item item = session.getItem(path); - return (item.isNode()) ? (Node) item : null; + throws RepositoryException { + + // not specyfied path directive + if (path == null) return session.getRootNode(); + + int firstSlash = path.indexOf("/"); + + // it´s a relative path + if (firstSlash != 0) path = "/" + path; + + Item item = session.getItem(path); + return (item.isNode()) ? (Node) item : null; } - private void uninstallContent(final Session session, final Bundle bundle, final Iterator<PathEntry> pathIter) { + private void uninstallContent(final Session session, final Bundle bundle, + final Iterator<PathEntry> pathIter) { try { log.debug("Uninstalling initial content from bundle {}", bundle.getSymbolicName()); - while (pathIter.hasNext() ) { + while (pathIter.hasNext()) { final PathEntry entry = pathIter.next(); - if ( entry.isUninstall() ) { - Node targetNode = this.getTargetNode(session, entry.getTarget()); - if (targetNode != null) - this.uninstallFromPath(bundle, entry.getPath(), targetNode); + if (entry.isUninstall()) { + Node targetNode = getTargetNode(session, entry.getTarget()); + if (targetNode != null) + uninstallFromPath(bundle, entry.getPath(), targetNode); } else { - log.debug("Ignoring to uninstall content at {}, uninstall directive is not set.", entry.getPath()); + log.debug( + "Ignoring to uninstall content at {}, uninstall directive is not set.", + entry.getPath()); } } @@ -696,7 +779,8 @@ public class Loader { 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); + log.error("Unable to uninstall initial content from bundle " + + bundle.getSymbolicName(), re); } finally { try { if (session.hasPendingChanges()) { @@ -712,15 +796,14 @@ public class Loader { /** * Handle content uninstallation for a single path. + * * @param bundle The bundle containing the content. - * @param path The path + * @param path The path * @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 Node parent) throws RepositoryException { @SuppressWarnings("unchecked") Enumeration<String> entries = bundle.getEntryPaths(path); if (entries == null) { @@ -730,7 +813,7 @@ public class Loader { Set<URL> ignoreEntry = new HashSet<URL>(); // potential root node import/extension - Descriptor rootNodeDescriptor = this.getRootNodeDescriptor(bundle, path); + Descriptor rootNodeDescriptor = getRootNodeDescriptor(bundle, path); if (rootNodeDescriptor != null) { ignoreEntry.add(rootNodeDescriptor.rootNodeDescriptor); } @@ -741,7 +824,7 @@ public class Loader { if (entry.endsWith("/")) { // dir, check for node descriptor , else create dir String base = entry.substring(0, entry.length() - 1); - String name = this.getName(base); + String name = getName(base); URL nodeDescriptor = null; for (String ext : importProviders.keySet()) { @@ -755,19 +838,21 @@ public class Loader { boolean delete = false; if (nodeDescriptor != null && !ignoreEntry.contains(nodeDescriptor)) { - node = (parent.hasNode(toPlainName(name)) ? parent.getNode(toPlainName(name)) : null); + node = (parent.hasNode(toPlainName(name)) + ? parent.getNode(toPlainName(name)) + : null); delete = true; } else { node = (parent.hasNode(name) ? parent.getNode(name) : null); } - if ( node != null ) { + if (node != null) { // walk down the line - this.uninstallFromPath(bundle, entry, node); + uninstallFromPath(bundle, entry, node); } if (delete) { - this.deleteNode(parent, toPlainName(name)); + deleteNode(parent, toPlainName(name)); ignoreEntry.add(nodeDescriptor); } @@ -781,22 +866,22 @@ public class Loader { // uninstall if it is a descriptor boolean foundProvider = false; - final Iterator<String> ipIter = this.importProviders.keySet().iterator(); - while ( !foundProvider && ipIter.hasNext() ) { + final Iterator<String> ipIter = importProviders.keySet().iterator(); + while (!foundProvider && ipIter.hasNext()) { final String ext = ipIter.next(); - if ( entry.endsWith(ext) ) { + if (entry.endsWith(ext)) { foundProvider = true; } } if (foundProvider) { - this.deleteNode(parent, toPlainName(this.getName(entry))); + deleteNode(parent, toPlainName(getName(entry))); ignoreEntry.add(file); continue; } // otherwise just delete the file try { - this.deleteFile(parent, file); + deleteFile(parent, file); } catch (IOException ioe) { log.warn("Cannot delete file node for {}", file, ioe); } @@ -808,7 +893,7 @@ public class Loader { * Import the XML file as JCR system or document view import. If the XML * file is not a valid system or document view export/import file, * <code>false</code> is returned. - * + * * @param parent The parent node below which to import * @param nodeXML The URL to the XML file to import * @return <code>true</code> if the import succeeds, <code>false</code> @@ -868,18 +953,21 @@ public class Loader { protected static final class Descriptor { public URL rootNodeDescriptor; + public NodeReader nodeReader; } /** * Return the root node descriptor. */ - private Descriptor getRootNodeDescriptor(final Bundle bundle, final String path) { + private Descriptor getRootNodeDescriptor(final Bundle bundle, + final String path) { URL rootNodeDescriptor = null; for (Map.Entry<String, ImportProvider> e : importProviders.entrySet()) { if (e.getValue() != null) { - rootNodeDescriptor = bundle.getEntry(path + ROOT_DESCRIPTOR + e.getKey()); + rootNodeDescriptor = bundle.getEntry(path + ROOT_DESCRIPTOR + + e.getKey()); if (rootNodeDescriptor != null) { try { final Descriptor d = new Descriptor(); @@ -887,7 +975,8 @@ public class Loader { d.nodeReader = e.getValue().getReader(); return d; } catch (IOException ioe) { - this.log.error("Unable to setup node reader for " + e.getKey(), ioe); + log.error("Unable to setup node reader for " + + e.getKey(), ioe); return null; } } @@ -900,9 +989,10 @@ 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) - throws RepositoryException { - final Descriptor descriptor = this.getRootNodeDescriptor(bundle, path); + private URL importRootNode(Session session, Bundle bundle, String path, + List<Node> versionables, boolean checkin) + throws RepositoryException { + final Descriptor descriptor = getRootNodeDescriptor(bundle, path); // no root descriptor found if (descriptor == null) { return null; @@ -914,7 +1004,7 @@ public class Loader { ins = descriptor.rootNodeDescriptor.openStream(); NodeDescription clNode = descriptor.nodeReader.parse(ins); - setupNode(session.getRootNode(), clNode); + setupNode(session.getRootNode(), clNode, versionables, checkin); return descriptor.rootNodeDescriptor; } catch (RepositoryException re) { @@ -934,10 +1024,10 @@ public class Loader { private String toPlainName(String name) { String providerExt = null; - final Iterator<String> ipIter = this.importProviders.keySet().iterator(); - while ( providerExt == null && ipIter.hasNext() ) { + final Iterator<String> ipIter = importProviders.keySet().iterator(); + while (providerExt == null && ipIter.hasNext()) { final String ext = ipIter.next(); - if ( name.endsWith(ext) ) { + if (name.endsWith(ext)) { providerExt = ext; } } 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 6369bc4..cfb8c24 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 @@ -33,15 +33,27 @@ public class PathEntry { /** The manifest header to specify initial content to be loaded. */ public static final String CONTENT_HEADER = "Sling-Initial-Content"; - /** The overwrite directive specifying if content should be overwritten or just initially added. */ + /** + * The overwrite directive specifying if content should be overwritten or + * just initially added. + */ public static final String OVERWRITE_DIRECTIVE = "overwrite"; /** The uninstall directive specifying if content should be uninstalled. */ public static final String UNINSTALL_DIRECTIVE = "uninstall"; - - /** The path directive specifying the target node where initial content will be loaded. */ + + /** + * The path directive specifying the target node where initial content will + * be loaded. + */ public static final String PATH_DIRECTIVE = "path"; + /** + * The checkin directive specifying whether versionable nodes should be + * checked in + */ + public static final String CHECKIN_DIRECTIVE = "checkin"; + /** The path for the initial content. */ private final String path; @@ -51,7 +63,13 @@ public class PathEntry { /** Should existing content be uninstalled? */ private final boolean uninstall; - /** Target path where initial content will be loaded. If it´s null then target node is the root node */ + /** Should versionable nodes be checked in? */ + private final boolean checkin; + + /** + * Target path where initial content will be loaded. If it´s null then + * target node is the root node + */ private final String target; public static Iterator<PathEntry> getContentPaths(final Bundle bundle) { @@ -60,12 +78,12 @@ public class PathEntry { final String root = (String) bundle.getHeaders().get(CONTENT_HEADER); if (root != null) { final ManifestHeader header = ManifestHeader.parse(root); - for(final ManifestHeader.Entry entry : header.getEntries()) { + for (final ManifestHeader.Entry entry : header.getEntries()) { entries.add(new PathEntry(entry)); } } - if ( entries.size() == 0 ) { + if (entries.size() == 0) { return null; } return entries.iterator(); @@ -76,21 +94,27 @@ public class PathEntry { final String overwriteValue = entry.getDirectiveValue(OVERWRITE_DIRECTIVE); final String uninstallValue = entry.getDirectiveValue(UNINSTALL_DIRECTIVE); final String pathValue = entry.getDirectiveValue(PATH_DIRECTIVE); + final String checkinValue = entry.getDirectiveValue(CHECKIN_DIRECTIVE); boolean overwriteFlag = false; - if ( overwriteValue != null ) { - overwriteFlag = Boolean.valueOf(overwriteValue).booleanValue(); + if (overwriteValue != null) { + overwriteFlag = Boolean.valueOf(overwriteValue); } - this.path = entry.getValue(); + this.path = entry.getValue(); this.overwrite = overwriteFlag; - if ( uninstallValue != null ) { + if (uninstallValue != null) { this.uninstall = Boolean.valueOf(uninstallValue); } else { this.uninstall = this.overwrite; } - if ( pathValue != null ) { - this.target = pathValue; + if (pathValue != null) { + this.target = pathValue; } else { - this.target = null; + this.target = null; + } + if (checkinValue != null) { + this.checkin = Boolean.valueOf(checkinValue); + } else { + this.checkin = false; } } @@ -106,7 +130,11 @@ public class PathEntry { return this.uninstall; } - public String getTarget() { - return target; - } + public boolean isCheckin() { + return this.checkin; + } + + public String getTarget() { + return target; + } } -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
