blob: 7cc5b4c7052a819645c79c795e6b425ec4dceff3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 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 org.eclipse.jst.servlet.ui.internal.navigator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
import org.eclipse.jst.servlet.ui.internal.plugin.ServletUIPlugin;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.navigator.CommonViewer;
import org.eclipse.ui.navigator.ICommonContentExtensionSite;
import org.eclipse.ui.navigator.INavigatorContentExtension;
import org.eclipse.ui.navigator.INavigatorContentService;
import org.eclipse.ui.navigator.IPipelinedTreeContentProvider;
import org.eclipse.ui.navigator.PipelinedShapeModification;
import org.eclipse.ui.navigator.PipelinedViewerUpdate;
public class WebJavaContentProvider implements IPipelinedTreeContentProvider {
private static final Object[] NO_CHILDREN = new Object[0];
private static final String JAVA_EXTENSION_ID = "org.eclipse.jdt.java.ui.javaContent"; //$NON-NLS-1$
/*
* JDT likes to make it interesting so just one of their viewer types is made internal To avoid
* the dependency, we use some reflection here to filter the type.
*/
private static Class INTERNAL_CONTAINER_CLASS;
static {
try {
INTERNAL_CONTAINER_CLASS = Class.forName("org.eclipse.jdt.internal.ui.packageview.ClassPathContainer"); //$NON-NLS-1$
} catch (Throwable t) {
// ignore if the class has been removed or renamed.
INTERNAL_CONTAINER_CLASS = null;
}
}
private CommonViewer commonViewer;
private ITreeContentProvider delegateContentProvider;
private final Map compressedNodes = new HashMap();
public void getPipelinedChildren(Object aParent, Set theCurrentChildren) {
try {
if (aParent instanceof IProject && ((IProject)aParent).hasNature(JavaCore.NATURE_ID) && J2EEProjectUtilities.isDynamicWebProject((IProject)aParent)) {
cleanJavaContribution(theCurrentChildren);
theCurrentChildren.add(getCompressedNode((IProject)aParent));
}
} catch (CoreException e) {
ServletUIPlugin.log(e);
}
}
private void cleanJavaContribution(Set theCurrentChildren) {
IJavaElement element = null;
for (Iterator iter = theCurrentChildren.iterator(); iter.hasNext();) {
Object child = iter.next();
if (child instanceof IResource && ((element = JavaCore.create((IResource) child)) != null) && element.exists())
iter.remove();
else if (child instanceof IJavaElement)
iter.remove();
else if (INTERNAL_CONTAINER_CLASS != null && INTERNAL_CONTAINER_CLASS.isInstance(child))
iter.remove();
}
}
private CompressedJavaProject getCompressedNode(IProject project) {
if (!J2EEProjectUtilities.isDynamicWebProject(project))
return null;
CompressedJavaProject result = (CompressedJavaProject) compressedNodes.get(project);
if (result == null) {
compressedNodes.put(project, result = new CompressedJavaProject(commonViewer, project));
}
return result;
}
public void getPipelinedElements(Object anInput, Set theCurrentElements) {
}
public Object getPipelinedParent(Object anObject, Object aSuggestedParent) {
try {
if (anObject instanceof IPackageFragmentRoot) {
IPackageFragmentRoot root = (IPackageFragmentRoot) anObject;
if (!root.isExternal()) {
if( aSuggestedParent instanceof IJavaProject ) {
return getCompressedNode( ((IJavaProject) aSuggestedParent).getProject() );
} else if ( aSuggestedParent instanceof IProject && ((IProject)aSuggestedParent).hasNature(JavaCore.NATURE_ID) && J2EEProjectUtilities.isDynamicWebProject((IProject)aSuggestedParent) ){
return getCompressedNode( ((IProject) aSuggestedParent) );
}
}
} else if(INTERNAL_CONTAINER_CLASS.isInstance(anObject)) {
if( aSuggestedParent instanceof IJavaProject ) {
return getCompressedNode( ((IJavaProject) aSuggestedParent).getProject() ).getCompressedJavaLibraries();
} else if ( aSuggestedParent instanceof IProject && ((IProject)aSuggestedParent).hasNature(JavaCore.NATURE_ID) && J2EEProjectUtilities.isDynamicWebProject((IProject)aSuggestedParent)){
return getCompressedNode( ((IProject) aSuggestedParent) ).getCompressedJavaLibraries();
}
}
} catch (CoreException e) {
ServletUIPlugin.log(e);
}
return null;
}
public PipelinedShapeModification interceptAdd(PipelinedShapeModification anAddModification) {
Object parent = anAddModification.getParent();
if (parent instanceof IPackageFragmentRoot) {
IPackageFragmentRoot sourceFolder = (IPackageFragmentRoot) parent;
if (J2EEProjectUtilities.isDynamicWebProject(sourceFolder.getJavaProject().getProject())) {
CompressedJavaProject compressedNode = getCompressedNode(sourceFolder.getJavaProject().getProject());
if(compressedNode.isFlatteningSourceFolder()) {
anAddModification.setParent(compressedNode);
}
}
}
return anAddModification;
}
public PipelinedShapeModification interceptRemove(PipelinedShapeModification aRemoveModification) {
Object parent = aRemoveModification.getParent();
Set children = aRemoveModification.getChildren();
for (Object child : children) {
if (child instanceof IFolder){
try {
IPackageFragment locatePackageFragment = locatePackageFragment((IFolder)child);
if(locatePackageFragment != null){
aRemoveModification.getChildren().remove(child);
aRemoveModification.getChildren().add(locatePackageFragment);
return aRemoveModification;
}
} catch (JavaModelException e) {
}
}
}
if (parent instanceof IPackageFragmentRoot) {
IPackageFragmentRoot sourceFolder = (IPackageFragmentRoot) parent;
if (J2EEProjectUtilities.isDynamicWebProject(sourceFolder.getJavaProject().getProject())) {
CompressedJavaProject compressedNode = getCompressedNode(sourceFolder.getJavaProject().getProject());
if(compressedNode.isFlatteningSourceFolder()) {
aRemoveModification.setParent(compressedNode);
}
}
}
return aRemoveModification;
}
private IPackageFragment locatePackageFragment(IFolder child) throws JavaModelException {
IJavaProject javaProject = JavaCore.create(child.getProject());
IPackageFragmentRoot[] packageFragmentRoots = javaProject.getPackageFragmentRoots();
for (int i = 0; i < packageFragmentRoots.length; i++) {
if(!packageFragmentRoots[i].isReadOnly() && !packageFragmentRoots[i].isExternal()){
if (packageFragmentRoots[i].getPackageFragment(child.getName())!= null){
return packageFragmentRoots[i].getPackageFragment(child.getName());
}
}
}
return null;
}
public boolean interceptRefresh(PipelinedViewerUpdate aRefreshSynchronization) {
Set refreshTargets = aRefreshSynchronization.getRefreshTargets();
for (Iterator iter = refreshTargets.iterator(); iter.hasNext();) {
Object refreshTarget = iter.next();
if (refreshTarget instanceof IPackageFragmentRoot) {
IPackageFragmentRoot sourceFolder = (IPackageFragmentRoot) refreshTarget;
if (J2EEProjectUtilities.isDynamicWebProject(sourceFolder.getJavaProject().getProject())) {
CompressedJavaProject compressedNode = getCompressedNode(sourceFolder.getJavaProject().getProject());
if(compressedNode.isFlatteningSourceFolder()) {
iter.remove(); // voids the iter but is okay because we're done with it
refreshTargets.add(compressedNode);
return true;
}
}
}
}
return false;
}
public boolean interceptUpdate(PipelinedViewerUpdate anUpdateSynchronization) {
Set refreshTargets = anUpdateSynchronization.getRefreshTargets();
for (Iterator iter = refreshTargets.iterator(); iter.hasNext();) {
Object refreshTarget = iter.next();
if (refreshTarget instanceof IPackageFragmentRoot) {
IPackageFragmentRoot sourceFolder = (IPackageFragmentRoot) refreshTarget;
if (sourceFolder.getJavaProject()!=null && sourceFolder.getJavaProject().exists() && sourceFolder.getJavaProject().isOpen() && J2EEProjectUtilities.isDynamicWebProject(sourceFolder.getJavaProject().getProject())) {
CompressedJavaProject compressedNode = getCompressedNode(sourceFolder.getJavaProject().getProject());
if(compressedNode.isFlatteningSourceFolder()) {
iter.remove(); // voids the iterator; but is okay because we're done with it
refreshTargets.add(compressedNode);
return true;
}
}
}
}
return false;
}
public void init(ICommonContentExtensionSite aSite) {
}
public Object[] getChildren(Object parentElement) {
if (delegateContentProvider != null) {
if (parentElement instanceof CompressedJavaProject) {
return ((CompressedJavaProject)parentElement).getChildren(delegateContentProvider);
} else if (parentElement instanceof CompressedJavaLibraries) {
return ((CompressedJavaLibraries)parentElement).getChildren(delegateContentProvider);
}
}
return NO_CHILDREN;
}
public Object getParent(Object element) {
if (element instanceof CompressedJavaProject)
return ((CompressedJavaProject) element).getProject();
if (element instanceof CompressedJavaLibraries)
return ((CompressedJavaLibraries) element).getCompressedProject();
return null;
}
public boolean hasChildren(Object element) {
return (element instanceof CompressedJavaProject || element instanceof CompressedJavaLibraries);
}
public Object[] getElements(Object inputElement) {
return NO_CHILDREN;
}
public void dispose() {
compressedNodes.clear();
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
if (viewer instanceof CommonViewer) {
commonViewer = (CommonViewer) viewer;
INavigatorContentService service = commonViewer.getNavigatorContentService();
INavigatorContentExtension javaext = service.getContentExtensionById(JAVA_EXTENSION_ID);
if (javaext != null)
delegateContentProvider = javaext.getContentProvider();
compressedNodes.clear();
}
}
public void restoreState(IMemento aMemento) {
}
public void saveState(IMemento aMemento) {
}
public boolean isClasspathContainer(Object o) {
return INTERNAL_CONTAINER_CLASS != null && INTERNAL_CONTAINER_CLASS.isInstance(o);
}
}