예제 #1
0
        /// <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();
            }
        }
예제 #2
0
        /// <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;
        }