public SPFileOutputStream(SPDirectory directory, SPFile file) { if (directory == null) { throw new ArgumentNullException("directory"); } if (file == null) { throw new ArgumentNullException("file"); } if (file.Exists == false) { throw new ArgumentException("A file object was passed, but the file does not exist. " + file.Url); } m_directory = directory; m_fileName = file.Name; m_fileUrl = SPUtility.ConcatUrls(file.Web.Url, file.ServerRelativeUrl); m_mutex = SPFileMutexManager.GrabMutex(m_fileUrl); m_mutex.WaitOne(); try { m_indexOutput = m_directory.CacheDirectory.CreateOutput(file.Name); } finally { m_mutex.ReleaseMutex(); } }
private static void CreateOrUpdateCachedFile(SPFile spFile, SPDirectory directory) { using (var spFileStream = spFile.OpenBinaryStream()) { using (var outputStream = directory.CreateCachedOutputAsStream(spFile.Name)) { DocumentStoreHelper.CopyStream(spFileStream, outputStream); outputStream.Flush(); } } directory.WriteCachedFileETag(spFile.Name, spFile.ETag); }
/// <summary> /// Utility method to get the most-relevant index searcher. If a index writer singleton exists for the target folder, uses that instance, otherwise returns a new index searcher. /// </summary> /// <param name="targetFolder">The target folder.</param> /// <returns>IndexSearcher.</returns> public static IndexSearcher GetIndexSearcher(SPFolder targetFolder) { IndexSearcher searcher; if (HasIndexWriterSingleton(targetFolder)) { var indexWriter = GetIndexWriterSingleton(targetFolder, false); var reader = indexWriter.GetReader(); searcher = new IndexSearcher(reader); } else { var directory = new SPDirectory(targetFolder); searcher = new IndexSearcher(directory); } return(searcher); }
public static IndexWriter GetIndexWriterSingleton(SPFolder targetFolder, bool createIndex) { var fullFolderUrl = SPUtility.ConcatUrls(targetFolder.ParentWeb.Url, targetFolder.ServerRelativeUrl); return(IndexWriters.GetOrAdd(fullFolderUrl, url => { var directory = new SPDirectory(targetFolder); //Block until a write lock is no longer present on the target folder. var spLock = directory.MakeLock(directory.GetLockId() + "-write"); spLock.Obtain(Lock.LOCK_OBTAIN_WAIT_FOREVER); spLock.Release(); var analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30); var writer = new IndexWriter(directory, analyzer, createIndex, IndexWriter.MaxFieldLength.UNLIMITED); return writer; })); }
public SPFileInputStream(SPDirectory directory, SPFile file) { if (directory == null) { throw new ArgumentNullException("directory"); } if (file == null) { throw new ArgumentNullException("file"); } var fileUrl = SPUtility.ConcatUrls(file.Web.Url, file.ServerRelativeUrl); m_directory = directory; m_mutex = SPFileMutexManager.GrabMutex(fileUrl); m_mutex.WaitOne(); try { if (!m_directory.CacheDirectory.FileExists(file.Name)) { CreateOrUpdateCachedFile(file, directory); } else { //Check the eTag. var cachedETag = m_directory.ReadCachedFileETag(file.Name); //If it doesn't match, re-retrieve the file from SharePoint. if (cachedETag != file.ETag) { CreateOrUpdateCachedFile(file, directory); } } m_indexInput = m_directory.CacheDirectory.OpenInput(file.Name); } finally { m_mutex.ReleaseMutex(); } }
/// <summary> /// Utility method to get the most-relevant simple faceted search. /// </summary> /// <param name="targetFolder"></param> /// <param name="groupByFields"></param> /// <returns></returns> public static SimpleFacetedSearch GetSimpleFacetedSearch(SPFolder targetFolder, params string[] groupByFields) { SimpleFacetedSearch facetedSearch; if (HasIndexWriterSingleton(targetFolder)) { var indexWriter = GetIndexWriterSingleton(targetFolder, false); var reader = indexWriter.GetReader(); facetedSearch = new SimpleFacetedSearch(reader, groupByFields); } else { var directory = new SPDirectory(targetFolder); var reader = IndexReader.Open(directory, true); facetedSearch = new SimpleFacetedSearch(reader, groupByFields); } return(facetedSearch); }