/* * 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.regular; import java.util.Collections; import org.jrt.impl.JRT; import org.jrt.socket.api.CodeWriter; /** * * @author fijiol */ public class JavaNetSocketCodeWrapper implements CodeWriter { String time_provider_class = "org.jrt.socket.api.TimeProvider"; String get_current_time = time_provider_class + ".getCurrentTime()"; String jrt_static = "org.jrt.impl.JRT"; public JRT jRT = null; public String _getCurrentTime() { return get_current_time; } public String _str(String arg) { return "\"" + arg + "\""; } public String _sout(String arg) { return "System.out.println(" + arg + ");"; } public String _serr(String arg) { return "System.err.println(" + arg + ");"; } public String _plus() { return "+"; } public String _block(String arg) { return "{" + arg + "}"; } public String _if(String condition, String thenBlock, String elseBlock) { return "if (" + condition + ") { " + thenBlock + " } else { " + elseBlock + " } "; } public String _if(String condition, String thenBlock) { return _if(condition, thenBlock, ""); } public String _rethrowWithPrint(String arg) { return "try {" + arg + "} catch (Exception e) " + "{ " + "System.err.println(" + _str("some exception was thrown during _trace: ") + " + e ); " + "e.printStackTrace(); " + "throw e; " + "} "; } public String _debugWraps(String arg) { if (jRT.configuration.printExceptions) { return _rethrowWithPrint(arg); } else { return arg; } } public String _uniqVar(String name) { return jRT.configuration.uuid.replaceAll("", "_") + name; } public String _jRT() { return "((org.jrt.impl.JRT)" + jrt_static + ".jRTWorkers.get(" + _str(jRT.configuration.uuid) + "))"; } public String _ioHic() { return _jRT() + ".sockRTs.get(impl)"; } public String _saveJRTHic(String ioHicValue) { return _block( ioHicValue ); } @Override public boolean needInstrument(String className) { return className != null && ( className.equals("java/net/SocketInputStream") | className.equals("java/net/SocketOutputStream")); } @Override public String preCode(String methodName) { if (methodName == null) { return null; } if (methodName.equals("java.net.SocketInputStream.read(byte[],int,int,int)")) { return _debugWraps( Accumulator._readBefore(_jRT(), _ioHic()) ); } if (methodName.equals("java.net.SocketOutputStream.write(byte[],int,int)")) { return _debugWraps( Accumulator._writeBefore(_jRT(), _ioHic()) ); } return null; } @Override public String postCode(String methodName) { if (methodName == null) { return null; } if (methodName.equals("java.net.SocketInputStream(java.net.AbstractPlainSocketImpl)") || methodName.equals("java.net.SocketOutputStream(java.net.AbstractPlainSocketImpl)")) { return _debugWraps( _saveJRTHic( Accumulator._filter(_jRT(), "impl", "impl.getInetAddress()", "impl.getPort()", "impl.getLocalPort()") ) ); } if (methodName.equals("java.net.SocketInputStream.read(byte[],int,int,int)")) { return _debugWraps( Accumulator._readAfter(_jRT(), _ioHic()) ); } if (methodName.equals("java.net.SocketOutputStream.write(byte[],int,int)")) { return _debugWraps( Accumulator._writeAfter(_jRT(), _ioHic()) ); } return null; } @Override public Iterable<String> classNewFields(String className) { return Collections.emptyList(); } @Override public void init(JRT jRT) { this.jRT = jRT; } }