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 2004/12/15 17:26:31 UTC
svn commit: r111990 - /incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/SysViewImportHandler.java
Author: tripod
Date: Wed Dec 15 08:26:30 2004
New Revision: 111990
URL: http://svn.apache.org/viewcvs?view=rev&rev=111990
Log:
- fixed resolving of references (JCR-33)
Modified:
incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/SysViewImportHandler.java
Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/SysViewImportHandler.java
Url: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/SysViewImportHandler.java?view=diff&rev=111990&p1=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/SysViewImportHandler.java&r1=111989&p2=incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/SysViewImportHandler.java&r2=111990
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/SysViewImportHandler.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/xml/SysViewImportHandler.java Wed Dec 15 08:26:30 2004
@@ -18,6 +18,7 @@
import org.apache.jackrabbit.core.*;
import org.apache.jackrabbit.core.version.VersionManager;
import org.apache.jackrabbit.core.nodetype.NodeTypeImpl;
+import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry;
import org.apache.jackrabbit.core.util.Base64;
import org.apache.jackrabbit.core.util.ValueHelper;
import org.apache.log4j.Logger;
@@ -32,8 +33,7 @@
import javax.jcr.nodetype.ConstraintViolationException;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Stack;
+import java.util.*;
/**
* <code>SysViewImportHandler</code> ...
@@ -51,6 +51,12 @@
*/
private Stack stateStack = new Stack();
+ /** list of all reference properties that need to be adjusted */
+ private LinkedList references = new LinkedList();
+
+ /** list of all mix:referenceable */
+ private HashMap referees = new HashMap();
+
/**
* fields used temporarily while processing sv:property and sv:value elements
*/
@@ -292,6 +298,9 @@
try {
// try setting single-value
current.node.setProperty(currentPropName, vals[0]);
+ } catch (ValueFormatException vfe) {
+ // try setting value array
+ current.node.setProperty(currentPropName, vals);
} catch (ConstraintViolationException vfe) {
// try setting value array
current.node.setProperty(currentPropName, vals);
@@ -300,6 +309,10 @@
// can only be multi-valued (n == 0 || n > 1)
current.node.setProperty(currentPropName, vals);
}
+ // check if reference for later resolution
+ if (currentPropType==PropertyType.REFERENCE) {
+ references.add(current.node.getProperty(currentPropName));
+ }
}
// reset temp fields
@@ -331,21 +344,71 @@
NodeDef def = state.node.getDefinition();
if (def.isProtected()) {
// @todo how to handle protected/auto-created child node?
- return;
+
} else if (def.isAutoCreate()) {
// @todo how to handle protected/auto-created child node?
- return;
- }
- }
- state.node = (NodeImpl) state.parent.addNode(state.nodeName, state.primaryType);
- if (state.mixinTypes != null) {
- for (int i = 0; i < state.mixinTypes.size(); i++) {
- NodeTypeImpl mixin = session.getNodeTypeManager().getNodeType((QName) state.mixinTypes.get(i));
- state.node.addMixin(mixin.getName());
}
- }
+ } else {
+ state.node = (NodeImpl) state.parent.addNode(state.nodeName, state.primaryType);
+ if (state.mixinTypes != null) {
+ for (int i = 0; i < state.mixinTypes.size(); i++) {
+ NodeTypeImpl mixin = session.getNodeTypeManager().getNodeType((QName) state.mixinTypes.get(i));
+ state.node.addMixin(mixin.getName());
+ }
+ }
+ }
+
+ // check for mix:referenceable
+ if (state.node.isNodeType(NodeTypeRegistry.MIX_REFERENCEABLE)) {
+ log.info("adding refereee: ori=" + state.uuid + " new=" + state.node.getUUID());
+ referees.put(state.uuid, state.node.getUUID());
+ }
+ }
+
+ public void endDocument() throws SAXException {
+ try {
+ // adjust all reference properties
+ Iterator iter = references.iterator();
+ while (iter.hasNext()) {
+ Property prop = (Property) iter.next();
+ if (prop.getDefinition().isMultiple()) {
+ Value[] values = prop.getValues();
+ Value[] newVals = new Value[values.length];
+ for (int i=0; i<values.length; i++) {
+ Value val = values[i];
+ if (val.getType()==PropertyType.REFERENCE) {
+ String original = val.getString();
+ String adjusted = (String) referees.get(original);
+ if (adjusted==null) {
+ log.error("Reference " + original + " of property can not be adjusted! " + prop.getPath());
+ newVals[i] = val;
+ } else {
+ newVals[i] = new ReferenceValue(session.getNodeByUUID(adjusted));
+ }
+ } else {
+ newVals[i] = val;
+ }
+ }
+ prop.setValue(newVals);
+ } else {
+ Value val = prop.getValue();
+ if (val.getType()==PropertyType.REFERENCE) {
+ String original = val.getString();
+ String adjusted = (String) referees.get(original);
+ if (adjusted==null) {
+ log.error("Reference " + original + " of property can not be adjusted! " + prop.getPath());
+ } else {
+ prop.setValue(session.getNodeByUUID(adjusted));
+ }
+ }
+ }
+ }
+ } catch (RepositoryException e) {
+ log.error("Error while adjusting reference proerties: " + e.toString());
+ }
}
+
//--------------------------------------------------------< inner classes >
class ImportState {