Author: areshetnyak
Date: 2010-08-30 02:26:51 -0400 (Mon, 30 Aug 2010)
New Revision: 3000
Added:
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/NodePropertiesInfo.java
Modified:
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/DocumentViewImporter.java
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/SystemViewImporter.java
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/dataflow/ImportPropertyData.java
jcr/branches/1.12.x/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/importing/TestImport.java
Log:
EXOJCR-880 : Determine if property is multi or single value from nodetype definition in
import was implemented.
Modified:
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/DocumentViewImporter.java
===================================================================
---
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/DocumentViewImporter.java 2010-08-27
14:50:10 UTC (rev 2999)
+++
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/DocumentViewImporter.java 2010-08-30
06:26:51 UTC (rev 3000)
@@ -36,6 +36,7 @@
import org.exoplatform.services.jcr.datamodel.QPath;
import org.exoplatform.services.jcr.datamodel.ValueData;
import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.core.JCRName;
import org.exoplatform.services.jcr.impl.core.LocationFactory;
import org.exoplatform.services.jcr.impl.core.RepositoryImpl;
import org.exoplatform.services.jcr.impl.core.value.BaseValue;
@@ -344,19 +345,41 @@
// determinating is property multivalue;
if (values.size() == 1)
{
- // there is single-value defeniton
- if (defs.getDefinition(false) != null)
+ PropertyDefinitionDatas vhdefs = null;
+
+ if (defs.getAnyDefinition().isResidualSet())
{
- if (defs.getDefinition(false).isResidualSet() &&
nodeData.getPrimaryTypeName().equals(Constants.NT_FROZENNODE)
- && propName.equals(Constants.JCR_PREDECESSORS))
+ if
(nodeData.getQPath().isDescendantOf(Constants.JCR_VERSION_STORAGE_PATH))
{
- /// TODO EXOJCR-865
- isMultivalue = true;
+ if
(nodeData.getPrimaryTypeName().equals(Constants.NT_FROZENNODE))
+ {
+ // get primaryType
+ InternalQName fptName =
locationFactory.parseJCRName(atts.get("jcr:frozenPrimaryType")).getInternalName();
+
+ // get mixin types
+ List<JCRName> mtNames =
getJCRNames(atts.get("jcr:frozenMixinTypes"));
+
+ InternalQName fmtName[] = new InternalQName[mtNames.size()];
+
+ for (int i = 0; i < mtNames.size(); i++)
+ {
+ fmtName[i] = new
InternalQName(mtNames.get(i).getNamespace(), mtNames.get(i).getName());
+ }
+
+ vhdefs = nodeTypeDataManager.getPropertyDefinitions(propName,
fptName, fmtName);
+
+ if (vhdefs != null)
+ {
+ isMultivalue = (vhdefs.getDefinition(true) != null ? true :
false);
+ }
+ }
}
- else
- {
+ }
+
+ // there is single-value defeniton
+ if (vhdefs == null && defs.getDefinition(false) != null)
+ {
isMultivalue = false;
- }
}
}
else
@@ -396,6 +419,28 @@
createVersionHistory(nodeData);
}
}
+
+ private List<JCRName> getJCRNames(String string) throws RepositoryException
+ {
+ List<JCRName> mtNames = new ArrayList<JCRName>();
+
+ StringTokenizer spaceToken = new StringTokenizer(string);
+
+ List<String> denormalizedStrings = new ArrayList<String>();
+ while (spaceToken.hasMoreTokens())
+ {
+ String elem = spaceToken.nextToken();
+ String denormalizeString = StringConverter.denormalizeString(elem);
+ denormalizedStrings.add(denormalizeString);
+ }
+
+ for (String mixinName : denormalizedStrings)
+ {
+ mtNames.add(locationFactory.parseJCRName(mixinName));
+ }
+
+ return mtNames;
+ }
private ImportNodeData createNode(List<NodeTypeData> nodeTypes,
HashMap<InternalQName, String> propertiesMap,
List<InternalQName> mixinNodeTypes, InternalQName jcrName) throws
PathNotFoundException, IllegalPathException,
Added:
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/NodePropertiesInfo.java
===================================================================
---
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/NodePropertiesInfo.java
(rev 0)
+++
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/NodePropertiesInfo.java 2010-08-30
06:26:51 UTC (rev 3000)
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2003-2010 eXo Platform SAS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not,
see<http://www.gnu.org/licenses/>.
+ */
+package org.exoplatform.services.jcr.impl.xml.importing;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.exoplatform.services.jcr.impl.xml.importing.dataflow.ImportNodeData;
+import org.exoplatform.services.jcr.impl.xml.importing.dataflow.ImportPropertyData;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * <br/>Date: 2010
+ *
+ * @author <a href="mailto:alex.reshetnyak@exoplatform.com.ua">Alex
Reshetnyak</a>
+ * @version $Id: NodePropertiesInfo.java 2990 2010-08-26 07:24:28Z areshetnyak $
+ */
+public class NodePropertiesInfo
+{
+
+ private final ImportNodeData node;
+
+ private final List<ImportPropertyData> properties = new
ArrayList<ImportPropertyData>();
+
+ public NodePropertiesInfo(ImportNodeData newNodeData)
+ {
+ this.node = newNodeData;
+ }
+
+ public void addProperty(ImportPropertyData propertyData)
+ {
+ properties.add(propertyData);
+ }
+
+ public ImportNodeData getNode()
+ {
+ return node;
+ }
+
+ public List<ImportPropertyData> getProperties()
+ {
+ return properties;
+ }
+
+}
Modified:
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/SystemViewImporter.java
===================================================================
---
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/SystemViewImporter.java 2010-08-27
14:50:10 UTC (rev 2999)
+++
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/SystemViewImporter.java 2010-08-30
06:26:51 UTC (rev 3000)
@@ -18,12 +18,28 @@
*/
package org.exoplatform.services.jcr.impl.xml.importing;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.jcr.NamespaceRegistry;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.ValueFormatException;
+import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.nodetype.NoSuchNodeTypeException;
+
import org.exoplatform.services.jcr.access.AccessManager;
import org.exoplatform.services.jcr.core.ExtendedPropertyType;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionDatas;
import org.exoplatform.services.jcr.dataflow.ItemDataConsumer;
import org.exoplatform.services.jcr.dataflow.ItemState;
+import org.exoplatform.services.jcr.datamodel.IllegalNameException;
import org.exoplatform.services.jcr.datamodel.IllegalPathException;
import org.exoplatform.services.jcr.datamodel.InternalQName;
import org.exoplatform.services.jcr.datamodel.NodeData;
@@ -46,20 +62,6 @@
import org.exoplatform.services.log.Log;
import org.exoplatform.services.security.ConversationState;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import javax.jcr.NamespaceRegistry;
-import javax.jcr.PathNotFoundException;
-import javax.jcr.PropertyType;
-import javax.jcr.RepositoryException;
-import javax.jcr.ValueFormatException;
-import javax.jcr.nodetype.ConstraintViolationException;
-import javax.jcr.nodetype.NoSuchNodeTypeException;
-
/**
* Created by The eXo Platform SAS.
*
@@ -74,6 +76,8 @@
private static Log log =
ExoLogger.getLogger("exo.jcr.component.core.SystemViewImporter");
protected PropertyInfo propertyInfo = new PropertyInfo();
+
+ protected Map<String, NodePropertiesInfo> mapNodePropertiesInfo = new
HashMap<String, NodePropertiesInfo>();
/**
* Root node name.
@@ -150,7 +154,15 @@
ImportPropertyData propertyData = endProperty();
if (propertyData != null)
+ {
changesLog.add(new ItemState(propertyData, ItemState.ADDED, true,
getAncestorToSave()));
+
+ ImportNodeData currentNodeInfo = (ImportNodeData)getParent();
+
+ NodePropertiesInfo currentNodePropertiesInfo =
mapNodePropertiesInfo.get(currentNodeInfo.getQPath().getAsString());
+
+ currentNodePropertiesInfo.addProperty(propertyData);
+ }
}
else if (Constants.SV_VALUE_NAME.equals(elementName))
{
@@ -206,6 +218,8 @@
newNodeData.setIdentifier(IdGenerator.generate());
changesLog.add(new ItemState(newNodeData, ItemState.ADDED, true,
getAncestorToSave()));
+
+ mapNodePropertiesInfo.put(newNodeData.getQPath().getAsString(), new
NodePropertiesInfo(newNodeData));
tree.push(newNodeData);
@@ -293,6 +307,15 @@
{
ImportNodeData currentNodeInfo = (ImportNodeData)tree.pop();
+ NodePropertiesInfo currentNodePropertiesInfo =
mapNodePropertiesInfo.get(currentNodeInfo.getQPath().getAsString());
+
+ if (currentNodePropertiesInfo != null)
+ {
+ checkPropertis(currentNodePropertiesInfo);
+ }
+
+ mapNodePropertiesInfo.remove(currentNodeInfo.getQPath().getAsString());
+
currentNodeInfo.setMixinTypeNames(currentNodeInfo.getMixinTypeNames());
if (currentNodeInfo.isMixVersionable())
@@ -303,7 +326,84 @@
currentNodeInfo.setACL(initAcl(currentNodeInfo.getACL(),
currentNodeInfo.isExoOwneable(), currentNodeInfo
.isExoPrivilegeable(), currentNodeInfo.getExoOwner(),
currentNodeInfo.getExoPrivileges()));
}
+
+ /**
+ * Checking priopertis if nodetype is nt:frozennode
+ *
+ * @param currentNodePropertiesInfo
+ * @throws RepositoryException
+ * @throws IOException
+ * @throws IllegalNameException
+ * @throws IllegalStateException
+ */
+ private void checkPropertis(NodePropertiesInfo currentNodePropertiesInfo) throws
RepositoryException
+ {
+ if
(currentNodePropertiesInfo.getNode().getQPath().isDescendantOf(Constants.JCR_VERSION_STORAGE_PATH)
+ &&
currentNodePropertiesInfo.getNode().getPrimaryTypeName().equals(Constants.NT_FROZENNODE))
+ {
+ // name of frozenPrimaryType property
+ InternalQName fptPropertyName =
locationFactory.parseJCRName("jcr:frozenPrimaryType").getInternalName();
+ // node of frozenMixinTypes property
+ InternalQName fmtPropertyName =
locationFactory.parseJCRName("jcr:frozenMixinTypes").getInternalName();
+
+ InternalQName fptName = null;
+ List<InternalQName> fmtNames = new ArrayList<InternalQName>();
+
+ // get frozenPrimaryType and frozenMixinTypes
+ try
+ {
+ for (ImportPropertyData propertyData :
currentNodePropertiesInfo.getProperties())
+ {
+ if (propertyData.getQName().equals(fptPropertyName))
+ {
+ fptName = InternalQName.parse(new
String(propertyData.getValues().get(0).getAsByteArray()));
+ }
+ else if (propertyData.getQName().equals(fmtPropertyName))
+ {
+ for (ValueData valueData : propertyData.getValues())
+ {
+ fmtNames.add(InternalQName.parse(new
String(valueData.getAsByteArray())));
+ }
+ }
+ }
+ }
+ catch (IllegalStateException e)
+ {
+ throw new RepositoryException(e.getMessage(), e);
+ }
+ catch (IllegalNameException e)
+ {
+ throw new RepositoryException(e.getMessage(), e);
+ }
+ catch (IOException e)
+ {
+ throw new RepositoryException(e.getMessage(), e);
+ }
+
+ InternalQName nodePrimaryTypeName =
currentNodePropertiesInfo.getNode().getPrimaryTypeName();
+ InternalQName[] nodeMixinTypeName =
currentNodePropertiesInfo.getNode().getMixinTypeNames();
+
+ for (ImportPropertyData propertyData :
currentNodePropertiesInfo.getProperties())
+ {
+ PropertyDefinitionDatas defs =
nodeTypeDataManager.getPropertyDefinitions(propertyData.getQName(), nodePrimaryTypeName,
nodeMixinTypeName);
+
+ if (defs == null || (defs != null &&
defs.getAnyDefinition().isResidualSet()))
+ {
+ PropertyDefinitionDatas vhdefs =
+
nodeTypeDataManager.getPropertyDefinitions(propertyData.getQName(), fptName, fmtNames
+ .toArray(new InternalQName[fmtNames.size()]));
+
+ if (vhdefs != null)
+ {
+ boolean isMultivalue = (vhdefs.getDefinition(true) != null ? true :
false);
+ propertyData.setMultivalue(isMultivalue);
+ }
+ }
+ }
+ }
+ }
+
/**
* endPrimaryType.
*
@@ -414,16 +514,7 @@
// there is single-value defeniton
if (defs.getDefinition(false) != null)
{
- if (defs.getDefinition(false).isResidualSet() &&
currentNodeInfo.getPrimaryTypeName().equals(Constants.NT_FROZENNODE)
- &&
propertyInfo.getName().equals(Constants.JCR_PREDECESSORS))
- {
- /// TODO EXOJCR-865
- isMultivalue = true;
- }
- else
- {
- isMultivalue = false;
- }
+ isMultivalue = false;
}
}
else
@@ -481,6 +572,9 @@
}
tree.push(currentNodeInfo);
+
+ mapNodePropertiesInfo.put(currentNodeInfo.getQPath().getAsString(), new
NodePropertiesInfo(currentNodeInfo));
+
return propertyData;
}
Modified:
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/dataflow/ImportPropertyData.java
===================================================================
---
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/dataflow/ImportPropertyData.java 2010-08-27
14:50:10 UTC (rev 2999)
+++
jcr/branches/1.12.x/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/dataflow/ImportPropertyData.java 2010-08-30
06:26:51 UTC (rev 3000)
@@ -80,8 +80,21 @@
{
this.parentIdentifier = identifer;
}
+
+ /**
+ * Set multiValued;
+ *
+ * @param multiValue
+ * - multi value
+ */
+ public void setMultivalue(boolean multiValue)
+ {
+ this.multiValued = multiValue;
+ }
/**
+
+ /**
* Set path of item.
*
* @param path
Modified:
jcr/branches/1.12.x/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/importing/TestImport.java
===================================================================
---
jcr/branches/1.12.x/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/importing/TestImport.java 2010-08-27
14:50:10 UTC (rev 2999)
+++
jcr/branches/1.12.x/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/importing/TestImport.java 2010-08-30
06:26:51 UTC (rev 3000)
@@ -557,7 +557,7 @@
byte[] versionableNode = serialize(fileNode, false, true);
// version history
byte[] versionHistory = serialize(fileNode.getVersionHistory(), false, true);
- System.out.println(new String(versionHistory));
+ // System.out.println(new String(versionHistory));
fileNode.remove();
session.save();
assertFalse(testRoot.hasNode("TestJCR1247"));
@@ -1046,7 +1046,7 @@
byte[] versionableNode = serialize(fileNode, false, true);
// version history
byte[] versionHistory = serialize(fileNode.getVersionHistory(), false, true);
- System.out.println(new String(versionHistory));
+ // System.out.println(new String(versionHistory));
@@ -1129,11 +1129,9 @@
// node content
byte[] versionableNode = serialize(fileNode, true, true);
// version history
- byte[] versionHistory = serialize(fileNode.getVersionHistory(), false, true);
- System.out.println(new String(versionHistory));
-
+ byte[] versionHistory = serialize(fileNode.getVersionHistory(), true, true);
+ //System.out.println(new String(versionHistory));
-
// restore node content
Node restoreRoot = testRoot.addNode("restRoot");
testRoot.save();
@@ -1367,7 +1365,7 @@
byte[] versionableNode = serialize(web, false, true);
// version history
byte[] versionHistory = serialize(web.getVersionHistory(), false, true);
- System.out.println(new String(versionHistory));
+ // System.out.println(new String(versionHistory));
// restore node content
@@ -1604,7 +1602,7 @@
byte[] versionableNode = serialize(web, true, true);
// version history
byte[] versionHistory = serialize(web.getVersionHistory(), true, true);
- System.out.println(new String(versionHistory));
+ // System.out.println(new String(versionHistory));
// restore node content
@@ -1684,7 +1682,7 @@
byte[] versionableNode = serialize(web, false, true);
// version history
byte[] versionHistory = serialize(web.getVersionHistory(), false, true);
- System.out.println(new String(versionHistory));
+ // System.out.println(new String(versionHistory));
// restore node content
@@ -1764,7 +1762,7 @@
byte[] versionableNode = serialize(web, true, true);
// version history
byte[] versionHistory = serialize(web.getVersionHistory(), true, true);
- System.out.println(new String(versionHistory));
+ // System.out.println(new String(versionHistory));
// restore node content
Node restoreRoot = testRoot.addNode("restRootWeb");
@@ -1802,4 +1800,194 @@
fileImport.checkout();
root.save();
}
+
+ /**
+ *
https://jira.jboss.org/browse/EXOJCR-865
+ *
+ * @throws Exception
+ */
+ public void testEXOJCR865_Doc_exo_links() throws Exception
+ {
+
+ Node testRoot = root.addNode("testRoot");
+ Node fileNode = testRoot.addNode("TestEXOJCR865_exo_links",
"nt:file");
+ Node contentNode = fileNode.addNode("jcr:content",
"nt:resource");
+ contentNode.setProperty("jcr:data", new
ByteArrayInputStream("".getBytes()));
+ contentNode.setProperty("jcr:mimeType", "image/jpg");
+ contentNode.setProperty("jcr:lastModified", Calendar.getInstance());
+ root.save();
+ Node contentNodeBeforeAddVersion = fileNode.getNode("jcr:content");
+
assertNotNull(contentNodeBeforeAddVersion.getProperty("jcr:lastModified"));
+ if (fileNode.canAddMixin("mix:versionable"))
+ {
+ fileNode.addMixin("mix:versionable");
+ }
+
+ fileNode.addMixin("exo:linkable");
+
+ fileNode.setProperty("exo:links", new String[] {"1"});
+
+ fileNode.save();
+ fileNode.checkin();
+ fileNode.checkout();
+ root.save();
+
+ fileNode.checkin();
+ fileNode.checkout();
+ root.save();
+
+ fileNode.checkin();
+ fileNode.checkout();
+ root.save();
+
+ String nodeDump = dumpVersionable(fileNode);
+ // Export VersionHistory
+
+ assertTrue(fileNode.isNodeType("mix:versionable"));
+
+ VersionableNodeInfo nodeInfo = new VersionableNodeInfo(fileNode);
+
+ // node content
+ byte[] versionableNode = serialize(fileNode, false, true);
+ // version history
+ byte[] versionHistory = serialize(fileNode.getVersionHistory(), false, true);
+ //System.out.println(new String(versionHistory));
+
+ // restore node content
+ Node restoreRoot = testRoot.addNode("restRoot");
+ testRoot.save();
+
+ deserialize(restoreRoot, XmlSaveType.SESSION, true,
ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING,
+ new ByteArrayInputStream(versionableNode));
+ root.save();
+
+ assertTrue(restoreRoot.hasNode("TestEXOJCR865_exo_links"));
+
+ Node fileImport = restoreRoot.getNode("TestEXOJCR865_exo_links");
+ assertTrue(fileImport.isNodeType("mix:versionable"));
+
+ VersionHistoryImporter versionHistoryImporter =
+ new VersionHistoryImporter((NodeImpl)fileImport, new
ByteArrayInputStream(versionHistory), nodeInfo
+ .getBaseVersion(), nodeInfo.getPredecessorsHistory(),
nodeInfo.getVersionHistory());
+ versionHistoryImporter.doImport();
+ root.save();
+
+ Property property = fileImport.getProperty("exo:links");
+ assertNotNull(property);
+ assertNotNull(property.getDefinition());
+
+ property = fileImport.getProperty("jcr:predecessors");
+ assertNotNull(property);
+ assertNotNull(property.getDefinition());
+
+ fileImport.restore("2", true);
+ root.save();
+
+ property = fileImport.getProperty("exo:links");
+ assertNotNull(property);
+ assertNotNull(property.getDefinition());
+
+ property = fileImport.getProperty("jcr:predecessors");
+ assertNotNull(property);
+ assertNotNull(property.getDefinition());
+
+ fileImport.checkin();
+ fileImport.checkout();
+ root.save();
+ }
+
+ /**
+ *
https://jira.jboss.org/browse/EXOJCR-865
+ *
+ * @throws Exception
+ */
+ public void testEXOJCR865_Sys_exo_links() throws Exception
+ {
+
+ Node testRoot = root.addNode("testRoot");
+ Node fileNode = testRoot.addNode("TestEXOJCR865_exo_links",
"nt:file");
+ Node contentNode = fileNode.addNode("jcr:content",
"nt:resource");
+ contentNode.setProperty("jcr:data", new
ByteArrayInputStream("".getBytes()));
+ contentNode.setProperty("jcr:mimeType", "image/jpg");
+ contentNode.setProperty("jcr:lastModified", Calendar.getInstance());
+ root.save();
+ Node contentNodeBeforeAddVersion = fileNode.getNode("jcr:content");
+
assertNotNull(contentNodeBeforeAddVersion.getProperty("jcr:lastModified"));
+ if (fileNode.canAddMixin("mix:versionable"))
+ {
+ fileNode.addMixin("mix:versionable");
+ }
+
+ fileNode.addMixin("exo:linkable");
+
+ fileNode.setProperty("exo:links", new String[] {"1"});
+
+ fileNode.save();
+ fileNode.checkin();
+ fileNode.checkout();
+ root.save();
+
+ fileNode.checkin();
+ fileNode.checkout();
+ root.save();
+
+ fileNode.checkin();
+ fileNode.checkout();
+ root.save();
+
+ String nodeDump = dumpVersionable(fileNode);
+ // Export VersionHistory
+
+ assertTrue(fileNode.isNodeType("mix:versionable"));
+
+ VersionableNodeInfo nodeInfo = new VersionableNodeInfo(fileNode);
+
+ // node content
+ byte[] versionableNode = serialize(fileNode, true, true);
+ // version history
+ byte[] versionHistory = serialize(fileNode.getVersionHistory(), true, true);
+ //System.out.println(new String(versionHistory));
+
+ // restore node content
+ Node restoreRoot = testRoot.addNode("restRoot");
+ testRoot.save();
+
+ deserialize(restoreRoot, XmlSaveType.SESSION, true,
ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING,
+ new ByteArrayInputStream(versionableNode));
+ root.save();
+
+ assertTrue(restoreRoot.hasNode("TestEXOJCR865_exo_links"));
+
+ Node fileImport = restoreRoot.getNode("TestEXOJCR865_exo_links");
+ assertTrue(fileImport.isNodeType("mix:versionable"));
+
+ VersionHistoryImporter versionHistoryImporter =
+ new VersionHistoryImporter((NodeImpl)fileImport, new
ByteArrayInputStream(versionHistory), nodeInfo
+ .getBaseVersion(), nodeInfo.getPredecessorsHistory(),
nodeInfo.getVersionHistory());
+ versionHistoryImporter.doImport();
+ root.save();
+
+ Property property = fileImport.getProperty("exo:links");
+ assertNotNull(property);
+ assertNotNull(property.getDefinition());
+
+ property = fileImport.getProperty("jcr:predecessors");
+ assertNotNull(property);
+ assertNotNull(property.getDefinition());
+
+ fileImport.restore("2", true);
+ root.save();
+
+ property = fileImport.getProperty("jcr:predecessors");
+ assertNotNull(property);
+ assertNotNull(property.getDefinition());
+
+ property = fileImport.getProperty("exo:links");
+ assertNotNull(property);
+ assertNotNull(property.getDefinition());
+
+ fileImport.checkin();
+ fileImport.checkout();
+ root.save();
+ }
}