home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / sun / rmi / transport / tcp / ConnectionMultiplexer.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  7.8 KB  |  399 lines

  1. package sun.rmi.transport.tcp;
  2.  
  3. import java.io.DataInputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.io.PrintStream;
  9. import java.rmi.server.LogStream;
  10. import java.util.Enumeration;
  11. import java.util.Hashtable;
  12. import sun.rmi.transport.Utils;
  13.  
  14. final class ConnectionMultiplexer {
  15.    static int logLevel = LogStream.parseLevel(Utils.getProperty("sun.rmi.transport.tcp.multiplex.logLevel"));
  16.    private static final int OPEN = 225;
  17.    private static final int CLOSE = 226;
  18.    private static final int CLOSEACK = 227;
  19.    private static final int REQUEST = 228;
  20.    private static final int TRANSMIT = 229;
  21.    private TCPChannel channel;
  22.    // $FF: renamed from: in java.io.InputStream
  23.    private InputStream field_0;
  24.    private OutputStream out;
  25.    private boolean orig;
  26.    private DataInputStream dataIn;
  27.    private DataOutputStream dataOut;
  28.    private Hashtable connectionTable = new Hashtable(7);
  29.    private int numConnections;
  30.    private static final int maxConnections = 256;
  31.    private int lastID = 4097;
  32.    private boolean alive = true;
  33.  
  34.    public ConnectionMultiplexer(TCPChannel var1, InputStream var2, OutputStream var3, boolean var4) {
  35.       this.channel = var1;
  36.       this.field_0 = var2;
  37.       this.out = var3;
  38.       this.orig = var4;
  39.       this.dataIn = new DataInputStream(var2);
  40.       this.dataOut = new DataOutputStream(var3);
  41.    }
  42.  
  43.    public void run() throws IOException {
  44.       try {
  45.          while(true) {
  46.             int var3 = this.dataIn.readUnsignedByte();
  47.             switch (var3) {
  48.                case 225:
  49.                   int var33 = this.dataIn.readUnsignedShort();
  50.                   if (logLevel >= 20) {
  51.                      LogStream.log("multiplex").println("ConnectionMultiplexer.run: operation  OPEN " + var33);
  52.                   }
  53.  
  54.                   Integer var38 = new Integer(var33);
  55.                   MultiplexConnectionInfo var42 = (MultiplexConnectionInfo)this.connectionTable.get(var38);
  56.                   if (var42 != null) {
  57.                      throw new IOException("OPEN: Connection ID already exists");
  58.                   }
  59.  
  60.                   var42 = new MultiplexConnectionInfo(var33);
  61.                   var42.in = new MultiplexInputStream(this, var42, 2048);
  62.                   var42.out = new MultiplexOutputStream(this, var42, 2048);
  63.                   Hashtable var8 = this.connectionTable;
  64.                   synchronized(var8){}
  65.  
  66.                   try {
  67.                      this.connectionTable.put(var38, var42);
  68.                      ++this.numConnections;
  69.                   } catch (Throwable var28) {
  70.                      throw var28;
  71.                   }
  72.  
  73.                   TCPConnection var44 = new TCPConnection(this.channel, var42.in, var42.out);
  74.                   this.channel.acceptMultiplexConnection(var44);
  75.                   break;
  76.                case 226:
  77.                   int var32 = this.dataIn.readUnsignedShort();
  78.                   if (logLevel >= 20) {
  79.                      LogStream.log("multiplex").println("ConnectionMultiplexer.run: operation  CLOSE " + var32);
  80.                   }
  81.  
  82.                   Integer var37 = new Integer(var32);
  83.                   MultiplexConnectionInfo var41 = (MultiplexConnectionInfo)this.connectionTable.get(var37);
  84.                   if (var41 == null) {
  85.                      throw new IOException("CLOSE: Invalid connection ID");
  86.                   }
  87.  
  88.                   var41.in.disconnect();
  89.                   var41.out.disconnect();
  90.                   if (!var41.closed) {
  91.                      this.sendCloseAck(var41);
  92.                   }
  93.  
  94.                   Hashtable var45 = this.connectionTable;
  95.                   synchronized(var45){}
  96.  
  97.                   try {
  98.                      this.connectionTable.remove(var37);
  99.                      --this.numConnections;
  100.                      break;
  101.                   } catch (Throwable var27) {
  102.                      throw var27;
  103.                   }
  104.                case 227:
  105.                   int var31 = this.dataIn.readUnsignedShort();
  106.                   if (logLevel >= 20) {
  107.                      LogStream.log("multiplex").println("ConnectionMultiplexer.run: operation  CLOSEACK " + var31);
  108.                   }
  109.  
  110.                   Integer var36 = new Integer(var31);
  111.                   MultiplexConnectionInfo var40 = (MultiplexConnectionInfo)this.connectionTable.get(var36);
  112.                   if (var40 == null) {
  113.                      throw new IOException("CLOSEACK: Invalid connection ID");
  114.                   }
  115.  
  116.                   if (!var40.closed) {
  117.                      throw new IOException("CLOSEACK: Connection not closed");
  118.                   }
  119.  
  120.                   var40.in.disconnect();
  121.                   var40.out.disconnect();
  122.                   Hashtable var9 = this.connectionTable;
  123.                   synchronized(var9){}
  124.  
  125.                   try {
  126.                      this.connectionTable.remove(var36);
  127.                      --this.numConnections;
  128.                      break;
  129.                   } catch (Throwable var26) {
  130.                      throw var26;
  131.                   }
  132.                case 228:
  133.                   int var30 = this.dataIn.readUnsignedShort();
  134.                   Integer var35 = new Integer(var30);
  135.                   MultiplexConnectionInfo var39 = (MultiplexConnectionInfo)this.connectionTable.get(var35);
  136.                   if (var39 == null) {
  137.                      throw new IOException("REQUEST: Invalid connection ID");
  138.                   }
  139.  
  140.                   int var34 = this.dataIn.readInt();
  141.                   if (logLevel >= 20) {
  142.                      LogStream.log("multiplex").println("ConnectionMultiplexer.run: operation  REQUEST " + var30 + ": " + var34);
  143.                   }
  144.  
  145.                   var39.out.request(var34);
  146.                   break;
  147.                case 229:
  148.                   int var4 = this.dataIn.readUnsignedShort();
  149.                   Integer var6 = new Integer(var4);
  150.                   MultiplexConnectionInfo var7 = (MultiplexConnectionInfo)this.connectionTable.get(var6);
  151.                   if (var7 == null) {
  152.                      throw new IOException("SEND: Invalid connection ID");
  153.                   }
  154.  
  155.                   int var5 = this.dataIn.readInt();
  156.                   if (logLevel >= 20) {
  157.                      LogStream.log("multiplex").println("ConnectionMultiplexer.run: operation  TRANSMIT " + var4 + ": " + var5);
  158.                   }
  159.  
  160.                   var7.in.receive(var5, this.dataIn);
  161.                   break;
  162.                default:
  163.                   throw new IOException("Invalid operation: " + Integer.toHexString(var3));
  164.             }
  165.          }
  166.       } finally {
  167.          this.shutDown();
  168.       }
  169.    }
  170.  
  171.    public synchronized TCPConnection openConnection() throws IOException {
  172.       int var1;
  173.       Integer var2;
  174.       do {
  175.          this.lastID = ++this.lastID & 32767;
  176.          var1 = this.lastID;
  177.          if (this.orig) {
  178.             var1 |= 32768;
  179.          }
  180.  
  181.          var2 = new Integer(var1);
  182.       } while(this.connectionTable.get(var2) != null);
  183.  
  184.       MultiplexConnectionInfo var3 = new MultiplexConnectionInfo(var1);
  185.       var3.in = new MultiplexInputStream(this, var3, 2048);
  186.       var3.out = new MultiplexOutputStream(this, var3, 2048);
  187.       Hashtable var4 = this.connectionTable;
  188.       synchronized(var4){}
  189.  
  190.       try {
  191.          if (!this.alive) {
  192.             throw new IOException("Multiplexer connection dead");
  193.          }
  194.  
  195.          if (this.numConnections >= 256) {
  196.             throw new IOException("Cannot exceed " + 256 + " simultaneous multiplexed connections");
  197.          }
  198.  
  199.          this.connectionTable.put(var2, var3);
  200.          ++this.numConnections;
  201.       } catch (Throwable var20) {
  202.          throw var20;
  203.       }
  204.  
  205.       DataOutputStream var21 = this.dataOut;
  206.       synchronized(var21) {
  207.          try {
  208.             this.dataOut.writeByte(225);
  209.             this.dataOut.writeShort(var1);
  210.             this.dataOut.flush();
  211.          } catch (IOException var18) {
  212.             IOException var6 = var18;
  213.             if (logLevel >= 10) {
  214.                LogStream var7 = LogStream.log("multiplex");
  215.                synchronized(var7){}
  216.  
  217.                try {
  218.                   ((PrintStream)var7).println("ConnectionMultiplexer.openConnection: exception: ");
  219.                   ((Throwable)var6).printStackTrace(var7);
  220.                } catch (Throwable var17) {
  221.                   throw var17;
  222.                }
  223.             }
  224.  
  225.             this.shutDown();
  226.             throw var18;
  227.          }
  228.       }
  229.  
  230.       return new TCPConnection(this.channel, var3.in, var3.out);
  231.    }
  232.  
  233.    public void shutDown() {
  234.       Hashtable var1 = this.connectionTable;
  235.       synchronized(var1){}
  236.  
  237.       try {
  238.          if (!this.alive) {
  239.             return;
  240.          }
  241.  
  242.          this.alive = false;
  243.          Enumeration var3 = this.connectionTable.elements();
  244.  
  245.          while(var3.hasMoreElements()) {
  246.             MultiplexConnectionInfo var4 = (MultiplexConnectionInfo)var3.nextElement();
  247.             var4.in.disconnect();
  248.             var4.out.disconnect();
  249.          }
  250.  
  251.          this.connectionTable.clear();
  252.          this.numConnections = 0;
  253.       } catch (Throwable var10) {
  254.          throw var10;
  255.       }
  256.  
  257.       try {
  258.          this.field_0.close();
  259.       } catch (IOException var9) {
  260.       }
  261.  
  262.       try {
  263.          this.out.close();
  264.       } catch (IOException var8) {
  265.       }
  266.    }
  267.  
  268.    void sendRequest(MultiplexConnectionInfo var1, int var2) throws IOException {
  269.       DataOutputStream var3 = this.dataOut;
  270.       synchronized(var3) {
  271.          if (this.alive && !var1.closed) {
  272.             try {
  273.                this.dataOut.writeByte(228);
  274.                this.dataOut.writeShort(var1.id);
  275.                this.dataOut.writeInt(var2);
  276.                this.dataOut.flush();
  277.             } catch (IOException var12) {
  278.                IOException var5 = var12;
  279.                if (logLevel >= 10) {
  280.                   LogStream var6 = LogStream.log("multiplex");
  281.                   synchronized(var6){}
  282.  
  283.                   try {
  284.                      ((PrintStream)var6).println("ConnectionMultiplexer.sendRequest: exception: ");
  285.                      ((Throwable)var5).printStackTrace(var6);
  286.                   } catch (Throwable var11) {
  287.                      throw var11;
  288.                   }
  289.                }
  290.  
  291.                this.shutDown();
  292.                throw var12;
  293.             }
  294.          }
  295.       }
  296.  
  297.    }
  298.  
  299.    void sendTransmit(MultiplexConnectionInfo var1, byte[] var2, int var3, int var4) throws IOException {
  300.       DataOutputStream var5 = this.dataOut;
  301.       synchronized(var5) {
  302.          if (this.alive && !var1.closed) {
  303.             try {
  304.                this.dataOut.writeByte(229);
  305.                this.dataOut.writeShort(var1.id);
  306.                this.dataOut.writeInt(var4);
  307.                this.dataOut.write(var2, var3, var4);
  308.                this.dataOut.flush();
  309.             } catch (IOException var14) {
  310.                IOException var7 = var14;
  311.                if (logLevel >= 10) {
  312.                   LogStream var8 = LogStream.log("multiplex");
  313.                   synchronized(var8){}
  314.  
  315.                   try {
  316.                      ((PrintStream)var8).println("ConnectionMultiplexer.sendTransmit: exception: ");
  317.                      ((Throwable)var7).printStackTrace(var8);
  318.                   } catch (Throwable var13) {
  319.                      throw var13;
  320.                   }
  321.                }
  322.  
  323.                this.shutDown();
  324.                throw var14;
  325.             }
  326.          }
  327.       }
  328.  
  329.    }
  330.  
  331.    void sendClose(MultiplexConnectionInfo var1) throws IOException {
  332.       var1.out.disconnect();
  333.       DataOutputStream var2 = this.dataOut;
  334.       synchronized(var2) {
  335.          if (this.alive && !var1.closed) {
  336.             try {
  337.                this.dataOut.writeByte(226);
  338.                this.dataOut.writeShort(var1.id);
  339.                this.dataOut.flush();
  340.                var1.closed = true;
  341.             } catch (IOException var11) {
  342.                IOException var4 = var11;
  343.                if (logLevel >= 10) {
  344.                   LogStream var5 = LogStream.log("multiplex");
  345.                   synchronized(var5){}
  346.  
  347.                   try {
  348.                      ((PrintStream)var5).println("ConnectionMultiplexer.sendClose: exception: ");
  349.                      ((Throwable)var4).printStackTrace(var5);
  350.                   } catch (Throwable var10) {
  351.                      throw var10;
  352.                   }
  353.                }
  354.  
  355.                this.shutDown();
  356.                throw var11;
  357.             }
  358.          }
  359.       }
  360.  
  361.    }
  362.  
  363.    void sendCloseAck(MultiplexConnectionInfo var1) throws IOException {
  364.       DataOutputStream var2 = this.dataOut;
  365.       synchronized(var2) {
  366.          if (this.alive && !var1.closed) {
  367.             try {
  368.                this.dataOut.writeByte(227);
  369.                this.dataOut.writeShort(var1.id);
  370.                this.dataOut.flush();
  371.                var1.closed = true;
  372.             } catch (IOException var11) {
  373.                IOException var4 = var11;
  374.                if (logLevel >= 10) {
  375.                   LogStream var5 = LogStream.log("multiplex");
  376.                   synchronized(var5){}
  377.  
  378.                   try {
  379.                      ((PrintStream)var5).println("ConnectionMultiplexer.sendCloseAck: exception: ");
  380.                      ((Throwable)var4).printStackTrace(var5);
  381.                   } catch (Throwable var10) {
  382.                      throw var10;
  383.                   }
  384.                }
  385.  
  386.                this.shutDown();
  387.                throw var11;
  388.             }
  389.          }
  390.       }
  391.  
  392.    }
  393.  
  394.    protected void finalize() throws Throwable {
  395.       super.finalize();
  396.       this.shutDown();
  397.    }
  398. }
  399.