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.1.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-contentloader.git
commit fda07c0691badf1cf52b974fb049da46ecc2ab8f Author: Eric Norman <[email protected]> AuthorDate: Fri Aug 6 22:23:05 2010 +0000 SLING-1627 import operation support for overwrite of properties git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/jcr/contentloader@983135 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 6 ++ .../sling/jcr/contentloader/ImportOptions.java | 24 ++++++ .../internal/DefaultContentCreator.java | 8 +- .../jcr/contentloader/internal/PathEntry.java | 27 +++++- .../internal/DefaultContentCreatorTest.java | 97 ++++++++++++++++++++++ 5 files changed, 158 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 05718ef..eb2c58f 100644 --- a/pom.xml +++ b/pom.xml @@ -161,6 +161,12 @@ <groupId>org.jmock</groupId> <artifactId>jmock-junit4</artifactId> </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-nop</artifactId> + <version>1.5.2</version> + <scope>test</scope> + </dependency> <!-- for security content loader (users/groups/acls) --> <dependency> diff --git a/src/main/java/org/apache/sling/jcr/contentloader/ImportOptions.java b/src/main/java/org/apache/sling/jcr/contentloader/ImportOptions.java index fa3d53c..b380f8b 100644 --- a/src/main/java/org/apache/sling/jcr/contentloader/ImportOptions.java +++ b/src/main/java/org/apache/sling/jcr/contentloader/ImportOptions.java @@ -24,10 +24,34 @@ package org.apache.sling.jcr.contentloader; */ public abstract class ImportOptions { + /** + * Specifies whether imported nodes should overwrite existing nodes. + * NOTE: this means the existing node will be deleted and a new node + * will be created in the same location. + * @return true to overwrite nodes, false otherwise + */ public abstract boolean isOverwrite(); + /** + * Specifies whether imported properties should overwrite existing properties. + * @return true to overwrite node properties, false otherwise + */ + public abstract boolean isPropertyOverwrite(); + + /** + * Specifies whether versionable nodes is automatically checked in at the + * end of the import operation. + * @return true to checkin the versionable nodes, false otherwise + */ public abstract boolean isCheckin(); + /** + * Check if the import provider for the given file extension should + * be ignored. + * + * @param extension the extension to check + * @return true to ignore the provider, false otherwise + */ public abstract boolean isIgnoredImportProvider(String extension); } \ No newline at end of file diff --git a/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreator.java b/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreator.java index 97bf1b9..a67b72f 100644 --- a/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreator.java +++ b/src/main/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreator.java @@ -307,9 +307,10 @@ public class DefaultContentCreator implements ContentCreator { public void createProperty(String name, int propertyType, String value) throws RepositoryException { final Node node = this.parentNodeStack.peek(); - // check if the property already exists, don't overwrite it in this case + // check if the property already exists and isPropertyOverwrite() is false, don't overwrite it in this case if (node.hasProperty(name) - && !node.getProperty(name).isNew()) { + && !this.configuration.isPropertyOverwrite() + && !node.getProperty(name).isNew()) { return; } @@ -364,8 +365,9 @@ public class DefaultContentCreator implements ContentCreator { public void createProperty(String name, int propertyType, String[] values) throws RepositoryException { final Node node = this.parentNodeStack.peek(); - // check if the property already exists, don't overwrite it in this case + // check if the property already exists and isPropertyOverwrite() is false, don't overwrite it in this case if (node.hasProperty(name) + && !this.configuration.isPropertyOverwrite() && !node.getProperty(name).isNew()) { return; } 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 aa003c4..75989a3 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 @@ -41,6 +41,12 @@ public class PathEntry extends ImportOptions { */ public static final String OVERWRITE_DIRECTIVE = "overwrite"; + /** + * The overwriteProperties directive specifying if content properties + * should be overwritten or just initially added. + */ + public static final String OVERWRITE_PROPERTIES_DIRECTIVE = "overwriteProperties"; + /** The uninstall directive specifying if content should be uninstalled. */ public static final String UNINSTALL_DIRECTIVE = "uninstall"; @@ -75,6 +81,9 @@ public class PathEntry extends ImportOptions { /** Should existing content be overwritten? */ private final boolean overwrite; + /** Should existing content properties be overwritten? */ + private final boolean overwriteProperties; + /** Should existing content be uninstalled? */ private final boolean uninstall; @@ -123,6 +132,14 @@ public class PathEntry extends ImportOptions { this.overwrite = false; } + // overwriteProperties directive + final String overwritePropertiesValue = entry.getDirectiveValue(OVERWRITE_PROPERTIES_DIRECTIVE); + if (overwritePropertiesValue != null) { + this.overwriteProperties = Boolean.valueOf(overwritePropertiesValue); + } else { + this.overwriteProperties = false; + } + // uninstall directive final String uninstallValue = entry.getDirectiveValue(UNINSTALL_DIRECTIVE); if (uninstallValue != null) { @@ -177,7 +194,15 @@ public class PathEntry extends ImportOptions { return this.overwrite; } - public boolean isUninstall() { + /* (non-Javadoc) + * @see org.apache.sling.jcr.contentloader.ImportOptions#isPropertyOverwrite() + */ + @Override + public boolean isPropertyOverwrite() { + return this.overwriteProperties; + } + + public boolean isUninstall() { return this.uninstall; } diff --git a/src/test/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreatorTest.java b/src/test/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreatorTest.java new file mode 100644 index 0000000..c195396 --- /dev/null +++ b/src/test/java/org/apache/sling/jcr/contentloader/internal/DefaultContentCreatorTest.java @@ -0,0 +1,97 @@ +package org.apache.sling.jcr.contentloader.internal; + +import java.util.HashMap; + +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.PropertyType; +import javax.jcr.RepositoryException; + +import org.apache.sling.jcr.contentloader.ImportOptions; +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.jmock.integration.junit4.JMock; +import org.jmock.integration.junit4.JUnit4Mockery; +import org.junit.runner.RunWith; + +@RunWith(JMock.class) +public class DefaultContentCreatorTest { + + DefaultContentCreator contentCreator; + + Mockery mockery = new JUnit4Mockery(); + + Node parentNode; + + Property prop; + + @org.junit.Test public void willRewriteUndefinedPropertyType() throws RepositoryException { + contentCreator = new DefaultContentCreator(null); + parentNode = mockery.mock(Node.class); + prop = mockery.mock(Property.class); + contentCreator.init(new ImportOptions(){ + + @Override + public boolean isCheckin() { + return false; + } + + @Override + public boolean isIgnoredImportProvider(String extension) { + return false; + } + + @Override + public boolean isOverwrite() { + return true; + } + + @Override + public boolean isPropertyOverwrite() { + return true; + } }, new HashMap<String, ImportProvider>(), null, null); + + contentCreator.prepareParsing(parentNode, null); + this.mockery.checking(new Expectations() {{ + oneOf (parentNode).hasProperty("foo"); will(returnValue(Boolean.TRUE)); + oneOf (parentNode).setProperty(with(equal("foo")), with(equal("bar"))); + }}); + contentCreator.createProperty("foo", PropertyType.UNDEFINED, "bar"); + } + + @org.junit.Test public void willNotRewriteUndefinedPropertyType() throws RepositoryException { + contentCreator = new DefaultContentCreator(null); + parentNode = mockery.mock(Node.class); + prop = mockery.mock(Property.class); + contentCreator.init(new ImportOptions(){ + + @Override + public boolean isCheckin() { + return false; + } + + @Override + public boolean isIgnoredImportProvider(String extension) { + return false; + } + + @Override + public boolean isOverwrite() { + return false; + } + + @Override + public boolean isPropertyOverwrite() { + return false; + } }, new HashMap<String, ImportProvider>(), null, null); + + contentCreator.prepareParsing(parentNode, null); + this.mockery.checking(new Expectations() {{ + oneOf (parentNode).hasProperty("foo"); will(returnValue(Boolean.TRUE)); + oneOf (parentNode).getProperty("foo"); will(returnValue(prop)); + oneOf (prop).isNew(); will(returnValue(Boolean.FALSE)); + }}); + contentCreator.createProperty("foo", PropertyType.UNDEFINED, "bar"); + } + +} -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
