コード例 #1
0
        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();
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        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;
            }));
        }
コード例 #5
0
        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();
            }
        }
コード例 #6
0
        /// <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);
        }