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;
-
- 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 {
- Object var5 = null;
- Socket var7;
- if (var3 == null) {
- var7 = new Socket(var1, var2);
- } else {
- var7 = var3.makeSocket(var1, var2);
- }
-
- this.m_serverInput = new BufferedInputStream(var7.getInputStream());
- this.m_serverOutput = new BufferedOutputStream(var7.getOutputStream());
- } catch (IOException var6) {
- 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);
- }
-
- var2.setID(var4.getId());
- }
-
- try {
- var4.write(this.m_serverOutput);
- this.m_serverOutput.flush();
- } catch (IOException var8) {
- throw new LDAPException("error writing request", 80);
- }
- }
- }
-
- public synchronized void register(LDAPConnection var1) {
- if (!this.m_registered.contains(var1)) {
- this.m_registered.addElement(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);
- ((Thread)this).stop();
- Thread.sleep(100L);
- } catch (Exception var3) {
- }
- }
- }
-
- 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};
-
- 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 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);
- var4.getConnection().setResponseControls(var4.getThread(), var5);
- JDAPProtocolOp var6 = var1.getProtocolOp();
- Object var7 = null;
- if (!(var6 instanceof JDAPSearchResponse) && !(var6 instanceof JDAPSearchResultReference)) {
- var4.setResponse(var1);
- if (var4 instanceof LDAPSearchListener) {
- Long var15 = ((LDAPSearchListener)var4).getKey();
- if (var15 != null) {
- boolean var16 = false;
- JDAPProtocolOp var10 = var1.getProtocolOp();
- if (var10 instanceof JDAPSearchResult) {
- JDAPResult var11 = (JDAPResult)var10;
- if (var11.getResultCode() > 0) {
- var16 = true;
- }
- }
-
- if (!var16 && this.m_cache != null) {
- Vector var14 = (Vector)this.m_messages.remove(var3);
- if (var14 == null) {
- var14 = new Vector();
- var14.addElement(new Long(0L));
- }
-
- try {
- this.m_cache.addEntry(var15, var14);
- } catch (LDAPException var12) {
- System.out.println("Exception: " + var12.toString());
- }
- }
- }
- }
-
- this.m_requests.remove(var3);
- } else {
- ((LDAPSearchListener)var4).addSearchResult(var1);
- Long var8 = ((LDAPSearchListener)var4).getKey();
- if (this.m_cache != null && var8 != null) {
- Vector var13 = (Vector)this.m_messages.get(var3);
- if (var13 == null) {
- var13 = new Vector();
- var13.addElement(new Long(0L));
- }
-
- long var9 = (Long)var13.firstElement() + (long)var2;
- var13.setElementAt(new Long(var9), 0);
- var13.addElement(this.constructLDAPEntry(var1));
- this.m_messages.put(var3, var13);
- 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 {
- Vector var2 = (Vector)this.m_registered.clone();
- Enumeration var3 = var2.elements();
-
- while(var3.hasMoreElements()) {
- LDAPConnection var4 = (LDAPConnection)var3.nextElement();
- var4.deregisterConnection();
- }
-
- Enumeration var8 = this.m_requests.elements();
-
- while(var8.hasMoreElements()) {
- LDAPResponseListener var5 = (LDAPResponseListener)var8.nextElement();
- var5.setException(new LDAPException("Server down", 80));
- }
-
- this.m_requests.clear();
- this.m_serverOutput.close();
- this.m_serverInput.close();
- } catch (IOException var6) {
- } catch (NullPointerException var7) {
- }
-
- this.m_serverOutput = null;
- this.m_serverInput = null;
- this.m_disconnected = true;
- }
- }
-