package org.nuxeo.ecm.core.io.transform; import static org.junit.Assert.assertEquals; import java.io.File; import javax.inject.Inject; import org.apache.commons.io.FileUtils; import org.nuxeo.ecm.core.api.Blob; 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.VersioningOption; import org.nuxeo.ecm.core.api.impl.blob.StringBlob; import org.nuxeo.ecm.core.event.EventService; import org.nuxeo.ecm.core.io.DocumentPipe; import org.nuxeo.ecm.core.io.impl.TransactionBatchingDocumentPipeImpl; import org.nuxeo.ecm.core.io.impl.extensions.LockExporterExtension; import org.nuxeo.ecm.core.io.impl.extensions.VersionInfoExportExtension; import org.nuxeo.ecm.core.io.impl.plugins.ExtensibleDocumentTreeReader; import org.nuxeo.ecm.core.io.impl.plugins.XMLDirectoryWriter; import org.nuxeo.ecm.core.io.impl.transformers.DoctypeToFacetTranslator; import org.nuxeo.ecm.core.io.impl.transformers.FacetRemover; import org.nuxeo.ecm.core.io.impl.transformers.FieldMapper; import org.nuxeo.ecm.core.io.impl.transformers.SchemaRemover; import org.nuxeo.ecm.core.io.impl.transformers.SchemaRenamer; import org.nuxeo.ecm.core.versioning.VersioningService; import org.nuxeo.runtime.api.Framework; import org.nuxeo.runtime.transaction.TransactionHelper; public class BaseExport { @Inject protected CoreSession session; String uuid; protected boolean skipBlobs = true; public static final String IODIR = "NX-Export-Import"; protected DocumentModel createSomethingToExport(CoreSession session) throws Exception { DocumentModel rootDocument = session.getRootDocument(); DocumentModel workspace = session.createDocumentModel(rootDocument.getPathAsString(), "ws1", "Workspace"); workspace.setProperty("dublincore", "title", "test WS"); workspace = session.createDocument(workspace); DocumentModel invoiceDoc = session.createDocumentModel(workspace.getPathAsString(), "invoice", "Invoice"); invoiceDoc.setProperty("dublincore", "title", "MyDoc"); invoiceDoc.setProperty("invoice", "InvoiceNumber", "0001"); invoiceDoc.setPropertyValue("inv:InvoiceAmount", "$10,000"); invoiceDoc.setPropertyValue("dep:fieldA", new String[] { "A", "B", "C" }); invoiceDoc.setPropertyValue("dep:fieldB", "XYZ"); invoiceDoc.setPropertyValue("dep:fieldC", "foo"); invoiceDoc.setPropertyValue("dep:fieldD", "bar"); Blob blob = new StringBlob("SomeDummyContent"); blob.setFilename("dummyBlob.txt"); invoiceDoc.setProperty("file", "content", blob); invoiceDoc = session.createDocument(invoiceDoc); invoiceDoc.addFacet("HiddenInNavigation"); invoiceDoc = session.saveDocument(invoiceDoc); DocumentModel folderDoc = session.createDocumentModel(workspace.getPathAsString(), "folder", "Folder"); folderDoc.setProperty("dublincore", "title", "MyFolder"); folderDoc = session.createDocument(folderDoc); DocumentModel fileDoc2 = session.createDocumentModel(folderDoc.getPathAsString(), "file", "File"); fileDoc2.setProperty("dublincore", "title", "MyDoc"); Blob blob2 = new StringBlob("SomeDummyContent2"); blob.setFilename("dummyBlob2.txt"); fileDoc2.setProperty("file", "content", blob2); fileDoc2 = session.createDocument(fileDoc2); fileDoc2.putContextData(VersioningService.VERSIONING_OPTION, VersioningOption.MAJOR); fileDoc2.setPropertyValue("dc:description", "Youhou"); fileDoc2 = session.saveDocument(fileDoc2); fileDoc2.putContextData(VersioningService.VERSIONING_OPTION, VersioningOption.MINOR); fileDoc2.setPropertyValue("dc:description", "Youhou2"); fileDoc2 = session.saveDocument(fileDoc2); fileDoc2.followTransition("approve"); assertEquals("approved", fileDoc2.getCurrentLifeCycleState()); uuid = fileDoc2.getId(); // lock the document invoiceDoc.setLock(); session.save(); TransactionHelper.commitOrRollbackTransaction(); TransactionHelper.startTransaction(); // Audit being async we must wait ! Thread.sleep(200); EventService es = Framework.getLocalService(EventService.class); es.waitForAsyncCompletion(); return workspace; } public BaseExport() { super(); } protected File getExportDirectory() { return getExportDirectory(true); } protected File getExportDirectory(boolean delete) { String tempDir = System.getProperty("java.io.tmpdir"); File dir = new File(tempDir + "/" + IODIR); if (dir.exists()) { if (delete) { FileUtils.deleteQuietly(dir); } else { return dir; } } dir.mkdirs(); return dir; } protected void runExport(DocumentModel root, File destination, boolean skipBlobs) throws Exception { final ExtensibleDocumentTreeReader reader = new ExtensibleDocumentTreeReader(root.getCoreSession(), root); XMLDirectoryWriter writer = new XMLDirectoryWriter(destination); writer.setSkipBlobs(skipBlobs); // register extensions ! reader.registerExtension(new VersionInfoExportExtension()); reader.registerExtension(new LockExporterExtension()); DocumentPipe pipe = new TransactionBatchingDocumentPipeImpl(10); pipe.setReader(reader); pipe.setWriter(writer); pipe.addTransformer(new DoctypeToFacetTranslator("Invoice", "File", "Invoice")); pipe.addTransformer(new FacetRemover(null, "IOnlyExistsInV1")); pipe.addTransformer(new FacetRemover(null, "Immutable")); pipe.addTransformer(new FieldMapper("deprecated", "dep:fieldA", "invoice", "inv:A")); pipe.addTransformer(new FieldMapper("deprecated", "dep:fieldB", "invoice", "inv:B")); pipe.addTransformer(new FieldMapper("deprecated", "dep:fieldC", "new", "nw:Y")); pipe.addTransformer(new SchemaRemover(null, "deprecated")); pipe.addTransformer(new SchemaRenamer("invoice", "invoiceNew", "iv")); pipe.run(); } protected void dump(StringBuffer sb, File root) { for (File f : root.listFiles()) { sb.append(f.getAbsolutePath()); sb.append("\n"); if (f.isDirectory()) { dump(sb, f); } } } protected void dump(StringBuffer sb, DocumentModelList alldocs) { for (DocumentModel doc : alldocs) { sb.append(doc.getId()); sb.append(" - "); sb.append(doc.getPathAsString()); sb.append(" - "); sb.append(doc.getType()); sb.append(" - "); sb.append(doc.getTitle()); sb.append(" - "); sb.append(doc.isVersion()); sb.append(" - "); sb.append(doc.getVersionLabel()); sb.append("\n"); } } }