/*
* Written by Fedor Burdun of Azul Systems, and released to the public domain,
* as explained at http://creativecommons.org/publicdomain/zero/1.0/
*
*/
package org.jrt.socket.nio;
import org.jrt.impl.JRT;
import org.jrt.socket.regular.Accumulator;
import org.jrt.socket.regular.JavaNetSocketCodeWrapper;
/**
*
* @author fijiol
*/
public class NioSocketCodeWrapper extends JavaNetSocketCodeWrapper {
@Override
public void init(JRT jRT) {
super.init(jRT);
}
@Override
public boolean needInstrument(String className) {
return className != null &&
(
className.equals("sun/nio/ch/IOUtil") ||
className.equals("sun/nio/ch/SocketChannelImpl") ||
className.equals("sun/nio/ch/AsynchronousSocketChannelImpl") ||
false
);
}
@Override
public String postCode(String methodName) {
if (methodName.equals("sun.nio.ch.SocketChannelImpl(java.nio.channels.spi.SelectorProvider,java.io.FileDescriptor,java.net.InetSocketAddress)")) {
return _block(
//ENSURE that fd everywhere can be get!
Accumulator._filter(_jRT(), "fd", "remoteAddress.getAddress()", "remoteAddress.getPort()", "localAddress.getPort()")
);
}
if (methodName.equals("sun.nio.ch.SocketChannelImpl.connect(java.net.SocketAddress)")) {
return _block(
//ENSURE that fd everywhere can be get!
Accumulator._filter(_jRT(), "fd", "((java.net.InetSocketAddress)$1).getAddress()", "((java.net.InetSocketAddress)$1).getPort()", "0")
);
}
if (methodName.equals("sun.nio.ch.AsynchronousSocketChannelImpl(sun.nio.ch.AsynchronousChannelGroupImpl,java.io.FileDescriptor,java.net.InetSocketAddress)")) {
return _block(
//ENSURE that fd everywhere can be get!
Accumulator._filter(_jRT(), "fd", "remoteAddress.getAddress()", "remoteAddress.getPort()", "localAddress.getPort()")
);
}
if (methodName.equals("sun.nio.ch.AsynchronousSocketChannelImpl.connect(java.net.SocketAddress)")) {
return _block(
//ENSURE that fd everywhere can be get!
Accumulator._filter(_jRT(), "fd", "((java.net.InetSocketAddress)$1).getAddress()", "((java.net.InetSocketAddress)$1).getPort()", "0")
);
}
if (methodName.equals("sun.nio.ch.AsynchronousSocketChannelImpl.connect(java.net.SocketAddress,java.lang.Object,java.nio.channels.CompletionHandler)")) {
return _block(
//ENSURE that fd everywhere can be get!
Accumulator._filter(_jRT(), "fd", "((java.net.InetSocketAddress)$1).getAddress()", "((java.net.InetSocketAddress)$1).getPort()", "0")
);
}
if (methodName.contains("sun.nio.ch.IOUtil.read(java.io.FileDescriptor,")) {
return _debugWraps(
Accumulator._readAfter(_jRT(), _ioHic())
);
}
if (methodName.contains("sun.nio.ch.IOUtil.write(java.io.FileDescriptor,")) {
return _debugWraps(
Accumulator._writeAfter(_jRT(), _ioHic())
);
}
return null;
}
@Override
public String preCode(String methodName) {
if (methodName == null) {
return null;
}
if (methodName.contains("sun.nio.ch.IOUtil.read(java.io.FileDescriptor,")) {
return _debugWraps(
Accumulator._readBefore(_jRT(), _ioHic())
);
}
if (methodName.contains("sun.nio.ch.IOUtil.write(java.io.FileDescriptor,")) {
return _debugWraps(
Accumulator._writeBefore(_jRT(), _ioHic())
);
}
return null;
}
@Override
public String _ioHic() {
// return _jRT() + ".sockRTs.get(fd)"; // <-- Expected fd ~ $1
// Code below is correct, because we used it only while redefine read/write functions that get FileDescriptor as first argument
return _jRT() + ".sockRTs.get($1)";
}
}