org.parosproxy.paros.extension.update.ExtensionUpdate.java Source code

Java tutorial

Introduction

Here is the source code for org.parosproxy.paros.extension.update.ExtensionUpdate.java

Source

/*
 *
 * Paros and its related class files.
 * 
 * Paros is an HTTP/HTTPS proxy for assessing web application security.
 * Copyright (C) 2003-2004 Chinotec Technologies Company
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the Clarified Artistic License
 * 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
 * Clarified Artistic License for more details.
 * 
 * You should have received a copy of the Clarified Artistic License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
package org.parosproxy.paros.extension.update;

import java.awt.EventQueue;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JMenuItem;

import org.apache.commons.httpclient.URI;
import org.parosproxy.paros.Constant;
import org.parosproxy.paros.extension.ExtensionAdaptor;
import org.parosproxy.paros.extension.ExtensionHook;
import org.parosproxy.paros.network.HttpMessage;
import org.parosproxy.paros.network.HttpSender;
import org.parosproxy.paros.network.HttpStatusCode;
import org.parosproxy.paros.view.WaitMessageDialog;

/**
 * 
 * To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Generation - Code and Comments
 */
public class ExtensionUpdate extends ExtensionAdaptor {

    private JMenuItem menuItemCheckUpdate = null;

    private static final String ANDIPAROS_FILES = "http://code.google.com/p/andiparos/downloads/list";
    private HttpSender httpSender = null;

    private Pattern patternNewestVersionArchive = Pattern.compile("Andiparos-v(\\d+)\\.(\\d+)\\.(\\d+)\\.zip",
            Pattern.MULTILINE);
    private Pattern patternNewestVersionMacOsX = Pattern.compile("Andiparos-v(\\d+)\\.(\\d+)\\.(\\d+)\\.dmg",
            Pattern.MULTILINE);

    String newestVersionName = null;
    private boolean manualCheckStarted = false;

    private WaitMessageDialog waitDialog = null;

    /**
      * 
      */
    public ExtensionUpdate() {
        super();
        initialize();
    }

    /**
     * This method initializes this
     * 
     * @return void
     */
    private void initialize() {
        this.setName("ExtensionUpdate");

    }

    /**
     * This method initializes menuItemEncoder
     * 
     * @return javax.swing.JMenuItem
     */
    private JMenuItem getMenuItemCheckUpdate() {
        if (menuItemCheckUpdate == null) {
            menuItemCheckUpdate = new JMenuItem();
            menuItemCheckUpdate.setText("Check for updates...");
            if (!Constant.isWindows() && !Constant.isLinux() && !Constant.isOSX()) {
                menuItemCheckUpdate.setEnabled(false);
            }
            menuItemCheckUpdate.addActionListener(new java.awt.event.ActionListener() {

                public void actionPerformed(java.awt.event.ActionEvent e) {

                    Thread t = new Thread(new Runnable() {
                        public void run() {
                            manualCheckStarted = true;
                            newestVersionName = getNewestVersionName();

                            if (waitDialog != null) {
                                waitDialog.setVisible(false);
                                waitDialog = null;
                            }
                            EventQueue.invokeLater(new Runnable() {
                                public void run() {

                                    if (newestVersionName == null) {
                                        getView().showMessageDialog("Sorry, no update available.");
                                    } else if (newestVersionName.equals("")) {
                                        getView().showWarningDialog(
                                                "Error encountered. Please check manually for new updates.");
                                    } else {
                                        newestVersionName = newestVersionName.replaceAll("\\.zip", "");
                                        newestVersionName = newestVersionName.replaceAll("\\.dmg", "");
                                        getView().showMessageDialog("A new version of " + Constant.PROGRAM_NAME
                                                + " is available: " + newestVersionName + "\nPlease update!");
                                    }

                                }
                            });
                        }
                    });

                    waitDialog = getView().getWaitMessageDialog("Checking if newer version exists...");
                    t.start();
                    waitDialog.setVisible(true);
                }
            });
        }
        return menuItemCheckUpdate;
    }

    public void start() {

        // check 1 in 30 cases to avoid too frequent check.
        if (getRandom(30) != 1) {
            return;
        }

        Thread t = new Thread(new Runnable() {
            public void run() {

                newestVersionName = getNewestVersionName();
                if (newestVersionName == null || newestVersionName.length() == 0) {
                    return;
                } else {
                    ExtensionUpdate.this.showUpdateMessage(true);
                }
            }

        });
        t.start();

    }

    public void hook(ExtensionHook extensionHook) {
        super.hook(extensionHook);
        if (getView() != null) {
            extensionHook.getHookMenu().addToolsMenuItem(getMenuItemCheckUpdate());
        }
    }

    public void showUpdateMessage(final boolean silent) {

        if (newestVersionName == null) {
            return;
        }

        String s = "A newer version of " + Constant.PROGRAM_NAME + " has been Found. Feel free to update.";
        getView().showMessageDialog(s);
    }

    private String getNewestVersionName() {
        String newVersionName = null;
        HttpMessage msg = null;
        String resBody = null;

        try {
            msg = new HttpMessage(new URI(ANDIPAROS_FILES, true));
            getHttpSender().sendAndReceive(msg, true);
            if (msg.getResponseHeader().getStatusCode() != HttpStatusCode.OK) {
                throw new IOException();
            }
            resBody = msg.getResponseBody().toString();

            Matcher matcher = null;

            if (Constant.isOSX()) {
                matcher = patternNewestVersionMacOsX.matcher(resBody);
            } else {
                matcher = patternNewestVersionArchive.matcher(resBody);
            }

            if (matcher.find()) {
                int ver_major = Integer.parseInt(matcher.group(1));
                int ver_minor = Integer.parseInt(matcher.group(2));
                int ver_release = Integer.parseInt(matcher.group(3));
                long version = 1000000 * ver_major + 1000 * ver_minor + ver_release;
                if (version > Constant.VERSION_TAG) {
                    newVersionName = matcher.group(0);
                }
            }
        } catch (Exception e) {
            newVersionName = "";
        } finally {
            httpSender.shutdown();
            httpSender = null;
        }

        return newVersionName;
    }

    private HttpSender getHttpSender() {
        if (httpSender == null) {
            httpSender = new HttpSender(getModel().getOptionsParam().getConnectionParam(), true);
        }
        return httpSender;
    }

    private int getRandom(int max) {
        int result = (int) (max * Math.random());
        return result;
    }
}