public void GetFileParserFromFileExtensionTest() { // Arrange string expectedFileParserName = "TsvFileParser"; // Act _iFileParser = _fileParserClient.GetFileParserFromFileExtension(_fileName); // Assert Assert.IsNotNull(_iFileParser); Assert.AreEqual(_iFileParser.GetType().Name, expectedFileParserName); }
protected void CheckFork(int currentIndex, DateTime start, IFileParser fileParser, IList <FileInfo> sourceFiles, DirectoryInfo targetInfo, IList <CountDownLatch> forkLatches) { int remainingFiles = sourceFiles.Count - currentIndex - 1; if (remainingFiles < 2) { // not enough data to check for a fork return; } DateTime curr = DateTime.Now; TimeSpan estimatedRemainingTime = TimeSpan.FromMilliseconds((sourceFiles.Count / (double)(currentIndex + 1)) * (curr - start).TotalMilliseconds); if (estimatedRemainingTime.TotalMilliseconds < 10000) { // seems to be fast enough - no fork needed return; } Log.Debug("Estimated time: " + (int)estimatedRemainingTime.TotalMilliseconds + "ms. Processing fork..."); int splittedRemainingFiles = remainingFiles / 2; // split half rounded down List <FileInfo> forkedSourceFiles = new List <FileInfo>(); while (splittedRemainingFiles > 0) { FileInfo forkedSourceFile = sourceFiles[sourceFiles.Count - 1]; forkedSourceFiles.Add(forkedSourceFile); sourceFiles.RemoveAt(sourceFiles.Count - 1); splittedRemainingFiles--; } splittedRemainingFiles = forkedSourceFiles.Count; CountDownLatch forkLatch = new CountDownLatch(1); forkLatches.Add(forkLatch); Thread thread = new Thread(new ThreadStart(delegate() { ParseFiles(fileParser, forkedSourceFiles, targetInfo, forkLatch); })); thread.Name = fileParser.GetType().Name + "-" + forkLatches.Count; thread.IsBackground = true; thread.Start(); Log.Debug("Forked " + splittedRemainingFiles + " item(s)"); }
public void AfterStarted() { DirectoryInfo targetInfo = new DirectoryInfo(TargetDir); targetInfo.Create(); Log.Info("Saving all generated images to '" + targetInfo.FullName + "'"); String[] sources = SourceDir.Split(';'); foreach (String source in sources) { Log.Info("Scanning for office files in '" + source + "'"); DirectoryInfo di = new DirectoryInfo(source); FileInfo[] directories = di.GetFiles("*", SearchOption.AllDirectories); IdentityHashMap <IFileParser, List <FileInfo> > queuedFilesMap = new IdentityHashMap <IFileParser, List <FileInfo> >(); foreach (FileInfo sourceFile in directories) { if (sourceFile.Name.Contains('~') || !sourceFile.Exists) { continue; } String lowercaseExtensionName = sourceFile.Extension.ToLowerInvariant(); if (lowercaseExtensionName.StartsWith(".")) { lowercaseExtensionName = lowercaseExtensionName.Substring(1); } IFileParser fileParser = fileParsers.GetExtension(lowercaseExtensionName); if (fileParser == null) { Log.Debug("Skipping '" + sourceFile.FullName + "': no parser configured for '" + lowercaseExtensionName + "'"); continue; } List <FileInfo> queuedFiles = queuedFilesMap.Get(fileParser); if (queuedFiles == null) { queuedFiles = new List <FileInfo>(); queuedFilesMap.Put(fileParser, queuedFiles); } queuedFiles.Add(sourceFile); } List <Thread> threads = new List <Thread>(); CountDownLatch latch = new CountDownLatch(queuedFilesMap.Count); foreach (Entry <IFileParser, List <FileInfo> > entry in queuedFilesMap) { IFileParser fileParser = entry.Key; IList <FileInfo> sourceFiles = entry.Value; Thread thread = new Thread(new ThreadStart(delegate() { ParseFiles(fileParser, sourceFiles, targetInfo, latch); })); thread.Name = fileParser.GetType().Name; thread.IsBackground = true; threads.Add(thread); } foreach (Thread thread in threads) { thread.Start(); } latch.Await(TimeSpan.FromMinutes(5)); // throw exception after some minutes } }