com.aptana.ide.update.ui.SchedulerStartup.java Source code

Java tutorial

Introduction

Here is the source code for com.aptana.ide.update.ui.SchedulerStartup.java

Source

/**
 * This file Copyright (c) 2005-2010 Aptana, Inc. This program is
 * dual-licensed under both the Aptana Public License and the GNU General
 * Public license. You may elect to use one or the other of these licenses.
 * 
 * This program is distributed in the hope that it will be useful, but
 * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
 * NONINFRINGEMENT. Redistribution, except as permitted by whichever of
 * the GPL or APL you select, is prohibited.
 *
 * 1. For the GPL license (GPL), you can redistribute and/or modify this
 * program under the terms of the GNU General Public License,
 * Version 3, as published by the Free Software Foundation.  You should
 * have received a copy of the GNU General Public License, Version 3 along
 * with this program; if not, write to the Free Software Foundation, Inc., 51
 * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 * 
 * Aptana provides a special exception to allow redistribution of this file
 * with certain Eclipse Public Licensed code and certain additional terms
 * pursuant to Section 7 of the GPL. You may view the exception and these
 * terms on the web at http://www.aptana.com/legal/gpl/.
 * 
 * 2. For the Aptana Public License (APL), this program and the
 * accompanying materials are made available under the terms of the APL
 * v1.0 which accompanies this distribution, and is available at
 * http://www.aptana.com/legal/apl/.
 * 
 * You may view the GPL, Aptana's exception and additional terms, and the
 * APL in the file titled license.html at the root of the corresponding
 * plugin containing this source file.
 * 
 * Any modifications to this file must keep this entire header intact.
 */
package com.aptana.ide.update.ui;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.text.MessageFormat;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
import org.eclipse.ui.internal.browser.WebBrowserEditorInput;
import org.eclipse.ui.progress.UIJob;
import org.osgi.framework.Version;

import com.aptana.ide.core.IdeLog;
import com.aptana.ide.core.MutexJobRule;
import com.aptana.ide.core.PluginUtils;
import com.aptana.ide.core.ui.BaseTimingStartup;
import com.aptana.ide.core.ui.CoreUIPlugin;
import com.aptana.ide.core.ui.CoreUIUtils;
import com.aptana.ide.update.preferences.IPreferenceConstants;

/**
 * 
 */
@SuppressWarnings("restriction")
public class SchedulerStartup extends BaseTimingStartup {

    /**
     * The constructor.
     */
    public SchedulerStartup() {
    }

    @Override
    public String getStartupName() {
        return "SchedulerStartup"; //$NON-NLS-1$
    }

    @Override
    protected void startup() {
        scheduleCheckForReleaseMessage();
        scheduleCheckForNewsMessage();
        scheduleCheckForAnnouncements();
        startupDone();
    }

