com.siteview.mde.internal.launching.launcher.LauncherUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.siteview.mde.internal.launching.launcher.LauncherUtils.java

Source

/*******************************************************************************
 * Copyright (c) 2003, 2011 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     EclipseSource Corporation - ongoing enhancements
 *******************************************************************************/
package com.siteview.mde.internal.launching.launcher;

import com.siteview.mde.core.monitor.IMonitorModelBase;
import com.siteview.mde.core.monitor.MonitorRegistry;

import com.siteview.mde.internal.core.*;
import com.siteview.mde.internal.core.project.PDEProject;
import com.siteview.mde.internal.core.util.CoreUtility;
import com.siteview.mde.internal.launching.IPDEConstants;
import com.siteview.mde.internal.launching.PDELaunchingPlugin;
import com.siteview.mde.launching.IPDELauncherConstants;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.debug.core.*;
import org.eclipse.jdt.core.*;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.osgi.service.datalocation.Location;
import org.osgi.framework.*;

public class LauncherUtils {
    public static final int WORKSPACE_LOCKED = 2000;
    public static final int CLEAR_LOG = 2001;
    public static final int DELETE_WORKSPACE = 2002;
    public static final int GENERATE_CONFIG_INI = 2003;
    public static final int ORGANIZE_MANIFESTS = 2004;
    public static final int SELECT_WORKSPACE_FIELD = 2005;

    private static final String TIMESTAMP = "timestamp"; //$NON-NLS-1$
    private static final String FILE_NAME = "dep-timestamp.properties"; //$NON-NLS-1$
    private static Properties fLastRun;
    /**
     * Stores the last known launch mode so status handlers can open the correct launch configuration dialog
     * @see LauncherUtils#setLastLaunchMode(String)
     */
    private static String fLastLaunchMode;

    public static boolean clearWorkspace(ILaunchConfiguration configuration, String workspace,
            IProgressMonitor monitor) throws CoreException {

        // If the workspace is not defined, there is no workspace to clear
        // What will happen is that the workspace chooser dialog will be 
        // brought up because no -data parameter will be specified on the 
        // launch
        if (workspace.length() == 0) {
            monitor.done();
            return true;
        }

        // Check if the workspace is already in use, if so, open a message and stop the launch before clearing
        boolean isLocked = false;
        try {
            BundleContext context = MDECore.getDefault().getBundleContext();
            ServiceReference[] references = context.getServiceReferences(Location.class.getName(),
                    "(type=osgi.configuration.area)"); //$NON-NLS-1$
            if (references.length > 0) {
                Object service = context.getService(references[0]);
                if (service instanceof Location) {
                    URL workspaceURL = new Path(workspace).toFile().toURI().toURL();
                    Location targetLocation = ((Location) service).createLocation(null, workspaceURL, false);
                    targetLocation.set(targetLocation.getDefault(), false);
                    isLocked = targetLocation.isLocked();
                }
            }
        } catch (InvalidSyntaxException e) {
            MDECore.log(e);
            isLocked = false;
        } catch (MalformedURLException e) {
            MDECore.log(e);
            isLocked = false;
        } catch (IOException e) {
            MDECore.log(e);
            isLocked = false;
        }

        if (isLocked) {
            Status status = new Status(IStatus.ERROR, IPDEConstants.PLUGIN_ID, WORKSPACE_LOCKED, null, null);
            IStatusHandler statusHandler = DebugPlugin.getDefault().getStatusHandler(status);
            if (statusHandler != null)
                statusHandler.handleStatus(status, new Object[] { workspace, configuration, fLastLaunchMode });
            monitor.done();
            return false;
        }

        File workspaceFile = new Path(workspace).toFile().getAbsoluteFile();
        if (configuration.getAttribute(IPDELauncherConstants.DOCLEAR, false) && workspaceFile.exists()) {
            if (configuration.getAttribute(IPDELauncherConstants.ASKCLEAR, true)) {
                int result = 0;
                if (configuration.getAttribute(IPDEConstants.DOCLEARLOG, false)) {
                    Status status = new Status(IStatus.ERROR, IPDEConstants.PLUGIN_ID, CLEAR_LOG, null, null);
                    IStatusHandler statusHandler = DebugPlugin.getDefault().getStatusHandler(status);
                    if (statusHandler != null)
                        result = ((Integer) statusHandler.handleStatus(status, null)).intValue();
                } else {
                    Status status = new Status(IStatus.ERROR, IPDEConstants.PLUGIN_ID, DELETE_WORKSPACE, null,
                            null);
                    IStatusHandler statusHandler = DebugPlugin.getDefault().getStatusHandler(status);
                    if (statusHandler != null)
                        result = ((Integer) statusHandler.handleStatus(status, workspaceFile.getPath())).intValue();
                }

                if (result == 2 /*Cancel Button*/ || result == -1 /*Dialog close button*/) {
                    monitor.done();
                    return false;
                } else if (result == 0) {
                    if (configuration.getAttribute(IPDEConstants.DOCLEARLOG, false)) {
                        LauncherUtils.clearWorkspaceLog(workspace);
                    } else {
                        CoreUtility.deleteContent(workspaceFile);
                    }
                }
            } else if (configuration.getAttribute(IPDEConstants.DOCLEARLOG, false)) {
                LauncherUtils.clearWorkspaceLog(workspace);
            } else {
                CoreUtility.deleteContent(workspaceFile);
            }
        }

        monitor.done();
        return true;
    }

