| /******************************************************************************* |
| * Copyright (c) 2009, 2016 IBM Corporation and others. |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0. |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| * Zend Technologies |
| *******************************************************************************/ |
| package org.eclipse.dltk.internal.core.index2; |
| |
| import java.util.Collection; |
| import java.util.Map; |
| |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.dltk.core.DLTKLanguageManager; |
| import org.eclipse.dltk.core.IDLTKLanguageToolkit; |
| import org.eclipse.dltk.core.IDLTKLanguageToolkitExtension; |
| import org.eclipse.dltk.core.ISourceModule; |
| import org.eclipse.dltk.core.environment.EnvironmentPathUtils; |
| import org.eclipse.dltk.core.environment.IFileHandle; |
| import org.eclipse.dltk.core.index2.IIndexer; |
| import org.eclipse.dltk.core.index2.ProjectIndexer2; |
| import org.eclipse.dltk.core.search.indexing.AbstractJob; |
| import org.eclipse.dltk.internal.core.ExternalSourceModule; |
| import org.eclipse.dltk.internal.core.util.Util; |
| |
| /** |
| * Abstract request for performing operation on index. |
| * |
| * @author michael |
| * |
| */ |
| public abstract class AbstractIndexRequest extends AbstractJob { |
| |
| ProjectIndexer2 projectIndexer; |
| ProgressJob progressJob; |
| |
| public AbstractIndexRequest(ProjectIndexer2 indexer, ProgressJob progressJob) { |
| this.projectIndexer = indexer; |
| this.progressJob = progressJob; |
| } |
| |
| protected void reportToProgress(ISourceModule sourceModule) { |
| if (progressJob != null) { |
| String path; |
| IResource resource = sourceModule.getResource(); |
| if (resource != null) { |
| path = resource.getFullPath().toString(); |
| } else { |
| IDLTKLanguageToolkit toolkit = DLTKLanguageManager.getLanguageToolkit(sourceModule); |
| if (toolkit instanceof IDLTKLanguageToolkitExtension && ((IDLTKLanguageToolkitExtension) toolkit) |
| .isArchiveFileName(sourceModule.getPath().toString())) { |
| path = ((ExternalSourceModule) sourceModule).getFullPath().toString(); |
| } else { |
| path = EnvironmentPathUtils.getFile(sourceModule).getCanonicalPath(); |
| } |
| |
| } |
| progressJob.subTask(path); |
| } |
| } |
| |
| @Override |
| public int hashCode() { |
| final int prime = 31; |
| int result = 1; |
| result = prime * result + ((projectIndexer == null) ? 0 : projectIndexer.hashCode()); |
| return result; |
| } |
| |
| @Override |
| public boolean equals(Object obj) { |
| if (this == obj) |
| return true; |
| if (obj == null) |
| return false; |
| if (getClass() != obj.getClass()) |
| return false; |
| AbstractIndexRequest other = (AbstractIndexRequest) obj; |
| if (projectIndexer == null) { |
| if (other.projectIndexer != null) |
| return false; |
| } else if (!projectIndexer.equals(other.projectIndexer)) |
| return false; |
| return true; |
| } |
| |
| /** |
| * Analyzes source modules changes, and fills collections with source modules |
| * that need to be removed/re-indexed. |
| * |
| * @param containerPath Container path |
| * @param sourceModules Existing source modules under container path |
| * @param toRemove Result collection of source modules that need to be |
| * removed from index |
| * @param toReindex Result collection of source modules that need to be |
| * re-indexed |
| * @param toolkit Language toolkit |
| */ |
| public void analyzeSourceModuleChanges(IPath containerPath, Collection<ISourceModule> sourceModules, |
| Collection<String> toRemove, Collection<ISourceModule> toReindex) { |
| |
| IIndexer indexer = IndexerManager.getIndexer(); |
| if (indexer == null) { |
| return; |
| } |
| |
| Map<String, Long> documentNames = indexer.getDocuments(containerPath); |
| if (documentNames == null || documentNames.isEmpty()) { |
| toReindex.addAll(sourceModules); |
| return; |
| } |
| |
| toRemove.addAll(documentNames.keySet()); |
| |
| for (ISourceModule sourceModule : sourceModules) { |
| String relativePath = Util.relativePath(sourceModule.getPath(), containerPath.segmentCount()); |
| IFileHandle handle = EnvironmentPathUtils.getFile(sourceModule, false); |
| |
| if (toRemove.remove(relativePath)) { |
| if (documentNames.get(relativePath) < handle.lastModified()) { |
| toReindex.add(sourceModule); |
| } |
| } else { |
| toReindex.add(sourceModule); |
| } |
| } |
| } |
| } |