autotestermulti.java

来自「This is a resource based on j2me embedde」· Java 代码 · 共 364 行

JAVA
364
字号
/* * * * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER *  * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. *  * This program 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 version 2 for more details (a copy is * included at /legal/license.txt). *  * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA *  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */package com.sun.midp.installer;import java.io.*;import java.util.*;import com.sun.cldc.isolate.*;import com.sun.midp.main.AmsUtil;import javax.microedition.io.*;import javax.microedition.lcdui.*;import javax.microedition.midlet.*;import javax.microedition.rms.*;import com.sun.midp.io.j2me.storage.*;import com.sun.midp.i18n.Resource;import com.sun.midp.i18n.ResourceConstants;import com.sun.midp.midlet.*;import com.sun.midp.midletsuite.*;import com.sun.midp.security.*;import com.sun.midp.configurator.Constants;import com.sun.midp.log.Logging;import com.sun.midp.log.LogChannels;/** * Fetches a list of URLs pointing to test suites to install, then, * for each specified test suite in parallel, installs/updates the suite, * runs the first MIDlet in the suite in a loop specified number of iterations * or until the new version of the suite is not found, then removes the suite. * <p> * The MIDlet uses these application properties as arguments: </p> * <ol> *   <li>arg-0: URL for html page with links to test suites. This html page *    looks like this: *      <a href="http://localhost/suite1.jad">Suite1</a> *      <a href="http://localhost/suite2.jad">Suite2</a> *   <li>arg-1: Used to override the default domain used when installing *    an unsigned suite. The default is maximum to allow the runtime API tests *    be performed automatically without tester interaction. The domain name *    may be followed by a colon and a list of permissions that must be allowed *    even if they are not listed in the MIDlet-Permissions attribute in the *    application descriptor file. Instead of the list a keyword "all" can be *    specified indicating that all permissions must be allowed, for example: *    operator:all. *    <li>arg-2: Integer number, specifying how many iterations to run *    the suite. If argument is not given or less then zero, then suite *    will be run until the new version of the suite is not found. * </ol> * <p> * If arg-0 is not given then a form will be used to query the tester for * the arguments.</p> */public class AutoTesterMulti extends AutoTesterBase        implements AutoTesterInterface {    /**     * Info about suites to install     */    Vector installList = new Vector();    /**     * Create and initialize a new auto tester MIDlet.     */    public AutoTesterMulti() {        super();        if (url != null) {            startBackgroundTester();        } else if (restoreSession()) {            // continuation of a previous session            startBackgroundTester();        } else {            /**             * No URL has been provided, ask the user.             *             * commandAction will subsequently call startBackgroundTester.             */            getUrl();        }    }    /** Run the installer. */    public void run() {        installAndPerformTests(midletSuiteStorage, installer, url);    }    /**     * Restore the data from the last session, since this version of the     * autotester does not have sessions it just returns false.     *     * @return true if there was data saved from the last session     */    public boolean restoreSession() {        return false;    }    /**     * Get list of test suites, for each suite start a thread     * that performs testing, wait until all threads have finished.     *     * @param inp_storage MIDletSuiteStorage object     * @param inp_installer Installer object     * @param inp_url URL for the html page with links to suites     */    public void installAndPerformTests(        MIDletSuiteStorage inp_storage,        Installer inp_installer, String inp_url) {        fetchInstallList(url);        int totalSuites = installList.size();        if (totalSuites > 0) {            Thread[] threads = new Thread[totalSuites];            // create threads            for (int i = 0; i < totalSuites; i++) {                SuiteDownloadInfo suite =                    (SuiteDownloadInfo)installList.elementAt(i);                threads[i] = new Thread(new AutoTesterRunner(                    suite.url, inp_storage, inp_installer));            }            // start threads            for (int i = 0; i < totalSuites; i++) {                threads[i].start();            }            // wait for threads to finish            for (int i = 0; i < totalSuites; i++) {                try {                    threads[i].join();                } catch (Exception ex) {                    // just ignore                }            }            notifyDestroyed();            return;        }    }    /**     * Go to given URL, fetch and parse html page with links     * to tests suites. If there was error while fetching     * or parsing, display an alert.     *     * @param url URL for html page with links to suites     */    private void fetchInstallList(String url) {        StreamConnection conn = null;        InputStreamReader in = null;        String errorMessage;        try {            conn = (StreamConnection)Connector.open(url, Connector.READ);            in = new InputStreamReader(conn.openInputStream());            try {                installList = SuiteDownloadInfo.getDownloadInfoFromPage(in);                if (installList.size() > 0) {                    return;                }                errorMessage = Resource.getString(                        ResourceConstants.AMS_DISC_APP_CHECK_URL_MSG);            } catch (IllegalArgumentException ex) {                errorMessage = Resource.getString(                        ResourceConstants.AMS_DISC_APP_URL_FORMAT_MSG);            } catch (Exception ex) {                errorMessage = ex.getMessage();            }        } catch (Exception ex) {            errorMessage = Resource.getString(                    ResourceConstants.AMS_DISC_APP_CONN_FAILED_MSG);        } finally {            try {                conn.close();                in.close();            } catch (Exception e) {                if (Logging.REPORT_LEVEL <= Logging.WARNING) {                    Logging.report(Logging.WARNING, LogChannels.LC_AMS,                            "close threw an Exception");                }            }        }        Alert a = new Alert(Resource.getString(ResourceConstants.ERROR),                errorMessage, null, AlertType.ERROR);        a.setTimeout(Alert.FOREVER);        display.setCurrent(a);    }    /**     * An runnable class that runs specified test suite in a loop.     */    private class AutoTesterRunner implements Runnable {        /**         * Number of retries to fetch a suite from given URL before exiting         */        private final static int MAX_RETRIES = 20;        /**         * Time to wait before trying to fetch a suite again         */        private final static int RETRY_WAIT_TIME = 30000;        /**         * URL for the test suite         */        private String url;        /**         * MIDletSuiteStorage object         */        MIDletSuiteStorage storage;        /**         * Installer object         */        Installer installer;        /**         * Constructor.         *         * @param theUrl URL for the test suite         * @param theStorage MIDletSuiteStorage object to use         * @param theInstaller Installer object to use         */        private AutoTesterRunner(String theUrl,                MIDletSuiteStorage theStorage, Installer theInstaller) {            url = theUrl;            storage = theStorage;            installer = theInstaller;        }        /**         * In a loop, install/update the suite and run it until         * new version of the suite is not found.         */        public void run() {            // when installing suite for the first time,            // do not retry because URL may be wrong and            // we want immediately tell user about it.            boolean retry = false;            boolean hasSuite = true;            int suiteId = MIDletSuite.UNUSED_SUITE_ID;            int lastSuiteId = MIDletSuite.UNUSED_SUITE_ID;            MIDletInfo midletInfo;            Isolate testIsolate;            for (; loopCount != 0 && hasSuite; ) {                suiteId = installSuite(retry);                if (suiteId != MIDletSuite.UNUSED_SUITE_ID) {                    midletInfo = getFirstMIDletOfSuite(suiteId, storage);                    testIsolate = AmsUtil.startMidletInNewIsolate(suiteId,                            midletInfo.classname, midletInfo.name, null,                            null, null);                    testIsolate.waitForExit();                    if (loopCount > 0) {                        loopCount -= 1;                    }                    lastSuiteId = suiteId;                    // suite has been found, so URL isn't wrong.                    // next time if there is no suite, do retries.                    retry = true;                } else {                    hasSuite = false;                }            }            if (midletSuiteStorage != null &&                    lastSuiteId != MIDletSuite.UNUSED_SUITE_ID) {                try {                    midletSuiteStorage.remove(lastSuiteId);                } catch (Throwable ex) {                    // ignore                }            }        }        /**         * Install the suite.         *         * @param retry if true, do a number of retries to         * install a suite in case it hasn't been found.         *         * @return suiteId if the suite has been installed         */        private int installSuite(boolean retry) {            int maxRetries = retry? MAX_RETRIES : 1;            int retryCount = 0;            int suiteId = MIDletSuite.UNUSED_SUITE_ID;            for (; retryCount < maxRetries; ++retryCount) {                try {                    synchronized (installer) {                        // force an overwrite and remove the RMS data                        suiteId = installer.installJad(url,                            Constants.INTERNAL_STORAGE_ID, true,                                true, null);                    }                    return suiteId;                } catch (Throwable t) {                    // if retrying, just ignore exception and wait,                    // otherwise display error message to user.                    if (retry) {                        try {                            Thread.sleep(RETRY_WAIT_TIME);                        } catch (Exception ex) {                        }                    } else {                        handleInstallerException(suiteId, t);                    }                }            }            return MIDletSuite.UNUSED_SUITE_ID;        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?