/*********************************************************************** * Copyright (c) 2008, 2013 by SAP AG, Walldorf. * 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: * SAP AG - initial API and implementation * IBM - Java EE 7 support ***********************************************************************/ package org.eclipse.jst.jee.ui.internal.navigator; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IPath; import org.eclipse.jst.j2ee.componentcore.util.EARVirtualComponent; import org.eclipse.jst.j2ee.internal.J2EEVersionConstants; import org.eclipse.jst.j2ee.internal.plugin.IJ2EEModuleConstants; import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities; import org.eclipse.jst.j2ee.project.JavaEEProjectUtilities; import org.eclipse.jst.javaee.application.Application; import org.eclipse.jst.jee.ui.internal.navigator.ear.AbstractEarNode; import org.eclipse.jst.jee.ui.internal.navigator.ear.GroupEARProvider; import org.eclipse.jst.jee.ui.plugin.JEEUIPlugin; import org.eclipse.wst.common.componentcore.ComponentCore; import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; import org.eclipse.wst.common.componentcore.resources.IVirtualReference; import org.eclipse.wst.common.project.facet.core.IFacetedProject; import org.eclipse.wst.common.project.facet.core.IProjectFacet; import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager; /** * Application Client 5.0 Content provider is Deployment Descriptor content provider, * used for constructing of the descriptor tree in project explorer. * * @author Dimitar Giormov */ public class Ear5ContentProvider extends JEE5ContentProvider { private List getComponentReferencesAsList(List componentTypes, IVirtualComponent virtualComponent, IPath runtimePath) { List components = new ArrayList(); IVirtualComponent earComponent = virtualComponent; if (earComponent != null ) { IVirtualReference[] refComponents = earComponent.getReferences(); for (int i = 0; i < refComponents.length; i++) { IVirtualComponent module = refComponents[i].getReferencedComponent(); if (module == null) continue; // if component types passed in is null then return all components if (componentTypes == null || componentTypes.size() == 0) { components.add(refComponents[i]); } else { if (componentTypes.contains(JavaEEProjectUtilities.getJ2EEComponentType(module))) { components.add(refComponents[i]); } } } } return components; } public IVirtualReference[] getUtilityModuleReferences(IVirtualComponent component) { List explicitUtilityReferences = getComponentReferencesAsList(Collections.singletonList(J2EEProjectUtilities.UTILITY), component, null); // fetch other Utility Jars attached to the EAR project List implicitUtilityReferenceTypes = Arrays.asList(new String[] { IModuleConstants.JST_APPCLIENT_MODULE, IModuleConstants.JST_WEB_MODULE, IModuleConstants.JST_EJB_MODULE }); List implicitUtilityReferences = getComponentReferencesAsList(implicitUtilityReferenceTypes, component, null); List allUtilityModuleReferences = new ArrayList(); allUtilityModuleReferences.addAll(explicitUtilityReferences); allUtilityModuleReferences.addAll(implicitUtilityReferences); if(allUtilityModuleReferences.size() > 0) return (IVirtualReference[]) allUtilityModuleReferences.toArray(new IVirtualReference[allUtilityModuleReferences.size()]); return new IVirtualReference[0]; } public Object[] getChildren(Object aParentElement) { IProject project = null; List children = new ArrayList(); if (aParentElement instanceof GroupEARProvider) { children.addAll(((GroupEARProvider)aParentElement).getChildren()); } else if (aParentElement instanceof AbstractEarNode) { return ((AbstractEarNode) aParentElement).getModules().toArray(); } else if (aParentElement instanceof IAdaptable) { project = (IProject) ((IAdaptable) aParentElement).getAdapter(IPROJECT_CLASS); if (project != null && JavaEEProjectUtilities.isEARProject(project)) { IFacetedProject facetedProject; try { facetedProject = ProjectFacetsManager.create(project); IProjectFacet earFacet = ProjectFacetsManager.getProjectFacet(IModuleConstants.JST_EAR_MODULE); if (facetedProject != null && (facetedProject.hasProjectFacet(earFacet.getVersion(J2EEVersionConstants.VERSION_5_0_TEXT)) || facetedProject.hasProjectFacet(earFacet.getVersion(J2EEVersionConstants.VERSION_6_0_TEXT)) || facetedProject.hasProjectFacet(earFacet.getVersion(J2EEVersionConstants.VERSION_7_0_TEXT)))) { AbstractGroupProvider element = getCachedContentProvider(project); if (element != null){ children.add(element); } } } catch (CoreException e) { String msg = "Error in the JEEContentProvider.getChildren() for parent:" + aParentElement; //$NON-NLS-1$ JEEUIPlugin.logError(msg, e); } } } return children.toArray(); } public boolean hasChildren(Object element) { if (element instanceof AbstractEarNode) { return ((AbstractEarNode) element).getModules().size() > 0; } else if (element instanceof GroupEARProvider){ return true; } else return false; } public Object getParent(Object object) { if (object instanceof AbstractEarNode){ return ((AbstractEarNode) object).getEarProject(); } return null; } public Object[] getElements(Object inputElement) { return getChildren(inputElement); } @Override protected AbstractGroupProvider getNewContentProviderInstance(IProject project) { return new GroupEARProvider((Application) getCachedModelProvider(project).getModelObject(), (EARVirtualComponent)ComponentCore.createComponent(project)); } public EarLibVisitor getVisitor() { return new EarLibVisitor(); } protected class EarLibVisitor implements IResourceDeltaVisitor { private Set<IProject> projects = new HashSet<IProject>(); public boolean visit(IResourceDelta delta) throws CoreException { IResourceDelta[] affectedChildren = delta.getAffectedChildren(IResourceDelta.ADDED | IResourceDelta.REMOVED | IResourceDelta.REPLACED | IResourceDelta.CHANGED); if (affectedChildren != null){ for (int i = 0; i < affectedChildren.length; i++) { if (affectedChildren[i].getResource() != null && affectedChildren[i].getResource().getName() != null && (affectedChildren[i].getResource().getName().toLowerCase().endsWith(IJ2EEModuleConstants.JAR_EXT) || (affectedChildren[i].getResource().getName().equals(IJ2EEModuleConstants.JST_COMPONENT_FILE) && affectedChildren[i].getKind()==IResourceDelta.CHANGED))){ projects.add(affectedChildren[i].getResource().getProject()); } } } return true; } protected Set<IProject> getChangedProject() { return projects; } } @Override public void resourceChanged(IResourceChangeEvent event) { super.resourceChanged(event); if (event.getType() == IResourceChangeEvent.POST_CHANGE){ EarLibVisitor visitor = getVisitor(); if (visitor == null){ return; } try { event.getDelta().accept(visitor); Set<IProject> changedProject = visitor.getChangedProject(); for (IProject project : changedProject) { projectChanged(project); } } catch (CoreException e) { JEEUIPlugin.logError("Could not refresh changed project.", e); //$NON-NLS-1$ } } } }