/* * (C) Copyright 2006 Nuxeo SA (http://nuxeo.com/) and others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Contributors: * Nuxeo - initial API and implementation * * * */ package org.nuxeo.ecm.platform.filemanager; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.io.File; import java.util.zip.ZipFile; import javax.inject.Inject; import org.apache.commons.io.FileUtils; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; import org.nuxeo.ecm.core.api.Blob; import org.nuxeo.ecm.core.api.Blobs; 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.PathRef; import org.nuxeo.ecm.core.io.DocumentPipe; import org.nuxeo.ecm.core.io.DocumentReader; import org.nuxeo.ecm.core.io.DocumentWriter; import org.nuxeo.ecm.core.io.impl.DocumentPipeImpl; import org.nuxeo.ecm.core.io.impl.plugins.DocumentTreeReader; import org.nuxeo.ecm.core.io.impl.plugins.NuxeoArchiveWriter; import org.nuxeo.ecm.core.test.CoreFeature; import org.nuxeo.ecm.core.test.annotations.Granularity; import org.nuxeo.ecm.core.test.annotations.RepositoryConfig; import org.nuxeo.ecm.platform.filemanager.api.FileManager; import org.nuxeo.ecm.platform.filemanager.service.extension.ExportedZipImporter; import org.nuxeo.runtime.api.Framework; import org.nuxeo.runtime.test.runner.Deploy; import org.nuxeo.runtime.test.runner.Features; import org.nuxeo.runtime.test.runner.FeaturesRunner; /** * Check IO archive import via Unit Tests. * * @author tiry */ @RunWith(FeaturesRunner.class) @Features(CoreFeature.class) @RepositoryConfig(init = RepositoryInit.class, cleanup = Granularity.METHOD) @Deploy({ "org.nuxeo.ecm.platform.types.api", "org.nuxeo.ecm.platform.types.core", "org.nuxeo.ecm.platform.filemanager.core" }) public class TestExportedZipImporterPlugin { protected DocumentModel sourceWS; protected DocumentModel destWS; protected DocumentModel wsRoot; @Inject protected CoreSession coreSession; private File archiveFile; public void createTestDocumentsAndArchive() throws Exception { wsRoot = coreSession.getDocument(new PathRef("/default-domain/workspaces")); DocumentModel ws = coreSession.createDocumentModel(wsRoot.getPathAsString(), "sourceWS", "Workspace"); ws.setProperty("dublincore", "title", "Source Workspace"); ws = coreSession.createDocument(ws); DocumentModel ws2 = coreSession.createDocumentModel(wsRoot.getPathAsString(), "destWS", "Workspace"); ws2.setProperty("dublincore", "title", "Destination Workspace"); ws2 = coreSession.createDocument(ws2); DocumentModel file = coreSession.createDocumentModel(ws.getPathAsString(), "myfile", "File"); file.setProperty("dublincore", "title", "MyFile"); file.setProperty("dublincore", "coverage", "MyFileCoverage"); file = coreSession.createDocument(file); DocumentModel folder = coreSession.createDocumentModel(ws.getPathAsString(), "myfolder", "Folder"); folder.setProperty("dublincore", "title", "MyFolder"); folder = coreSession.createDocument(folder); DocumentModel subfile = coreSession.createDocumentModel(folder.getPathAsString(), "mysubfile", "File"); subfile.setProperty("dublincore", "title", "MySubFile"); subfile = coreSession.createDocument(subfile); DocumentReader reader = new DocumentTreeReader(coreSession, ws, false); archiveFile = File.createTempFile("TestExportedZipImporterPlugin_", ",zip"); archiveFile.delete(); DocumentWriter writer = new NuxeoArchiveWriter(archiveFile); DocumentPipe pipe = new DocumentPipeImpl(10); pipe.setReader(reader); pipe.setWriter(writer); pipe.run(); writer.close(); reader.close(); sourceWS = ws; destWS = ws2; } @After public void cleanupTempFolder() { FileUtils.deleteQuietly(archiveFile); } @Test public void testArchiveDetection() throws Exception { createTestDocumentsAndArchive(); ZipFile archive = ExportedZipImporter.getArchiveFileIfValid(archiveFile); assertNotNull(archive); archive.close(); } @Test public void testImportViaFileManager() throws Exception { createTestDocumentsAndArchive(); FileManager fm = Framework.getService(FileManager.class); Blob blob = Blobs.createBlob(archiveFile); fm.createDocumentFromBlob(coreSession, blob, destWS.getPathAsString(), true, "toto.zip"); DocumentModelList children = coreSession.getChildren(destWS.getRef()); assertTrue(children.size() > 0); DocumentModel importedWS = children.get(0); assertEquals(importedWS.getTitle(), sourceWS.getTitle()); DocumentModelList subChildren = coreSession.getChildren(importedWS.getRef()); assertSame(2, subChildren.size()); DocumentModel subFolder = coreSession.getChild(importedWS.getRef(), "myfolder"); assertNotNull(subFolder); DocumentModel subFile = coreSession.getChild(importedWS.getRef(), "myfile"); assertNotNull(subFile); DocumentModelList subSubChildren = coreSession.getChildren(subFolder.getRef()); assertSame(1, subSubChildren.size()); } @Test public void testOverrideImportViaFileManager() throws Exception { createTestDocumentsAndArchive(); // first update the source DM of the exported source sourceWS.setProperty("dublincore", "title", "I have been changed"); sourceWS = coreSession.saveDocument(sourceWS); // remove one children DocumentModel subFile = coreSession.getChild(sourceWS.getRef(), "myfile"); coreSession.removeDocument(subFile.getRef()); coreSession.save(); FileManager fm = Framework.getService(FileManager.class); Blob blob = Blobs.createBlob(archiveFile); fm.createDocumentFromBlob(coreSession, blob, wsRoot.getPathAsString(), true, "toto.zip"); sourceWS = coreSession.getChild(wsRoot.getRef(), "sourceWS"); assertNotNull(sourceWS); assertEquals("Source Workspace", sourceWS.getTitle()); subFile = coreSession.getChild(sourceWS.getRef(), "myfile"); assertNotNull(subFile); } }