Changeset dc343b0 for apps


Ignore:
Timestamp:
Nov 15, 2018 2:24:46 PM (20 months ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
62c712c
Parents:
6462e2a
Message:

MLab/NDT: Hook test to wizard
Make helper the session scope, not handler
Reduce whitespace in formhandler.jsi
Notes on why FormHandler? can't be session scope
Ajax still TODO

Location:
apps/routerconsole
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java

    r6462e2a rdc343b0  
    1818 * The form is "processed" after the properties are set and the first output
    1919 * property is retrieved - either getAll(), getNotices() or getErrors().
     20 *
     21 * This Handler will only process a single POST. The jsp bean must be declared scope=request.
    2022 *
    2123 */
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/WizardHandler.java

    r6462e2a rdc343b0  
    33import java.util.HashMap;
    44import java.util.Map;
    5 import java.util.concurrent.atomic.AtomicBoolean;
    6 
    7 import com.vuze.plugins.mlab.MLabRunner;
    85
    96import net.i2p.router.Router;
     
    1310/**
    1411 *  The new user wizard.
    15  *  This bean has SESSION scope so the results may be retrieved.
    16  *  All necessary methods are synchronized.
     12 *
     13 *  This handler has request scope (as all FormHandlers must), so it controls
     14 *  the test via the helper, which has session scope.
    1715 *
    1816 *  @since 0.9.38
     
    2018public class WizardHandler extends FormHandler {
    2119
    22     // session scope, but it's an underlying singleton
    23     private MLabRunner _mlab;
    24     // session scope
    25     private TestListener _listener;
     20    private WizardHelper _helper;
     21   
     22    /**
     23     *  Bind the helper (scope session) to this handler (scope request)
     24     */
     25    public void setWizardHelper(WizardHelper helper) {
     26        _helper = helper;
     27    }
    2628
    2729    @Override
    28     public void setContextId(String contextId) {
    29         super.setContextId(contextId);
    30         _mlab = MLabRunner.getInstance(_context);
    31     }
    32    
    33     @Override
    3430    protected void processForm() {
     31{
     32String page = getJettyString("page");
     33System.out.println("Action: " + _action + " page: " + page);
     34}
    3535        if (_action == null)
    3636            return;
     37        if (getJettyString("cancelbw") != null) {
     38            cancelNDT();
     39            return;
     40        }
    3741        if (getJettyString("next") == null)
    3842            return;
     
    4549                addFormNoticeNoEscape(_t("Console language saved."));
    4650            }
    47             if ("6".equals(page)) {
     51            if ("4".equals(page)) {
     52                startNDT();
     53            } else if ("6".equals(page)) {
    4854                Map<String, String> changes = new HashMap<String, String>();
    4955                boolean updated = updateRates(changes);
     
    117123    }
    118124
    119     public synchronized boolean isNDTComplete() {
    120         return _listener != null && _listener.isComplete();
    121     }
    122 
    123     public synchronized boolean isNDTRunning() {
    124         return _listener != null && !_listener.isComplete();
    125     }
    126 
    127     /**
    128      * @return status string or null
    129      */
    130     public synchronized String getCompletionStatus() {
    131         return _listener != null ? _listener.getSummary() : null;
    132     }
    133 
    134     /**
    135      * @return status string or null
    136      */
    137     public synchronized String getDetailStatus() {
    138         return _listener != null ? _listener.getDetail() : null;
    139     }
    140 
    141     /**
    142      * @return bytes per second or 0
    143      */
    144     public long getUpBandwidth() {
    145         return getLongResult("up");
    146     }
    147 
    148     /**
    149      * @return bytes per second or 0
    150      */
    151     public long getDownBandwidth() {
    152         return getLongResult("down");
    153     }
    154 
    155     public synchronized long getLongResult(String key) {
    156         if (_listener != null) {
    157             Map<String, Object> results = _listener.getResults();
    158             if (results != null) {
    159                 Long v = (Long) results.get(key);
    160                 if (v != null)
    161                     return v.longValue();
    162             }
    163         }
    164         return 0;
    165     }
    166 
    167125    /** start the test */
    168     public synchronized void startNDT() {
    169         if (_mlab.isRunning() || _listener != null && !_listener.isComplete()) {
    170             addFormError(_t("Bandwidth test is already running"));
    171             return;
    172         }
    173         _listener = new TestListener();
    174         MLabRunner.ToolRun runner = _mlab.runNDT(_listener);
    175         if (runner != null) {
     126    private void startNDT() {
     127        if (_helper == null) {
     128            addFormError("Bad state for test");
     129        } else if (_helper.startNDT()) {
    176130            addFormNotice(_t("Started bandwidth test"));
    177131        } else {
    178             Map<String, Object> map = new HashMap<String, Object>(2);
    179             _listener.complete(map);
    180132            addFormError(_t("Bandwidth test is already running"));
    181133        }
     
    183135
    184136    /** cancel the test */
    185     public synchronized void cancelNDT() {
    186         synchronized(WizardHandler.class) {
    187             if (!_mlab.isRunning()) {
    188                 addFormError(_t("Bandwidth test was not running"));
    189                 return;
    190             }
    191 /****
    192 TODO
    193             if (runner != null)
    194                 addFormNotice(_t("Started bandwidth test"));
    195             else
    196                 addFormError(_t("Bandwidth test is already running"));
    197 ****/
     137    private void cancelNDT() {
     138        if (_helper == null) {
     139            addFormError("Bad state for test");
     140        } else if (_helper.cancelNDT()) {
     141            addFormNotice(_t("Candelled bandwidth test"));
     142        } else {
     143            addFormError(_t("Bandwidth test was not running"));
    198144        }
    199145    }
    200 
    201     /** test results */
    202     private static class TestListener implements MLabRunner.ToolListener {
    203         private String _summary, _detail;
    204         private Map<String, Object> _results;
    205 
    206         public synchronized void reportSummary(String str) {
    207             _summary = str;
    208         }
    209 
    210         public synchronized void reportDetail(String str) {
    211             _detail = str;
    212         }
    213 
    214         public synchronized void complete(Map<String, Object> results) {
    215             _results = results;
    216         }
    217 
    218         public synchronized boolean isComplete() {
    219             return _results != null;
    220         }
    221 
    222         public synchronized String getSummary() {
    223             return _summary;
    224         }
    225 
    226         public synchronized String getDetail() {
    227             return _detail;
    228         }
    229 
    230         public synchronized Map<String, Object> getResults() {
    231             return _results;
    232         }
    233     }
    234 
    235146}
  • apps/routerconsole/java/src/net/i2p/router/web/helpers/WizardHelper.java

    r6462e2a rdc343b0  
    11package net.i2p.router.web.helpers;
    22
     3import java.util.HashMap;
     4import java.util.Map;
     5
     6import com.vuze.plugins.mlab.MLabRunner;
     7
     8import net.i2p.data.DataHelper;
    39import net.i2p.router.web.HelperBase;
    410
    511/**
    612 *  The new user wizard.
     13 *
     14 *  This bean has SESSION scope so the results may be retrieved.
     15 *  All necessary methods are synchronized.
    716 *
    817 *  @since 0.9.38
     
    1221    public static final String PROP_COMPLETE = "routerconsole.welcomeWizardComplete";
    1322
     23    // session scope, but it's an underlying singleton
     24    private MLabRunner _mlab;
     25
     26    // session scope
     27    private TestListener _listener;
     28    private MLabRunner.ToolRun _runner;
     29
     30    /**
     31     * Overriden to only do this once.
     32     */
     33    @Override
     34    public void setContextId(String contextId) {
     35        if (_context == null) {
     36            super.setContextId(contextId);
     37            _mlab = MLabRunner.getInstance(_context);
     38        }
     39    }
     40
    1441    public void complete() {
    1542        _context.router().saveConfig(PROP_COMPLETE, "true");
    1643    }
     44
     45    public synchronized boolean isNDTComplete() {
     46        return _listener != null && _listener.isComplete();
     47    }
     48
     49    public synchronized boolean isNDTRunning() {
     50        return _listener != null && !_listener.isComplete();
     51    }
     52
     53    /**
     54     * @return HTML-escaped status string or ""
     55     */
     56    public synchronized String getCompletionStatus() {
     57        String rv = "";
     58        if (_listener != null) {
     59            String s = _listener.getSummary();
     60            if (s != null)
     61                s = DataHelper.escapeHTML(s);
     62        }
     63        return rv;
     64    }
     65
     66    /**
     67     * @return HTML-escaped status string or ""
     68     */
     69    public synchronized String getDetailStatus() {
     70        String rv = "";
     71        if (_listener != null) {
     72            String s = _listener.getDetail();
     73            if (s != null)
     74                s = DataHelper.escapeHTML(s);
     75        }
     76        return rv;
     77    }
     78
     79    /**
     80     * @return bytes per second or 0
     81     */
     82    public long getUpBandwidth() {
     83        return getLongResult("up");
     84    }
     85
     86    /**
     87     * @return bytes per second or 0
     88     */
     89    public long getDownBandwidth() {
     90        return getLongResult("down");
     91    }
     92
     93    public synchronized long getLongResult(String key) {
     94        if (_listener != null) {
     95            Map<String, Object> results = _listener.getResults();
     96            if (results != null) {
     97                Long v = (Long) results.get(key);
     98                if (v != null)
     99                    return v.longValue();
     100            }
     101        }
     102        return 0;
     103    }
     104
     105    /**
     106     *  Start the test. Called from the Handler.
     107     *  @return success
     108     */
     109    synchronized boolean startNDT() {
     110        if (_mlab.isRunning() || _listener != null && !_listener.isComplete()) {
     111            return false;
     112        }
     113        _listener = new TestListener();
     114        _runner = _mlab.runNDT(_listener);
     115        if (_runner != null) {
     116            return true;
     117        } else {
     118            Map<String, Object> map = new HashMap<String, Object>(2);
     119            _listener.complete(map);
     120            return false;
     121        }
     122    }
     123
     124    /**
     125     *  Cancel the test. Called from the Handler.
     126     *  @return success
     127     */
     128    synchronized boolean cancelNDT() {
     129        if (!_mlab.isRunning()) {
     130            return false;
     131        }
     132        if (_runner != null) {
     133            _runner.cancel();
     134            _runner = null;
     135            return true;
     136        } else {
     137            return false;
     138        }
     139    }
     140
     141    /** test results */
     142    private static class TestListener implements MLabRunner.ToolListener {
     143        private String _summary, _detail;
     144        private Map<String, Object> _results;
     145
     146        public synchronized void reportSummary(String str) {
     147            _summary = str;
     148        }
     149
     150        public synchronized void reportDetail(String str) {
     151            _detail = str;
     152        }
     153
     154        public synchronized void complete(Map<String, Object> results) {
     155            _results = results;
     156        }
     157
     158        public synchronized boolean isComplete() {
     159            return _results != null;
     160        }
     161
     162        public synchronized String getSummary() {
     163            return _summary;
     164        }
     165
     166        public synchronized String getDetail() {
     167            return _detail;
     168        }
     169
     170        public synchronized Map<String, Object> getResults() {
     171            return _results;
     172        }
     173    }
    17174}
  • apps/routerconsole/jsp/formhandler.jsi

    r6462e2a rdc343b0  
    5151        // We also call all of the setters below.
    5252        formhandler.setSettings(request.getParameterMap());
    53 %>
    54 <jsp:setProperty name="formhandler" property="*" />
    55 <%
     53%><jsp:setProperty name="formhandler" property="*" /><%
    5654    }
    57 %>
    58 <jsp:getProperty name="formhandler" property="allMessages" />
    59 <%
     55%><jsp:getProperty name="formhandler" property="allMessages" /><%
    6056
    6157    // Only call this once per page, do not getProperty("newNonce") elsewhere,
  • apps/routerconsole/jsp/welcome.jsp

    r6462e2a rdc343b0  
    1 <%@page contentType="text/html"%><%@page pageEncoding="UTF-8"%><jsp:useBean class="net.i2p.router.web.helpers.WizardHelper" id="wizhelper" scope="request" /><%
     1<%@page contentType="text/html"%><%@page pageEncoding="UTF-8"%><jsp:useBean class="net.i2p.router.web.helpers.WizardHelper" id="wizhelper" scope="session" /><%
     2    // note that for the helper we use a session scope, not a request scope,
     3    // so that we can access the NDT test results.
     4    // The MLabHelper singleton will prevent multiple simultaneous tests, even across sessions.
     5
    26    // page ID
    37    final int LAST_PAGE = 7;
     
    6064<%=intl.title("New Install Wizard")%>
    6165<%
     66    wizhelper.setContextId(i2pcontextId);
    6267    if (ipg == 4) {
    6368%>
     
    8590<h2><%=intl._t("New Install Wizard")%> <%=ipg%>/<%=LAST_PAGE%></h2>
    8691<div id="wizard">
    87 <%--
    88     // note that for the handler we use a session scope, not a page scope,
    89     // so that we can access the NDT test results.
    90     // The MLabHelper singleton will prevent multiple simultaneous tests, even across sessions.
    91 --%>
    92 <jsp:useBean class="net.i2p.router.web.helpers.WizardHandler" id="formhandler" scope="session" />
     92<jsp:useBean class="net.i2p.router.web.helpers.WizardHandler" id="formhandler" scope="request" />
     93<%
     94    // Bind the session-scope Helper to the request-scope Handler
     95    formhandler.setWizardHelper(wizhelper);
     96%>
    9397<%@include file="formhandler.jsi" %>
    9498<form action="" method="POST">
     
    97101<input type="hidden" name="page" value="<%=(ipg + 1)%>" >
    98102<%
    99 
    100103    if (ipg == 1) {
    101104        // language selection
     
    142145%>
    143146<h3><%=intl._t("Bandwidth Test in Progress")%></h3>
    144 <p>TODO</p>
     147<p>Ajax TODO - wait 60 seconds then click next</p>
    145148<%
    146149
     
    153156<h3><%=intl._t("Bandwidth Test Results")%></h3>
    154157<table class="configtable">
    155 <tr><td>
    156 Test results go here
    157 </td></tr>
     158<tr><td><%=intl._t("Test running?")%></td><td><%=wizhelper.isNDTRunning()%></td></tr>
     159<tr><td><%=intl._t("Test complete?")%></td><td><%=wizhelper.isNDTComplete()%></td></tr>
     160<tr><td><%=intl._t("Completion status")%></td><td><%=wizhelper.getCompletionStatus()%></td></tr>
     161<tr><td><%=intl._t("Details")%></td><td><%=wizhelper.getDetailStatus()%></td></tr>
     162<tr><td><%=intl._t("Upstream Bandwidth")%></td><td><%=net.i2p.data.DataHelper.formatSize2Decimal(wizhelper.getUpBandwidth())%>Bps</td></tr>
     163<tr><td><%=intl._t("Downstream Bandwidth")%></td><td><%=net.i2p.data.DataHelper.formatSize2Decimal(wizhelper.getDownBandwidth())%>Bps</td></tr>
    158164</table>
    159165<h3><%=intl._t("Bandwidth Configuration")%></h3>
     
    246252    }
    247253%>
    248 </td></tr></table>
     254</td></tr></table></div>
    249255</form>
    250256</div></body></html>
Note: See TracChangeset for help on using the changeset viewer.