Hello Bruno,

I have changed the DefaultTcpTransportMapping to support your below stated 
requirements in SNMP4J 2.6.0.

Best regards,
Frank

> On 26. Jan 2018, at 19:10, Bruno Abreu <bruno.ab...@livingdata.pt> wrote:
> 
> Hello again,
> 
> first of all, thank you for you quick reply to our previous post regarding
> SocketTimeout: http://oosnmp.net/pipermail/snmp4j/2018-January/005886.html
> 
> Now we have another request. As already stated, we are using SNMP4J to handle
> the NTCIP-PMPP protocol. But we have specific needs when reading messages from
> a particular device. Namely, because some characters might be escaped, we need
> to keep reading until the end mark is reached. The strategy of using the
> length from the message header just doesn't work because the message size
> might have changed.
> 
> For that we need to extend the DefaultTcpTransportMapping and
> DefaultTcpTransportMapping.ServerThread classes and override the following
> methods:
> 
> From DefaultTcpTransportMapping:
> - private void addBufferToReadBuffer(SocketEntry entry, ByteBuffer 
> byteBuffer);
> 
> From DefaultTcpTransportMapping.ServerThread:
> - private boolean readMessage(SelectionKey sk, SocketChannel readChannel,
> TcpAddress incomingAddress) throws IOException;
> - private void readSnmpMessagePayload(SocketChannel readChannel, TcpAddress
> incomingAddress, SocketEntry entry, ByteBuffer byteBuffer) throws IOException;
> 
> In order to this we had to change the visibility of some of the members of
> these classes, either because we want to override them or because they are
> accessed from the overriden methods. The following patch contains the changes
> we had to apply to DefaultTcpTransportMapping:
> 
> «««
> --- DefaultTcpTransportMapping.java.2.5.11    2018-01-26 11:36:14.019589314 
> +0000
> +++ DefaultTcpTransportMapping.java   2018-01-26 13:47:50.000000000 +0000
> @@ -62,17 +62,17 @@ public class DefaultTcpTransportMapping
>   private static final LogAdapter logger =
>       LogFactory.getLogger(DefaultTcpTransportMapping.class);
> 
> -  private Map<Address, SocketEntry> sockets = new Hashtable<Address,
> SocketEntry>();
> -  private WorkerTask server;
> -  private ServerThread serverThread;
> +  protected Map<Address, SocketEntry> sockets = new Hashtable<Address,
> SocketEntry>();
> +  protected WorkerTask server;
> +  protected ServerThread serverThread;
> 
> -  private CommonTimer socketCleaner;
> +  protected CommonTimer socketCleaner;
>   // 1 minute default timeout
> -  private long connectionTimeout = 60000;
> +  protected long connectionTimeout = 60000;
>   private boolean serverEnabled = false;
> 
>   private static final int MIN_SNMP_HEADER_LENGTH = 6;
> -  private MessageLengthDecoder messageLengthDecoder =
> +  protected MessageLengthDecoder messageLengthDecoder =
>       new SnmpMesssageLengthDecoder();
>   private int maxBusyLoops = DEFAULT_MAX_BUSY_LOOPS;
> 
> @@ -603,12 +603,12 @@ public class DefaultTcpTransportMapping
>     }
>   }
> 
> -  class ServerThread implements WorkerTask {
> -    private byte[] buf;
> +  protected class ServerThread implements WorkerTask {
> +    protected byte[] buf;
>     private volatile boolean stop = false;
>     private Throwable lastError = null;
>     private ServerSocketChannel ssc;
> -    private Selector selector;
> +    protected Selector selector;
> 
>     private LinkedList<SocketEntry> pending = new LinkedList<SocketEntry>();
> 
> @@ -993,7 +993,7 @@ public class DefaultTcpTransportMapping
>       }
>     }
> 
> -    private boolean readMessage(SelectionKey sk, SocketChannel readChannel,
> +    protected boolean readMessage(SelectionKey sk, SocketChannel readChannel,
>                                 TcpAddress incomingAddress) throws 
> IOException {
>       SocketEntry entry = (SocketEntry) sk.attachment();
>       if (entry == null) {
> @@ -1075,7 +1075,7 @@ public class DefaultTcpTransportMapping
>       return false;
>     }
> 
> -    private void readSnmpMessagePayload(SocketChannel readChannel, TcpAddress
> incomingAddress,
> +    protected void readSnmpMessagePayload(SocketChannel readChannel,
> TcpAddress incomingAddress,
>                                         SocketEntry entry, ByteBuffer
> byteBuffer) throws IOException {
>       MessageLength messageLength =
>           
> messageLengthDecoder.getMessageLength(ByteBuffer.wrap(byteBuffer.array()));
> @@ -1142,7 +1142,7 @@ public class DefaultTcpTransportMapping
>       }
>     }
> 
> -    private void dispatchMessage(TcpAddress incomingAddress,
> +    protected void dispatchMessage(TcpAddress incomingAddress,
>                                  ByteBuffer byteBuffer, long bytesRead,
>                                  Object sessionID) {
>       byteBuffer.flip();
> @@ -1225,7 +1225,7 @@ public class DefaultTcpTransportMapping
>     }
>   }
> 
> -  private void addBufferToReadBuffer(SocketEntry entry, ByteBuffer 
> byteBuffer) {
> +  protected void addBufferToReadBuffer(SocketEntry entry, ByteBuffer
> byteBuffer) {
>     if (logger.isDebugEnabled()) {
>       logger.debug("Adding data "+byteBuffer+" to read buffer
> "+entry.getReadBuffer());
>     }
> @@ -1243,7 +1243,7 @@ public class DefaultTcpTransportMapping
>     }
>   }
> 
> -  private void socketClosedRemotely(SelectionKey sk, SocketChannel
> readChannel, TcpAddress incomingAddress) throws IOException {
> +  protected void socketClosedRemotely(SelectionKey sk, SocketChannel
> readChannel, TcpAddress incomingAddress) throws IOException {
>     logger.debug("Socket closed remotely");
>     sk.cancel();
>     readChannel.close();
> »»»
> 
> 
> So, our question is: are these visibility changes something you'd consider
> applying in a future release of SNMP4J?
> 
> In any case, thank you very much for your attention,
> Bruno Abreu
> 
> -- 
> Living Data - Sistemas de Informação e Apoio à Decisão, Lda.
> LxFactory - Rua Rodrigues de Faria, 103, edifício I, 4º piso
> 1300-501 LISBOA                       Phone:  +351 213622163
> Portugal                              URL: www.livingdata.pt
> 
> 
> _______________________________________________
> SNMP4J mailing list
> SNMP4J@agentpp.org
> https://oosnmp.net/mailman/listinfo/snmp4j

_______________________________________________
SNMP4J mailing list
SNMP4J@agentpp.org
https://oosnmp.net/mailman/listinfo/snmp4j

Reply via email to