/******************************************************************************* * Copyright (c) 2008, 2017 xored software, Inc. 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: * xored software, Inc. - initial API and Implementation (Alex Panchenko) *******************************************************************************/ package org.eclipse.dltk.core.search.indexing.core; import java.util.HashSet; import java.util.Set; import org.eclipse.core.runtime.CoreException; import org.eclipse.dltk.core.DLTKLanguageManager; import org.eclipse.dltk.core.IDLTKLanguageToolkit; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.IModelElementVisitor; import org.eclipse.dltk.core.IProjectFragment; import org.eclipse.dltk.core.IScriptProject; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.core.environment.EnvironmentManager; import org.eclipse.dltk.core.environment.IEnvironment; import org.eclipse.dltk.core.search.indexing.IProjectIndexer; import org.eclipse.dltk.internal.core.BuiltinProjectFragment; /** * @since 2.0 */ public class ProjectRequest extends IndexRequest { private final IScriptProject project; public ProjectRequest(IProjectIndexer indexer, IScriptProject project) { super(indexer); this.project = project; } @Override protected String getName() { return project.getElementName(); } static class SourceModuleCollector implements IModelElementVisitor { final Set<ISourceModule> modules = new HashSet<>(); @Override public boolean visit(IModelElement element) { if (element.getElementType() == IModelElement.SOURCE_MODULE) { modules.add((ISourceModule) element); return false; } return true; } } @Override protected void run() throws CoreException { IEnvironment environment = EnvironmentManager.getEnvironment(project); if (environment == null || !environment.connect()) { return; } final IDLTKLanguageToolkit toolkit = DLTKLanguageManager .getLanguageToolkit(project); final IProjectFragment[] fragments = project.getAllProjectFragments(); IProjectIndexer.Internal indexer = getIndexer(); final SourceModuleCollector moduleCollector = new SourceModuleCollector(); for (int i = 0; i < fragments.length; ++i) { if (isCancelled) { return; } final IProjectFragment fragment = fragments[i]; if (DEBUG) { log(" fragment " + fragment.getPath()); //$NON-NLS-1$ } if (fragment.isBuiltin()) { indexer.requestIfNotWaiting(new BuiltinProjectFragmentRequest( indexer, fragment, toolkit, ((BuiltinProjectFragment) fragment).lastModified())); } else if (fragment.isArchive()) { indexer.requestIfNotWaiting(new ArchiveProjectFragmentRequest( indexer, fragment, toolkit)); } else if (fragment.isExternal()) { indexer.requestIfNotWaiting(new ExternalProjectFragmentRequest( indexer, fragment, toolkit)); } else if (fragment.getParent().equals(project)) { // check to skip project dependencies fragment.accept(moduleCollector); } } indexer.request(new SourceModulesRequest(indexer, project, toolkit, moduleCollector.modules)); } @Override public boolean belongsTo(String jobFamily) { return jobFamily.equals(project.getProject().getName()); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((project == null) ? 0 : project.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!super.equals(obj)) return false; if (getClass() != obj.getClass()) return false; ProjectRequest other = (ProjectRequest) obj; if (project == null) { if (other.project != null) return false; } else if (!project.equals(other.project)) return false; return true; } }