package org.nuxeo.ecm.core.io.transform; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import java.security.Principal; import java.util.List; import org.apache.commons.io.FileUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.nuxeo.ecm.core.api.CoreInstance; import org.nuxeo.ecm.core.api.CoreSession; import org.nuxeo.ecm.core.api.DocumentModel; import org.nuxeo.ecm.core.api.DocumentModelList; import org.nuxeo.ecm.core.api.DocumentRef; import org.nuxeo.ecm.core.api.PathRef; import org.nuxeo.ecm.core.io.DocumentPipe; import org.nuxeo.ecm.core.io.DocumentReader; import org.nuxeo.ecm.core.io.impl.TransactionBatchingDocumentPipeImpl; import org.nuxeo.ecm.core.io.impl.extensions.DocumentLockImporter; import org.nuxeo.ecm.core.io.impl.plugins.ExtensibleDocumentWriter; import org.nuxeo.ecm.core.io.impl.plugins.XMLDirectoryReader; import org.nuxeo.ecm.core.test.CoreFeature; import org.nuxeo.ecm.core.test.TransactionalFeature; import org.nuxeo.runtime.test.runner.Features; import org.nuxeo.runtime.test.runner.FeaturesRunner; import org.nuxeo.runtime.test.runner.LocalDeploy; import org.nuxeo.runtime.transaction.TransactionHelper; @RunWith(FeaturesRunner.class) @Features({ TransactionalFeature.class, CoreFeature.class }) @LocalDeploy({ "org.nuxeo.ecm.core.io.test:OSGI-INF/export-docTypes.xml", "org.nuxeo.ecm.core.io.test:OSGI-INF/import-docTypes.xml", "org.nuxeo.ecm.core.io.test:OSGI-INF/other-repo.xml" }) public class ExportAndTransformAndInportTest extends BaseExport { public void runImport(DocumentModel root, File source) throws IOException { final DocumentReader reader = new XMLDirectoryReader(source); ExtensibleDocumentWriter writer = new ExtensibleDocumentWriter(root.getCoreSession(), root.getPathAsString()); writer.registerExtension(new DocumentLockImporter()); DocumentPipe pipe = new TransactionBatchingDocumentPipeImpl(10); pipe.setReader(reader); pipe.setWriter(writer); pipe.run(); } @Test public void testExportWithTransformThenImport() throws Exception { Principal principal = session.getPrincipal(); CoreSession importSession = null; DocumentModel root = createSomethingToExport(session); File out = getExportDirectory(); try { runExport(root, out, skipBlobs); TransactionHelper.commitOrRollbackTransaction(); TransactionHelper.startTransaction(); importSession = CoreInstance.openCoreSession("import", principal); runImport(importSession.getRootDocument(), out); importSession.save(); TransactionHelper.commitOrRollbackTransaction(); TransactionHelper.startTransaction(); Thread.sleep(2000); DocumentModelList alldocs = importSession.query("select * from Document order by ecm:path"); StringBuffer sb = new StringBuffer(); dump(sb, alldocs); String listing = sb.toString(); assertTrue(listing.contains("/ws1/folder/file")); // Check that UUIDs are stables assertTrue(importSession.exists(root.getRef())); // Check versions DocumentRef ref = new PathRef("/ws1/folder/file"); DocumentModel doc = session.getDocument(ref); assertNotNull(doc); assertEquals("approved", doc.getCurrentLifeCycleState()); List<DocumentModel> versions = importSession.getVersions(ref); assertEquals(2, versions.size()); // check transtyping for Invoice ! DocumentModel invoice = importSession.getDocument(new PathRef("/ws1/invoice")); assertEquals("File", invoice.getType()); assertTrue(invoice.hasFacet("Invoice")); assertEquals("$10,000", invoice.getPropertyValue("iv:InvoiceAmount")); // check field translation assertEquals("XYZ", invoice.getPropertyValue("iv:B")); String[] lst = (String[]) invoice.getPropertyValue("iv:A"); assertEquals("A", lst[0]); assertEquals("B", lst[1]); // check new schema assertEquals("foo", invoice.getPropertyValue("nw:Y")); TransactionHelper.commitOrRollbackTransaction(); TransactionHelper.startTransaction(); // check lock assertTrue(invoice.isLocked()); } finally { FileUtils.deleteQuietly(out); if (importSession != null) { CoreInstance.closeCoreSession(importSession); } } } }