You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2014/02/13 08:01:58 UTC
svn commit: r1567854 - in
/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io:
DocViewSAXImporter.java FileArtifactHandler.java
Author: tripod
Date: Thu Feb 13 07:01:57 2014
New Revision: 1567854
URL: http://svn.apache.org/r1567854
Log:
JCRVLT-28 Improve package import for subtrees
Modified:
jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java
jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/FileArtifactHandler.java
Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java?rev=1567854&r1=1567853&r2=1567854&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/DocViewSAXImporter.java Thu Feb 13 07:01:57 2014
@@ -320,7 +320,7 @@ public class DocViewSAXImporter extends
@Override
public void startDocument() throws SAXException {
try {
- stack = new StackElement(null, parentNode);
+ stack = new StackElement(parentNode, parentNode.isNew());
} catch (RepositoryException e) {
throw new SAXException(e);
}
@@ -346,12 +346,12 @@ public class DocViewSAXImporter extends
for (String propName: blobs.keySet()) {
DocViewSAXImporter.BlobInfo info = blobs.get(propName);
if (node.hasNode(propName)) {
- handleBinNode(node.getNode(propName), info);
+ handleBinNode(node.getNode(propName), info, true);
} else if (info.isFile()) {
// special case for not existing files
Node fNode = node.addNode(propName, JcrConstants.NT_FILE);
importInfo.onCreated(fNode.getPath());
- handleBinNode(fNode, info);
+ handleBinNode(fNode, info, false);
} else {
if (info.isMulti) {
node.setProperty(propName, info.getValues(session));
@@ -374,7 +374,7 @@ public class DocViewSAXImporter extends
}
Node fNode = node.addNode(propName, JcrConstants.NT_FILE);
importInfo.onCreated(fNode.getPath());
- handleBinNode(fNode, info);
+ handleBinNode(fNode, info, false);
}
}
}
@@ -406,18 +406,23 @@ public class DocViewSAXImporter extends
return node;
}
- private void handleBinNode(Node node, DocViewSAXImporter.BlobInfo info)
+ private void handleBinNode(Node node, DocViewSAXImporter.BlobInfo info, boolean checkIfNtFileOk)
throws RepositoryException, IOException {
log.debug("handling binary file at {}", node.getPath());
if (info.isMulti) {
throw new IllegalStateException("unable to add MV binary to node " + node.getPath());
}
- if (node.isNodeType(JcrConstants.NT_FILE)) {
- if (node.hasNode(JcrConstants.JCR_CONTENT)) {
- node = node.getNode(JcrConstants.JCR_CONTENT);
- } else {
- node = node.addNode(JcrConstants.JCR_CONTENT, JcrConstants.NT_RESOURCE);
+
+ if (checkIfNtFileOk) {
+ if (node.isNodeType(JcrConstants.NT_FILE)) {
+ if (node.hasNode(JcrConstants.JCR_CONTENT)) {
+ node = node.getNode(JcrConstants.JCR_CONTENT);
+ } else {
+ node = node.addNode(JcrConstants.JCR_CONTENT, JcrConstants.NT_RESOURCE);
+ }
}
+ } else {
+ node = node.addNode(JcrConstants.JCR_CONTENT, JcrConstants.NT_RESOURCE);
}
Artifact a = info.artifacts.get(0);
@@ -586,7 +591,7 @@ public class DocViewSAXImporter extends
stack.addName(label);
Node node = stack.getNode();
if (node == null) {
- stack = stack.push(null);
+ stack = stack.push();
DocViewAdapter xform = stack.getAdapter();
if (xform != null) {
DocViewNode ni = new DocViewNode(name, label, attributes, npResolver);
@@ -598,11 +603,11 @@ public class DocViewSAXImporter extends
if (attributes.getLength() == 0) {
// only ordering node. skip
log.debug("Skipping empty node {}", node.getPath() + "/" + name);
- stack = stack.push(null);
+ stack = stack.push();
} else if (snsNode) {
// skip SNS nodes with index > 1
log.warn("Skipping unsupported SNS node with index > 1. Some content will be missing after import: {}", node.getPath() + "/" + label);
- stack = stack.push(null);
+ stack = stack.push();
} else {
try {
DocViewNode ni = new DocViewNode(name, label, attributes, npResolver);
@@ -612,12 +617,12 @@ public class DocViewSAXImporter extends
if (aclManagement.ensureAccessControllable(node)) {
log.info("Adding ACL element to non ACL parent - adding mixin: {}", node.getPath());
}
- stack = stack.push(null);
+ stack = stack.push();
stack.adapter = new JackrabbitACLImporter(node, aclHandling);
stack.adapter.startNode(ni);
importInfo.onCreated(node.getPath() + "/" + ni.name);
} else {
- stack = stack.push(null);
+ stack = stack.push();
}
} else if (userManagement != null && userManagement.isAuthorizableNodeType(ni.primary)) {
boolean skip = false;
@@ -642,18 +647,17 @@ public class DocViewSAXImporter extends
}
if (skip) {
log.info("Skipping import of existing authorizable '{}' due to MERGE import mode.", id);
- stack = stack.push(null);
+ stack = stack.push();
importInfo.onNop(node.getPath() + "/" + ni.name);
} else {
log.debug("Authorizable element detected. starting sysview transformation {}/{}", node.getPath(), name);
- stack = stack.push(null);
+ stack = stack.push();
stack.adapter = new JcrSysViewTransformer(node);
stack.adapter.startNode(ni);
importInfo.onCreated(node.getPath() + "/" + ni.name);
}
} else {
- Node childNode = addNode(ni);
- stack = stack.push(childNode);
+ stack = stack.push(addNode(ni));
}
} catch (RepositoryException e) {
String errPath = node.getPath();
@@ -663,7 +667,7 @@ public class DocViewSAXImporter extends
errPath += name;
log.error("Error during processing of {}: {}", errPath, e.toString());
importInfo.onError(errPath, e);
- stack = stack.push(null);
+ stack = stack.push();
}
}
}
@@ -672,8 +676,7 @@ public class DocViewSAXImporter extends
}
}
- private Node addNode(DocViewNode ni)
- throws RepositoryException, IOException {
+ private StackElement addNode(DocViewNode ni) throws RepositoryException, IOException {
final Node currentNode = stack.getNode();
// find old node
@@ -683,7 +686,7 @@ public class DocViewSAXImporter extends
// special case for root node update
node = currentNode;
} else if (ni.uuid == null) {
- if (currentNode.hasNode(ni.label)) {
+ if (!stack.isNew && currentNode.hasNode(ni.label)) {
node = currentNode.getNode(ni.label);
if (ni.primary != null && !node.getPrimaryNodeType().getName().equals(ni.primary)) {
// if node type mismatches => replace
@@ -710,7 +713,7 @@ public class DocViewSAXImporter extends
// ignore
}
if (node == null) {
- if (currentNode.hasNode(ni.label)) {
+ if (!stack.isNew && currentNode.hasNode(ni.label)) {
node = currentNode.getNode(ni.label);
if (ni.primary != null && !node.getPrimaryNodeType().getName().equals(ni.primary)) {
// if node type mismatches => replace
@@ -796,7 +799,7 @@ public class DocViewSAXImporter extends
}
}
importInfo.onReplaced(node.getPath());
- return node;
+ return new StackElement(node, false);
}
// check if new node needs to be checked in
@@ -804,6 +807,7 @@ public class DocViewSAXImporter extends
boolean isCheckedIn = coProp != null && coProp.values[0].equals("false");
// create or update node
+ boolean isNew = false;
if (node == null) {
// workaround for bug in jcr2spi if mixins are empty
if (!ni.props.containsKey(JcrConstants.JCR_MIXINTYPES)) {
@@ -822,6 +826,7 @@ public class DocViewSAXImporter extends
importInfo.registerToVersion(node.getPath());
}
importInfo.onCreated(node.getPath());
+ isNew = true;
} else if (isIncluded(node, node.getDepth() - rootDepth)){
boolean modified = false;
@@ -918,8 +923,7 @@ public class DocViewSAXImporter extends
importInfo.onNop(node.getPath());
}
}
-
- return node;
+ return new StackElement(node, isNew);
}
private Node createNode(Node currentNode, DocViewNode ni)
@@ -1228,20 +1232,22 @@ public class DocViewSAXImporter extends
private final Node node;
- final DocViewSAXImporter.StackElement parent;
+ private DocViewSAXImporter.StackElement parent;
private final NodeNameList childNames = new NodeNameList();
private boolean isCheckedOut;
+ private boolean isNew;
+
/**
* adapter for special content
*/
private DocViewAdapter adapter;
- public StackElement(DocViewSAXImporter.StackElement parent, Node node) throws RepositoryException {
+ public StackElement(Node node, boolean isNew) throws RepositoryException {
this.node = node;
- this.parent = parent;
+ this.isNew = isNew;
isCheckedOut = node == null || !node.isNodeType(JcrConstants.MIX_VERSIONABLE) || node.isCheckedOut();
}
@@ -1280,16 +1286,22 @@ public class DocViewSAXImporter extends
}
public void restoreOrder() throws RepositoryException {
- if (childNames.needsReorder(node)) {
+ if (!isNew && childNames.needsReorder(node)) {
ensureCheckedOut();
childNames.restoreOrder(node);
}
}
- public StackElement push(Node node) throws RepositoryException {
- return new StackElement(this, node);
+ public StackElement push() throws RepositoryException {
+ return push(new StackElement(null, false));
}
+ public StackElement push(StackElement elem) throws RepositoryException {
+ elem.parent = this;
+ return elem;
+ }
+
+
public StackElement pop() {
return parent;
}
Modified: jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/FileArtifactHandler.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/FileArtifactHandler.java?rev=1567854&r1=1567853&r2=1567854&view=diff
==============================================================================
--- jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/FileArtifactHandler.java (original)
+++ jackrabbit/commons/filevault/trunk/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/FileArtifactHandler.java Thu Feb 13 07:01:57 2014
@@ -170,12 +170,13 @@ public class FileArtifactHandler extends
if (file.getSerializationType() == SerializationType.GENERIC
|| file.getSerializationType() == SerializationType.XML_GENERIC) {
// case 1: new file
- if (!parent.hasNode(file.getRelativePath())) {
- importFile(info, parent, file);
+ final String fileName = file.getRelativePath();
+ if (!parent.hasNode(fileName)) {
+ importFile(info, parent, file, fileName, false);
} else {
// case 2: same structure, new data
if (file instanceof ImportArtifact) {
- Node fileNode = parent.getNode(file.getRelativePath());
+ Node fileNode = parent.getNode(fileName);
// check import mode, only replace if not MERGE
if (wspFilter.getImportMode(fileNode.getPath()) != ImportMode.MERGE) {
if (!fileNode.hasNode(JcrConstants.JCR_CONTENT)) {
@@ -264,13 +265,17 @@ public class FileArtifactHandler extends
}
return info;
}
-
private Node importFile(ImportInfo info, Node parent, Artifact primary)
throws RepositoryException, IOException {
String name = primary.getRelativePath();
+ return importFile(info, parent, primary, name, parent.hasNode(name));
+ }
+
+ private Node importFile(ImportInfo info, Node parent, Artifact primary, String name, boolean exists)
+ throws RepositoryException, IOException {
Node fileNode;
Node contentNode;
- if (parent.hasNode(name)) {
+ if (exists) {
fileNode = parent.getNode(name);
if (!fileNode.isNodeType(JcrConstants.NT_FILE)) {
parent.refresh(false);