Merge pull request #9 from GideonLeGrange/2.0.0

2.0.0
This commit is contained in:
Gideon le Grange 2014-08-29 08:23:19 +02:00
commit e7bb8a4f42
7 changed files with 64 additions and 54 deletions

View File

@ -16,6 +16,10 @@ The current stable version is 1.1.6, which managed to get into Maven Central.
* 1.1.2 added support for handling multi-line results, like for example /file print. * 1.1.2 added support for handling multi-line results, like for example /file print.
* 1.1 added TLS (SSL) support to encrypt API traffic. * 1.1 added TLS (SSL) support to encrypt API traffic.
The latest development version is 2.0.0 which is available using the 2.0.0 branch.
* Changed ResultListener to receive errors and completion notifications.
Getting the API Getting the API
--------------- ---------------
@ -116,7 +120,7 @@ Asynchronous commands
We can run some commands asynchronously in order to continue receiving updates: We can run some commands asynchronously in order to continue receiving updates:
This example shows how to run '/interface wireless monitor' and have the result sent to a listener object, which prints it This example shows how to run '/interface wireless monitor' and have the result sent to a listener object, which prints it:
```java ```java
String tag = con.execute("/interface/wireless/monitor .id=wlan1 return signal-to-noise", String tag = con.execute("/interface/wireless/monitor .id=wlan1 return signal-to-noise",
@ -126,6 +130,14 @@ String tag = con.execute("/interface/wireless/monitor .id=wlan1 return signal-to
System.out.println(result); System.out.println(result);
} }
public void error(MikrotikApiException e) {
System.out.println("An error occurred: " + e.getMessage());
}
public void completed() {
System.out.println("Asynchronous command has finished");
}
} }
); );
``` ```
@ -136,6 +148,8 @@ The above command will run and send results asynchronously as they become availa
con.cancel(tag); con.cancel(tag);
``` ```
From version 2.0.0 of the API the error() and completed() methods are part of the ResultListener interface.
References References
========== ==========

View File

