You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2009/10/09 17:06:49 UTC
svn commit: r823576 - in
/harmony/enhanced/classlib/trunk/modules/archive/src:
main/java/java/util/jar/ main/java/org/apache/harmony/archive/util/
test/java-internal/org/apache/harmony/archive/util/
Author: tellison
Date: Fri Oct 9 15:06:48 2009
New Revision: 823576
URL: http://svn.apache.org/viewvc?rev=823576&view=rev
Log:
Updates for clarity.
- rename the Util methods and given them some javadoc.
- remove the general regionMatches, and replace with equals and endsWith methods.
- give JarFile a few comments to explain what is happening.
Modified:
harmony/enhanced/classlib/trunk/modules/archive/src/main/java/java/util/jar/Attributes.java
harmony/enhanced/classlib/trunk/modules/archive/src/main/java/java/util/jar/JarFile.java
harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/util/Util.java
harmony/enhanced/classlib/trunk/modules/archive/src/test/java-internal/org/apache/harmony/archive/util/UtilTest.java
Modified: harmony/enhanced/classlib/trunk/modules/archive/src/main/java/java/util/jar/Attributes.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/java/util/jar/Attributes.java?rev=823576&r1=823575&r2=823576&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/archive/src/main/java/java/util/jar/Attributes.java (original)
+++ harmony/enhanced/classlib/trunk/modules/archive/src/main/java/java/util/jar/Attributes.java Fri Oct 9 15:06:48 2009
@@ -225,7 +225,7 @@
}
/**
- * returns whether the argument provided is the same as the attribute
+ * Returns whether the argument provided is the same as the attribute
* name.
*
* @return if the attribute names correspond.
@@ -239,7 +239,7 @@
return false;
}
- return Util.equalsIgnoreCase(name, ((Name) object).name);
+ return Util.asciiEqualsIgnoreCase(name, ((Name) object).name);
}
/**
Modified: harmony/enhanced/classlib/trunk/modules/archive/src/main/java/java/util/jar/JarFile.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/java/util/jar/JarFile.java?rev=823576&r1=823575&r2=823576&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/archive/src/main/java/java/util/jar/JarFile.java (original)
+++ harmony/enhanced/classlib/trunk/modules/archive/src/main/java/java/util/jar/JarFile.java Fri Oct 9 15:06:48 2009
@@ -45,10 +45,13 @@
*/
public static final String MANIFEST_NAME = "META-INF/MANIFEST.MF"; //$NON-NLS-1$
+ // The directory containing the manifest.
static final String META_DIR = "META-INF/"; //$NON-NLS-1$
+ // The manifest after it has been read from the JAR.
private Manifest manifest;
+ // The entry for the MANIFEST.MF file before it is read.
private ZipEntry manifestEntry;
JarVerifier verifier;
@@ -213,7 +216,6 @@
*/
public JarFile(String filename) throws IOException {
this(filename, true);
-
}
/**
@@ -329,6 +331,7 @@
*/
public Manifest getManifest() throws IOException {
if (closed) {
+ // archive.35=JarFile has been closed
throw new IllegalStateException(Messages.getString("archive.35")); //$NON-NLS-1$
}
if (manifest != null) {
@@ -341,39 +344,48 @@
verifier.addMetaEntry(manifestEntry.getName(), buffer);
}
manifest = new Manifest(buffer, verifier != null);
- manifestEntry = null;
+ manifestEntry = null; // Can discard the entry now.
} catch (NullPointerException e) {
manifestEntry = null;
}
return manifest;
}
+ /**
+ * Called by the JarFile constructors, this method reads the contents of the
+ * file's META-INF/ directory and picks out the MANIFEST.MF file and
+ * verifier signature files if they exist. Any signature files found are
+ * registered with the verifier.
+ *
+ * @throws IOException
+ * if there is a problem reading the jar file entries.
+ */
private void readMetaEntries() throws IOException {
+ // Get all meta directory entries
ZipEntry[] metaEntries = getMetaEntriesImpl();
- int dirLength = META_DIR.length();
+ if (metaEntries == null) {
+ verifier = null;
+ return;
+ }
boolean signed = false;
- if (null != metaEntries) {
- for (ZipEntry entry : metaEntries) {
- String entryName = entry.getName();
- if (manifestEntry == null
- && manifest == null
- && Util.ASCIIIgnoreCaseRegionMatches(entryName,
- dirLength, MANIFEST_NAME, dirLength,
- MANIFEST_NAME.length() - dirLength)) {
- manifestEntry = entry;
- if (verifier == null) {
- break;
- }
- } else if (verifier != null
- && entryName.length() > dirLength
- && (Util.ASCIIIgnoreCaseRegionMatches(entryName,
- entryName.length() - 3, ".SF", 0, 3) //$NON-NLS-1$
- || Util.ASCIIIgnoreCaseRegionMatches(entryName,
- entryName.length() - 4, ".DSA", 0, 4) //$NON-NLS-1$
- || Util.ASCIIIgnoreCaseRegionMatches(entryName,
- entryName.length() - 4, ".RSA", 0, 4))) { //$NON-NLS-1$
+ for (ZipEntry entry : metaEntries) {
+ String entryName = entry.getName();
+ // Is this the entry for META-INF/MANIFEST.MF ?
+ if (manifestEntry == null
+ && Util.asciiEqualsIgnoreCase(MANIFEST_NAME, entryName)) {
+ manifestEntry = entry;
+ // If there is no verifier then we don't need to look any further.
+ if (verifier == null) {
+ break;
+ }
+ } else {
+ // Is this an entry that the verifier needs?
+ if (verifier != null
+ && (Util.asciiEndsWithIgnoreCase(entryName, ".SF")
+ || Util.asciiEndsWithIgnoreCase(entryName, ".DSA")
+ || Util.asciiEndsWithIgnoreCase(entryName, ".RSA"))) {
signed = true;
InputStream is = super.getInputStream(entry);
byte[] buf = getAllBytesFromStreamAndClose(is);
@@ -381,6 +393,8 @@
}
}
}
+
+ // If there were no signature files, then no verifier work to do.
if (!signed) {
verifier = null;
}
@@ -449,24 +463,28 @@
return je;
}
+ /**
+ * Returns all the ZipEntry's that relate to files in the
+ * JAR's META-INF directory.
+ *
+ * @return the list of ZipEntry's or {@code null} if there are none.
+ */
private ZipEntry[] getMetaEntriesImpl() {
- List<ZipEntry> list = new ArrayList<ZipEntry>();
-
+ List<ZipEntry> list = new ArrayList<ZipEntry>(8);
Enumeration<? extends ZipEntry> allEntries = entries();
while (allEntries.hasMoreElements()) {
ZipEntry ze = allEntries.nextElement();
- if (ze.getName().startsWith("META-INF/") && //$NON-NLS-1$
- ze.getName().length() > 9) {
+ if (ze.getName().startsWith(META_DIR)
+ && ze.getName().length() > META_DIR.length()) {
list.add(ze);
}
}
- if (list.size() != 0) {
- ZipEntry[] result = new ZipEntry[list.size()];
- list.toArray(result);
- return result;
- } else {
+ if (list.size() == 0) {
return null;
}
+ ZipEntry[] result = new ZipEntry[list.size()];
+ list.toArray(result);
+ return result;
}
/**
Modified: harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/util/Util.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/util/Util.java?rev=823576&r1=823575&r2=823576&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/util/Util.java (original)
+++ harmony/enhanced/classlib/trunk/modules/archive/src/main/java/org/apache/harmony/archive/util/Util.java Fri Oct 9 15:06:48 2009
@@ -17,62 +17,113 @@
package org.apache.harmony.archive.util;
+/**
+ * Helpers for the archive module.
+ */
public class Util {
- public static boolean ASCIIIgnoreCaseRegionMatches(String s1, int start1,
- String s2, int start2, int length) {
-
- if (s1 != null && s2 != null) {
- if (start1 < 0 || length > s1.length() - start1) {
- return false;
- }
- if (start2 < 0 || length > s2.length() - start2) {
+ /**
+ * Returns whether the given source string ends with the suffix, ignoring
+ * case and assuming that the strings are ascii encoded.
+ *
+ * @param source
+ * the string to match.
+ * @param suffix
+ * the suffix to test.
+ * @return {@code true} if the source does end with the given suffix, or
+ * {@code false} if not.
+ */
+ public static boolean asciiEndsWithIgnoreCase(String source, String suffix) {
+ int length = suffix.length();
+ if (length > source.length()) {
+ return false;
+ }
+ int offset = source.length() - length;
+ for (int i = 0; i < length; i++) {
+ char c1 = source.charAt(i + offset);
+ char c2 = suffix.charAt(i);
+ if (c1 != c2 && toASCIIUpperCase(c1) != toASCIIUpperCase(c2)) {
return false;
}
-
- char c1, c2;
- for (int i = 0; i < length; i++) {
- if ((c1 = s1.charAt(start1++)) != (c2 = s2.charAt(start2++))
- && toASCIIUpperCase(c1) != toASCIIUpperCase(c2)) {
- return false;
- }
- }
- return true;
}
- throw new NullPointerException();
+ return true;
}
- public static final boolean equalsIgnoreCase(byte[] buf1, byte[] buf2) {
+ /**
+ * Compares the given byte arrays and returns whether they are equal,
+ * ignoring case differences and assuming they are ascii-encoded strings.
+ *
+ * @param buf1
+ * first byte array to compare.
+ * @param buf2
+ * second byte array to compare.
+ * @return the result of the comparison.
+ */
+ public static boolean asciiEqualsIgnoreCase(byte[] buf1, byte[] buf2) {
+ if (buf1 == null || buf2 == null) {
+ return false;
+ }
if (buf1 == buf2) {
return true;
}
-
- if (buf1 == null || buf2 == null || buf1.length != buf2.length) {
+ if (buf1.length != buf2.length) {
return false;
}
- byte b1, b2;
-
for (int i = 0; i < buf1.length; i++) {
- if ((b1 = buf1[i]) != (b2 = buf2[i])
- && toASCIIUpperCase(b1) != toASCIIUpperCase(b2)) {
+ byte b1 = buf1[i];
+ byte b2 = buf2[i];
+ if (b1 != b2 && toASCIIUpperCase(b1) != toASCIIUpperCase(b2)) {
return false;
}
}
return true;
}
- static final char toASCIIUpperCase(char c) {
- if ('a' <= c && c <= 'z') {
- return (char) (c - ('a' - 'A'));
+ /**
+ * Compares the given strings and returns whether they are equal, ignoring
+ * case differences and assuming they are ascii-encoded strings.
+ *
+ * @param s1
+ * first string to compare.
+ * @param s2
+ * second string to compare.
+ * @return the result of the comparison.
+ */
+ public static boolean asciiEqualsIgnoreCase(String s1, String s2) {
+ if (s1 == null || s2 == null) {
+ return false;
}
- return c;
+ if (s1 == s2) {
+ return true;
+ }
+
+ int length = s1.length();
+ if (length != s2.length()) {
+ return false;
+ }
+
+ for (int i = 0; i < length; i++) {
+ char c1 = s1.charAt(i);
+ char c2 = s2.charAt(i);
+ if (c1 != c2 && toASCIIUpperCase(c1) != toASCIIUpperCase(c2)) {
+ return false;
+ }
+ }
+ return true;
}
- static final byte toASCIIUpperCase(byte b) {
+ private static final byte toASCIIUpperCase(byte b) {
if ('a' <= b && b <= 'z') {
return (byte) (b - ('a' - 'A'));
}
return b;
}
+
+ private static final char toASCIIUpperCase(char c) {
+ if ('a' <= c && c <= 'z') {
+ return (char) (c - ('a' - 'A'));
+ }
+ return c;
+ }
}
Modified: harmony/enhanced/classlib/trunk/modules/archive/src/test/java-internal/org/apache/harmony/archive/util/UtilTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/trunk/modules/archive/src/test/java-internal/org/apache/harmony/archive/util/UtilTest.java?rev=823576&r1=823575&r2=823576&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/archive/src/test/java-internal/org/apache/harmony/archive/util/UtilTest.java (original)
+++ harmony/enhanced/classlib/trunk/modules/archive/src/test/java-internal/org/apache/harmony/archive/util/UtilTest.java Fri Oct 9 15:06:48 2009
@@ -43,44 +43,27 @@
}
}
- public void testASCIIIgnoreCaseRegionMatches() {
+ public void testasciiEndsWithIgnoreCase() {
final String s1 = ASCII_ALPHABET_LC;
final String s2 = ASCII_ALPHABET_UC;
- for (int i = 0; i < s1.length(); i++) {
- assertTrue(Util.ASCIIIgnoreCaseRegionMatches(s1, i, s2, i, s1
- .length()
- - i));
- }
- }
-
- public void testToASCIIUpperCaseByte() {
- for (int i = 0; i < ASCII_ALPHABET_LC_BYTES.length; i++) {
- assertEquals(ASCII_ALPHABET_UC_BYTES[i], Util
- .toASCIIUpperCase(ASCII_ALPHABET_LC_BYTES[i]));
- }
- for (int i = 0; i < ASCII_ALPHABET_UC_BYTES.length; i++) {
- assertEquals(ASCII_ALPHABET_UC_BYTES[i], Util
- .toASCIIUpperCase(ASCII_ALPHABET_UC_BYTES[i]));
- }
+ assertTrue(Util.asciiEndsWithIgnoreCase(s1, s2));
+ assertTrue(Util.asciiEndsWithIgnoreCase(s2, s1));
+ assertTrue(Util.asciiEndsWithIgnoreCase(s1, "wxyz"));
}
- public void testToASCIIUpperCaseChar() {
- for (int i = 0; i < ASCII_ALPHABET_LC.length(); i++) {
- assertEquals(ASCII_ALPHABET_UC.charAt(i), Util
- .toASCIIUpperCase(ASCII_ALPHABET_LC.charAt(i)));
- }
- for (int i = 0; i < ASCII_ALPHABET_UC.length(); i++) {
- assertEquals(ASCII_ALPHABET_UC.charAt(i), Util
- .toASCIIUpperCase(ASCII_ALPHABET_UC.charAt(i)));
- }
+ public void testasciiEqualsIgnoreCase() {
+ final String s1 = ASCII_ALPHABET_LC;
+ final String s2 = ASCII_ALPHABET_UC;
+ assertTrue(Util.asciiEqualsIgnoreCase(s1, s2));
+ assertTrue(Util.asciiEqualsIgnoreCase(s2, s1));
}
public void testEqualsIgnoreCaseByteArrayByteArray() {
- assertTrue(Util.equalsIgnoreCase(ASCII_ALPHABET_LC_BYTES,
+ assertTrue(Util.asciiEqualsIgnoreCase(ASCII_ALPHABET_LC_BYTES,
ASCII_ALPHABET_LC_BYTES));
- assertTrue(Util.equalsIgnoreCase(ASCII_ALPHABET_LC_BYTES,
+ assertTrue(Util.asciiEqualsIgnoreCase(ASCII_ALPHABET_LC_BYTES,
ASCII_ALPHABET_UC_BYTES));
- assertTrue(Util.equalsIgnoreCase(ASCII_ALPHABET_UC_BYTES,
+ assertTrue(Util.asciiEqualsIgnoreCase(ASCII_ALPHABET_UC_BYTES,
ASCII_ALPHABET_UC_BYTES));
}