Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2014-2015 the original author or authors.
   *
   * 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.
  */
 package org.lastaflute.di.util;
 
 import java.io.File;
クラスを横断して処理するためのハンドラです。

このクラスを直接使うより、LdiResourcesUtilを使用してください。

Author(s):
modified by jflute (originated in Seasar)
See also:
LdiResourcesUtil
 
 public class ClassTraversal {
     private static final String CLASS_SUFFIX = ".class";
 
     private static final String WAR_FILE_EXTENSION = ".war";
 
     private static final String WEB_INF_CLASSES_PATH = "WEB-INF/classes/";

    
クラスを横断して処理するためのハンドラです。
 
     public interface ClassHandler {
        
クラスを処理します。

Parameters:
packageName
shortClassName
 
         void processClass(String packageNameString shortClassName);
     }

    
rootディレクトリ配下を処理します。

Parameters:
rootDir
handler
 
     public static void forEach(final File rootDirfinal ClassHandler handler) {
         forEach(rootDirnullhandler);
     }

    
ファイルシステムに含まれるクラスをトラバースします。

Parameters:
rootDir ルートディレクトリ
rootPackage ルートパッケージ
handler クラスを処理するハンドラ
 
     public static void forEach(final File rootDirfinal String rootPackagefinal ClassHandler handler) {
         final File packageDir = getPackageDir(rootDirrootPackage);
         if (packageDir.exists()) {
             traverseFileSystem(packageDirrootPackagehandler);
         }
     }

    
Jarファイルに含まれるクラスをトラバースします。

指定されたJarファイルが拡張子.warを持つ場合は、 Jarファイル内のエントリのうち、 接頭辞 WEB-INF/classesで始まるパスを持つエントリがトラバースの対象となります。 クラスを処理するハンドラには、接頭辞を除くエントリ名が渡されます。 例えばJarファイル内に /WEB-INF/classes/ccc/ddd/Eee.classというクラスファイルが存在すると、 ハンドラには パッケージ名ccc.dddおよびクラス名Eeeが渡されます。

Parameters:
jarFile Jarファイル
handler クラスを処理するハンドラ
 
     public static void forEach(final JarFile jarFilefinal ClassHandler handler) {
         if (jarFile.getName().toLowerCase().endsWith()) {
             forEach(jarFilehandler);
        } else {
            forEach(jarFile""handler);
        }
    }

    
Jarファイルに含まれるクラスをトラバースします。

Jarファイル内のエントリのうち、接頭辞で始まるパスを持つエントリがトラバースの対象となります。 クラスを処理するハンドラには、接頭辞を除くエントリ名が渡されます。 例えば接頭辞が /aaa/bbb/ で、Jarファイル内に /aaa/bbb/ccc/ddd/Eee.classというクラスファイルが存在すると、 ハンドラには パッケージ名ccc.dddおよびクラス名Eeeが渡されます。

Parameters:
jarFile Jarファイル
prefix トラバースするリソースの名前が含む接頭辞。スラッシュ('/')で終了していなければなりません。
handler クラスを処理するハンドラ
    public static void forEach(final JarFile jarFilefinal String prefixfinal ClassHandler handler) {
        final int startPos = prefix.length();
        final Enumeration enumeration = jarFile.entries();
        while (enumeration.hasMoreElements()) {
            final JarEntry entry = (JarEntryenumeration.nextElement();
            final String entryName = entry.getName().replace('\\''/');
            if (entryName.startsWith(prefix) && entryName.endsWith()) {
                final String className = entryName.substring(startPosentryName.length() - .length()).replace('/''.');
                final int pos = className.lastIndexOf('.');
                final String packageName = (pos == -1) ? null : className.substring(0, pos);
                final String shortClassName = (pos == -1) ? className : className.substring(pos + 1);
                handler.processClass(packageNameshortClassName);
            }
        }
    }

    
ZIPファイル形式の入力ストリームに含まれるクラスをトラバースします。

Parameters:
zipInputStream ZIPファイル形式の入力ストリーム
prefix トラバースするリソースの名前が含む接頭辞。スラッシュ('/')で終了していなければなりません。
handler クラスを処理するハンドラ
    public static void forEach(final ZipInputStream zipInputStreamfinal ClassHandler handler) {
        forEach(zipInputStream""handler);
    }

    
ZIPファイル形式の入力ストリームに含まれるクラスをトラバースします。

入力ストリーム内のエントリのうち、接頭辞で始まるパスを持つエントリがトラバースの対象となります。 クラスを処理するハンドラには、接頭辞を除くエントリ名が渡されます。 例えば接頭辞が /aaa/bbb/ で、入力ストリーム内に /aaa/bbb/ccc/ddd/Eee.classというクラスファイルが存在すると、 ハンドラには パッケージ名ccc.dddおよびクラス名Eeeが渡されます。

Parameters:
zipInputStream ZIPファイル形式の入力ストリーム
prefix トラバースするリソースの名前が含む接頭辞。スラッシュ('/')で終了していなければなりません。
handler クラスを処理するハンドラ
    public static void forEach(final ZipInputStream zipInputStreamfinal String prefixfinal ClassHandler handler) {
        final int startPos = prefix.length();
        ZipEntry entry = null;
        while ((entry = LdiZipInputStreamUtil.getNextEntry(zipInputStream)) != null) {
            try {
                final String entryName = entry.getName().replace('\\''/');
                if (entryName.startsWith(prefix) && entryName.endsWith()) {
                    final String className = entryName.substring(startPosentryName.length() - .length()).replace('/''.');
                    final int pos = className.lastIndexOf('.');
                    final String packageName = (pos == -1) ? null : className.substring(0, pos);
                    final String shortClassName = (pos == -1) ? className : className.substring(pos + 1);
                    handler.processClass(packageNameshortClassName);
                }
            } finally {
                LdiZipInputStreamUtil.closeEntry(zipInputStream);
            }
        }
    }
    private static void traverseFileSystem(final File dirfinal String packageNamefinal ClassHandler handler) {
        final File[] files = dir.listFiles();
        for (int i = 0; i < files.length; ++i) {
            final File file = files[i];
            final String fileName = file.getName();
            if (file.isDirectory()) {
                traverseFileSystem(file, LdiClassUtil.concatName(packageNamefileName), handler);
            } else if (fileName.endsWith(".class")) {
                final String shortClassName = fileName.substring(0, fileName.length() - .length());
                handler.processClass(packageNameshortClassName);
            }
        }
    }
    private static File getPackageDir(final File rootDirfinal String rootPackage) {
        File packageDir = rootDir;
        if (rootPackage != null) {
            final String[] names = rootPackage.split("\\.");
            for (int i = 0; i < names.lengthi++) {
                packageDir = new File(packageDirnames[i]);
            }
        }
        return packageDir;
    }
New to GrepCode? Check out our FAQ X