    public static boolean generateConfigIni() throws CoreException {
        Status status = new Status(IStatus.ERROR, IPDEConstants.PLUGIN_ID, GENERATE_CONFIG_INI, null, null);
        IStatusHandler statusHandler = DebugPlugin.getDefault().getStatusHandler(status);
        return statusHandler == null ? true : ((Boolean) statusHandler.handleStatus(status, null)).booleanValue();
    }

    public static void validateProjectDependencies(ILaunchConfiguration launch, final IProgressMonitor monitor) {
        MDEPreferencesManager store = PDELaunchingPlugin.getDefault().getPreferenceManager();
        if (!store.getBoolean(com.siteview.mde.internal.launching.ILaunchingPreferenceConstants.PROP_AUTO_MANAGE))
            return;

        String timeStamp;
        boolean useDefault, autoAdd;
        try {
            timeStamp = launch.getAttribute(TIMESTAMP, "0"); //$NON-NLS-1$
            autoAdd = launch.getAttribute(IPDELauncherConstants.AUTOMATIC_ADD, true);
            useDefault = launch.getAttribute(IPDELauncherConstants.USE_DEFAULT, true);
            useDefault |= launch.getAttribute(IPDELauncherConstants.USEFEATURES, false);
            final ArrayList projects = new ArrayList();
            if (useDefault)
                handleUseDefault(timeStamp, projects);
            else if (autoAdd)
                handleDeselectedPlugins(launch, timeStamp, projects);
            else
                handleSelectedPlugins(launch, timeStamp, projects);

            if (!projects.isEmpty()) {
                Status status = new Status(IStatus.ERROR, IPDEConstants.PLUGIN_ID, ORGANIZE_MANIFESTS, null, null);
                IStatusHandler statusHandler = DebugPlugin.getDefault().getStatusHandler(status);
                if (statusHandler != null)
                    statusHandler.handleStatus(status, new Object[] { projects, monitor, getLastRun() });
            }

            ILaunchConfigurationWorkingCopy wc = null;
            if (launch.isWorkingCopy())
                wc = (ILaunchConfigurationWorkingCopy) launch;
            else
                wc = launch.getWorkingCopy();
            wc.setAttribute(TIMESTAMP, Long.toString(System.currentTimeMillis()));
            wc.doSave();
        } catch (CoreException e) {
        }
    }

    private static String getTimeStamp(IProject project) {
        IJavaProject jp = JavaCore.create(project);
        try {
            long timeStamp = 0;
            IClasspathEntry[] entries = jp.getResolvedClasspath(true);
            for (int i = 0; i < entries.length; i++) {
                if (entries[i].getEntryKind() == IClasspathEntry.CPE_SOURCE) {
                    File file;
                    IPath location = entries[i].getOutputLocation();
                    if (location == null)
                        location = jp.getOutputLocation();
                    IResource res = project.getWorkspace().getRoot().findMember(location);
                    IPath path = res == null ? null : res.getLocation();
                    if (path == null)
                        continue;
                    file = path.toFile();
                    Stack files = new Stack();
                    files.push(file);
                    while (!files.isEmpty()) {
                        file = (File) files.pop();
                        if (file.isDirectory()) {
                            File[] children = file.listFiles();
                            if (children != null) {
                                for (int j = 0; j < children.length; j++)
                                    files.push(children[j]);
                            }
                        } else if (file.getName().endsWith(".class") && timeStamp < file.lastModified()) //$NON-NLS-1$
                            timeStamp = file.lastModified();
                    }
                }
            }
            IFile[] otherFiles = new IFile[] { PDEProject.getManifest(project),
                    PDEProject.getBuildProperties(project) };
            for (int i = 0; i < otherFiles.length; i++) {
                IFile file = otherFiles[i];
                if (file != null) {
                    long fileTimeStamp = file.getRawLocation().toFile().lastModified();
                    if (timeStamp < fileTimeStamp)
                        timeStamp = fileTimeStamp;
                }
            }
            return Long.toString(timeStamp);
        } catch (JavaModelException e) {
        }
        return "0"; //$NON-NLS-1$
    }

    private static void handleUseDefault(String launcherTimeStamp, ArrayList projects) {
        IProject[] projs = ResourcesPlugin.getWorkspace().getRoot().getProjects();
        for (int i = 0; i < projs.length; i++) {
            if (!WorkspaceModelManager.isPluginProject(projs[i]))
                continue;
            String timestamp = getTimeStamp(projs[i]);
            if (timestamp.compareTo(launcherTimeStamp) > 0 && shouldAdd(projs[i], launcherTimeStamp, timestamp))
                projects.add(projs[i]);
        }
    }

