| /******************************************************************************* |
| * Copyright (c) 2009 Red Hat 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: |
| * Red Hat - Initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jst.common.internal.modulecore; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.wst.common.componentcore.internal.flat.AbstractFlattenParticipant; |
| import org.eclipse.wst.common.componentcore.internal.flat.IFlatResource; |
| import org.eclipse.wst.common.componentcore.internal.flat.VirtualComponentFlattenUtility; |
| import org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.FlatComponentTaskModel; |
| import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; |
| import org.eclipse.wst.common.componentcore.resources.IVirtualReference; |
| |
| /** |
| * Copy the classpath LIB references from a child with |
| * a ../ runtime path into a receiving parent. |
| * |
| * @author rob |
| * |
| */ |
| public class AddClasspathLibReferencesParticipant extends AbstractFlattenParticipant { |
| private List<IFlatResource> list; |
| |
| |
| @Override |
| public boolean shouldIgnoreReference(IVirtualComponent rootComponent, |
| IVirtualReference referenced, FlatComponentTaskModel dataModel) { |
| if (referenced.getRuntimePath().toString().startsWith(IClasspathDependencyReceiver.RUNTIME_MAPPING_INTO_CONTAINER)) |
| return true; |
| return false; |
| } |
| |
| |
| @Override |
| public void finalize(IVirtualComponent component, |
| FlatComponentTaskModel dataModel, List<IFlatResource> resources) { |
| this.list = resources; |
| if( !(component instanceof IClasspathDependencyReceiver )) |
| return; |
| if( ((IClasspathDependencyReceiver)component).canReceiveClasspathDependencies()) |
| addReferencedComponentClasspathDependencies((IClasspathDependencyReceiver)component); |
| } |
| |
| private void addReferencedComponentClasspathDependencies(final IClasspathDependencyReceiver component) { |
| final IVirtualReference[] refs = component.getReferences(); |
| for (int i = 0; i < refs.length; i++) { |
| final IVirtualReference reference = refs[i]; |
| final IPath runtimePath = reference.getRuntimePath(); |
| final IVirtualComponent referencedComponent = reference.getReferencedComponent(); |
| |
| // if the reference cannot export dependencies, skip |
| if( !(referencedComponent instanceof IClasspathDependencyProvider) ) |
| continue; |
| |
| if (!referencedComponent.isBinary() && referencedComponent instanceof IClasspathDependencyProvider) { |
| final IVirtualReference[] cpRefs = ((IClasspathDependencyProvider) referencedComponent).getJavaClasspathReferences(); |
| for (int j = 0; j < cpRefs.length; j++) { |
| final IVirtualReference cpRef = cpRefs[j]; |
| IPath cpRefRuntimePath = cpRef.getRuntimePath(); |
| |
| if (cpRef.getReferencedComponent() instanceof IClasspathDependencyComponent) { |
| // want to avoid adding dups |
| IClasspathDependencyComponent cpComp = (IClasspathDependencyComponent) cpRef.getReferencedComponent(); |
| // don't want to process class folder refs here |
| if (cpComp.isClassFolder()) |
| continue; |
| |
| //if path isn't ../, it shouldn't be added here [bug 247090] |
| if (!cpRefRuntimePath.toString().startsWith(IClasspathDependencyReceiver.RUNTIME_MAPPING_INTO_CONTAINER)) |
| continue; |
| |
| // TODO: verify this cpRefRuntimePath is acceptable? |
| //if( !runtimePath.equals(component.getClasspathFolderPath(cpComp))) continue; |
| |
| cpRefRuntimePath = runtimePath.append(cpRefRuntimePath.removeFirstSegments(1)); |
| new VirtualComponentFlattenUtility(list, null).addFile(cpComp, cpRefRuntimePath, cpComp); |
| } |
| } |
| } |
| } |
| } |
| |
| |
| private List<IVirtualReference> getReferencedProjectComponentClasspathDependencies(final IClasspathDependencyReceiver component, FlatComponentTaskModel dataModel) { |
| final IVirtualReference[] refs = component.getReferences(); |
| List<IVirtualReference> validReferences = new ArrayList<IVirtualReference>(); |
| |
| for (int i = 0; i < refs.length; i++) { |
| final IVirtualReference reference = refs[i]; |
| final IVirtualComponent referencedComponent = reference.getReferencedComponent(); |
| |
| // if the reference cannot export dependencies, skip |
| if( !(referencedComponent instanceof IClasspathDependencyProvider) ) |
| continue; |
| |
| if (!referencedComponent.isBinary() && referencedComponent instanceof IClasspathDependencyProvider) { |
| final IVirtualReference[] cpRefs = ((IClasspathDependencyProvider) referencedComponent).getJavaClasspathReferences(); |
| for (int j = 0; j < cpRefs.length; j++) { |
| final IVirtualReference cpRef = cpRefs[j]; |
| IPath cpRefRuntimePath = cpRef.getRuntimePath(); |
| |
| // TODO: Create a new interface like IClasspathDependencyComponent but for project references |
| if (!(cpRef.getReferencedComponent() instanceof IClasspathDependencyComponent)) { |
| |
| //if path isn't ../, it shouldn't be added here [bug 247090] |
| if (!cpRefRuntimePath.toString().startsWith(IClasspathDependencyReceiver.RUNTIME_MAPPING_INTO_CONTAINER)) |
| continue; |
| |
| validReferences.add(new ClasspathLibVirtualReference(cpRef)); |
| |
| } |
| } |
| } |
| } |
| return validReferences; |
| |
| } |
| |
| @Override |
| public List<IVirtualReference> getChildModules(IVirtualComponent component, FlatComponentTaskModel dataModel){ |
| List<IVirtualReference> result = null; |
| if( !(component instanceof IClasspathDependencyReceiver )) |
| return null; |
| // Gather project classpath dependencies from child references |
| if( ((IClasspathDependencyReceiver)component).canReceiveClasspathDependencies()) |
| result = getReferencedProjectComponentClasspathDependencies((IClasspathDependencyReceiver)component, dataModel); |
| return result; |
| } |
| |
| |
| // Inner class used as a wrapper for VirtualReferences, delegating most of the methods to the wrapped object, except |
| // the getRuntimePath() method. This is needed so a reference to a virtual component can be added correctly to the receiving parent |
| private static class ClasspathLibVirtualReference implements IVirtualReference{ |
| private IVirtualReference ref; |
| ClasspathLibVirtualReference(IVirtualReference ref){ |
| this.ref = ref; |
| } |
| |
| public void create(int updateFlags, IProgressMonitor aMonitor) { |
| ref.create(updateFlags, aMonitor); |
| } |
| |
| public boolean exists() { |
| return ref.exists(); |
| } |
| |
| public String getArchiveName() { |
| return ref.getArchiveName(); |
| } |
| |
| public int getDependencyType() { |
| return ref.getDependencyType(); |
| } |
| |
| public IVirtualComponent getEnclosingComponent() { |
| return ref.getEnclosingComponent(); |
| } |
| |
| public IVirtualComponent getReferencedComponent() { |
| return ref.getReferencedComponent(); |
| } |
| |
| public IPath getRuntimePath() { |
| // remove the ../ portion of the path |
| return ref.getRuntimePath().removeFirstSegments(1); |
| } |
| |
| public boolean isDerived() { |
| return ref.isDerived(); |
| } |
| |
| public void setArchiveName(String archiveName) { |
| ref.setArchiveName(archiveName); |
| |
| } |
| |
| public void setDependencyType(int aDependencyType) { |
| ref.setDependencyType(aDependencyType); |
| |
| } |
| |
| public void setReferencedComponent( |
| IVirtualComponent referencedComponent, EObject dependentObject) { |
| ref.setReferencedComponent(referencedComponent, dependentObject); |
| |
| } |
| |
| public void setRuntimePath(IPath aRuntimePath) { |
| ref.setRuntimePath(aRuntimePath); |
| } |
| } |
| |
| // private boolean canExportClasspathComponentDependencies(IVirtualComponent component) { |
| // final IProject project = component.getProject(); |
| // // check for valid project type |
| // if (JavaEEProjectUtilities.isEJBProject(project) |
| // || JavaEEProjectUtilities.isDynamicWebProject(project) |
| // || JavaEEProjectUtilities.isJCAProject(project) |
| // || JavaEEProjectUtilities.isUtilityProject(project)) { |
| // return true; |
| // } |
| // return false; |
| // } |
| } |