/******************************************************************************* * Copyright (c) 2007, 2011 Wind River Systems, 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: * Markus Schorn - initial API and implementation * IBM Corporation *******************************************************************************/ package org.eclipse.cdt.internal.core.indexer; import java.io.File; import java.io.IOException; import java.util.HashMap; import org.eclipse.cdt.core.index.IIndexFileLocation; import org.eclipse.cdt.core.model.AbstractLanguage; import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.core.parser.FileContent; import org.eclipse.cdt.core.parser.IScannerInfo; import org.eclipse.cdt.internal.core.index.IndexFileLocation; import org.eclipse.cdt.internal.core.parser.InternalParserUtil; import org.eclipse.cdt.internal.core.pdom.IndexerInputAdapter; import org.eclipse.cdt.internal.core.pdom.indexer.FileExistsCache; import org.eclipse.cdt.utils.UNCPathConverter; import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; /** * Provides information about the file paths represented as strings. * @since 5.0 */ public class StandaloneIndexerInputAdapter extends IndexerInputAdapter { private final HashMap<String, IIndexFileLocation> fIflCache= new HashMap<String, IIndexFileLocation>(); private final FileExistsCache fExistsCache; private final StandaloneIndexer fIndexer; public StandaloneIndexerInputAdapter(StandaloneIndexer indexer) { fIndexer= indexer; fExistsCache= new FileExistsCache(isCaseInsensitiveFileSystem()); } @Override public IScannerInfo getBuildConfiguration(int linkageID, Object tu) { return fIndexer.getScannerInfo(tu.toString()); } @Override public long getLastModified(IIndexFileLocation location) { return new File(URIUtil.toPath(location.getURI()).toOSString()).lastModified(); } @Override public String getEncoding(IIndexFileLocation ifl) { String encoding= getFileEncoding(getASTPath(ifl)); if (encoding == null) return InternalParserUtil.SYSTEM_DEFAULT_ENCODING; return encoding; } @Override public boolean isSourceUnit(Object tu) { return isValidSourceUnitName(tu.toString()); } @Override public boolean isIndexedOnlyIfIncluded(Object tu) { return false; } @Override public boolean isIndexedUnconditionally(IIndexFileLocation ifl) { return false; } @Override public boolean isSource(String filename) { return isValidSourceUnitName(filename); } @Override public long getFileSize(String astFilePath) { return new File(astFilePath).length(); } @Override public IIndexFileLocation resolveFile(Object tu) { return resolveASTPath(tu.toString()); } @Override public String getASTPath(IIndexFileLocation ifl) { return URIUtil.toPath(ifl.getURI()).toOSString(); } @Override public IIndexFileLocation resolveASTPath(String astPath) { IIndexFileLocation result= fIflCache.get(astPath); if (result == null) { try { astPath = new File(astPath).getCanonicalPath(); } catch (IOException e) { // use the original } //Standalone indexing stores the absolute paths of files being indexed result = new IndexFileLocation(UNCPathConverter.getInstance().toURI(astPath), null); fIflCache.put(astPath, result); } return result; } @Override public boolean doesIncludeFileExist(String includePath) { return fExistsCache.isFile(includePath); } @Override public IIndexFileLocation resolveIncludeFile(String includePath) { if (!fExistsCache.isFile(includePath)) { return null; } IIndexFileLocation result= fIflCache.get(includePath); if (result == null) { File file= new File(includePath); try { includePath = file.getCanonicalPath(); } catch (IOException e) { // use the original } //Stand-alone indexing stores the absolute paths of files being indexed result = new IndexFileLocation(UNCPathConverter.getInstance().toURI(includePath),null); fIflCache.put(includePath, result); } return result; } @Override public boolean isFileBuildConfigured(Object tu) { return isValidSourceUnitName(tu.toString()); } @Override public boolean canBePartOfSDK(IIndexFileLocation ifl) { return false; } @Override public FileContent getCodeReader(Object tu) { String stu = tu.toString(); String fileEncoding = getFileEncoding(stu); return FileContent.createForExternalFileLocation(stu, fileEncoding); } public String getFileEncoding(String stu) { String fileEncoding = null; // query file's encoding, if we find it and use it to create CodeReader FileEncodingRegistry fileEncodingRegistry = fIndexer.getFileEncodingRegistry(); if(fileEncodingRegistry != null){ fileEncoding = fileEncodingRegistry.getFileEncoding(stu); } if (fileEncoding == null) return InternalParserUtil.SYSTEM_DEFAULT_ENCODING; return fileEncoding; } @Override public Object getInputFile(IIndexFileLocation location) { return URIUtil.toPath(location.getURI()); } @Override public AbstractLanguage[] getLanguages(Object tu, boolean bothForHeaders) { ILanguage language = fIndexer.getLanguageMapper().getLanguage(tu.toString()); if (language instanceof AbstractLanguage) { return new AbstractLanguage[] {(AbstractLanguage) language}; } return new AbstractLanguage[0]; } private boolean isValidSourceUnitName(String file) { IPath path = new Path(file); if (fIndexer.getValidSourceUnitNames() == null || fIndexer.getValidSourceUnitNames().size() == 0) return true; return fIndexer.getValidSourceUnitNames().contains(path.getFileExtension()); } @SuppressWarnings("nls") @Override public boolean isCaseInsensitiveFileSystem() { return new File("a").equals(new File("A")); } }