Example #1
0
        /// <summary>
        /// Search one folder, add to results
        /// </summary>
        /// <param name="crit"></param>
        /// <param name="folder"></param>
        /// <param name="extFilter"></param>
        /// <param name="results"></param>
        protected virtual void SearchFolder(ICollection<Criterion> crit, Folder folder, Expression<Func<FileInfo, bool>> extFilter, InstanceRefList results)
        {
            DirectoryInfo dir = new DirectoryInfo(folder.Path);

            var query = (from file in dir.EnumerateFiles() select file).AsQueryable();

            if (extFilter != null)
            {
                query = query.Where(extFilter);
            }

            query = ApplyFileInfoCriteria(crit, query, folder);

            foreach (FileInfo f in query.ToList()) // TODO speed up; taking 14% of search time
            {
                if (results.List.Count >= MaxSearchResults)
                    break;

                if (Valid(f, crit)) // apply other criteria that need to be done on the file content
                {
                    FileFolderInstance i = CreateInstance();

                    // populate properties

                    // Method to be overridden in subclass.  Default = filename without extension.
                    i.ID = MapFileToId(f, folder);

                    i.EntityName = EntityName;
                    i.FileName = f.Name;
                    i.Status = MapFileToStatus(f, folder);
                    i.UniqueId = MapFileToUniqueId(f, folder);
                    i.UpdateDate = f.LastWriteTime;
                    i.ArrivalDate = f.CreationTime;
                    i.Location = folder.Name + "/" + f.Name;
                    i.Path = folder.Path + "/" + f.Name;
                    i.FileSize = f.Length;
                    i.User = User;
                    i.Password = Password;

                    PopulateCustomProperties(i);

                    InstanceRef iref = Memory.AddRef(i, this);
                    results.AddInstanceRef(iref);
                }
            }
        }
Example #2
0
 private void AddSubFolders(Folder folder, List<Folder> list, string parentName)
 {
     DirectoryInfo parent = new DirectoryInfo(folder.Path);
     foreach (var subdir in parent.EnumerateDirectories())
     {
         string prefix = (parentName != null) ? parentName + "/" : "";
         string name = prefix + subdir.Name;
         var child = new Folder(name, folder.Status, subdir.FullName);
         list.Add(child);
         AddSubFolders(child, list, name); // recursion to nested folders
     }
 }
Example #3
0
 // Use folder status as the default status.
 protected virtual string MapFileToStatus(FileInfo f, Folder folder)
 {
     return folder.Status;
 }
Example #4
0
 // Use folder + filename as the default Unique ID.
 protected virtual string MapFileToUniqueId(FileInfo f, Folder folder)
 {
     return folder.Name + "/" + f.Name;
 }
Example #5
0
 /// <summary>
 /// Should we search subfolders?
 /// </summary>
 /// <param name="folder">parent folder in question</param>
 /// <returns></returns>
 protected virtual bool IncludeSubFolders(Folder folder)
 {
     return IncludeSubfolders;
 }
Example #6
0
 // Use basename of file as the default ID.
 protected virtual string MapFileToId(FileInfo f, Folder folder)
 {
     return Util.Basename(f);
 }
Example #7
0
        // Should we search this folder, given the criteria?
        // Default: assumes folder status is based on folder name, including mapping in config file
        // Only support equal and not equal operations for folder/status values.
        // Also considers folder status if we're doing a "STUCK" search.
        protected virtual bool IncludeFolder(Folder folder, ICollection<Criterion> crit)
        {
            // First check STUCK criteria (skip Final folders)
            if (Criterion.HasStuckCriterion(crit) && !CheckForStuck(folder))
                return false;

            // Now check STATUS criteria (maps to folders)
            var statusCrit = (from c in crit where c.FieldName == Field.InstanceStatus select c).ToList();

            var notEqualThisFolder =
                (from c in statusCrit
                    where (c.Operation == Criterion.NotEqual && c.Value.Equals(folder.Status, StringComparison.InvariantCultureIgnoreCase))
                    select c).Any();
            if (notEqualThisFolder)
                return false;

            bool hasEqual = (from c in statusCrit where c.Operation == Criterion.Equal select c).Any();
            bool equalThisFolder =
                (from c in statusCrit
                 where (c.Operation == Criterion.Equal && c.Value.Equals(folder.Status, StringComparison.InvariantCultureIgnoreCase))
                 select c).Any();
            if (hasEqual && !equalThisFolder)
                return false;

            return true;
        }
