Java tutorial
/* * * 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; } }