package org.erlide.engine.model; import java.util.Collection; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.erlide.engine.model.root.SourcePathProvider; import org.erlide.util.ErlLogger; import org.erlide.util.services.ExtensionUtils; import com.google.common.collect.Lists; public class SourcePathUtils { public static Collection<IPath> getExtraSourcePathsForBuild(final IProject project) { return getExtraSourcePathsGeneric(project, new SPPMethod() { @Override public Collection<IPath> call(final IProject myProject) { return target.getSourcePathsForBuild(myProject); } }); } public static Collection<IPath> getExtraSourcePathsForModel(final IProject project) { return getExtraSourcePathsGeneric(project, new SPPMethod() { @Override public Collection<IPath> call(final IProject myProject) { return target.getSourcePathsForModel(myProject); } }); } public static Collection<IPath> getExtraSourcePathsForExecution( final IProject project) { return getExtraSourcePathsGeneric(project, new SPPMethod() { @Override public Collection<IPath> call(final IProject myProject) { return target.getSourcePathsForExecution(myProject); } }); } private static Collection<IPath> getExtraSourcePathsGeneric(final IProject project, final SPPMethod method) { final List<IPath> result = Lists.newArrayList(); Collection<SourcePathProvider> spps; try { spps = getSourcePathProviders(); for (final SourcePathProvider spp : spps) { method.setTarget(spp); final Collection<IPath> paths = method.call(project); result.addAll(paths); } } catch (final Exception e) { ErlLogger.error(e); } return result; } public static Collection<IPath> getExtraSourcePaths() { final IProject[] projects = ResourcesPlugin.getWorkspace().getRoot() .getProjects(); final List<IPath> result = Lists.newArrayList(); for (final IProject project : projects) { result.addAll(getExtraSourcePathsForModel(project)); } return result; } private static Collection<SourcePathProvider> sourcePathProviders = null; public static synchronized Collection<SourcePathProvider> getSourcePathProviders() { if (sourcePathProviders != null) { return sourcePathProviders; } sourcePathProviders = ExtensionUtils.getExtensions( "org.erlide.model.sourcePathProvider", SourcePathProvider.class); return sourcePathProviders; } private abstract static class SPPMethod { protected SourcePathProvider target; public void setTarget(final SourcePathProvider spp) { target = spp; } public abstract Collection<IPath> call(IProject project); } }