/******************************************************************************* * Copyright (c) 2000, 2007 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 *******************************************************************************/ package runjettyrun.tabs.action; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.jdt.core.IClasspathContainer; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaModel; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.debug.ui.IJavaDebugUIConstants; import org.eclipse.jdt.launching.IRuntimeClasspathEntry; import org.eclipse.jdt.launching.JavaRuntime; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.Window; import org.eclipse.ui.actions.SelectionListenerAction; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import runjettyrun.Plugin; import runjettyrun.tabs.action.helper.ClosedProjectFilter; import runjettyrun.tabs.action.helper.OutputFolderOnlyFilter; import runjettyrun.tabs.action.helper.SWTFactory; import runjettyrun.tabs.classpath.IClasspathViewer; /** * Adds a project to the runtime class path. */ public class AddClassFolderAction extends RuntimeClasspathAction { public AddClassFolderAction(IClasspathViewer viewer) { super("Add Class f&olders...", viewer); } /** * Prompts for a project to add. * * @see IAction#run() */ public void run() { List<ViewerFilter> filters = new ArrayList<ViewerFilter>(); filters.add(new ClosedProjectFilter()); filters.add(new OutputFolderOnlyFilter()); ElementTreeSelectionDialog dialog= SWTFactory.createAllWorkspaceFileSelectionDialog( getShell(), "Classes folder Selection", "Choose the class-folder to add to list ", filters ); MultiStatus status = new MultiStatus(Plugin.PLUGIN_ID, IJavaDebugUIConstants.INTERNAL_ERROR, "One or more exceptions occurred while adding projects.", null); //$NON-NLS-1$ if (dialog.open() == Window.OK) { Object[] selections = dialog.getResult(); List<IFolder> additions = new ArrayList<IFolder>(selections.length); for (int i = 0; i < selections.length; i++) { IFolder jp = (IFolder)selections[i]; additions.add(jp); } List<IRuntimeClasspathEntry> runtimeEntries = new ArrayList<IRuntimeClasspathEntry>(additions.size()); Iterator<IFolder> iter = additions.iterator(); while (iter.hasNext()) { IFolder jp = (IFolder)iter.next(); runtimeEntries.add(JavaRuntime.newArchiveRuntimeClasspathEntry(jp)); } IRuntimeClasspathEntry[] entries = (IRuntimeClasspathEntry[])runtimeEntries.toArray(new IRuntimeClasspathEntry[0]); getViewer().addEntries(entries); } if (!status.isOK()) { Plugin.statusDialog(status); } } /** * @see SelectionListenerAction#updateSelection(IStructuredSelection) */ protected boolean updateSelection(IStructuredSelection selection) { return getViewer().updateSelection(getActionType(), selection) && !getPossibleAdditions().isEmpty(); } protected int getActionType() { return ADD; } /** * Adds all projects required by <code>proj</code> to the list * <code>res</code> * * @param proj the project for which to compute required * projects * @param res the list to add all required projects too */ protected void collectRequiredProjects(IJavaProject proj, List<IJavaProject> res) throws JavaModelException { if (!res.contains(proj)) { res.add(proj); IJavaModel model= proj.getJavaModel(); IClasspathEntry[] entries= proj.getRawClasspath(); for (int i= 0; i < entries.length; i++) { IClasspathEntry curr= entries[i]; if (curr.getEntryKind() == IClasspathEntry.CPE_PROJECT) { IJavaProject ref= model.getJavaProject(curr.getPath().segment(0)); if (ref.exists()) { collectRequiredProjects(ref, res); } } } } } /** * Adds all exported entries defined by <code>proj</code> to the list * <code>runtimeEntries</code>. * * @param proj * @param runtimeEntries * @throws JavaModelException */ protected void collectExportedEntries(IJavaProject proj, List<IRuntimeClasspathEntry> runtimeEntries) throws CoreException { IClasspathEntry[] entries = proj.getRawClasspath(); for (int i = 0; i < entries.length; i++) { IClasspathEntry entry = entries[i]; if (entry.isExported()) { IRuntimeClasspathEntry rte = null; switch (entry.getEntryKind()) { case IClasspathEntry.CPE_CONTAINER: IClasspathContainer container = JavaCore.getClasspathContainer(entry.getPath(), proj); int kind = 0; switch (container.getKind()) { case IClasspathContainer.K_APPLICATION: kind = IRuntimeClasspathEntry.USER_CLASSES; break; case IClasspathContainer.K_SYSTEM: kind = IRuntimeClasspathEntry.BOOTSTRAP_CLASSES; break; case IClasspathContainer.K_DEFAULT_SYSTEM: kind = IRuntimeClasspathEntry.STANDARD_CLASSES; break; } rte = JavaRuntime.newRuntimeContainerClasspathEntry(entry.getPath(), kind, proj); break; case IClasspathEntry.CPE_LIBRARY: rte = JavaRuntime.newArchiveRuntimeClasspathEntry(entry.getPath()); rte.setSourceAttachmentPath(entry.getSourceAttachmentPath()); rte.setSourceAttachmentRootPath(entry.getSourceAttachmentRootPath()); break; case IClasspathEntry.CPE_PROJECT: String name = entry.getPath().segment(0); IProject p = ResourcesPlugin.getWorkspace().getRoot().getProject(name); if (p.exists()) { IJavaProject jp = JavaCore.create(p); if (jp.exists()) { rte = JavaRuntime.newProjectRuntimeClasspathEntry(jp); } } break; case IClasspathEntry.CPE_VARIABLE: rte = JavaRuntime.newVariableRuntimeClasspathEntry(entry.getPath()); break; default: break; } if (rte != null) { if (!runtimeEntries.contains(rte)) { runtimeEntries.add(rte); } } } } } }