Example usage for java.nio.channels SelectionKey attachment

List of usage examples for java.nio.channels SelectionKey attachment

Introduction

In this page you can find the example usage for java.nio.channels SelectionKey attachment.

Prototype

Object attachment

To view the source code for java.nio.channels SelectionKey attachment.

Click Source Link

Usage

From source file:com.l2jfree.network.mmocore.ReadWriteThread.java

@Override
protected void handle(SelectionKey key) {
    System.out.println("ReadWriteThread.handle() " + describeInterestOps(key.interestOps()) + ", ready: "
            + describeInterestOps(key.readyOps()));
    switch (key.readyOps()) {
    case SelectionKey.OP_CONNECT:
        finishConnection(key);//from   w w  w  . j a  v a  2s  . c  om
        break;
    case SelectionKey.OP_READ:
        readPacket(key);
        break;
    case SelectionKey.OP_WRITE:
        writePacket(key);
        break;
    case SelectionKey.OP_READ | SelectionKey.OP_WRITE:
        writePacket(key);
        // key might have been invalidated on writePacket
        if (key.isValid())
            readPacket(key);
        break;
    default:
        System.err.println("Unknown readyOps: " + key.readyOps() + " for " + key.attachment());
        break;
    }
}

From source file:Proxy.java

/** We handle only non-SSL connections */
void loop(Selector selector) {
    Set ready_keys;//from  ww  w.  j  av a  2 s  .com
    SelectionKey key;
    ServerSocketChannel srv_sock;
    SocketChannel in_sock, out_sock;
    InetSocketAddress src, dest;

    while (true) {
        if (verbose)
            log("[Proxy] ready to accept connection");

        // 4. Call Selector.select()
        try {
            selector.select();

            // get set of ready objects
            ready_keys = selector.selectedKeys();
            for (Iterator it = ready_keys.iterator(); it.hasNext();) {
                key = (SelectionKey) it.next();
                it.remove();

                if (key.isAcceptable()) {
                    srv_sock = (ServerSocketChannel) key.channel();
                    // get server socket and attachment
                    src = (InetSocketAddress) key.attachment();
                    in_sock = srv_sock.accept(); // accept request
                    if (verbose)
                        log("Proxy.loop()", "accepted connection from " + toString(in_sock));
                    dest = (InetSocketAddress) mappings.get(src);
                    // find corresponding dest
                    if (dest == null) {
                        in_sock.close();
                        log("Proxy.loop()", "did not find a destination host for " + src);
                        continue;
                    } else {
                        if (verbose)
                            log("Proxy.loop()",
                                    "relaying traffic from " + toString(src) + " to " + toString(dest));
                    }

                    // establish connection to destination host
                    try {
                        out_sock = SocketChannel.open(dest);
                        // uses thread pool (Executor) to handle request, closes socks at end
                        handleConnection(in_sock, out_sock);
                    } catch (Exception ex) {
                        in_sock.close();
                        throw ex;
                    }
                }
            }
        } catch (Exception ex) {
            log("Proxy.loop()", "exception: " + ex);
        }
    }
}

From source file:jp.queuelinker.system.net.SelectorThread.java

@Override
public void run() {
    ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
    // I believe the inner try-catches does not cause overhead.
    // http://stackoverflow.com/questions/141560/
    long sendCount = 0;

    SocketChannel currentChannel;
    SelectionKey key = null;
    while (true) {
        try {/*from   www .j a  v  a 2 s .c o  m*/
            selector.select();
            // selector.selectNow();
        } catch (ClosedSelectorException e) {
            logger.fatal("BUG: The selector is closed.");
            return;
        } catch (IOException e) {
            logger.fatal("An IOException occured while calling select().");
            // Fatal Error. Notify the error to the users and leave the matter to them.
            for (ChannelState state : channels) {
                state.callBack.fatalError();
            }
            return;
        }

        if (!requests.isEmpty()) {
            handleRequest();
            continue;
        }

        if (stopRequested) {
            return;
        }

        Set<SelectionKey> keys = selector.selectedKeys();

        Iterator<SelectionKey> iter = keys.iterator();
        iter_loop: while (iter.hasNext()) {
            key = iter.next();
            iter.remove(); // Required. Don't remove.

            if (key.isReadable()) {
                currentChannel = (SocketChannel) key.channel();
                final ChannelState state = (ChannelState) key.attachment();

                int valid;
                try {
                    valid = currentChannel.read(buffer);
                } catch (IOException e) {
                    logger.warn("An IOException happened while reading from a channel.");
                    state.callBack.exceptionOccured(state.channelId, state.attachment);
                    key.cancel();
                    continue;
                }
                if (valid == -1) {
                    // Normal socket close?
                    state.callBack.exceptionOccured(state.channelId, state.attachment);
                    // cleanUpChannel(state.channelId);
                    key.cancel();
                    continue;
                }

                buffer.rewind();
                if (state.callBack.receive(state.channelId, buffer, valid, state.attachment) == false) {
                    state.key.interestOps(state.key.interestOps() & ~SelectionKey.OP_READ);
                }
                buffer.clear();
            } else if (key.isWritable()) {
                currentChannel = (SocketChannel) key.channel();
                final ChannelState state = (ChannelState) key.attachment();

                while (state.sendBuffer.readableSize() < WRITE_SIZE) {
                    ByteBuffer newBuffer = state.callBack.send(state.channelId, state.attachment);
                    if (newBuffer != null) {
                        state.sendBuffer.write(newBuffer);
                        if (++sendCount % 50000 == 0) {
                            logger.info("Send Count: " + sendCount);
                        }
                    } else if (state.sendBuffer.readableSize() == 0) {
                        key.interestOps(key.interestOps() & ~SelectionKey.OP_WRITE);
                        continue iter_loop;
                    } else {
                        break;
                    }
                }

                final int available = state.sendBuffer.readableSize();
                if (available >= WRITE_SIZE || ++state.noopCount >= HEURISTIC_WAIT) {
                    int done;
                    try {
                        done = currentChannel.write(state.sendBuffer.getByteBuffer());
                    } catch (IOException e) {
                        logger.warn("An IOException occured while writing to a channel.");
                        state.callBack.exceptionOccured(state.channelId, state.attachment);
                        key.cancel();
                        continue;
                    }
                    if (done < available) {
                        state.sendBuffer.rollback(available - done);
                    }
                    state.sendBuffer.compact();
                    state.noopCount = 0;
                }
            } else if (key.isAcceptable()) {
                ServerSocketChannel channel = (ServerSocketChannel) key.channel();
                ChannelState state = (ChannelState) key.attachment();
                SocketChannel socketChannel;
                try {
                    socketChannel = channel.accept();
                    socketChannel.configureBlocking(false);
                } catch (IOException e) {
                    continue; // Do nothing.
                }
                state.callBack.newConnection(state.channelId, socketChannel, state.attachment);
            }
        }
    }
}

From source file:com.openteach.diamond.network.waverider.network.DefaultNetWorkServer.java

