public Tiles_Home_AggregationViewer(RequestCache RequestSpecificValues, AggregationViewBag ViewBag) : base(RequestSpecificValues, ViewBag) { // Get the list of tiles string aggregation_tile_directory = Path.Combine(UI_ApplicationCache_Gateway.Settings.Servers.Base_Design_Location, ViewBag.Hierarchy_Object.ObjDirectory, "images", "tiles"); string[] jpeg_tiles = Directory.GetFiles(aggregation_tile_directory, "*.jpg"); // Compute the URL for these images string aggregation_tile_uri = RequestSpecificValues.Current_Mode.Base_URL + "design/aggregations/" + ViewBag.Hierarchy_Object.Code + "/images/tiles/"; // Get the list of all potential tiles, by checking name List <Tiles_Home_Single_Tile> allTiles = new List <Tiles_Home_Single_Tile>(); string bibid = null; string vid = null; foreach (string thisJpegTile in jpeg_tiles) { // Get the filename string thisFileName = Path.GetFileName(thisJpegTile); string thisFileNameSansExtension = Path.GetFileNameWithoutExtension(thisJpegTile); // Check for a link to the bibid/vid string bib_vid_for_link = String.Empty; if ((thisFileNameSansExtension.Length == 10) && (SobekCM_Item.is_bibid_format(thisFileNameSansExtension))) { bib_vid_for_link = thisFileNameSansExtension; bibid = bib_vid_for_link; vid = "00001"; } else if ((thisFileNameSansExtension.Length == 15) && (SobekCM_Item.is_bibid_format(thisFileNameSansExtension.Substring(0, 10))) && (SobekCM_Item.is_vids_format(thisFileNameSansExtension.Substring(10)))) { bib_vid_for_link = thisFileNameSansExtension.Substring(0, 10) + "/" + thisFileNameSansExtension.Substring(10); bibid = thisFileNameSansExtension.Substring(0, 10); vid = thisFileNameSansExtension.Substring(10); } else if ((thisFileNameSansExtension.Length == 16) && (SobekCM_Item.is_bibid_format(thisFileNameSansExtension.Substring(0, 10))) && (SobekCM_Item.is_vids_format(thisFileNameSansExtension.Substring(11)))) { bib_vid_for_link = thisFileNameSansExtension.Substring(0, 10) + "/" + thisFileNameSansExtension.Substring(11); bibid = thisFileNameSansExtension.Substring(0, 10); vid = thisFileNameSansExtension.Substring(11); } // If there was a link calculated, then use this jpeg if (!String.IsNullOrEmpty(bib_vid_for_link)) { allTiles.Add(new Tiles_Home_Single_Tile { JpegUri = aggregation_tile_uri + thisFileName, LinkUri = RequestSpecificValues.Current_Mode.Base_URL + bib_vid_for_link, BibID = bibid ?? String.Empty, VID = vid ?? String.Empty }); } } // Is the metadata cached? string cache_key = ViewBag.Hierarchy_Object.Code + ":TILE METADATA"; tileMetadata = HttpContext.Current.Cache.Get(cache_key) as Database_Results_Info; if (tileMetadata == null) { // Look for the metadat file string metadata_file = Path.Combine(aggregation_tile_directory, "tile_metadata.xml"); // If no file, try to create it if (!File.Exists(metadata_file)) { // Step through each image, collecting the bibs and vids List <string> bibs = new List <string>(); List <string> vids = new List <string>(); foreach (Tiles_Home_Single_Tile thisTile in allTiles) { bibs.Add(thisTile.BibID); vids.Add(thisTile.VID); } // Now, look up each of these bib/vids // First, pad the lists correctly while (bibs.Count % 10 != 0) { bibs.Add(String.Empty); vids.Add(String.Empty); } // Get the aggregation code string aggrCode = ViewBag.Hierarchy_Object.Code; // FOR TESTING DON'T USE COLLECTION CODE aggrCode = ""; // Start the results object Database_Results_Info allResults = new Database_Results_Info(); // Now, get the results int offset = 0; while (offset < bibs.Count) { //Get the results from the database Database_Results_Info results = Engine_Library.Database.Engine_Database.Metadata_By_Bib_Vid(aggrCode, bibs[offset + 0], vids[offset + 0], bibs[offset + 1], vids[offset + 1], bibs[offset + 2], vids[offset + 2], bibs[offset + 3], vids[offset + 3], bibs[offset + 4], vids[offset + 4], bibs[offset + 5], vids[offset + 5], bibs[offset + 6], vids[offset + 6], bibs[offset + 7], vids[offset + 7], bibs[offset + 8], vids[offset + 8], bibs[offset + 9], vids[offset + 9], null); // Combine into full results if ((results != null) && (results.Metadata_Labels != null) && (results.Metadata_Labels.Count > 0)) { allResults.Metadata_Labels = results.Metadata_Labels; } if ((results != null) && (results.Results != null) && (results.Results.Count > 0)) { allResults.Results.AddRange(results.Results); } offset += 10; } // Save these results StreamWriter writer = new StreamWriter(metadata_file, false); XmlSerializer x = new XmlSerializer(allResults.GetType()); x.Serialize(writer, allResults); writer.Close(); } // Check again, and let's read the metadata if (File.Exists(metadata_file)) { try { FileStream fs = new FileStream(metadata_file, FileMode.Open); XmlReader reader = XmlReader.Create(fs); XmlSerializer x = new XmlSerializer(typeof(Database_Results_Info)); // Use the Deserialize method to restore the object's state. tileMetadata = (Database_Results_Info)x.Deserialize(reader); fs.Close(); // Also put this in the cache HttpContext.Current.Cache.Insert(cache_key, tileMetadata, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(5)); } catch (Exception ee) { tileMetadata = null; } } } // If less than or equal to fifteen, copy over as is.. otherwise, choose random ones if (allTiles.Count <= 15) { selectedTiles.AddRange(allTiles); } else { Random randomGen = new Random(); while (selectedTiles.Count < 15) { int random_index = randomGen.Next(0, allTiles.Count); selectedTiles.Add(allTiles[random_index]); allTiles.RemoveAt(random_index); } } }
/// <summary> Looks in the aggregation design folders for tiles and pulls the metadata for each /// tile to enable the hover-over in the aggregation tile display </summary> /// <param name="Settings"> Instance-wide settings which may be required for this process </param> public override void DoWork(InstanceWide_Settings Settings) { // Get the spot where the aggregations sit string aggregation_base = Path.Combine(Settings.Servers.Base_Design_Location, "aggregations"); // Ensure it exists before continuing if (!Directory.Exists(aggregation_base)) { return; } // Step through each aggregation folder string[] aggregation_folders = Directory.GetDirectories(aggregation_base); foreach (string thisAggrFolder in aggregation_folders) { // Find the associated aggregation tiles folder string tile_folder = Path.Combine(thisAggrFolder, "images", "tiles"); // Skip this aggregation if it doesn't exist if (!Directory.Exists(tile_folder)) { continue; } // Get JPEG images string[] tile_images = Directory.GetFiles(tile_folder, "*.jpg"); // Skip this aggregation if no images exist if (tile_images.Length == 0) { continue; } // Step through each image, collecting the bibs and vids List <string> bibs = new List <string>(); List <string> vids = new List <string>(); foreach (string thisTile in tile_images) { string thisFileNameSansExtension = Path.GetFileNameWithoutExtension(thisTile); if ((thisFileNameSansExtension.Length == 10) && (SobekCM_Item.is_bibid_format(thisFileNameSansExtension))) { bibs.Add(thisFileNameSansExtension); vids.Add("00001"); } else if ((thisFileNameSansExtension.Length == 15) && (SobekCM_Item.is_bibid_format(thisFileNameSansExtension.Substring(0, 10))) && (SobekCM_Item.is_vids_format(thisFileNameSansExtension.Substring(10)))) { bibs.Add(thisFileNameSansExtension.Substring(0, 10)); vids.Add(thisFileNameSansExtension.Substring(10)); } else if ((thisFileNameSansExtension.Length == 16) && (SobekCM_Item.is_bibid_format(thisFileNameSansExtension.Substring(0, 10))) && (SobekCM_Item.is_vids_format(thisFileNameSansExtension.Substring(11)))) { bibs.Add(thisFileNameSansExtension.Substring(0, 10)); vids.Add(thisFileNameSansExtension.Substring(11)); } } // Skip if no valid bib/vid names were found if (bibs.Count == 0) { continue; } // Now, look up each of these bib/vids // First, pad the lists correctly while (bibs.Count % 10 != 0) { bibs.Add(String.Empty); vids.Add(String.Empty); } // Get the aggregation code string aggrCode = Path.GetFileName(thisAggrFolder); // FOR TESTING DON'T USE COLLECTION CODE aggrCode = ""; // Start the results object Database_Results_Info allResults = new Database_Results_Info(); // Now, get the results int offset = 0; while (offset < bibs.Count) { //Get the results from the database Database_Results_Info results = Engine_Library.Database.Engine_Database.Metadata_By_Bib_Vid(aggrCode, bibs[offset + 0], vids[offset + 0], bibs[offset + 1], vids[offset + 1], bibs[offset + 2], vids[offset + 2], bibs[offset + 3], vids[offset + 3], bibs[offset + 4], vids[offset + 4], bibs[offset + 5], vids[offset + 5], bibs[offset + 6], vids[offset + 6], bibs[offset + 7], vids[offset + 7], bibs[offset + 8], vids[offset + 8], bibs[offset + 9], vids[offset + 9], null); // Combine into full results if ((results != null) && (results.Metadata_Labels != null) && (results.Metadata_Labels.Count > 0)) { allResults.Metadata_Labels = results.Metadata_Labels; } if ((results != null) && (results.Results != null) && (results.Results.Count > 0)) { allResults.Results.AddRange(results.Results); } offset += 10; } // Save these results string cached_results_file = Path.Combine(tile_folder, "tile_metadata.xml"); StreamWriter writer = new StreamWriter(cached_results_file, false); XmlSerializer x = new XmlSerializer(allResults.GetType()); x.Serialize(writer, allResults); } }