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