private void dispatch() throws IOException {
    logger.debug("try dispatch");
    SelectionKey key = null;
    for (SocketChannelOPSChangeRequest request : opsChangeRequstMap.values()) {
        key = request.getChannel().keyFor(selector);
        if (key != null) {
            // /*from   w  w w  .j a v  a 2 s .co m*/
            if ((request.getOps() & SelectionKey.OP_WRITE) == SelectionKey.OP_WRITE) {
                key.interestOps(SelectionKey.OP_WRITE);
                request.clearOps(SelectionKey.OP_WRITE);
            } else if ((request.getOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) {
                key.interestOps(SelectionKey.OP_READ);
                request.clearOps(SelectionKey.OP_READ);
            }
        }
    }

    isWeakuped.set(false);
    if (selector.select(WaveriderConfig.WAVERIDER_DEFAULT_NETWORK_TIME_OUT) <= 0) {
        return;
    }

    Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
    while (iterator.hasNext()) {
        key = (SelectionKey) iterator.next();
        iterator.remove();
        try {
            if (!key.isValid()) {
                continue;
            } else if (key.isAcceptable()) {
                onAccept(key);
            } else if (key.isReadable()) {
                //readerExecutor.execute(new NetworkTask(key, NETWORK_OPERATION_READ));
                onRead(key);
            } else if (key.isWritable()) {
                //writerExecutor.execute(new NetworkTask(key, NETWORK_OPERATION_WRITE));
                onWrite(key);
            }
        } catch (IOException e) {
            // 
            opsChangeRequstMap.remove((SocketChannel) key.channel());
            Session session = (Session) key.attachment();
            if (session != null) {
                session.onException(e);
                // Session
                sessionManager.freeSession(session);
            }
            key.cancel();
            key.channel().close();
            e.printStackTrace();
            logger.error("OOPSException", e);
        }
    }
}

From source file:HttpDownloadManager.java

public void run() {
    log.info("HttpDownloadManager thread starting.");

    // The download thread runs until release() is called
    while (!released) {
        // The thread blocks here waiting for something to happen
        try {/*from w w w  . ja va  2s  .c o m*/
            selector.select();
        } catch (IOException e) {
            // This should never happen.
            log.log(Level.SEVERE, "Error in select()", e);
            return;
        }

        // If release() was called, the thread should exit.
        if (released)
            break;

        // If any new Download objects are pending, deal with them first
        if (!pendingDownloads.isEmpty()) {
            // Although pendingDownloads is a synchronized list, we still
            // need to use a synchronized block to iterate through its
            // elements to prevent a concurrent call to download().
            synchronized (pendingDownloads) {
                Iterator iter = pendingDownloads.iterator();
                while (iter.hasNext()) {
                    // Get the pending download object from the list
                    DownloadImpl download = (DownloadImpl) iter.next();
                    iter.remove(); // And remove it.

                    // Now begin an asynchronous connection to the
                    // specified host and port. We don't block while
                    // waiting to connect.
                    SelectionKey key = null;
                    SocketChannel channel = null;
                    try {
                        // Open an unconnected channel
                        channel = SocketChannel.open();
                        // Put it in non-blocking mode
                        channel.configureBlocking(false);
                        // Register it with the selector, specifying that
                        // we want to know when it is ready to connect
                        // and when it is ready to read.
                        key = channel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_CONNECT,
                                download);
                        // Create the web server address
                        SocketAddress address = new InetSocketAddress(download.host, download.port);
                        // Ask the channel to start connecting
                        // Note that we don't send the HTTP request yet.
                        // We'll do that when the connection completes.
                        channel.connect(address);
                    } catch (Exception e) {
                        handleError(download, channel, key, e);
                    }
                }
            }
        }

        // Now get the set of keys that are ready for connecting or reading
        Set keys = selector.selectedKeys();
        if (keys == null)
            continue; // bug workaround; should not be needed
        // Loop through the keys in the set
        for (Iterator i = keys.iterator(); i.hasNext();) {
            SelectionKey key = (SelectionKey) i.next();
            i.remove(); // Remove the key from the set before handling

            // Get the Download object we attached to the key
            DownloadImpl download = (DownloadImpl) key.attachment();
            // Get the channel associated with the key.
            SocketChannel channel = (SocketChannel) key.channel();

            try {
                if (key.isConnectable()) {
                    // If the channel is ready to connect, complete the
                    // connection and then send the HTTP GET request to it.
                    if (channel.finishConnect()) {
                        download.status = Status.CONNECTED;
                        // This is the HTTP request we wend
                        String request = "GET " + download.path + " HTTP/1.1\r\n" + "Host: " + download.host
                                + "\r\n" + "Connection: close\r\n" + "\r\n";
                        // Wrap in a CharBuffer and encode to a ByteBuffer
                        ByteBuffer requestBytes = LATIN1.encode(CharBuffer.wrap(request));
                        // Send the request to the server. If the bytes
                        // aren't all written in one call, we busy loop!
                        while (requestBytes.hasRemaining())
                            channel.write(requestBytes);

                        log.info("Sent HTTP request: " + download.host + ":" + download.port + ": " + request);
                    }
                }
                if (key.isReadable()) {
                    // If the key indicates that there is data to be read,
                    // then read it and store it in the Download object.
                    int numbytes = channel.read(buffer);

                    // If we read some bytes, store them, otherwise
                    // the download is complete and we need to note this
                    if (numbytes != -1) {
                        buffer.flip(); // Prepare to drain the buffer
                        download.addData(buffer); // Store the data
                        buffer.clear(); // Prepare for another read
                        log.info("Read " + numbytes + " bytes from " + download.host + ":" + download.port);
                    } else {
                        // If there are no more bytes to read
                        key.cancel(); // We're done with the key
                        channel.close(); // And with the channel.
                        download.status = Status.DONE;
                        if (download.listener != null) // notify listener
                            download.listener.done(download);
                        log.info("Download complete from " + download.host + ":" + download.port);
                    }
                }
            } catch (Exception e) {
                handleError(download, channel, key, e);
            }
        }
    }
    log.info("HttpDownloadManager thread exiting.");
}

From source file:com.app.services.ExecutorServiceThread.java

