blob: 6322313803c4da0b14530084691fc75451366e1c [file] [log] [blame]
/*******************************************************************************
* 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);
}
}
}
}
}
}