@ -7,7 +7,7 @@ package examples;
public class Config { public class Config {
public static final String HOST = "10.0.1.134"; public static final String HOST = "10.0.1.1";
public static final String USERNAME = "admin"; public static final String USERNAME = "admin";
public static final String PASSWORD = ""; public static final String PASSWORD = "";

View File

@ -19,14 +19,24 @@ public class Example4 extends Example {
} }
private void test() throws MikrotikApiException, InterruptedException { private void test() throws MikrotikApiException, InterruptedException {
String id = con.execute("/interface/wireless/monitor .id=wlan1", new ResultListener() { String id = con.execute("/interface/wireless/monitor .id=wlan1 .proplist=signal-strength", new ResultListener() {
private int prev = 0; private int prev = 0;
public void receive(Map<String, String> result) { public void receive(Map<String, String> result) {
int val = Integer.parseInt(result.get("signal-strength")); System.out.println(result);
/* int val = Integer.parseInt(result.get("signal-strength"));
String sym = (val == prev) ? " " : ((val < prev) ? "-" : "+"); String sym = (val == prev) ? " " : ((val < prev) ? "-" : "+");
System.out.printf("%d %s\n", val, sym); System.out.printf("%d %s\n", val, sym);
prev = val; prev = val;
*/ }
@Override
public void error(MikrotikApiException ex) {
throw new RuntimeException(ex.getMessage(), ex);
}
@Override
public void completed() {
} }

View File

@ -2,7 +2,7 @@ package examples;
import java.util.Map; import java.util.Map;
import me.legrange.mikrotik.MikrotikApiException; import me.legrange.mikrotik.MikrotikApiException;
import me.legrange.mikrotik.ResponseListener; import me.legrange.mikrotik.ResultListener;
/** /**
* Example 5: Asynchronous results, with error and completion. Run a command and receive results, errors and completion notification for it asynchronously with a ResponseListener * Example 5: Asynchronous results, with error and completion. Run a command and receive results, errors and completion notification for it asynchronously with a ResponseListener
@ -20,7 +20,7 @@ public class Example5 extends Example {
private void test() throws MikrotikApiException, InterruptedException { private void test() throws MikrotikApiException, InterruptedException {
boolean completed = false; boolean completed = false;
String id = con.execute("/interface/wireless/monitor .id=wlan1", new ResponseListener() { String id = con.execute("/interface/wireless/monitor .id=wlan1", new ResultListener() {
private int prev = 0; private int prev = 0;
public void receive(Map<String, String> result) { public void receive(Map<String, String> result) {

View File

@ -1,17 +0,0 @@
package me.legrange.mikrotik;
/**
* A listener that receives life cycle command events from the Mikrotik API,
* and not just results.
* @author GideonLeGrange
*/
public interface ResponseListener extends ResultListener {
/** called if the command associated with this listener experiences an error */
void error(MikrotikApiException ex);
/** called when the command associated with this listener is done */
void completed();
}

View File

@ -10,4 +10,11 @@ public interface ResultListener {
void receive(Map<String, String> result); void receive(Map<String, String> result);
/** called if the command associated with this listener experiences an error
* @param ex Exception encountered */
void error(MikrotikApiException ex);
/** called when the command associated with this listener is done */
void completed();
} }

View File

@ -33,7 +33,8 @@ public final class ApiConnectionImpl extends ApiConnection {
* @param port The TCP port to use. * @param port The TCP port to use.
* @param secure Is TLS required * @param secure Is TLS required
* @return The ApiConnection * @return The ApiConnection
* @throws me.legrange.mikrotik.ApiConnectionException Thrown if there is a problem connecting * @throws me.legrange.mikrotik.ApiConnectionException Thrown if there is a
* problem connecting
*/ */
public static ApiConnection connect(String host, int port, boolean secure) throws ApiConnectionException { public static ApiConnection connect(String host, int port, boolean secure) throws ApiConnectionException {
ApiConnectionImpl con = new ApiConnectionImpl(); ApiConnectionImpl con = new ApiConnectionImpl();
@ -53,7 +54,9 @@ public final class ApiConnectionImpl extends ApiConnection {
/** /**
* Disconnect from the remote API * Disconnect from the remote API
* @throws me.legrange.mikrotik.ApiConnectionException Thrown if there is a problem disconnecting *
* @throws me.legrange.mikrotik.ApiConnectionException Thrown if there is a
* problem disconnecting
*/ */
@Override @Override
public void disconnect() throws ApiConnectionException { public void disconnect() throws ApiConnectionException {
@ -284,22 +287,15 @@ public final class ApiConnectionImpl extends ApiConnection {
if (l != null) { if (l != null) {
if (res instanceof Result) { if (res instanceof Result) {
l.receive((Result) res); l.receive((Result) res);
} else { } else if (res instanceof Done) {
if (res instanceof Done) { if (l instanceof SyncListener) {
listeners.remove(res.getTag()); ((SyncListener) l).completed((Done) res);
} } else {
if (l instanceof ResponseListener) { l.completed();
ResponseListener rl = (ResponseListener) l;
if (res instanceof Done) {
if (rl instanceof SyncListener) {
((SyncListener) rl).completed((Done) res);
} else {
rl.completed();
}
} else if (res instanceof Error) {
rl.error(new ApiCommandException((Error) res));
}
} }
listeners.remove(res.getTag());
} else if (res instanceof Error) {
l.error(new ApiCommandException((Error) res));
} }
} }
} }
@ -322,16 +318,17 @@ public final class ApiConnectionImpl extends ApiConnection {
if (line == null) { if (line == null) {
nextLine(); nextLine();
} }
if (line.equals("!re")) { switch (line) {
return unpackRe(); case "!re":
} else if (line.equals("!done")) { return unpackRe();
return unpackDone(); case "!done":
} else if (line.equals("!trap")) { return unpackDone();
return unpackError(); case "!trap":
} else if (line.equals("!halt")) { return unpackError();
return unpackError(); case "!halt":
} else { return unpackError();
throw new ApiDataException(String.format("Unexpected line '%s'", line)); default:
throw new ApiDataException(String.format("Unexpected line '%s'", line));
} }
} }
@ -346,8 +343,7 @@ public final class ApiConnectionImpl extends ApiConnection {
if (parts.length == 3) { if (parts.length == 3) {
if (!parts[2].endsWith("\r")) { if (!parts[2].endsWith("\r")) {
res.put(parts[1], parts[2]); res.put(parts[1], parts[2]);
} } else {
else {
res.put(parts[1], unpackMultiLine(parts[2])); res.put(parts[1], unpackMultiLine(parts[2]));
} }
} else { } else {
@ -451,7 +447,7 @@ public final class ApiConnectionImpl extends ApiConnection {
private String line; private String line;
} }
private class SyncListener implements ResponseListener { private class SyncListener implements ResultListener {
public synchronized void error(MikrotikApiException ex) { public synchronized void error(MikrotikApiException ex) {
this.err = ex; this.err = ex;