/* A UI subcomponent for loading a wiki version from a WORM Archive in Freenet. * * Copyright (C) 2010, 2011 Darrell Karbott * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2.0 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author: djk@isFiaD04zgAgnrEC5XJt1i4IE7AkNPqhBG5bONi6Yks * * This file was developed as component of * "fniki" (a wiki implementation running over Freenet). */ package fniki.wiki.child; import java.io.IOException; import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; import static ys.wikiparser.Utils.*; import static fniki.wiki.HtmlUtils.*; import fniki.wiki.ArchiveManager; import fniki.wiki.ChildContainer; import fniki.wiki.ChildContainerException; import fniki.wiki.WikiContext; public class LoadingArchive extends AsyncTaskContainer { private String mUri; private boolean mSecondary = false; public LoadingArchive(ArchiveManager archiveManager) { super(archiveManager); } public String handle(WikiContext context) throws ChildContainerException { try { if (context.getQuery().get("uri") != null && mUri == null) { mUri = context.getQuery().get("uri"); System.err.println("handle -- set uri: " + mUri); } if (context.getQuery().get("secondary") != null) { mSecondary = context.getQuery().get("secondary").toLowerCase().equals("true"); System.err.println("handle -- set secondary true"); } if (context.getAction().equals("confirm")) { if (mUri != null) { startTask(); sendRedirect(context, context.getPath()); return "Unreachable code"; } } boolean showBuffer = false; boolean showUri = false; String confirmTitle = null; String cancelTitle = null; String title = null; switch (getState()) { case STATE_WORKING: showBuffer = true; title = "Loading Archive: " + mUri;; cancelTitle = "Cancel"; break; case STATE_WAITING: showBuffer = false; showUri = true; title = "Confirm Load"; confirmTitle = "Load"; cancelTitle = "Cancel"; break; case STATE_SUCCEEDED: showBuffer = true; title = "Archive Loaded: " + mUri; cancelTitle = "Done"; break; case STATE_FAILED: showBuffer = true; title = "Archive Load Failed"; confirmTitle = "Retry"; cancelTitle = "Done"; break; } StringWriter buffer = new StringWriter(); PrintWriter body = new PrintWriter(buffer); body.println("<html><head>" + metaRefresh() + "<title>" + escapeHTML(title) + "</title></head><body>"); if (getState() == STATE_WORKING || getState() == STATE_SUCCEEDED) { if (getState() == STATE_WORKING) { title = "Loading Archive:"; // Don't put full uri in header } else { title = "Loaded Archive."; } } body.println("<h3>" + escapeHTML(title) + "</h3>"); if (showUri) { String secondary = mSecondary ? "Secondary Archive " : ""; body.println(escapeHTML(String.format("Load %sVersion: %s", secondary, getVersionHex(mUri)))); body.println("<br>"); body.println(escapeHTML("from: " + mUri)); body.println("<p>Clicking Load will discard any unsubmitted local changes.</p>"); } else if (getState() == STATE_WORKING || getState() == STATE_SUCCEEDED) { body.println(escapeHTML(mUri)); } if (showBuffer) { body.println("<pre>"); body.print(escapeHTML(getOutput())); body.println("</pre>"); } addButtonsHtml(context, body, confirmTitle, cancelTitle); body.println("</body></html>"); body.close(); return buffer.toString(); } catch (IOException ioe) { context.logError("Loading Archive", ioe); context.raiseServerError("LoadingArchive.handle coding error. Sorry :-("); return "unreachable code"; } } public boolean doWork(PrintStream out) throws Exception { if (mUri == null) { out.println("The request uri isn't set"); return false; } try { String msg = ""; if (mSecondary) { msg = " secondary archive."; } out.println(String.format("Loading%s. Please be patient...", msg)); mArchiveManager.load(mUri, mSecondary); out.println("Loaded " + mUri); return true; } catch (IOException ioe) { out.println("Load failed from background thread: " + ioe.getMessage()); return false; } } public void entered(WikiContext context) { mUri = null; mSecondary = false; } }