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 ef74c9d809d9cfc3842a8b9c7743dd0ac472733a Author: Carsten Ziegeler <[email protected]> AuthorDate: Wed Jul 2 14:36:49 2008 +0000 SLING-553 Allow references and paths to be loaded from JSON through JsonReader. Applied patch by Bryce Ewing. git-svn-id: https://svn.apache.org/repos/asf/incubator/sling/trunk/jcr/contentloader@673405 13f79535-47bb-0310-9956-ffa450edef68 --- .../jcr/contentloader/internal/ContentLoader.java | 66 +++++++++++++++++++++- .../jcr/contentloader/internal/JsonReader.java | 24 ++++++-- 2 files changed, 81 insertions(+), 9 deletions(-) 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 e89389c..233488f 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 @@ -52,6 +52,7 @@ public class ContentLoader implements ContentCreator { /** Delayed references during content loading for the reference property. */ private final Map<String, List<String>> delayedReferences = new HashMap<String, List<String>>(); + private final Map<String, String[]> delayedMultipleReferences = new HashMap<String, String[]>(); private String defaultRootName; @@ -231,7 +232,7 @@ public class ContentLoader implements ContentCreator { if ( propertyType == PropertyType.REFERENCE ) { // need to resolve the reference String propPath = node.getPath() + "/" + name; - String uuid = getUUID(node.getSession(), propPath, value); + String uuid = getUUID(node.getSession(), propPath, getAbsPath(node, value)); if (uuid != null) { node.setProperty(name, uuid, propertyType); } @@ -262,7 +263,26 @@ public class ContentLoader implements ContentCreator { && !node.getProperty(name).isNew()) { return; } - node.setProperty(name, values, propertyType); + if ( propertyType == PropertyType.REFERENCE ) { + String propPath = node.getPath() + "/" + name; + + boolean hasAll = true; + String[] uuids = new String[values.length]; + String[] uuidOrPaths = new String[values.length]; + for (int i = 0; i < values.length; i++) { + uuids[i] = getUUID(node.getSession(), propPath, getAbsPath(node, values[i])); + uuidOrPaths[i] = uuids[i] != null ? uuids[i] : getAbsPath(node, values[i]); + if (uuids[i] == null) hasAll = false; + } + + node.setProperty(name, uuids, propertyType); + + if (!hasAll) { + delayedMultipleReferences.put(propPath, uuidOrPaths); + } + } else { + node.setProperty(name, values, propertyType); + } } protected Value createValue(final ValueFactory factory, Object value) { @@ -343,6 +363,21 @@ public class ContentLoader implements ContentCreator { resolveReferences(node); } + private String getAbsPath(Node node, String path) throws RepositoryException { + if (path.startsWith("/")) return path; + + while (path.startsWith("../")) { + path = path.substring(3); + node = node.getParent(); + } + + while (path.startsWith("./")) { + path = path.substring(2); + } + + return node.getPath() + "/" + path; + } + private String getUUID(Session session, String propPath, String referencePath) throws RepositoryException { @@ -386,7 +421,32 @@ public class ContentLoader implements ContentCreator { String name = getName(property); Node parentNode = getParentNode(session, property); if (parentNode != null) { - parentNode.setProperty(name, uuid, PropertyType.REFERENCE); + if (parentNode.hasProperty(name) && parentNode.getProperty(name).getDefinition().isMultiple()) { + boolean hasAll = true; + String[] uuidOrPaths = delayedMultipleReferences.get(property); + String[] uuids = new String[uuidOrPaths.length]; + for (int i = 0; i < uuidOrPaths.length; i++) { + // is the reference still a path + if (uuidOrPaths[i].startsWith("/")) { + if (uuidOrPaths[i].equals(node.getPath())) { + uuidOrPaths[i] = uuid; + uuids[i] = uuid; + } else { + uuids[i] = null; + hasAll = false; + } + } else { + uuids[i] = uuidOrPaths[i]; + } + } + parentNode.setProperty(name, uuids, PropertyType.REFERENCE); + + if (hasAll) { + delayedMultipleReferences.remove(property); + } + } else { + parentNode.setProperty(name, uuid, PropertyType.REFERENCE); + } } } } diff --git a/src/main/java/org/apache/sling/jcr/contentloader/internal/JsonReader.java b/src/main/java/org/apache/sling/jcr/contentloader/internal/JsonReader.java index 26fe520..78a7f3e 100644 --- a/src/main/java/org/apache/sling/jcr/contentloader/internal/JsonReader.java +++ b/src/main/java/org/apache/sling/jcr/contentloader/internal/JsonReader.java @@ -38,6 +38,9 @@ import org.apache.sling.commons.json.JSONObject; */ class JsonReader implements ContentReader { + private static final String REFERENCE = "jcr:reference:"; + private static final String PATH = "jcr:path:"; + private static final Set<String> ignoredNames = new HashSet<String>(); static { ignoredNames.add("jcr:primaryType"); @@ -128,32 +131,41 @@ class JsonReader implements ContentReader { for (int i = 0; i < array.length(); i++) { values[i] = array.get(i).toString(); } - final int propertyType = getType(values[0]); - contentCreator.createProperty(name, propertyType, values); + final int propertyType = getType(name, values[0]); + contentCreator.createProperty(getName(name), propertyType, values); } else { - contentCreator.createProperty(name, PropertyType.STRING, new String[0]); + contentCreator.createProperty(getName(name), PropertyType.STRING, new String[0]); } } else { // single value - final int propertyType = getType(value); - contentCreator.createProperty(name, propertyType, String.valueOf(value)); + final int propertyType = getType(name, value); + contentCreator.createProperty(getName(name), propertyType, value.toString()); } } - protected int getType(Object object) { + protected int getType(String name, Object object) { if (object instanceof Double || object instanceof Float) { return PropertyType.DOUBLE; } else if (object instanceof Number) { return PropertyType.LONG; } else if (object instanceof Boolean) { return PropertyType.BOOLEAN; + } else if (object instanceof String) { + if (name.startsWith(REFERENCE)) return PropertyType.REFERENCE; + if (name.startsWith(PATH)) return PropertyType.PATH; } // fall back to default return PropertyType.STRING; } + protected String getName(String name) { + if (name.startsWith(REFERENCE)) return name.substring(REFERENCE.length()); + if (name.startsWith(PATH)) return name.substring(PATH.length()); + return name; + } + private String toString(InputStream ins) throws IOException { if (!ins.markSupported()) { ins = new BufferedInputStream(ins); -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
