fr.acxio.tools.agia.alfresco.ContentFileDeleteWriterTest.java Source code

Java tutorial

Introduction

Here is the source code for fr.acxio.tools.agia.alfresco.ContentFileDeleteWriterTest.java

Source

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;
    }
}