jdk/src/share/demo/nio/zipfs/src/com/sun/nio/zipfs/ZipDirectoryStream.java
changeset 23977 cb2cf6e2958a
parent 23976 16ec7c58cdea
parent 23964 65b2502dbd2d
child 23978 8c0bdeecd7c0
equal deleted inserted replaced
23976:16ec7c58cdea 23977:cb2cf6e2958a
     1 /*
       
     2  * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
       
     3  *
       
     4  * Redistribution and use in source and binary forms, with or without
       
     5  * modification, are permitted provided that the following conditions
       
     6  * are met:
       
     7  *
       
     8  *   - Redistributions of source code must retain the above copyright
       
     9  *     notice, this list of conditions and the following disclaimer.
       
    10  *
       
    11  *   - Redistributions in binary form must reproduce the above copyright
       
    12  *     notice, this list of conditions and the following disclaimer in the
       
    13  *     documentation and/or other materials provided with the distribution.
       
    14  *
       
    15  *   - Neither the name of Oracle nor the names of its
       
    16  *     contributors may be used to endorse or promote products derived
       
    17  *     from this software without specific prior written permission.
       
    18  *
       
    19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
       
    20  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
       
    21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
       
    22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
       
    23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
       
    24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
       
    25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
       
    26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
       
    27  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
       
    28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
       
    29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    30  */
       
    31 
       
    32 /*
       
    33  * This source code is provided to illustrate the usage of a given feature
       
    34  * or technique and has been deliberately simplified. Additional steps
       
    35  * required for a production-quality application, such as security checks,
       
    36  * input validation and proper error handling, might not be present in
       
    37  * this sample code.
       
    38  */
       
    39 
       
    40 
       
    41 package com.sun.nio.zipfs;
       
    42 
       
    43 import java.nio.file.DirectoryStream;
       
    44 import java.nio.file.ClosedDirectoryStreamException;
       
    45 import java.nio.file.NotDirectoryException;
       
    46 import java.nio.file.Path;
       
    47 import java.util.Iterator;
       
    48 import java.util.NoSuchElementException;
       
    49 import java.io.IOException;
       
    50 
       
    51 /**
       
    52  *
       
    53  * @author  Xueming Shen, Rajendra Gutupalli, Jaya Hangal
       
    54  */
       
    55 
       
    56 public class ZipDirectoryStream implements DirectoryStream<Path> {
       
    57 
       
    58     private final ZipFileSystem zipfs;
       
    59     private final byte[] path;
       
    60     private final DirectoryStream.Filter<? super Path> filter;
       
    61     private volatile boolean isClosed;
       
    62     private volatile Iterator<Path> itr;
       
    63 
       
    64     ZipDirectoryStream(ZipPath zipPath,
       
    65                        DirectoryStream.Filter<? super java.nio.file.Path> filter)
       
    66         throws IOException
       
    67     {
       
    68         this.zipfs = zipPath.getFileSystem();
       
    69         this.path = zipPath.getResolvedPath();
       
    70         this.filter = filter;
       
    71         // sanity check
       
    72         if (!zipfs.isDirectory(path))
       
    73             throw new NotDirectoryException(zipPath.toString());
       
    74     }
       
    75 
       
    76     @Override
       
    77     public synchronized Iterator<Path> iterator() {
       
    78         if (isClosed)
       
    79             throw new ClosedDirectoryStreamException();
       
    80         if (itr != null)
       
    81             throw new IllegalStateException("Iterator has already been returned");
       
    82 
       
    83         try {
       
    84             itr = zipfs.iteratorOf(path, filter);
       
    85         } catch (IOException e) {
       
    86             throw new IllegalStateException(e);
       
    87         }
       
    88         return new Iterator<Path>() {
       
    89             private Path next;
       
    90             @Override
       
    91             public boolean hasNext() {
       
    92                 if (isClosed)
       
    93                     return false;
       
    94                 return itr.hasNext();
       
    95             }
       
    96 
       
    97             @Override
       
    98             public synchronized Path next() {
       
    99                 if (isClosed)
       
   100                     throw new NoSuchElementException();
       
   101                 return itr.next();
       
   102             }
       
   103 
       
   104             @Override
       
   105             public void remove() {
       
   106                 throw new UnsupportedOperationException();
       
   107             }
       
   108         };
       
   109     }
       
   110 
       
   111     @Override
       
   112     public synchronized void close() throws IOException {
       
   113         isClosed = true;
       
   114     }
       
   115 
       
   116 
       
   117 }