home *** CD-ROM | disk | FTP | other *** search
/ Popular Software (Premium Edition) / mycd.iso / INTERNET / NETSCAP4.06 / CP32E406.EXE / nav40.z / ldap10.jar / netscape / ldap / LDAPConnThread.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-08-13  |  7.7 KB  |  273 lines

  1. package netscape.ldap;
  2.  
  3. import java.io.BufferedInputStream;
  4. import java.io.BufferedOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.net.Socket;
  9. import java.util.Enumeration;
  10. import java.util.Hashtable;
  11. import java.util.Vector;
  12. import netscape.ldap.ber.stream.BERElement;
  13. import netscape.ldap.client.JDAPBERTagDecoder;
  14. import netscape.ldap.client.JDAPControl;
  15. import netscape.ldap.client.JDAPMessage;
  16. import netscape.ldap.client.opers.JDAPAbandonRequest;
  17. import netscape.ldap.client.opers.JDAPProtocolOp;
  18. import netscape.ldap.client.opers.JDAPResult;
  19. import netscape.ldap.client.opers.JDAPSearchResponse;
  20. import netscape.ldap.client.opers.JDAPSearchResult;
  21. import netscape.ldap.client.opers.JDAPSearchResultReference;
  22. import netscape.ldap.client.opers.JDAPUnbindRequest;
  23.  
  24. class LDAPConnThread extends Thread {
  25.    private static final int MAXMSGID = Integer.MAX_VALUE;
  26.    private transient int m_highMsgId = 0;
  27.    private transient InputStream m_serverInput;
  28.    private transient OutputStream m_serverOutput;
  29.    private transient Hashtable m_requests = new Hashtable();
  30.    private transient Hashtable m_messages;
  31.    private transient Vector m_registered = new Vector();
  32.    private transient boolean m_disconnected = false;
  33.    private transient LDAPCache m_cache;
  34.    private transient boolean m_failed = false;
  35.  
  36.    public LDAPConnThread(String var1, int var2, LDAPSocketFactory var3, LDAPCache var4) throws LDAPException {
  37.       this.m_cache = var4;
  38.       if (this.m_cache != null) {
  39.          this.m_messages = new Hashtable();
  40.       }
  41.  
  42.       try {
  43.          Object var5 = null;
  44.          Socket var7;
  45.          if (var3 == null) {
  46.             var7 = new Socket(var1, var2);
  47.          } else {
  48.             var7 = var3.makeSocket(var1, var2);
  49.          }
  50.  
  51.          this.m_serverInput = new BufferedInputStream(var7.getInputStream());
  52.          this.m_serverOutput = new BufferedOutputStream(var7.getOutputStream());
  53.       } catch (IOException var6) {
  54.          this.m_failed = true;
  55.          ((Thread)this).start();
  56.          throw new LDAPException("failed to connect to server " + var1, 91);
  57.       }
  58.  
  59.       ((Thread)this).start();
  60.    }
  61.  
  62.    synchronized void sendRequest(JDAPProtocolOp var1, LDAPResponseListener var2, LDAPSearchConstraints var3) throws LDAPException {
  63.       if (this.m_serverOutput == null) {
  64.          throw new LDAPException("not connected to a server", 80);
  65.       } else {
  66.          LDAPControl[] var5 = var3.getServerControls();
  67.          JDAPMessage var4;
  68.          if (var5 != null && var5.length > 0) {
  69.             JDAPControl[] var6 = new JDAPControl[var5.length];
  70.  
  71.             for(int var7 = 0; var7 < var5.length; ++var7) {
  72.                var6[var7] = new JDAPControl(var5[var7].getID(), var5[var7].isCritical(), var5[var7].getValue());
  73.             }
  74.  
  75.             var4 = new JDAPMessage(this.allocateId(), var1, var6);
  76.          } else {
  77.             var4 = new JDAPMessage(this.allocateId(), var1);
  78.          }
  79.  
  80.          if (var2 != null) {
  81.             if (!(var1 instanceof JDAPAbandonRequest) && !(var1 instanceof JDAPUnbindRequest)) {
  82.                this.m_requests.put(new Integer(var4.getId()), var2);
  83.             }
  84.  
  85.             var2.setID(var4.getId());
  86.          }
  87.  
  88.          try {
  89.             var4.write(this.m_serverOutput);
  90.             this.m_serverOutput.flush();
  91.          } catch (IOException var8) {
  92.             throw new LDAPException("error writing request", 80);
  93.          }
  94.       }
  95.    }
  96.  
  97.    public synchronized void register(LDAPConnection var1) {
  98.       if (!this.m_registered.contains(var1)) {
  99.          this.m_registered.addElement(var1);
  100.       }
  101.  
  102.    }
  103.  
  104.    synchronized int getClientCount() {
  105.       return this.m_registered.size();
  106.    }
  107.  
  108.    public synchronized void deregister(LDAPConnection var1) {
  109.       this.m_registered.removeElement(var1);
  110.       if (this.m_registered.size() == 0) {
  111.          try {
  112.             LDAPSearchConstraints var2 = var1.getSearchConstraints();
  113.             this.sendRequest(new JDAPUnbindRequest(), (LDAPResponseListener)null, var2);
  114.             ((Thread)this).stop();
  115.             Thread.sleep(100L);
  116.          } catch (Exception var3) {
  117.          }
  118.       }
  119.    }
  120.  
  121.    public void run() {
  122.       if (this.m_failed) {
  123.          ((Thread)this).stop();
  124.       }
  125.  
  126.       Object var1 = null;
  127.       JDAPBERTagDecoder var2 = new JDAPBERTagDecoder();
  128.  
  129.       do {
  130.          Thread.yield();
  131.          int[] var3 = new int[]{0};
  132.  
  133.          try {
  134.             BERElement var4 = BERElement.getElement(var2, this.m_serverInput, var3);
  135.             JDAPMessage var6 = new JDAPMessage(var4);
  136.             this.processResponse(var6, var3[0]);
  137.          } catch (Exception var5) {
  138.             this.networkError(var5);
  139.          }
  140.       } while(!this.m_disconnected);
  141.  
  142.    }
  143.  
  144.    private synchronized int allocateId() {
  145.       this.m_highMsgId = (this.m_highMsgId + 1) % Integer.MAX_VALUE;
  146.       return this.m_highMsgId;
  147.    }
  148.  
  149.    private void processResponse(JDAPMessage var1, int var2) {
  150.       Integer var3 = new Integer(var1.getId());
  151.       LDAPResponseListener var4 = (LDAPResponseListener)this.m_requests.get(var3);
  152.       if (var4 != null) {
  153.          LDAPControl[] var5 = this.checkControls(var1);
  154.          var4.getConnection().setResponseControls(var4.getThread(), var5);
  155.          JDAPProtocolOp var6 = var1.getProtocolOp();
  156.          Object var7 = null;
  157.          if (!(var6 instanceof JDAPSearchResponse) && !(var6 instanceof JDAPSearchResultReference)) {
  158.             var4.setResponse(var1);
  159.             if (var4 instanceof LDAPSearchListener) {
  160.                Long var15 = ((LDAPSearchListener)var4).getKey();
  161.                if (var15 != null) {
  162.                   boolean var16 = false;
  163.                   JDAPProtocolOp var10 = var1.getProtocolOp();
  164.                   if (var10 instanceof JDAPSearchResult) {
  165.                      JDAPResult var11 = (JDAPResult)var10;
  166.                      if (var11.getResultCode() > 0) {
  167.                         var16 = true;
  168.                      }
  169.                   }
  170.  
  171.                   if (!var16 && this.m_cache != null) {
  172.                      Vector var14 = (Vector)this.m_messages.remove(var3);
  173.                      if (var14 == null) {
  174.                         var14 = new Vector();
  175.                         var14.addElement(new Long(0L));
  176.                      }
  177.  
  178.                      try {
  179.                         this.m_cache.addEntry(var15, var14);
  180.                      } catch (LDAPException var12) {
  181.                         System.out.println("Exception: " + var12.toString());
  182.                      }
  183.                   }
  184.                }
  185.             }
  186.  
  187.             this.m_requests.remove(var3);
  188.          } else {
  189.             ((LDAPSearchListener)var4).addSearchResult(var1);
  190.             Long var8 = ((LDAPSearchListener)var4).getKey();
  191.             if (this.m_cache != null && var8 != null) {
  192.                Vector var13 = (Vector)this.m_messages.get(var3);
  193.                if (var13 == null) {
  194.                   var13 = new Vector();
  195.                   var13.addElement(new Long(0L));
  196.                }
  197.  
  198.                long var9 = (Long)var13.firstElement() + (long)var2;
  199.                var13.setElementAt(new Long(var9), 0);
  200.                var13.addElement(this.constructLDAPEntry(var1));
  201.                this.m_messages.put(var3, var13);
  202.                return;
  203.             }
  204.          }
  205.  
  206.       }
  207.    }
  208.  
  209.    private LDAPEntry constructLDAPEntry(JDAPMessage var1) {
  210.       JDAPProtocolOp var2 = var1.getProtocolOp();
  211.       JDAPSearchResponse var3 = (JDAPSearchResponse)var2;
  212.       LDAPAttribute[] var4 = var3.getAttributes();
  213.       LDAPAttributeSet var5;
  214.       if (var4 != null) {
  215.          var5 = new LDAPAttributeSet(var4);
  216.       } else {
  217.          var5 = new LDAPAttributeSet();
  218.       }
  219.  
  220.       String var6 = var3.getObjectName();
  221.       return new LDAPEntry(var6, var5);
  222.    }
  223.  
  224.    private LDAPControl[] checkControls(JDAPMessage var1) {
  225.       LDAPControl[] var2 = null;
  226.       if (var1 != null) {
  227.          JDAPControl[] var3 = var1.getControls();
  228.          if (var3 != null && var3.length > 0) {
  229.             var2 = new LDAPControl[var3.length];
  230.  
  231.             for(int var4 = 0; var4 < var3.length; ++var4) {
  232.                var2[var4] = new LDAPControl(var3[var4].getID(), var3[var4].isCritical(), var3[var4].getValue());
  233.             }
  234.          }
  235.       }
  236.  
  237.       return var2;
  238.    }
  239.  
  240.    void abandon(int var1) {
  241.       this.m_requests.remove(new Integer(var1));
  242.    }
  243.  
  244.    private synchronized void networkError(Exception var1) {
  245.       try {
  246.          Vector var2 = (Vector)this.m_registered.clone();
  247.          Enumeration var3 = var2.elements();
  248.  
  249.          while(var3.hasMoreElements()) {
  250.             LDAPConnection var4 = (LDAPConnection)var3.nextElement();
  251.             var4.deregisterConnection();
  252.          }
  253.  
  254.          Enumeration var8 = this.m_requests.elements();
  255.  
  256.          while(var8.hasMoreElements()) {
  257.             LDAPResponseListener var5 = (LDAPResponseListener)var8.nextElement();
  258.             var5.setException(new LDAPException("Server down", 80));
  259.          }
  260.  
  261.          this.m_requests.clear();
  262.          this.m_serverOutput.close();
  263.          this.m_serverInput.close();
  264.       } catch (IOException var6) {
  265.       } catch (NullPointerException var7) {
  266.       }
  267.  
  268.       this.m_serverOutput = null;
  269.       this.m_serverInput = null;
  270.       this.m_disconnected = true;
  271.    }
  272. }
  273.