/******************************************************************************* * 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.List; import org.eclipse.core.resources.IContainer; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; 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; /** * Add classpath folder references. This is necessary because * these classpath folder references are not exactly stored as * IVirtualReference objects persisted in the component.xml, but rather * pulled in from another model. * * @author rob.stryker@jboss.com * */ public class AddClasspathFoldersParticipant extends AbstractFlattenParticipant { private List<IFlatResource> list; @Override public boolean shouldIgnoreReference(IVirtualComponent rootComponent, IVirtualReference referenced, FlatComponentTaskModel dataModel) { if( (rootComponent instanceof IClasspathDependencyProvider) && (referenced.getReferencedComponent() instanceof IClasspathDependencyComponent) && ((IClasspathDependencyComponent)referenced.getReferencedComponent()).isClassFolder()) return true; return false; } @Override public void finalize(IVirtualComponent component, FlatComponentTaskModel dataModel, List<IFlatResource> resources) { this.list = resources; if( !(component instanceof IClasspathDependencyProvider )) return; // Add all Java output folders that have publish/export attributes try { addClassFolderDependencies((IClasspathDependencyProvider)component); } catch( CoreException ce ) { // Ignore } } private void addClassFolderDependencies(final IClasspathDependencyProvider component) throws CoreException { if (!component.isBinary()) { final IVirtualReference[] cpRefs = component.getJavaClasspathReferences(); for (int i = 0; i < cpRefs.length; i++) { final IVirtualReference cpRef = cpRefs[i]; final IPath runtimePath = cpRef.getRuntimePath(); final IVirtualComponent comp = cpRef.getReferencedComponent(); if (comp instanceof IClasspathDependencyComponent) { final IClasspathDependencyComponent cpComp = (IClasspathDependencyComponent) comp; if (cpComp.isClassFolder() && cpComp.getClassFolder() != null) { IPath targetPath = null; targetPath = runtimePath.makeRelative(); final IContainer container = cpComp.getClassFolder(); new VirtualComponentFlattenUtility(list, null).addContainer(container, targetPath); } } } } } }