Index: third_party/jmake/src/org/pantsbuild/jmake/PCDEntry.java |
diff --git a/third_party/jmake/src/org/pantsbuild/jmake/PCDEntry.java b/third_party/jmake/src/org/pantsbuild/jmake/PCDEntry.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..72fb3a47f7762639687c95d332d82db9a7a59fb7 |
--- /dev/null |
+++ b/third_party/jmake/src/org/pantsbuild/jmake/PCDEntry.java |
@@ -0,0 +1,111 @@ |
+/* Copyright (c) 2002-2008 Sun Microsystems, Inc. All rights reserved |
+ * |
+ * This program is distributed under the terms of |
+ * the GNU General Public License Version 2. See the LICENSE file |
+ * at the top of the source tree. |
+ */ |
+package org.pantsbuild.jmake; |
+ |
+import java.io.File; |
+ |
+/** |
+ * An instance of this class represents an entry in the Project Class Directory. |
+ * |
+ * @author Misha Dmitriev |
+ * 29 March 2002 |
+ */ |
+public class PCDEntry { |
+ // Class versions compare results |
+ |
+ static final int CV_UNCHECKED = 0; |
+ static final int CV_COMPATIBLE = 1; |
+ static final int CV_INCOMPATIBLE = 2; |
+ static final int CV_DELETED = 3; |
+ static final int CV_NEW = 4; |
+ static final int CV_NEWER_FOUND_NEARER = 5; |
+ String className; // Dots are replaced with slashes for convenience |
+ transient String classFileFullPath; |
+ String javaFileFullPath; |
+ long oldClassFileLastModified; |
+ transient long newClassFileLastModified; |
+ long oldClassFileFingerprint; |
+ transient long newClassFileFingerprint; |
+ ClassInfo oldClassInfo; |
+ transient ClassInfo newClassInfo; |
+ transient int checkResult; // Reflects the result of class version comparison |
+ transient boolean checked; // Mark entries for classes that have been checked and found existing. |
+ // It helps to detect double entries for the same class in the project file list, |
+ // and also not to confuse them with the case when a .java source for a class is moved. |
+ |
+ /** This constructor is called to initialize a record for a class that has just been added to the project. */ |
+ public PCDEntry(String className, |
+ String javaFileFullPath, |
+ String classFileFullPath, |
+ long classFileLastModified, |
+ long classFileFingerprint, |
+ ClassInfo classInfo) { |
+ this.className = className; |
+ this.classFileFullPath = classFileFullPath; |
+ this.javaFileFullPath = javaFileFullPath; |
+ this.oldClassFileLastModified = this.newClassFileLastModified = |
+ classFileLastModified; |
+ this.oldClassFileFingerprint = this.newClassFileFingerprint = |
+ classFileFingerprint; |
+ this.newClassInfo = classInfo; |
+ checked = true; |
+ } |
+ |
+ /** |
+ * This constructor is called to initialize a record for a class that |
+ * exists at least in the previous version of the project. |
+ */ |
+ public PCDEntry(String className, |
+ String javaFileFullPath, |
+ long classFileLastModified, |
+ long classFileFingerprint, |
+ ClassInfo classInfo) { |
+ this.className = className; |
+ this.javaFileFullPath = javaFileFullPath; |
+ this.oldClassFileLastModified = classFileLastModified; |
+ this.oldClassFileFingerprint = classFileFingerprint; |
+ this.oldClassInfo = classInfo; |
+ } |
+ |
+ // Debugging |
+ public String toString() { |
+ return "className = " + className + |
+ "; classFileFullPath = " + classFileFullPath + |
+ "; javaFileFullPath = " + javaFileFullPath; |
+ } |
+ |
+ /** |
+ * Returns the name of the class that corresponds to the file name, i.e. the public class |
+ */ |
+ private String getExpectedClassName() { |
+ File path = new File(javaFileFullPath); |
+ int index = -1; |
+ do { |
+ index = className.indexOf('/', index + 1); |
+ path = path.getParentFile(); |
+ } while (index != -1); |
+ String pathString = path.toString(); |
+ if (!pathString.endsWith("/")) |
+ pathString += "/"; |
+ // It is assumed that the javaFileFillPath ends with .java |
+ int javaPathWithoutSuffix = javaFileFullPath.length() - 5; |
+ return javaFileFullPath.substring(pathString.length(), |
+ javaPathWithoutSuffix); |
+ } |
+ |
+ /** |
+ * A class that neither has the same name as the java file, nor an inner class, is |
+ * package-private. |
+ */ |
+ public boolean isPackagePrivateClass() { |
+ String expectedClassName = getExpectedClassName(); |
+ |
+ return !(className.equals(expectedClassName) |
+ || (className.startsWith(expectedClassName) |
+ && className.charAt(expectedClassName.length()) == '$')); |
+ } |
+} |