home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / ldapjdk.jar / netscape / ldap / LDAPConnThread.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-04-13  |  7.9 KB  |  372 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.    private Object m_securityLayer;
  36.    private Socket m_socket;
  37.    private int m_maxBacklog = 100;
  38.  
  39.    public LDAPConnThread(String var1, int var2, LDAPSocketFactory var3, LDAPCache var4) throws LDAPException {
  40.       this.m_cache = var4;
  41.       if (this.m_cache != null) {
  42.          this.m_messages = new Hashtable();
  43.       }
  44.  
  45.       try {
  46.          if (var3 == null) {
  47.             this.m_socket = new Socket(var1, var2);
  48.          } else {
  49.             this.m_socket = var3.makeSocket(var1, var2);
  50.          }
  51.  
  52.          this.m_serverInput = new BufferedInputStream(this.m_socket.getInputStream());
  53.          this.m_serverOutput = new BufferedOutputStream(this.m_socket.getOutputStream());
  54.       } catch (IOException var5) {
  55.          this.m_failed = true;
  56.          ((Thread)this).start();
  57.          throw new LDAPException("failed to connect to server " + var1, 91);
  58.       }
  59.  
  60.       ((Thread)this).start();
  61.    }
  62.  
  63.    synchronized void sendRequest(JDAPProtocolOp var1, LDAPResponseListener var2, LDAPSearchConstraints var3) throws LDAPException {
  64.       if (this.m_serverOutput == null) {
  65.          throw new LDAPException("not connected to a server", 80);
  66.       } else {
  67.          LDAPControl[] var5 = var3.getServerControls();
  68.          JDAPMessage var4;
  69.          if (var5 != null && var5.length > 0) {
  70.             JDAPControl[] var6 = new JDAPControl[var5.length];
  71.  
  72.             for(int var7 = 0; var7 < var5.length; ++var7) {
  73.                var6[var7] = new JDAPControl(var5[var7].getID(), var5[var7].isCritical(), var5[var7].getValue());
  74.             }
  75.  
  76.             var4 = new JDAPMessage(this.allocateId(), var1, var6);
  77.          } else {
  78.             var4 = new JDAPMessage(this.allocateId(), var1);
  79.          }
  80.  
  81.          if (var2 != null) {
  82.             if (!(var1 instanceof JDAPAbandonRequest) && !(var1 instanceof JDAPUnbindRequest)) {
  83.                this.m_requests.put(new Integer(var4.getId()), var2);
  84.                this.resultRetrieved();
  85.             }
  86.  
  87.             var2.setID(var4.getId());
  88.          }
  89.  
  90.          try {
  91.             var4.write(this.m_serverOutput);
  92.             this.m_serverOutput.flush();
  93.          } catch (IOException var8) {
  94.             this.networkError(var8);
  95.          }
  96.       }
  97.    }
  98.  
  99.    public synchronized void register(LDAPConnection var1) {
  100.       if (!this.m_registered.contains(var1)) {
  101.          this.m_registered.addElement(var1);
  102.       }
  103.  
  104.    }
  105.  
  106.    void setSecurityLayer(Object var1) {
  107.       this.m_securityLayer = var1;
  108.    }
  109.  
  110.    synchronized int getClientCount() {
  111.       return this.m_registered.size();
  112.    }
  113.  
  114.    public synchronized void deregister(LDAPConnection var1) {
  115.       this.m_registered.removeElement(var1);
  116.       if (this.m_registered.size() == 0) {
  117.          try {
  118.             LDAPSearchConstraints var2 = var1.getSearchConstraints();
  119.             this.sendRequest(new JDAPUnbindRequest(), (LDAPResponseListener)null, var2);
  120.             this.cleanUp();
  121.             ((Thread)this).stop();
  122.             Thread.sleep(100L);
  123.          } catch (Exception var4) {
  124.             String var3 = ((Throwable)var4).toString();
  125.          }
  126.       }
  127.    }
  128.  
  129.    private void cleanUp() {
  130.       if (!this.m_disconnected) {
  131.          try {
  132.             this.m_serverOutput.close();
  133.          } catch (Exception var26) {
  134.          } finally {
  135.             this.m_serverOutput = null;
  136.          }
  137.  
  138.          try {
  139.             this.m_serverInput.close();
  140.          } catch (Exception var24) {
  141.          } finally {
  142.             this.m_serverInput = null;
  143.          }
  144.  
  145.          try {
  146.             this.m_socket.close();
  147.          } catch (Exception var22) {
  148.          } finally {
  149.             this.m_socket = null;
  150.          }
  151.  
  152.          this.m_disconnected = true;
  153.          if (this.m_registered != null) {
  154.             Vector var1 = (Vector)this.m_registered.clone();
  155.             Enumeration var2 = var1.elements();
  156.  
  157.             while(var2.hasMoreElements()) {
  158.                LDAPConnection var3 = (LDAPConnection)var2.nextElement();
  159.                var3.deregisterConnection();
  160.             }
  161.          }
  162.  
  163.          this.m_registered = null;
  164.          this.m_messages = null;
  165.          this.m_requests.clear();
  166.       }
  167.  
  168.    }
  169.  
  170.    void setMaxBacklog(int var1) {
  171.       this.m_maxBacklog = var1;
  172.    }
  173.  
  174.    int getMaxBacklog() {
  175.       return this.m_maxBacklog;
  176.    }
  177.  
  178.    private void checkBacklog() {
  179.       boolean var1;
  180.       do {
  181.          var1 = false;
  182.          Enumeration var2 = this.m_requests.elements();
  183.  
  184.          while(var2.hasMoreElements()) {
  185.             LDAPResponseListener var3 = (LDAPResponseListener)var2.nextElement();
  186.             if (!(var3 instanceof LDAPSearchListener)) {
  187.                var1 = false;
  188.                break;
  189.             }
  190.  
  191.             LDAPSearchListener var4 = (LDAPSearchListener)var3;
  192.             if (var4.getConstraints().getBatchSize() != 0 && var4.getCount() >= this.m_maxBacklog) {
  193.                var1 = true;
  194.             }
  195.          }
  196.  
  197.          if (var1) {
  198.             synchronized(this){}
  199.  
  200.             try {
  201.                try {
  202.                   this.wait();
  203.                } catch (InterruptedException var7) {
  204.                }
  205.             } catch (Throwable var8) {
  206.                throw var8;
  207.             }
  208.          }
  209.       } while(var1);
  210.  
  211.    }
  212.  
  213.    synchronized void resultRetrieved() {
  214.       this.notifyAll();
  215.    }
  216.  
  217.    public void run() {
  218.       if (this.m_failed) {
  219.          ((Thread)this).stop();
  220.       }
  221.  
  222.       Object var1 = null;
  223.       JDAPBERTagDecoder var2 = new JDAPBERTagDecoder();
  224.  
  225.       do {
  226.          Thread.yield();
  227.          int[] var3 = new int[]{0};
  228.          this.checkBacklog();
  229.  
  230.          try {
  231.             BERElement var4 = BERElement.getElement(var2, this.m_serverInput, var3);
  232.             JDAPMessage var6 = new JDAPMessage(var4);
  233.             this.processResponse(var6, var3[0]);
  234.          } catch (Exception var5) {
  235.             this.networkError(var5);
  236.          }
  237.       } while(!this.m_disconnected);
  238.  
  239.    }
  240.  
  241.    private synchronized int allocateId() {
  242.       this.m_highMsgId = (this.m_highMsgId + 1) % Integer.MAX_VALUE;
  243.       return this.m_highMsgId;
  244.    }
  245.  
  246.    private synchronized void processResponse(JDAPMessage var1, int var2) {
  247.       Integer var3 = new Integer(var1.getId());
  248.       LDAPResponseListener var4 = (LDAPResponseListener)this.m_requests.get(var3);
  249.       if (var4 != null) {
  250.          LDAPControl[] var5 = this.checkControls(var1);
  251.          ResponseControl var6 = null;
  252.          if (var5 != null) {
  253.             var6 = new ResponseControl(var4.getConnection(), var1.getId(), var5);
  254.          }
  255.  
  256.          var4.getConnection().setResponseControls(this, var6);
  257.          JDAPProtocolOp var7 = var1.getProtocolOp();
  258.          Object var8 = null;
  259.          if (!(var7 instanceof JDAPSearchResponse) && !(var7 instanceof JDAPSearchResultReference)) {
  260.             var4.setResponse(var1);
  261.             if (var4 instanceof LDAPSearchListener) {
  262.                Long var16 = ((LDAPSearchListener)var4).getKey();
  263.                if (var16 != null) {
  264.                   boolean var17 = false;
  265.                   JDAPProtocolOp var11 = var1.getProtocolOp();
  266.                   if (var11 instanceof JDAPSearchResult) {
  267.                      JDAPResult var12 = (JDAPResult)var11;
  268.                      if (var12.getResultCode() > 0) {
  269.                         var17 = true;
  270.                      }
  271.                   }
  272.  
  273.                   if (!var17 && this.m_cache != null) {
  274.                      Vector var15 = (Vector)this.m_messages.remove(var3);
  275.                      if (var15 == null) {
  276.                         var15 = new Vector();
  277.                         var15.addElement(new Long(0L));
  278.                      }
  279.  
  280.                      try {
  281.                         this.m_cache.addEntry(var16, var15);
  282.                      } catch (LDAPException var13) {
  283.                         System.out.println("Exception: " + var13.toString());
  284.                      }
  285.                   }
  286.                }
  287.             }
  288.  
  289.             this.m_requests.remove(var3);
  290.          } else {
  291.             ((LDAPSearchListener)var4).addSearchResult(var1);
  292.             Long var9 = ((LDAPSearchListener)var4).getKey();
  293.             if (this.m_cache != null && var9 != null) {
  294.                Vector var14 = (Vector)this.m_messages.get(var3);
  295.                if (var14 == null) {
  296.                   var14 = new Vector();
  297.                   var14.addElement(new Long(0L));
  298.                }
  299.  
  300.                long var10 = (Long)var14.firstElement() + (long)var2;
  301.                var14.setElementAt(new Long(var10), 0);
  302.                var14.addElement(this.constructLDAPEntry(var1));
  303.                this.m_messages.put(var3, var14);
  304.                return;
  305.             }
  306.          }
  307.  
  308.       }
  309.    }
  310.  
  311.    private LDAPEntry constructLDAPEntry(JDAPMessage var1) {
  312.       JDAPProtocolOp var2 = var1.getProtocolOp();
  313.       JDAPSearchResponse var3 = (JDAPSearchResponse)var2;
  314.       LDAPAttribute[] var4 = var3.getAttributes();
  315.       LDAPAttributeSet var5;
  316.       if (var4 != null) {
  317.          var5 = new LDAPAttributeSet(var4);
  318.       } else {
  319.          var5 = new LDAPAttributeSet();
  320.       }
  321.  
  322.       String var6 = var3.getObjectName();
  323.       return new LDAPEntry(var6, var5);
  324.    }
  325.  
  326.    private LDAPControl[] checkControls(JDAPMessage var1) {
  327.       LDAPControl[] var2 = null;
  328.       if (var1 != null) {
  329.          JDAPControl[] var3 = var1.getControls();
  330.          if (var3 != null && var3.length > 0) {
  331.             var2 = new LDAPControl[var3.length];
  332.  
  333.             for(int var4 = 0; var4 < var3.length; ++var4) {
  334.                var2[var4] = new LDAPControl(var3[var4].getID(), var3[var4].isCritical(), var3[var4].getValue());
  335.             }
  336.          }
  337.       }
  338.  
  339.       return var2;
  340.    }
  341.  
  342.    void abandon(int var1) {
  343.       this.m_requests.remove(new Integer(var1));
  344.    }
  345.  
  346.    private synchronized void networkError(Exception var1) {
  347.       try {
  348.          Enumeration var2 = this.m_requests.elements();
  349.  
  350.          while(var2.hasMoreElements()) {
  351.             LDAPResponseListener var3 = (LDAPResponseListener)var2.nextElement();
  352.             var3.setException(new LDAPException("Server down", 80));
  353.          }
  354.  
  355.          this.cleanUp();
  356.       } catch (NullPointerException var5) {
  357.          System.err.println("Exception: " + ((Throwable)var5).toString());
  358.       }
  359.  
  360.       if (this.m_registered != null) {
  361.          Vector var6 = (Vector)this.m_registered.clone();
  362.          Enumeration var7 = var6.elements();
  363.  
  364.          while(var7.hasMoreElements()) {
  365.             LDAPConnection var4 = (LDAPConnection)var7.nextElement();
  366.             var4.deregisterConnection();
  367.          }
  368.       }
  369.  
  370.    }
  371. }
  372.