Example #8
0
 /// <summary>
 /// Get the relevant subfolders in the specified parent folder.
 /// Includes recursively nested folders.
 /// </summary>
 /// <param name="folder"></param>
 /// <returns></returns>
 protected virtual List<Folder> GetSubFolders(Folder folder)
 {
     var list = new List<Folder>();
     AddSubFolders(folder, list, null);
     return list;
 }
Example #9
0
 /// <summary>
 /// Is this a folder where we should check for Stuck entities?
 /// </summary>
 protected virtual bool CheckForStuck(Folder folder)
 {
     return folder.Status != Constants.StatusComplete && folder.Status != Constants.StatusArchive;
 }
Example #10
0
        protected virtual IQueryable<FileInfo> ApplyFileInfoCriteria(ICollection<Criterion> crit, IQueryable<FileInfo> query, Folder folder)
        {
            foreach (Criterion c in crit)
            {

                if (c.FieldName == Field.EntityId)
                {
                    query = ApplyRequestIdCriteria(query, c);
                }
                else if (c.FieldName == Field.InstanceUpdateDate)
                {
                    query = ApplyUpdateDateCriteria(query, c);
                }
                else if (c.FieldName == Field.InstanceArrivalDate)
                {
                    query = ApplyArrivalDateCriteria(query, c);
                }
                else if (c.Operation == Criterion.Stuck)
                {
                    query = ApplyStuckCriteria(query, c);
                }

            }
            return query;
        }
Example #11
0
        /// <summary>
        /// initialization using data in ConfigData object.
        /// This should be called immediately after the constructor.
        /// Each Station subclass should call base.initialize(configData, memory) from its  own initialize() method.
        /// </summary>
        public override void Initialize(ConfigData configData, InstanceMemory memory, Resolver commandResolver)
        {
            base.Initialize(configData, memory, commandResolver);

            // do any other Station specific initialization here

            HomePath = configData.RequiredValue("homePath");
            if (!(HomePath.EndsWith(@"\") || HomePath.EndsWith(@"/")))
                HomePath += "/";

            User = configData.Value("user");
            Password = configData.Value("password");

            IncludeSubfolders = configData.BoolValue("includeSubfolders", false);

            string possibleError;
            var unc = ConnectUnc(out possibleError);

            try
            {

                EntityName = configData.RequiredValue("entityName");

                List<ConfigData> folderConfigs = configData.GetConfigSections("folder");
                if (folderConfigs.Count == 0)
                    throw new Exception("No folders configured for station " + this.GetType());
                foreach (ConfigData folderConfig in folderConfigs)
                {
                    string name = folderConfig.RequiredValue("name");
                    string status = folderConfig.Value("status");
                    if (status == null) status = name;
                    string path = HomePath + name;

                    if (Directory.Exists(path))
                    {
                        Folder f = new Folder(name, status, path);
                        Folders.Add(f);
                    }
                    else
                    {
                        Console.Error.WriteLine("WARNING: Directory not found: {0}", path);
                    }
                }

                if (Folders.Count == 0)
                {
                    string error = "No folders accessible for station " + this.GetType();
                    if (possibleError != null)
                        error += "; " + possibleError;
                    throw new Exception(error);
                }

                List<ConfigData> extConfigs = configData.GetConfigSections("extension");
                foreach (ConfigData extConfig in extConfigs)
                {
                    string ext = extConfig.Value();
                    if (string.IsNullOrEmpty(ext))
                    {
                        throw new Exception("Property is empty: extension");
                    }
                    Extensions.Add(ext);
                }

            }
            finally
            {
                if (unc != null) unc.Dispose();
            }
        }