/******************************************************************************* * Copyright (c) 2009, 2016 IBM Corporation 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: * IBM Corporation - initial API and implementation * Zend Technologies *******************************************************************************/ package org.eclipse.dltk.core.index2; import org.eclipse.core.runtime.IPath; import org.eclipse.dltk.core.DLTKCore; import org.eclipse.dltk.core.IDLTKLanguageToolkit; import org.eclipse.dltk.core.IProjectFragment; import org.eclipse.dltk.core.IScriptProject; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.core.ModelException; import org.eclipse.dltk.core.search.indexing.IProjectIndexer; import org.eclipse.dltk.core.search.indexing.IndexManager; import org.eclipse.dltk.internal.core.ModelManager; import org.eclipse.dltk.internal.core.index2.AbstractIndexRequest; import org.eclipse.dltk.internal.core.index2.AddSourceModuleRequest; import org.eclipse.dltk.internal.core.index2.ExternalProjectFragmentRequest; import org.eclipse.dltk.internal.core.index2.ProgressJob; import org.eclipse.dltk.internal.core.index2.ProjectRequest; import org.eclipse.dltk.internal.core.index2.ReconcileSourceModuleRequest; import org.eclipse.dltk.internal.core.index2.RemoveContainerRequest; import org.eclipse.dltk.internal.core.index2.RemoveSourceModuleRequest; import org.eclipse.osgi.util.NLS; /** * @since 2.0 */ public class ProjectIndexer2 implements IProjectIndexer { private final IndexManager jobManager = ModelManager.getModelManager() .getIndexManager(); private final ProgressJob progressJob = new ProgressJob(jobManager); @Override public void indexLibrary(IScriptProject project, IPath path) { try { IProjectFragment fragment = project.findProjectFragment(path); if (fragment != null) { AbstractIndexRequest request = new ExternalProjectFragmentRequest( this, fragment, progressJob); jobManager.requestIfNotWaiting(request); } else { DLTKCore.warn(NLS.bind("Unknown project fragment: ''{0}''", path)); } } catch (Exception e) { DLTKCore.error(NLS.bind( "An exception is thrown while indexing: ''{0}''", path), e); } } @Override public void indexProject(IScriptProject project) { ProjectRequest request = new ProjectRequest(this, project, progressJob); jobManager.requestIfNotWaiting(request); } @Override public void indexProjectFragment(IScriptProject project, IPath path) { IProjectFragment fragmentToIndex = null; try { IProjectFragment[] fragments = project.getProjectFragments(); for (IProjectFragment fragment : fragments) { if (fragment.getPath().equals(path)) { fragmentToIndex = fragment; break; } } } catch (ModelException e) { DLTKCore.error("Failed to index fragment:" + path, e); } if (fragmentToIndex == null || !fragmentToIndex.isExternal() || fragmentToIndex.isBuiltin()) { ProjectRequest request = new ProjectRequest(this, project, progressJob); jobManager.requestIfNotWaiting(request); return; } ExternalProjectFragmentRequest request = new ExternalProjectFragmentRequest( this, fragmentToIndex, progressJob); jobManager.requestIfNotWaiting(request); } @Override public void indexSourceModule(ISourceModule module, IDLTKLanguageToolkit toolkit) { jobManager .request(new AddSourceModuleRequest(this, module, progressJob)); } @Override public void reconciled(ISourceModule workingCopy, IDLTKLanguageToolkit toolkit) { jobManager.request(new ReconcileSourceModuleRequest(this, workingCopy, progressJob)); } @Override public void removeLibrary(IScriptProject project, IPath path) { RemoveContainerRequest request = new RemoveContainerRequest(this, path, progressJob); jobManager.requestIfNotWaiting(request); } @Override public void removeProject(IPath projectPath) { RemoveContainerRequest request = new RemoveContainerRequest(this, projectPath, progressJob); jobManager.requestIfNotWaiting(request); } @Override public void removeProjectFragment(IScriptProject project, IPath path) { if (path.equals(project.getPath())) { // Project is removed through removeProject(...) return; } RemoveContainerRequest request = new RemoveContainerRequest(this, path, progressJob); jobManager.requestIfNotWaiting(request); } @Override public void removeSourceModule(IScriptProject project, String path) { jobManager.request(new RemoveSourceModuleRequest(this, project .getPath(), path, progressJob)); } @Override public void startIndexing() { // } @Override public boolean wantRefreshOnStart() { return true; } /** * @param request */ public void request(AbstractIndexRequest request) { jobManager.request(request); } }