You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@river.apache.org by jc...@apache.org on 2009/04/17 23:14:03 UTC
svn commit: r766158 [4/4] - in /incubator/river/jtsk/trunk: ./
integrationtests/ qa/ qa/doc/ qa/harness/ qa/harness/configs/
qa/harness/configs/http/ qa/harness/configs/http/fiddler/
qa/harness/configs/http/mahalo/ qa/harness/configs/http/mercury/ qa/h...
Propchange: incubator/river/jtsk/trunk/qa/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Fri Apr 17 21:12:01 2009
@@ -0,0 +1,4 @@
+classes
+lib-ext
+lib
+build
Propchange: incubator/river/jtsk/trunk/qa/
------------------------------------------------------------------------------
svn:mergeinfo =
Propchange: incubator/river/jtsk/trunk/qa/doc/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Fri Apr 17 21:12:01 2009
@@ -0,0 +1 @@
+api
Propchange: incubator/river/jtsk/trunk/qa/harness/trust/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Fri Apr 17 21:12:01 2009
@@ -0,0 +1,28 @@
+tester.cert
+fiddler.keystore
+mercury.cert
+group.cert
+mercury.keystore
+outrigger.keystore
+mahalo.password
+phoenix.cert
+phoenix.password
+norm.password
+fiddler.cert
+phoenix.keystore
+reggie.password
+outrigger.password
+mercury.password
+fiddler.password
+truststore
+reggie.keystore
+group.password
+tester.password
+tester.keystore
+group.keystore
+norm.keystore
+mahalo.cert
+outrigger.cert
+mahalo.keystore
+reggie.cert
+norm.cert
Propchange: incubator/river/jtsk/trunk/qa/src/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Fri Apr 17 21:12:01 2009
@@ -0,0 +1,2 @@
+build
+lib
Modified: incubator/river/jtsk/trunk/src/com/sun/jini/tool/ClassDep.java
URL: http://svn.apache.org/viewvc/incubator/river/jtsk/trunk/src/com/sun/jini/tool/ClassDep.java?rev=766158&r1=766157&r2=766158&view=diff
==============================================================================
--- incubator/river/jtsk/trunk/src/com/sun/jini/tool/ClassDep.java (original)
+++ incubator/river/jtsk/trunk/src/com/sun/jini/tool/ClassDep.java Fri Apr 17 21:12:01 2009
@@ -17,37 +17,22 @@
*/
package com.sun.jini.tool;
-import sun.tools.java.BinaryClass;
-import sun.tools.java.ClassDeclaration;
-import sun.tools.java.ClassFile;
-import sun.tools.java.ClassNotFound;
-import sun.tools.java.ClassPath;
-import sun.tools.java.Constants;
-import sun.tools.java.Environment;
-import sun.tools.java.Identifier;
-import sun.tools.java.MemberDefinition;
-import sun.tools.java.Package;
-import sun.tools.java.Type;
-
+import com.sun.jini.tool.classdepend.ClassDepend;
+import com.sun.jini.tool.classdepend.ClassDependParameters;
+import com.sun.jini.tool.classdepend.ClassDependParameters.CDPBuilder;
import java.text.MessageFormat;
-
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
-import java.util.StringTokenizer;
import java.util.SortedSet;
import java.util.TreeSet;
-
-import java.io.BufferedInputStream;
-import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
/**
* Tool used to analyze a set of classes and determine on what other classes
@@ -462,14 +447,8 @@
* @author Sun Microsystems, Inc.
*/
public class ClassDep {
- /**
- * Container for all the classes that we have seen.
- */
- private final HashSet seen = new HashSet();
- /**
- * Object used to load our classes.
- */
- private Env env;
+ private ClassDepend cd;
+
/**
* If true class names are printed using
* the system's File.separator, else the
@@ -507,6 +486,9 @@
* on doing work with the output of this utility. It does
* not impact this utility, but the work done on its
* generated output may have an impact.
+ *
+ * This will have to be implemented in ClassDepend note the above
+ * description conflicts with the variable name.
*/
private boolean ignoreOuter = true;
/**
@@ -593,6 +575,7 @@
* Constructor that takes command line arguments and fills in the
* appropriate fields. See the description of this class
* for a list and description of the acceptable arguments.
+ * @param cmdLine
*/
public ClassDep(String[] cmdLine){
setupOptions(cmdLine);
@@ -616,57 +599,16 @@
*
*/
private static void add(String arg, ArrayList elts) {
- if (!arg.endsWith("."))
+ if (!arg.endsWith(".")) {
arg = arg + '.';
- if (".".equals(arg))
+ }
+ if (".".equals(arg)) {
arg = null;
+ }
elts.add(arg);
}
/**
- * See if the provided name is covered by package prefixes.
- *
- * @param n the name
- * @param elts the list of package prefixes
- *
- * @return the length of the first matching package prefix
- *
- */
- private static int matches(String n, ArrayList elts) {
- for (int i = 0; i < elts.size(); i++) {
- String elt = (String)elts.get(i);
- /*
- * If we get a null element then see if we are looking
- * at an anonymous package.
- */
- if (elt == null) {
- int j = n.indexOf('.');
- /*
- * If we did not find a dot, or we have a space
- * at the beginning then we have an anonymous package.
- */
- if (j < 0 || n.charAt(j + 1) == ' ')
- return 0;
- } else if (n.startsWith(elt))
- return elt.length();
- }
- return -1;
- }
-
- /**
- * See if a name is covered by in but not excluded by out.
- *
- * @param n the name
- * @param in the package prefixes to include
- * @param out the package prefixes to exclude
- * @return true if covered by in but not excluded by out
- */
- private static boolean matches(String n, ArrayList in, ArrayList out) {
- int i = in.isEmpty() ? 0 : matches(n, in);
- return i >= 0 && matches(n, out) < i;
- }
-
- /**
* Recursively traverse a given path, finding all the classes that
* make up the set to work with. We take into account skips,
* prunes, and out sets defined.
@@ -683,31 +625,34 @@
* is unique for the matching that we are going to do
* next.
*/
- if (!apath.startsWith(File.separator))
+ if (!apath.startsWith(File.separator)) {
apath = File.separator + apath;
+ }
for (int i = 0; i < prunes.size(); i++) {
/*
* If we are on a root path that needs to be
* pruned leave this current recursive thread.
*/
- if (apath.endsWith((String)prunes.get(i)))
+ if (apath.endsWith((String)prunes.get(i))) {
return;
}
+ }
/*
* Get the current list of files at the current directory
* we are in. If there are no files then leave this current
* recursive thread.
*/
- String[] files = new File(path).list();
- if (files == null)
+ String[] files_ = new File(path).list();
+ if (files_ == null) {
return;
+ }
outer:
/*
* Now, take the found list of files and iterate over them.
*/
- for (int i = 0; i < files.length; i++) {
- String file = files[i];
+ for (int i = 0; i < files_.length; i++) {
+ String file = files_[i];
/*
* Now see if we have a ".class" file.
* If we do not then we lets call ourselves again.
@@ -739,17 +684,19 @@
for (int j = 0; j < skips.size(); j++) {
String skip = (String)skips.get(j);
int k = file.indexOf(skip);
- if (k < 0)
- continue;//leave this current loop.
+ if (k < 0) {
+ continue;
+ }//leave this current loop.
k += skip.length();
/*
* If we matched the entire class or if we have
* a class with an inner class, skip it and go
* on to the next outer loop.
*/
- if (file.length() == k || file.charAt(k) == '$')
+ if (file.length() == k || file.charAt(k) == '$') {
continue outer;
}
+ }
/*
* things to do:
* prune when outside.
@@ -759,8 +706,9 @@
* If so add them to our working list "classes".
*/
for (int j = 0; j < inside.size(); j++) {
- if (inside.get(j) == null)
+ if (inside.get(j) == null) {
continue;
+ }
int k = file.indexOf(File.separatorChar +
((String)inside.get(j)).replace(
'.', File.separatorChar));
@@ -790,17 +738,18 @@
private void traverse(String path, String rootPath) {
// get the current list of files at the current directory we are in. If
// there are no files then leave this current recursive thread.
- String[] files = new File(path).list();
- if (files == null)
+ String[] files_ = new File(path).list();
+ if (files_ == null) {
return;
+ }
// determine the package name in File.Separators notation
String packageName = path.substring(rootPath.length(), path.length())
+ File.separatorChar;
outer:
//take the found list of files and iterate over them
- for (int i = 0; i < files.length; i++) {
- String file = files[i];
+ for (int i = 0; i < files_.length; i++) {
+ String file = files_[i];
// see if we have a ".class" file. If not then we call ourselves
// again, assuming it is a directory, if not the call will return.
if (!file.endsWith(".class")) {
@@ -847,9 +796,10 @@
// if we matched the entire class or if we have a class with
// an inner class, skip it and go on to the next outer loop
if (className.length() == skip.length()
- || className.charAt(skip.length()) == '$')
+ || className.charAt(skip.length()) == '$') {
continue outer;
}
+ }
// we found a class that satisfy all the criteria, convert it
// to the proper notation
@@ -859,26 +809,8 @@
}
}
- /**
- * Depending on the part of the class file
- * that we are on the class types that we are
- * looking for can come in several flavors.
- * They can be embedded in arrays, they can
- * be labeled as Identifiers, or they can be
- * labeled as Types. This method handles
- * Types referenced by Identifiers. It'll take
- * the Type and proceed to get its classname
- * and then continue with the processing it
- * for dependencies.
- */
- private void process(Identifier from, Type type) {
- while (type.isType(Constants.TC_ARRAY))
- type = type.getElementType();
- if (type.isType(Constants.TC_CLASS))
- process(from, type.getClassName());
- }
- /**
+ /*
* Depending on the part of the class file
* that we are on the class types that we are
* looking for can come in several flavors.
@@ -905,183 +837,20 @@
*
* @param from the Identifier referenced from <code>id</code>
* @param id the Identifier being looked at
- */
- private void process(Identifier from, Identifier id) {
- /*
- * If <code>from</code> is not null see if the "id" that
- * references it is in our "tells" container. If there
- * is a match show the class. This is for debugging purposes,
- * in case you want to find out what classes use a particular class.
- */
- if (from != null) {
- for (int i = 0; i < tells.size(); i++) {
- if (id.toString().equals((String)tells.get(i))) {
- if (tells.size() > 1)
- print("classdep.cause", id, from);
- else
- print("classdep.cause1", from);
- }
- }
- }
-
- /*
- * Having taken care of the "-tells" switch, lets
- * proceed with the rest by getting the id's string
- * representation.
- */
- String n = id.toString();
-
- /*
- * Remove any array definitions so we can get to the
- * fully qualified class name that we are seeking.
- */
- if (n.charAt(0) == '[') {
- int i = 1;
- while (n.charAt(i) == '[')
- i++;
- /*
- * Now that we have removed possible array information
- * see if we have a Class definition e.g Ljava/lang/Object;.
- * If so, remove the 'L' and ';' and call ourselves
- * with this newly cleaned up Identifier.
- */
- if (n.charAt(i) == 'L')
- process(from,
- Identifier.lookup(n.substring(i + 1, n.length() - 1)));
- /*
- * Pop out of our recursive path, since the real work
- * is being down in another recursive thread.
- */
- return;
- }
-
- /*
- * If we have already seen the current Identifier, end this
- * thread of recursion.
- */
- if (seen.contains(id))
- return;
-
- /*
- * See if we have an empty set OR the Identifier is in our
- * "inside" set and the matched Identifier is not on the
- * "outside" set.
- *
- * If we are not in the "inside" set and we are not asking
- * for edges then pop out of this recursive thread.
- */
- boolean in = matches(n, inside, outside);
- if (!in && !edges)
- return;
-
- /*
- * We have an actual Identifier, so at this point mark it
- * as seen, so we don't create another recursive thread if
- * we see it again.
- */
- seen.add(id);
-
- /*
- * This is the test that decides whether this current
- * Identifier needs to be added to the list of dependencies
- * to save.
*
- * "in" can be true in the following cases:
- * <ul>
- * <li>the in set is empty
- * <li>the Identifier is in the "in" set and not on the "out" set.
- * </ul>
- */
- if (in != edges && matches(n, shows, hides))
- results.add(Type.mangleInnerType(id).toString());
-
- /*
- * If we are not in the "inside" set and we want edges
- * pop out of our recursive thread.
+ * The above was for the old process(Identifier from, Identifier id) method.
*/
- if (!in && edges)
- return;
-
- /*
- * At this point we have either added an Identifier
- * to our save list, or we have not. In either case
- * we need get the package qualified name of this so
- * we can see if it has any nested classes.
- */
- id = env.resolvePackageQualifiedName(id);
- BinaryClass cdef;
- try {
- cdef = (BinaryClass)env.getClassDefinition(id);
- cdef.loadNested(env);
- } catch (ClassNotFound e) {
- failed = true;
- print("classdep.notfound", id);
- return;
- } catch (IllegalArgumentException e) {
- failed = true;
- print("classdep.illegal", id, e.getMessage());
- return;
- } catch (Exception e) {
- failed = true;
- print("classdep.failed", id);
- e.printStackTrace();
- return;
- }
-
- /*
- * If the user asked to keep the outer parent for an
- * inner class then we'll get the list of dependencies
- * the inner class may have and iterate over then by
- * "processing" them as well.
- */
- Identifier outer = null;
- if (ignoreOuter && cdef.isInnerClass() && cdef.isStatic())
- outer = cdef.getOuterClass().getName();
- for (Enumeration deps = cdef.getDependencies();
- deps.hasMoreElements(); )
- {
- ClassDeclaration cd = (ClassDeclaration) deps.nextElement();
- /*
- * If we dont' want the outer parent class of an inner class
- * make this comparison, except when it is clear the outer class is
- * the super class of the static nested class.
- */
- if (outer != cd.getName()
- || (outer != null && cdef.getSuperClass() == cd)) {
-
- process(id, cd.getName());
- }
- }
-
-
- /*
- * Now we are going to walk the rest of the class file and see
- * if we can find any other class references.
- */
- for (MemberDefinition mem = cdef.getFirstMember();
- mem != null;
- mem = mem.getNextMember())
- {
- if (mem.isVariable()) {
- process(id, mem.getType());
- } else if (mem.isMethod() || mem.isConstructor()) {
- Type[] args = mem.getType().getArgumentTypes();
- for (int i = 0; i < args.length; i++) {
- process(id, args[i]);
- }
- process(id, mem.getType().getReturnType());
- }
- }
- }
private static class Compare implements Comparator {
public int compare(Object o1, Object o2) {
- if (o1 == null)
+ if (o1 == null) {
return o2 == null ? 0 : 1;
- else
+ }
+ else {
return o2 == null ? -1 : ((Comparable) o2).compareTo(o1);
}
}
+ }
/**
* Method that takes the user provided switches that
@@ -1117,11 +886,6 @@
Collections.sort(outside, c);
Collections.sort(shows, c);
Collections.sort(hides, c);
- /*
- * Create the environment from which we are going to be
- * loading classes from.
- */
- env = new Env(classpath);
/*
* Traverse the roots i.e the set of handed directories.
@@ -1137,15 +901,69 @@
traverse((String)roots.get(i));
}
}
+ // Now use ClassDepend to perform dependency computation
+ Iterator itr = classes.iterator();
+
+ //System.out.println("Classes to include:");
+ while (itr.hasNext()){
+ System.out.println(itr.next());
+ }
+
+ //Ready the Parameter Builder for ClassDepend
+ CDPBuilder cdpb = new CDPBuilder();
+
+ cdpb.addOutsidePackagesOrClasses(addClassesRecursively(outside))
+ .addOutsidePackagesOrClasses(skips)
+ .addInsidePackages(addClassesRecursively(inside))
+ .addShowPackages(addClassesRecursively(shows))
+ .addHidePackages(addClassesRecursively(hides));
+
+ if (classpath.length() == 0) { classpath = null; }
+ try {
+ cd = ClassDepend.newInstance(classpath, "JDK 1.4", true);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ ClassDependParameters cdp = cdpb.addRootClasses(classes)
+ .recurse(true)
+ .excludePlatformClasses(false)
+ .build();
+
+ try{
+ results.addAll(cd.compute(cdp));
+ }catch (ClassNotFoundException e){
+ e.printStackTrace();
+ }catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ /*
for (int i = 0; i < classes.size(); i++) {
- process(null, Identifier.lookup((String)classes.get(i)));
+ process(null, (String)classes.get(i));
}
- if (!tells.isEmpty())
+ */
+
+ /* the -tells option needs to be handled by ClassDepend somehow
+ */
+
+ if (!tells.isEmpty()) {
return new String[0];
+ }
return (String[])results.toArray(new String[results.size()]);
}
/**
+ * Add all classes in Packages and subpackages recursively by appending **
+ * as per the syntax requirements of the ClassDepend API.
+ */
+ private List addClassesRecursively(List list){
+ for ( int i = 0, l = list.size() ; i < l ; i++){
+ list.set(i , list.get(i) + "**");
+ }
+ return list;
+ }
+
+ /**
* Print out the usage for this utility.
*/
public static void usage() {
@@ -1154,6 +972,7 @@
/**
* Set the classpath to use for finding our class definitions.
+ * @param classpath
*/
public void setClassPath(String classpath) {
this.classpath = classpath;
@@ -1165,6 +984,7 @@
* <code>File.separator</code>, else <code>.</code>'s
* will be used.
* If not set the default is <code>false</code>.
+ * @param files
*/
public void setFiles(boolean files) {
this.files = files;
@@ -1173,6 +993,7 @@
/**
* Add an entry into the set of package prefixes that
* are to remain hidden from processing.
+ * @param packagePrefix
*/
public void addHides(String packagePrefix) {
add(packagePrefix, hides);
@@ -1181,6 +1002,7 @@
/**
* Add an entry into the working set of package prefixes
* that will make up the working domain space.
+ * @param packagePrefix
*/
public void addInside(String packagePrefix) {
add(packagePrefix, inside);
@@ -1196,6 +1018,7 @@
* <p>
* <b>Note:</b> These edge classes must included
* in the classpath for this utility.
+ * @param edges
*/
public void setEdges(boolean edges) {
this.edges = edges;
@@ -1206,6 +1029,7 @@
* that will bypassed during dependency checking.
* These entries should be subsets of the contents
* on the inside set.
+ * @param packagePrefix
*/
public void addOutside(String packagePrefix) {
add(packagePrefix, outside);
@@ -1219,11 +1043,13 @@
* This method has no impact if the new behavior is effective for the
* interpretation of the root directories for finding class files to
* include for dependency checking.
+ * @param packagePrefix
*/
public void addPrune(String packagePrefix) {
String arg = packagePrefix;
- if (arg.endsWith("."))
+ if (arg.endsWith(".")) {
arg = arg.substring(0, arg.length() - 1);
+ }
/*
* Convert dots into File.separator for later usage.
*/
@@ -1235,6 +1061,7 @@
* Controls whether the behavior for finding class files in the specified
* directories, if any, must be based on the old behavior (the default) or
* the new behavior that solves some of the problems with the old behavior.
+ * @param newBehavior
*/
public void setRootDirBehavior(boolean newBehavior) {
newRootDirBehavior = newBehavior;
@@ -1248,19 +1075,22 @@
* Adding entries without a call to {@link #setRootDirBehavior(boolean)}
* with <code>true</code> as the argument will cause {@link #compute()} to
* fail.
+ * @param packagePrefix
*/
public void addInsideRoot(String packagePrefix) {
String arg = packagePrefix;
- if (arg.endsWith("."))
+ if (arg.endsWith(".")) {
arg = arg.substring(0, arg.length() - 1);
+ }
/*
* Convert dots into File.separator for later usage.
*/
- if (arg.trim().length() == 0)
+ if (arg.trim().length() == 0) {
arg = File.separator;
- else
- arg = File.separator + arg.replace('.', File.separatorChar)
- + File.separator;
+ }
+ else {
+ arg = File.separator + arg.replace('.', File.separatorChar) + File.separator;
+ }
insideRoots.add(arg);
}
@@ -1272,19 +1102,22 @@
* Adding entries without a call to {@link #setRootDirBehavior(boolean)}
* with <code>true</code> as the argument will cause {@link #compute()} to
* fail.
+ * @param packagePrefix
*/
public void addOutsideRoot(String packagePrefix) {
String arg = packagePrefix;
- if (arg.endsWith("."))
+ if (arg.endsWith(".")) {
arg = arg.substring(0, arg.length() - 1);
+ }
/*
* Convert dots into File.separator for later usage.
*/
- if (arg.trim().length() == 0)
+ if (arg.trim().length() == 0) {
arg = File.separator;
- else
- arg = File.separator + arg.replace('.', File.separatorChar)
- + File.separator;
+ }
+ else {
+ arg = File.separator + arg.replace('.', File.separatorChar) + File.separator;
+ }
outsideRoots.add(arg);
}
@@ -1294,6 +1127,7 @@
* This applies only to the final output, so this
* set should be a subset of the inside set with
* edges, if that was indicated.
+ * @param packagePrefix
*/
public void addShow(String packagePrefix) {
add(packagePrefix, shows);
@@ -1302,13 +1136,19 @@
/**
* Add an entry into the set of classes that
* should be skipped during dependency generation.
+ * @param packagePrefix
*/
public void addSkip(String packagePrefix){
String arg = packagePrefix;
- if (arg.endsWith("."))
+ if (arg.endsWith(".")) {
arg = arg.substring(0, arg.length() - 1);
- else
+ }
+ /* No Longer required as ClassDepend will be passed the skips array
+ else {
seen.add(Identifier.lookup(arg));
+ }
+ */
+
/*
* Convert dots into File.separator for later usage.
*/
@@ -1321,6 +1161,7 @@
* that lie with the inside set are listed. This in
* the converse of the rest of the utility and is meant
* more for debugging purposes.
+ * @param className
*/
public void addTells(String className) {
tells.add(className);
@@ -1332,11 +1173,13 @@
* the working domain space as defined by the
* intersection of the following sets:
* inside,outside,prune,show, and hide.
+ * @param rootName
*/
public void addRoots(String rootName) {
- if (rootName.endsWith(File.separator))
+ if (rootName.endsWith(File.separator)) {
//remove trailing File.separator
rootName = rootName.substring(0, rootName.length() - 1);
+ }
//these are directories.
roots.add(rootName);
}
@@ -1344,6 +1187,7 @@
/**
* Add an entry into the set of classes that
* dependencies are going to be computed on.
+ * @param className
*/
public void addClasses(String className) {
classes.add(className);
@@ -1352,6 +1196,7 @@
/**
* If true classnames will be separated using
* File.separator, else it will use dots.
+ * @return true or false
*/
public boolean getFiles() {
return files;
@@ -1359,6 +1204,7 @@
/**
* Accessor method for the found dependencies.
+ * @return String[] dependencies
*/
public String[] getResults() {
String[] vals = (String[])results.toArray(new String[results.size()]);
@@ -1381,6 +1227,7 @@
* Convenience method for initializing an instance with specific
* command line arguments. See the description of this class
* for a list and description of the acceptable arguments.
+ * @param args
*/
public void setupOptions(String[] args) {
for (int i = 0; i < args.length ; i++ ) {
@@ -1432,7 +1279,6 @@
addClasses(arg);
}
}
-
}
private static ResourceBundle resources;
@@ -1465,8 +1311,9 @@
*/
private static void print(String key, Object val) {
String fmt = getString(key);
- if (fmt == null)
+ if (fmt == null) {
fmt = "no text found: \"" + key + "\" {0}";
+ }
System.err.println(MessageFormat.format(fmt, new Object[]{val}));
}
@@ -1475,8 +1322,9 @@
*/
private static void print(String key, Object val1, Object val2) {
String fmt = getString(key);
- if (fmt == null)
+ if (fmt == null) {
fmt = "no text found: \"" + key + "\" {0} {1}";
+ }
System.err.println(MessageFormat.format(fmt,
new Object[]{val1, val2}));
}
@@ -1495,191 +1343,15 @@
//boolean files = false;
dep.setupOptions(args);
String[] vals = dep.compute();
+
for (int i = 0; i < vals.length; i++) {
- if (dep.getFiles())
- System.out.println(vals[i].replace('.', File.separatorChar) +
- ".class");
- else
+ if (dep.getFiles()) {
+ System.out.println(vals[i].replace('.', File.separatorChar) + ".class");
+ }
+ else {
System.out.println(vals[i]);
}
}
-
- /**
- * Private class to load classes, resolve class names and report errors.
- *
- * @see sun.tools.java.Environment
- */
- private static class Env extends Environment {
- private final ClassPath noPath = new ClassPath("");
- private final ClassPath path;
- private final HashMap packages = new HashMap();
- private final HashMap classes = new HashMap();
-
- public Env(String classpath) {
- for (StringTokenizer st =
- new StringTokenizer(System.getProperty("java.ext.dirs"),
- File.pathSeparator);
- st.hasMoreTokens(); )
- {
- String dir = st.nextToken();
- String[] files = new File(dir).list();
- if (files != null) {
- if (!dir.endsWith(File.separator)) {
- dir += File.separator;
- }
- for (int i = files.length; --i >= 0; ) {
- classpath =
- dir + files[i] + File.pathSeparator + classpath;
}
- }
- }
- path = new ClassPath(System.getProperty("sun.boot.class.path") +
- File.pathSeparator + classpath);
- }
-
- /**
- * We don't use flags so we override Environments and
- * simply return 0.
- */
- public int getFlags() {
- return 0;
- }
- /**
- * Take the identifier and see if the class that represents exists.
- * <code>true</code> if the identifier is found, <code>false</code>
- * otherwise.
- */
- public boolean classExists(Identifier id) {
- if (id.isInner())
- id = id.getTopName();
- Type t = Type.tClass(id);
- try {
- ClassDeclaration c = (ClassDeclaration)classes.get(t);
- if (c == null) {
- Package pkg = getPackage(id.getQualifier());
- return pkg.getBinaryFile(id.getName()) != null;
- }
- return c.getName().equals(id);
- } catch (IOException e) {
- return false;
- }
- }
- public ClassDeclaration getClassDeclaration(Identifier id) {
- return getClassDeclaration(Type.tClass(id));
}
-
- public ClassDeclaration getClassDeclaration(Type t) {
- ClassDeclaration c = (ClassDeclaration)classes.get(t);
- if (c == null) {
- c = new ClassDeclaration(t.getClassName());
- classes.put(t, c);
- }
- return c;
- }
-
- public Package getPackage(Identifier pkg) throws IOException {
- Package p = (Package)packages.get(pkg);
- if (p == null) {
- p = new Package(noPath, path, pkg);
- packages.put(pkg, p);
- }
- return p;
- }
-
- BinaryClass loadFile(ClassFile file) throws IOException {
- DataInputStream in =
- new DataInputStream(new BufferedInputStream(
- file.getInputStream()));
- try {
- return BinaryClass.load(new Environment(this, file), in,
- ATT_ALLCLASSES);
- } catch (ClassFormatError e) {
- throw new IllegalArgumentException("ClassFormatError: " +
- file.getPath());
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- } finally {
- in.close();
- }
- }
-
- /**
- * Overridden method from Environment
- */
- public void loadDefinition(ClassDeclaration c) {
- Identifier id = c.getName();
- if (c.getStatus() != CS_UNDEFINED)
- throw new IllegalArgumentException("No file for: " + id);
- Package pkg;
- try {
- pkg = getPackage(id.getQualifier());
- } catch (IOException e) {
- throw new IllegalArgumentException("IOException: " +
- e.getMessage());
- }
- ClassFile file = pkg.getBinaryFile(id.getName());
- if (file == null)
- throw new IllegalArgumentException("No file for: " +
- id.getName());
- BinaryClass bc;
- try {
- bc = loadFile(file);
- } catch (IOException e) {
- throw new IllegalArgumentException("IOException: " +
- e.getMessage());
- }
- if (bc == null)
- throw new IllegalArgumentException("No class in: " +
- file);
- if (!bc.getName().equals(id))
- throw new IllegalArgumentException("Wrong class in: " +
- file);
- c.setDefinition(bc, CS_BINARY);
- bc.loadNested(this, ATT_ALLCLASSES);
- }
-
- private static ResourceBundle resources;
- private static boolean resinit = false;
-
- /**
- * Get the strings from javac resource localization bundle.
- */
- private static synchronized String getString(String key) {
- if (!resinit) {
- try {
- resources = ResourceBundle.getBundle
- ("sun.tools.javac.resources.javac");
- resinit = true;
- } catch (MissingResourceException e) {
- e.printStackTrace();
- }
- }
- if (key.startsWith("warn."))
- key = key.substring(5);
- try {
- return resources.getString("javac.err." + key);
- } catch (MissingResourceException e) {
- return null;
- }
- }
-
- public void error(Object source,
- long where,
- String err,
- Object arg1,
- Object arg2,
- Object arg3)
- {
- String fmt = getString(err);
- if (fmt == null)
- fmt = "no text found: \"" + err + "\" {0} {1} {2}";
- output(MessageFormat.format(fmt, new Object[]{arg1, arg2, arg3}));
- }
-
- public void output(String msg) {
- System.err.println(msg);
- }
- }
-}