package fr.acxio.tools.agia.alfresco;
/*
* Copyright 2014 Acxio
*
* 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.
*/
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.channels.FileLock;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.junit.After;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.springframework.util.FileCopyUtils;
import fr.acxio.tools.agia.alfresco.configuration.AlfrescoNamespaceContext;
import fr.acxio.tools.agia.alfresco.domain.Aspect;
import fr.acxio.tools.agia.alfresco.domain.Document;
import fr.acxio.tools.agia.alfresco.domain.Folder;
import fr.acxio.tools.agia.alfresco.domain.NodeList;
import fr.acxio.tools.agia.alfresco.domain.Property;
import fr.acxio.tools.agia.alfresco.domain.QName;
@RunWith(JUnit4.class)
public class ContentFileDeleteWriterTest {
@Rule
public ExpectedException exception = ExpectedException.none();
private AlfrescoNamespaceContext namespaceContext = new AlfrescoNamespaceContext();
@After
public void tearDown() throws Exception {
Collection<File> aFilesToDelete = FileUtils.listFiles(new File("target"), new WildcardFileFilter("content*.pdf"), null);
for(File aFile : aFilesToDelete) {
FileUtils.deleteQuietly(aFile);
}
}
@Test
public void testWriteNull() throws Exception {
exception.expect(NullPointerException.class);
ContentFileDeleteWriter aWriter = new ContentFileDeleteWriter();
aWriter.write(null);
}
@Test
public void testWriteEmpty() throws Exception {
ContentFileDeleteWriter aWriter = new ContentFileDeleteWriter();
List<NodeList> aData = new ArrayList<NodeList>();
aWriter.write(aData);
}
@Test
public void testWrite() throws Exception {
ContentFileDeleteWriter aWriter = new ContentFileDeleteWriter();
File aOriginFile = new File("src/test/resources/testFiles/content1.pdf");
File aDestinationFile = new File("target/content1.pdf");
FileCopyUtils.copy(aOriginFile, aDestinationFile);
List<NodeList> aData = new ArrayList<NodeList>();
aData.add(createNodeList(aDestinationFile.getAbsolutePath()));
assertTrue(aDestinationFile.exists());
aWriter.write(aData);
assertFalse(aDestinationFile.exists());
}
@Test
public void testWriteMany() throws Exception {
ContentFileDeleteWriter aWriter = new ContentFileDeleteWriter();
File aOriginFile = new File("src/test/resources/testFiles/content1.pdf");
File aDestinationFile1 = new File("target/content2.pdf");
FileCopyUtils.copy(aOriginFile, aDestinationFile1);
File aDestinationFile2 = new File("target/content3.pdf");
FileCopyUtils.copy(aOriginFile, aDestinationFile2);
List<NodeList> aData = new ArrayList<NodeList>();
aData.add(createNodeList(aDestinationFile1.getAbsolutePath()));
aData.add(createNodeList(aDestinationFile2.getAbsolutePath()));
assertTrue(aDestinationFile1.exists());
assertTrue(aDestinationFile2.exists());
aWriter.write(aData);
assertFalse(aDestinationFile1.exists());
assertFalse(aDestinationFile2.exists());
}
@Test
public void testWriteCannotDelete() throws Exception {
ContentFileDeleteWriter aWriter = new ContentFileDeleteWriter();
File aOriginFile = new File("src/test/resources/testFiles/content1.pdf");
File aDestinationFile1 = new File("target/content4.pdf");
FileCopyUtils.copy(aOriginFile, aDestinationFile1);
List<NodeList> aData = new ArrayList<NodeList>();
aData.add(createNodeList(aDestinationFile1.getAbsolutePath()));
assertTrue(aDestinationFile1.exists());
FileInputStream aInputStream = new FileInputStream(aDestinationFile1);
FileLock aLock = aInputStream.getChannel().lock(0L, Long.MAX_VALUE, true); // shared lock
aWriter.write(aData);
aLock.release();
aInputStream.close();
assertTrue(aDestinationFile1.exists());
}
@Test
public void testWriteCannotDeleteThrowException() throws Exception {
ContentFileDeleteWriter aWriter = new ContentFileDeleteWriter();
aWriter.setIgnoreErrors(false);
File aOriginFile = new File("src/test/resources/testFiles/content1.pdf");
File aDestinationFile1 = new File("target/content5.pdf");
FileCopyUtils.copy(aOriginFile, aDestinationFile1);
List<NodeList> aData = new ArrayList<NodeList>();
aData.add(createNodeList(aDestinationFile1.getAbsolutePath()));
assertTrue(aDestinationFile1.exists());
FileInputStream aInputStream = new FileInputStream(aDestinationFile1);
FileLock aLock = aInputStream.getChannel().lock(0L, Long.MAX_VALUE, true); // shared lock
try {
aWriter.write(aData);
assertTrue(aDestinationFile1.exists());
fail("Must throw an exception");
} catch (IOException e) {
// Fall through
} finally {
aLock.release();
aInputStream.close();
}
}
private NodeList createNodeList(String sContentPath) {
NodeList aNodeList = new NodeList();
Folder aRootFolder = new Folder();
aRootFolder.setParent(null);
aRootFolder.setType(new QName("cm:folder", namespaceContext));
aRootFolder.addProperty(new Property(new QName("cm:name", namespaceContext), "company_home"));
aRootFolder.setPathElement("app:company_home");
Folder aTestFolder = new Folder();
aTestFolder.setParent(aRootFolder);
aRootFolder.addFolder(aTestFolder);
aTestFolder.setType(new QName("cm:folder", namespaceContext));
aTestFolder.addProperty(new Property(new QName("cm:name", namespaceContext), "Test Batch Writer"));
aTestFolder.setPathElement("cm:Test_x0020_Batch_x0020_Writer");
Document aDocument = new Document();
aDocument.setParent(aTestFolder);
aTestFolder.addDocument(aDocument);
aDocument.setType(new QName("cm:content", namespaceContext));
aDocument.addProperty(new Property(new QName("cm:name", namespaceContext), "Test Batch Writer Content"));
aDocument.addProperty(new Property(new QName("cm:title", namespaceContext), "Text content"));
aDocument.addAspect(new Aspect(new QName("cm:titled", namespaceContext)));
aDocument.setContentPath(sContentPath);
aDocument.setMimeType("application/pdf");
aDocument.setPathElement("cm:Test_x0020_Batch_x0020_Writer_x0020_Content");
aNodeList.add(aRootFolder);
aNodeList.add(aTestFolder);
aNodeList.add(aDocument);
return aNodeList;
}
}