public void run() {

    // create a selector that will by used for multiplexing. The selector
    // registers the socketserverchannel as
    // well as all socketchannels that are created
    String CLIENTCHANNELNAME = "clientChannel";
    String SERVERCHANNELNAME = "serverChannel";
    String channelType = "channelType";

    ConcurrentHashMap<SelectionKey, Object> resultMap = new ConcurrentHashMap<SelectionKey, Object>();
    ClassLoader classLoader = null;
    ByteArrayOutputStream bstr;/*from w  ww  . j  av a  2s . c om*/
    ByteBuffer buffer = null;
    ByteBuffer lengthBuffer = ByteBuffer.allocate(4);
    int bytesRead;
    InputStream bais;
    ObjectInputStream ois;
    Object object;
    ExecutorServiceInfo executorServiceInfo = null;
    Random random = new Random(System.currentTimeMillis());
    // register the serversocketchannel with the selector. The OP_ACCEPT
    // option marks
    // a selection key as ready when the channel accepts a new connection.
    // When the
    // socket server accepts a connection this key is added to the list of
    // selected keys of the selector.
    // when asked for the selected keys, this key is returned and hence we
    // know that a new connection has been accepted.
    try {
        Selector selector = Selector.open();
        SelectionKey socketServerSelectionKey = serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

        // SelectionKey socketServerSelectionKey1 =
        // channel.register(selector1,
        // SelectionKey.OP_ACCEPT);

        // set property in the key that identifies the channel
        Map<String, String> properties = new ConcurrentHashMap<String, String>();
        properties.put(channelType, SERVERCHANNELNAME);
        socketServerSelectionKey.attach(properties);
        // wait for the selected keys
        SelectionKey key = null;
        Set<SelectionKey> selectedKeys;
        // logger.info("Instance Number"+instanceNumber);
        Iterator<SelectionKey> iterator = null;
        SocketChannel clientChannel = null;
        while (true) {
            try {
                // the select method is a blocking method which returns when
                // atleast
                // one of the registered
                // channel is selected. In this example, when the socket
                // accepts
                // a
                // new connection, this method
                // will return. Once a socketclient is added to the list of
                // registered channels, then this method
                // would also return when one of the clients has data to be
                // read
                // or
                // written. It is also possible to perform a nonblocking
                // select
                // using the selectNow() function.
                // We can also specify the maximum time for which a select
                // function
                // can be blocked using the select(long timeout) function.

                if (selector.select() >= 0) {
                    selectedKeys = selector.selectedKeys();
                    iterator = selectedKeys.iterator();
                }
                while (iterator.hasNext()) {
                    try {
                        key = iterator.next();
                        // the selection key could either by the
                        // socketserver
                        // informing
                        // that a new connection has been made, or
                        // a socket client that is ready for read/write
                        // we use the properties object attached to the
                        // channel
                        // to
                        // find
                        // out the type of channel.
                        if (((Map) key.attachment()).get(channelType).equals(SERVERCHANNELNAME)) {
                            // a new connection has been obtained. This
                            // channel
                            // is
                            // therefore a socket server.
                            ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
                            // accept the new connection on the server
                            // socket.
                            // Since
                            // the
                            // server socket channel is marked as non
                            // blocking
                            // this channel will return null if no client is
                            // connected.
                            SocketChannel clientSocketChannel = serverSocketChannel.accept();

                            if (clientSocketChannel != null) {
                                // set the client connection to be non
                                // blocking
                                clientSocketChannel.configureBlocking(false);
                                SelectionKey clientKey = clientSocketChannel.register(selector,
                                        SelectionKey.OP_READ, SelectionKey.OP_WRITE);
                                Map<String, String> clientproperties = new ConcurrentHashMap<String, String>();
                                clientproperties.put(channelType, CLIENTCHANNELNAME);
                                clientKey.attach(clientproperties);
                                clientKey.interestOps(SelectionKey.OP_READ);
                                // clientSocketChannel.close();
                                // write something to the new created client
                                /*
                                 * CharBuffer buffer =
                                 * CharBuffer.wrap("Hello client"); while
                                 * (buffer.hasRemaining()) {
                                 * clientSocketChannel.write
                                 * (Charset.defaultCharset()
                                 * .encode(buffer)); }
                                 * clientSocketChannel.close();
                                 * buffer.clear();
                                 */
                            }

                        } else {
                            // data is available for read
                            // buffer for reading
                            clientChannel = (SocketChannel) key.channel();
                            if (key.isReadable()) {
                                // the channel is non blocking so keep it
                                // open
                                // till
                                // the
                                // count is >=0
                                clientChannel = (SocketChannel) key.channel();
                                if (resultMap.get(key) == null) {
                                    //log.info(key);
                                    bstr = new ByteArrayOutputStream();
                                    object = null;
                                    clientChannel.read(lengthBuffer);
                                    int length = lengthBuffer.getInt(0);
                                    lengthBuffer.clear();
                                    //log.info(length);
                                    buffer = ByteBuffer.allocate(length);
                                    if ((bytesRead = clientChannel.read(buffer)) > 0) {
                                        // buffer.flip();
                                        // System.out
                                        // .println(bytesRead);
                                        bstr.write(buffer.array(), 0, bytesRead);
                                        buffer.clear();
                                    }
                                    buffer.clear();
                                    //log.info("Message1"+new String(bstr
                                    //      .toByteArray()));
                                    bais = new ByteArrayInputStream(bstr.toByteArray());
                                    ois = new ObjectInputStream(bais); // Offending
                                    // line.
                                    // Produces
                                    // the
                                    // StreamCorruptedException.
                                    //log.info("In read obect");
                                    object = ois.readObject();
                                    //log.info("Class Cast");
                                    //log.info("Class Cast1");
                                    ois.close();
                                    byte[] params = bstr.toByteArray();
                                    bstr.close();
                                    //log.info("readObject");
                                    //log.info("After readObject");
                                    if (object instanceof CloseSocket) {
                                        resultMap.remove(key);
                                        clientChannel.close();
                                        key.cancel();
                                    }
                                    // clientChannel.close();
                                    String serviceurl = (String) object;
                                    String[] serviceRegistry = serviceurl.split("/");
                                    //log.info("classLoaderMap"
                                    //      + urlClassLoaderMap);
                                    //log.info(deployDirectory
                                    //      + "/" + serviceRegistry[0]);

                                    int servicenameIndex;
                                    //log.info(earServicesDirectory
                                    //      + "/" + serviceRegistry[0]
                                    //      + "/" + serviceRegistry[1]);
                                    if (serviceRegistry[0].endsWith(".ear")) {
                                        classLoader = (VFSClassLoader) urlClassLoaderMap.get(deployDirectory
                                                + "/" + serviceRegistry[0] + "/" + serviceRegistry[1]);
                                        servicenameIndex = 2;
                                    } else if (serviceRegistry[0].endsWith(".jar")) {
                                        classLoader = (WebClassLoader) urlClassLoaderMap
                                                .get(deployDirectory + "/" + serviceRegistry[0]);
                                        servicenameIndex = 1;
                                    } else {
                                        classLoader = (WebClassLoader) urlClassLoaderMap
                                                .get(deployDirectory + "/" + serviceRegistry[0]);
                                        servicenameIndex = 1;
                                    }
                                    String serviceName = serviceRegistry[servicenameIndex];
                                    // log.info("servicename:"+serviceName);;
                                    synchronized (executorServiceMap) {
                                        executorServiceInfo = (ExecutorServiceInfo) executorServiceMap
                                                .get(serviceName.trim());
                                    }
                                    ExecutorServiceInfoClassLoader classLoaderExecutorServiceInfo = new ExecutorServiceInfoClassLoader();
                                    classLoaderExecutorServiceInfo.setClassLoader(classLoader);
                                    classLoaderExecutorServiceInfo.setExecutorServiceInfo(executorServiceInfo);
                                    resultMap.put(key, classLoaderExecutorServiceInfo);
                                    // key.interestOps(SelectionKey.OP_READ);
                                    // log.info("Key interested Ops");
                                    // continue;
                                }
                                //Thread.sleep(100);
                                /*
                                 * if (classLoader == null) throw new
                                 * Exception(
                                 * "Could able to obtain deployed class loader"
                                 * );
                                 */
                                /*
                                 * log.info(
                                 * "current context classloader" +
                                 * classLoader);
                                 */
                                //log.info("In rad object");
                                bstr = new ByteArrayOutputStream();
                                lengthBuffer.clear();
                                int numberofDataRead = clientChannel.read(lengthBuffer);
                                //log.info("numberofDataRead"
                                //      + numberofDataRead);
                                int length = lengthBuffer.getInt(0);
                                if (length <= 0) {
                                    iterator.remove();
                                    continue;
                                }
                                lengthBuffer.clear();
                                //log.info(length);
                                buffer = ByteBuffer.allocate(length);
                                buffer.clear();
                                if ((bytesRead = clientChannel.read(buffer)) > 0) {
                                    // buffer.flip();
                                    // System.out
                                    // .println(bytesRead);
                                    bstr.write(buffer.array(), 0, bytesRead);
                                    buffer.clear();
                                }
                                if (bytesRead <= 0 || bytesRead < length) {
                                    //log.info("bytesRead<length");
                                    iterator.remove();
                                    continue;
                                }
                                //log.info(new String(bstr
                                //   .toByteArray()));
                                bais = new ByteArrayInputStream(bstr.toByteArray());

                                ExecutorServiceInfoClassLoader classLoaderExecutorServiceInfo = (ExecutorServiceInfoClassLoader) resultMap
                                        .get(key);
                                ois = new ClassLoaderObjectInputStream(
                                        (ClassLoader) classLoaderExecutorServiceInfo.getClassLoader(), bais); // Offending
                                // line.
                                // Produces
                                // the
                                // StreamCorruptedException.
                                object = ois.readObject();
                                ois.close();
                                bstr.close();
                                executorServiceInfo = classLoaderExecutorServiceInfo.getExecutorServiceInfo();
                                //System.out
                                //      .println("inputStream Read Object");
                                //log.info("Object="
                                //      + object.getClass());
                                // Thread.currentThread().setContextClassLoader(currentContextLoader);
                                if (object instanceof ExecutorParams) {
                                    ExecutorParams exeParams = (ExecutorParams) object;
                                    Object returnValue = null;

                                    //log.info("test socket1");
                                    String ataKey;
                                    ATAConfig ataConfig;
                                    ConcurrentHashMap ataServicesMap;
                                    Enumeration<NodeResourceInfo> noderesourceInfos = addressmap.elements();
                                    NodeResourceInfo noderesourceinfo = null;
                                    String ip = "";
                                    int port = 1000;
                                    long memavailable = 0;
                                    long memcurr = 0;
                                    if (noderesourceInfos.hasMoreElements()) {
                                        noderesourceinfo = noderesourceInfos.nextElement();
                                        if (noderesourceinfo.getMax() != null) {
                                            ip = noderesourceinfo.getHost();
                                            port = Integer.parseInt(noderesourceinfo.getPort());
                                            memavailable = Long.parseLong(noderesourceinfo.getMax())
                                                    - Long.parseLong(noderesourceinfo.getUsed());
                                            ;
                                        }
                                    }

                                    while (noderesourceInfos.hasMoreElements()) {
                                        noderesourceinfo = noderesourceInfos.nextElement();
                                        if (noderesourceinfo.getMax() != null) {
                                            memcurr = Long.parseLong(noderesourceinfo.getMax())
                                                    - Long.parseLong(noderesourceinfo.getUsed());
                                            if (memavailable <= memcurr) {
                                                ip = noderesourceinfo.getHost();
                                                port = Integer.parseInt(noderesourceinfo.getPort());
                                                memavailable = memcurr;
                                            }
                                        }
                                    }
                                    ATAExecutorServiceInfo servicesAvailable;
                                    Socket sock1 = new Socket(ip, port);
                                    OutputStream outputStr = sock1.getOutputStream();
                                    ObjectOutputStream objOutputStream = new ObjectOutputStream(outputStr);
                                    NodeInfo nodeInfo = new NodeInfo();
                                    nodeInfo.setClassNameWithPackage(
                                            executorServiceInfo.getExecutorServicesClass().getName());
                                    nodeInfo.setMethodName(executorServiceInfo.getMethod().getName());

                                    nodeInfo.setWebclassLoaderURLS(((WebClassLoader) classLoader).geturlS());
                                    NodeInfoMethodParam nodeInfoMethodParam = new NodeInfoMethodParam();
                                    nodeInfoMethodParam.setMethodParams(exeParams.getParams());
                                    nodeInfoMethodParam
                                            .setMethodParamTypes(executorServiceInfo.getMethodParams());
                                    //log.info("Serializable socket="+sock);
                                    //nodeInfo.setSock(sock);
                                    //nodeInfo.setOstream(sock.getOutputStream());
                                    objOutputStream.writeObject(nodeInfo);
                                    objOutputStream = new ObjectOutputStream(outputStr);
                                    objOutputStream.writeObject(nodeInfoMethodParam);
                                    ObjectInputStream objInputStream1 = new ObjectInputStream(
                                            sock1.getInputStream());
                                    returnValue = objInputStream1.readObject();
                                    objOutputStream.close();
                                    objInputStream1.close();
                                    sock1.close();
                                    /*returnValue = executorServiceInfo
                                          .getMethod()
                                          .invoke(executorServiceInfo
                                                .getExecutorServicesClass()
                                                .newInstance(),
                                                exeParams.getParams());*/
                                    // Thread.currentThread().setContextClassLoader(oldCL);

                                    //   log.info("Written Value="
                                    //         + returnValue.toString());
                                    resultMap.put(key, returnValue);
                                }
                                key.interestOps(SelectionKey.OP_WRITE);
                                //log.info("Key interested Ops1");
                            } else if (key.isWritable()) {
                                // the channel is non blocking so keep it
                                // open
                                // till the
                                // count is >=0
                                //log.info("In write");
                                ByteArrayOutputStream baos = new ByteArrayOutputStream(); // make
                                // a
                                // BAOS
                                // stream
                                ObjectOutputStream oos = new ObjectOutputStream(baos); // wrap and OOS around the
                                                                                       // stream
                                Object result = resultMap.get(key);
                                oos.writeObject(result); // write an object
                                // to
                                // the stream
                                oos.flush();
                                oos.close();
                                byte[] objData = baos.toByteArray(); // get
                                // the
                                // byte
                                // array
                                baos.close();
                                buffer = ByteBuffer.wrap(objData); // wrap
                                // around
                                // the
                                // data
                                buffer.rewind();
                                // buffer.flip(); //prep for writing
                                //log.info(new String(objData));
                                //while (buffer.hasRemaining())
                                clientChannel.write(buffer); // write
                                resultMap.remove(key);
                                buffer.clear();
                                key.cancel();
                                clientChannel.close();
                                //log.info("In write1");
                                numberOfServicesRequests++;
                                //log.info("Key interested Ops2");
                            }

                        }

                        iterator.remove();
                    } catch (Exception ex) {
                        log.error("Error in executing the executor services thread", ex);
                        //ex.printStackTrace();
                        key.cancel();
                        clientChannel.close();
                        resultMap.remove(key);
                        //ex.printStackTrace();
                    }

                }

            } catch (Exception ex) {
                log.error("Error in executing the executor services thread", ex);
                //ex.printStackTrace();
            }
        }
    } catch (Exception ex) {
        log.error("Error in executing the executor services thread", ex);
    }
}

