X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Flibrary%2FRemoteLibraryServer.java;h=4ee3f74d221c3497978cc57d70fc935fd466579f;hb=a5d1f0e6320710cc4c8163adf2dc402e8f05fb96;hp=7d5a0ae10d988f1a79f52f7732dfb0411e5f057e;hpb=e1de8087ab1623f7624018af905ea3bb0ef45802;p=fanfix.git diff --git a/src/be/nikiroo/fanfix/library/RemoteLibraryServer.java b/src/be/nikiroo/fanfix/library/RemoteLibraryServer.java deleted file mode 100644 index 7d5a0ae..0000000 --- a/src/be/nikiroo/fanfix/library/RemoteLibraryServer.java +++ /dev/null @@ -1,328 +0,0 @@ -package be.nikiroo.fanfix.library; - -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import be.nikiroo.fanfix.Instance; -import be.nikiroo.fanfix.data.Chapter; -import be.nikiroo.fanfix.data.MetaData; -import be.nikiroo.fanfix.data.Paragraph; -import be.nikiroo.fanfix.data.Story; -import be.nikiroo.utils.Progress; -import be.nikiroo.utils.Progress.ProgressListener; -import be.nikiroo.utils.StringUtils; -import be.nikiroo.utils.Version; -import be.nikiroo.utils.serial.server.ConnectActionServerObject; -import be.nikiroo.utils.serial.server.ServerObject; - -/** - * Create a new remote server that will listen for order on the given port. - *

- * The available commands are given as arrays of objects (first item is the key, - * second is the command, the rest are the arguments). - *

- * The md5 is always a String (the MD5 hash of the access key), the commands are - * also Strings; the parameters vary depending upon the command. - *

- * - * @author niki - */ -public class RemoteLibraryServer extends ServerObject { - private final String md5; - - /** - * Create a new remote server (will not be active until - * {@link RemoteLibraryServer#start()} is called). - * - * @param key - * the key that will restrict access to this server - * @param port - * the port to listen on - * - * @throws IOException - * in case of I/O error - */ - public RemoteLibraryServer(String key, int port) throws IOException { - super("Fanfix remote library", port, true); - this.md5 = StringUtils.getMd5Hash(key); - - setTraceHandler(Instance.getTraceHandler()); - } - - @Override - protected Object onRequest(ConnectActionServerObject action, - Version clientVersion, Object data) throws Exception { - String md5 = ""; - String command = ""; - Object[] args = new Object[0]; - if (data instanceof Object[]) { - Object[] dataArray = (Object[]) data; - if (dataArray.length >= 2) { - md5 = "" + dataArray[0]; - command = "" + dataArray[1]; - - args = new Object[dataArray.length - 2]; - for (int i = 2; i < dataArray.length; i++) { - args[i - 2] = dataArray[i]; - } - } - } - - String trace = "[" + command + "] "; - for (Object arg : args) { - trace += arg + " "; - } - getTraceHandler().trace(trace); - - if (!md5.equals(this.md5)) { - getTraceHandler().trace("Key rejected."); - return null; - } - - if ("PING".equals(command)) { - return "PONG"; - } else if ("GET_METADATA".equals(command)) { - if ("*".equals(args[0])) { - Progress pg = createPgForwarder(action); - List metas = Instance.getLibrary().getMetas(pg); - forcePgDoneSent(pg); - return metas.toArray(new MetaData[] {}); - } - - return new MetaData[] { Instance.getLibrary().getInfo( - (String) args[0]) }; - } else if ("GET_STORY".equals(command)) { - MetaData meta = Instance.getLibrary().getInfo((String) args[0]); - meta = meta.clone(); - meta.setCover(null); - - action.send(meta); - action.rec(); - - Story story = Instance.getLibrary() - .getStory((String) args[0], null); - for (Object obj : breakStory(story)) { - action.send(obj); - action.rec(); - } - } else if ("SAVE_STORY".equals(command)) { - List list = new ArrayList(); - - action.send(null); - Object obj = action.rec(); - while (obj != null) { - list.add(obj); - action.send(null); - obj = action.rec(); - } - - Story story = rebuildStory(list); - Instance.getLibrary().save(story, (String) args[0], null); - return story.getMeta().getLuid(); - } else if ("IMPORT".equals(command)) { - Progress pg = createPgForwarder(action); - Story story = Instance.getLibrary().imprt( - new URL((String) args[0]), pg); - forcePgDoneSent(pg); - return story.getMeta().getLuid(); - } else if ("DELETE_STORY".equals(command)) { - Instance.getLibrary().delete((String) args[0]); - } else if ("GET_COVER".equals(command)) { - return Instance.getLibrary().getCover((String) args[0]); - } else if ("GET_CUSTOM_SOURCE_COVER".equals(command)) { - return Instance.getLibrary().getCustomSourceCover((String) args[0]); - } else if ("SET_SOURCE_COVER".equals(command)) { - Instance.getLibrary().setSourceCover((String) args[0], - (String) args[1]); - } else if ("CHANGE_SOURCE".equals(command)) { - Progress pg = createPgForwarder(action); - Instance.getLibrary().changeSource((String) args[0], - (String) args[1], pg); - forcePgDoneSent(pg); - } else if ("EXIT".equals(command)) { - stop(0, false); - } - - return null; - } - - @Override - protected void onError(Exception e) { - getTraceHandler().error(e); - } - - /** - * Break a story in multiple {@link Object}s for easier serialisation. - * - * @param story - * the {@link Story} to break - * - * @return the list of {@link Object}s - */ - static List breakStory(Story story) { - List list = new ArrayList(); - - story = story.clone(); - list.add(story); - - if (story.getMeta().isImageDocument()) { - for (Chapter chap : story) { - list.add(chap); - list.addAll(chap.getParagraphs()); - chap.setParagraphs(new ArrayList()); - } - story.setChapters(new ArrayList()); - } - - return list; - } - - /** - * Rebuild a story from a list of broke up {@link Story} parts. - * - * @param list - * the list of {@link Story} parts - * - * @return the reconstructed {@link Story} - */ - static Story rebuildStory(List list) { - Story story = null; - Chapter chap = null; - - for (Object obj : list) { - if (obj instanceof Story) { - story = (Story) obj; - } else if (obj instanceof Chapter) { - chap = (Chapter) obj; - story.getChapters().add(chap); - } else if (obj instanceof Paragraph) { - chap.getParagraphs().add((Paragraph) obj); - } - } - - return story; - } - - /** - * Update the {@link Progress} with the adequate {@link Object} received - * from the network via {@link RemoteLibraryServer}. - * - * @param pg - * the {@link Progress} to update - * @param rep - * the object received from the network - * - * @return TRUE if it was a progress event, FALSE if not - */ - static boolean updateProgress(Progress pg, Object rep) { - if (rep instanceof Integer[]) { - Integer[] a = (Integer[]) rep; - if (a.length == 3) { - int min = a[0]; - int max = a[1]; - int progress = a[2]; - - if (min >= 0 && min <= max) { - pg.setMinMax(min, max); - pg.setProgress(progress); - - return true; - } - } - } - - return false; - } - - /** - * Create a {@link Progress} that will forward its progress over the - * network. - * - * @param action - * the {@link ConnectActionServerObject} to use to forward it - * - * @return the {@link Progress} - */ - private static Progress createPgForwarder( - final ConnectActionServerObject action) { - final Boolean[] isDoneForwarded = new Boolean[] { false }; - final Progress pg = new Progress() { - @Override - public boolean isDone() { - return isDoneForwarded[0]; - } - }; - - final Integer[] p = new Integer[] { -1, -1, -1 }; - final Long[] lastTime = new Long[] { new Date().getTime() }; - pg.addProgressListener(new ProgressListener() { - @Override - public void progress(Progress progress, String name) { - int min = pg.getMin(); - int max = pg.getMax(); - int relativeProgress = min - + (int) Math.round(pg.getRelativeProgress() - * (max - min)); - - // Do not re-send the same value twice over the wire, - // unless more than 2 seconds have elapsed (to maintain the - // connection) - if ((p[0] != min || p[1] != max || p[2] != relativeProgress) - || (new Date().getTime() - lastTime[0] > 2000)) { - p[0] = min; - p[1] = max; - p[2] = relativeProgress; - - try { - action.send(new Integer[] { min, max, relativeProgress }); - action.rec(); - } catch (Exception e) { - Instance.getTraceHandler().error(e); - } - - isDoneForwarded[0] = pg.isDone(); - lastTime[0] = new Date().getTime(); - } - } - }); - - return pg; - } - - // with 30 seconds timeout - private static void forcePgDoneSent(Progress pg) { - long start = new Date().getTime(); - pg.done(); - while (!pg.isDone() && new Date().getTime() - start < 30000) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - Instance.getTraceHandler().error(e); - } - } - } -}