FileDocCategorySizeDatePackage
SearchPath.javaAPI DocJ2ME CLDC 1.13767Wed Feb 05 15:56:04 GMT 2003kdp.classparser

SearchPath.java

/*
 * @(#)SearchPath.java    1.4 99/05/21
 *
 * Copyright © 2003 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. IN NO EVENT WILL SUN OR ITS
 * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
 * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
 * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
 * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 * 
 * This software is not designed or intended for use in on-line control of
 * aircraft, air traffic, aircraft navigation or aircraft communications; or in
 * the design, construction, operation or maintenance of any nuclear
 * facility. Licensee represents and warrants that it will not use or
 * redistribute the Software for such purposes.
 */

package kdp.classparser;

import kdp.Log;
import java.io.*;
import java.util.*;
import java.lang.*;

public class SearchPath {

    private String pathString;

    private String[] pathArray;

    public SearchPath(String searchPath) {
    //### Should check searchpath for well-formedness.
    StringTokenizer st = new StringTokenizer(searchPath, File.pathSeparator);
    List dlist = new ArrayList();
    while (st.hasMoreTokens()) {
        dlist.add(st.nextToken());
    }
    pathString = searchPath;
        Log.LOGN(3,  "!!!" + pathString );
    pathArray = (String[])dlist.toArray(new String[dlist.size()]);
    Log.LOGN(3, "Path array length is :"+pathArray.length);
    for(int i=0; i<pathArray.length; i++) {
        Log.LOGN(3, pathArray[i]);
    }
    }

    public boolean isEmpty() {
    return (pathArray.length == 0);
    }

    public String asString() {
    return pathString;
    }
    
    public String[] asArray() {
    return (String[])pathArray.clone();
    }
    
    public int path_array_length() {
        return pathArray.length;
    }

    public FileReference resolve(String relativeFileName) {
        Log.LOGN(4, "relative filename = " + relativeFileName);
        Log.LOGN(4, "path array length in resolve is " +pathArray.length);
    if (!relativeFileName.endsWith(".class"))
        relativeFileName += ".class";
    Log.LOGN(4, "relative filename now = " + relativeFileName);
        for (int i = 0; i < pathArray.length; i++) {
//            Log.LOGN(3, "path array = " + pathArray[i]);
//            Log.LOGN(3, "relativeFileName);
            Log.LOGN(5,  "pa=" + pathArray[ i ] + " " +
                                "rfa=" + relativeFileName );
            FileReference path = FileReference.create(pathArray[i], relativeFileName);
            if (path.exists()) {
                Log.LOGN(4,  "  exists" );
                return path;
            }
        }
        return null;
    }

    //### return List?

    public String[] children(String relativeDirName, FilenameFilter filter) {
    // If a file appears at the same relative path
    // with respect to multiple entries on the classpath,
    // the one corresponding to the earliest entry on the
    // classpath is retained.  This is the one that will be
    // found if we later do a 'resolve'.
    SortedSet s = new TreeSet();  // sorted, no duplicates
        for (int i = 0; i < pathArray.length; i++) {
            FileReference path = FileReference.create(pathArray[i], relativeDirName);
            if (path.exists()) {
        String[] childArray = path.list(filter);
        if (childArray != null) {
            for (int j = 0; j < childArray.length; j++) {
            if (!s.contains(childArray[j])) {
                s.add(childArray[j]);
            }
            }
        }
        }
    }
        return (String[])s.toArray(new String[s.size()]);
    }

}