    private static void handleSelectedPlugins(ILaunchConfiguration config, String timeStamp, ArrayList projects)
            throws CoreException {
        Map selectedPlugins = BundleLauncherHelper.getWorkspaceBundleMap(config, null,
                IPDELauncherConstants.SELECTED_WORKSPACE_PLUGINS);
        Iterator it = selectedPlugins.keySet().iterator();
        while (it.hasNext()) {
            IMonitorModelBase model = (IMonitorModelBase) it.next();
            IResource res = model.getUnderlyingResource();
            if (res != null) {
                IProject project = res.getProject();
                String projTimeStamp = getTimeStamp(project);
                if (projTimeStamp.compareTo(timeStamp) > 0 && shouldAdd(project, timeStamp, projTimeStamp))
                    projects.add(project);
            }
        }
    }

    private static void handleDeselectedPlugins(ILaunchConfiguration config, String launcherTimeStamp,
            ArrayList projects) throws CoreException {
        Map deSelectedPlugins = BundleLauncherHelper.getWorkspaceBundleMap(config, null,
                IPDELauncherConstants.DESELECTED_WORKSPACE_PLUGINS);
        IProject[] projs = ResourcesPlugin.getWorkspace().getRoot().getProjects();
        for (int i = 0; i < projs.length; i++) {
            if (!WorkspaceModelManager.isPluginProject(projs[i]))
                continue;
            IMonitorModelBase base = MonitorRegistry.findModel(projs[i]);
            if (base == null || base != null && deSelectedPlugins.containsKey(base))
                continue;
            String timestamp = getTimeStamp(projs[i]);
            if (timestamp.compareTo(launcherTimeStamp) > 0 && shouldAdd(projs[i], launcherTimeStamp, timestamp))
                projects.add(projs[i]);
        }
    }

    public static final void shutdown() {
        if (fLastRun == null)
            return;
        FileOutputStream stream = null;
        try {
            stream = new FileOutputStream(new File(getDirectory(), FILE_NAME));
            fLastRun.store(stream, "Cached timestamps"); //$NON-NLS-1$
            stream.flush();
            stream.close();
        } catch (IOException e) {
            MDECore.logException(e);
        } finally {
            try {
                if (stream != null)
                    stream.close();
            } catch (IOException e1) {
            }
        }
    }

    private static File getDirectory() {
        IPath path = MDECore.getDefault().getStateLocation().append(".cache"); //$NON-NLS-1$
        File directory = new File(path.toOSString());
        if (!directory.exists() || !directory.isDirectory())
            directory.mkdirs();
        return directory;
    }

    private static Properties getLastRun() {
        if (fLastRun == null) {
            fLastRun = new Properties();
            FileInputStream fis = null;
            try {
                File file = new File(getDirectory(), FILE_NAME);
                if (file.exists()) {
                    fis = new FileInputStream(file);
                    fLastRun.load(fis);
                    fis.close();
                }
            } catch (IOException e) {
                MDECore.logException(e);
            } finally {
                try {
                    if (fis != null)
                        fis.close();
                } catch (IOException e1) {
                }
            }
        }
        return fLastRun;
    }

    private static boolean shouldAdd(IProject proj, String launcherTS, String fileSystemTS) {
        String projTS = (String) getLastRun().get(proj.getName());
        if (projTS == null)
            return true;
        return ((projTS.compareTo(launcherTS) < 0) || (projTS.compareTo(fileSystemTS) < 0));
    }

    public static boolean requiresUI(ILaunchConfiguration configuration) {
        try {
            String projectID = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, ""); //$NON-NLS-1$
            if (projectID.length() > 0) {
                IResource project = PDELaunchingPlugin.getWorkspace().getRoot().findMember(projectID);
                if (project instanceof IProject) {
                    IMonitorModelBase model = MonitorRegistry.findModel((IProject) project);
                    if (model != null) {
                        Set plugins = DependencyManager.getSelfAndDependencies(model, null);
                        return plugins.contains("org.eclipse.swt"); //$NON-NLS-1$
                    }
                }
            }
        } catch (CoreException e) {
        }
        return true;
    }

    public static boolean clearWorkspaceLog(String workspace) {
        File logFile = new File(workspace, ".metadata" + File.separator + ".log"); //$NON-NLS-1$ //$NON-NLS-2$
        if (logFile != null && logFile.exists()) {
            return logFile.delete();
        }
        return true;
    }

    public static IStatus createErrorStatus(String message) {
        return new Status(IStatus.ERROR, PDELaunchingPlugin.getPluginId(), IStatus.OK, message, null);
    }

    /**
     * Updates the stores launch mode.  This should be called on any PDE Eclipse launch.  The launch mode
     * is passed to the status handler so it can open the correct launch configuration dialog
     * 
     * @param launchMode last known launch mode, see {@link ILaunch#getLaunchMode()}
     */
    public static void setLastLaunchMode(String launchMode) {
        fLastLaunchMode = launchMode;
    }
}