///******************************************************************************* // * Copyright (c) 2000, 2007 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 // *******************************************************************************/ //package org.eclipse.search.internal.core.text; // //import java.io.IOException; //import java.nio.charset.IllegalCharsetNameException; //import java.nio.charset.UnsupportedCharsetException; //import java.util.HashMap; //import java.util.Map; //import java.util.regex.Matcher; //import java.util.regex.Pattern; // //import org.eclipse.core.filebuffers.FileBuffers; //import org.eclipse.core.filebuffers.ITextFileBuffer; //import org.eclipse.core.filebuffers.ITextFileBufferManager; //import org.eclipse.core.filebuffers.LocationKind; // //import org.eclipse.core.runtime.CoreException; //import org.eclipse.core.runtime.IProgressMonitor; //import org.eclipse.core.runtime.IStatus; //import org.eclipse.core.runtime.MultiStatus; //import org.eclipse.core.runtime.NullProgressMonitor; //import org.eclipse.core.runtime.OperationCanceledException; //import org.eclipse.core.runtime.Platform; //import org.eclipse.core.runtime.Status; //import org.eclipse.core.runtime.content.IContentDescription; //import org.eclipse.core.runtime.content.IContentType; //import org.eclipse.core.runtime.content.IContentTypeManager; //import org.eclipse.core.runtime.jobs.Job; // //import org.eclipse.core.resources.IFile; // //import org.eclipse.jface.text.IDocument; // //import org.eclipse.ui.IEditorInput; //import org.eclipse.ui.IEditorPart; //import org.eclipse.ui.IEditorReference; //import org.eclipse.ui.IFileEditorInput; //import org.eclipse.ui.IWorkbench; //import org.eclipse.ui.IWorkbenchPage; //import org.eclipse.ui.IWorkbenchWindow; //import org.eclipse.ui.texteditor.ITextEditor; // //import org.eclipse.search.ui.NewSearchUI; // //import org.eclipse.search.core.text.TextSearchMatchAccess; //import org.eclipse.search.core.text.TextSearchRequestor; //import org.eclipse.search.core.text.TextSearchScope; // //import org.eclipse.search.internal.ui.Messages; //import org.eclipse.search.internal.ui.SearchMessages; //import org.eclipse.search.internal.ui.SearchPlugin; // ///** // * The visitor that does the actual work. // */ //public class TextSearchVisitor { // // public static class ReusableMatchAccess extends TextSearchMatchAccess { // // private int fOffset; // private int fLength; // private IFile fFile; // private CharSequence fContent; // // public void initialize(IFile file, int offset, int length, CharSequence content) { // fFile= file; // fOffset= offset; // fLength= length; // fContent= content; // } // // public IFile getFile() { // return fFile; // } // // public int getMatchOffset() { // return fOffset; // } // // public int getMatchLength() { // return fLength; // } // // public int getFileContentLength() { // return fContent.length(); // } // // public char getFileContentChar(int offset) { // return fContent.charAt(offset); // } // // public String getFileContent(int offset, int length) { // return fContent.subSequence(offset, offset + length).toString(); // must pass a copy! // } // } // // // private final TextSearchRequestor fCollector; // private final Matcher fMatcher; // // private Map fDocumentsInEditors; // // private IProgressMonitor fProgressMonitor; // // private int fNumberOfScannedFiles; // private int fNumberOfFilesToScan; // private IFile fCurrentFile; // // private final MultiStatus fStatus; // // private final FileCharSequenceProvider fFileCharSequenceProvider; // // private final ReusableMatchAccess fMatchAccess; // // public TextSearchVisitor(TextSearchRequestor collector, Pattern searchPattern) { // fCollector= collector; // fStatus= new MultiStatus(NewSearchUI.PLUGIN_ID, IStatus.OK, SearchMessages.TextSearchEngine_statusMessage, null); // // fMatcher= searchPattern.pattern().length() == 0 ? null : searchPattern.matcher(new String()); // // fFileCharSequenceProvider= new FileCharSequenceProvider(); // fMatchAccess= new ReusableMatchAccess(); // } // // public IStatus search(IFile[] files, IProgressMonitor monitor) { // fProgressMonitor= monitor == null ? new NullProgressMonitor() : monitor; // fNumberOfScannedFiles= 0; // fNumberOfFilesToScan= files.length; // fCurrentFile= null; // // Job monitorUpdateJob= new Job(SearchMessages.TextSearchVisitor_progress_updating_job) { // private int fLastNumberOfScannedFiles= 0; // // public IStatus run(IProgressMonitor inner) { // while (!inner.isCanceled()) { // IFile file= fCurrentFile; // if (file != null) { // String fileName= file.getName(); // Object[] args= { fileName, new Integer(fNumberOfScannedFiles), new Integer(fNumberOfFilesToScan)}; // fProgressMonitor.subTask(Messages.format(SearchMessages.TextSearchVisitor_scanning, args)); // int steps= fNumberOfScannedFiles - fLastNumberOfScannedFiles; // fProgressMonitor.worked(steps); // fLastNumberOfScannedFiles += steps; // } // try { // Thread.sleep(100); // } catch (InterruptedException e) { // return Status.OK_STATUS; // } // } // return Status.OK_STATUS; // } // }; // // try { // String taskName= fMatcher == null ? SearchMessages.TextSearchVisitor_filesearch_task_label : Messages.format(SearchMessages.TextSearchVisitor_textsearch_task_label, fMatcher.pattern().pattern()); // fProgressMonitor.beginTask(taskName, fNumberOfFilesToScan); // monitorUpdateJob.setSystem(true); // monitorUpdateJob.schedule(); // try { // fCollector.beginReporting(); // processFiles(files); // return fStatus; // } finally { // monitorUpdateJob.cancel(); // } // } finally { // fProgressMonitor.done(); // fCollector.endReporting(); // } // } // // public IStatus search(TextSearchScope scope, IProgressMonitor monitor) { // return search(scope.evaluateFilesInScope(fStatus), monitor); // } // // private void processFiles(IFile[] files) { // fDocumentsInEditors= evalNonFileBufferDocuments(); // for (int i= 0; i < files.length; i++) { // fCurrentFile= files[i]; // boolean res= processFile(fCurrentFile); // if (!res) // break; // } // fDocumentsInEditors= null; // } // // /** // * @return returns a map from IFile to IDocument for all open, dirty editors // */ // private Map evalNonFileBufferDocuments() { // Map result= new HashMap(); // IWorkbench workbench= SearchPlugin.getDefault().getWorkbench(); // IWorkbenchWindow[] windows= workbench.getWorkbenchWindows(); // for (int i= 0; i < windows.length; i++) { // IWorkbenchPage[] pages= windows[i].getPages(); // for (int x= 0; x < pages.length; x++) { // IEditorReference[] editorRefs= pages[x].getEditorReferences(); // for (int z= 0; z < editorRefs.length; z++) { // IEditorPart ep= editorRefs[z].getEditor(false); // if (ep instanceof ITextEditor && ep.isDirty()) { // only dirty editors // evaluateTextEditor(result, ep); // } // } // } // } // return result; // } // // private void evaluateTextEditor(Map result, IEditorPart ep) { // IEditorInput input= ep.getEditorInput(); // if (input instanceof IFileEditorInput) { // IFile file= ((IFileEditorInput) input).getFile(); // if (!result.containsKey(file)) { // take the first editor found // ITextFileBufferManager bufferManager= FileBuffers.getTextFileBufferManager(); // ITextFileBuffer textFileBuffer= bufferManager.getTextFileBuffer(file.getFullPath(), LocationKind.IFILE); // if (textFileBuffer != null) { // // file buffer has precedence // result.put(file, textFileBuffer.getDocument()); // } else { // // use document provider // IDocument document= ((ITextEditor) ep).getDocumentProvider().getDocument(input); // if (document != null) { // result.put(file, document); // } // } // } // } // } // // public boolean processFile(IFile file) { // try { // if (!fCollector.acceptFile(file) || fMatcher == null) { // return true; // } // // IDocument document= getOpenDocument(file); // // if (document != null) { // DocumentCharSequence documentCharSequence= new DocumentCharSequence(document); // // assume all documents are non-binary // locateMatches(file, documentCharSequence); // } else { // CharSequence seq= null; // try { // seq= fFileCharSequenceProvider.newCharSequence(file); // if (hasBinaryContent(seq, file) && !fCollector.reportBinaryFile(file)) { // return true; // } // locateMatches(file, seq); // } catch (FileCharSequenceProvider.FileCharSequenceException e) { // e.throwWrappedException(); // } finally { // if (seq != null) { // try { // fFileCharSequenceProvider.releaseCharSequence(seq); // } catch (IOException e) { // SearchPlugin.log(e); // } // } // } // } // } catch (UnsupportedCharsetException e) { // String[] args= { getCharSetName(file), file.getFullPath().makeRelative().toString()}; // String message= Messages.format(SearchMessages.TextSearchVisitor_unsupportedcharset, args); // fStatus.add(new Status(IStatus.WARNING, NewSearchUI.PLUGIN_ID, IStatus.WARNING, message, e)); // } catch (IllegalCharsetNameException e) { // String[] args= { getCharSetName(file), file.getFullPath().makeRelative().toString()}; // String message= Messages.format(SearchMessages.TextSearchVisitor_illegalcharset, args); // fStatus.add(new Status(IStatus.WARNING, NewSearchUI.PLUGIN_ID, IStatus.WARNING, message, e)); // } catch (IOException e) { // String[] args= { getExceptionMessage(e), file.getFullPath().makeRelative().toString()}; // String message= Messages.format(SearchMessages.TextSearchVisitor_error, args); // fStatus.add(new Status(IStatus.WARNING, NewSearchUI.PLUGIN_ID, IStatus.WARNING, message, e)); // } catch (CoreException e) { // String[] args= { getExceptionMessage(e), file.getFullPath().makeRelative().toString()}; // String message= Messages.format(SearchMessages.TextSearchVisitor_error, args); // fStatus.add(new Status(IStatus.WARNING, NewSearchUI.PLUGIN_ID, IStatus.WARNING, message, e)); // } catch (StackOverflowError e) { // String message= SearchMessages.TextSearchVisitor_patterntoocomplex0; // fStatus.add(new Status(IStatus.ERROR, NewSearchUI.PLUGIN_ID, IStatus.ERROR, message, e)); // return false; // } finally { // fNumberOfScannedFiles++; // } // if (fProgressMonitor.isCanceled()) // throw new OperationCanceledException(SearchMessages.TextSearchVisitor_canceled); // // return true; // } // // private boolean hasBinaryContent(CharSequence seq, IFile file) throws CoreException { // IContentDescription desc= file.getContentDescription(); // if (desc != null) { // IContentType contentType= desc.getContentType(); // if (contentType != null && contentType.isKindOf(Platform.getContentTypeManager().getContentType(IContentTypeManager.CT_TEXT))) { // return false; // } // } // // // avoid calling seq.length() at it runs through the complete file, // // thus it would do so for all binary files. // try { // int limit= FileCharSequenceProvider.BUFFER_SIZE; // for (int i= 0; i < limit; i++) { // if (seq.charAt(i) == '\0') { // return true; // } // } // } catch (IndexOutOfBoundsException e) { // } // return false; // } // // private void locateMatches(IFile file, CharSequence searchInput) throws CoreException { // try { // fMatcher.reset(searchInput); // int k= 0; // while (fMatcher.find()) { // int start= fMatcher.start(); // int end= fMatcher.end(); // if (end != start) { // don't report 0-length matches // fMatchAccess.initialize(file, start, end - start, searchInput); // boolean res= fCollector.acceptPatternMatch(fMatchAccess); // if (!res) { // return; // no further reporting requested // } // } // if (k++ == 20) { // if (fProgressMonitor.isCanceled()) { // throw new OperationCanceledException(SearchMessages.TextSearchVisitor_canceled); // } // k= 0; // } // } // } finally { // fMatchAccess.initialize(null, 0, 0, new String()); // clear references // } // } // // // private String getExceptionMessage(Exception e) { // String message= e.getLocalizedMessage(); // if (message == null) { // return e.getClass().getName(); // } // return message; // } // // private IDocument getOpenDocument(IFile file) { // IDocument document= (IDocument) fDocumentsInEditors.get(file); // if (document == null) { // ITextFileBufferManager bufferManager= FileBuffers.getTextFileBufferManager(); // ITextFileBuffer textFileBuffer= bufferManager.getTextFileBuffer(file.getFullPath(), LocationKind.IFILE); // if (textFileBuffer != null) { // document= textFileBuffer.getDocument(); // } // } // return document; // } // // private String getCharSetName(IFile file) { // try { // return file.getCharset(); // } catch (CoreException e) { // return "unknown"; //$NON-NLS-1$ // } // } // //} //