チェンジセット 376

差分発生行の前後
無視リスト:
コミット日時:
2008/12/26 17:45:39 (13 年前)
コミッタ:
shinomiya
ログメッセージ:

#550 圧縮するファイルやディレクトリを複数指定できるように修正。

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • trunk/im-jssp/src/main/java/org/intra_mart/common/aid/jdk/java/util/Archiver.java

    r355 r376  
    125125                } 
    126126                 
     127                File[] sources = { src }; 
     128                zip(sources, dest, filter); 
     129        } 
     130 
     131        /** 
     132         * 指定されたファイルやディレクトリをZIP形式で圧縮します。<br/> 
     133         * 圧縮するファイルやディレクトリは、複数指定することが可能です。 
     134         *  
     135         * @param sources 圧縮するファイル、または、ディレクトリの配列。 
     136         * @param destination ZIPファイルの出力先 
     137         * @param filter  
     138         *                      このクラスは、ディレクトリの圧縮処理を行う際、そのディレクトリ配下に含まれるファイルを走査します。<br/> 
     139         *                      走査されたファイルは、この引数に設定されたフィルタの実行結果によって圧縮対象のファイルか否かを判定します。<br/> 
     140         *                      フィルタが true  を返却した場合、該当ファイルは圧縮対象となります。<br/> 
     141         *                      フィルタが false を返却した場合、該当ファイルは圧縮対象から<b>外れます</b>。<br/> 
     142         *                      フィルタが未指定の場合、すべてのファイルが圧縮対象となります。<br/> 
     143         * @throws IOException 入出力エラーが発生した場合 
     144         */ 
     145        public static void zip(final File[] sources, final File destination, final FileFilter filter) throws IOException { 
     146 
     147                if(sources == null || destination == null){ 
     148                        throw new IllegalArgumentException("Argument 'sources' and 'destination' cannot specify null."); 
     149                } 
     150                 
    127151                ZipOutputStream zos = null; 
    128152                InputStream is = null; 
    129153                 
    130154                try { 
    131                         if(dest.exists()){ 
    132                                 deleteFileRecursive(dest); 
    133                         } 
    134                         dest.getParentFile().mkdirs(); 
    135  
    136                         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest)); 
     155                        if(destination.exists()){ 
     156                                deleteFileRecursive(destination); 
     157                        } 
     158                        destination.getParentFile().mkdirs(); 
     159 
     160                        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destination)); 
    137161                        zos = new ZipOutputStream(bos); 
    138162 
    139                         if(src != null){ 
    140                                 if(src.exists()){ 
    141                                         if(src.isDirectory()){ 
    142                                                 writeDirEntry(zos, src, null, filter); 
     163                        int srcLength = sources.length; 
     164                        for(int idx = 0; idx < srcLength; idx++){ 
     165                                File src = sources[idx]; 
     166                                 
     167                                if(!src.exists()){ 
     168                                        jdkLogger.warning("skipping zip archive because file/dir is not found: " + src); 
     169                                        continue; 
     170                                } 
     171                                 
     172                                if(src.isDirectory()){ 
     173                                        if(src.list().length == 0){ 
     174                                                jdkLogger.warning("skipping zip archive because no files were included: " + src); 
     175                                                continue; 
    143176                                        } 
    144                                         else{ 
    145                                                 if( filter == null || filter.accept(src) == true ){                                                              
    146                                                         writeEntry(zos, new FileInputStream(src), src.getName()); 
    147                                                 } 
     177                                         
     178                                        writeDirEntry(zos, src, null, filter); 
     179                                } 
     180                                else{ 
     181                                        if( filter == null || filter.accept(src) == true ){                                                              
     182                                                writeEntry(zos, new FileInputStream(src), src.getName()); 
    148183                                        } 
    149184                                } 
     
    166201                } 
    167202        } 
    168  
     203         
     204         
    169205        /** 
    170206         * ZIPファイルを解凍します。<br/> 
  • trunk/im-jssp/src/test/java/org/intra_mart/common/aid/jdk/java/util/ArchiverTest.java

    r375 r376  
    611611        } 
    612612         
     613        /** 
     614         * @throws Exception 
     615         */ 
     616        public void test_zipFile配列FileFileFilter() throws Exception { 
     617                File temp = new File(tempDir, "test_zipFile配列FileFileFilter"); 
     618                URL url = this.getClass().getResource("/org/intra_mart/common/aid/jdk/java/util/ArchiverTest/dir_test/003_for_FileArray/"); 
     619 
     620                try{ 
     621                        File src_0 = new File(getDecodePath(url), "oim_banner01.gif");             // ファイル指定 
     622                        File src_1 = new File(getDecodePath(url), "bar/001_plain_text.txt");       // ファイル指定(サブディレクトリ) 
     623                        File src_2 = new File(getDecodePath(url), "bar/000_this_file_is_0KB.txt"); // ファイル指定(filterで弾かれるファイル) 
     624                        File src_3 = new File(getDecodePath(url), "foo/");                         // ディレクトリ指定 
     625                         
     626                        File[] sources = {src_0, src_1, src_2, src_3}; 
     627                        File destination = new File(temp, "test_zipFile配列FileFileFilter.zip"); 
     628                        System.out.println("destination: " + destination); 
     629                         
     630                        FileFilter filter = new FileFilter(){ 
     631                                public boolean accept(File pathname) { 
     632                                        // ファイル名に「000_」が含まれるファイルは圧縮しない 
     633                                        if(pathname.getName().indexOf("000_") == -1){ 
     634                                                return true; 
     635                                        } 
     636                                        else{ 
     637                                                return false; 
     638                                        } 
     639                                } 
     640                        }; 
     641         
     642                        Archiver.zip(sources, destination, filter); 
     643 
     644                        // 確認 
     645                        File unzipSrc = destination; 
     646                        File unzipDest = new File(temp, "/target"); 
     647                        Archiver.unzip(unzipSrc, unzipDest); // unzipが正しく動作していることが前提 
     648                         
     649                        File targetDir; 
     650                        String target; 
     651                        String result; 
     652                        String origin; 
     653                         
     654                        targetDir = unzipDest; 
     655                        assertEquals("「ルート/」のファイル数が正しいこと", 7, targetDir.listFiles().length);  
     656 
     657                        target = "oim_banner01.gif"; 
     658                        result = load(new File(unzipDest, target)); 
     659                        origin = load(src_0); 
     660                        assertEquals("ZIP圧縮の内容が正しい事(" + target + ")", result, origin); 
     661 
     662                        target = "001_plain_text.txt"; 
     663                        result = load(new File(unzipDest, target)); 
     664                        origin = load(src_1); 
     665                        assertEquals("ZIP圧縮の内容が正しい事(" + target + ")", result, origin);  
     666                        // ↑サブディレクトリ「bar」の下に作られないことに注意 
     667 
     668                        target = "copy_of_001_plain_text.txt"; 
     669                        result = load(new File(unzipDest, target)); 
     670                        origin = load(new File(src_3, target)); 
     671                        assertEquals("ZIP圧縮の内容が正しい事(" + target + ")", result, origin);  
     672                         
     673                        target = "copy_of_im-jssp-api-list-0.1.2.zip"; 
     674                        result = load(new File(unzipDest, target)); 
     675                        origin = load(new File(src_3, target)); 
     676                        assertEquals("ZIP圧縮の内容が正しい事(" + target + ")", result, origin);  
     677                         
     678                        target = "copy_of_oim_banner01.gif"; 
     679                        result = load(new File(unzipDest, target)); 
     680                        origin = load(new File(src_3, target)); 
     681                        assertEquals("ZIP圧縮の内容が正しい事(" + target + ")", result, origin);  
     682                         
     683                        // ============ empty_dir ============ ← 「foo/empty_dir/」ではなく「empty_dir/」として圧縮されます。 
     684                        target = "empty_dir"; 
     685                        assertTrue("ZIP圧縮の内容が正しい事(" + target + ")", new File(unzipDest, target).isDirectory()); 
     686                        assertEquals("ZIP圧縮の内容が正しい事(" + target + ")", 0, new File(unzipDest, target).list().length); 
     687                        assertTrue("ZIP圧縮の内容が正しい事(" + target + ")", new File(src_3, target).isDirectory()); 
     688                        assertEquals("ZIP圧縮の内容が正しい事(" + target + ")", 0, new File(src_3, target).list().length); 
     689                         
     690                         
     691                        // ============= foo2 ============= ← 「foo/foo2/」ではなく「foo2/」として圧縮されます。 
     692                        targetDir = new File(unzipDest, "foo2"); 
     693                        assertEquals("「foo2/」のファイル数が正しいこと", 4, targetDir.listFiles().length);  
     694                         
     695                        target = "foo2/001_plain_text.txt"; 
     696                        result = load(new File(unzipDest, target)); 
     697                        origin = load(new File(src_3, target)); 
     698                        assertEquals("ZIP圧縮の内容が正しい事(" + target + ")", result, origin); 
     699 
     700                        target = "foo2/im-jssp-api-list-0.1.2.zip"; 
     701                        result = load(new File(unzipDest, target)); 
     702                        origin = load(new File(src_3, target)); 
     703                        assertEquals("ZIP圧縮の内容が正しい事(" + target + ")", result, origin); 
     704 
     705                        target = "foo2/oim_banner01.gif"; 
     706                        result = load(new File(unzipDest, target)); 
     707                        origin = load(new File(src_3, target)); 
     708                        assertEquals("ZIP圧縮の内容が正しい事(" + target + ")", result, origin); 
     709 
     710                        // ============ foo2/empty_dir ============ ← 「foo/foo2/empty_dir/」ではなく「foo2/empty_dir/」として圧縮されます。 
     711                        target = "foo2/empty_dir"; 
     712                        assertTrue("ZIP圧縮の内容が正しい事(" + target + ")", new File(unzipDest, target).isDirectory()); 
     713                        assertEquals("ZIP圧縮の内容が正しい事(" + target + ")", 0, new File(unzipDest, target).list().length); 
     714                        assertTrue("ZIP圧縮の内容が正しい事(" + target + ")", new File(src_3, target).isDirectory()); 
     715                        assertEquals("ZIP圧縮の内容が正しい事(" + target + ")", 0, new File(src_3, target).list().length); 
     716 
     717                } 
     718                finally{ 
     719                        deleteDir(temp); 
     720                }                
     721        } 
     722         
     723        public void test_zipFile配列FileFileFilter_ZipException_duplicate_entry発生() throws Exception { 
     724                File temp = new File(tempDir, "test_zipFile配列FileFileFilter"); 
     725                URL url = this.getClass().getResource("/org/intra_mart/common/aid/jdk/java/util/ArchiverTest/dir_test/002_3_hierarchy/"); 
     726 
     727                try{ 
     728                        File src_0 = new File(getDecodePath(url), "oim_banner01.gif"); // ファイル指定 
     729                        File src_1 = new File(getDecodePath(url), "foo/");             // ディレクトリ指定(この直下に上記と同名ファイルがある) 
     730                         
     731                        File[] sources = {src_0, src_1}; 
     732                        File destination = new File(temp, "test_zipFile配列FileFileFilter_ZipException_duplicate_entry発生.zip"); 
     733                         
     734                        try{ 
     735                                Archiver.zip(sources, destination, null); 
     736                                fail("例外が発生する必要があります"); 
     737                        } 
     738                        catch(Exception e){ 
     739                                assertTrue("ZipExceptionが発生する事", e instanceof ZipException); 
     740                        } 
     741                } 
     742                finally{ 
     743                        deleteDir(temp); 
     744                }                
     745        } 
     746 
    613747        /** 
    614748         * @throws Exception