
/* ====================================================================
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You 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.
==================================================================== */

package org.apache.poi.poifs.filesystem;

import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

import junit.framework.TestCase;

/**
 * Class to test FilteringDirectoryNode functionality
 */
public final class TestFilteringDirectoryNode extends TestCase {
    private POIFSFileSystem fs;
    private DirectoryEntry dirA;
    private DirectoryEntry dirAA;
    private DirectoryEntry dirB;
    private DocumentEntry eRoot;
    private DocumentEntry eA;
    private DocumentEntry eAA;
    
    @Override
    protected void setUp() throws Exception {
       fs = new POIFSFileSystem();
       dirA = fs.createDirectory("DirA");
       dirB = fs.createDirectory("DirB");
       dirAA = dirA.createDirectory("DirAA");
       eRoot = fs.getRoot().createDocument("Root", new ByteArrayInputStream(new byte[] {}));
       eA  = dirA.createDocument("NA", new ByteArrayInputStream(new byte[] {}));
       eAA = dirAA.createDocument("NAA", new ByteArrayInputStream(new byte[] {}));
    }
    
    public void testNoFiltering() throws Exception {
       FilteringDirectoryNode d = new FilteringDirectoryNode(fs.getRoot(), new HashSet<String>());
       assertEquals(3, d.getEntryCount());
       assertEquals(dirA.getName(), d.getEntry(dirA.getName()).getName());
       
       assertEquals(true, d.getEntry(dirA.getName()).isDirectoryEntry());
       assertEquals(false, d.getEntry(dirA.getName()).isDocumentEntry());
       
       assertEquals(true, d.getEntry(dirB.getName()).isDirectoryEntry());
       assertEquals(false, d.getEntry(dirB.getName()).isDocumentEntry());
       
       assertEquals(false, d.getEntry(eRoot.getName()).isDirectoryEntry());
       assertEquals(true, d.getEntry(eRoot.getName()).isDocumentEntry());
       
       Iterator<Entry> i = d.getEntries();
       assertEquals(dirA, i.next());
       assertEquals(dirB, i.next());
       assertEquals(eRoot, i.next());
       assertEquals(null, i.next());
    }
    
    public void testChildFiltering() throws Exception {
       List<String> excl = Arrays.asList(new String[] {"NotThere","AlsoNotThere", eRoot.getName()});
       FilteringDirectoryNode d = new FilteringDirectoryNode(fs.getRoot(), excl);
       
       assertEquals(2, d.getEntryCount());
       assertEquals(true, d.hasEntry(dirA.getName()));
       assertEquals(true, d.hasEntry(dirB.getName()));
       assertEquals(false, d.hasEntry(eRoot.getName()));
       
       assertEquals(dirA, d.getEntry(dirA.getName()));
       assertEquals(dirB, d.getEntry(dirB.getName()));
       try {
          d.getEntry(eRoot.getName());
          fail("Should be filtered");
       } catch(FileNotFoundException e) {}
       
       Iterator<Entry> i = d.getEntries();
       assertEquals(dirA, i.next());
       assertEquals(dirB, i.next());
       assertEquals(null, i.next());
       
       
       // Filter more
       excl = Arrays.asList(new String[] {"NotThere","AlsoNotThere", eRoot.getName(), dirA.getName()});
       d = new FilteringDirectoryNode(fs.getRoot(), excl);
       
       assertEquals(1, d.getEntryCount());
       assertEquals(false, d.hasEntry(dirA.getName()));
       assertEquals(true, d.hasEntry(dirB.getName()));
       assertEquals(false, d.hasEntry(eRoot.getName()));
       
       try {
          d.getEntry(dirA.getName());
          fail("Should be filtered");
       } catch(FileNotFoundException e) {}
       assertEquals(dirB, d.getEntry(dirB.getName()));
       try {
          d.getEntry(eRoot.getName());
          fail("Should be filtered");
       } catch(FileNotFoundException e) {}
       
       i = d.getEntries();
       assertEquals(dirB, i.next());
       assertEquals(null, i.next());
       
       
       // Filter everything
       excl = Arrays.asList(new String[] {"NotThere", eRoot.getName(), dirA.getName(), dirB.getName()});
       d = new FilteringDirectoryNode(fs.getRoot(), excl);
       
       assertEquals(0, d.getEntryCount());
       assertEquals(false, d.hasEntry(dirA.getName()));
       assertEquals(false, d.hasEntry(dirB.getName()));
       assertEquals(false, d.hasEntry(eRoot.getName()));
       
       try {
          d.getEntry(dirA.getName());
          fail("Should be filtered");
       } catch(FileNotFoundException e) {}
       try {
          d.getEntry(dirB.getName());
          fail("Should be filtered");
       } catch(FileNotFoundException e) {}
       try {
          d.getEntry(eRoot.getName());
          fail("Should be filtered");
       } catch(FileNotFoundException e) {}
       
       i = d.getEntries();
       assertEquals(null, i.next());
    }
    
    public void testNestedFiltering() throws Exception {
       List<String> excl = Arrays.asList(new String[] {
             dirA.getName()+"/"+"MadeUp",
             dirA.getName()+"/"+eA.getName(),
             dirA.getName()+"/"+dirAA.getName()+"/Test",
             eRoot.getName()
       });
       FilteringDirectoryNode d = new FilteringDirectoryNode(fs.getRoot(), excl);
       
       // Check main
       assertEquals(2, d.getEntryCount());
       assertEquals(true, d.hasEntry(dirA.getName()));
       assertEquals(true, d.hasEntry(dirB.getName()));
       assertEquals(false, d.hasEntry(eRoot.getName()));
       
       // Check filtering down
       assertEquals(true, d.getEntry(dirA.getName()) instanceof FilteringDirectoryNode);
       assertEquals(false, d.getEntry(dirB.getName()) instanceof FilteringDirectoryNode);
       
       DirectoryEntry fdA = (DirectoryEntry)d.getEntry(dirA.getName()); 
       assertEquals(false, fdA.hasEntry(eA.getName()));
       assertEquals(true, fdA.hasEntry(dirAA.getName()));
       
       DirectoryEntry fdAA = (DirectoryEntry)fdA.getEntry(dirAA.getName()); 
       assertEquals(true, fdAA.hasEntry(eAA.getName()));
    }
}
