org.eclipse.ajdt.internal.launching.LaunchConfigurationManagementUtils.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ajdt.internal.launching.LaunchConfigurationManagementUtils.java

Source

/**********************************************************************
 * Copyright (c) 2004 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: Sian January - initial version
 * ...
 **********************************************************************/

package org.eclipse.ajdt.internal.launching;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

import org.eclipse.ajdt.core.AJLog;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.launching.RuntimeClasspathEntry;
import org.eclipse.jdt.internal.ui.wizards.buildpaths.CPListElement;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
import org.eclipse.jdt.launching.JavaRuntime;

/**
 * Utilities for managing AspectJ launch configurations
 */
public class LaunchConfigurationManagementUtils {

    /**
     * Update the aspect path for launch configurations relating to the given
     * project
     * 
     * @param project -
     *            the project
     * @param existingAspectPathEntries -
     *            current aspect path
     * @param newAspectPathEntries -
     *            new aspect path
     */
    public static void updateAspectPaths(IJavaProject project, List existingAspectPathEntries,
            List newAspectPathEntries) {
        try {
            String projectName = project.getElementName();
            List configs = getLaunchConfigsForProject(projectName);
            for (Iterator iter = configs.iterator(); iter.hasNext();) {
                ILaunchConfiguration configuration = (ILaunchConfiguration) iter.next();
                IRuntimeClasspathEntry[] entries = JavaRuntime.computeUnresolvedRuntimeClasspath(configuration);
                List entriesAsList = new ArrayList(Arrays.asList(entries));

                for (Iterator iterator = existingAspectPathEntries.iterator(); iterator.hasNext();) {
                    IClasspathEntry entryToRemove = ((CPListElement) iterator.next()).getClasspathEntry();

                    for (Iterator iterator2 = entriesAsList.iterator(); iterator2.hasNext();) {
                        IRuntimeClasspathEntry entry = (IRuntimeClasspathEntry) iterator2.next();
                        if (entry.getClasspathProperty() == IRuntimeClasspathEntry.USER_CLASSES) {
                            if (entryToRemove.equals(entry.getClasspathEntry())) {
                                iterator2.remove();
                                break;
                            }
                        }
                    }
                }
                for (Iterator iterator = newAspectPathEntries.iterator(); iterator.hasNext();) {
                    IClasspathEntry newEntry = ((CPListElement) iterator.next()).getClasspathEntry();
                    if (newEntry.getEntryKind() != IClasspathEntry.CPE_CONTAINER) {
                        entriesAsList.add(new RuntimeClasspathEntry(newEntry));
                    } else {
                        IClasspathContainer container = JavaCore.getClasspathContainer(newEntry.getPath(), project);
                        if (container != null) {
                            IClasspathEntry[] containerEntries = container.getClasspathEntries();
                            for (int i = 0; i < containerEntries.length; i++) {
                                entriesAsList.add(new RuntimeClasspathEntry(containerEntries[i]));
                            }
                        }
                    }
                }
                IRuntimeClasspathEntry[] updatedEntries = (IRuntimeClasspathEntry[]) entriesAsList
                        .toArray(new IRuntimeClasspathEntry[0]);
                updateConfigurationClasspath(configuration, updatedEntries);
            }
        } catch (CoreException cEx) {
            AJLog.log(cEx.getMessage());
        }

    }

    /**
     * Update the outjar for launch configurations relating to the given
     * project
     * 
     * @param project -
     *            the project
     * @param oldOutJar -
     *            current output jar, or null if none exists
     * @param newOutJar -
     *            new output jar or null if none exists
     */
    public static void updateOutJar(IJavaProject project, IClasspathEntry oldOutJar, IClasspathEntry newOutJar) {
        try {
            String projectName = project.getElementName();
            List configs = getLaunchConfigsForProject(projectName);
            for (Iterator iter = configs.iterator(); iter.hasNext();) {
                ILaunchConfiguration configuration = (ILaunchConfiguration) iter.next();
                IRuntimeClasspathEntry[] entries = JavaRuntime.computeUnresolvedRuntimeClasspath(configuration);
                List entriesAsList = new ArrayList(Arrays.asList(entries));

                if (oldOutJar != null) {
                    for (Iterator iterator2 = entriesAsList.iterator(); iterator2.hasNext();) {
                        IRuntimeClasspathEntry entry = (IRuntimeClasspathEntry) iterator2.next();
                        if (entry.getClasspathProperty() == IRuntimeClasspathEntry.USER_CLASSES) {
                            if (oldOutJar.equals(entry.getClasspathEntry())) {
                                iterator2.remove();
                                break;
                            }
                        }
                    }
                }
                if (newOutJar != null) {
                    entriesAsList.add(new RuntimeClasspathEntry(newOutJar));
                }
                IRuntimeClasspathEntry[] updatedEntries = (IRuntimeClasspathEntry[]) entriesAsList
                        .toArray(new IRuntimeClasspathEntry[0]);
                updateConfigurationClasspath(configuration, updatedEntries);
            }
        } catch (CoreException cEx) {
            AJLog.log(cEx.getMessage());
        }
    }

    /**
     * Update and save a new classpath for the given launch configuration
     * 
     * @param configuration
     * @param updatedEntries
     */
    private static void updateConfigurationClasspath(ILaunchConfiguration configuration,
            IRuntimeClasspathEntry[] classpath) {
        ILaunchConfigurationWorkingCopy wc;
        try {
            wc = configuration.getWorkingCopy();

            wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_DEFAULT_CLASSPATH, false);
            try {
                List mementos = new ArrayList(classpath.length);
                for (int i = 0; i < classpath.length; i++) {
                    IRuntimeClasspathEntry entry = classpath[i];
                    mementos.add(entry.getMemento());
                }
                wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_CLASSPATH, mementos);
            } catch (CoreException e) {
                AJLog.log(e.getMessage());
            }
            wc.doSave();
        } catch (CoreException e1) {
            AJLog.log(e1.getMessage());
        }
    }

    /**
     * Get all the launch configurations for types in the given project
     * 
     * @param projectName
     */
    private static List getLaunchConfigsForProject(String projectName) {
        ILaunchConfigurationType configType = AspectJApplicationLaunchShortcut.getAJConfigurationType();
        List candidateConfigs = new ArrayList();
        try {
            ILaunchConfiguration[] configs = DebugPlugin.getDefault().getLaunchManager()
                    .getLaunchConfigurations(configType);
            candidateConfigs = new ArrayList(configs.length);
            for (int i = 0; i < configs.length; i++) {
                ILaunchConfiguration config = configs[i];
                if (config.getAttribute(IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME, "") //$NON-NLS-1$
                        .equals(projectName)) {
                    candidateConfigs.add(config);
                }
            }
        } catch (CoreException cEx) {
            AJLog.log(cEx.getMessage());
        }
        return candidateConfigs;
    }

}