This commit is contained in:
Abhijit Saha 2009-10-14 14:21:25 -07:00
commit 02d2cc35f6
23 changed files with 693 additions and 91 deletions

View File

@ -165,6 +165,11 @@ else
JAVADOC_CMD = $(JAVA_TOOLS_DIR)/javadoc $(JAVA_TOOLS_FLAGS:%=-J%)
endif
#always use the bootstrap javah until bug-ID 6889255 is fixed. These
#five lines should be removed as part of that fix:
JAVAH_CMD = $(JAVA_TOOLS_DIR)/javah \
$(JAVAHFLAGS)
# Override of what javac to use (see deploy workspace)
ifdef JAVAC
JAVAC_CMD = $(JAVAC)

View File

@ -258,6 +258,7 @@ JAVA_JAVA_java = \
java/util/ServiceConfigurationError.java \
java/util/Timer.java \
java/util/TimerTask.java \
java/util/Objects.java \
java/util/UUID.java \
java/util/concurrent/AbstractExecutorService.java \
java/util/concurrent/ArrayBlockingQueue.java \

View File

@ -25,11 +25,12 @@
package com.sun.naming.internal;
import java.applet.Applet;
import java.io.InputStream;
import java.io.IOException;
import java.net.URL;
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Hashtable;
@ -112,6 +113,52 @@ public final class ResourceManager {
private static final WeakHashMap urlFactoryCache = new WeakHashMap(11);
private static final WeakReference NO_FACTORY = new WeakReference(null);
/**
* A class to allow JNDI properties be specified as applet parameters
* without creating a static dependency on java.applet.
*/
private static class AppletParameter {
private static final Class<?> clazz = getClass("java.applet.Applet");
private static final Method getMethod =
getMethod(clazz, "getParameter", String.class);
private static Class<?> getClass(String name) {
try {
return Class.forName(name, true, null);
} catch (ClassNotFoundException e) {
return null;
}
}
private static Method getMethod(Class<?> clazz,
String name,
Class<?>... paramTypes)
{
if (clazz != null) {
try {
return clazz.getMethod(name, paramTypes);
} catch (NoSuchMethodException e) {
throw new AssertionError(e);
}
} else {
return null;
}
}
/**
* Returns the value of the applet's named parameter.
*/
static Object get(Object applet, String name) {
// if clazz is null then applet cannot be an Applet.
if (clazz == null || !clazz.isInstance(applet))
throw new ClassCastException(applet.getClass().getName());
try {
return getMethod.invoke(applet, name);
} catch (InvocationTargetException e) {
throw new AssertionError(e);
} catch (IllegalAccessException iae) {
throw new AssertionError(iae);
}
}
}
// There should be no instances of this class.
private ResourceManager() {
@ -143,7 +190,7 @@ public final class ResourceManager {
if (env == null) {
env = new Hashtable(11);
}
Applet applet = (Applet)env.get(Context.APPLET);
Object applet = env.get(Context.APPLET);
// Merge property values from env param, applet params, and system
// properties. The first value wins: there's no concatenation of
@ -157,7 +204,7 @@ public final class ResourceManager {
Object val = env.get(props[i]);
if (val == null) {
if (applet != null) {
val = applet.getParameter(props[i]);
val = AppletParameter.get(applet, props[i]);
}
if (val == null) {
// Read system property.

View File

@ -201,7 +201,7 @@ public final class Byte extends Number implements Comparable<Byte> {
*/
public static Byte valueOf(String s, int radix)
throws NumberFormatException {
return new Byte(parseByte(s, radix));
return valueOf(parseByte(s, radix));
}
/**
@ -277,7 +277,7 @@ public final class Byte extends Number implements Comparable<Byte> {
if (i < MIN_VALUE || i > MAX_VALUE)
throw new NumberFormatException(
"Value " + i + " out of range from input " + nm);
return (byte)i;
return valueOf((byte)i);
}
/**
@ -374,7 +374,7 @@ public final class Byte extends Number implements Comparable<Byte> {
* base&nbsp;10.
*/
public String toString() {
return String.valueOf((int)value);
return Integer.toString((int)value);
}
/**

View File

@ -629,7 +629,7 @@ public final class Double extends Number implements Comparable<Double> {
* @see java.lang.Double#toString(double)
*/
public String toString() {
return String.valueOf(value);
return toString(value);
}
/**

View File

@ -40,10 +40,17 @@ import java.io.ObjectStreamException;
* Edition</i>, <a
* href="http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.9">&sect;8.9</a>.
*
* <p> Note that when using an enumeration type as the type of a set
* or as the type of the keys in a map, specialized and efficient
* {@linkplain java.util.EnumSet set} and {@linkplain
* java.util.EnumMap map} implementations are available.
*
* @param <E> The enum type subclass
* @author Josh Bloch
* @author Neal Gafter
* @see Class#getEnumConstants()
* @see java.util.EnumSet
* @see java.util.EnumMap
* @since 1.5
*/
public abstract class Enum<E extends Enum<E>>

View File

@ -551,7 +551,7 @@ public final class Float extends Number implements Comparable<Float> {
* @see java.lang.Float#toString(float)
*/
public String toString() {
return String.valueOf(value);
return Float.toString(value);
}
/**

View File

@ -746,7 +746,7 @@ public final class Integer extends Number implements Comparable<Integer> {
* base&nbsp;10.
*/
public String toString() {
return String.valueOf(value);
return toString(value);
}
/**

View File

@ -761,7 +761,7 @@ public final class Long extends Number implements Comparable<Long> {
* base&nbsp;10.
*/
public String toString() {
return String.valueOf(value);
return toString(value);
}
/**

View File

@ -170,7 +170,7 @@ public final class Short extends Number implements Comparable<Short> {
*/
public static Short valueOf(String s, int radix)
throws NumberFormatException {
return new Short(parseShort(s, radix));
return valueOf(parseShort(s, radix));
}
/**
@ -282,7 +282,7 @@ public final class Short extends Number implements Comparable<Short> {
if (i < MIN_VALUE || i > MAX_VALUE)
throw new NumberFormatException(
"Value " + i + " out of range from input " + nm);
return (short)i;
return valueOf((short)i);
}
/**
@ -379,7 +379,7 @@ public final class Short extends Number implements Comparable<Short> {
* base&nbsp;10.
*/
public String toString() {
return String.valueOf((int)value);
return Integer.toString((int)value);
}
/**

View File

@ -2995,7 +2995,7 @@ public final class String
* @see java.lang.Integer#toString(int, int)
*/
public static String valueOf(int i) {
return Integer.toString(i, 10);
return Integer.toString(i);
}
/**
@ -3009,7 +3009,7 @@ public final class String
* @see java.lang.Long#toString(long)
*/
public static String valueOf(long l) {
return Long.toString(l, 10);
return Long.toString(l);
}
/**

View File

@ -44,6 +44,8 @@ import java.lang.annotation.Annotation;
* as Java Object Serialization or other persistence mechanisms, to
* manipulate objects in a manner that would normally be prohibited.
*
* <p>By default, a reflected object is <em>not</em> accessible.
*
* @see Field
* @see Method
* @see Constructor

View File

@ -0,0 +1,110 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package java.util;
/**
* This class consists of {@code static} utility methods for operating
* on objects. These utilities include {@code null}-safe or {@code
* null}-tolerant methods for computing the hash code of an object,
* returning a string for an object, and comparing two objects.
*
* @since 1.7
*/
public class Objects {
private Objects() {
throw new AssertionError("No java.util.Objects instances for you!");
}
/**
* Returns {@code true} if the arguments are equal to each other
* and {@code false} otherwise.
* Consequently, if both arguments are {@code null}, {@code true}
* is returned and if exactly one argument is {@code null}, {@code
* false} is returned. Otherwise, equality is determined by using
* the {@link Object#equals equals} method of the first
* argument.
*
* @param a an object
* @param b an object to be compared with {@code a} for equality
* @return {@code true} if the arguments are equal to each other
* and {@code false} otherwise
* @see Object#equals(Object)
*/
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
/**
* Returns the hash code of a non-{@code null} argument and 0 for
* a {@code null} argument.
*
* @param o an object
* @return the hash code of a non-{@code null} argument and 0 for
* a {@code null} argument
* @see Object#hashCode
*/
public static int hashCode(Object o) {
return o != null ? o.hashCode() : 0;
}
/**
* Returns the result of calling {@code toString} for a non-{@code
* null} argument and {@code "null"} for a {@code null} argument.
*
* @param o an object
* @return the result of calling {@code toString} for a non-{@code
* null} argument and {@code "null"} for a {@code null} argument
* @see Object#toString
* @see String#valueOf(Object)
*/
public static String toString(Object o) {
return String.valueOf(o);
}
/**
* Returns 0 if the arguments are identical and {@code
* c.compare(a, b)} otherwise.
* Consequently, if both arguments are {@code null} 0
* is returned.
*
* <p>Note that if one of the arguments is {@code null}, a {@code
* NullPointerException} may or may not be thrown depending on
* what ordering policy, if any, the {@link Comparator Comparator}
* chooses to have for {@code null} values.
*
* @param <T> the type of the objects being compared
* @param a an object
* @param b an object to be compared with {@code a}
* @param c the {@code Comparator} to compare the first two arguments
* @return 0 if the arguments are identical and {@code
* c.compare(a, b)} otherwise.
* @see Comparable
* @see Comparator
*/
public static <T> int compare(T a, T b, Comparator<? super T> c) {
return (a == b) ? 0 : c.compare(a, b);
}
}

View File

@ -210,7 +210,7 @@ final class SunEntries {
* CertStores
*/
map.put("CertStore.LDAP",
"sun.security.provider.certpath.LDAPCertStore");
"sun.security.provider.certpath.ldap.LDAPCertStore");
map.put("CertStore.LDAP LDAPSchema", "RFC2587");
map.put("CertStore.Collection",
"sun.security.provider.certpath.CollectionCertStore");

View File

@ -0,0 +1,68 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package sun.security.provider.certpath;
import java.net.URI;
import java.util.Collection;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidAlgorithmParameterException;
import java.security.cert.CertStore;
import java.security.cert.X509CertSelector;
import java.security.cert.X509CRLSelector;
import javax.security.auth.x500.X500Principal;
import java.io.IOException;
/**
* Helper used by URICertStore when delegating to another CertStore to
* fetch certs and CRLs.
*/
public interface CertStoreHelper {
/**
* Returns a CertStore using the given URI as parameters.
*/
CertStore getCertStore(URI uri)
throws NoSuchAlgorithmException, InvalidAlgorithmParameterException;
/**
* Wraps an existing X509CertSelector when needing to avoid DN matching
* issues.
*/
X509CertSelector wrap(X509CertSelector selector,
X500Principal certSubject,
String dn)
throws IOException;
/**
* Wraps an existing X509CRLSelector when needing to avoid DN matching
* issues.
*/
X509CRLSelector wrap(X509CRLSelector selector,
Collection<X500Principal> certIssuers,
String dn)
throws IOException;
}

View File

@ -64,6 +64,8 @@ public final class OCSP {
private static final Debug debug = Debug.getInstance("certpath");
private static final int CONNECT_TIMEOUT = 15000; // 15 seconds
private OCSP() {}
/**
@ -176,6 +178,8 @@ public final class OCSP {
debug.println("connecting to OCSP service at: " + url);
}
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setConnectTimeout(CONNECT_TIMEOUT);
con.setReadTimeout(CONNECT_TIMEOUT);
con.setDoOutput(true);
con.setDoInput(true);
con.setRequestMethod("POST");

View File

@ -25,7 +25,6 @@
package sun.security.provider.certpath;
import java.io.IOException;
import java.math.BigInteger;
import java.util.*;
import java.security.AccessController;
@ -335,10 +334,11 @@ class OCSPChecker extends PKIXCertPathChecker {
(issuerCert, currCertImpl.getSerialNumberObject());
response = OCSP.check(Collections.singletonList(certId), uri,
responderCert, pkixParams.getDate());
} catch (IOException ioe) {
// should allow this to pass if network failures are acceptable
} catch (Exception e) {
// Wrap all exceptions in CertPathValidatorException so that
// we can fallback to CRLs, if enabled.
throw new CertPathValidatorException
("Unable to send OCSP request", ioe);
("Unable to send OCSP request", e);
}
RevocationStatus rs = (RevocationStatus) response.getSingleResponse(certId);

View File

@ -30,6 +30,8 @@ import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URLConnection;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.InvalidAlgorithmParameterException;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
@ -120,6 +122,32 @@ class URICertStore extends CertStoreSpi {
private CertStore ldapCertStore;
private String ldapPath;
/**
* Holder class to lazily load LDAPCertStoreHelper if present.
*/
private static class LDAP {
private static final String CERT_STORE_HELPER =
"sun.security.provider.certpath.ldap.LDAPCertStoreHelper";
private static final CertStoreHelper helper =
AccessController.doPrivileged(
new PrivilegedAction<CertStoreHelper>() {
public CertStoreHelper run() {
try {
Class<?> c = Class.forName(CERT_STORE_HELPER, true, null);
return (CertStoreHelper)c.newInstance();
} catch (ClassNotFoundException cnf) {
return null;
} catch (InstantiationException e) {
throw new AssertionError(e);
} catch (IllegalAccessException e) {
throw new AssertionError(e);
}
}});
static CertStoreHelper helper() {
return helper;
}
}
/**
* Creates a URICertStore.
*
@ -135,9 +163,10 @@ class URICertStore extends CertStoreSpi {
this.uri = ((URICertStoreParameters) params).uri;
// if ldap URI, use an LDAPCertStore to fetch certs and CRLs
if (uri.getScheme().toLowerCase().equals("ldap")) {
if (LDAP.helper() == null)
throw new NoSuchAlgorithmException("LDAP not present");
ldap = true;
ldapCertStore =
LDAPCertStore.getInstance(LDAPCertStore.getParameters(uri));
ldapCertStore = LDAP.helper().getCertStore(uri);
ldapPath = uri.getPath();
// strip off leading '/'
if (ldapPath.charAt(0) == '/') {
@ -219,8 +248,7 @@ class URICertStore extends CertStoreSpi {
if (ldap) {
X509CertSelector xsel = (X509CertSelector) selector;
try {
xsel = new LDAPCertStore.LDAPCertSelector
(xsel, xsel.getSubject(), ldapPath);
xsel = LDAP.helper().wrap(xsel, xsel.getSubject(), ldapPath);
} catch (IOException ioe) {
throw new CertStoreException(ioe);
}
@ -340,7 +368,7 @@ class URICertStore extends CertStoreSpi {
if (ldap) {
X509CRLSelector xsel = (X509CRLSelector) selector;
try {
xsel = new LDAPCertStore.LDAPCRLSelector(xsel, null, ldapPath);
xsel = LDAP.helper().wrap(xsel, null, ldapPath);
} catch (IOException ioe) {
throw new CertStoreException(ioe);
}

View File

@ -23,7 +23,7 @@
* have any questions.
*/
package sun.security.provider.certpath;
package sun.security.provider.certpath.ldap;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@ -46,6 +46,7 @@ import java.security.cert.*;
import javax.security.auth.x500.X500Principal;
import sun.misc.HexDumpEncoder;
import sun.security.provider.certpath.X509CertificatePair;
import sun.security.util.Cache;
import sun.security.util.Debug;
import sun.security.x509.X500Name;

View File

@ -0,0 +1,73 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package sun.security.provider.certpath.ldap;
import java.net.URI;
import java.util.Collection;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidAlgorithmParameterException;
import java.security.cert.CertStore;
import java.security.cert.X509CertSelector;
import java.security.cert.X509CRLSelector;
import javax.security.auth.x500.X500Principal;
import java.io.IOException;
import sun.security.provider.certpath.CertStoreHelper;
/**
* LDAP implementation of CertStoreHelper.
*/
public class LDAPCertStoreHelper
implements CertStoreHelper
{
public LDAPCertStoreHelper() { }
@Override
public CertStore getCertStore(URI uri)
throws NoSuchAlgorithmException, InvalidAlgorithmParameterException
{
return LDAPCertStore.getInstance(LDAPCertStore.getParameters(uri));
}
@Override
public X509CertSelector wrap(X509CertSelector selector,
X500Principal certSubject,
String ldapDN)
throws IOException
{
return new LDAPCertStore.LDAPCertSelector(selector, certSubject, ldapDN);
}
@Override
public X509CRLSelector wrap(X509CRLSelector selector,
Collection<X500Principal> certIssuers,
String ldapDN)
throws IOException
{
return new LDAPCertStore.LDAPCRLSelector(selector, certIssuers, ldapDN);
}
}

View File

@ -0,0 +1,69 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/*
* @test
* @bug 6648344
* @summary Test that default accessibility is false
* @author Joseph D. Darcy
*/
import java.lang.reflect.*;
public class DefaultAccessibility {
private DefaultAccessibility() {
super();
}
private static int f = 42;
public static void main(String... args) throws Exception {
Class<?> daClass = (new DefaultAccessibility()).getClass();
int elementCount = 0;
for(Constructor<?> ctor : daClass.getDeclaredConstructors()) {
elementCount++;
if (ctor.isAccessible())
throw new RuntimeException("Unexpected accessibility for constructor " +
ctor);
}
for(Method method : daClass.getDeclaredMethods()) {
elementCount++;
if (method.isAccessible())
throw new RuntimeException("Unexpected accessibility for method " +
method);
}
for(Field field : daClass.getDeclaredFields()) {
elementCount++;
if (field.isAccessible())
throw new RuntimeException("Unexpected accessibility for field " +
field);
}
if (elementCount < 3)
throw new RuntimeException("Expected at least three members; only found " +
elementCount);
}
}

View File

@ -27,7 +27,6 @@
* @summary Re-test IPv6 (and specifically MulticastSocket) with latest Linux & USAGI code
*/
import java.net.*;
import java.util.concurrent.*;
import java.util.*;
@ -68,38 +67,61 @@ public class SetOutgoingIf {
// We need 2 or more network interfaces to run the test
//
List<NetworkInterface> nics = new ArrayList<NetworkInterface>();
List<NetIf> netIfs = new ArrayList<NetIf>();
int index = 1;
for (NetworkInterface nic : Collections.list(NetworkInterface.getNetworkInterfaces())) {
// we should use only network interfaces with multicast support which are in "up" state
if (!nic.isLoopback() && nic.supportsMulticast() && nic.isUp())
nics.add(nic);
if (!nic.isLoopback() && nic.supportsMulticast() && nic.isUp()) {
NetIf netIf = NetIf.create(nic);
// now determine what (if any) type of addresses are assigned to this interface
for (InetAddress addr : Collections.list(nic.getInetAddresses())) {
if (addr instanceof Inet4Address) {
netIf.ipv4Address(true);
} else if (addr instanceof Inet6Address) {
netIf.ipv6Address(true);
}
}
if (netIf.ipv4Address() || netIf.ipv6Address()) {
netIf.index(index++);
netIfs.add(netIf);
debug("Using: " + nic);
}
}
}
if (nics.size() <= 1) {
if (netIfs.size() <= 1) {
System.out.println("Need 2 or more network interfaces to run. Bye.");
return;
}
// We will send packets to one ipv4, one ipv4-mapped, and one ipv6
// We will send packets to one ipv4, and one ipv6
// multicast group using each network interface :-
// 224.1.1.1 --|
// ::ffff:224.1.1.2 -----> using network interface #1
// ff02::1:1 --|
// ff02::1:1 --|--> using network interface #1
// 224.1.2.1 --|
// ::ffff:224.1.2.2 -----> using network interface #2
// ff02::1:2 --|
// ff02::1:2 --|--> using network interface #2
// and so on.
//
List<InetAddress> groups = new ArrayList<InetAddress>();
for (int i = 0; i < nics.size(); i++) {
InetAddress groupv4 = InetAddress.getByName("224.1." + (i+1) + ".1");
InetAddress groupv4mapped = InetAddress.getByName("::ffff:224.1." + (i+1) + ".2");
InetAddress groupv6 = InetAddress.getByName("ff02::1:" + (i+1));
groups.add(groupv4);
groups.add(groupv4mapped);
groups.add(groupv6);
for (NetIf netIf : netIfs) {
int NetIfIndex = netIf.index();
List<InetAddress> groups = new ArrayList<InetAddress>();
// use a separated thread to send to those 3 groups
Thread sender = new Thread(new Sender(nics.get(i), groupv4, groupv4mapped, groupv6, PORT));
if (netIf.ipv4Address()) {
InetAddress groupv4 = InetAddress.getByName("224.1." + NetIfIndex + ".1");
groups.add(groupv4);
}
if (netIf.ipv6Address()) {
InetAddress groupv6 = InetAddress.getByName("ff02::1:" + NetIfIndex);
groups.add(groupv6);
}
debug("Adding " + groups + " groups for " + netIf.nic().getName());
netIf.groups(groups);
// use a separated thread to send to those 2 groups
Thread sender = new Thread(new Sender(netIf,
groups,
PORT));
sender.setDaemon(true); // we want sender to stop when main thread exits
sender.start();
}
@ -108,75 +130,135 @@ public class SetOutgoingIf {
// from the expected network interface
//
byte[] buf = new byte[1024];
for (InetAddress group : groups) {
MulticastSocket mcastsock = new MulticastSocket(PORT);
mcastsock.setSoTimeout(5000); // 5 second
DatagramPacket packet = new DatagramPacket(buf, 0, buf.length);
for (NetIf netIf : netIfs) {
NetworkInterface nic = netIf.nic();
for (InetAddress group : netIf.groups()) {
MulticastSocket mcastsock = new MulticastSocket(PORT);
mcastsock.setSoTimeout(5000); // 5 second
DatagramPacket packet = new DatagramPacket(buf, 0, buf.length);
mcastsock.joinGroup(new InetSocketAddress(group, PORT), nics.get(groups.indexOf(group) / 3));
// the interface supports the IP multicast group
debug("Joining " + group + " on " + nic.getName());
mcastsock.joinGroup(new InetSocketAddress(group, PORT), nic);
try {
mcastsock.receive(packet);
} catch (Exception e) {
// test failed if any exception
throw new RuntimeException(e);
try {
mcastsock.receive(packet);
debug("received packet on " + packet.getAddress());
} catch (Exception e) {
// test failed if any exception
throw new RuntimeException(e);
}
// now check which network interface this packet comes from
NetworkInterface from = NetworkInterface.getByInetAddress(packet.getAddress());
NetworkInterface shouldbe = nic;
if (!from.equals(shouldbe)) {
System.out.println("Packets on group "
+ group + " should come from "
+ shouldbe.getName() + ", but came from "
+ from.getName());
//throw new RuntimeException("Test failed.");
}
mcastsock.leaveGroup(new InetSocketAddress(group, PORT), nic);
}
// now check which network interface this packet comes from
NetworkInterface from = NetworkInterface.getByInetAddress(packet.getAddress());
NetworkInterface shouldbe = nics.get(groups.indexOf(group) / 3);
if (!from.equals(shouldbe)) {
System.out.println("Packets on group "
+ group + " should come from "
+ shouldbe.getName() + ", but came from "
+ from.getName());
//throw new RuntimeException("Test failed.");
}
mcastsock.leaveGroup(new InetSocketAddress(group, PORT), nics.get(groups.indexOf(group) / 3));
}
}
private static boolean debug = true;
static void debug(String message) {
if (debug)
System.out.println(message);
}
}
class Sender implements Runnable {
private NetworkInterface nic;
private InetAddress group1;
private InetAddress group2;
private InetAddress group3;
private NetIf netIf;
private List<InetAddress> groups;
private int port;
public Sender(NetworkInterface nic,
InetAddress groupv4, InetAddress groupv4mapped, InetAddress groupv6,
int port) {
this.nic = nic;
group1 = groupv4;
group2 = groupv4mapped;
group3 = groupv6;
public Sender(NetIf netIf,
List<InetAddress> groups,
int port) {
this.netIf = netIf;
this.groups = groups;
this.port = port;
}
public void run() {
try {
MulticastSocket mcastsock = new MulticastSocket();
mcastsock.setNetworkInterface(nic);
mcastsock.setNetworkInterface(netIf.nic());
List<DatagramPacket> packets = new LinkedList<DatagramPacket>();
byte[] buf = "hello world".getBytes();
DatagramPacket packet1 = new DatagramPacket(buf, buf.length,
new InetSocketAddress(group1, port));
DatagramPacket packet2 = new DatagramPacket(buf, buf.length,
new InetSocketAddress(group2, port));
DatagramPacket packet3 = new DatagramPacket(buf, buf.length,
new InetSocketAddress(group3, port));
for (InetAddress group : groups) {
packets.add(new DatagramPacket(buf, buf.length, new InetSocketAddress(group, port)));
}
for (;;) {
mcastsock.send(packet1);
mcastsock.send(packet2);
mcastsock.send(packet3);
for (DatagramPacket packet : packets)
mcastsock.send(packet);
Thread.currentThread().sleep(1000); // sleep 1 second
Thread.sleep(1000); // sleep 1 second
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
@SuppressWarnings("unchecked")
class NetIf {
private boolean ipv4Address; //false
private boolean ipv6Address; //false
private int index;
List<InetAddress> groups = Collections.EMPTY_LIST;
private final NetworkInterface nic;
private NetIf(NetworkInterface nic) {
this.nic = nic;
}
static NetIf create(NetworkInterface nic) {
return new NetIf(nic);
}
NetworkInterface nic() {
return nic;
}
boolean ipv4Address() {
return ipv4Address;
}
void ipv4Address(boolean ipv4Address) {
this.ipv4Address = ipv4Address;
}
boolean ipv6Address() {
return ipv6Address;
}
void ipv6Address(boolean ipv6Address) {
this.ipv6Address = ipv6Address;
}
int index() {
return index;
}
void index(int index) {
this.index = index;
}
List<InetAddress> groups() {
return groups;
}
void groups(List<InetAddress> groups) {
this.groups = groups;
}
}

View File

@ -0,0 +1,105 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
/*
* @test
* @bug 6797535
* @summary Basic tests for methods in java.util.Objects
* @author Joseph D. Darcy
*/
import java.util.*;
public class BasicObjectsTest {
public static void main(String... args) {
int errors = 0;
errors += testEquals();
errors += testHashCode();
errors += testToString();
errors += testCompare();
if (errors > 0 )
throw new RuntimeException();
}
private static int testEquals() {
int errors = 0;
Object[] values = {null, "42", 42};
for(int i = 0; i < values.length; i++)
for(int j = 0; j < values.length; j++) {
boolean expected = (i == j);
Object a = values[i];
Object b = values[j];
boolean result = Objects.equals(a, b);
if (result != expected) {
errors++;
System.err.printf("When equating %s to %s, got %b instead of %b%n.",
a, b, result, expected);
}
}
return errors;
}
private static int testHashCode() {
int errors = 0;
errors += (Objects.hashCode(null) == 0 ) ? 0 : 1;
String s = "42";
errors += (Objects.hashCode(s) == s.hashCode() ) ? 0 : 1;
return errors;
}
private static int testToString() {
int errors = 0;
errors += ("null".equals(Objects.toString(null)) ) ? 0 : 1;
String s = "Some string";
errors += (s.equals(Objects.toString(s)) ) ? 0 : 1;
return errors;
}
private static int testCompare() {
int errors = 0;
String[] values = {"e. e. cummings", "zzz"};
String[] VALUES = {"E. E. Cummings", "ZZZ"};
errors += compareTest(null, null, 0);
for(int i = 0; i < values.length; i++) {
String a = values[i];
errors += compareTest(a, a, 0);
for(int j = 0; j < VALUES.length; j++) {
int expected = Integer.compare(i, j);
String b = VALUES[j];
errors += compareTest(a, b, expected);
}
}
return errors;
}
private static int compareTest(String a, String b, int expected) {
int errors = 0;
int result = Objects.compare(a, b, String.CASE_INSENSITIVE_ORDER);
if (Integer.signum(result) != Integer.signum(expected)) {
errors++;
System.err.printf("When comparing %s to %s, got %d instead of %d%n.",
a, b, result, expected);
}
return errors;
}
}