From 018c3a9380929a6a6de1116cb7c76a6e1204f483 Mon Sep 17 00:00:00 2001 From: clairtonluz Date: Sat, 25 Apr 2015 10:41:29 -0300 Subject: [PATCH 1/2] implementation of the try-with-resource added in Java 7 to close the connection automatically --- src/main/java/examples/Example.java | 4 ++- src/main/java/examples/Example10.java | 30 +++++++++++++++++++ .../me/legrange/mikrotik/ApiConnection.java | 4 ++- .../mikrotik/impl/ApiConnectionImpl.java | 9 ++++++ 4 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 src/main/java/examples/Example10.java diff --git a/src/main/java/examples/Example.java b/src/main/java/examples/Example.java index ff25eae..f7cc69e 100644 --- a/src/main/java/examples/Example.java +++ b/src/main/java/examples/Example.java @@ -5,12 +5,14 @@ import me.legrange.mikrotik.ApiConnection; /** * * @author gideon + * @author clairtonluz */ abstract class Example { - protected void connect() throws Exception { + protected ApiConnection connect() throws Exception { con = ApiConnection.connect(Config.HOST, ApiConnection.DEFAULT_PORT, 2000); con.login(Config.USERNAME, Config.PASSWORD); + return con; } protected void disconnect() throws Exception { diff --git a/src/main/java/examples/Example10.java b/src/main/java/examples/Example10.java new file mode 100644 index 0000000..f4be676 --- /dev/null +++ b/src/main/java/examples/Example10.java @@ -0,0 +1,30 @@ +package examples; + +import me.legrange.mikrotik.ApiConnection; +import me.legrange.mikrotik.MikrotikApiException; + +import java.util.List; +import java.util.Map; + +/** + * Example 10: The try-with-resources Statement + * + * @author clairtonluz + */ +public class Example10 extends Example { + + public static void main(String... args) throws Exception { + Example10 ex = new Example10(); + try (ApiConnection c = ex.connect()) { + ex.test(); + } + System.out.printf("\nisConnected = %B",ex.con.isConnected()); + } + + private void test() throws MikrotikApiException, InterruptedException { + List> res = con.execute("/interface/ethernet/print"); + for (Map r : res) { + System.out.println(r); + } + } +} diff --git a/src/main/java/me/legrange/mikrotik/ApiConnection.java b/src/main/java/me/legrange/mikrotik/ApiConnection.java index 47ac836..9a9517a 100644 --- a/src/main/java/me/legrange/mikrotik/ApiConnection.java +++ b/src/main/java/me/legrange/mikrotik/ApiConnection.java @@ -1,5 +1,6 @@ package me.legrange.mikrotik; +import java.io.Closeable; import java.util.List; import java.util.Map; import me.legrange.mikrotik.impl.ApiConnectionImpl; @@ -9,8 +10,9 @@ import me.legrange.mikrotik.impl.ApiConnectionImpl; * Mikrotik and send commands to it. * * @author GideonLeGrange + * @author clairtonluz */ -public abstract class ApiConnection { +public abstract class ApiConnection implements Closeable { /** default TCP port used by Mikrotik API */ public static final int DEFAULT_PORT = 8728; diff --git a/src/main/java/me/legrange/mikrotik/impl/ApiConnectionImpl.java b/src/main/java/me/legrange/mikrotik/impl/ApiConnectionImpl.java index 2fa6ae8..c962277 100644 --- a/src/main/java/me/legrange/mikrotik/impl/ApiConnectionImpl.java +++ b/src/main/java/me/legrange/mikrotik/impl/ApiConnectionImpl.java @@ -200,6 +200,15 @@ public final class ApiConnectionImpl extends ApiConnection { private Integer _tag = 0; private int timeout = ApiConnection.DEFAULT_COMMAND_TIMEOUT; + @Override + public void close() throws IOException { + try { + disconnect(); + } catch (ApiConnectionException e) { + throw new IOException(e.getMessage(), e.getCause()); + } + } + /** * thread to read data from the socket and process it into Strings */ From 9b7536461771b22b9f9a19482ca5b0996517addc Mon Sep 17 00:00:00 2001 From: clairtonluz Date: Mon, 27 Apr 2015 19:55:14 -0300 Subject: [PATCH 2/2] replacing Closeable to AutoCloseable --- .../me/legrange/mikrotik/ApiConnection.java | 102 +++++++++++------- .../mikrotik/impl/ApiConnectionImpl.java | 8 +- 2 files changed, 64 insertions(+), 46 deletions(-) diff --git a/src/main/java/me/legrange/mikrotik/ApiConnection.java b/src/main/java/me/legrange/mikrotik/ApiConnection.java index 9a9517a..23955b9 100644 --- a/src/main/java/me/legrange/mikrotik/ApiConnection.java +++ b/src/main/java/me/legrange/mikrotik/ApiConnection.java @@ -1,9 +1,9 @@ package me.legrange.mikrotik; -import java.io.Closeable; +import me.legrange.mikrotik.impl.ApiConnectionImpl; + import java.util.List; import java.util.Map; -import me.legrange.mikrotik.impl.ApiConnectionImpl; /** * The Mikrotik API connection. This is the class used to connect to a remote @@ -12,46 +12,57 @@ import me.legrange.mikrotik.impl.ApiConnectionImpl; * @author GideonLeGrange * @author clairtonluz */ -public abstract class ApiConnection implements Closeable { - - /** default TCP port used by Mikrotik API */ +public abstract class ApiConnection implements AutoCloseable { + + /** + * default TCP port used by Mikrotik API + */ public static final int DEFAULT_PORT = 8728; - /** default TCP TLS port used by Mikrotik API */ + /** + * default TCP TLS port used by Mikrotik API + */ public static final int DEFAULT_TLS_PORT = 8729; - /** default connection timeout to use when opening the connection */ + /** + * default connection timeout to use when opening the connection + */ public static final int DEFAULT_CONNECTION_TIMEOUT = 60000; - /** default command timeout used for synchronous commands */ + /** + * default command timeout used for synchronous commands + */ public static final int DEFAULT_COMMAND_TIMEOUT = 60000; - + /** * Create a new API connection to the give device on the supplied port, using anonymous TLS for encryption. - * @param host The host to which to connect. - * @param port The TCP port to use. + * + * @param host The host to which to connect. + * @param port The TCP port to use. * @param timeout The connection timeout to use when opening the connection. - * @return The ApiConnection + * @return The ApiConnection * @throws me.legrange.mikrotik.MikrotikApiException Thrown if there is a problem connecting */ public static ApiConnection connectTLS(String host, int port, int timeout) throws MikrotikApiException { return ApiConnectionImpl.connect(host, port, true, timeout); } - + /** * Create a new API connection to the give device on the supplied port, using anonymous TLS for encryption. + * * @param host The host to which to connect. * @param port The TCP port to use. - * @return The ApiConnection + * @return The ApiConnection * @throws me.legrange.mikrotik.MikrotikApiException Thrown if there is a problem connecting */ public static ApiConnection connectTLS(String host, int port) throws MikrotikApiException { return ApiConnectionImpl.connect(host, port, true, DEFAULT_CONNECTION_TIMEOUT); } - - + + /** - * Create a new API connection to the give device on the default API port, using anonymous TLS for encryption. + * Create a new API connection to the give device on the default API port, using anonymous TLS for encryption. + * * @param host The host to which to connect. - * @return The ApiConnection + * @return The ApiConnection * @throws me.legrange.mikrotik.MikrotikApiException Thrown if there is a problem connecting */ public static ApiConnection connectTLS(String host) throws MikrotikApiException { @@ -60,10 +71,11 @@ public abstract class ApiConnection implements Closeable { /** * Create a new API connection to the give device on the supplied port - * @param host The host to which to connect. - * @param port The TCP port to use. + * + * @param host The host to which to connect. + * @param port The TCP port to use. * @param timeout The connection timeout to use when opening the connection. - * @return The ApiConnection + * @return The ApiConnection * @throws me.legrange.mikrotik.MikrotikApiException Thrown if there is a problem connecting */ public static ApiConnection connect(String host, int port, int timeout) throws MikrotikApiException { @@ -72,9 +84,10 @@ public abstract class ApiConnection implements Closeable { /** * Create a new API connection to the give device on the supplied port + * * @param host The host to which to connect. * @param port The TCP port to use. - * @return The ApiConnection + * @return The ApiConnection * @throws me.legrange.mikrotik.MikrotikApiException Thrown if there is a problem connecting */ public static ApiConnection connect(String host, int port) throws MikrotikApiException { @@ -83,11 +96,12 @@ public abstract class ApiConnection implements Closeable { /** * Create a new API connection to the give device on the default API port. + * * @param host The host to which to connect. - * @return The ApiConnection + * @return The ApiConnection * @throws me.legrange.mikrotik.MikrotikApiException Thrown if there is a problem connecting */ - public static ApiConnection connect(String host) throws MikrotikApiException { + public static ApiConnection connect(String host) throws MikrotikApiException { return connect(host, DEFAULT_PORT); } @@ -100,51 +114,59 @@ public abstract class ApiConnection implements Closeable { /** * Disconnect from the remote API + * * @throws me.legrange.mikrotik.MikrotikApiException Thrown if there is a problem disconnecting */ - public abstract void disconnect() throws MikrotikApiException; + public abstract void disconnect() throws MikrotikApiException; /** - * Log in to the remote router. + * Log in to the remote router. * * @param username - username of the user on the router * @param password - password for the user * @throws me.legrange.mikrotik.MikrotikApiException * @throws java.lang.InterruptedException */ - public abstract void login(String username, String password) throws MikrotikApiException, InterruptedException; + public abstract void login(String username, String password) throws MikrotikApiException, InterruptedException; - /** execute a command and return a list of results. + /** + * execute a command and return a list of results. + * * @param cmd Command to execute * @return The list of results * @throws me.legrange.mikrotik.MikrotikApiException */ public abstract List> execute(String cmd) throws MikrotikApiException; - /** execute a command and attach a result listener to receive it's results. - * + /** + * execute a command and attach a result listener to receive it's results. + * * @param cmd Command to execute * @param lis ResultListener that will receive the results * @return A command object that can be used to cancel the command. - * @throws MikrotikApiException + * @throws MikrotikApiException */ public abstract String execute(String cmd, ResultListener lis) throws MikrotikApiException; - /** cancel a command + /** + * cancel a command + * * @param tag The tag of the command to cancel - * @throws me.legrange.mikrotik.MikrotikApiException Thrown if there is a problem canceling the command */ + * @throws me.legrange.mikrotik.MikrotikApiException Thrown if there is a problem canceling the command + */ public abstract void cancel(String tag) throws MikrotikApiException; - - /** set the command timeout. The command timeout is used to time out API - * commands after a specific time. - * + + /** + * set the command timeout. The command timeout is used to time out API + * commands after a specific time. + *

* Note: This is not the same as the timeout value passed in the connect() and - * connectTLS() methods. This timeout is specific to synchronous commands, that + * connectTLS() methods. This timeout is specific to synchronous commands, that * timeout is applied to opening the API socket. - * + * * @param timeout The time out in milliseconds. - * @throws MikrotikApiException Thrown if the timeout specified is invalid. + * @throws MikrotikApiException Thrown if the timeout specified is invalid. */ public abstract void setTimeout(int timeout) throws MikrotikApiException; diff --git a/src/main/java/me/legrange/mikrotik/impl/ApiConnectionImpl.java b/src/main/java/me/legrange/mikrotik/impl/ApiConnectionImpl.java index c962277..1d0573e 100644 --- a/src/main/java/me/legrange/mikrotik/impl/ApiConnectionImpl.java +++ b/src/main/java/me/legrange/mikrotik/impl/ApiConnectionImpl.java @@ -201,12 +201,8 @@ public final class ApiConnectionImpl extends ApiConnection { private int timeout = ApiConnection.DEFAULT_COMMAND_TIMEOUT; @Override - public void close() throws IOException { - try { - disconnect(); - } catch (ApiConnectionException e) { - throw new IOException(e.getMessage(), e.getCause()); - } + public void close() throws ApiConnectionException { + disconnect(); } /**