Imported GNU Classpath 0.90
Imported GNU Classpath 0.90
* scripts/makemake.tcl: LocaleData.java moved to gnu/java/locale.
* sources.am: Regenerated.
* gcj/javaprims.h: Regenerated.
* Makefile.in: Regenerated.
* gcj/Makefile.in: Regenerated.
* include/Makefile.in: Regenerated.
* testsuite/Makefile.in: Regenerated.
* gnu/java/lang/VMInstrumentationImpl.java: New override.
* gnu/java/net/local/LocalSocketImpl.java: Likewise.
* gnu/classpath/jdwp/VMMethod.java: Likewise.
* gnu/classpath/jdwp/VMVirtualMachine.java: Update to latest
interface.
* java/lang/Thread.java: Add UncaughtExceptionHandler.
* java/lang/reflect/Method.java: Implements GenericDeclaration and
isSynthetic(),
* java/lang/reflect/Field.java: Likewise.
* java/lang/reflect/Constructor.java
* java/lang/Class.java: Implements Type, GenericDeclaration,
getSimpleName() and getEnclosing*() methods.
* java/lang/Class.h: Add new public methods.
* java/lang/Math.java: Add signum(), ulp() and log10().
* java/lang/natMath.cc (log10): New function.
* java/security/VMSecureRandom.java: New override.
* java/util/logging/Logger.java: Updated to latest classpath
version.
* java/util/logging/LogManager.java: New override.
From-SVN: r113887
This commit is contained in:
@@ -327,12 +327,9 @@ while (i.hasNext())
|
||||
*
|
||||
* @return True if the end of the list has not yet been
|
||||
* reached.
|
||||
* @throws ConcurrentModificationException if the
|
||||
* list has been modified elsewhere.
|
||||
*/
|
||||
public boolean hasNext()
|
||||
{
|
||||
checkMod();
|
||||
return pos < size;
|
||||
}
|
||||
|
||||
@@ -461,12 +458,9 @@ while (i.hasNext())
|
||||
*
|
||||
* @return True if the end of the list has not yet been
|
||||
* reached.
|
||||
* @throws ConcurrentModificationException if the
|
||||
* list has been modified elsewhere.
|
||||
*/
|
||||
public boolean hasNext()
|
||||
{
|
||||
checkMod();
|
||||
return position < size;
|
||||
}
|
||||
|
||||
@@ -476,12 +470,9 @@ while (i.hasNext())
|
||||
*
|
||||
* @return True if objects exist prior to the current
|
||||
* position of the iterator.
|
||||
* @throws ConcurrentModificationException if the
|
||||
* list has been modified elsewhere.
|
||||
*/
|
||||
public boolean hasPrevious()
|
||||
{
|
||||
checkMod();
|
||||
return position > 0;
|
||||
}
|
||||
|
||||
@@ -526,12 +517,9 @@ while (i.hasNext())
|
||||
* list, which will be retrieved by <code>next()</code>
|
||||
*
|
||||
* @return The index of the next element.
|
||||
* @throws ConcurrentModificationException if the list
|
||||
* has been modified elsewhere.
|
||||
*/
|
||||
public int nextIndex()
|
||||
{
|
||||
checkMod();
|
||||
return position;
|
||||
}
|
||||
|
||||
@@ -540,12 +528,9 @@ while (i.hasNext())
|
||||
* list, which will be retrieved by <code>previous()</code>
|
||||
*
|
||||
* @return The index of the previous element.
|
||||
* @throws ConcurrentModificationException if the list
|
||||
* has been modified elsewhere.
|
||||
*/
|
||||
public int previousIndex()
|
||||
{
|
||||
checkMod();
|
||||
return position - 1;
|
||||
}
|
||||
|
||||
@@ -1030,12 +1015,9 @@ while (i.hasNext())
|
||||
*
|
||||
* @return True if the end of the list has not yet been
|
||||
* reached.
|
||||
* @throws ConcurrentModificationException if the
|
||||
* list has been modified elsewhere.
|
||||
*/
|
||||
public boolean hasNext()
|
||||
{
|
||||
checkMod();
|
||||
return position < size;
|
||||
}
|
||||
|
||||
@@ -1045,12 +1027,9 @@ while (i.hasNext())
|
||||
*
|
||||
* @return True if objects exist prior to the current
|
||||
* position of the iterator.
|
||||
* @throws ConcurrentModificationException if the
|
||||
* list has been modified elsewhere.
|
||||
*/
|
||||
public boolean hasPrevious()
|
||||
{
|
||||
checkMod();
|
||||
return position > 0;
|
||||
}
|
||||
|
||||
@@ -1093,8 +1072,6 @@ while (i.hasNext())
|
||||
* list, which will be retrieved by <code>next()</code>
|
||||
*
|
||||
* @return The index of the next element.
|
||||
* @throws ConcurrentModificationException if the
|
||||
* list has been modified elsewhere.
|
||||
*/
|
||||
public int nextIndex()
|
||||
{
|
||||
@@ -1106,8 +1083,6 @@ while (i.hasNext())
|
||||
* list, which will be retrieved by <code>previous()</code>
|
||||
*
|
||||
* @return The index of the previous element.
|
||||
* @throws ConcurrentModificationException if the
|
||||
* list has been modified elsewhere.
|
||||
*/
|
||||
public int previousIndex()
|
||||
{
|
||||
|
||||
@@ -2352,185 +2352,556 @@ public class Arrays
|
||||
return new Arrays.ArrayList(a);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a String representation of the argument array. Returns "null"
|
||||
* if <code>a</code> is null.
|
||||
* @param a the array to represent
|
||||
* @return a String representing this array
|
||||
* @since 1.5
|
||||
/**
|
||||
* Returns the hashcode of an array of long numbers. If two arrays
|
||||
* are equal, according to <code>equals()</code>, they should have the
|
||||
* same hashcode. The hashcode returned by the method is equal to that
|
||||
* obtained by the corresponding <code>List</code> object. This has the same
|
||||
* data, but represents longs in their wrapper class, <code>Long</code>.
|
||||
* For <code>null</code>, 0 is returned.
|
||||
*
|
||||
* @param v an array of long numbers for which the hash code should be
|
||||
* computed.
|
||||
* @return the hash code of the array, or 0 if null was given.
|
||||
* @since 1.5
|
||||
*/
|
||||
public static String toString (long[] a)
|
||||
public static int hashCode(long[] v)
|
||||
{
|
||||
if (a == null)
|
||||
return "null";
|
||||
if (a.length == 0)
|
||||
return "[]";
|
||||
String result = "[";
|
||||
for (int i = 0; i < a.length - 1; i++)
|
||||
result += String.valueOf(a[i]) + ", ";
|
||||
result += String.valueOf(a[a.length - 1]) + "]";
|
||||
if (v == null)
|
||||
return 0;
|
||||
int result = 1;
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
{
|
||||
int elt = (int) (v[i] ^ (v[i] >>> 32));
|
||||
result = 31 * result + elt;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a String representation of the argument array. Returns "null"
|
||||
* if <code>a</code> is null.
|
||||
* @param a the array to represent
|
||||
* @return a String representing this array
|
||||
* @since 1.5
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hashcode of an array of integer numbers. If two arrays
|
||||
* are equal, according to <code>equals()</code>, they should have the
|
||||
* same hashcode. The hashcode returned by the method is equal to that
|
||||
* obtained by the corresponding <code>List</code> object. This has the same
|
||||
* data, but represents ints in their wrapper class, <code>Integer</code>.
|
||||
* For <code>null</code>, 0 is returned.
|
||||
*
|
||||
* @param v an array of integer numbers for which the hash code should be
|
||||
* computed.
|
||||
* @return the hash code of the array, or 0 if null was given.
|
||||
* @since 1.5
|
||||
*/
|
||||
public static String toString (int[] a)
|
||||
public static int hashCode(int[] v)
|
||||
{
|
||||
if (a == null)
|
||||
return "null";
|
||||
if (a.length == 0)
|
||||
return "[]";
|
||||
String result = "[";
|
||||
for (int i = 0; i < a.length - 1; i++)
|
||||
result += String.valueOf(a[i]) + ", ";
|
||||
result += String.valueOf(a[a.length - 1]) + "]";
|
||||
if (v == null)
|
||||
return 0;
|
||||
int result = 1;
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
result = 31 * result + v[i];
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a String representation of the argument array. Returns "null"
|
||||
* if <code>a</code> is null.
|
||||
* @param a the array to represent
|
||||
* @return a String representing this array
|
||||
* @since 1.5
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hashcode of an array of short numbers. If two arrays
|
||||
* are equal, according to <code>equals()</code>, they should have the
|
||||
* same hashcode. The hashcode returned by the method is equal to that
|
||||
* obtained by the corresponding <code>List</code> object. This has the same
|
||||
* data, but represents shorts in their wrapper class, <code>Short</code>.
|
||||
* For <code>null</code>, 0 is returned.
|
||||
*
|
||||
* @param v an array of short numbers for which the hash code should be
|
||||
* computed.
|
||||
* @return the hash code of the array, or 0 if null was given.
|
||||
* @since 1.5
|
||||
*/
|
||||
public static String toString (short[] a)
|
||||
public static int hashCode(short[] v)
|
||||
{
|
||||
if (a == null)
|
||||
return "null";
|
||||
if (a.length == 0)
|
||||
return "[]";
|
||||
String result = "[";
|
||||
for (int i = 0; i < a.length - 1; i++)
|
||||
result += String.valueOf(a[i]) + ", ";
|
||||
result += String.valueOf(a[a.length - 1]) + "]";
|
||||
if (v == null)
|
||||
return 0;
|
||||
int result = 1;
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
result = 31 * result + v[i];
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hashcode of an array of characters. If two arrays
|
||||
* are equal, according to <code>equals()</code>, they should have the
|
||||
* same hashcode. The hashcode returned by the method is equal to that
|
||||
* obtained by the corresponding <code>List</code> object. This has the same
|
||||
* data, but represents chars in their wrapper class, <code>Character</code>.
|
||||
* For <code>null</code>, 0 is returned.
|
||||
*
|
||||
* @param v an array of characters for which the hash code should be
|
||||
* computed.
|
||||
* @return the hash code of the array, or 0 if null was given.
|
||||
* @since 1.5
|
||||
*/
|
||||
public static int hashCode(char[] v)
|
||||
{
|
||||
if (v == null)
|
||||
return 0;
|
||||
int result = 1;
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
result = 31 * result + v[i];
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hashcode of an array of bytes. If two arrays
|
||||
* are equal, according to <code>equals()</code>, they should have the
|
||||
* same hashcode. The hashcode returned by the method is equal to that
|
||||
* obtained by the corresponding <code>List</code> object. This has the same
|
||||
* data, but represents bytes in their wrapper class, <code>Byte</code>.
|
||||
* For <code>null</code>, 0 is returned.
|
||||
*
|
||||
* @param v an array of bytes for which the hash code should be
|
||||
* computed.
|
||||
* @return the hash code of the array, or 0 if null was given.
|
||||
* @since 1.5
|
||||
*/
|
||||
public static int hashCode(byte[] v)
|
||||
{
|
||||
if (v == null)
|
||||
return 0;
|
||||
int result = 1;
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
result = 31 * result + v[i];
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hashcode of an array of booleans. If two arrays
|
||||
* are equal, according to <code>equals()</code>, they should have the
|
||||
* same hashcode. The hashcode returned by the method is equal to that
|
||||
* obtained by the corresponding <code>List</code> object. This has the same
|
||||
* data, but represents booleans in their wrapper class,
|
||||
* <code>Boolean</code>. For <code>null</code>, 0 is returned.
|
||||
*
|
||||
* @param v an array of booleans for which the hash code should be
|
||||
* computed.
|
||||
* @return the hash code of the array, or 0 if null was given.
|
||||
* @since 1.5
|
||||
*/
|
||||
public static int hashCode(boolean[] v)
|
||||
{
|
||||
if (v == null)
|
||||
return 0;
|
||||
int result = 1;
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
result = 31 * result + (v[i] ? 1231 : 1237);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hashcode of an array of floats. If two arrays
|
||||
* are equal, according to <code>equals()</code>, they should have the
|
||||
* same hashcode. The hashcode returned by the method is equal to that
|
||||
* obtained by the corresponding <code>List</code> object. This has the same
|
||||
* data, but represents floats in their wrapper class, <code>Float</code>.
|
||||
* For <code>null</code>, 0 is returned.
|
||||
*
|
||||
* @param v an array of floats for which the hash code should be
|
||||
* computed.
|
||||
* @return the hash code of the array, or 0 if null was given.
|
||||
* @since 1.5
|
||||
*/
|
||||
public static int hashCode(float[] v)
|
||||
{
|
||||
if (v == null)
|
||||
return 0;
|
||||
int result = 1;
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
result = 31 * result + Float.floatToIntBits(v[i]);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hashcode of an array of doubles. If two arrays
|
||||
* are equal, according to <code>equals()</code>, they should have the
|
||||
* same hashcode. The hashcode returned by the method is equal to that
|
||||
* obtained by the corresponding <code>List</code> object. This has the same
|
||||
* data, but represents doubles in their wrapper class, <code>Double</code>.
|
||||
* For <code>null</code>, 0 is returned.
|
||||
*
|
||||
* @param v an array of doubles for which the hash code should be
|
||||
* computed.
|
||||
* @return the hash code of the array, or 0 if null was given.
|
||||
* @since 1.5
|
||||
*/
|
||||
public static int hashCode(double[] v)
|
||||
{
|
||||
if (v == null)
|
||||
return 0;
|
||||
int result = 1;
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
{
|
||||
long l = Double.doubleToLongBits(v[i]);
|
||||
int elt = (int) (l ^ (l >>> 32));
|
||||
result = 31 * result + elt;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the hashcode of an array of integer numbers. If two arrays
|
||||
* are equal, according to <code>equals()</code>, they should have the
|
||||
* same hashcode. The hashcode returned by the method is equal to that
|
||||
* obtained by the corresponding <code>List</code> object. This has the same
|
||||
* data, but represents ints in their wrapper class, <code>Integer</code>.
|
||||
* For <code>null</code>, 0 is returned.
|
||||
*
|
||||
* @param v an array of integer numbers for which the hash code should be
|
||||
* computed.
|
||||
* @return the hash code of the array, or 0 if null was given.
|
||||
* @since 1.5
|
||||
*/
|
||||
public static int hashCode(Object[] v)
|
||||
{
|
||||
if (v == null)
|
||||
return 0;
|
||||
int result = 1;
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
{
|
||||
int elt = v[i] == null ? 0 : v[i].hashCode();
|
||||
result = 31 * result + elt;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/** @since 1.5 */
|
||||
public static int deepHashCode(Object[] v)
|
||||
{
|
||||
if (v == null)
|
||||
return 0;
|
||||
int result = 1;
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
{
|
||||
int elt;
|
||||
if (v[i] == null)
|
||||
elt = 0;
|
||||
else if (v[i] instanceof boolean[])
|
||||
elt = hashCode((boolean[]) v[i]);
|
||||
else if (v[i] instanceof byte[])
|
||||
elt = hashCode((byte[]) v[i]);
|
||||
else if (v[i] instanceof char[])
|
||||
elt = hashCode((char[]) v[i]);
|
||||
else if (v[i] instanceof short[])
|
||||
elt = hashCode((short[]) v[i]);
|
||||
else if (v[i] instanceof int[])
|
||||
elt = hashCode((int[]) v[i]);
|
||||
else if (v[i] instanceof long[])
|
||||
elt = hashCode((long[]) v[i]);
|
||||
else if (v[i] instanceof float[])
|
||||
elt = hashCode((float[]) v[i]);
|
||||
else if (v[i] instanceof double[])
|
||||
elt = hashCode((double[]) v[i]);
|
||||
else if (v[i] instanceof Object[])
|
||||
elt = hashCode((Object[]) v[i]);
|
||||
else
|
||||
elt = v[i].hashCode();
|
||||
result = 31 * result + elt;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/** @since 1.5 */
|
||||
public static boolean deepEquals(Object[] v1, Object[] v2)
|
||||
{
|
||||
if (v1 == null)
|
||||
return v2 == null;
|
||||
if (v2 == null || v1.length != v2.length)
|
||||
return false;
|
||||
|
||||
for (int i = 0; i < v1.length; ++i)
|
||||
{
|
||||
Object e1 = v1[i];
|
||||
Object e2 = v2[i];
|
||||
|
||||
if (e1 == e2)
|
||||
continue;
|
||||
if (e1 == null || e2 == null)
|
||||
return false;
|
||||
|
||||
boolean check;
|
||||
if (e1 instanceof boolean[] && e2 instanceof boolean[])
|
||||
check = equals((boolean[]) e1, (boolean[]) e2);
|
||||
else if (e1 instanceof byte[] && e2 instanceof byte[])
|
||||
check = equals((byte[]) e1, (byte[]) e2);
|
||||
else if (e1 instanceof char[] && e2 instanceof char[])
|
||||
check = equals((char[]) e1, (char[]) e2);
|
||||
else if (e1 instanceof short[] && e2 instanceof short[])
|
||||
check = equals((short[]) e1, (short[]) e2);
|
||||
else if (e1 instanceof int[] && e2 instanceof int[])
|
||||
check = equals((int[]) e1, (int[]) e2);
|
||||
else if (e1 instanceof long[] && e2 instanceof long[])
|
||||
check = equals((long[]) e1, (long[]) e2);
|
||||
else if (e1 instanceof float[] && e2 instanceof float[])
|
||||
check = equals((float[]) e1, (float[]) e2);
|
||||
else if (e1 instanceof double[] && e2 instanceof double[])
|
||||
check = equals((double[]) e1, (double[]) e2);
|
||||
else if (e1 instanceof Object[] && e2 instanceof Object[])
|
||||
check = equals((Object[]) e1, (Object[]) e2);
|
||||
else
|
||||
check = e1.equals(e2);
|
||||
if (! check)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a String representation of the argument array. Returns "null"
|
||||
* if <code>a</code> is null.
|
||||
* @param a the array to represent
|
||||
* @param v the array to represent
|
||||
* @return a String representing this array
|
||||
* @since 1.5
|
||||
*/
|
||||
public static String toString (char[] a)
|
||||
public static String toString(boolean[] v)
|
||||
{
|
||||
if (a == null)
|
||||
if (v == null)
|
||||
return "null";
|
||||
if (a.length == 0)
|
||||
return "[]";
|
||||
String result = "[";
|
||||
for (int i = 0; i < a.length - 1; i++)
|
||||
result += String.valueOf(a[i]) + ", ";
|
||||
result += String.valueOf(a[a.length - 1]) + "]";
|
||||
return result;
|
||||
}
|
||||
StringBuilder b = new StringBuilder("[");
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
{
|
||||
if (i > 0)
|
||||
b.append(", ");
|
||||
b.append(v[i]);
|
||||
}
|
||||
b.append("]");
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a String representation of the argument array. Returns "null"
|
||||
* if <code>a</code> is null.
|
||||
* @param a the array to represent
|
||||
* @param v the array to represent
|
||||
* @return a String representing this array
|
||||
* @since 1.5
|
||||
*/
|
||||
public static String toString (byte[] a)
|
||||
public static String toString(byte[] v)
|
||||
{
|
||||
if (a == null)
|
||||
if (v == null)
|
||||
return "null";
|
||||
if (a.length == 0)
|
||||
return "[]";
|
||||
String result = "[";
|
||||
for (int i = 0; i < a.length - 1; i++)
|
||||
result += String.valueOf(a[i]) + ", ";
|
||||
result += String.valueOf(a[a.length - 1]) + "]";
|
||||
return result;
|
||||
}
|
||||
StringBuilder b = new StringBuilder("[");
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
{
|
||||
if (i > 0)
|
||||
b.append(", ");
|
||||
b.append(v[i]);
|
||||
}
|
||||
b.append("]");
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a String representation of the argument array. Returns "null"
|
||||
* if <code>a</code> is null.
|
||||
* @param a the array to represent
|
||||
* @param v the array to represent
|
||||
* @return a String representing this array
|
||||
* @since 1.5
|
||||
*/
|
||||
public static String toString (boolean[] a)
|
||||
public static String toString(char[] v)
|
||||
{
|
||||
if (a == null)
|
||||
if (v == null)
|
||||
return "null";
|
||||
if (a.length == 0)
|
||||
return "[]";
|
||||
String result = "[";
|
||||
for (int i = 0; i < a.length - 1; i++)
|
||||
result += String.valueOf(a[i]) + ", ";
|
||||
result += String.valueOf(a[a.length - 1]) + "]";
|
||||
return result;
|
||||
}
|
||||
StringBuilder b = new StringBuilder("[");
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
{
|
||||
if (i > 0)
|
||||
b.append(", ");
|
||||
b.append(v[i]);
|
||||
}
|
||||
b.append("]");
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a String representation of the argument array. Returns "null"
|
||||
* if <code>a</code> is null.
|
||||
* @param a the array to represent
|
||||
* @param v the array to represent
|
||||
* @return a String representing this array
|
||||
* @since 1.5
|
||||
*/
|
||||
public static String toString (float[] a)
|
||||
public static String toString(short[] v)
|
||||
{
|
||||
if (a == null)
|
||||
if (v == null)
|
||||
return "null";
|
||||
if (a.length == 0)
|
||||
return "[]";
|
||||
String result = "[";
|
||||
for (int i = 0; i < a.length - 1; i++)
|
||||
result += String.valueOf(a[i]) + ", ";
|
||||
result += String.valueOf(a[a.length - 1]) + "]";
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a String representation of the argument array. Returns "null"
|
||||
* if <code>a</code> is null.
|
||||
* @param a the array to represent
|
||||
* @return a String representing this array
|
||||
* @since 1.5
|
||||
*/
|
||||
public static String toString (double[] a)
|
||||
{
|
||||
if (a == null)
|
||||
return "null";
|
||||
if (a.length == 0)
|
||||
return "[]";
|
||||
String result = "[";
|
||||
for (int i = 0; i < a.length - 1; i++)
|
||||
result += String.valueOf(a[i]) + ", ";
|
||||
result += String.valueOf(a[a.length - 1]) + "]";
|
||||
return result;
|
||||
}
|
||||
StringBuilder b = new StringBuilder("[");
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
{
|
||||
if (i > 0)
|
||||
b.append(", ");
|
||||
b.append(v[i]);
|
||||
}
|
||||
b.append("]");
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a String representation of the argument array. Returns "null"
|
||||
* if <code>a</code> is null.
|
||||
* @param a the array to represent
|
||||
* @param v the array to represent
|
||||
* @return a String representing this array
|
||||
* @since 1.5
|
||||
*/
|
||||
public static String toString (Object[] a)
|
||||
public static String toString(int[] v)
|
||||
{
|
||||
if (a == null)
|
||||
if (v == null)
|
||||
return "null";
|
||||
if (a.length == 0)
|
||||
return "[]";
|
||||
String result = "[";
|
||||
for (int i = 0; i < a.length - 1; i++)
|
||||
result += String.valueOf(a[i]) + ", ";
|
||||
result += String.valueOf(a[a.length - 1]) + "]";
|
||||
return result;
|
||||
}
|
||||
StringBuilder b = new StringBuilder("[");
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
{
|
||||
if (i > 0)
|
||||
b.append(", ");
|
||||
b.append(v[i]);
|
||||
}
|
||||
b.append("]");
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a String representation of the argument array. Returns "null"
|
||||
* if <code>a</code> is null.
|
||||
* @param v the array to represent
|
||||
* @return a String representing this array
|
||||
* @since 1.5
|
||||
*/
|
||||
public static String toString(long[] v)
|
||||
{
|
||||
if (v == null)
|
||||
return "null";
|
||||
StringBuilder b = new StringBuilder("[");
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
{
|
||||
if (i > 0)
|
||||
b.append(", ");
|
||||
b.append(v[i]);
|
||||
}
|
||||
b.append("]");
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a String representation of the argument array. Returns "null"
|
||||
* if <code>a</code> is null.
|
||||
* @param v the array to represent
|
||||
* @return a String representing this array
|
||||
* @since 1.5
|
||||
*/
|
||||
public static String toString(float[] v)
|
||||
{
|
||||
if (v == null)
|
||||
return "null";
|
||||
StringBuilder b = new StringBuilder("[");
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
{
|
||||
if (i > 0)
|
||||
b.append(", ");
|
||||
b.append(v[i]);
|
||||
}
|
||||
b.append("]");
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a String representation of the argument array. Returns "null"
|
||||
* if <code>a</code> is null.
|
||||
* @param v the array to represent
|
||||
* @return a String representing this array
|
||||
* @since 1.5
|
||||
*/
|
||||
public static String toString(double[] v)
|
||||
{
|
||||
if (v == null)
|
||||
return "null";
|
||||
StringBuilder b = new StringBuilder("[");
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
{
|
||||
if (i > 0)
|
||||
b.append(", ");
|
||||
b.append(v[i]);
|
||||
}
|
||||
b.append("]");
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a String representation of the argument array. Returns "null"
|
||||
* if <code>a</code> is null.
|
||||
* @param v the array to represent
|
||||
* @return a String representing this array
|
||||
* @since 1.5
|
||||
*/
|
||||
public static String toString(Object[] v)
|
||||
{
|
||||
if (v == null)
|
||||
return "null";
|
||||
StringBuilder b = new StringBuilder("[");
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
{
|
||||
if (i > 0)
|
||||
b.append(", ");
|
||||
b.append(v[i]);
|
||||
}
|
||||
b.append("]");
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
private static void deepToString(Object[] v, StringBuilder b, HashSet seen)
|
||||
{
|
||||
b.append("[");
|
||||
for (int i = 0; i < v.length; ++i)
|
||||
{
|
||||
if (i > 0)
|
||||
b.append(", ");
|
||||
Object elt = v[i];
|
||||
if (elt == null)
|
||||
b.append("null");
|
||||
else if (elt instanceof boolean[])
|
||||
b.append(toString((boolean[]) elt));
|
||||
else if (elt instanceof byte[])
|
||||
b.append(toString((byte[]) elt));
|
||||
else if (elt instanceof char[])
|
||||
b.append(toString((char[]) elt));
|
||||
else if (elt instanceof short[])
|
||||
b.append(toString((short[]) elt));
|
||||
else if (elt instanceof int[])
|
||||
b.append(toString((int[]) elt));
|
||||
else if (elt instanceof long[])
|
||||
b.append(toString((long[]) elt));
|
||||
else if (elt instanceof float[])
|
||||
b.append(toString((float[]) elt));
|
||||
else if (elt instanceof double[])
|
||||
b.append(toString((double[]) elt));
|
||||
else if (elt instanceof Object[])
|
||||
{
|
||||
Object[] os = (Object[]) elt;
|
||||
if (seen.contains(os))
|
||||
b.append("[...]");
|
||||
else
|
||||
{
|
||||
seen.add(os);
|
||||
deepToString(os, b, seen);
|
||||
}
|
||||
}
|
||||
else
|
||||
b.append(elt);
|
||||
}
|
||||
b.append("]");
|
||||
}
|
||||
|
||||
/** @since 1.5 */
|
||||
public static String deepToString(Object[] v)
|
||||
{
|
||||
if (v == null)
|
||||
return "null";
|
||||
HashSet seen = new HashSet();
|
||||
StringBuilder b = new StringBuilder();
|
||||
deepToString(v, b, seen);
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Inner class used by {@link #asList(Object[])} to provide a list interface
|
||||
|
||||
@@ -365,7 +365,7 @@ public class BitSet implements Cloneable, Serializable
|
||||
throw new IndexOutOfBoundsException();
|
||||
BitSet bs = new BitSet(to - from);
|
||||
int lo_offset = from >>> 6;
|
||||
if (lo_offset >= bits.length)
|
||||
if (lo_offset >= bits.length || to == from)
|
||||
return bs;
|
||||
|
||||
int lo_bit = from & LONG_MASK;
|
||||
|
||||
@@ -1037,6 +1037,8 @@ public abstract class Calendar implements Serializable, Cloneable
|
||||
public void setTimeZone(TimeZone zone)
|
||||
{
|
||||
this.zone = zone;
|
||||
computeTime();
|
||||
computeFields();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -81,9 +81,9 @@ package java.util;
|
||||
* @see Arrays
|
||||
* @see AbstractCollection
|
||||
* @since 1.2
|
||||
* @status updated to 1.4
|
||||
* @status updated to 1.5 (minus generics)
|
||||
*/
|
||||
public interface Collection
|
||||
public interface Collection extends Iterable
|
||||
{
|
||||
/**
|
||||
* Add an element to this collection.
|
||||
|
||||
@@ -588,7 +588,7 @@ public class GregorianCalendar extends Calendar
|
||||
|
||||
day = offs + 7 * (fields[WEEK_OF_MONTH] - 1);
|
||||
offs = fields[DAY_OF_WEEK] - getFirstDayOfWeek();
|
||||
if (offs <= 0)
|
||||
if (offs < 0)
|
||||
offs += 7;
|
||||
day += offs;
|
||||
}
|
||||
|
||||
@@ -849,12 +849,9 @@ public class HashMap extends AbstractMap
|
||||
/**
|
||||
* Returns true if the Iterator has more elements.
|
||||
* @return true if there are more elements
|
||||
* @throws ConcurrentModificationException if the HashMap was modified
|
||||
*/
|
||||
public boolean hasNext()
|
||||
{
|
||||
if (knownMod != modCount)
|
||||
throw new ConcurrentModificationException();
|
||||
return count > 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1017,12 +1017,9 @@ public class Hashtable extends Dictionary
|
||||
/**
|
||||
* Returns true if the Iterator has more elements.
|
||||
* @return true if there are more elements
|
||||
* @throws ConcurrentModificationException if the hashtable was modified
|
||||
*/
|
||||
public boolean hasNext()
|
||||
{
|
||||
if (knownMod != modCount)
|
||||
throw new ConcurrentModificationException();
|
||||
return count > 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -705,12 +705,9 @@ public class IdentityHashMap extends AbstractMap
|
||||
/**
|
||||
* Returns true if the Iterator has more elements.
|
||||
* @return true if there are more elements
|
||||
* @throws ConcurrentModificationException if the Map was modified
|
||||
*/
|
||||
public boolean hasNext()
|
||||
{
|
||||
if (knownMod != modCount)
|
||||
throw new ConcurrentModificationException();
|
||||
return count > 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -39,11 +39,16 @@ exception statement from your version. */
|
||||
package java.util;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.NotSerializableException;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
|
||||
// FIXME: serialization methods should throw NotSerializableException
|
||||
/** @since 1.5 */
|
||||
public class InvalidPropertiesFormatException extends IOException
|
||||
{
|
||||
// This class won't serialize, but we have a UID to placate the compiler.
|
||||
private static final long serialVersionUID = 7763056076009360219L;
|
||||
|
||||
public InvalidPropertiesFormatException(String message)
|
||||
{
|
||||
super(message);
|
||||
@@ -54,4 +59,14 @@ public class InvalidPropertiesFormatException extends IOException
|
||||
super();
|
||||
initCause(cause);
|
||||
}
|
||||
|
||||
private void writeObject(ObjectOutputStream out) throws IOException
|
||||
{
|
||||
throw new NotSerializableException("objects of this type are not serializable");
|
||||
}
|
||||
|
||||
private void readObject(ObjectInputStream in) throws IOException
|
||||
{
|
||||
throw new NotSerializableException("objects of this type are not serializable");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -452,12 +452,9 @@ public class LinkedHashMap extends HashMap
|
||||
* Returns true if the Iterator has more elements.
|
||||
*
|
||||
* @return true if there are more elements
|
||||
* @throws ConcurrentModificationException if the HashMap was modified
|
||||
*/
|
||||
public boolean hasNext()
|
||||
{
|
||||
if (knownMod != modCount)
|
||||
throw new ConcurrentModificationException();
|
||||
return current != null;
|
||||
}
|
||||
|
||||
|
||||
@@ -804,11 +804,9 @@ public class LinkedList extends AbstractSequentialList
|
||||
* Returns the index of the next element.
|
||||
*
|
||||
* @return the next index
|
||||
* @throws ConcurrentModificationException if the list was modified
|
||||
*/
|
||||
public int nextIndex()
|
||||
{
|
||||
checkMod();
|
||||
return position;
|
||||
}
|
||||
|
||||
@@ -816,11 +814,9 @@ public class LinkedList extends AbstractSequentialList
|
||||
* Returns the index of the previous element.
|
||||
*
|
||||
* @return the previous index
|
||||
* @throws ConcurrentModificationException if the list was modified
|
||||
*/
|
||||
public int previousIndex()
|
||||
{
|
||||
checkMod();
|
||||
return position - 1;
|
||||
}
|
||||
|
||||
@@ -828,11 +824,9 @@ public class LinkedList extends AbstractSequentialList
|
||||
* Returns true if more elements exist via next.
|
||||
*
|
||||
* @return true if next will succeed
|
||||
* @throws ConcurrentModificationException if the list was modified
|
||||
*/
|
||||
public boolean hasNext()
|
||||
{
|
||||
checkMod();
|
||||
return (next != null);
|
||||
}
|
||||
|
||||
@@ -840,11 +834,9 @@ public class LinkedList extends AbstractSequentialList
|
||||
* Returns true if more elements exist via previous.
|
||||
*
|
||||
* @return true if previous will succeed
|
||||
* @throws ConcurrentModificationException if the list was modified
|
||||
*/
|
||||
public boolean hasPrevious()
|
||||
{
|
||||
checkMod();
|
||||
return (previous != null);
|
||||
}
|
||||
|
||||
|
||||
@@ -39,6 +39,7 @@ exception statement from your version. */
|
||||
package java.util;
|
||||
|
||||
import gnu.classpath.SystemProperties;
|
||||
import gnu.java.locale.LocaleHelper;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.ObjectInputStream;
|
||||
@@ -65,11 +66,12 @@ import java.io.Serializable;
|
||||
* be separated by an underscore (U+005F).
|
||||
*
|
||||
* <p>The default locale is determined by the values of the system properties
|
||||
* user.language, user.region, and user.variant, defaulting to "en". Note that
|
||||
* the locale does NOT contain the conversion and formatting capabilities (for
|
||||
* that, use ResourceBundle and java.text). Rather, it is an immutable tag
|
||||
* object for identifying a given locale, which is referenced by these other
|
||||
* classes when they must make locale-dependent decisions.
|
||||
* user.language, user.country (or user.region), and user.variant, defaulting
|
||||
* to "en_US". Note that the locale does NOT contain the conversion and
|
||||
* formatting capabilities (for that, use ResourceBundle and java.text).
|
||||
* Rather, it is an immutable tag object for identifying a given locale, which
|
||||
* is referenced by these other classes when they must make locale-dependent
|
||||
* decisions.
|
||||
*
|
||||
* @see ResourceBundle
|
||||
* @see java.text.Format
|
||||
@@ -209,10 +211,18 @@ public final class Locale implements Serializable, Cloneable
|
||||
* null. Note the logic in the main constructor, to detect when
|
||||
* bootstrapping has completed.
|
||||
*/
|
||||
private static Locale defaultLocale =
|
||||
getLocale(SystemProperties.getProperty("user.language", "en"),
|
||||
SystemProperties.getProperty("user.region", ""),
|
||||
SystemProperties.getProperty("user.variant", ""));
|
||||
private static Locale defaultLocale;
|
||||
|
||||
static {
|
||||
String language = SystemProperties.getProperty("user.language", "en");
|
||||
String country = SystemProperties.getProperty("user.country", "US");
|
||||
String region = SystemProperties.getProperty("user.region", null);
|
||||
String variant = SystemProperties.getProperty("user.variant", "");
|
||||
|
||||
defaultLocale = getLocale(language,
|
||||
(region != null) ? region : country,
|
||||
variant);
|
||||
}
|
||||
|
||||
/**
|
||||
* Array storing all the available two-letter ISO639 languages.
|
||||
@@ -236,38 +246,38 @@ public final class Locale implements Serializable, Cloneable
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the locale with the specified language and region
|
||||
* Retrieves the locale with the specified language and country
|
||||
* from the cache.
|
||||
*
|
||||
* @param language the language of the locale to retrieve.
|
||||
* @param region the region of the locale to retrieve.
|
||||
* @param country the country of the locale to retrieve.
|
||||
* @return the locale.
|
||||
*/
|
||||
private static Locale getLocale(String language, String region)
|
||||
private static Locale getLocale(String language, String country)
|
||||
{
|
||||
return getLocale(language, region, "");
|
||||
return getLocale(language, country, "");
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the locale with the specified language, region
|
||||
* Retrieves the locale with the specified language, country
|
||||
* and variant from the cache.
|
||||
*
|
||||
* @param language the language of the locale to retrieve.
|
||||
* @param region the region of the locale to retrieve.
|
||||
* @param country the country of the locale to retrieve.
|
||||
* @param variant the variant of the locale to retrieve.
|
||||
* @return the locale.
|
||||
*/
|
||||
private static Locale getLocale(String language, String region, String variant)
|
||||
private static Locale getLocale(String language, String country, String variant)
|
||||
{
|
||||
if (localeMap == null)
|
||||
localeMap = new HashMap(256);
|
||||
|
||||
String name = language + "_" + region + "_" + variant;
|
||||
String name = language + "_" + country + "_" + variant;
|
||||
Locale locale = (Locale) localeMap.get(name);
|
||||
|
||||
if (locale == null)
|
||||
{
|
||||
locale = new Locale(language, region, variant);
|
||||
locale = new Locale(language, country, variant);
|
||||
localeMap.put(name, locale);
|
||||
}
|
||||
|
||||
@@ -384,33 +394,33 @@ public final class Locale implements Serializable, Cloneable
|
||||
{
|
||||
if (availableLocales == null)
|
||||
{
|
||||
String[] localeNames = LocaleData.localeNames;
|
||||
availableLocales = new Locale[localeNames.length];
|
||||
int len = LocaleHelper.getLocaleCount();
|
||||
availableLocales = new Locale[len];
|
||||
|
||||
for (int i = 0; i < localeNames.length; i++)
|
||||
for (int i = 0; i < len; i++)
|
||||
{
|
||||
String language;
|
||||
String region = "";
|
||||
String country = "";
|
||||
String variant = "";
|
||||
String name = localeNames[i];
|
||||
String name = LocaleHelper.getLocaleName(i);
|
||||
|
||||
language = name.substring(0, 2);
|
||||
|
||||
if (name.length() > 2)
|
||||
region = name.substring(3);
|
||||
country = name.substring(3);
|
||||
|
||||
int index = region.indexOf("_");
|
||||
int index = country.indexOf("_");
|
||||
if (index > 0)
|
||||
{
|
||||
variant = region.substring(index + 1);
|
||||
region = region.substring(0, index - 1);
|
||||
variant = country.substring(index + 1);
|
||||
country = country.substring(0, index - 1);
|
||||
}
|
||||
|
||||
availableLocales[i] = getLocale(language, region, variant);
|
||||
availableLocales[i] = getLocale(language, country, variant);
|
||||
}
|
||||
}
|
||||
|
||||
return availableLocales;
|
||||
return (Locale[]) availableLocales.clone();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -426,7 +436,7 @@ public final class Locale implements Serializable, Cloneable
|
||||
countryCache = getISOStrings("territories");
|
||||
}
|
||||
|
||||
return countryCache;
|
||||
return (String[]) countryCache.clone();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -441,7 +451,7 @@ public final class Locale implements Serializable, Cloneable
|
||||
{
|
||||
languageCache = getISOStrings("languages");
|
||||
}
|
||||
return languageCache;
|
||||
return (String[]) languageCache.clone();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -774,7 +774,7 @@ public class SimpleTimeZone extends TimeZone
|
||||
* @param year The year.
|
||||
*/
|
||||
private int getDaysInMonth(int month, int year)
|
||||
{
|
||||
{
|
||||
if (month == Calendar.FEBRUARY)
|
||||
{
|
||||
if ((year & 3) != 0)
|
||||
|
||||
@@ -1434,12 +1434,9 @@ public class TreeMap extends AbstractMap
|
||||
/**
|
||||
* Returns true if the Iterator has more elements.
|
||||
* @return true if there are more elements
|
||||
* @throws ConcurrentModificationException if the TreeMap was modified
|
||||
*/
|
||||
public boolean hasNext()
|
||||
{
|
||||
if (knownMod != modCount)
|
||||
throw new ConcurrentModificationException();
|
||||
return next != max;
|
||||
}
|
||||
|
||||
|
||||
@@ -292,12 +292,9 @@ public class WeakHashMap extends AbstractMap implements Map
|
||||
/**
|
||||
* Checks if there are more entries.
|
||||
* @return true, iff there are more elements.
|
||||
* @throws ConcurrentModificationException if the hash map was
|
||||
* modified.
|
||||
*/
|
||||
public boolean hasNext()
|
||||
{
|
||||
checkMod();
|
||||
return nextEntry != null;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,78 +0,0 @@
|
||||
# This property file contains dependencies of classes, methods, and
|
||||
# field on other methods or classes.
|
||||
#
|
||||
# Syntax:
|
||||
#
|
||||
# <used>: <needed 1> [... <needed N>]
|
||||
#
|
||||
# means that when <used> is included, <needed 1> (... <needed N>) must
|
||||
# be included as well.
|
||||
#
|
||||
# <needed X> and <used> are of the form
|
||||
#
|
||||
# <class.methodOrField(signature)>
|
||||
#
|
||||
# or just
|
||||
#
|
||||
# <class>
|
||||
#
|
||||
# Within dependencies, variables can be used. A variable is defined as
|
||||
# follows:
|
||||
#
|
||||
# {variable}: value1 value2 ... value<n>
|
||||
#
|
||||
# variables can be used on the right side of dependencies as follows:
|
||||
#
|
||||
# <used>: com.bla.blu.{variable}.Class.m()V
|
||||
#
|
||||
# The use of the variable will expand to <n> dependencies of the form
|
||||
#
|
||||
# <used>: com.bla.blu.value1.Class.m()V
|
||||
# <used>: com.bla.blu.value2.Class.m()V
|
||||
# ...
|
||||
# <used>: com.bla.blu.value<n>.Class.m()V
|
||||
#
|
||||
# Variables can be redefined when building a system to select the
|
||||
# required support for features like encodings, protocols, etc.
|
||||
#
|
||||
# Hints:
|
||||
#
|
||||
# - For methods and fields, the signature is mandatory. For
|
||||
# specification, please see the Java Virtual Machine Specification by
|
||||
# SUN. Unlike in the spec, field signatures (types) are in brackets.
|
||||
#
|
||||
# - Package names must be separated by '/' (and not '.'). E.g.,
|
||||
# java/lang/Class (this is necessary, because the '.' is used to
|
||||
# separate method or field names from classes)
|
||||
#
|
||||
# - In case <needed> refers to a class, only the class itself will be
|
||||
# included in the resulting binary, NOT necessarily all its methods
|
||||
# and fields. If you want to refer to all methods and fields, you can
|
||||
# write class.* as an abbreviation.
|
||||
#
|
||||
# - Abbreviations for packages are also possible: my/package/* means all
|
||||
# methods and fields of all classes in my/package.
|
||||
#
|
||||
# - A line with a trailing '\' continues in the next line.
|
||||
|
||||
|
||||
# All calendars supported are loaded via java/util/Calendar.getBundle or
|
||||
# java/util/GregorianCalendar.getBundle from class
|
||||
# gnu/java/locale/Calendar_{locale_id}
|
||||
#
|
||||
# This introduces a dependency for the localized calendars. To allow an easy
|
||||
# selection and addition of locales, the library variable {calendar_locales}
|
||||
# can be set to the set of supported calendar locales.
|
||||
#
|
||||
|
||||
{calendar_locales}: de en nl
|
||||
|
||||
java/util/Calendar.getBundle(Ljava/util/Locale;)Ljava/util/ResourceBundle;: \
|
||||
gnu/java/locale/Calendar.* \
|
||||
gnu/java/locale/Calendar_{calendar_locales}.*
|
||||
|
||||
java/util/GregorianCalendar.getBundle(Ljava/util/Locale;)Ljava/util/ResourceBundle;: \
|
||||
gnu/java/locale/Calendar.* \
|
||||
gnu/java/locale/Calendar_{calendar_locales}.*
|
||||
|
||||
# end of file
|
||||
@@ -37,6 +37,8 @@ exception statement from your version. */
|
||||
|
||||
package java.util.jar;
|
||||
|
||||
import gnu.java.util.jar.JarUtils;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Hashtable;
|
||||
import java.util.Map;
|
||||
@@ -65,7 +67,8 @@ import java.util.Set;
|
||||
* @see java.util.jar.Attributes.Name
|
||||
* @author Mark Wielaard (mark@klomp.org)
|
||||
*/
|
||||
public class Attributes implements Cloneable, Map
|
||||
public class Attributes
|
||||
implements Cloneable, java.util.Map // Fully qualified for jikes 1.22
|
||||
{
|
||||
|
||||
// Fields
|
||||
@@ -121,14 +124,13 @@ public class Attributes implements Cloneable, Map
|
||||
* General main attribute -
|
||||
* the version of this Manifest file.
|
||||
*/
|
||||
public static final Name MANIFEST_VERSION = new Name("Manifest-Version");
|
||||
public static final Name MANIFEST_VERSION = new Name(JarUtils.MANIFEST_VERSION);
|
||||
|
||||
/**
|
||||
* General main attribute -
|
||||
* the version of the jar file signature.
|
||||
*/
|
||||
public static final Name SIGNATURE_VERSION
|
||||
= new Name("Signature-Version");
|
||||
public static final Name SIGNATURE_VERSION = new Name(JarUtils.SIGNATURE_VERSION);
|
||||
|
||||
/**
|
||||
* General main attribute -
|
||||
@@ -433,7 +435,7 @@ public class Attributes implements Cloneable, Map
|
||||
* @returns the old value of the attribute name or null if it didn't exist
|
||||
* yet
|
||||
*/
|
||||
public String putValue(Name name, String value)
|
||||
private String putValue(Name name, String value)
|
||||
{
|
||||
return (String) put(name, value);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* JarFile.java - Representation of a jar file
|
||||
Copyright (C) 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 2000, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU Classpath.
|
||||
|
||||
@@ -42,6 +42,7 @@ import gnu.java.io.Base64InputStream;
|
||||
import gnu.java.security.OID;
|
||||
import gnu.java.security.pkcs.PKCS7SignedData;
|
||||
import gnu.java.security.pkcs.SignerInfo;
|
||||
import gnu.java.security.provider.Gnu;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
@@ -105,6 +106,14 @@ public class JarFile extends ZipFile
|
||||
/** The suffix for signature files. */
|
||||
private static final String SF_SUFFIX = ".SF";
|
||||
|
||||
/**
|
||||
* The security provider to use for signature verification.
|
||||
* We need a known fallback to be able to read any signed jar file
|
||||
* (which might contain the user selected security provider).
|
||||
* This is package-private to avoid accessor methods for inner classes.
|
||||
*/
|
||||
static final Gnu provider = new Gnu();
|
||||
|
||||
// Signature OIDs.
|
||||
private static final OID MD2_OID = new OID("1.2.840.113549.2.2");
|
||||
private static final OID MD4_OID = new OID("1.2.840.113549.2.4");
|
||||
@@ -636,19 +645,19 @@ public class JarFile extends ZipFile
|
||||
{
|
||||
if (!signerInfo.getDigestAlgorithmId().equals(SHA1_OID))
|
||||
return;
|
||||
sig = Signature.getInstance("SHA1withDSA");
|
||||
sig = Signature.getInstance("SHA1withDSA", provider);
|
||||
}
|
||||
else if (alg.equals(RSA_ENCRYPTION_OID))
|
||||
{
|
||||
OID hash = signerInfo.getDigestAlgorithmId();
|
||||
if (hash.equals(MD2_OID))
|
||||
sig = Signature.getInstance("md2WithRsaEncryption");
|
||||
sig = Signature.getInstance("md2WithRsaEncryption", provider);
|
||||
else if (hash.equals(MD4_OID))
|
||||
sig = Signature.getInstance("md4WithRsaEncryption");
|
||||
sig = Signature.getInstance("md4WithRsaEncryption", provider);
|
||||
else if (hash.equals(MD5_OID))
|
||||
sig = Signature.getInstance("md5WithRsaEncryption");
|
||||
sig = Signature.getInstance("md5WithRsaEncryption", provider);
|
||||
else if (hash.equals(SHA1_OID))
|
||||
sig = Signature.getInstance("sha1WithRsaEncryption");
|
||||
sig = Signature.getInstance("sha1WithRsaEncryption", provider);
|
||||
else
|
||||
return;
|
||||
}
|
||||
@@ -756,7 +765,7 @@ public class JarFile extends ZipFile
|
||||
try
|
||||
{
|
||||
byte[] hash = Base64InputStream.decode((String) e.getValue());
|
||||
MessageDigest md = MessageDigest.getInstance(alg);
|
||||
MessageDigest md = MessageDigest.getInstance(alg, provider);
|
||||
md.update(entryBytes);
|
||||
byte[] hash2 = md.digest();
|
||||
if (DEBUG)
|
||||
@@ -939,8 +948,9 @@ public class JarFile extends ZipFile
|
||||
hashes.add(Base64InputStream.decode((String) e.getValue()));
|
||||
try
|
||||
{
|
||||
md.add(MessageDigest.getInstance
|
||||
(key.substring(0, key.length() - DIGEST_KEY_SUFFIX.length())));
|
||||
int length = key.length() - DIGEST_KEY_SUFFIX.length();
|
||||
String alg = key.substring(0, length);
|
||||
md.add(MessageDigest.getInstance(alg, provider));
|
||||
}
|
||||
catch (NoSuchAlgorithmException nsae)
|
||||
{
|
||||
|
||||
@@ -37,16 +37,12 @@ exception statement from your version. */
|
||||
|
||||
package java.util.jar;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import gnu.java.util.jar.JarUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.Hashtable;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@@ -156,282 +152,27 @@ public class Manifest implements Cloneable
|
||||
}
|
||||
|
||||
/**
|
||||
* XXX
|
||||
* Read and merge a <code>Mainfest</code> from the designated input stream.
|
||||
*
|
||||
* @param in the input stream to read from.
|
||||
* @throws IOException if an I/O related exception occurs during the process.
|
||||
*/
|
||||
public void read(InputStream in) throws IOException
|
||||
{
|
||||
BufferedReader br =
|
||||
new BufferedReader(new InputStreamReader(in, "8859_1"));
|
||||
read_main_section(getMainAttributes(), br);
|
||||
read_individual_sections(getEntries(), br);
|
||||
}
|
||||
|
||||
// Private Static methods for reading the Manifest file from BufferedReader
|
||||
|
||||
private static void read_main_section(Attributes attr,
|
||||
BufferedReader br) throws IOException
|
||||
{
|
||||
// According to the spec we should actually call read_version_info() here.
|
||||
read_attributes(attr, br);
|
||||
// Explicitly set Manifest-Version attribute if not set in Main
|
||||
// attributes of Manifest.
|
||||
if (attr.getValue(Attributes.Name.MANIFEST_VERSION) == null)
|
||||
attr.putValue(Attributes.Name.MANIFEST_VERSION, "0.0");
|
||||
JarUtils.readMFManifest(getMainAttributes(), getEntries(), in);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pedantic method that requires the next attribute in the Manifest to be
|
||||
* the "Manifest-Version". This follows the Manifest spec closely but
|
||||
* reject some jar Manifest files out in the wild.
|
||||
*/
|
||||
private static void read_version_info(Attributes attr,
|
||||
BufferedReader br) throws IOException
|
||||
{
|
||||
String version_header = Attributes.Name.MANIFEST_VERSION.toString();
|
||||
try
|
||||
{
|
||||
String value = expect_header(version_header, br);
|
||||
attr.putValue(Attributes.Name.MANIFEST_VERSION, value);
|
||||
}
|
||||
catch (IOException ioe)
|
||||
{
|
||||
throw new JarException("Manifest should start with a " +
|
||||
version_header + ": " + ioe.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private static String expect_header(String header, BufferedReader br)
|
||||
throws IOException
|
||||
{
|
||||
String s = br.readLine();
|
||||
if (s == null)
|
||||
{
|
||||
throw new JarException("unexpected end of file");
|
||||
}
|
||||
return expect_header(header, br, s);
|
||||
}
|
||||
|
||||
private static String expect_header(String header, BufferedReader br,
|
||||
String s) throws IOException
|
||||
{
|
||||
try
|
||||
{
|
||||
String name = s.substring(0, header.length() + 1);
|
||||
if (name.equalsIgnoreCase(header + ":"))
|
||||
{
|
||||
String value_start = s.substring(header.length() + 2);
|
||||
return read_header_value(value_start, br);
|
||||
}
|
||||
}
|
||||
catch (IndexOutOfBoundsException iobe)
|
||||
{
|
||||
}
|
||||
// If we arrive here, something went wrong
|
||||
throw new JarException("unexpected '" + s + "'");
|
||||
}
|
||||
|
||||
private static String read_header_value(String s, BufferedReader br)
|
||||
throws IOException
|
||||
{
|
||||
boolean try_next = true;
|
||||
while (try_next)
|
||||
{
|
||||
// Lets see if there is something on the next line
|
||||
br.mark(1);
|
||||
if (br.read() == ' ')
|
||||
{
|
||||
s += br.readLine();
|
||||
}
|
||||
else
|
||||
{
|
||||
br.reset();
|
||||
try_next = false;
|
||||
}
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
private static void read_attributes(Attributes attr,
|
||||
BufferedReader br) throws IOException
|
||||
{
|
||||
String s = br.readLine();
|
||||
while (s != null && (!s.equals("")))
|
||||
{
|
||||
read_attribute(attr, s, br);
|
||||
s = br.readLine();
|
||||
}
|
||||
}
|
||||
|
||||
private static void read_attribute(Attributes attr, String s,
|
||||
BufferedReader br) throws IOException
|
||||
{
|
||||
try
|
||||
{
|
||||
int colon = s.indexOf(": ");
|
||||
String name = s.substring(0, colon);
|
||||
String value_start = s.substring(colon + 2);
|
||||
String value = read_header_value(value_start, br);
|
||||
attr.putValue(name, value);
|
||||
}
|
||||
catch (IndexOutOfBoundsException iobe)
|
||||
{
|
||||
throw new JarException("Manifest contains a bad header: " + s);
|
||||
}
|
||||
}
|
||||
|
||||
private static void read_individual_sections(Map entries,
|
||||
BufferedReader br) throws
|
||||
IOException
|
||||
{
|
||||
String s = br.readLine();
|
||||
while (s != null && (!s.equals("")))
|
||||
{
|
||||
Attributes attr = read_section_name(s, br, entries);
|
||||
read_attributes(attr, br);
|
||||
s = br.readLine();
|
||||
}
|
||||
}
|
||||
|
||||
private static Attributes read_section_name(String s, BufferedReader br,
|
||||
Map entries) throws JarException
|
||||
{
|
||||
try
|
||||
{
|
||||
String name = expect_header("Name", br, s);
|
||||
Attributes attr = new Attributes();
|
||||
entries.put(name, attr);
|
||||
return attr;
|
||||
}
|
||||
catch (IOException ioe)
|
||||
{
|
||||
throw new JarException
|
||||
("Section should start with a Name header: " + ioe.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* XXX
|
||||
* Writes the contents of this <code>Manifest</code> to the designated
|
||||
* output stream. Line-endings are platform-independent and consist of the
|
||||
* 2-codepoint sequence <code>0x0D</code> and <code>0x0A</code>.
|
||||
*
|
||||
* @param out the output stream to write this <code>Manifest</code> to.
|
||||
* @throws IOException if an I/O related exception occurs during the process.
|
||||
*/
|
||||
public void write(OutputStream out) throws IOException
|
||||
{
|
||||
PrintWriter pw =
|
||||
new PrintWriter(new
|
||||
BufferedWriter(new OutputStreamWriter(out, "8859_1")));
|
||||
write_main_section(getMainAttributes(), pw);
|
||||
pw.println();
|
||||
write_individual_sections(getEntries(), pw);
|
||||
if (pw.checkError())
|
||||
{
|
||||
throw new JarException("Error while writing manifest");
|
||||
}
|
||||
}
|
||||
|
||||
// Private Static functions for writing the Manifest file to a PrintWriter
|
||||
|
||||
private static void write_main_section(Attributes attr,
|
||||
PrintWriter pw) throws JarException
|
||||
{
|
||||
write_version_info(attr, pw);
|
||||
write_main_attributes(attr, pw);
|
||||
}
|
||||
|
||||
private static void write_version_info(Attributes attr, PrintWriter pw)
|
||||
{
|
||||
// First check if there is already a version attribute set
|
||||
String version = attr.getValue(Attributes.Name.MANIFEST_VERSION);
|
||||
if (version == null)
|
||||
{
|
||||
version = "1.0";
|
||||
}
|
||||
write_header(Attributes.Name.MANIFEST_VERSION.toString(), version, pw);
|
||||
}
|
||||
|
||||
private static void write_header(String name, String value, PrintWriter pw)
|
||||
{
|
||||
pw.print(name + ": ");
|
||||
|
||||
int last = 68 - name.length();
|
||||
if (last > value.length())
|
||||
{
|
||||
pw.println(value);
|
||||
}
|
||||
else
|
||||
{
|
||||
pw.println(value.substring(0, last));
|
||||
}
|
||||
while (last < value.length())
|
||||
{
|
||||
pw.print(" ");
|
||||
int end = (last + 69);
|
||||
if (end > value.length())
|
||||
{
|
||||
pw.println(value.substring(last));
|
||||
}
|
||||
else
|
||||
{
|
||||
pw.println(value.substring(last, end));
|
||||
}
|
||||
last = end;
|
||||
}
|
||||
}
|
||||
|
||||
private static void write_main_attributes(Attributes attr, PrintWriter pw)
|
||||
throws JarException
|
||||
{
|
||||
Iterator it = attr.entrySet().iterator();
|
||||
while (it.hasNext())
|
||||
{
|
||||
Map.Entry entry = (Map.Entry) it.next();
|
||||
// Don't print the manifest version again
|
||||
if (!Attributes.Name.MANIFEST_VERSION.equals(entry.getKey()))
|
||||
{
|
||||
write_attribute_entry(entry, pw);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void write_attribute_entry(Map.Entry entry, PrintWriter pw)
|
||||
throws JarException
|
||||
{
|
||||
String name = entry.getKey().toString();
|
||||
String value = entry.getValue().toString();
|
||||
|
||||
if (name.equalsIgnoreCase("Name"))
|
||||
{
|
||||
throw new JarException("Attributes cannot be called 'Name'");
|
||||
}
|
||||
if (name.startsWith("From"))
|
||||
{
|
||||
throw new
|
||||
JarException("Header cannot start with the four letters 'From'" +
|
||||
name);
|
||||
}
|
||||
write_header(name, value, pw);
|
||||
}
|
||||
|
||||
private static void write_individual_sections(Map entries, PrintWriter pw)
|
||||
throws JarException
|
||||
{
|
||||
|
||||
Iterator it = entries.entrySet().iterator();
|
||||
while (it.hasNext())
|
||||
{
|
||||
Map.Entry entry = (Map.Entry) it.next();
|
||||
write_header("Name", entry.getKey().toString(), pw);
|
||||
write_entry_attributes((Attributes) entry.getValue(), pw);
|
||||
pw.println();
|
||||
}
|
||||
}
|
||||
|
||||
private static void write_entry_attributes(Attributes attr, PrintWriter pw)
|
||||
throws JarException
|
||||
{
|
||||
Iterator it = attr.entrySet().iterator();
|
||||
while (it.hasNext())
|
||||
{
|
||||
Map.Entry entry = (Map.Entry) it.next();
|
||||
write_attribute_entry(entry, pw);
|
||||
}
|
||||
JarUtils.writeMFManifest(getMainAttributes(), getEntries(), out);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Level.java -- a class for indicating logging levels
|
||||
Copyright (C) 2002, 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU Classpath.
|
||||
|
||||
@@ -341,6 +341,9 @@ public class Level implements Serializable
|
||||
|
||||
for (int i = 0; i < knownLevels.length; i++)
|
||||
{
|
||||
// It's safe to use == instead of .equals here because only the
|
||||
// standard logging levels will be returned by this method, and
|
||||
// they are all created using string literals.
|
||||
if (name == knownLevels[i].name)
|
||||
return knownLevels[i];
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* LogManager.java -- a class for maintaining Loggers and managing
|
||||
configuration properties
|
||||
Copyright (C) 2002,2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU Classpath.
|
||||
|
||||
@@ -48,11 +48,14 @@ import java.lang.ref.WeakReference;
|
||||
import java.net.URL;
|
||||
import java.util.Collections;
|
||||
import java.util.Enumeration;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import gnu.classpath.SystemProperties;
|
||||
|
||||
/**
|
||||
* The <code>LogManager</code> maintains a hierarchical namespace
|
||||
* of Logger objects and manages properties for configuring the logging
|
||||
@@ -114,7 +117,6 @@ public class LogManager
|
||||
* a WeakReference to it.
|
||||
*/
|
||||
private Map loggers;
|
||||
final Logger rootLogger;
|
||||
|
||||
/**
|
||||
* The properties for the logging framework which have been
|
||||
@@ -135,83 +137,62 @@ public class LogManager
|
||||
* this case.
|
||||
*/
|
||||
private final PropertyChangeSupport pcs = new PropertyChangeSupport( /* source bean */
|
||||
LogManager.class);
|
||||
LogManager.class);
|
||||
|
||||
protected LogManager()
|
||||
{
|
||||
if (logManager != null)
|
||||
throw new IllegalStateException("there can be only one LogManager; use LogManager.getLogManager()");
|
||||
|
||||
logManager = this;
|
||||
loggers = new java.util.HashMap();
|
||||
rootLogger = new Logger("", null);
|
||||
rootLogger.setLevel(Level.INFO);
|
||||
addLogger(rootLogger);
|
||||
|
||||
/* Make sure that Logger.global has the rootLogger as its parent.
|
||||
*
|
||||
* Logger.global is set during class initialization of Logger,
|
||||
* which may or may not be before this code is being executed.
|
||||
* For example, on the Sun 1.3.1 and 1.4.0 JVMs, Logger.global
|
||||
* has been set before this code is being executed. In contrast,
|
||||
* Logger.global still is null on GCJ 3.2. Since the LogManager
|
||||
* and Logger classes are mutually dependent, both behaviors are
|
||||
* correct.
|
||||
*
|
||||
* This means that we cannot depend on Logger.global to have its
|
||||
* value when this code executes, although that variable is final.
|
||||
* Since Logger.getLogger will always return the same logger for
|
||||
* the same name, the subsequent line works fine irrespective of
|
||||
* the order in which classes are initialized.
|
||||
*/
|
||||
Logger.getLogger("global").setParent(rootLogger);
|
||||
Logger.getLogger("global").setUseParentHandlers(true);
|
||||
loggers = new HashMap();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the globally shared LogManager instance.
|
||||
*/
|
||||
public static LogManager getLogManager()
|
||||
public static synchronized LogManager getLogManager()
|
||||
{
|
||||
if (logManager == null)
|
||||
{
|
||||
logManager = makeLogManager();
|
||||
initLogManager();
|
||||
}
|
||||
return logManager;
|
||||
}
|
||||
|
||||
static
|
||||
{
|
||||
makeLogManager();
|
||||
|
||||
/* The Javadoc description of the class explains
|
||||
* what is going on here.
|
||||
*/
|
||||
Object configurator = createInstance(System.getProperty("java.util.logging.config.class"),
|
||||
/* must be instance of */ Object.class);
|
||||
|
||||
try
|
||||
{
|
||||
if (configurator == null)
|
||||
getLogManager().readConfiguration();
|
||||
}
|
||||
catch (IOException ex)
|
||||
{
|
||||
/* FIXME: Is it ok to ignore exceptions here? */
|
||||
}
|
||||
}
|
||||
private static final String MANAGER_PROPERTY = "java.util.logging.manager";
|
||||
|
||||
private static LogManager makeLogManager()
|
||||
{
|
||||
String managerClassName;
|
||||
LogManager manager;
|
||||
String managerClassName = SystemProperties.getProperty(MANAGER_PROPERTY);
|
||||
LogManager manager = (LogManager) createInstance
|
||||
(managerClassName, LogManager.class, MANAGER_PROPERTY);
|
||||
if (manager == null)
|
||||
manager = new LogManager();
|
||||
return manager;
|
||||
}
|
||||
|
||||
managerClassName = System.getProperty("java.util.logging.manager");
|
||||
manager = (LogManager) createInstance(managerClassName, LogManager.class);
|
||||
if (manager != null)
|
||||
return manager;
|
||||
private static final String CONFIG_PROPERTY = "java.util.logging.config.class";
|
||||
|
||||
if (managerClassName != null)
|
||||
System.err.println("WARNING: System property \"java.util.logging.manager\""
|
||||
+ " should be the name of a subclass of java.util.logging.LogManager");
|
||||
private static void initLogManager()
|
||||
{
|
||||
LogManager manager = getLogManager();
|
||||
Logger.root.setLevel(Level.INFO);
|
||||
manager.addLogger(Logger.root);
|
||||
|
||||
return new LogManager();
|
||||
/* The Javadoc description of the class explains
|
||||
* what is going on here.
|
||||
*/
|
||||
Object configurator = createInstance(System.getProperty(CONFIG_PROPERTY),
|
||||
/* must be instance of */ Object.class,
|
||||
CONFIG_PROPERTY);
|
||||
|
||||
try
|
||||
{
|
||||
if (configurator == null)
|
||||
manager.readConfiguration();
|
||||
}
|
||||
catch (IOException ex)
|
||||
{
|
||||
/* FIXME: Is it ok to ignore exceptions here? */
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -314,7 +295,7 @@ public class LogManager
|
||||
if(index > -1)
|
||||
searchName = searchName.substring(0,index);
|
||||
else
|
||||
searchName = "";
|
||||
searchName = "";
|
||||
}
|
||||
logger.setLevel(logLevel);
|
||||
|
||||
@@ -324,12 +305,12 @@ public class LogManager
|
||||
* When adding "foo.bar", the logger "foo.bar.baz" should change
|
||||
* its parent to "foo.bar".
|
||||
*/
|
||||
if (parent != rootLogger)
|
||||
if (parent != Logger.root)
|
||||
{
|
||||
for (Iterator iter = loggers.keySet().iterator(); iter.hasNext();)
|
||||
{
|
||||
Logger possChild = (Logger) ((WeakReference) loggers.get(iter.next()))
|
||||
.get();
|
||||
.get();
|
||||
if ((possChild == null) || (possChild == logger)
|
||||
|| (possChild.getParent() != parent))
|
||||
continue;
|
||||
@@ -367,14 +348,14 @@ public class LogManager
|
||||
{
|
||||
String childName = child.getName();
|
||||
int childNameLength = childName.length();
|
||||
Logger best = rootLogger;
|
||||
Logger best = Logger.root;
|
||||
int bestNameLength = 0;
|
||||
|
||||
Logger cand;
|
||||
String candName;
|
||||
int candNameLength;
|
||||
|
||||
if (child == rootLogger)
|
||||
if (child == Logger.root)
|
||||
return null;
|
||||
|
||||
for (Iterator iter = loggers.keySet().iterator(); iter.hasNext();)
|
||||
@@ -468,7 +449,7 @@ public class LogManager
|
||||
|
||||
if (logger == null)
|
||||
iter.remove();
|
||||
else if (logger != rootLogger)
|
||||
else if (logger != Logger.root)
|
||||
{
|
||||
logger.resetLogger();
|
||||
logger.setLevel(null);
|
||||
@@ -476,8 +457,8 @@ public class LogManager
|
||||
}
|
||||
}
|
||||
|
||||
rootLogger.setLevel(Level.INFO);
|
||||
rootLogger.resetLogger();
|
||||
Logger.root.setLevel(Level.INFO);
|
||||
Logger.root.resetLogger();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -524,11 +505,11 @@ public class LogManager
|
||||
|
||||
// If no config file could be found use a default configuration.
|
||||
if(inputStream == null)
|
||||
{
|
||||
String defaultConfig = "handlers = java.util.logging.ConsoleHandler \n"
|
||||
{
|
||||
String defaultConfig = "handlers = java.util.logging.ConsoleHandler \n"
|
||||
+ ".level=INFO \n";
|
||||
inputStream = new ByteArrayInputStream(defaultConfig.getBytes());
|
||||
}
|
||||
inputStream = new ByteArrayInputStream(defaultConfig.getBytes());
|
||||
}
|
||||
}
|
||||
else
|
||||
inputStream = new java.io.FileInputStream(path);
|
||||
@@ -574,21 +555,9 @@ public class LogManager
|
||||
while (tokenizer.hasMoreTokens())
|
||||
{
|
||||
String handlerName = tokenizer.nextToken();
|
||||
try
|
||||
{
|
||||
Class handlerClass = ClassLoader.getSystemClassLoader().loadClass(handlerName);
|
||||
getLogger("").addHandler((Handler) handlerClass
|
||||
.newInstance());
|
||||
}
|
||||
catch (ClassCastException ex)
|
||||
{
|
||||
System.err.println("[LogManager] class " + handlerName
|
||||
+ " is not subclass of java.util.logging.Handler");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
//System.out.println("[LogManager.readConfiguration]"+ex);
|
||||
}
|
||||
Handler handler = (Handler)
|
||||
createInstance(handlerName, Handler.class, key);
|
||||
Logger.root.addHandler(handler);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -602,14 +571,19 @@ public class LogManager
|
||||
logger = Logger.getLogger(loggerName);
|
||||
addLogger(logger);
|
||||
}
|
||||
Level level = null;
|
||||
try
|
||||
{
|
||||
logger.setLevel(Level.parse(value));
|
||||
}
|
||||
catch (Exception _)
|
||||
{
|
||||
//System.out.println("[LogManager.readConfiguration] "+_);
|
||||
}
|
||||
{
|
||||
level = Level.parse(value);
|
||||
}
|
||||
catch (IllegalArgumentException e)
|
||||
{
|
||||
warn("bad level \'" + value + "\'", e);
|
||||
}
|
||||
if (level != null)
|
||||
{
|
||||
logger.setLevel(level);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -748,19 +722,17 @@ public class LogManager
|
||||
*/
|
||||
static final Class getClassProperty(String propertyName, Class defaultValue)
|
||||
{
|
||||
Class usingClass = null;
|
||||
String propertyValue = logManager.getProperty(propertyName);
|
||||
|
||||
try
|
||||
{
|
||||
String propertyValue = logManager.getProperty(propertyName);
|
||||
if (propertyValue != null)
|
||||
usingClass = Class.forName(propertyValue);
|
||||
if (usingClass != null)
|
||||
return usingClass;
|
||||
}
|
||||
catch (Exception _)
|
||||
{
|
||||
}
|
||||
if (propertyValue != null)
|
||||
try
|
||||
{
|
||||
return locateClass(propertyValue);
|
||||
}
|
||||
catch (ClassNotFoundException e)
|
||||
{
|
||||
warn(propertyName + " = " + propertyValue, e);
|
||||
}
|
||||
|
||||
return defaultValue;
|
||||
}
|
||||
@@ -774,12 +746,17 @@ public class LogManager
|
||||
|
||||
try
|
||||
{
|
||||
Object obj = klass.newInstance();
|
||||
if (ofClass.isInstance(obj))
|
||||
return obj;
|
||||
Object obj = klass.newInstance();
|
||||
if (ofClass.isInstance(obj))
|
||||
return obj;
|
||||
}
|
||||
catch (Exception _)
|
||||
catch (InstantiationException e)
|
||||
{
|
||||
warn(propertyName + " = " + klass.getName(), e);
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
warn(propertyName + " = " + klass.getName(), e);
|
||||
}
|
||||
|
||||
if (defaultClass == null)
|
||||
@@ -824,14 +801,17 @@ public class LogManager
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new instance of a class specified by name.
|
||||
* Creates a new instance of a class specified by name and verifies
|
||||
* that it is an instance (or subclass of) a given type.
|
||||
*
|
||||
* @param className the name of the class of which a new instance
|
||||
* should be created.
|
||||
*
|
||||
* @param ofClass the class to which the new instance should
|
||||
* be either an instance or an instance of a subclass.
|
||||
* FIXME: This description is just terrible.
|
||||
* @param type the object created must be an instance of
|
||||
* <code>type</code> or any subclass of <code>type</code>
|
||||
*
|
||||
* @param property the system property to reference in error
|
||||
* messages
|
||||
*
|
||||
* @return the new instance, or <code>null</code> if
|
||||
* <code>className</code> is <code>null</code>, if no class
|
||||
@@ -839,28 +819,89 @@ public class LogManager
|
||||
* loading that class, or if the constructor of the class
|
||||
* has thrown an exception.
|
||||
*/
|
||||
static final Object createInstance(String className, Class ofClass)
|
||||
private static final Object createInstance(String className, Class type,
|
||||
String property)
|
||||
{
|
||||
Class klass;
|
||||
Class klass = null;
|
||||
|
||||
if ((className == null) || (className.length() == 0))
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
klass = Class.forName(className);
|
||||
if (! ofClass.isAssignableFrom(klass))
|
||||
return null;
|
||||
klass = locateClass(className);
|
||||
if (type.isAssignableFrom(klass))
|
||||
return klass.newInstance();
|
||||
warn(property, className, "not an instance of " + type.getName());
|
||||
}
|
||||
catch (ClassNotFoundException e)
|
||||
{
|
||||
warn(property, className, "class not found");
|
||||
}
|
||||
catch (IllegalAccessException e)
|
||||
{
|
||||
warn(property, className, "illegal access");
|
||||
}
|
||||
catch (InstantiationException e)
|
||||
{
|
||||
warn(property, className, e);
|
||||
}
|
||||
catch (java.lang.LinkageError e)
|
||||
{
|
||||
warn(property, className, "linkage error");
|
||||
}
|
||||
|
||||
return klass.newInstance();
|
||||
}
|
||||
catch (Exception _)
|
||||
return null;
|
||||
}
|
||||
|
||||
private static final void warn(String property, String klass, Throwable t)
|
||||
{
|
||||
warn(property, klass, null, t);
|
||||
}
|
||||
|
||||
private static final void warn(String property, String klass, String msg)
|
||||
{
|
||||
warn(property, klass, msg, null);
|
||||
}
|
||||
|
||||
private static final void warn(String property, String klass, String msg,
|
||||
Throwable t)
|
||||
{
|
||||
warn("error instantiating '" + klass + "' referenced by " + property +
|
||||
(msg == null ? "" : ", " + msg), t);
|
||||
}
|
||||
|
||||
/**
|
||||
* All debug warnings go through this method.
|
||||
*/
|
||||
|
||||
private static final void warn(String msg, Throwable t)
|
||||
{
|
||||
System.err.println("WARNING: " + msg);
|
||||
if (t != null)
|
||||
t.printStackTrace(System.err);
|
||||
}
|
||||
|
||||
/**
|
||||
* Locates a class by first checking the system class loader and
|
||||
* then checking the context class loader.
|
||||
*
|
||||
* @param name the fully qualified name of the Class to locate
|
||||
* @return Class the located Class
|
||||
*/
|
||||
|
||||
private static Class locateClass(String name) throws ClassNotFoundException
|
||||
{
|
||||
ClassLoader loader = Thread.currentThread().getContextClassLoader();
|
||||
try
|
||||
{
|
||||
return null;
|
||||
return Class.forName(name, true, loader);
|
||||
}
|
||||
catch (java.lang.LinkageError _)
|
||||
catch (ClassNotFoundException e)
|
||||
{
|
||||
return null;
|
||||
loader = ClassLoader.getSystemClassLoader();
|
||||
return Class.forName(name, true, loader);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* Logger.java -- a class for logging messages
|
||||
Copyright (C) 2002, 2004 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002, 2004, 2006 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU Classpath.
|
||||
|
||||
@@ -41,6 +41,8 @@ package java.util.logging;
|
||||
import java.util.List;
|
||||
import java.util.MissingResourceException;
|
||||
import java.util.ResourceBundle;
|
||||
import java.security.AccessController;
|
||||
import java.security.PrivilegedAction;
|
||||
|
||||
/**
|
||||
* A Logger is used for logging information about events. Usually, there
|
||||
@@ -67,13 +69,29 @@ import java.util.ResourceBundle;
|
||||
*/
|
||||
public class Logger
|
||||
{
|
||||
|
||||
static final Logger root = new Logger("", null);
|
||||
|
||||
/**
|
||||
* A logger provided to applications that make only occasional use
|
||||
* of the logging framework, typically early prototypes. Serious
|
||||
* products are supposed to create and use their own Loggers, so
|
||||
* they can be controlled individually.
|
||||
*/
|
||||
public static final Logger global = getLogger("global");
|
||||
public static final Logger global;
|
||||
|
||||
static
|
||||
{
|
||||
// Our class might be initialized from an unprivileged context
|
||||
global = (Logger) AccessController.doPrivileged
|
||||
(new PrivilegedAction()
|
||||
{
|
||||
public Object run()
|
||||
{
|
||||
return getLogger("global");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -175,7 +193,7 @@ public class Logger
|
||||
/* This is null when the root logger is being constructed,
|
||||
* and the root logger afterwards.
|
||||
*/
|
||||
parent = LogManager.getLogManager().rootLogger;
|
||||
parent = root;
|
||||
|
||||
useParentHandlers = (parent != null);
|
||||
}
|
||||
@@ -1148,16 +1166,12 @@ public class Logger
|
||||
*/
|
||||
public synchronized void setParent(Logger parent)
|
||||
{
|
||||
LogManager lm;
|
||||
|
||||
/* Throw a new NullPointerException if parent is null. */
|
||||
parent.getClass();
|
||||
|
||||
lm = LogManager.getLogManager();
|
||||
|
||||
if (this == lm.rootLogger)
|
||||
if (this == root)
|
||||
throw new IllegalArgumentException(
|
||||
"only the root logger can have a null parent");
|
||||
"the root logger can only have a null parent");
|
||||
|
||||
/* An application is allowed to control an anonymous logger
|
||||
* without having the permission to control the logging
|
||||
|
||||
@@ -40,6 +40,7 @@ package java.util.regex;
|
||||
|
||||
import gnu.regexp.RE;
|
||||
import gnu.regexp.REMatch;
|
||||
import gnu.regexp.CharIndexed;
|
||||
|
||||
/**
|
||||
* Instance of a regular expression applied to a char sequence.
|
||||
@@ -50,6 +51,10 @@ public final class Matcher implements MatchResult
|
||||
{
|
||||
private Pattern pattern;
|
||||
private CharSequence input;
|
||||
// We use CharIndexed as an input object to the getMatch method in order
|
||||
// that /\G/ (the end of the previous match) may work. The information
|
||||
// of the previous match is stored in the CharIndexed object.
|
||||
private CharIndexed inputCharIndexed;
|
||||
private int position;
|
||||
private int appendPosition;
|
||||
private REMatch match;
|
||||
@@ -58,6 +63,7 @@ public final class Matcher implements MatchResult
|
||||
{
|
||||
this.pattern = pattern;
|
||||
this.input = input;
|
||||
this.inputCharIndexed = RE.makeCharIndexed(input, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -119,7 +125,7 @@ public final class Matcher implements MatchResult
|
||||
public boolean find ()
|
||||
{
|
||||
boolean first = (match == null);
|
||||
match = pattern.getRE().getMatch(input, position);
|
||||
match = pattern.getRE().getMatch(inputCharIndexed, position);
|
||||
if (match != null)
|
||||
{
|
||||
int endIndex = match.getEndIndex();
|
||||
@@ -150,7 +156,7 @@ public final class Matcher implements MatchResult
|
||||
*/
|
||||
public boolean find (int start)
|
||||
{
|
||||
match = pattern.getRE().getMatch(input, start);
|
||||
match = pattern.getRE().getMatch(inputCharIndexed, start);
|
||||
if (match != null)
|
||||
{
|
||||
position = match.getEndIndex();
|
||||
@@ -212,7 +218,7 @@ public final class Matcher implements MatchResult
|
||||
|
||||
public boolean lookingAt ()
|
||||
{
|
||||
match = pattern.getRE().getMatch(input, 0);
|
||||
match = pattern.getRE().getMatch(inputCharIndexed, 0);
|
||||
if (match != null)
|
||||
{
|
||||
if (match.getStartIndex() == 0)
|
||||
@@ -237,7 +243,7 @@ public final class Matcher implements MatchResult
|
||||
*/
|
||||
public boolean matches ()
|
||||
{
|
||||
match = pattern.getRE().getMatch(input, 0, RE.REG_TRY_ENTIRE_MATCH);
|
||||
match = pattern.getRE().getMatch(inputCharIndexed, 0, RE.REG_TRY_ENTIRE_MATCH);
|
||||
if (match != null)
|
||||
{
|
||||
if (match.getStartIndex() == 0)
|
||||
|
||||
@@ -74,14 +74,16 @@ public final class Pattern implements Serializable
|
||||
this.flags = flags;
|
||||
|
||||
int gnuFlags = 0;
|
||||
gnuFlags |= RE.REG_ICASE_USASCII;
|
||||
if ((flags & CASE_INSENSITIVE) != 0)
|
||||
gnuFlags |= RE.REG_ICASE;
|
||||
if ((flags & MULTILINE) != 0)
|
||||
gnuFlags |= RE.REG_MULTILINE;
|
||||
if ((flags & DOTALL) != 0)
|
||||
gnuFlags |= RE.REG_DOT_NEWLINE;
|
||||
if ((flags & UNICODE_CASE) != 0)
|
||||
gnuFlags &= ~RE.REG_ICASE_USASCII;
|
||||
// not yet supported:
|
||||
// if ((flags & UNICODE_CASE) != 0) gnuFlags =
|
||||
// if ((flags & CANON_EQ) != 0) gnuFlags =
|
||||
|
||||
RESyntax syntax = RESyntax.RE_SYNTAX_JAVA_1_4;
|
||||
@@ -94,7 +96,7 @@ public final class Pattern implements Serializable
|
||||
|
||||
if ((flags & COMMENTS) != 0)
|
||||
{
|
||||
// Use a syntax with support for comments?
|
||||
gnuFlags |= RE.REG_X_COMMENTS;
|
||||
}
|
||||
|
||||
try
|
||||
|
||||
@@ -221,7 +221,6 @@ public class Deflater
|
||||
* where the compressor allocates native memory.
|
||||
* If you call any method (even reset) afterwards the behaviour is
|
||||
* <i>undefined</i>.
|
||||
* @deprecated Just clear all references to deflater instead.
|
||||
*/
|
||||
public void end()
|
||||
{
|
||||
|
||||
@@ -497,7 +497,7 @@ class DeflaterEngine implements DeflaterConstants
|
||||
throw new InternalError();
|
||||
}
|
||||
}
|
||||
huffman.tallyDist(strstart - matchStart, matchLen);
|
||||
boolean full = huffman.tallyDist(strstart - matchStart, matchLen);
|
||||
|
||||
lookahead -= matchLen;
|
||||
if (matchLen <= max_lazy && lookahead >= MIN_MATCH)
|
||||
@@ -516,7 +516,8 @@ class DeflaterEngine implements DeflaterConstants
|
||||
updateHash();
|
||||
}
|
||||
matchLen = MIN_MATCH - 1;
|
||||
continue;
|
||||
if (!full)
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -207,7 +207,7 @@ public class GZIPInputStream
|
||||
|
||||
/* 2. Check the compression type (must be 8) */
|
||||
int CM = in.read();
|
||||
if (CM != 8)
|
||||
if (CM != Deflater.DEFLATED)
|
||||
throw new IOException("Error in GZIP header, data not in deflate format");
|
||||
headCRC.update(CM);
|
||||
|
||||
|
||||
@@ -199,7 +199,6 @@ public class Inflater
|
||||
* with Sun's JDK, where the compressor allocates native memory.
|
||||
* If you call any method (even reset) afterwards the behaviour is
|
||||
* <i>undefined</i>.
|
||||
* @deprecated Just clear all references to inflater instead.
|
||||
*/
|
||||
public void end ()
|
||||
{
|
||||
|
||||
@@ -85,9 +85,6 @@ interface ZipConstants
|
||||
long ENDSIG = 'P'|('K'<<8)|(5<<16)|(6<<24);
|
||||
int ENDHDR = 22;
|
||||
|
||||
/* The following two fields are missing in SUN JDK */
|
||||
int ENDNRD = 4;
|
||||
int ENDDCD = 6;
|
||||
int ENDSUB = 8;
|
||||
int ENDTOT = 10;
|
||||
int ENDSIZ = 12;
|
||||
|
||||
@@ -43,6 +43,7 @@ import gnu.java.util.EmptyEnumeration;
|
||||
|
||||
import java.io.EOFException;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.RandomAccessFile;
|
||||
@@ -75,6 +76,11 @@ public class ZipFile implements ZipConstants
|
||||
*/
|
||||
public static final int OPEN_DELETE = 0x4;
|
||||
|
||||
/**
|
||||
* This field isn't defined in the JDK's ZipConstants, but should be.
|
||||
*/
|
||||
static final int ENDNRD = 4;
|
||||
|
||||
// Name of this zip file.
|
||||
private final String name;
|
||||
|
||||
@@ -86,6 +92,37 @@ public class ZipFile implements ZipConstants
|
||||
|
||||
private boolean closed = false;
|
||||
|
||||
|
||||
/**
|
||||
* Helper function to open RandomAccessFile and throw the proper
|
||||
* ZipException in case opening the file fails.
|
||||
*
|
||||
* @param name the file name, or null if file is provided
|
||||
*
|
||||
* @param file the file, or null if name is provided
|
||||
*
|
||||
* @return the newly open RandomAccessFile, never null
|
||||
*/
|
||||
private RandomAccessFile openFile(String name,
|
||||
File file)
|
||||
throws ZipException, IOException
|
||||
{
|
||||
try
|
||||
{
|
||||
return
|
||||
(name != null)
|
||||
? new RandomAccessFile(name, "r")
|
||||
: new RandomAccessFile(file, "r");
|
||||
}
|
||||
catch (FileNotFoundException f)
|
||||
{
|
||||
ZipException ze = new ZipException(f.getMessage());
|
||||
ze.initCause(f);
|
||||
throw ze;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Opens a Zip file with the given name for reading.
|
||||
* @exception IOException if a i/o error occured.
|
||||
@@ -94,7 +131,7 @@ public class ZipFile implements ZipConstants
|
||||
*/
|
||||
public ZipFile(String name) throws ZipException, IOException
|
||||
{
|
||||
this.raf = new RandomAccessFile(name, "r");
|
||||
this.raf = openFile(name,null);
|
||||
this.name = name;
|
||||
checkZipFile();
|
||||
}
|
||||
@@ -107,7 +144,7 @@ public class ZipFile implements ZipConstants
|
||||
*/
|
||||
public ZipFile(File file) throws ZipException, IOException
|
||||
{
|
||||
this.raf = new RandomAccessFile(file, "r");
|
||||
this.raf = openFile(null,file);
|
||||
this.name = file.getPath();
|
||||
checkZipFile();
|
||||
}
|
||||
@@ -134,7 +171,7 @@ public class ZipFile implements ZipConstants
|
||||
throw new IllegalArgumentException("invalid mode");
|
||||
if ((mode & OPEN_DELETE) != 0)
|
||||
file.deleteOnExit();
|
||||
this.raf = new RandomAccessFile(file, "r");
|
||||
this.raf = openFile(null,file);
|
||||
this.name = file.getPath();
|
||||
checkZipFile();
|
||||
}
|
||||
@@ -408,7 +445,19 @@ public class ZipFile implements ZipConstants
|
||||
case ZipOutputStream.STORED:
|
||||
return inp;
|
||||
case ZipOutputStream.DEFLATED:
|
||||
return new InflaterInputStream(inp, new Inflater(true));
|
||||
final Inflater inf = new Inflater(true);
|
||||
final int sz = (int) entry.getSize();
|
||||
return new InflaterInputStream(inp, inf)
|
||||
{
|
||||
public int available() throws IOException
|
||||
{
|
||||
if (sz == -1)
|
||||
return super.available();
|
||||
if (super.available() != 0)
|
||||
return sz - inf.getTotalOut();
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
default:
|
||||
throw new ZipException("Unknown compression method " + method);
|
||||
}
|
||||
@@ -514,6 +563,7 @@ public class ZipFile implements ZipConstants
|
||||
pos = 0;
|
||||
fillBuffer();
|
||||
}
|
||||
|
||||
return buffer[pos++] & 0xFF;
|
||||
}
|
||||
|
||||
@@ -544,7 +594,7 @@ public class ZipFile implements ZipConstants
|
||||
len -= remain;
|
||||
totalBytesRead += remain;
|
||||
}
|
||||
|
||||
|
||||
return totalBytesRead;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user