@@ -1,5 +1,5 @@
/*
* Copyright (c) 2011, 2017 , Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011, 2020 , Oracle and/or its affiliates. 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
@@ -20,13 +20,11 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java . io . BufferedInputStream ;
import java .io .IOException ;
import java .io .OutputStreamWriter ;
import java .io .PrintWriter ;
import java .net .ServerSocket ;
import java .io .OutputStream ;
import java .net .Socket ;
import java .nio . charset . StandardCharsets ;
import java .net . URI ;
import java .util .ConcurrentModificationException ;
import java .util .Hashtable ;
import javax .naming .Context ;
@@ -37,13 +35,15 @@
import javax .naming .event .NamingExceptionEvent ;
import javax .naming .event .NamingListener ;
import javax .naming .event .ObjectChangeListener ;
import jdk .test .lib .net .URIBuilder ;
/**
* @test
* @bug 8176192
* @summary Incorrect usage of Iterator in Java 8 In com.sun.jndi.ldap.
* EventSupport.removeNamingListener
* @modules java.naming
* @library lib/ /test/lib
* @run main RemoveNamingListenerTest
*/
public class RemoveNamingListenerTest {
@@ -55,10 +55,17 @@ public static void main(String args[]) throws Exception {
TestLDAPServer server = new TestLDAPServer ();
server .start ();
URI providerURI = URIBuilder .newBuilder ()
.scheme ("ldap" )
.loopback ()
.port (server .getPort ())
.path ("/o=example" )
.build ();
// Set up environment for creating initial context
Hashtable <String , Object > env = new Hashtable <>(3 );
env .put (Context .INITIAL_CONTEXT_FACTORY , "com.sun.jndi.ldap.LdapCtxFactory" );
env .put (Context .PROVIDER_URL , "ldap://localhost:" + server . getPort () + "/o=example" );
env .put (Context .PROVIDER_URL , providerURI . toString () );
env .put ("com.sun.jndi.ldap.connect.timeout" , "2000" );
EventContext ctx = null ;
@@ -89,7 +96,7 @@ public static void main(String args[]) throws Exception {
if (ctx != null ) {
ctx .close ();
}
server .stopServer ();
server .close ();
}
}
@@ -130,112 +137,28 @@ public void namingExceptionThrown(NamingExceptionEvent nee) {
}
}
class TestLDAPServer extends Thread {
private final int LDAP_PORT ;
private final ServerSocket serverSocket ;
private volatile boolean isRunning ;
TestLDAPServer () throws IOException {
serverSocket = new ServerSocket (0 );
isRunning = true ;
LDAP_PORT = serverSocket .getLocalPort ();
setDaemon (true );
}
public int getPort () {
return LDAP_PORT ;
}
public void stopServer () {
isRunning = false ;
if (serverSocket != null && !serverSocket .isClosed ()) {
try {
// this will cause ServerSocket.accept() to throw SocketException.
serverSocket .close ();
} catch (IOException ignored ) {
}
}
}
@ Override
public void run () {
try {
while (isRunning ) {
Socket clientSocket = serverSocket .accept ();
Thread handler = new Thread (new LDAPServerHandler (clientSocket ));
handler .setDaemon (true );
handler .start ();
}
} catch (IOException iOException ) {
//do not throw exception if server is not running.
if (isRunning ) {
throw new RuntimeException (iOException );
}
} finally {
stopServer ();
}
}
}
class LDAPServerHandler implements Runnable {
class TestLDAPServer extends BaseLdapServer {
private final Socket clientSocket ;
private byte [] bindResponse = {0x30 , 0x0C , 0x02 , 0x01 , 0x01 , 0x61 , 0x07 , 0x0A , 0x01 , 0x00 , 0x04 , 0x00 , 0x04 , 0x00 };
private byte [] searchResponse = {0x30 , 0x0C , 0x02 , 0x01 , 0x02 , 0x65 , 0x07 , 0x0A , 0x01 , 0x00 , 0x04 , 0x00 , 0x04 , 0x00 };
public LDAPServerHandler (final Socket clientSocket ) {
this .clientSocket = clientSocket ;
public TestLDAPServer () throws IOException {
}
@ Override
public void run () {
BufferedInputStream in = null ;
PrintWriter out = null ;
byte [] bindResponse = {0x30 , 0x0C , 0x02 , 0x01 , 0x01 , 0x61 , 0x07 , 0x0A , 0x01 , 0x00 , 0x04 , 0x00 , 0x04 , 0x00 };
byte [] searchResponse = {0x30 , 0x0C , 0x02 , 0x01 , 0x02 , 0x65 , 0x07 , 0x0A , 0x01 , 0x00 , 0x04 , 0x00 , 0x04 , 0x00 };
try {
in = new BufferedInputStream (clientSocket .getInputStream ());
out = new PrintWriter (new OutputStreamWriter (
clientSocket .getOutputStream (), StandardCharsets .UTF_8 ), true );
while (true ) {
// Read the LDAP BindRequest
while (in .read () != -1 ) {
in .skip (in .available ());
break ;
}
protected void handleRequest (Socket socket , LdapMessage request ,
OutputStream out ) throws IOException {
switch (request .getOperation ()) {
case BIND_REQUEST :
// Write an LDAP BindResponse
out .write (new String (bindResponse ));
out .flush ();
// Read the LDAP SearchRequest
while (in .read () != -1 ) {
in .skip (in .available ());
break ;
}
out .write (bindResponse );
break ;
case SEARCH_REQUEST :
// Write an LDAP SearchResponse
out .write (new String (searchResponse ));
out .flush ();
}
} catch (IOException iOException ) {
throw new RuntimeException (iOException );
} finally {
if (in != null ) {
try {
in .close ();
} catch (IOException ignored ) {
}
}
if (out != null ) {
out .close ();
}
if (clientSocket != null ) {
try {
clientSocket .close ();
} catch (IOException ignored ) {
}
}
out .write (searchResponse );
break ;
default :
break ;
}
}
}