X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;ds=inline;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Flibrary%2FRemoteLibrary.java;h=a6c68546882c0cdd64bda6c7592976d228bdfb4d;hb=b8564025bd7c722084c665f7a0a54beda8ef8209;hp=f1ff214d5671f3cf52bc4a82e1472a2d9b9e414f;hpb=210465c33ff5e9b45e7afe808c18b23c4cf14b38;p=nikiroo-utils.git
diff --git a/src/be/nikiroo/fanfix/library/RemoteLibrary.java b/src/be/nikiroo/fanfix/library/RemoteLibrary.java
index f1ff214..a6c6854 100644
--- a/src/be/nikiroo/fanfix/library/RemoteLibrary.java
+++ b/src/be/nikiroo/fanfix/library/RemoteLibrary.java
@@ -25,6 +25,29 @@ import be.nikiroo.utils.serial.server.ConnectActionClientObject;
* @author niki
*/
public class RemoteLibrary extends BasicLibrary {
+ interface RemoteAction {
+ public void action(ConnectActionClientObject action) throws Exception;
+ }
+
+ class RemoteConnectAction extends ConnectActionClientObject {
+ public RemoteConnectAction() throws IOException {
+ super(host, port, key);
+ }
+
+ @Override
+ public Object send(Object data) throws IOException,
+ NoSuchFieldException, NoSuchMethodException,
+ ClassNotFoundException {
+ Object rep = super.send(data);
+ if (rep instanceof RemoteLibraryException) {
+ RemoteLibraryException remoteEx = (RemoteLibraryException) rep;
+ throw remoteEx.unwrapException();
+ }
+
+ return rep;
+ }
+ }
+
private String host;
private int port;
private final String key;
@@ -33,8 +56,6 @@ public class RemoteLibrary extends BasicLibrary {
// informative only (server will make the actual checks)
private boolean rw;
- // TODO: error handling is not up to par!
-
/**
* Create a {@link RemoteLibrary} linked to the given server.
*
@@ -98,7 +119,7 @@ public class RemoteLibrary extends BasicLibrary {
@Override
public String getLibraryName() {
- return host + ":" + port;
+ return (rw ? "[READ-ONLY] " : "") + host + ":" + port;
}
@Override
@@ -109,33 +130,23 @@ public class RemoteLibrary extends BasicLibrary {
return status;
}
- private boolean check() {
- Status status = getStatusDo();
- if (status != Status.READY) {
- Instance.getTraceHandler().error("Remote lib not ready: " + status);
- return false;
- }
-
- return true;
- }
-
private Status getStatusDo() {
final Status[] result = new Status[1];
result[0] = Status.INVALID;
try {
- new ConnectActionClientObject(host, port, key) {
+ new RemoteConnectAction() {
@Override
public void action(Version serverVersion) throws Exception {
Object rep = send(new Object[] { subkey, "PING" });
if ("r/w".equals(rep)) {
rw = true;
- result[0] = Status.READY;
+ result[0] = Status.READ_WRITE;
} else if ("r/o".equals(rep)) {
rw = false;
- result[0] = Status.READY;
+ result[0] = Status.READ_ONLY;
} else {
result[0] = Status.UNAUTHORIZED;
}
@@ -162,141 +173,87 @@ public class RemoteLibrary extends BasicLibrary {
}
@Override
- public Image getCover(final String luid) {
- if (!check()) {
- return null;
- }
-
+ public Image getCover(final String luid) throws IOException {
final Image[] result = new Image[1];
- try {
- new ConnectActionClientObject(host, port, key) {
- @Override
- public void action(Version serverVersion) throws Exception {
- Object rep = send(new Object[] { subkey, "GET_COVER", luid });
- result[0] = (Image) rep;
- }
-
- @Override
- protected void onError(Exception e) {
- if (e instanceof SSLException) {
- Instance.getTraceHandler().error(
- "Connection refused (bad key)");
- } else {
- Instance.getTraceHandler().error(e);
- }
- }
- }.connect();
- } catch (Exception e) {
- Instance.getTraceHandler().error(e);
- }
+ connectRemoteAction(new RemoteAction() {
+ @Override
+ public void action(ConnectActionClientObject action)
+ throws Exception {
+ Object rep = action.send(new Object[] { subkey, "GET_COVER",
+ luid });
+ result[0] = (Image) rep;
+ }
+ });
return result[0];
}
@Override
- public Image getCustomSourceCover(final String source) {
- if (!check()) {
- return null;
- }
-
+ public Image getCustomSourceCover(final String source) throws IOException {
return getCustomCover(source, "SOURCE");
}
@Override
- public Image getCustomAuthorCover(final String author) {
- if (!check()) {
- return null;
- }
-
+ public Image getCustomAuthorCover(final String author) throws IOException {
return getCustomCover(author, "AUTHOR");
}
// type: "SOURCE" or "AUTHOR"
- private Image getCustomCover(final String source, final String type) {
- if (!check()) {
- return null;
- }
-
+ private Image getCustomCover(final String source, final String type)
+ throws IOException {
final Image[] result = new Image[1];
- try {
- new ConnectActionClientObject(host, port, key) {
- @Override
- public void action(Version serverVersion) throws Exception {
- Object rep = send(new Object[] { subkey,
- "GET_CUSTOM_COVER", type, source });
- result[0] = (Image) rep;
- }
-
- @Override
- protected void onError(Exception e) {
- if (e instanceof SSLException) {
- Instance.getTraceHandler().error(
- "Connection refused (bad key)");
- } else {
- Instance.getTraceHandler().error(e);
- }
- }
- }.connect();
- } catch (Exception e) {
- Instance.getTraceHandler().error(e);
- }
+ connectRemoteAction(new RemoteAction() {
+ @Override
+ public void action(ConnectActionClientObject action)
+ throws Exception {
+ Object rep = action.send(new Object[] { subkey,
+ "GET_CUSTOM_COVER", type, source });
+ result[0] = (Image) rep;
+ }
+ });
return result[0];
}
@Override
- public synchronized Story getStory(final String luid, Progress pg) {
- if (!check()) {
- return null;
- }
-
+ public synchronized Story getStory(final String luid, Progress pg)
+ throws IOException {
final Progress pgF = pg;
final Story[] result = new Story[1];
- try {
- new ConnectActionClientObject(host, port, key) {
- @Override
- public void action(Version serverVersion) throws Exception {
- Progress pg = pgF;
- if (pg == null) {
- pg = new Progress();
- }
-
- Object rep = send(new Object[] { subkey, "GET_STORY", luid });
+ connectRemoteAction(new RemoteAction() {
+ @Override
+ public void action(ConnectActionClientObject action)
+ throws Exception {
+ Progress pg = pgF;
+ if (pg == null) {
+ pg = new Progress();
+ }
- MetaData meta = null;
- if (rep instanceof MetaData) {
- meta = (MetaData) rep;
- if (meta.getWords() <= Integer.MAX_VALUE) {
- pg.setMinMax(0, (int) meta.getWords());
- }
- }
+ Object rep = action.send(new Object[] { subkey, "GET_STORY",
+ luid });
- List