    private void scheduleCheckForReleaseMessage() {
        // Escape mechanism
        boolean doNotCheckForReleaseMessage = Boolean.getBoolean("DO_NOT_CHECK_FOR_RELEASE_MESSAGE"); //$NON-NLS-1$
        if (doNotCheckForReleaseMessage) {
            return;
        }

        final IPreferenceStore prefs = UpdateUIActivator.getDefault().getPreferenceStore();
        final String releaseMessageURLPrefix = prefs.getString(IPreferenceConstants.RELEASE_MESSAGE_URL_PREFIX);
        Job job = new Job("Check for new release message") { //$NON-NLS-1$
            @Override
            protected IStatus run(IProgressMonitor monitor) {
                try {
                    final URL releaseMessageURL = new URL(
                            System.getProperty("RELEASE_MESSAGE_URL_OVERRIDE", releaseMessageURLPrefix //$NON-NLS-1$
                                    + getCoreUIVersion() + "/message.html")); //$NON-NLS-1$
                    URLConnection urlConnection = null;
                    try {
                        urlConnection = releaseMessageURL.openConnection();
                    } catch (IOException ioe) {
                        logError(ioe);
                    }

                    if (urlConnection instanceof HttpURLConnection) {
                        HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
                        try {
                            httpURLConnection.setConnectTimeout(1000);
                            httpURLConnection.setUseCaches(false);
                            httpURLConnection.addRequestProperty("Cache-Control", "no-cache"); //$NON-NLS-1$ //$NON-NLS-2$
                            httpURLConnection.setRequestMethod("HEAD"); //$NON-NLS-1$
                            if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {

                                boolean showMessage = true;
                                // Check for lastModified?
                                long lastModified = httpURLConnection.getLastModified();
                                if (lastModified == 0) {
                                    // unknown
                                } else {
                                    long lastLastModified = prefs.getLong(releaseMessageURL.toString());
                                    if (lastLastModified >= lastModified) {
                                        showMessage = false;
                                    }
                                }
                                prefs.setValue(releaseMessageURL.toString(), lastModified);

                                if (showMessage) {
                                    CoreUIUtils.getDisplay().asyncExec(new Runnable() {

                                        public void run() {
                                            IWorkbenchPage page = CoreUIPlugin.getActivePage();
                                            if (page != null) {
                                                try {
                                                    page.openEditor(
                                                            new WebBrowserEditorInput(releaseMessageURL,
                                                                    IWorkbenchBrowserSupport.PERSISTENT),
                                                            ExternalWebBrowserEditor.ID, false);
                                                } catch (PartInitException e) {
                                                    // Show the message in
                                                    // external browser
                                                    CoreUIUtils.openBrowserURL(releaseMessageURL.toExternalForm());
                                                }
                                            }

                                        }
                                    });
                                }
                            }
                        } catch (IOException e) {
                            logError(e);
                        } finally {
                            // cleanup
                            httpURLConnection.disconnect();
                        }
                    }
                } catch (MalformedURLException e) {
                    logError(e);
                }

                return Status.OK_STATUS;
            }
        };
        job.setSystem(true);
        job.schedule();
    }

