/// <summary> /// Folders Comparison of Comparator /// </summary> /// <param name="result"></param> /// <param name="resultAlbum"></param> /// <param name="recursive"></param> /// <param name="sourceAlbum"></param> /// <param name="targetAlbum"></param> private void compareFolders(SyncResult result, Album[] resultAlbum, Stack<CompareStackContent> recursive, Album sourceAlbum, Album targetAlbum) { try { /* Get the Necessary Metadata and Folder Info */ List<string> sourceSubFolders = getSubFoldersFromPath(sourceAlbum.getPath()); List<string> targetSubFolders = getSubFoldersFromPath(targetAlbum.getPath()); List<Album> sourceSubAlbums = sourceAlbum.getSubAlbum(); List<Album> targetSubAlbums = targetAlbum.getSubAlbum(); /* Merge into a Single List */ List<string> allSubFolders = mergeLists(sourceAlbum.getPath(), targetAlbum.getPath(), sourceSubFolders, targetSubFolders, sourceSubAlbums, targetSubAlbums); Album newSource, newTarget; foreach (string subName in allSubFolders) { bool SF = isFileExist(subName, sourceSubFolders); bool TF = isFileExist(subName, targetSubFolders); bool SA = isFileExist(subName, sourceSubAlbums); bool TA = isFileExist(subName, targetSubAlbums); if (SF && SA && TF && TA) // 1111 = 15 { // ALL EXIST: Recursion // Get the New Source and Target Album newSource = getSubAlbum(subName, sourceAlbum); newTarget = getSubAlbum(subName, targetAlbum); // Recursion = Push into Stack CompareStackContent tempStackContent = new CompareStackContent(); tempStackContent.source = newSource; tempStackContent.target = newTarget; recursive.Push(tempStackContent); continue; } else if (SF && SA && !TF && TA) // 1101 = 13 { // TARGET DELETED: Delete Source newSource = getSubAlbum(subName, sourceAlbum); targetAlbum.trim(Album.combinePath(targetAlbum.getPath(), subName), Album.TRIM_ALBUM); resultAlbum[SOURCE_DELETE].add(newSource); continue; } else if (SF && !SA && TF && !TA) // 1010 = 10 { // CREATE ALBUM METADATA: Recursion newSource = new Album(Album.combinePath(sourceAlbum.getPath(), subName)); newTarget = new Album(Album.combinePath(targetAlbum.getPath(), subName)); // ADD TO ALBUM sourceAlbum.add(newSource); targetAlbum.add(newTarget); // Recursion = Push into Stack CompareStackContent tempStackContent = new CompareStackContent(); tempStackContent.source = newSource; tempStackContent.target = newTarget; recursive.Push(tempStackContent); continue; } else if (SF && !SA && !TF && !TA) // 1000 = 8 { try { // NEW JOB: Move Source // POPULATE SA populate(sourceAlbum, Album.combinePath(sourceAlbum.getPath(), subName)); // COPY ALBUM SA -> TA populate(targetAlbum, Album.combinePath(targetAlbum.getPath(), subName), sourceAlbum); newSource = getSubAlbum(subName, sourceAlbum); resultAlbum[SOURCE_LATEST].add(newSource); } catch (UnauthorizedAccessException uae) { // IGNORE: } continue; } else if (!SF && SA && TF && TA) // 0111 = 7 { // DELETE TF newTarget = getSubAlbum(subName, targetAlbum); sourceAlbum.trim(Album.combinePath(sourceAlbum.getPath(), subName), Album.TRIM_ALBUM); resultAlbum[TARGET_DELETE].add(newTarget); continue; } else if (!SF && SA && !TF && TA) // 0101 = 5 { // ERASE ALBUM DATA sourceAlbum.trim(Album.combinePath(sourceAlbum.getPath(), subName), Album.TRIM_ALBUM); targetAlbum.trim(Album.combinePath(targetAlbum.getPath(), subName), Album.TRIM_ALBUM); continue; } else if (!SF && !SA && TF && !TA) // 0010 = 2 { try { // NEW JOB: Move Target // POPULATE TA populate(targetAlbum, Album.combinePath(targetAlbum.getPath(), subName)); // COPY ALBUM TA -> SA populate(sourceAlbum, Album.combinePath(sourceAlbum.getPath(), subName), targetAlbum); newTarget = getSubAlbum(subName, targetAlbum); resultAlbum[TARGET_LATEST].add(newTarget); } catch (UnauthorizedAccessException uae) { // IGNORE: } continue; } else // 0000 = 0 { throw new Exception(INVALID_ALBUM); } } } catch (UnauthorizedAccessException uae) { result.uaeThrown(); } }
/// <summary> /// Public compare function: /// Compare source album with target album and return the difference in an album array /// containing information about the difference of the two albums. /// </summary> /// <param name="sourceAlbum">Source album to be compared (cannot be null).</param> /// <param name="targetAlbum">Target album to be compared (cannot be null).</param> /// <returns> /// Album array containing the difference between the two albums: /// array[0] contains newer files in source album. /// array[1] contains newer files in target album. /// array[2] contains conflict files in source album. /// array[3] contains conflict files in target album. /// array[4] contains deleted files in source album. /// array[5] contains deleted files in target album. /// </returns> public SyncResult compare(Album srcAlbum, Album trgAlbum) { #region Pre Conditions Debug.Assert(srcAlbum != null, "Source Album cannot be null"); Debug.Assert(trgAlbum != null, "Target Album cannot be null"); #endregion #region Initialize Result SyncResult result = new SyncResult(); Album[] resultAlbum = createCompareResultAlbum(); #endregion #region Initialize Stack Stack<CompareStackContent> recursive = new Stack<CompareStackContent>(); CompareStackContent stackContent = new CompareStackContent(srcAlbum, trgAlbum); recursive.Push(stackContent); #endregion Album sourceAlbum, targetAlbum; #region Main Loop do /* Do-While Loop for Performance */ { /* Get the Element Inside Stack */ stackContent = recursive.Pop(); sourceAlbum = stackContent.source; targetAlbum = stackContent.target; /* Files Comparison */ compareFiles(result, resultAlbum, sourceAlbum, targetAlbum); /* Folders Comparison */ compareFolders(result, resultAlbum, recursive, sourceAlbum, targetAlbum); } while (recursive.Count != 0); #endregion // Put the Result Album in Result result.setResult(resultAlbum); #region Post Conditions Debug.Assert(result != null, "Result cannot be null"); #endregion return result; }