From source file:com.web.services.ExecutorServiceThread.java

public void run() {

    // create a selector that will by used for multiplexing. The selector
    // registers the socketserverchannel as
    // well as all socketchannels that are created
    String CLIENTCHANNELNAME = "clientChannel";
    String SERVERCHANNELNAME = "serverChannel";
    String channelType = "channelType";

    ConcurrentHashMap<SelectionKey, Object> resultMap = new ConcurrentHashMap<SelectionKey, Object>();
    ClassLoader classLoader = null;
    ByteArrayOutputStream bstr;//from w  w  w  . jav a  2s  . c  om
    ByteBuffer buffer = null;
    ByteBuffer lengthBuffer = ByteBuffer.allocate(4);
    int bytesRead;
    InputStream bais;
    ObjectInputStream ois;
    Object object;
    ExecutorServiceInfo executorServiceInfo = null;
    Random random = new Random(System.currentTimeMillis());
    // register the serversocketchannel with the selector. The OP_ACCEPT
    // option marks
    // a selection key as ready when the channel accepts a new connection.
    // When the
    // socket server accepts a connection this key is added to the list of
    // selected keys of the selector.
    // when asked for the selected keys, this key is returned and hence we
    // know that a new connection has been accepted.
    try {
        Selector selector = Selector.open();
        SelectionKey socketServerSelectionKey = serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

        // SelectionKey socketServerSelectionKey1 =
        // channel.register(selector1,
        // SelectionKey.OP_ACCEPT);

        // set property in the key that identifies the channel
        Map<String, String> properties = new ConcurrentHashMap<String, String>();
        properties.put(channelType, SERVERCHANNELNAME);
        socketServerSelectionKey.attach(properties);
        // wait for the selected keys
        SelectionKey key = null;
        Set<SelectionKey> selectedKeys;
        // logger.info("Instance Number"+instanceNumber);
        Iterator<SelectionKey> iterator = null;
        SocketChannel clientChannel = null;
        while (true) {
            try {
                // the select method is a blocking method which returns when
                // atleast
                // one of the registered
                // channel is selected. In this example, when the socket
                // accepts
                // a
                // new connection, this method
                // will return. Once a socketclient is added to the list of
                // registered channels, then this method
                // would also return when one of the clients has data to be
                // read
                // or
                // written. It is also possible to perform a nonblocking
                // select
                // using the selectNow() function.
                // We can also specify the maximum time for which a select
                // function
                // can be blocked using the select(long timeout) function.

                if (selector.select() >= 0) {
                    selectedKeys = selector.selectedKeys();
                    iterator = selectedKeys.iterator();
                }
                while (iterator.hasNext()) {
                    try {
                        key = iterator.next();
                        // the selection key could either by the
                        // socketserver
                        // informing
                        // that a new connection has been made, or
                        // a socket client that is ready for read/write
                        // we use the properties object attached to the
                        // channel
                        // to
                        // find
                        // out the type of channel.
                        if (((Map) key.attachment()).get(channelType).equals(SERVERCHANNELNAME)) {
                            // a new connection has been obtained. This
                            // channel
                            // is
                            // therefore a socket server.
                            ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
                            // accept the new connection on the server
                            // socket.
                            // Since
                            // the
                            // server socket channel is marked as non
                            // blocking
                            // this channel will return null if no client is
                            // connected.
                            SocketChannel clientSocketChannel = serverSocketChannel.accept();

                            if (clientSocketChannel != null) {
                                // set the client connection to be non
                                // blocking
                                clientSocketChannel.configureBlocking(false);
                                SelectionKey clientKey = clientSocketChannel.register(selector,
                                        SelectionKey.OP_READ, SelectionKey.OP_WRITE);
                                Map<String, String> clientproperties = new ConcurrentHashMap<String, String>();
                                clientproperties.put(channelType, CLIENTCHANNELNAME);
                                clientKey.attach(clientproperties);
                                clientKey.interestOps(SelectionKey.OP_READ);
                                // clientSocketChannel.close();
                                // write something to the new created client
                                /*
                                 * CharBuffer buffer =
                                 * CharBuffer.wrap("Hello client"); while
                                 * (buffer.hasRemaining()) {
                                 * clientSocketChannel.write
                                 * (Charset.defaultCharset()
                                 * .encode(buffer)); }
                                 * clientSocketChannel.close();
                                 * buffer.clear();
                                 */
                            }

                        } else {
                            // data is available for read
                            // buffer for reading
                            clientChannel = (SocketChannel) key.channel();
                            if (key.isReadable()) {
                                // the channel is non blocking so keep it
                                // open
                                // till
                                // the
                                // count is >=0
                                clientChannel = (SocketChannel) key.channel();
                                if (resultMap.get(key) == null) {
                                    //System.out.println(key);
                                    bstr = new ByteArrayOutputStream();
                                    object = null;
                                    clientChannel.read(lengthBuffer);
                                    int length = lengthBuffer.getInt(0);
                                    lengthBuffer.clear();
                                    //System.out.println(length);
                                    buffer = ByteBuffer.allocate(length);
                                    if ((bytesRead = clientChannel.read(buffer)) > 0) {
                                        // buffer.flip();
                                        // System.out
                                        // .println(bytesRead);
                                        bstr.write(buffer.array(), 0, bytesRead);
                                        buffer.clear();
                                    }
                                    buffer.clear();
                                    //System.out.println("Message1"+new String(bstr
                                    //      .toByteArray()));
                                    bais = new ByteArrayInputStream(bstr.toByteArray());
                                    ois = new ObjectInputStream(bais); // Offending
                                    // line.
                                    // Produces
                                    // the
                                    // StreamCorruptedException.
                                    //System.out.println("In read obect");
                                    object = ois.readObject();
                                    //System.out.println("Class Cast");
                                    //System.out.println("Class Cast1");
                                    ois.close();
                                    byte[] params = bstr.toByteArray();
                                    bstr.close();
                                    //System.out.println("readObject");
                                    //System.out.println("After readObject");
                                    if (object instanceof CloseSocket) {
                                        resultMap.remove(key);
                                        clientChannel.close();
                                        key.cancel();
                                    }
                                    // clientChannel.close();
                                    String serviceurl = (String) object;
                                    String[] serviceRegistry = serviceurl.split("/");
                                    //System.out.println("classLoaderMap"
                                    //      + urlClassLoaderMap);
                                    //System.out.println(deployDirectory
                                    //      + "/" + serviceRegistry[0]);

                                    int servicenameIndex;
                                    //System.out.println(earServicesDirectory
                                    //      + "/" + serviceRegistry[0]
                                    //      + "/" + serviceRegistry[1]);
                                    if (serviceRegistry[0].endsWith(".ear")) {
                                        classLoader = (VFSClassLoader) urlClassLoaderMap
                                                .get(earServicesDirectory + "/" + serviceRegistry[0] + "/"
                                                        + serviceRegistry[1]);
                                        servicenameIndex = 2;
                                    } else if (serviceRegistry[0].endsWith(".jar")) {
                                        classLoader = (WebClassLoader) urlClassLoaderMap
                                                .get(jarservicesDirectory + "/" + serviceRegistry[0]);
                                        servicenameIndex = 1;
                                    } else {
                                        classLoader = (WebClassLoader) urlClassLoaderMap
                                                .get(deployDirectory + "/" + serviceRegistry[0]);
                                        servicenameIndex = 1;
                                    }
                                    String serviceName = serviceRegistry[servicenameIndex];
                                    // System.out.println("servicename:"+serviceName);;
                                    synchronized (executorServiceMap) {
                                        executorServiceInfo = (ExecutorServiceInfo) executorServiceMap
                                                .get(serviceName.trim());
                                    }
                                    ExecutorServiceInfoClassLoader classLoaderExecutorServiceInfo = new ExecutorServiceInfoClassLoader();
                                    classLoaderExecutorServiceInfo.setClassLoader(classLoader);
                                    classLoaderExecutorServiceInfo.setExecutorServiceInfo(executorServiceInfo);
                                    resultMap.put(key, classLoaderExecutorServiceInfo);
                                    // key.interestOps(SelectionKey.OP_READ);
                                    // System.out.println("Key interested Ops");
                                    // continue;
                                }
                                //Thread.sleep(100);
                                /*
                                 * if (classLoader == null) throw new
                                 * Exception(
                                 * "Could able to obtain deployed class loader"
                                 * );
                                 */
                                /*
                                 * System.out.println(
                                 * "current context classloader" +
                                 * classLoader);
                                 */
                                //System.out.println("In rad object");
                                bstr = new ByteArrayOutputStream();
                                lengthBuffer.clear();
                                int numberofDataRead = clientChannel.read(lengthBuffer);
                                //System.out.println("numberofDataRead"
                                //      + numberofDataRead);
                                int length = lengthBuffer.getInt(0);
                                if (length <= 0) {
                                    iterator.remove();
                                    continue;
                                }
                                lengthBuffer.clear();
                                //System.out.println(length);
                                buffer = ByteBuffer.allocate(length);
                                buffer.clear();
                                if ((bytesRead = clientChannel.read(buffer)) > 0) {
                                    // buffer.flip();
                                    // System.out
                                    // .println(bytesRead);
                                    bstr.write(buffer.array(), 0, bytesRead);
                                    buffer.clear();
                                }
                                if (bytesRead <= 0 || bytesRead < length) {
                                    //System.out.println("bytesRead<length");
                                    iterator.remove();
                                    continue;
                                }
                                //System.out.println(new String(bstr
                                //   .toByteArray()));
                                bais = new ByteArrayInputStream(bstr.toByteArray());

                                ExecutorServiceInfoClassLoader classLoaderExecutorServiceInfo = (ExecutorServiceInfoClassLoader) resultMap
                                        .get(key);
                                ois = new ClassLoaderObjectInputStream(
                                        (ClassLoader) classLoaderExecutorServiceInfo.getClassLoader(), bais); // Offending
                                // line.
                                // Produces
                                // the
                                // StreamCorruptedException.
                                object = ois.readObject();
                                ois.close();
                                bstr.close();
                                executorServiceInfo = classLoaderExecutorServiceInfo.getExecutorServiceInfo();
                                //System.out
                                //      .println("inputStream Read Object");
                                //System.out.println("Object="
                                //      + object.getClass());
                                // Thread.currentThread().setContextClassLoader(currentContextLoader);
                                if (object instanceof ExecutorParams) {
                                    ExecutorParams exeParams = (ExecutorParams) object;
                                    Object returnValue = null;

                                    //System.out.println("test socket1");
                                    String ataKey;
                                    ATAConfig ataConfig;
                                    ConcurrentHashMap ataServicesMap;

                                    ATAExecutorServiceInfo servicesAvailable;
                                    Socket sock1 = new Socket("0.0.0.0",
                                            Integer.parseInt(nodesport[random.nextInt(nodesport.length)]));
                                    OutputStream outputStr = sock1.getOutputStream();
                                    ObjectOutputStream objOutputStream = new ObjectOutputStream(outputStr);
                                    NodeInfo nodeInfo = new NodeInfo();
                                    nodeInfo.setClassNameWithPackage(
                                            executorServiceInfo.getExecutorServicesClass().getName());
                                    nodeInfo.setMethodName(executorServiceInfo.getMethod().getName());

                                    nodeInfo.setWebclassLoaderURLS(((WebClassLoader) classLoader).geturlS());
                                    NodeInfoMethodParam nodeInfoMethodParam = new NodeInfoMethodParam();
                                    nodeInfoMethodParam.setMethodParams(exeParams.getParams());
                                    nodeInfoMethodParam
                                            .setMethodParamTypes(executorServiceInfo.getMethodParams());
                                    //System.out.println("Serializable socket="+sock);
                                    //nodeInfo.setSock(sock);
                                    //nodeInfo.setOstream(sock.getOutputStream());
                                    objOutputStream.writeObject(nodeInfo);
                                    objOutputStream = new ObjectOutputStream(outputStr);
                                    objOutputStream.writeObject(nodeInfoMethodParam);
                                    ObjectInputStream objInputStream1 = new ObjectInputStream(
                                            sock1.getInputStream());
                                    returnValue = objInputStream1.readObject();
                                    objOutputStream.close();
                                    objInputStream1.close();
                                    sock1.close();
                                    /*returnValue = executorServiceInfo
                                          .getMethod()
                                          .invoke(executorServiceInfo
                                                .getExecutorServicesClass()
                                                .newInstance(),
                                                exeParams.getParams());*/
                                    // Thread.currentThread().setContextClassLoader(oldCL);

                                    //   System.out.println("Written Value="
                                    //         + returnValue.toString());
                                    resultMap.put(key, returnValue);
                                }
                                key.interestOps(SelectionKey.OP_WRITE);
                                //System.out.println("Key interested Ops1");
                            } else if (key.isWritable()) {
                                // the channel is non blocking so keep it
                                // open
                                // till the
                                // count is >=0
                                //System.out.println("In write");
                                ByteArrayOutputStream baos = new ByteArrayOutputStream(); // make
                                // a
                                // BAOS
                                // stream
                                ObjectOutputStream oos = new ObjectOutputStream(baos); // wrap and OOS around the
                                                                                       // stream
                                Object result = resultMap.get(key);
                                oos.writeObject(result); // write an object
                                // to
                                // the stream
                                oos.flush();
                                oos.close();
                                byte[] objData = baos.toByteArray(); // get
                                // the
                                // byte
                                // array
                                baos.close();
                                buffer = ByteBuffer.wrap(objData); // wrap
                                // around
                                // the
                                // data
                                buffer.rewind();
                                // buffer.flip(); //prep for writing
                                //System.out.println(new String(objData));
                                //while (buffer.hasRemaining())
                                clientChannel.write(buffer); // write
                                resultMap.remove(key);
                                buffer.clear();
                                key.cancel();
                                clientChannel.close();
                                //System.out.println("In write1");
                                numberOfServicesRequests++;
                                //System.out.println("Key interested Ops2");
                            }

                        }

                        iterator.remove();
                    } catch (Exception ex) {
                        ex.printStackTrace();
                        key.cancel();
                        clientChannel.close();
                        resultMap.remove(key);
                        //ex.printStackTrace();
                    }

                }

            } catch (Exception ex) {

                //ex.printStackTrace();
            }
        }
    } catch (Exception ex) {
        //ex.printStackTrace();
    }
}