    private void scheduleCheckForNewsMessage() {
        // Escape mechanism
        boolean doNotCheckForReleaseMessage = Boolean.getBoolean("DO_NOT_CHECK_FOR_NEWS_MESSAGE"); //$NON-NLS-1$
        if (doNotCheckForReleaseMessage) {
            return;
        }

        final IPreferenceStore prefs = UpdateUIActivator.getDefault().getPreferenceStore();
        String newsMessageURLPrefix = prefs.getString(IPreferenceConstants.NEWS_MESSAGE_URL_PREFIX);
        // For the news we want to pass the version of studio and
        final String newsMessageBaseURL = System.getProperty("NEWS_MESSAGE_URL_OVERRIDE", //$NON-NLS-1$
                newsMessageURLPrefix + "news.php"); //$NON-NLS-1$
        Job job = new Job("Check for new news message") { //$NON-NLS-1$
            @Override
            protected IStatus run(IProgressMonitor monitor) {
                try {
                    final URL newsMessageURL = new URL(newsMessageBaseURL + getParamsString());
                    URLConnection urlConnection = null;
                    try {
                        urlConnection = newsMessageURL.openConnection();
                    } catch (IOException ioe) {
                        logError(ioe);
                    }

                    if (urlConnection instanceof HttpURLConnection) {
                        HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
                        try {
                            httpURLConnection.setConnectTimeout(1000);
                            httpURLConnection.setUseCaches(false);
                            httpURLConnection.addRequestProperty("Cache-Control", "no-cache"); //$NON-NLS-1$ //$NON-NLS-2$
                            httpURLConnection.setRequestMethod("HEAD"); //$NON-NLS-1$
                            if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                                // Check for lastModified?
                                boolean showMessage = true;
                                long lastModified = httpURLConnection.getLastModified();
                                if (lastModified == 0) {
                                    // unknown
                                } else {
                                    long lastLastModified = prefs.getLong(newsMessageBaseURL);
                                    if (lastLastModified >= lastModified) {
                                        showMessage = false;
                                    }
                                }
                                prefs.setValue(newsMessageBaseURL, lastModified);

                                if (showMessage) {
                                    CoreUIUtils.getDisplay().asyncExec(new Runnable() {

                                        public void run() {
                                            IWorkbenchPage page = CoreUIPlugin.getActivePage();
                                            if (page != null) {
                                                try {
                                                    page.openEditor(
                                                            new WebBrowserEditorInput(newsMessageURL,
                                                                    IWorkbenchBrowserSupport.PERSISTENT),
                                                            ExternalWebBrowserEditor.ID, false);
                                                } catch (PartInitException e) {
                                                    // Show the message in
                                                    // external browser
                                                    CoreUIUtils.openBrowserURL(newsMessageURL.toExternalForm());
                                                }
                                            }

                                        }
                                    });
                                }
                            }
                        } catch (IOException e) {
                            logError(e);
                        } finally {
                            // cleanup
                            httpURLConnection.disconnect();
                        }
                    }
                } catch (MalformedURLException e) {
                    logError(e);
                }

                return Status.OK_STATUS;
            }
        };
        job.setSystem(true);
        job.schedule();
    }

    private static final String HEADER_WIDTH = "Width"; //$NON-NLS-1$
    private static final String HEADER_HEIGHT = "Height"; //$NON-NLS-1$

    private void scheduleCheckForAnnouncements() {
        // Escape mechanism
        boolean doNotCheckForReleaseMessage = Boolean.getBoolean("DO_NOT_CHECK_FOR_NEWS_MESSAGE"); //$NON-NLS-1$
        if (doNotCheckForReleaseMessage) {
            return;
        }
        final IPreferenceStore prefs = UpdateUIActivator.getDefault().getPreferenceStore();
        boolean b_neverShow = prefs.getBoolean(IPreferenceConstants.NEVER_SHOW_ANNOUNCEMENTS);
        if (b_neverShow) {
            return;
        }

        String announcementURLPrefix = prefs.getString(IPreferenceConstants.ANNOUNCEMENT_URL_PREFIX);
        final String announceBaseURL = System.getProperty("ANNOUNCEMENT_URL_OVERRIDE", //$NON-NLS-1$
                announcementURLPrefix + "announce.php"); //$NON-NLS-1$
        Job job = new Job("Check for new announcement") { //$NON-NLS-1$

            @Override
            protected IStatus run(IProgressMonitor monitor) {
                try {
                    // For the announcements we want to pass the version of
                    // studio and
                    getAnnouncement(new URL(announceBaseURL + getParamsString()));
                } catch (MalformedURLException e) {
                    logError(e);
                }

                return Status.OK_STATUS;
            }

            private void getAnnouncement(final URL url) {
                URLConnection urlConnection = null;
                try {
                    urlConnection = url.openConnection();
                } catch (IOException ioe) {
                    logError(ioe);
                }
                if (urlConnection instanceof HttpURLConnection) {
                    HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
                    try {
                        httpURLConnection.setConnectTimeout(1000);
                        httpURLConnection.setUseCaches(false);
                        httpURLConnection.addRequestProperty("Cache-Control", "no-cache"); //$NON-NLS-1$ //$NON-NLS-2$
                        httpURLConnection.setRequestMethod("HEAD"); //$NON-NLS-1$

                        if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                            // Check for lastModified?
                            boolean showMessage = true;
                            long lastModified = httpURLConnection.getLastModified();
                            if (lastModified == 0) {
                                // unknown
                            } else {
                                boolean neverShowThisAgain = prefs
                                        .getBoolean(IPreferenceConstants.NEVER_SHOW_THIS_ANNOUNCEMENT);
                                if (neverShowThisAgain) {
                                    long lastLastModified = prefs.getLong(
                                            IPreferenceConstants.NEVER_SHOW_THIS_ANNOUNCEMENT_LAST_LAST_MODIFIED);
                                    if (lastModified <= lastLastModified) {
                                        showMessage = false;
                                    }
                                }
                            }
                            prefs.setValue(IPreferenceConstants.NEVER_SHOW_THIS_ANNOUNCEMENT_LAST_LAST_MODIFIED,
                                    lastModified);

                            String strHeight = httpURLConnection.getHeaderField(HEADER_HEIGHT);
                            String strWidth = httpURLConnection.getHeaderField(HEADER_WIDTH);

                            final int height = (strHeight != null) ? Integer.parseInt(strHeight) : 300;
                            final int width = (strWidth != null) ? Integer.parseInt(strWidth) : 300;

                            if (showMessage) {
                                UIJob uiJob = new UIJob("Show Aptana Announcement") { //$NON-NLS-1$
                                    @Override
                                    public IStatus runInUIThread(IProgressMonitor monitor) {
                                        IWorkbenchPage page = CoreUIPlugin.getActivePage();
                                        if (page != null) {
                                            BrowserDialog dialog = new BrowserDialog(CoreUIUtils.getActiveShell(),
                                                    url.toString(), height, width);
                                            dialog.open();
                                        }

                                        return Status.OK_STATUS;
                                    }
                                };
                                uiJob.setSystem(true);
                                uiJob.setRule(MutexJobRule.getInstance());
                                uiJob.schedule();
                            }
                        }
                    } catch (IOException e) {
                        logError(e);
                    } finally {
                        // cleanup
                        httpURLConnection.disconnect();
                    }
                }
            }
        };
        job.setSystem(true);
        job.schedule();
    }

    private static void logError(Exception e) {
        IdeLog.logInfo(UpdateUIActivator.getDefault(), e.getLocalizedMessage(), e);
    }

    /**
     * @return the version associated with com.aptana.ide.core.ui
     */
    private static String getCoreUIVersion() {
        Version version = new Version(PluginUtils.getPluginVersion(CoreUIPlugin.getDefault()));
        return MessageFormat.format("{0}.{1}.{2}.{3}", version.getMajor(), version.getMinor(), //$NON-NLS-1$ 
                version.getMicro(), version.getQualifier());
    }

    private static String getCoreUIVersionDetailsString() {
        Version version = new Version(PluginUtils.getPluginVersion(CoreUIPlugin.getDefault()));
        return MessageFormat.format("coreui_major={0}&coreui_minor={1}&coreui_micro={2}&coreui_qualifier={3}", //$NON-NLS-1$ 
                version.getMajor(), version.getMinor(), version.getMicro(), version.getQualifier());
    }

    private static String getParamsString() {
        StringBuilder paramsString = new StringBuilder("?"); //$NON-NLS-1$
        paramsString.append(getCoreUIVersionDetailsString());
        paramsString.append("&appName=").append(getAppName()); //$NON-NLS-1$
        paramsString.append("&osgi_framework=") //$NON-NLS-1$
                .append(System.getProperty("osgi.framework.version")); //$NON-NLS-1$
        paramsString.append("&os=").append(Platform.getOS()); //$NON-NLS-1$
        paramsString.append("&arch=").append(Platform.getOSArch()); //$NON-NLS-1$

        return paramsString.toString();
    }

    private static String getAppName() {
        String commands = System.getProperty("eclipse.commands"); //$NON-NLS-1$
        int indexOfNameArg = commands.indexOf("-name\n"); //$NON-NLS-1$
        String subCommands = commands.substring(indexOfNameArg + 6);
        int indexOfNextNewline = subCommands.indexOf("\n"); //$NON-NLS-1$
        String nameArg = subCommands.substring(0, indexOfNextNewline);
        return nameArg;
    }
}