/* * 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.api.importing; import org.exoplatform.services.jcr.JcrAPIBaseTest; import org.exoplatform.services.jcr.impl.core.NodeImpl; import org.exoplatform.services.jcr.util.VersionHistoryImporter; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.util.Calendar; import javax.jcr.ImportUUIDBehavior; import javax.jcr.Node; import javax.jcr.Property; import javax.jcr.Value; /** * Created by The eXo Platform SAS Author : eXoPlatform exo@exoplatform.com */ public class TestImportVersionHistory extends JcrAPIBaseTest { Node testRoot; public void setUp() throws Exception { super.setUp(); testRoot = this.root.addNode("parent", "nt:folder"); root.save(); } public void tearDown() throws Exception { testRoot.remove(); root.save(); super.tearDown(); } public void testImportVersionHistory() throws Exception { Node parent = testRoot.addNode("child", "nt:folder"); parent.addMixin("mix:versionable"); Node subNode = parent.addNode("subnode", "nt:file"); subNode.addMixin("mix:referenceable"); Node res = subNode.addNode("jcr:content", "nt:resource"); res.setProperty("jcr:lastModified", Calendar.getInstance()); res.setProperty("jcr:data", new ByteArrayInputStream("".getBytes())); res.setProperty("jcr:mimeType", "application/x-javascript"); root.save(); // make checkin/checkout parent.checkin(); parent.checkout(); subNode.remove(); subNode = parent.addNode("subnode", "nt:file"); subNode.addMixin("mix:referenceable"); res = subNode.addNode("jcr:content", "nt:resource"); res.setProperty("jcr:lastModified", Calendar.getInstance()); res.setProperty("jcr:data", new ByteArrayInputStream("".getBytes())); res.setProperty("jcr:mimeType", "application/x-javascript"); root.save(); parent.checkin(); parent.checkout(); // export import version history and node ByteArrayOutputStream out = new ByteArrayOutputStream(); session.exportSystemView("/parent/child", out, false, false); ByteArrayOutputStream vhout = new ByteArrayOutputStream(); session.exportSystemView(parent.getVersionHistory().getPath(), vhout, false, false); // prepare data for version import String versionHistory = parent.getProperty("jcr:versionHistory").getValue().getString(); String baseVersion = parent.getProperty("jcr:baseVersion").getValue().getString(); Value[] jcrPredecessors = parent.getProperty("jcr:predecessors").getValues(); StringBuilder jcrPredecessorsBuilder = new StringBuilder(); String[] predecessorsHistory; for (Value value : jcrPredecessors) { if (jcrPredecessorsBuilder.length() > 0) jcrPredecessorsBuilder.append(","); jcrPredecessorsBuilder.append(value.getString()); } if (jcrPredecessorsBuilder.toString().indexOf(",") > -1) { predecessorsHistory = jcrPredecessorsBuilder.toString().split(","); } else { predecessorsHistory = new String[]{jcrPredecessorsBuilder.toString()}; } // remove node parent.remove(); session.save(); // import session.importXML("/parent", new ByteArrayInputStream(out.toByteArray()), ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW, true); session.save(); parent = (NodeImpl)session.getItem("/parent/child"); VersionHistoryImporter versionHistoryImporter = new VersionHistoryImporter((NodeImpl)parent, new ByteArrayInputStream(vhout.toByteArray()), baseVersion, predecessorsHistory, versionHistory); versionHistoryImporter.doImport(); session.save(); // try to restore first version parent.restore("1", true); } public void testImportVersionHistoryWithReferenceableProperty() throws Exception { Node parent = session.getRootNode().addNode("testRoot"); parent.addMixin("mix:versionable"); session.save(); parent.checkin(); parent.checkout(); Property prop = parent.getProperty("jcr:versionHistory"); Node vh = session.getNodeByUUID(prop.getValue().getString()); // add ref property to VH parent.setProperty("ref", vh); parent.save(); // export import version history and node ByteArrayOutputStream out = new ByteArrayOutputStream(); session.exportSystemView("/testRoot", out, false, false); ByteArrayOutputStream vhout = new ByteArrayOutputStream(); session.exportSystemView(parent.getVersionHistory().getPath(), vhout, false, false); // prepare data for version import String versionHistory = parent.getProperty("jcr:versionHistory").getValue().getString(); String baseVersion = parent.getProperty("jcr:baseVersion").getValue().getString(); Value[] jcrPredecessors = parent.getProperty("jcr:predecessors").getValues(); StringBuilder jcrPredecessorsBuilder = new StringBuilder(); String[] predecessorsHistory; for (Value value : jcrPredecessors) { if (jcrPredecessorsBuilder.length() > 0) jcrPredecessorsBuilder.append(","); jcrPredecessorsBuilder.append(value.getString()); } if (jcrPredecessorsBuilder.toString().indexOf(",") > -1) { predecessorsHistory = jcrPredecessorsBuilder.toString().split(","); } else { predecessorsHistory = new String[]{jcrPredecessorsBuilder.toString()}; } // remove node parent.remove(); session.save(); // import session.importXML("/", new ByteArrayInputStream(out.toByteArray()), ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW, true); session.save(); parent = (NodeImpl)session.getItem("/testRoot"); VersionHistoryImporter versionHistoryImporter = new VersionHistoryImporter((NodeImpl)parent, new ByteArrayInputStream(vhout.toByteArray()), baseVersion, predecessorsHistory, versionHistory); versionHistoryImporter.doImport(); session.save(); // import second time with replace existing flag session.importXML("/", new ByteArrayInputStream(out.toByteArray()), ImportUUIDBehavior.IMPORT_UUID_COLLISION_REPLACE_EXISTING, true); session.save(); parent = (NodeImpl)session.getItem("/testRoot"); versionHistoryImporter = new VersionHistoryImporter((NodeImpl)parent, new ByteArrayInputStream(vhout.toByteArray()), baseVersion, predecessorsHistory, versionHistory); versionHistoryImporter.doImport(); session.save(); // try to restore first version parent.restore("1", true); parent.remove(); session.save(); } }