You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2008/07/02 16:36:50 UTC
svn commit: r673405 - in
/incubator/sling/trunk/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal:
ContentLoader.java JsonReader.java
Author: cziegeler
Date: Wed Jul 2 07:36:49 2008
New Revision: 673405
URL: http://svn.apache.org/viewvc?rev=673405&view=rev
Log:
SLING-553 Allow references and paths to be loaded from JSON through JsonReader. Applied patch by Bryce Ewing.
Modified:
incubator/sling/trunk/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentLoader.java
incubator/sling/trunk/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/JsonReader.java
Modified: incubator/sling/trunk/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentLoader.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentLoader.java?rev=673405&r1=673404&r2=673405&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentLoader.java (original)
+++ incubator/sling/trunk/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/ContentLoader.java Wed Jul 2 07:36:49 2008
@@ -52,6 +52,7 @@
/** 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 @@
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 @@
&& !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 @@
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 @@
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);
+ }
}
}
}
Modified: incubator/sling/trunk/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/JsonReader.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/JsonReader.java?rev=673405&r1=673404&r2=673405&view=diff
==============================================================================
--- incubator/sling/trunk/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/JsonReader.java (original)
+++ incubator/sling/trunk/jcr/contentloader/src/main/java/org/apache/sling/jcr/contentloader/internal/JsonReader.java Wed Jul 2 07:36:49 2008
@@ -38,6 +38,9 @@
*/
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 @@
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);