From source file:middleware.NewServerSocket.java

public void run() {
    int count = 0;
    while (!sharedData.isEndOfProgram()) {

        try {/*w ww  .  jav  a  2s.c om*/
            if (monitoring) {
                selector.select(10);
            } else {
                selector.select();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        keyIterator = selector.selectedKeys().iterator();
        while (keyIterator.hasNext()) {
            SelectionKey key = keyIterator.next();
            keyIterator.remove();

            if (key.isAcceptable()) {
                if (key.channel() == serverSocketChannel) {
                    SocketChannel socketChannel = null;
                    try {
                        socketChannel = serverSocketChannel.accept();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    if (socketChannel != null) {

                        MiddleClient middleClient = new MiddleClient(sharedData.getServerIpAddr(),
                                sharedData.getServerPortNum());
                        middleClient.startClient();

                        MiddleServer middleServer = new MiddleServer(socketChannel);
                        TransactionData transactionData = new TransactionData(sharedData, middleServer);
                        middleServer.startServer(transactionData);

                        int len = 0;
                        buffer.clear();
                        len = middleClient.getInput(buffer);
                        middleServer.sendOutput(buffer, len);

                        buffer.clear();
                        len = middleServer.getInput(buffer);
                        transactionData.setUserId(getUserId(data));
                        middleClient.sendOutput(buffer, len);

                        middleServer.setNonBlocking();
                        middleClient.setNonBlocking();

                        if (sharedData.isOutputToFile()) {
                            transactionData.openFileOutputStream();
                        }

                        sharedData.allTransactionData.add(transactionData);

                        workers[count % numWorkers].socketMap.put(middleServer.socketChannel, middleServer);
                        workers[count % numWorkers].socketMap.put(middleClient.socketChannel, middleClient);

                        middleServer.register(workers[count % numWorkers].selector, middleClient);

                        middleClient.register(workers[count % numWorkers].selector, middleServer);

                        ++count;
                    }
                } else if (key.channel() == adminServerSocketChannel) {
                    SocketChannel sock = null;
                    try {
                        sock = adminServerSocketChannel.accept();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    if (sock != null) {
                        try {
                            sock.configureBlocking(true);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        MiddleSocketChannel middleSocketChannel = new MiddleSocketChannel(sock);
                        middleSocketChannel.setNonBlocking();

                        middleSocketChannel.register(selector, middleSocketChannel);

                    }
                }
            } else if (key.isReadable()) {
                MiddleSocketChannel middleSocketChannel = (MiddleSocketChannel) key.attachment();

                buffer.clear();
                int len = middleSocketChannel.getInput(buffer);
                if (len == -1) {
                    middleSocketChannel.cancelKey();
                    continue;
                }
                buffer.position(0);

                int packetID = 0;
                long packetLength = -1;
                boolean isValidPacket = true;

                try {
                    packetID = buffer.getInt();
                    packetLength = buffer.getLong();
                } catch (BufferUnderflowException e) {
                    buffer.clear();
                    buffer.putInt(102);
                    String response = "Invalid packet header";
                    buffer.putLong(response.length());
                    buffer.put(response.getBytes());
                    isValidPacket = false;
                    middleSocketChannel.sendOutput(buffer, buffer.position());
                }

                if (isValidPacket) {
                    if (packetID == 100) {
                        if (userList.contains(middleSocketChannel)) {
                            buffer.clear();
                            buffer.putInt(102);
                            String response = "You have already logged in";
                            buffer.putLong(response.length());
                            buffer.put(response.getBytes());
                            middleSocketChannel.sendOutput(buffer, buffer.position());
                        } else if (packetLength <= 0) {
                            buffer.clear();
                            buffer.putInt(102);
                            String response = "Invalid packet length";
                            buffer.putLong(response.length());
                            buffer.put(response.getBytes());
                            middleSocketChannel.sendOutput(buffer, buffer.position());
                        } else {
                            String userID = null;
                            byte[] password = new byte[Encrypt.MAX_LENGTH];
                            byte[] packet = new byte[(int) packetLength];
                            buffer.get(packet);
                            userID = parseLogInPacket(packet, password);
                            if (userInfo.get(userID) != null && Arrays.equals(((byte[]) userInfo.get(userID)),
                                    Encrypt.encrypt(password))) {
                                buffer.clear();
                                buffer.putInt(101);
                                buffer.putLong(0);
                                middleSocketChannel.sendOutput(buffer, buffer.position());
                                userList.add(middleSocketChannel);
                            } else {
                                buffer.clear();
                                buffer.putInt(102);
                                String response = "Invalid User ID or password";
                                buffer.putLong(response.length());
                                buffer.put(response.getBytes());
                                middleSocketChannel.sendOutput(buffer, buffer.position());
                            }
                        }
                    } else if (packetID == 103) {
                        stopIncrementalLogging();
                    } else if (packetID == 200) {
                        if (userList.contains(middleSocketChannel)) {
                            if (sharedData.isOutputToFile() || endingMonitoring || sendingFiles) {
                                String response = "Current monitoring not finished";
                                buffer.clear();
                                buffer.putInt(202);
                                buffer.putLong(response.length());
                                buffer.put(response.getBytes());
                                middleSocketChannel.sendOutput(buffer, buffer.position());
                            } else {
                                startMonitoring();
                                buffer.clear();
                                buffer.putInt(201);
                                buffer.putLong(0);
                                middleSocketChannel.sendOutput(buffer, buffer.position());
                                curUser = middleSocketChannel;
                            }
                        } else {
                            buffer.clear();
                            buffer.putInt(102);
                            String response = "You have not been registered";
                            buffer.putLong(response.length());
                            buffer.put(response.getBytes());
                            middleSocketChannel.sendOutput(buffer, buffer.position());
                        }

                    } else if (packetID == 300) {
                        if (userList.contains(middleSocketChannel)) {
                            if (!sharedData.isOutputToFile()) {
                                String response = "No monitoring running";
                                buffer.clear();
                                buffer.putInt(302);
                                buffer.putLong(response.length());
                                buffer.put(response.getBytes());
                                middleSocketChannel.sendOutput(buffer, buffer.position());
                                // DY : I think this use case is not right at the moment where
                                // monitoring is only stoppable by a user who started it.
                                //                } else if (middleSocketChannel != curUser) {
                                //                  String response = "Monitoring running by other user";
                                //                  buffer.clear();
                                //                  buffer.putInt(302);
                                //                  buffer.putLong(response.length());
                                //                  buffer.put(response.getBytes());
                                //                  middleSocketChannel.sendOutput(buffer, buffer.position());
                            } else if (endingMonitoring) {
                                String response = "Writing log files, please wait";
                                buffer.clear();
                                buffer.putInt(302);
                                buffer.putLong(response.length());
                                buffer.put(response.getBytes());
                                middleSocketChannel.sendOutput(buffer, buffer.position());
                            } else {
                                sendLog = true;
                                curUser = middleSocketChannel;
                                stopMonitoring();
                            }
                        } else {
                            buffer.clear();
                            buffer.putInt(102);
                            String response = "You have not been registered";
                            buffer.putLong(response.length());
                            buffer.put(response.getBytes());
                            middleSocketChannel.sendOutput(buffer, buffer.position());
                        }
                    } else if (packetID == 303) {
                        if (userList.contains(middleSocketChannel)) {
                            if (!sharedData.isOutputToFile()) {
                                String response = "No monitoring running";
                                buffer.clear();
                                buffer.putInt(302);
                                buffer.putLong(response.length());
                                buffer.put(response.getBytes());
                                middleSocketChannel.sendOutput(buffer, buffer.position());
                                //                } else if (middleSocketChannel != curUser) {
                                //                  String response = "Monitoring running by other user";
                                //                  buffer.clear();
                                //                  buffer.putInt(302);
                                //                  buffer.putLong(response.length());
                                //                  buffer.put(response.getBytes());
                                //                  middleSocketChannel.sendOutput(buffer, buffer.position());
                            } else if (endingMonitoring) {
                                String response = "Writing log files, please wait";
                                buffer.clear();
                                buffer.putInt(302);
                                buffer.putLong(response.length());
                                buffer.put(response.getBytes());
                                middleSocketChannel.sendOutput(buffer, buffer.position());
                            } else {
                                sendLog = false;
                                stopMonitoring();
                            }
                        } else {
                            buffer.clear();
                            buffer.putInt(102);
                            String response = "You have not been registered";
                            buffer.putLong(response.length());
                            buffer.put(response.getBytes());
                            middleSocketChannel.sendOutput(buffer, buffer.position());
                        }

                    } else if (packetID == 400) {
                        if (userList.contains(middleSocketChannel)) {
                            // when the GUI reconnects and the middleware is still monitoring...
                            if (monitoring) {

                                // start new logging threads and resume monitoring
                                stopIncrementalLogging();
                                startIncrementalLogging(true);

                                buffer.clear();
                                buffer.putInt(402);
                                buffer.putLong(0);
                                middleSocketChannel.sendOutput(buffer, buffer.position());
                            } else {
                                buffer.clear();
                                buffer.putInt(401);
                                buffer.putLong(0);
                                middleSocketChannel.sendOutput(buffer, buffer.position());
                            }
                        } else {
                            buffer.clear();
                            buffer.putInt(102);
                            String response = "You have not been registered";
                            buffer.putLong(response.length());
                            buffer.put(response.getBytes());
                            middleSocketChannel.sendOutput(buffer, buffer.position());
                        }

                    } else if (packetID == 500) {
                        if (!sharedData.isLiveMonitoring()) {
                            buffer.clear();
                            buffer.putInt(501);
                            middleSocketChannel.sendOutput(buffer, buffer.position());
                        } else {
                            buffer.clear();
                            buffer.putInt(502);
                            LiveAggregateGlobal globalAggregate = sharedData.liveMonitor.globalAggregate;
                            int numTransactionType = globalAggregate.getNumTransactionType();
                            buffer.putInt(numTransactionType);
                            buffer.putDouble(globalAggregate.totalTransactionCount);
                            for (int i = 0; i < numTransactionType; ++i) {
                                buffer.putDouble(
                                        globalAggregate.transactionStatistics.get(i).currentTransactionCounts); // current TPS
                                buffer.putDouble(
                                        globalAggregate.transactionStatistics.get(i).currentAverageLatency); // current average latency.
                                buffer.putDouble(
                                        globalAggregate.transactionStatistics.get(i).totalTransactionCounts); // total transaction count
                            }
                            middleSocketChannel.sendOutput(buffer, buffer.position());
                        }
                    } else if (packetID == 600) {
                        int type = buffer.getInt();
                        int index = buffer.getInt();
                        String[] samples = sharedData.liveMonitor.getTransactionSamples(type);
                        if (samples == null) {
                            buffer.clear();
                            buffer.putInt(601);
                            middleSocketChannel.sendOutput(buffer, buffer.position());
                        } else if (samples.length < index + 1) {
                            buffer.clear();
                            buffer.putInt(601);
                            middleSocketChannel.sendOutput(buffer, buffer.position());
                        } else {
                            String sample = samples[index];
                            buffer.clear();
                            buffer.putInt(602);
                            buffer.putLong(sample.length());
                            buffer.put(sample.getBytes());
                            middleSocketChannel.sendOutput(buffer, buffer.position());
                        }
                    } else if (packetID == 700) {
                        int type = buffer.getInt();
                        sharedData.liveMonitor.removeTransactionType(type);
                        buffer.clear();
                        buffer.putInt(701);
                        buffer.putInt(sharedData.liveMonitor.globalAggregate.getNumTransactionType());
                        middleSocketChannel.sendOutput(buffer, buffer.position());
                    } else {
                        buffer.clear();
                        buffer.putInt(102);
                        String response = "Invalid packet ID";
                        buffer.putLong(response.length());
                        buffer.put(response.getBytes());
                        middleSocketChannel.sendOutput(buffer, buffer.position());
                    }
                }
            }
        }

        if (!sharedData.allTransactions.isEmpty() || !sharedData.allQueries.isEmpty()) {
            int c = sharedData.allQueries.size();
            while (c > 0) {
                printQueries();
                --c;
            }
            // c = sharedData.allStatementsInfo.size();
            // while (c > 0) {
            // printStatementsInfo();
            // --c;
            // }
            c = sharedData.allTransactions.size();
            while (c > 0) {
                printTransactions();
                --c;
            }
        } else if (endingMonitoring) {
            try {
                sharedData.tAllLogFileOutputStream.flush();
                sharedData.tAllLogFileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                sharedData.sAllLogFileOutputStream.flush();
                sharedData.sAllLogFileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                sharedData.qAllLogFileOutputStream.flush();
                sharedData.qAllLogFileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

            if (curUser != null && sendLog) {

                //          System.out.println("ready to compress log files");

                if (stopRemoteDstat != null) {
                    Interrupter interrupter = new Interrupter(Thread.currentThread());
                    interrupter.start();
                    try {
                        stopRemoteDstat.waitFor();
                        interrupter.setOuterThreadWaiting(false);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    stopRemoteDstat = null;
                }
                buffer.clear();
                buffer.putInt(301);
                buffer.putLong(0);
                curUser.sendOutput(buffer, buffer.position());

                //          if (zipAllFiles()) {
                //
                //            System.out
                //                .println("finish compressing files, ready to send zip file");
                //
                //            File zipFile = new File(zipFileName);
                //
                //            FileInputStream fis = null;
                //            try {
                //              fis = new FileInputStream(zipFile);
                //            } catch (FileNotFoundException e) {
                //              e.printStackTrace();
                //            }
                //
                //            FileChannel fc = fis.getChannel();
                //
                //            buffer.clear();
                //            buffer.putInt(301);
                //            buffer.putLong(zipFile.length());
                //            curUser.sendOutput(buffer, buffer.position());
                //            long position = 0;
                //            long remaining = zipFile.length();
                //            long len = 0;
                //            while (remaining > 0) {
                //              try {
                //               len = fc.transferTo(position, 1024, curUser.socketChannel);
                //              } catch (IOException e) {
                //                e.printStackTrace();
                //              }
                //              position += len;
                //              remaining -= len;
                //              len = 0;
                //            }
                //
                //            System.out.println("finish sending zip file");
                //
                //          } else {
                //            String response = "fail to compress log files";
                //            buffer.clear();
                //            buffer.putInt(302);
                //            buffer.putLong(response.length());
                //            buffer.put(response.getBytes());
                //            curUser.sendOutput(buffer, buffer.position());
                //          }
                curUser = null;
            }

            endingMonitoring = false;
            monitoring = false;
            if (System.getProperty("user.name").contentEquals("root")) {
                String[] cmd = { "/bin/bash", "shell/chmod" };
                try {
                    Runtime.getRuntime().exec(cmd);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }

    }

}

From source file:net.ymate.platform.serv.nio.datagram.NioUdpServer.java

public synchronized void start() throws IOException {
    if (!__isStarted) {
        __isStarted = true;/*from  w  w w . j a v  a 2s.  c om*/
        __eventGroup = new NioEventGroup<NioUdpListener>(__serverCfg, __listener, __codec) {
            @Override
            protected SelectableChannel __doChannelCreate(INioServerCfg cfg) throws IOException {
                DatagramChannel _channel = DatagramChannel.open();
                _channel.configureBlocking(false);
                _channel.socket().bind(new InetSocketAddress(cfg.getServerHost(), cfg.getPort()));
                return _channel;
            }

            @Override
            protected String __doBuildProcessorName() {
                return StringUtils.capitalize(name()).concat("UdpServer-NioEventProcessor-");
            }

            @Override
            protected void __doInitProcessors() throws IOException {
                __processors = new NioEventProcessor[__selectorCount];
                for (int _idx = 0; _idx < __selectorCount; _idx++) {
                    __processors[_idx] = new NioEventProcessor<NioUdpListener>(this,
                            __doBuildProcessorName() + _idx) {
                        @Override
                        protected void __doExceptionEvent(SelectionKey key, final Throwable e) {
                            final INioSession _session = (INioSession) key.attachment();
                            if (_session != null) {
                                __eventGroup.executorService().submit(new Runnable() {
                                    public void run() {
                                        try {
                                            __eventGroup.listener().onExceptionCaught(e, _session);
                                        } catch (Throwable ex) {
                                            _LOG.error(e.getMessage(), RuntimeUtils.unwrapThrow(ex));
                                        }
                                    }
                                });
                            } else {
                                _LOG.error(e.getMessage(), RuntimeUtils.unwrapThrow(e));
                            }
                        }
                    };
                    __processors[_idx].start();
                }
            }

            @Override
            protected void __doRegisterEvent() throws IOException {
                for (NioEventProcessor _processor : __processors) {
                    _processor.registerEvent(__channel, SelectionKey.OP_READ,
                            new NioSession<NioUdpListener>(this, __channel) {
                                @Override
                                protected int __doChannelRead(ByteBuffer buffer) throws IOException {
                                    SocketAddress _address = ((DatagramChannel) __channel).receive(buffer);
                                    if (_address != null) {
                                        attr(SocketAddress.class.getName(), _address);
                                        return __buffer.remaining();
                                    }
                                    return 0;
                                }

                                @Override
                                protected int __doChannelWrite(ByteBuffer buffer) throws IOException {
                                    SocketAddress _address = attr(SocketAddress.class.getName());
                                    if (_address != null) {
                                        return ((DatagramChannel) __channel).send(buffer, _address);
                                    }
                                    buffer.reset();
                                    return 0;
                                }
                            });
                }
            }
        };
        __eventGroup.start();
        //
        _LOG.info("UdpServer [" + __eventGroup.name() + "] started at " + __serverCfg.getServerHost() + ":"
                + __serverCfg.getPort());
    }
}

From source file:net.ymate.platform.serv.nio.support.NioEventProcessor.java

@Override
public void run() {
    try {//w w  w  .jav a 2  s .c  o m
        while (__flag) {
            __selector.select(5 * DateTimeUtils.SECOND);
            __doRegisterEvent();
            Iterator<SelectionKey> _keyIterator = __selector.selectedKeys().iterator();
            while (_keyIterator.hasNext()) {
                SelectionKey _selectionKey = _keyIterator.next();
                _keyIterator.remove();
                if (_selectionKey.isValid()) {
                    Object _attachment = _selectionKey.attachment();
                    if (_attachment instanceof INioSession) {
                        ((INioSession) _attachment).touch();
                    }
                    try {
                        if (_selectionKey.isAcceptable()) {
                            __doAcceptEvent(_selectionKey);
                        } else if (_selectionKey.isConnectable()) {
                            __doConnectEvent(_selectionKey);
                        } else if (_selectionKey.isReadable()) {
                            __doReadEvent(_selectionKey);
                        } else if (_selectionKey.isWritable()) {
                            __doWriteEvent(_selectionKey);
                        }
                    } catch (Throwable e) {
                        __doExceptionEvent(_selectionKey, e);
                    }
                }
            }
            __doClosedEvent();
        }
    } catch (IOException e) {
        if (__flag) {
            _LOG.error(e.getMessage(), RuntimeUtils.unwrapThrow(e));
        } else {
            _LOG.debug(e.getMessage(), RuntimeUtils.unwrapThrow(e));
        }
    }
}