home *** CD-ROM | disk | FTP | other *** search
- package netscape.ldap;
-
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.Socket;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import java.util.Vector;
- import netscape.ldap.ber.stream.BERElement;
- import netscape.ldap.client.JDAPBERTagDecoder;
- import netscape.ldap.client.JDAPControl;
- import netscape.ldap.client.JDAPMessage;
- import netscape.ldap.client.opers.JDAPAbandonRequest;
- import netscape.ldap.client.opers.JDAPProtocolOp;
- import netscape.ldap.client.opers.JDAPResult;
- import netscape.ldap.client.opers.JDAPSearchResponse;
- import netscape.ldap.client.opers.JDAPSearchResult;
- import netscape.ldap.client.opers.JDAPSearchResultReference;
- import netscape.ldap.client.opers.JDAPUnbindRequest;
-
- class LDAPConnThread extends Thread {
- private static final int MAXMSGID = Integer.MAX_VALUE;
- private transient int m_highMsgId = 0;
- private transient InputStream m_serverInput;
- private transient OutputStream m_serverOutput;
- private transient Hashtable m_requests = new Hashtable();
- private transient Hashtable m_messages;
- private transient Vector m_registered = new Vector();
- private transient boolean m_disconnected = false;
- private transient LDAPCache m_cache;
- private transient boolean m_failed = false;
- private Object m_securityLayer;
- private Socket m_socket;
- private int m_maxBacklog = 100;
-
- public LDAPConnThread(String var1, int var2, LDAPSocketFactory var3, LDAPCache var4) throws LDAPException {
- this.m_cache = var4;
- if (this.m_cache != null) {
- this.m_messages = new Hashtable();
- }
-
- try {
- if (var3 == null) {
- this.m_socket = new Socket(var1, var2);
- } else {
- this.m_socket = var3.makeSocket(var1, var2);
- }
-
- this.m_serverInput = new BufferedInputStream(this.m_socket.getInputStream());
- this.m_serverOutput = new BufferedOutputStream(this.m_socket.getOutputStream());
- } catch (IOException var5) {
- this.m_failed = true;
- ((Thread)this).start();
- throw new LDAPException("failed to connect to server " + var1, 91);
- }
-
- ((Thread)this).start();
- }
-
- synchronized void sendRequest(JDAPProtocolOp var1, LDAPResponseListener var2, LDAPSearchConstraints var3) throws LDAPException {
- if (this.m_serverOutput == null) {
- throw new LDAPException("not connected to a server", 80);
- } else {
- LDAPControl[] var5 = var3.getServerControls();
- JDAPMessage var4;
- if (var5 != null && var5.length > 0) {
- JDAPControl[] var6 = new JDAPControl[var5.length];
-
- for(int var7 = 0; var7 < var5.length; ++var7) {
- var6[var7] = new JDAPControl(var5[var7].getID(), var5[var7].isCritical(), var5[var7].getValue());
- }
-
- var4 = new JDAPMessage(this.allocateId(), var1, var6);
- } else {
- var4 = new JDAPMessage(this.allocateId(), var1);
- }
-
- if (var2 != null) {
- if (!(var1 instanceof JDAPAbandonRequest) && !(var1 instanceof JDAPUnbindRequest)) {
- this.m_requests.put(new Integer(var4.getId()), var2);
- this.resultRetrieved();
- }
-
- var2.setID(var4.getId());
- }
-
- try {
- var4.write(this.m_serverOutput);
- this.m_serverOutput.flush();
- } catch (IOException var8) {
- this.networkError(var8);
- }
- }
- }
-
- public synchronized void register(LDAPConnection var1) {
- if (!this.m_registered.contains(var1)) {
- this.m_registered.addElement(var1);
- }
-
- }
-
- void setSecurityLayer(Object var1) {
- this.m_securityLayer = var1;
- }
-
- synchronized int getClientCount() {
- return this.m_registered.size();
- }
-
- public synchronized void deregister(LDAPConnection var1) {
- this.m_registered.removeElement(var1);
- if (this.m_registered.size() == 0) {
- try {
- LDAPSearchConstraints var2 = var1.getSearchConstraints();
- this.sendRequest(new JDAPUnbindRequest(), (LDAPResponseListener)null, var2);
- this.cleanUp();
- ((Thread)this).stop();
- Thread.sleep(100L);
- } catch (Exception var4) {
- String var3 = ((Throwable)var4).toString();
- }
- }
- }
-
- private void cleanUp() {
- if (!this.m_disconnected) {
- try {
- this.m_serverOutput.close();
- } catch (Exception var26) {
- } finally {
- this.m_serverOutput = null;
- }
-
- try {
- this.m_serverInput.close();
- } catch (Exception var24) {
- } finally {
- this.m_serverInput = null;
- }
-
- try {
- this.m_socket.close();
- } catch (Exception var22) {
- } finally {
- this.m_socket = null;
- }
-
- this.m_disconnected = true;
- if (this.m_registered != null) {
- Vector var1 = (Vector)this.m_registered.clone();
- Enumeration var2 = var1.elements();
-
- while(var2.hasMoreElements()) {
- LDAPConnection var3 = (LDAPConnection)var2.nextElement();
- var3.deregisterConnection();
- }
- }
-
- this.m_registered = null;
- this.m_messages = null;
- this.m_requests.clear();
- }
-
- }
-
- void setMaxBacklog(int var1) {
- this.m_maxBacklog = var1;
- }
-
- int getMaxBacklog() {
- return this.m_maxBacklog;
- }
-
- private void checkBacklog() {
- boolean var1;
- do {
- var1 = false;
- Enumeration var2 = this.m_requests.elements();
-
- while(var2.hasMoreElements()) {
- LDAPResponseListener var3 = (LDAPResponseListener)var2.nextElement();
- if (!(var3 instanceof LDAPSearchListener)) {
- var1 = false;
- break;
- }
-
- LDAPSearchListener var4 = (LDAPSearchListener)var3;
- if (var4.getConstraints().getBatchSize() != 0 && var4.getCount() >= this.m_maxBacklog) {
- var1 = true;
- }
- }
-
- if (var1) {
- synchronized(this){}
-
- try {
- try {
- this.wait();
- } catch (InterruptedException var7) {
- }
- } catch (Throwable var8) {
- throw var8;
- }
- }
- } while(var1);
-
- }
-
- synchronized void resultRetrieved() {
- this.notifyAll();
- }
-
- public void run() {
- if (this.m_failed) {
- ((Thread)this).stop();
- }
-
- Object var1 = null;
- JDAPBERTagDecoder var2 = new JDAPBERTagDecoder();
-
- do {
- Thread.yield();
- int[] var3 = new int[]{0};
- this.checkBacklog();
-
- try {
- BERElement var4 = BERElement.getElement(var2, this.m_serverInput, var3);
- JDAPMessage var6 = new JDAPMessage(var4);
- this.processResponse(var6, var3[0]);
- } catch (Exception var5) {
- this.networkError(var5);
- }
- } while(!this.m_disconnected);
-
- }
-
- private synchronized int allocateId() {
- this.m_highMsgId = (this.m_highMsgId + 1) % Integer.MAX_VALUE;
- return this.m_highMsgId;
- }
-
- private synchronized void processResponse(JDAPMessage var1, int var2) {
- Integer var3 = new Integer(var1.getId());
- LDAPResponseListener var4 = (LDAPResponseListener)this.m_requests.get(var3);
- if (var4 != null) {
- LDAPControl[] var5 = this.checkControls(var1);
- ResponseControl var6 = null;
- if (var5 != null) {
- var6 = new ResponseControl(var4.getConnection(), var1.getId(), var5);
- }
-
- var4.getConnection().setResponseControls(this, var6);
- JDAPProtocolOp var7 = var1.getProtocolOp();
- Object var8 = null;
- if (!(var7 instanceof JDAPSearchResponse) && !(var7 instanceof JDAPSearchResultReference)) {
- var4.setResponse(var1);
- if (var4 instanceof LDAPSearchListener) {
- Long var16 = ((LDAPSearchListener)var4).getKey();
- if (var16 != null) {
- boolean var17 = false;
- JDAPProtocolOp var11 = var1.getProtocolOp();
- if (var11 instanceof JDAPSearchResult) {
- JDAPResult var12 = (JDAPResult)var11;
- if (var12.getResultCode() > 0) {
- var17 = true;
- }
- }
-
- if (!var17 && this.m_cache != null) {
- Vector var15 = (Vector)this.m_messages.remove(var3);
- if (var15 == null) {
- var15 = new Vector();
- var15.addElement(new Long(0L));
- }
-
- try {
- this.m_cache.addEntry(var16, var15);
- } catch (LDAPException var13) {
- System.out.println("Exception: " + var13.toString());
- }
- }
- }
- }
-
- this.m_requests.remove(var3);
- } else {
- ((LDAPSearchListener)var4).addSearchResult(var1);
- Long var9 = ((LDAPSearchListener)var4).getKey();
- if (this.m_cache != null && var9 != null) {
- Vector var14 = (Vector)this.m_messages.get(var3);
- if (var14 == null) {
- var14 = new Vector();
- var14.addElement(new Long(0L));
- }
-
- long var10 = (Long)var14.firstElement() + (long)var2;
- var14.setElementAt(new Long(var10), 0);
- var14.addElement(this.constructLDAPEntry(var1));
- this.m_messages.put(var3, var14);
- return;
- }
- }
-
- }
- }
-
- private LDAPEntry constructLDAPEntry(JDAPMessage var1) {
- JDAPProtocolOp var2 = var1.getProtocolOp();
- JDAPSearchResponse var3 = (JDAPSearchResponse)var2;
- LDAPAttribute[] var4 = var3.getAttributes();
- LDAPAttributeSet var5;
- if (var4 != null) {
- var5 = new LDAPAttributeSet(var4);
- } else {
- var5 = new LDAPAttributeSet();
- }
-
- String var6 = var3.getObjectName();
- return new LDAPEntry(var6, var5);
- }
-
- private LDAPControl[] checkControls(JDAPMessage var1) {
- LDAPControl[] var2 = null;
- if (var1 != null) {
- JDAPControl[] var3 = var1.getControls();
- if (var3 != null && var3.length > 0) {
- var2 = new LDAPControl[var3.length];
-
- for(int var4 = 0; var4 < var3.length; ++var4) {
- var2[var4] = new LDAPControl(var3[var4].getID(), var3[var4].isCritical(), var3[var4].getValue());
- }
- }
- }
-
- return var2;
- }
-
- void abandon(int var1) {
- this.m_requests.remove(new Integer(var1));
- }
-
- private synchronized void networkError(Exception var1) {
- try {
- Enumeration var2 = this.m_requests.elements();
-
- while(var2.hasMoreElements()) {
- LDAPResponseListener var3 = (LDAPResponseListener)var2.nextElement();
- var3.setException(new LDAPException("Server down", 80));
- }
-
- this.cleanUp();
- } catch (NullPointerException var5) {
- System.err.println("Exception: " + ((Throwable)var5).toString());
- }
-
- if (this.m_registered != null) {
- Vector var6 = (Vector)this.m_registered.clone();
- Enumeration var7 = var6.elements();
-
- while(var7.hasMoreElements()) {
- LDAPConnection var4 = (LDAPConnection)var7.nextElement();
- var4.deregisterConnection();
- }
- }
-
- }
- }
-