package gw.lang.reflect.module;
import gw.util.fingerprint.FP64;
import gw.lang.UnstableAPI;
import java.io.File;
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
import java.util.HashSet;
/**
* NOTE: This API is in flux. This class may be moved to a different package, renamed, or have its methods change
* in future releases.
*
* Copyright 2010 Guidewire Software, Inc.
*/
@UnstableAPI
public interface IClassPath
{
String GW_API_PREFIX = "gw.";
String GW_INTERNAL_PREFIX = "gw.internal.";
String SUN_CLASS_PREFIX = "sun.";
String COM_SUN_CLASS_PREFIX = "com.sun.";
String PLACEHOLDER_FOR_PACKAGE = "PLACEHOLDER";
ClassPathFilter ALLOW_ALL_FILTER =
new ClassPathFilter()
{
public boolean acceptClass( String className )
{
// Do not expose Sun's classes. We shouldn't encourage their use and some
// of them behave badly during static initialization, which interferes
// with the typeinfo database.
return !className.startsWith( SUN_CLASS_PREFIX ) &&
!className.startsWith( COM_SUN_CLASS_PREFIX );
}
};
ClassPathFilter ONLY_API_CLASSES =
new ClassPathFilter()
{
public boolean acceptClass( String className )
{
return className.startsWith( GW_API_PREFIX ) && !className.startsWith(GW_INTERNAL_PREFIX);
}
};
String[] getPaths();
ClassPathInfo loadClasspathInfo( ClassPathFilter filter, boolean includeAllNames );
public static interface ClassPathFilter
{
public boolean acceptClass( String className );
}
public static class ClassPathInfo
{
Map<String, FileInfo> _fileInfos = new HashMap<String, FileInfo>();
private Set<Long> _allFingerprints = new HashSet<Long>( );
private boolean _collectFingerprints;
public ClassPathInfo( boolean collectFingerprints )
{
_collectFingerprints = collectFingerprints;
}
public Map<String, FileInfo> getFilteredFileInfos()
{
return _fileInfos;
}
public boolean isCollectFingerprints()
{
return _collectFingerprints;
}
public Set<String> getFilteredClassNames()
{
return _fileInfos.keySet();
}
public void visitClassName( String className )
{
if( _collectFingerprints )
{
_allFingerprints.add( new FP64(className).getRawFingerprint() );
}
}
public boolean isPossibleValidClassName( String name )
{
return !_collectFingerprints ||
_allFingerprints.contains( new FP64( name ).getRawFingerprint() ) ||
name.startsWith( GW_INTERNAL_PREFIX ); // have to include internal classes since we filter those out
// in the default environment
}
}
public static class FileInfo {
private boolean _isFiltered;
private File file;
private long _lastModDate;
private int _size;
public FileInfo(boolean filtered, File file) {
_isFiltered = filtered;
this.file = file;
_lastModDate = -1;
}
public boolean isFiltered() {
return _isFiltered;
}
public FP64 getFingerprint() {
if(_lastModDate == -1) {
_lastModDate = file.lastModified();
_size = (int) file.length();
}
FP64 fp64 = new FP64();
fp64.extend(_lastModDate);
fp64.extend(_size);
return fp64;
}
}
}