OSDN Git Service

初期インポート master
authoru6k.yu1 <u6k.yu1@gmail.com>
Sat, 30 Oct 2010 12:22:19 +0000 (21:22 +0900)
committeru6k.yu1 <u6k.yu1@gmail.com>
Sat, 30 Oct 2010 12:22:19 +0000 (21:22 +0900)
13 files changed:
backup/.classpath [new file with mode: 0644]
backup/.project [new file with mode: 0644]
backup/src/main/java/Main.java [new file with mode: 0644]
backup/src/main/java/jp/gr/java_conf/u6k/backup/BackupLog.java [new file with mode: 0644]
backup/src/main/java/jp/gr/java_conf/u6k/backup/BackupRepository.java [new file with mode: 0644]
backup/src/main/java/jp/gr/java_conf/u6k/backup/DiffInfo.java [new file with mode: 0644]
backup/src/main/java/jp/gr/java_conf/u6k/backup/DiffType.java [new file with mode: 0644]
backup/src/main/java/jp/gr/java_conf/u6k/backup/FileInfo.java [new file with mode: 0644]
backup/src/main/java/jp/gr/java_conf/u6k/backup/FileInfoRepository.java [new file with mode: 0644]
backup/src/main/java/jp/gr/java_conf/u6k/backup/PathUtil.java [new file with mode: 0644]
bak.vbs/bak.vbs [new file with mode: 0644]
bak.vbs/\83e\83X\83g.vbs [new file with mode: 0644]
bak.vbs/\94z\97ñ\81E\83R\83\8c\83N\83V\83\87\83\93.vbs [new file with mode: 0644]

diff --git a/backup/.classpath b/backup/.classpath
new file mode 100644 (file)
index 0000000..1e6d54b
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<classpath>\r
+       <classpathentry kind="src" path="src/main/java"/>\r
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
+       <classpathentry kind="output" path="bin"/>\r
+</classpath>\r
diff --git a/backup/.project b/backup/.project
new file mode 100644 (file)
index 0000000..20def52
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+       <name>backup</name>\r
+       <comment></comment>\r
+       <projects>\r
+       </projects>\r
+       <buildSpec>\r
+               <buildCommand>\r
+                       <name>org.eclipse.jdt.core.javabuilder</name>\r
+                       <arguments>\r
+                       </arguments>\r
+               </buildCommand>\r
+       </buildSpec>\r
+       <natures>\r
+               <nature>org.eclipse.jdt.core.javanature</nature>\r
+       </natures>\r
+</projectDescription>\r
diff --git a/backup/src/main/java/Main.java b/backup/src/main/java/Main.java
new file mode 100644 (file)
index 0000000..22b15f3
--- /dev/null
@@ -0,0 +1,13 @@
+import java.io.File;\r
+\r
+import jp.gr.java_conf.u6k.backup.BackupRepository;\r
+\r
+public class Main {\r
+\r
+    public static void main(String[] args) throws Exception {\r
+        // BackupLogRepository backupLogRepo = new BackupLogRepository(new File("D:/temp/bk"), new File("D:/game"));\r
+        BackupRepository backupLogRepo = new BackupRepository(new File("D:/temp/bk"));\r
+        backupLogRepo.backup();\r
+    }\r
+\r
+}\r
diff --git a/backup/src/main/java/jp/gr/java_conf/u6k/backup/BackupLog.java b/backup/src/main/java/jp/gr/java_conf/u6k/backup/BackupLog.java
new file mode 100644 (file)
index 0000000..a3ef4e2
--- /dev/null
@@ -0,0 +1,137 @@
+\r
+package jp.gr.java_conf.u6k.backup;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import javax.xml.parsers.DocumentBuilder;\r
+import javax.xml.parsers.DocumentBuilderFactory;\r
+import javax.xml.parsers.ParserConfigurationException;\r
+\r
+import org.w3c.dom.Document;\r
+import org.w3c.dom.Element;\r
+import org.w3c.dom.Node;\r
+import org.xml.sax.SAXException;\r
+\r
+public class BackupLog {\r
+\r
+    private int            revision;\r
+\r
+    private long           backupTime;\r
+\r
+    private List<DiffInfo> diffInfoList = new ArrayList<DiffInfo>();\r
+\r
+    public BackupLog() {\r
+    }\r
+\r
+    public BackupLog(File logFile) throws ParserConfigurationException, SAXException, IOException {\r
+        // 引数を確認します。\r
+        if (logFile == null) {\r
+            throw new NullPointerException("logFile == null");\r
+        }\r
+        // ログ・ファイルを読み込みます。\r
+        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();\r
+        DocumentBuilder db = dbf.newDocumentBuilder();\r
+        Document doc = db.parse(logFile);\r
+\r
+        Element logElement = doc.getDocumentElement();\r
+        this.revision = Integer.parseInt(logElement.getAttribute("revision"));\r
+        this.backupTime = Long.parseLong(logElement.getAttribute("time"));\r
+\r
+        for (int i = 0; i < logElement.getChildNodes().getLength(); i++) {\r
+            Node n = logElement.getChildNodes().item(i);\r
+            if ("add".equals(n.getNodeName()) || "delete".equals(n.getNodeName()) || "modify".equals(n.getNodeName())) {\r
+                Element ele = (Element) n;\r
+\r
+                String path = ele.getAttribute("path");\r
+                long lastModified = Long.parseLong(ele.getAttribute("lastModified"));\r
+                long size = Long.parseLong(ele.getAttribute("size"));\r
+                String hash = ele.getAttribute("hash");\r
+                boolean file = Boolean.parseBoolean(ele.getAttribute("file"));\r
+                DiffType type;\r
+                if ("add".equals(ele.getNodeName())) {\r
+                    type = DiffType.ADDED;\r
+                } else if ("delete".equals(ele.getNodeName())) {\r
+                    type = DiffType.DELETED;\r
+                } else if ("modify".equals(ele.getNodeName())) {\r
+                    type = DiffType.MODIFIED;\r
+                } else if ("nochange".equals(ele.getNodeName())) {\r
+                    type = DiffType.NO_CHANGE;\r
+                } else {\r
+                    throw new IllegalArgumentException("type can not understand.");\r
+                }\r
+\r
+                FileInfo fi = new FileInfo(path, lastModified, size, hash, file);\r
+                DiffInfo di = new DiffInfo(fi, type);\r
+                this.diffInfoList.add(di);\r
+            }\r
+        }\r
+    }\r
+\r
+    public int getRevision() {\r
+        return this.revision;\r
+    }\r
+\r
+    public void setRevision(int revision) {\r
+        this.revision = revision;\r
+    }\r
+\r
+    public long getBackupTime() {\r
+        return this.backupTime;\r
+    }\r
+\r
+    public void setBackupTime(long backupTime) {\r
+        this.backupTime = backupTime;\r
+    }\r
+\r
+    public List<DiffInfo> getDiffInfoList() {\r
+        return this.diffInfoList;\r
+    }\r
+\r
+    public void setDiffInfoList(List<DiffInfo> diffInfoList) {\r
+        this.diffInfoList = diffInfoList;\r
+    }\r
+\r
+    public String toXmlString() {\r
+        StringBuilder sb = new StringBuilder();\r
+\r
+        sb.append("<log revision=\"" + this.revision + "\" time=\"" + this.backupTime + "\">\r\n");\r
+\r
+        for (DiffInfo diffInfo : this.diffInfoList) {\r
+            sb.append("    ");\r
+            switch (diffInfo.getType()) {\r
+                case ADDED:\r
+                    sb.append("<add");\r
+                    break;\r
+                case DELETED:\r
+                    sb.append("<delete");\r
+                    break;\r
+                case MODIFIED:\r
+                    sb.append("<modify");\r
+                    break;\r
+                case NO_CHANGE:\r
+                    sb.append("<nochange");\r
+                    break;\r
+                default:\r
+                    throw new IllegalArgumentException("diffInfo.getType() can not understand.[type=\"" + diffInfo.getType() + "\"]");\r
+            }\r
+            sb.append(" path=\"" + diffInfo.getPath() + "\"");\r
+            sb.append(" lastModified=\"" + diffInfo.getLastModified() + "\"");\r
+            sb.append(" size=\"" + diffInfo.getSize() + "\"");\r
+            if (diffInfo.getHash() != null) {\r
+                sb.append(" hash=\"" + diffInfo.getHash() + "\"");\r
+            } else {\r
+                sb.append(" hash=\"\"");\r
+            }\r
+            sb.append(" file=\"" + diffInfo.isFile() + "\"");\r
+            sb.append("/>\r\n");\r
+        }\r
+\r
+        sb.append("</log>");\r
+\r
+        return sb.toString();\r
+    }\r
+\r
+}\r
diff --git a/backup/src/main/java/jp/gr/java_conf/u6k/backup/BackupRepository.java b/backup/src/main/java/jp/gr/java_conf/u6k/backup/BackupRepository.java
new file mode 100644 (file)
index 0000000..d1e47ea
--- /dev/null
@@ -0,0 +1,306 @@
+\r
+package jp.gr.java_conf.u6k.backup;\r
+\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.FileOutputStream;\r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.Calendar;\r
+import java.util.Collections;\r
+import java.util.Comparator;\r
+import java.util.List;\r
+import java.util.Properties;\r
+\r
+import javax.xml.parsers.ParserConfigurationException;\r
+\r
+import org.xml.sax.SAXException;\r
+\r
+public class BackupRepository {\r
+\r
+    private File               repoDir;\r
+\r
+    private File               backupDir;\r
+\r
+    private int                lastRev;\r
+\r
+    private FileInfoRepository lastRevRepo;\r
+\r
+    public BackupRepository(File repoDir, File backupDir) throws IOException {\r
+        /*\r
+         * 引数を確認します。\r
+         */\r
+        if (repoDir == null) {\r
+            throw new NullPointerException("repoDir == null");\r
+        }\r
+        if (repoDir.exists()) {\r
+            throw new IllegalArgumentException("repoDir.exists()");\r
+        }\r
+        if (backupDir == null) {\r
+            throw new NullPointerException("backupDir == null");\r
+        }\r
+        if (!backupDir.exists()) {\r
+            throw new IllegalArgumentException("!backupDir.exists()");\r
+        }\r
+        if (!backupDir.isDirectory()) {\r
+            throw new IllegalArgumentException("!backupDir.isDirectory()");\r
+        }\r
+        /*\r
+         * リポジトリを作成します。\r
+         */\r
+        repoDir = repoDir.getCanonicalFile();\r
+        backupDir = backupDir.getCanonicalFile();\r
+\r
+        if (!repoDir.mkdirs()) {\r
+            throw new IOException("「" + repoDir.getAbsolutePath() + "」ディレクトリの作成に失敗しました。");\r
+        }\r
+\r
+        // 設定フォルダを作成します。\r
+        File configDir = new File(repoDir, "config");\r
+        if (!configDir.mkdirs()) {\r
+            throw new IOException("「" + configDir.getAbsolutePath() + "」ディレクトリの作成に失敗しました。");\r
+        }\r
+\r
+        File configFile = new File(configDir, "config.properties");\r
+        FileOutputStream fout = new FileOutputStream(configFile);\r
+        try {\r
+            Properties props = new Properties();\r
+            props.put("backupDir", backupDir.getAbsolutePath());\r
+            props.store(fout, "");\r
+        } finally {\r
+            fout.close();\r
+        }\r
+\r
+        // ログ・フォルダを作成します。\r
+        File logDir = new File(repoDir, "log");\r
+        if (!logDir.mkdirs()) {\r
+            throw new IOException("「" + logDir.getAbsolutePath() + "」ディレクトリの作成に失敗しました。");\r
+        }\r
+\r
+        // ファイル・フォルダを作成します。\r
+        File fileDir = new File(repoDir, "file");\r
+        if (!fileDir.mkdirs()) {\r
+            throw new IOException("「" + fileDir.getAbsolutePath() + "」ディレクトリの作成に失敗しました。");\r
+        }\r
+\r
+        /*\r
+         * 状態を初期化します。\r
+         */\r
+        this.repoDir = repoDir;\r
+        this.backupDir = backupDir;\r
+        this.lastRev = 0;\r
+        this.lastRevRepo = new FileInfoRepository();\r
+    }\r
+\r
+    public BackupRepository(File repoDir) throws IOException, ParserConfigurationException, SAXException {\r
+        /*\r
+         * 引数を確認します。\r
+         */\r
+        if (repoDir == null) {\r
+            throw new NullPointerException("repoDir == null");\r
+        }\r
+        /*\r
+         * 状態を初期化します。\r
+         */\r
+        repoDir = repoDir.getCanonicalFile();\r
+        this.repoDir = repoDir;\r
+        // 設定を読み込みます。\r
+        File configDir = new File(repoDir, "config");\r
+        File configFile = new File(configDir, "config.properties");\r
+        FileInputStream fin = new FileInputStream(configFile);\r
+        try {\r
+            Properties props = new Properties();\r
+            props.load(fin);\r
+\r
+            this.backupDir = new File(props.getProperty("backupDir"));\r
+        } finally {\r
+            fin.close();\r
+        }\r
+\r
+        // 最新のファイル情報リポジトリを構築します。\r
+        File logDir = new File(repoDir, "log");\r
+\r
+        this.lastRevRepo = BackupRepository.buildLastRevision(logDir);\r
+        this.lastRev = BackupRepository.getLastRevision(logDir);\r
+    }\r
+\r
+    public void backup() throws IOException {\r
+        File logDir = new File(this.repoDir, "log");\r
+        File fileDir = new File(this.repoDir, "file");\r
+\r
+        this.lastRevRepo = BackupRepository.backup(this.lastRevRepo, this.lastRev, this.backupDir, logDir, fileDir);\r
+        this.lastRev++;\r
+    }\r
+\r
+    private static FileInfoRepository backup(FileInfoRepository lastRevRepo, int lastRev, File backupDir, File logDir, File fileDir) throws IOException {\r
+        /*\r
+         * 引数を確認します。\r
+         */\r
+        if (lastRevRepo == null) {\r
+            throw new NullPointerException("lastRevRepo == null");\r
+        }\r
+        if (backupDir == null) {\r
+            throw new NullPointerException("backupDir == null");\r
+        }\r
+        if (logDir == null) {\r
+            throw new NullPointerException("logDir == null");\r
+        }\r
+        if (fileDir == null) {\r
+            throw new NullPointerException("fileDir == null");\r
+        }\r
+        /*\r
+         * バックアップを行います。\r
+         */\r
+        FileInfoRepository nextRevRepo = new FileInfoRepository(backupDir);\r
+\r
+        List<DiffInfo> diffInfoList = nextRevRepo.diff(lastRevRepo);\r
+\r
+        BackupLog log = new BackupLog();\r
+        log.setRevision(lastRev + 1);\r
+        log.setBackupTime(Calendar.getInstance().getTimeInMillis());\r
+        log.setDiffInfoList(diffInfoList);\r
+\r
+        BackupRepository.saveFile(backupDir, fileDir, log);\r
+        BackupRepository.saveLog(logDir, log);\r
+\r
+        return nextRevRepo;\r
+    }\r
+\r
+    private static void saveLog(File logDir, BackupLog log) throws IOException {\r
+        // 引数を確認します。\r
+        if (logDir == null) {\r
+            throw new NullPointerException("logDir == null");\r
+        }\r
+        if (log == null) {\r
+            throw new NullPointerException("log == null");\r
+        }\r
+        // ログをファイルに保存します。\r
+        File logFile = new File(logDir, log.getRevision() + ".log");\r
+\r
+        FileOutputStream fout = new FileOutputStream(logFile);\r
+        try {\r
+            fout.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n".getBytes("UTF-8"));\r
+            fout.write(log.toXmlString().getBytes("UTF-8"));\r
+        } finally {\r
+            fout.close();\r
+        }\r
+    }\r
+\r
+    private static void saveFile(File backupDir, File fileDir, BackupLog log) throws IOException {\r
+        // 引数を確認します。\r
+        if (backupDir == null) {\r
+            throw new NullPointerException("backupDir == null");\r
+        }\r
+        if (fileDir == null) {\r
+            throw new NullPointerException("fileDir == null");\r
+        }\r
+        if (log == null) {\r
+            throw new NullPointerException("log == null");\r
+        }\r
+        // バックアップ対象ファイルをコピーします。\r
+        File revFileDir = new File(fileDir, Integer.toString(log.getRevision()));\r
+        if (!revFileDir.mkdirs()) {\r
+            throw new IOException("「" + revFileDir.getAbsolutePath() + "」ディレクトリの作成に失敗しました。");\r
+        }\r
+\r
+        for (DiffInfo diff : log.getDiffInfoList()) {\r
+            if (diff.isFile() && (diff.getType() == DiffType.ADDED || diff.getType() == DiffType.MODIFIED)) {\r
+                String path = diff.getPath().replace('/', File.separatorChar);\r
+                File srcFile = new File(backupDir, path);\r
+                File destFile = new File(revFileDir, path);\r
+                if (!destFile.getParentFile().exists()) {\r
+                    if (!destFile.getParentFile().mkdirs()) {\r
+                        throw new IOException("「" + destFile.getParentFile().getAbsolutePath() + "」ディレクトリの作成に失敗しました。");\r
+                    }\r
+                }\r
+                BackupRepository.copyFile(srcFile, destFile);\r
+            }\r
+        }\r
+    }\r
+\r
+    private static void copyFile(File srcFile, File destFile) throws IOException {\r
+        // 引数を確認します。\r
+        if (srcFile == null) {\r
+            throw new NullPointerException("srcFile == null");\r
+        }\r
+        if (destFile == null) {\r
+            throw new NullPointerException("destFile == null");\r
+        }\r
+        // ファイルをコピーします。\r
+        FileInputStream fin = new FileInputStream(srcFile);\r
+        try {\r
+            FileOutputStream fout = new FileOutputStream(destFile);\r
+            try {\r
+                int len;\r
+                byte[] buf = new byte[1024 * 1024];\r
+                while ((len = fin.read(buf)) != -1) {\r
+                    fout.write(buf, 0, len);\r
+                }\r
+            } finally {\r
+                fout.close();\r
+            }\r
+        } finally {\r
+            fin.close();\r
+        }\r
+    }\r
+\r
+    private static FileInfoRepository buildLastRevision(File logDir) throws ParserConfigurationException, SAXException, IOException {\r
+        // 引数を確認します。\r
+        if (logDir == null) {\r
+            throw new NullPointerException("logDir == null");\r
+        }\r
+        // 最新のファイル情報リポジトリを構築します。\r
+        List<File> logFileList = new ArrayList<File>();\r
+        for (File logFile : logDir.listFiles()) {\r
+            logFileList.add(logFile);\r
+        }\r
+        Collections.sort(logFileList, new LogFileOrderByNameComparator());\r
+\r
+        FileInfoRepository lastRevRepo = new FileInfoRepository();\r
+\r
+        for (File logFile : logFileList) {\r
+            BackupLog log = new BackupLog(logFile);\r
+            lastRevRepo = lastRevRepo.patch(log.getDiffInfoList());\r
+        }\r
+\r
+        return lastRevRepo;\r
+    }\r
+\r
+    private static int getLastRevision(File logDir) {\r
+        // 引数を確認します。\r
+        if (logDir == null) {\r
+            throw new NullPointerException("logDir == null");\r
+        }\r
+        // 最新のリビジョン番号を取得します。\r
+        List<File> logFileList = new ArrayList<File>();\r
+        for (File logFile : logDir.listFiles()) {\r
+            logFileList.add(logFile);\r
+        }\r
+        Collections.sort(logFileList, new LogFileOrderByNameComparator());\r
+\r
+        if (logFileList.size() == 0) {\r
+            return 0;\r
+        }\r
+        File lastRevLogFile = logFileList.get(logFileList.size() - 1);\r
+        int lastRev = Integer.parseInt(lastRevLogFile.getName().substring(0, lastRevLogFile.getName().indexOf(".")));\r
+        return lastRev;\r
+    }\r
+\r
+    private static class LogFileOrderByNameComparator implements Comparator<File> {\r
+\r
+        public int compare(File o1, File o2) {\r
+            int rev1 = Integer.parseInt(o1.getName().substring(0, o1.getName().indexOf(".")));\r
+            int rev2 = Integer.parseInt(o2.getName().substring(0, o2.getName().indexOf(".")));\r
+\r
+            if (rev1 > rev2) {\r
+                return 1;\r
+            } else if (rev1 < rev2) {\r
+                return -1;\r
+            } else {\r
+                return 0;\r
+            }\r
+        }\r
+\r
+    }\r
+\r
+}\r
diff --git a/backup/src/main/java/jp/gr/java_conf/u6k/backup/DiffInfo.java b/backup/src/main/java/jp/gr/java_conf/u6k/backup/DiffInfo.java
new file mode 100644 (file)
index 0000000..05c3c7d
--- /dev/null
@@ -0,0 +1,58 @@
+\r
+package jp.gr.java_conf.u6k.backup;\r
+\r
+public class DiffInfo extends FileInfo {\r
+\r
+    private DiffType type;\r
+\r
+    public DiffInfo(FileInfo from, FileInfo to, DiffType type) {\r
+        super(DiffInfo.superClassState(from, to, type));\r
+        // 引数を確認します。\r
+        if (from == null && to == null) {\r
+            throw new NullPointerException("from == null && to == null");\r
+        }\r
+        if (type == null) {\r
+            throw new NullPointerException("type == null");\r
+        }\r
+        // 状態を初期化します。\r
+        this.type = type;\r
+    }\r
+\r
+    public DiffInfo(FileInfo fileInfo, DiffType type) {\r
+        super(fileInfo);\r
+        // 引数を確認します。\r
+        if (fileInfo == null) {\r
+            throw new NullPointerException("fileInfo == null");\r
+        }\r
+        // 状態を初期化します。\r
+        this.type = type;\r
+    }\r
+\r
+    private static FileInfo superClassState(FileInfo from, FileInfo to, DiffType type) {\r
+        // 引数を確認します。\r
+        if (from == null && to == null) {\r
+            throw new NullPointerException("from == null && to == null");\r
+        }\r
+        if (type == null) {\r
+            throw new NullPointerException("type == null");\r
+        }\r
+        // 親インスタンスを初期化するために正しいFileInfoインスタンスを選択します。\r
+        switch (type) {\r
+            case ADDED:\r
+                return to;\r
+            case DELETED:\r
+                return from;\r
+            case MODIFIED:\r
+                return to;\r
+            case NO_CHANGE:\r
+                return from;\r
+            default:\r
+                throw new IllegalArgumentException("type can not understand.[type=" + type + "]");\r
+        }\r
+    }\r
+\r
+    public DiffType getType() {\r
+        return this.type;\r
+    }\r
+\r
+}\r
diff --git a/backup/src/main/java/jp/gr/java_conf/u6k/backup/DiffType.java b/backup/src/main/java/jp/gr/java_conf/u6k/backup/DiffType.java
new file mode 100644 (file)
index 0000000..ff8b110
--- /dev/null
@@ -0,0 +1,8 @@
+\r
+package jp.gr.java_conf.u6k.backup;\r
+\r
+public enum DiffType {\r
+\r
+    ADDED, MODIFIED, DELETED, NO_CHANGE,\r
+\r
+}\r
diff --git a/backup/src/main/java/jp/gr/java_conf/u6k/backup/FileInfo.java b/backup/src/main/java/jp/gr/java_conf/u6k/backup/FileInfo.java
new file mode 100644 (file)
index 0000000..8b04ed2
--- /dev/null
@@ -0,0 +1,57 @@
+\r
+package jp.gr.java_conf.u6k.backup;\r
+\r
+public class FileInfo {\r
+\r
+    private String  path;\r
+\r
+    private long    lastModified;\r
+\r
+    private long    size;\r
+\r
+    private String  hash;\r
+\r
+    private boolean file;\r
+\r
+    public FileInfo(String path, long lastModified, long size, String hash, boolean file) {\r
+        this.path = path;\r
+        this.lastModified = lastModified;\r
+        this.size = size;\r
+        this.hash = hash;\r
+        this.file = file;\r
+    }\r
+\r
+    protected FileInfo(FileInfo fileInfo) {\r
+        // 引数を確認します。\r
+        if (fileInfo == null) {\r
+            throw new NullPointerException("fileInfo == null");\r
+        }\r
+        // 状態を初期化します。\r
+        this.path = fileInfo.path;\r
+        this.lastModified = fileInfo.lastModified;\r
+        this.size = fileInfo.size;\r
+        this.hash = fileInfo.hash;\r
+        this.file = fileInfo.file;\r
+    }\r
+\r
+    public String getPath() {\r
+        return this.path;\r
+    }\r
+\r
+    public long getLastModified() {\r
+        return this.lastModified;\r
+    }\r
+\r
+    public long getSize() {\r
+        return this.size;\r
+    }\r
+\r
+    public String getHash() {\r
+        return this.hash;\r
+    }\r
+\r
+    public boolean isFile() {\r
+        return this.file;\r
+    }\r
+\r
+}\r
diff --git a/backup/src/main/java/jp/gr/java_conf/u6k/backup/FileInfoRepository.java b/backup/src/main/java/jp/gr/java_conf/u6k/backup/FileInfoRepository.java
new file mode 100644 (file)
index 0000000..ba961f1
--- /dev/null
@@ -0,0 +1,265 @@
+\r
+package jp.gr.java_conf.u6k.backup;\r
+\r
+import java.io.File;\r
+import java.util.ArrayList;\r
+import java.util.Arrays;\r
+import java.util.Collections;\r
+import java.util.Comparator;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+public class FileInfoRepository {\r
+\r
+    private List<FileInfo> fileInfoList = new ArrayList<FileInfo>();\r
+\r
+    public FileInfoRepository() {\r
+        FileInfo fi = new FileInfo("/", 0L, 0L, null, false);\r
+\r
+        this.fileInfoList.add(fi);\r
+    }\r
+\r
+    public FileInfoRepository(File baseDir) {\r
+        // 引数を確認します。\r
+        if (baseDir == null) {\r
+            throw new NullPointerException("baseDir == null");\r
+        }\r
+        if (!baseDir.isDirectory()) {\r
+            throw new IllegalArgumentException("!baseDir.isDirectory()");\r
+        }\r
+\r
+        // 構築します。\r
+        this.build(baseDir, baseDir);\r
+    }\r
+\r
+    public FileInfoRepository(List<FileInfo> fileInfoList) {\r
+        // 引数を確認します。\r
+        if (fileInfoList == null) {\r
+            throw new NullPointerException("fileInfoList == null");\r
+        }\r
+        // 構築します。\r
+        this.fileInfoList = FileInfoRepository.sort(fileInfoList);\r
+    }\r
+\r
+    private void build(File baseDir, File targetDir) {\r
+        // 引数を確認します。\r
+        if (baseDir == null) {\r
+            throw new NullPointerException("baseDir == null");\r
+        }\r
+        if (!baseDir.isDirectory()) {\r
+            throw new IllegalArgumentException("!baseDir.isDirectory()");\r
+        }\r
+        if (targetDir == null) {\r
+            throw new NullPointerException("targetDir == null");\r
+        }\r
+        if (!targetDir.isDirectory()) {\r
+            throw new IllegalArgumentException("!targetDir.isDirectory()");\r
+        }\r
+\r
+        // ファイル情報を構築します。\r
+        FileInfo fi = new FileInfo(PathUtil.buildPath(baseDir, targetDir), targetDir.lastModified(), 0, "", false);\r
+        this.fileInfoList.add(fi);\r
+\r
+        File[] listFiles = targetDir.listFiles();\r
+        Arrays.sort(listFiles, 0, listFiles.length, new Comparator<File>() {\r
+\r
+            public int compare(File o1, File o2) {\r
+                if (o1.isFile() && o2.isDirectory()) {\r
+                    return 1;\r
+                } else if (o1.isDirectory() && o2.isFile()) {\r
+                    return -1;\r
+                } else {\r
+                    return o1.getName().compareTo(o2.getName());\r
+                }\r
+            }\r
+\r
+        });\r
+\r
+        for (File f : listFiles) {\r
+            if (f.isFile()) {\r
+                fi = new FileInfo(PathUtil.buildPath(baseDir, f), f.lastModified(), f.length(), "", true);\r
+                this.fileInfoList.add(fi);\r
+            } else {\r
+                this.build(baseDir, f);\r
+            }\r
+        }\r
+    }\r
+\r
+    public List<FileInfo> findAll() {\r
+        List<FileInfo> l = new ArrayList<FileInfo>();\r
+        l.addAll(this.fileInfoList);\r
+        return l;\r
+    }\r
+\r
+    public FileInfo findByPath(String path) {\r
+        return FileInfoRepository.findByPath(this.fileInfoList, path);\r
+    }\r
+\r
+    private static FileInfo findByPath(List<FileInfo> fileInfoList, String path) {\r
+        for (FileInfo fi : fileInfoList) {\r
+            if (fi.getPath().equals(path)) {\r
+                return fi;\r
+            }\r
+        }\r
+        return null;\r
+    }\r
+\r
+    public List<FileInfo> findByParent(String parentPath) {\r
+        return FileInfoRepository.findByParent(this.fileInfoList, parentPath);\r
+    }\r
+\r
+    private static List<FileInfo> findByParent(List<FileInfo> fileInfoList, String parentPath) {\r
+        List<FileInfo> l = new ArrayList<FileInfo>();\r
+\r
+        for (FileInfo fi : fileInfoList) {\r
+            if (!"/".equals(fi.getPath())) {\r
+                if (PathUtil.getParent(fi.getPath()).equals(parentPath)) {\r
+                    l.add(fi);\r
+                }\r
+            }\r
+        }\r
+\r
+        return l;\r
+    }\r
+\r
+    public List<DiffInfo> diff(FileInfoRepository fromRepo) {\r
+        return FileInfoRepository.diff(fromRepo.fileInfoList, this.fileInfoList);\r
+    }\r
+\r
+    private static List<DiffInfo> diff(List<FileInfo> fromRepo, List<FileInfo> toRepo) {\r
+        // 引数を確認します。\r
+        if (fromRepo == null) {\r
+            throw new NullPointerException("fromRepo == null");\r
+        }\r
+        if (toRepo == null) {\r
+            throw new NullPointerException("toRepo == null");\r
+        }\r
+\r
+        // 更新、削除、変化無し情報を収集します。\r
+        List<DiffInfo> diffInfoList = new ArrayList<DiffInfo>();\r
+\r
+        Map<String, FileInfo> toRepoMap = new HashMap<String, FileInfo>();\r
+        for (FileInfo fi : toRepo) {\r
+            toRepoMap.put(fi.getPath(), fi);\r
+        }\r
+\r
+        for (FileInfo from : fromRepo) {\r
+            if (toRepoMap.containsKey(from.getPath())) {\r
+                FileInfo to = toRepoMap.get(from.getPath());\r
+                toRepoMap.remove(from.getPath());\r
+\r
+                if (from.isFile() != to.isFile()) {\r
+                    diffInfoList.add(new DiffInfo(from, null, DiffType.DELETED));\r
+                    diffInfoList.add(new DiffInfo(null, to, DiffType.ADDED));\r
+                } else if (from.getLastModified() != to.getLastModified() || from.getSize() != to.getSize() || !from.getHash().equals(to.getHash())) {\r
+                    diffInfoList.add(new DiffInfo(from, to, DiffType.MODIFIED));\r
+                } else {\r
+                    diffInfoList.add(new DiffInfo(from, to, DiffType.NO_CHANGE));\r
+                }\r
+            } else {\r
+                diffInfoList.add(new DiffInfo(from, null, DiffType.DELETED));\r
+            }\r
+        }\r
+\r
+        // 追加情報を収集します。\r
+        for (FileInfo to : toRepoMap.values()) {\r
+            diffInfoList.add(new DiffInfo(null, to, DiffType.ADDED));\r
+        }\r
+\r
+        // 変更情報リストをソートします。\r
+        List<FileInfo> fileInfoList = new ArrayList<FileInfo>();\r
+        for (FileInfo fi : diffInfoList) {\r
+            fileInfoList.add(fi);\r
+        }\r
+        FileInfoRepository diffInfoRepo = new FileInfoRepository(fileInfoList);\r
+        fileInfoList = diffInfoRepo.findAll();\r
+\r
+        diffInfoList.clear();\r
+        for (int i = 0; i < fileInfoList.size(); i++) {\r
+            diffInfoList.add((DiffInfo) fileInfoList.get(i));\r
+        }\r
+\r
+        return diffInfoList;\r
+    }\r
+\r
+    public FileInfoRepository patch(List<DiffInfo> diffList) {\r
+        List<FileInfo> patchedList = FileInfoRepository.patch(this.fileInfoList, diffList);\r
+        return new FileInfoRepository(patchedList);\r
+    }\r
+\r
+    private static List<FileInfo> patch(List<FileInfo> srcList, List<DiffInfo> diffList) {\r
+        // 引数を確認します。\r
+        if (srcList == null) {\r
+            throw new NullPointerException("srcList == null");\r
+        }\r
+        if (diffList == null) {\r
+            throw new NullPointerException("diffList == null");\r
+        }\r
+        // ファイル情報に差分情報を適用し、新しいファイル情報にします。\r
+        List<FileInfo> destList = new ArrayList<FileInfo>();\r
+        destList.addAll(srcList);\r
+\r
+        for (DiffInfo diff : diffList) {\r
+            switch (diff.getType()) {\r
+                case ADDED:\r
+                    FileInfo newFile = new FileInfo(diff);\r
+                    destList.add(newFile);\r
+                    break;\r
+                case DELETED:\r
+                    FileInfo delFile = FileInfoRepository.findByPath(destList, diff.getPath());\r
+                    destList.remove(delFile);\r
+                    break;\r
+                case MODIFIED:\r
+                    delFile = FileInfoRepository.findByPath(destList, diff.getPath());\r
+                    destList.remove(delFile);\r
+                    newFile = new FileInfo(diff);\r
+                    destList.add(newFile);\r
+                    break;\r
+                case NO_CHANGE:\r
+                    break;\r
+                default:\r
+                    throw new IllegalArgumentException("diff.getType() can not understand.[type=" + diff.getType() + "]");\r
+            }\r
+        }\r
+\r
+        return destList;\r
+    }\r
+\r
+    private static List<FileInfo> sort(List<FileInfo> list) {\r
+        List<FileInfo> sortedList = FileInfoRepository.sort(list, FileInfoRepository.findByPath(list, "/"));\r
+        return sortedList;\r
+    }\r
+\r
+    private static List<FileInfo> sort(List<FileInfo> list, FileInfo dir) {\r
+        List<FileInfo> l = new ArrayList<FileInfo>();\r
+\r
+        l.add(dir);\r
+\r
+        List<FileInfo> childList = FileInfoRepository.findByParent(list, dir.getPath());\r
+        Collections.sort(childList, new Comparator<FileInfo>() {\r
+\r
+            public int compare(FileInfo o1, FileInfo o2) {\r
+                if (o1.isFile() && !o2.isFile()) {\r
+                    return 1;\r
+                } else if (!o1.isFile() && o2.isFile()) {\r
+                    return -1;\r
+                } else {\r
+                    return o1.getPath().compareTo(o2.getPath());\r
+                }\r
+            }\r
+\r
+        });\r
+\r
+        for (FileInfo fi : childList) {\r
+            if (fi.isFile()) {\r
+                l.add(fi);\r
+            } else {\r
+                l.addAll(FileInfoRepository.sort(list, fi));\r
+            }\r
+        }\r
+\r
+        return l;\r
+    }\r
+\r
+}\r
diff --git a/backup/src/main/java/jp/gr/java_conf/u6k/backup/PathUtil.java b/backup/src/main/java/jp/gr/java_conf/u6k/backup/PathUtil.java
new file mode 100644 (file)
index 0000000..da1235e
--- /dev/null
@@ -0,0 +1,82 @@
+\r
+package jp.gr.java_conf.u6k.backup;\r
+\r
+import java.io.File;\r
+\r
+public class PathUtil {\r
+\r
+    public static String buildPath(File baseDir, File target) {\r
+        // 引数を確認します。\r
+        if (baseDir == null) {\r
+            throw new NullPointerException("baseDir == null");\r
+        }\r
+        if (!baseDir.isDirectory()) {\r
+            throw new IllegalArgumentException("!baseDir.isDirectory()");\r
+        }\r
+        if (target == null) {\r
+            throw new NullPointerException("target == null");\r
+        }\r
+        if (!target.getAbsolutePath().startsWith(baseDir.getAbsolutePath())) {\r
+            throw new IllegalArgumentException("!target.getAbsolutePath().startsWith(baseDir.getAbsolutePath())");\r
+        }\r
+\r
+        // パス文字列を構築します。\r
+        if (baseDir.equals(target)) {\r
+            return "/";\r
+        }\r
+\r
+        String path = target.getAbsolutePath().substring(baseDir.getAbsolutePath().length());\r
+        path = path.replace(File.separatorChar, '/');\r
+        if (!path.startsWith("/")) {\r
+            path = "/" + path;\r
+        }\r
+        if (path.endsWith("/")) {\r
+            path = path.substring(0, path.length() - 1);\r
+        }\r
+\r
+        return path;\r
+    }\r
+\r
+    public static String getParent(String path) {\r
+        // 引数を確認します。\r
+        if (path == null) {\r
+            throw new NullPointerException("path == null");\r
+        }\r
+\r
+        // 親パスを返します。\r
+        if ("/".equals(path)) {\r
+            throw new IllegalArgumentException("path is root directory.");\r
+        } else if (path.lastIndexOf("/") == 0) {\r
+            return "/";\r
+        } else {\r
+            return path.substring(0, path.lastIndexOf("/"));\r
+        }\r
+    }\r
+\r
+    public static boolean isSameDirLevel(String path1, String path2) {\r
+        // 引数を確認します。\r
+        if (path1 == null) {\r
+            throw new NullPointerException("path1 == null");\r
+        }\r
+        if (path2 == null) {\r
+            throw new NullPointerException("path2 == null");\r
+        }\r
+\r
+        // 親パスを比較します。\r
+        return getParent(path1).equals(getParent(path2));\r
+    }\r
+\r
+    public static boolean isParent(String parentPath, String childPath) {\r
+        // 引数を確認します。\r
+        if (parentPath == null) {\r
+            throw new NullPointerException("parentPath == null");\r
+        }\r
+        if (childPath == null) {\r
+            throw new NullPointerException("childPath == null");\r
+        }\r
+\r
+        // パスを比較します。\r
+        return parentPath.equals(getParent(childPath));\r
+    }\r
+\r
+}\r
diff --git a/bak.vbs/bak.vbs b/bak.vbs/bak.vbs
new file mode 100644 (file)
index 0000000..b769ff3
--- /dev/null
@@ -0,0 +1,2005 @@
+Option Explicit\r
+\r
+' ***** \90Ý\92è\8fî\95ñ *****\r
+\r
+' \83o\83b\83N\83A\83b\83v\8c³\82Ì\83t\83H\83\8b\83_\81B\r
+Const gstrSourceFolderPath = "\\sse2f-fs\\83V\83X\83e\83\80\8aJ\94­\95\94\8aÂ\8b«\8d\\92z"\r
+\r
+' \83o\83b\83N\83A\83b\83v\82Ì\8eí\97Þ\81B\r
+'     "Full"...\8a®\91S\83o\83b\83N\83A\83b\83v\81B\r
+'     "Different"...\8d·\95ª\83o\83b\83N\83A\83b\83v\81B\r
+'     "Incremental"...\91\9d\95ª\83o\83b\83N\83A\83b\83v\81B\r
+Const gstrBackupType = "Full"\r
+\r
+' \83f\83o\83b\83O\81E\83\8d\83O\82ð\8fo\97Í\82·\82é\82©\82Ç\82¤\82©\81B\r
+'     True...\83f\83o\83b\83O\81E\83\8d\83O\82ð\8fo\97Í\82·\82é(\90\84\8f§)\81B\r
+'     False...\83f\83o\83b\83O\81E\83\8d\83O\82ð\8fo\97Í\82µ\82È\82¢\81B\r
+Const gblnDebugLog = True\r
+\r
+\r
+\r
+\r
+\r
+\r
+' ***** \8ed\97l *****\r
+\r
+' \83o\83b\83N\83A\83b\83v\81E\83X\83N\83\8a\83v\83g\81B\r
+' \8a®\91S\83o\83b\83N\83A\83b\83v(full backup)\81A\8d·\95ª\83o\83b\83N\83A\83b\83v(different backup)\81A\91\9d\95ª\83o\83b\83N\83A\83b\83v(incremental backup)\82ð\8ds\82¤\81B\r
+' \82à\82¿\82ë\82ñ\81A\95\9c\8c³(restore)\82à\8ds\82¦\82é\81B\r
+\r
+' \83o\83b\83N\83A\83b\83v\82ð\8ds\82¤\82Æ\81A\8eÀ\8dÛ\82Ì\83t\83@\83C\83\8b\81A\8by\82Ñ\83o\83b\83N\83A\83b\83v\8fî\95ñ\82ª\8dì\90¬\82³\82ê\82é\81B\r
+' \8a®\91S\83o\83b\83N\83A\83b\83v\82Ì\8fê\8d\87\81A\83o\83b\83N\83A\83b\83v\8fî\95ñ\82Í\83t\83@\83C\83\8b\91S\82Ä\82Ì\8fî\95ñ\82Æ\82È\82é\81B\r
+' \8d·\95ª\83o\83b\83N\83A\83b\83v\82Ì\8fê\8d\87\81A\83o\83b\83N\83A\83b\83v\8fî\95ñ\82Í\8aî\8f\80\93_\82Æ\82Ì\8d·\95ª\8fî\95ñ\82Æ\82È\82é\81B\r
+' \91\9d\95ª\83o\83b\83N\83A\83b\83v\82Ì\8fê\8d\87\81A\83o\83b\83N\83A\83b\83v\8fî\95ñ\82Í\91O\89ñ\82Æ\82Ì\8d·\95ª\8fî\95ñ\82Æ\82È\82é\81B\r
+' \8d·\95ª\8fî\95ñ\82Í\81A\82Ç\82Ì\82æ\82¤\82È\95Ï\8dX\82ª\82 \82Á\82½\82©\82Ì\82Ý\82ð\8bL\82·\81B\r
+' \83o\83b\83N\83A\83b\83v\8fî\95ñ\82Í\83t\83@\83C\83\8b\81E\83t\83H\83\8b\83_\96¼\82ð\95Û\8e\9d\82µ\81A\83p\83X\82Í\95Û\8e\9d\82µ\82È\82¢\81B\82±\82Ì\82½\82ß\81A\83o\83b\83N\83A\83b\83v\81E\83\\81[\83X\82Ì\8fê\8f\8a\82ª\95Ï\82í\82Á\82Ä\82à\91±\8ds\82·\82é\82±\82Æ\82ª\82Å\82«\82é\81B\r
+\r
+' \83t\83H\83\8b\83_\8d\\90¬\r
+' (\83\8a\83|\83W\83g\83\8a)\\r
+' +---bak.vbs\r
+' +---log.txt\r
+' +---rev\\r
+'     +---rev.txt\r
+'     +---1.xml\r
+'     +---2.xml\r
+'     +---1\\r
+'     |   +---(\83t\83@\83C\83\8b)\\r
+'     +---2\\r
+'     |   +---(\83t\83@\83C\83\8b)\\r
+'     ...\r
+\r
+' \8a®\91S\83o\83b\83N\83A\83b\83v\82Ì\93®\8dì\81B\r
+' \96\88\89ñ\81A\83o\83b\83N\83A\83b\83v\8c³\82Ì\91S\82Ä\82Ì\83t\83@\83C\83\8b\82ð\83R\83s\81[\82·\82é\81B\r
+\r
+' \8d·\95ª\83o\83b\83N\83A\83b\83v\82Ì\93®\8dì\81B\r
+' \8aî\8f\80\83\8a\83r\83W\83\87\83\93\82ª\8ew\92è\82³\82ê\82½\8fê\8d\87\81A\8aî\8f\80\83\8a\83r\83W\83\87\83\93\82Ì\83o\83b\83N\83A\83b\83v\8fî\95ñ\82Æ\82Ì\8d·\95ª\82ð\8eZ\8fo\82µ\81A\8d·\95ª\82Ì\83t\83@\83C\83\8b\82Ì\82Ý\82ð\83R\83s\81[\82·\82é\81B\r
+' \8aî\8f\80\83\8a\83r\83W\83\87\83\93\82Í\8a®\91S\83o\83b\83N\83A\83b\83v\82Ì\8fî\95ñ\82ð\8e\9d\82½\82È\82¯\82ê\82Î\82È\82ç\82È\82¢\81B\r
+' \8aî\8f\80\83\8a\83r\83W\83\87\83\93\82ª\8ew\92è\82³\82ê\82È\82¢\8fê\8d\87\81A\83\8a\83r\83W\83\87\83\93\82ð\82³\82©\82Ì\82Ú\82Á\82Ä\81A\91O\89ñ\82Ì\8a®\91S\83o\83b\83N\83A\83b\83v\82Æ\82Ì\8d·\95ª\82ð\83o\83b\83N\83A\83b\83v\82·\82é\81B\r
+' \91O\89ñ\82Ì\8a®\91S\83o\83b\83N\83A\83b\83v\82ª\8c©\82Â\82©\82ç\82È\82¢\8fê\8d\87(\82Â\82Ü\82è\81A\8f\89\82ß\82Ä\82Ì\83o\83b\83N\83A\83b\83v\82Ì\8fê\8d\87)\81A\8a®\91S\83o\83b\83N\83A\83b\83v\82ð\8ds\82¤\81B\r
+\r
+' \91\9d\95ª\83o\83b\83N\83A\83b\83v\82Ì\93®\8dì\81B\r
+' \91O\89ñ\82Ü\82Å\82Ì\8fî\95ñ\82Å\83o\83b\83N\83A\83b\83v\8fî\95ñ\82ð\8d\\92z\82µ\81A\82»\82ê\82Æ\83o\83b\83N\83A\83b\83v\8c³\82Æ\82Ì\8d·\95ª\82ð\83o\83b\83N\83A\83b\83v\82·\82é\81B\r
+' \82Â\82Ü\82è\81A\8fí\82É\91O\89ñ\82Æ\82Ì\8d·\95ª\82ð\83o\83b\83N\83A\83b\83v\82·\82é\81B\r
+' \91O\89ñ\82Ì\83o\83b\83N\83A\83b\83v\8fî\95ñ\82ð\8d\\92z\82Å\82«\82È\82¢\8fê\8d\87(\82Â\82Ü\82è\81A\8f\89\82ß\82Ä\82Ì\83o\83b\83N\83A\83b\83v\82Ì\8fê\8d\87)\81A\8a®\91S\83o\83b\83N\83A\83b\83v\82ð\8ds\82¤\81B\r
+\r
+' TODO \8d·\95ª\83o\83b\83N\83A\83b\83v\82ð\8eÀ\91\95\82µ\82Ä\82Ý\82é\81B\r
+' TODO \8f\9c\8aO\8ew\92è\82ð\82Å\82«\82é\82æ\82¤\82É\82·\82é\81B\r
+' TODO \8aú\8aÔ\82Å\83\8d\81[\83\8a\83\93\83O\82Å\82«\82é\82æ\82¤\82É\82·\82é\81B\r
+' TODO \83\8d\83O\82ð\90®\94õ\82·\82é\81B\r
+\r
+\r
+\r
+\r
+\r
+' ***** \83O\83\8d\81[\83o\83\8b\95Ï\90\94\81E\92è\90\94 *****\r
+\r
+Dim   gfso\r
+Dim   gfsoLogStream\r
+\r
+Const IOMode_ForAppending = 8\r
+Const IOMode_ForReading = 1\r
+Const IOMode_ForWriting = 2\r
+\r
+' ***** \8f\88\97\9d\8eÀ\8ds *****\r
+\r
+Call Backup()\r
+\r
+MsgBox "ok"\r
+\r
+Call WScript.Quit(0)\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+' ********************************************************************************\r
+' \83o\83b\83N\83A\83b\83v\r
+' ********************************************************************************\r
+\r
+Sub Backup()\r
+Set gfso = CreateObject("Scripting.FileSystemObject")\r
+Set gfsoLogStream = gfso.OpenTextFile(gfso.BuildPath(gfso.GetParentFolderName(WScript.ScriptFullName), "log.txt"), IOMode_ForAppending, True)\r
+\r
+Call StartFunction("Backup")\r
+       Dim strRepositoryFolderPath\r
+       Dim strRevisionRootFolderPath\r
+       Dim strRevisionFolderPath\r
+       Dim strRevisionTxtFilePath\r
+       Dim strRevisionDiffFilePath\r
+       Dim lngRevision\r
+       Dim lngOldRevision\r
+       Dim objFSInfo\r
+       Dim objOldFSInfo\r
+       Dim objDiffInfo\r
+       \r
+       Call WriteLog("[INFO]\83o\83b\83N\83A\83b\83v\82ð\8aJ\8en\82µ\82Ü\82·\81B")\r
+       \r
+       ' \8f\89\8aú\89»\81B\r
+       \r
+       Call WriteLog("[INFO]\8f\89\8aú\89»\82µ\82Ü\82·\81B\83t\83H\83\8b\83_\81A\83t\83@\83C\83\8b\82È\82Ç\82Ì\8dì\90¬\81A\90Ý\92è\82Ì\93Ç\82Ý\8d\9e\82Ý\82ð\8ds\82¢\82Ü\82·\81B")\r
+       \r
+       strRepositoryFolderPath = gfso.GetParentFolderName(WScript.ScriptFullName)\r
+       \r
+       strRevisionRootFolderPath = gfso.BuildPath(strRepositoryFolderPath, "rev")\r
+       If Not gfso.FolderExists(strRevisionRootFolderPath) Then\r
+               Call CreateFolder(strRevisionRootFolderPath)\r
+       End If\r
+       \r
+       strRevisionTxtFilePath = gfso.BuildPath(strRevisionRootFolderPath, "rev.txt")\r
+       If Not gfso.FileExists(strRevisionTxtFilePath) Then\r
+               Call WriteFile(strRevisionTxtFilePath, "0")\r
+       End If\r
+       \r
+       lngRevision = CLng(ReadFile(strRevisionTxtFilePath)) + 1\r
+       \r
+       strRevisionFolderPath = gfso.BuildPath(strRevisionRootFolderPath, CStr(lngRevision))\r
+       Call CreateFolder(strRevisionFolderPath)\r
+       \r
+       strRevisionDiffFilePath = gfso.BuildPath(strRevisionRootFolderPath, CStr(lngRevision) & ".xml")\r
+       \r
+       lngOldRevision = GetOldRevision(strRepositoryFolderPath, lngRevision)\r
+       \r
+       Call WriteLog("[INFO]\83o\83b\83N\83A\83b\83v\8c³\83t\83H\83\8b\83_=" & gstrSourceFolderPath)\r
+       Call WriteLog("[INFO]\83o\83b\83N\83A\83b\83v\82Ì\8eí\97Þ=" & gstrBackupType)\r
+       Call WriteLog("[INFO]\83\8a\83|\83W\83g\83\8a\81E\83t\83H\83\8b\83_=" & strRepositoryFolderPath)\r
+       Call WriteLog("[INFO]\83\8a\83r\83W\83\87\83\93\81E\83\8b\81[\83g\81E\83t\83H\83\8b\83_=" & strRevisionRootFolderPath)\r
+       Call WriteLog("[INFO]\83\8a\83r\83W\83\87\83\93\81E\83t\83H\83\8b\83_=" & strRevisionFolderPath)\r
+       Call WriteLog("[INFO]\83\8a\83r\83W\83\87\83\93\90Ý\92è\83t\83@\83C\83\8b=" & strRevisionTxtFilePath)\r
+       Call WriteLog("[INFO]\83\8a\83r\83W\83\87\83\93\8d·\95ª\83t\83@\83C\83\8b=" & strRevisionDiffFilePath)\r
+       Call WriteLog("[INFO]\8c»\8dÝ\82Ì\83\8a\83r\83W\83\87\83\93=" & lngRevision)\r
+       Call WriteLog("[INFO]\94ä\8ar\8c³\82Ì\83\8a\83r\83W\83\87\83\93=" & lngOldRevision)\r
+       \r
+       ' \83o\83b\83N\83A\83b\83v\81B\r
+       Call WriteLog("[INFO]\94ä\8ar\8c³\83\8a\83r\83W\83\87\83\93\82Ì\83t\83@\83C\83\8b\81E\83V\83X\83e\83\80\8fî\95ñ\82ð\8d\\92z\82µ\82Ü\82·\81B[\94ä\8ar\8c³\82Ì\83\8a\83r\83W\83\87\83\93=" & lngOldRevision & "]")\r
+       \r
+       Set objOldFSInfo = BuildFileSystemInfoFromRevision(strRepositoryFolderPath, lngOldRevision)\r
+       \r
+       Call WriteLog("[INFO]\83o\83b\83N\83A\83b\83v\8c³\83t\83H\83\8b\83_\82Ì\83t\83@\83C\83\8b\81E\83V\83X\83e\83\80\8fî\95ñ\82ð\8d\\92z\82µ\82Ü\82·\81B[\83o\83b\83N\83A\83b\83v\8c³\83t\83H\83\8b\83_=" & gstrSourceFolderPath & ", \8c»\8dÝ\82Ì\83\8a\83r\83W\83\87\83\93=" & lngRevision & "]")\r
+       \r
+       Set objFSInfo = New FileSystemInfo\r
+       Call objFSInfo.BuildFromFolderPath(gstrSourceFolderPath, lngRevision)\r
+       \r
+       Call WriteLog("[INFO]\94ä\8ar\8c³\83\8a\83r\83W\83\87\83\93\82Æ\83o\83b\83N\83A\83b\83v\8c³\83t\83H\83\8b\83_\82Ì\83t\83@\83C\83\8b\81E\83V\83X\83e\83\80\8fî\95ñ\82Ì\8d·\95ª\8fî\95ñ\82ð\8d\\92z\82µ\82Ü\82·\81B")\r
+       \r
+       Set objDiffInfo = New DiffInfo\r
+       Call objDiffInfo.BuildFromFileSystemInfo(objOldFSInfo, objFSInfo)\r
+       \r
+       Call WriteLog("[INFO]\8d·\95ª\8fî\95ñ\82ð\83t\83@\83C\83\8b\82É\8f\91\82«\8d\9e\82Ý\82Ü\82·\81B[\8d·\95ª\8fî\95ñ\83t\83@\83C\83\8b=" & strRevisionDiffFilePath & "]")\r
+       \r
+       Call objDiffInfo.ToXmlFile(strRevisionDiffFilePath)\r
+       \r
+       Call WriteLog("[INFO]\8d·\95ª\8fî\95ñ\82ð\8c³\82É\81A\83o\83b\83N\83A\83b\83v\8c³\83t\83H\83\8b\83_\82©\82ç\83\8a\83r\83W\83\87\83\93\81E\83t\83H\83\8b\83_\82É\83t\83@\83C\83\8b\82ð\83R\83s\81[\82µ\82Ü\82·\81B[\83o\83b\83N\83A\83b\83v\8c³\83t\83H\83\8b\83_=" & gstrSourceFolderPath & ", \83\8a\83r\83W\83\87\83\93\81E\83t\83H\83\8b\83_=" & strRevisionFolderPath & "]")\r
+       \r
+       Call objDiffInfo.Backup(gstrSourceFolderPath, strRevisionFolderPath)\r
+       \r
+       ' \8fI\97¹\81B\r
+       Call WriteLog("[INFO]\8c»\8dÝ\82Ì\83\8a\83r\83W\83\87\83\93\82ð\83\8a\83r\83W\83\87\83\93\90Ý\92è\83t\83@\83C\83\8b\82É\8f\91\82«\8d\9e\82Ý\82Ü\82·\81B[\83\8a\83r\83W\83\87\83\93\90Ý\92è\83t\83@\83C\83\8b=" & strRevisionTxtFilePath & "]")\r
+       \r
+       Call WriteFile(strRevisionTxtFilePath, lngRevision)\r
+       \r
+       Call WriteLog("[INFO]\83o\83b\83N\83A\83b\83v\82ª\8a®\97¹\82µ\82Ü\82µ\82½\81B")\r
+Call EndFunction("Backup")\r
+\r
+Call gfsoLogStream.Close()\r
+End Sub\r
+\r
+Function GetOldRevision(strRepositoryFolderPath, lngRevision)\r
+Call StartFunction("GetOldRevision")\r
+       If gstrBackupType = "Full" Then\r
+               GetOldRevision = 0\r
+       ElseIf gstrBackupType = "Different" Then\r
+               ' TODO \91O\89ñ\82Ì\8a®\91S\83o\83b\83N\83A\83b\83v\82Ì\83\8a\83r\83W\83\87\83\93\82ð\95Ô\82·\81B\r
+               GetOldRevision = 0\r
+       ElseIf gstrBackupType = "Incremental" Then\r
+               GetOldRevision = lngRevision - 1\r
+       Else\r
+               Call Err.Raise(1, "bak.vbs", "\94F\8e¯\82Å\82«\82È\82¢\83o\83b\83N\83A\83b\83v\82Ì\8eí\97Þ\82Å\82·\81B[" & gstrBackupType & "]")\r
+       End If\r
+Call EndFunction("GetOldRevision")\r
+End Function\r
+\r
+Function BuildFileSystemInfoFromRevision(strRepositoryFolderPath, lngRevision)\r
+Call StartFunction("BuildFileSystemInfoFromRevision")\r
+       Dim objFSInfo, objDiffInfo\r
+       \r
+       If lngRevision = 0 Then\r
+               Set objFSInfo = New FileSystemInfo\r
+               Call objFSInfo.InitializeFolderInfo()\r
+               \r
+               Set BuildFileSystemInfoFromRevision = objFSInfo\r
+       Else\r
+               Set objDiffInfo = New DiffInfo\r
+               Call objDiffInfo.BuildFromXmlFile(gfso.BuildPath(strRepositoryFolderPath, "rev\" & CStr(lngRevision) & ".xml"))\r
+               \r
+               Set objFSInfo = BuildFileSystemInfoFromRevision(strRepositoryFolderPath, objDiffInfo.OldFileSystemInfo.Revision)\r
+               \r
+               Call objDiffInfo.Merge(objFSInfo)\r
+               \r
+               objFSInfo.Revision = lngRevision\r
+               \r
+               Set BuildFileSystemInfoFromRevision = objFSInfo\r
+       End If\r
+Call EndFunction("BuildFileSystemInfoFromRevision")\r
+End Function\r
+\r
+' \83t\83@\83C\83\8b(\8by\82Ñ\83t\83H\83\8b\83_)\8fî\95ñ\82ð\88µ\82¢\82Ü\82·\81B\r
+Class FileSystemInfo\r
+       Public Name             ' String\8c^\81B\83t\83@\83C\83\8b\96¼\81B\83p\83X\82Å\82Í\82È\82¢\81B\r
+       Public Attributes       ' Long\8c^\81B\91®\90«\81B\r
+       Public DateCreated      ' Date\8c^\81B\8dì\90¬\93ú\8e\9e\81B\r
+       Public DateLastModified ' Date\8c^\81B\8dÅ\8fI\8dX\90V\93ú\8e\9e\81B\r
+       Public Size             ' Long\8c^\81B\83t\83@\83C\83\8b\81E\83T\83C\83Y\81B\r
+       Public FileType         ' String\8c^\81B\83I\83u\83W\83F\83N\83g\82Ì\8eí\97Þ\81B\82±\82Ì\83I\83u\83W\83F\83N\83g\82ª\83t\83@\83C\83\8b\82Ì\8fê\8d\87\82Í"File"\81A\83t\83H\83\8b\83_\82Ì\8fê\8d\87\82Í"Folder"\81B\r
+       Public Revision         ' Long\8c^\81B\83o\83b\83N\83A\83b\83v\8aÇ\97\9d\82É\82¨\82¯\82é\83\8a\83r\83W\83\87\83\93\94Ô\8d\86\81B\r
+       Public Children         ' Dictionary\8c^\81B\8eq\83I\83u\83W\83F\83N\83g\82ð\8ai\94[\82·\82é\81B\83L\81[\82ÍName\81B\r
+       \r
+       Private Sub Class_Initialize()\r
+       Call StartFunction("FileSystemInfo.Class_Initialize")\r
+               Name = ""\r
+               Attributes = 0\r
+               DateCreated = CDate("1900/1/1 00:00:00")\r
+               DateLastModified = CDate("1900/1/1 00:00:00")\r
+               Size = 0\r
+               FileType = ""\r
+               Revision = 0\r
+               Set Children = Nothing\r
+       Call EndFunction("FileSystemInfo.Class_Initialize")\r
+       End Sub\r
+       \r
+       Public Sub InitializeFolderInfo()\r
+       Call StartFunction("FileSystemInfo.InitializeFolderInfo")\r
+               Name = ""\r
+               Attributes = 0\r
+               DateCreated = CDate("1900/1/1 00:00:00")\r
+               DateLastModified = CDate("1900/1/1 00:00:00")\r
+               Size = 0\r
+               FileType = "Folder"\r
+               Revision = 0\r
+               Set Children = New Dictionary\r
+       Call EndFunction("FileSystemInfo.Class_Initialize")\r
+       End Sub\r
+       \r
+       Public Sub BuildFromFileSystemObject(fsoItem, lngRevision)\r
+       Call StartFunction("FileSystemInfo.BuildFromFileSystemObject")\r
+               Dim fsoChildItem, objChildFSInfo\r
+               \r
+               Name = fsoItem.Name\r
+               If TypeName(fsoItem) = "Folder" Then\r
+                       If Not fsoItem.IsRootFolder Then\r
+                               Attributes = fsoItem.Attributes\r
+                               DateCreated = fsoItem.DateCreated\r
+                               DateLastModified = fsoItem.DateLastModified\r
+                       End If\r
+               Else\r
+                       Attributes = fsoItem.Attributes\r
+                       DateCreated = fsoItem.DateCreated\r
+                       DateLastModified = fsoItem.DateLastModified\r
+               End If\r
+               \r
+               Revision = lngRevision\r
+               \r
+               If TypeName(fsoItem) = "File" Then\r
+                       Size = fsoItem.Size\r
+                       FileType = "File"\r
+                       \r
+                       Set Children = Nothing\r
+               Else\r
+                       Size = 0\r
+                       FileType = "Folder"\r
+                       \r
+                       Set Children = New Dictionary\r
+                       \r
+                       For Each fsoChildItem In fsoItem.Files\r
+                               Set objChildFSInfo = New FileSystemInfo\r
+                               Call objChildFSInfo.BuildFromFileSystemObject(fsoChildItem, lngRevision)\r
+                               Set Children.Item(objChildFSInfo.Name) = objChildFSInfo\r
+                       Next\r
+                       \r
+                       For Each fsoChildItem In fsoItem.SubFolders\r
+                               Set objChildFSInfo = New FileSystemInfo\r
+                               Call objChildFSInfo.BuildFromFileSystemObject(fsoChildItem, lngRevision)\r
+                               Set Children.Item(objChildFSInfo.Name) = objChildFSInfo\r
+                       Next\r
+                       \r
+                       Call Children.Sort(New PrimitiveKeyComparator)\r
+               End If\r
+       Call EndFunction("FileSystemInfo.BuildFromFileSystemObject")\r
+       End Sub\r
+       \r
+       Public Sub BuildFromFolderPath(strFolderPath, lngRevision)\r
+       Call StartFunction("FileSystemInfo.BuildFromFolderPath")\r
+               Call BuildFromFileSystemObject(gfso.GetFolder(strFolderPath), lngRevision)\r
+       Call EndFunction("FileSystemInfo.BuildFromFolderPath")\r
+       End Sub\r
+       \r
+       Public Sub BuildFromXmlNode(xmlNode)\r
+       Call StartFunction("FileSystemInfo.BuildFromXmlNode")\r
+               Dim xmlChildNode\r
+               Dim objChildFSInfo\r
+               \r
+               Name = xmlNode.attributes.getNamedItem("name").nodeValue\r
+               Attributes = CLng(xmlNode.attributes.getNamedItem("attributes").nodeValue)\r
+               DateCreated = CDate(xmlNode.attributes.getNamedItem("dateCreated").nodeValue)\r
+               DateLastModified = CDate(xmlNode.attributes.getNamedItem("dateLastModified").nodeValue)\r
+               Size = CLng(xmlNode.attributes.getNamedItem("size").nodeValue)\r
+               FileType = xmlNode.attributes.getNamedItem("fileType").nodeValue\r
+               Revision = CLng(xmlNode.attributes.getNamedItem("revision").nodeValue)\r
+               \r
+               If FileType = "File" Then\r
+                       Set Children = Nothing\r
+               Else\r
+                       Set Children = New Dictionary\r
+                       \r
+                       For Each xmlChildNode In xmlNode.selectNodes("item")\r
+                               Set objChildFSInfo = New FileSystemInfo\r
+                               Call objChildFSInfo.BuildFromXmlNode(xmlChildNode)\r
+                               Set Children.Item(objChildFSInfo.Name) = objChildFSInfo\r
+                       Next\r
+                       \r
+                       Call Children.Sort(New PrimitiveKeyComparator)\r
+               End If\r
+       Call EndFunction("FileSystemInfo.BuildFromXmlNode")\r
+       End Sub\r
+       \r
+       Public Sub BuildFromXmlDocument(xmlDocument)\r
+       Call StartFunction("FileSystemInfo.BuildFromXmlDocument")\r
+               Dim xmlNode, xmlChildNode, objChildFSInfo\r
+               \r
+               Set xmlNode = xmlDocument.selectSingleNode("source")\r
+               \r
+               FileType = "Folder"\r
+               Revision = CLng(xmlNode.attributes.getNamedItem("revision").nodeValue)\r
+               \r
+               Set Children = New Dictionary\r
+               \r
+               For Each xmlChildNode In xmlNode.selectNodes("item")\r
+                       Set objChildFSInfo = New FileSystemInfo\r
+                       Call objChildFSInfo.BuildFromXmlNode(xmlChildNode)\r
+                       Set Children.Item(objChildFSInfo.Name) = objChildFSInfo\r
+               Next\r
+       Call EndFunction("FileSystemInfo.BuildFromXmlDocument")\r
+       End Sub\r
+       \r
+       Public Sub BuildFromXmlFile(strFilePath)\r
+       Call StartFunction("FileSystemInfo.BuildFromXmlFile")\r
+               Dim xmlDocument\r
+               \r
+               Set xmlDocument = CreateObject("MSXML2.DOMDocument")\r
+               Call xmlDocument.load(strFilePath)\r
+               \r
+               Call BuildFromXmlDocument(xmlDocument)\r
+       Call EndFunction("FileSystemInfo.BuildFromXmlFile")\r
+       End Sub\r
+       \r
+       Public Function ToXmlNode(xmlDocument)\r
+       Call StartFunction("FileSystemInfo.ToXmlNode")\r
+               Dim xmlNode, objChildFSInfo\r
+               \r
+               Set xmlNode = xmlDocument.createElement("item")\r
+               \r
+               Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("name"))\r
+               xmlNode.attributes.getNamedItem("name").nodeValue = Name\r
+               \r
+               Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("attributes"))\r
+               xmlNode.attributes.getNamedItem("attributes").nodeValue = Attributes\r
+               \r
+               Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("dateCreated"))\r
+               xmlNode.attributes.getNamedItem("dateCreated").nodeValue = DateCreated\r
+               \r
+               Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("dateLastModified"))\r
+               xmlNode.attributes.getNamedItem("dateLastModified").nodeValue = DateLastModified\r
+               \r
+               Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("size"))\r
+               xmlNode.attributes.getNamedItem("size").nodeValue = Size\r
+               \r
+               Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("fileType"))\r
+               xmlNode.attributes.getNamedItem("fileType").nodeValue = FileType\r
+               \r
+               Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("revision"))\r
+               xmlNode.attributes.getNamedItem("revision").nodeValue = Revision\r
+               \r
+               If FileType = "Folder" Then\r
+                       For Each objChildFSInfo In Children.Values\r
+                               Call xmlNode.appendChild(objChildFSInfo.ToXmlNode(xmlDocument))\r
+                       Next\r
+               End If\r
+               \r
+               Set ToXmlNode = xmlNode\r
+       Call EndFunction("FileSystemInfo.ToXmlNode")\r
+       End Function\r
+       \r
+       Public Function ToXmlDocument()\r
+       Call StartFunction("FileSystemInfo.ToXmlDocument")\r
+               Dim xmlDocument\r
+               Dim xmlNode\r
+               Dim objChildFSInfo\r
+               \r
+               Set xmlDocument = CreateObject("MSXML2.DOMDocument")\r
+               \r
+               Set xmlNode = xmlDocument.createElement("source")\r
+               Call xmlDocument.appendChild(xmlNode)\r
+               \r
+               Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("revision"))\r
+               xmlNode.attributes.getNamedItem("revision").nodeValue = Revision\r
+               \r
+               For Each objChildFSInfo In Children.Values\r
+                       Call xmlNode.appendChild(objChildFSInfo.ToXmlNode(xmlDocument))\r
+               Next\r
+               \r
+               Set ToXmlDocument = xmlDocument\r
+       Call EndFunction("FileSystemInfo.ToXmlDocument")\r
+       End Function\r
+       \r
+       Public Sub ToXmlFile(strFilePath)\r
+       Call StartFunction("FileSystemInfo.ToXmlFile")\r
+               Call ToXmlDocument().save(strFilePath)\r
+       Call EndFunction("FileSystemInfo.ToXmlFile")\r
+       End Sub\r
+       \r
+       Public Function IsEqualProperty(objFSInfo)\r
+       Call StartFunction("FileSystemInfo.IsEqualProperty")\r
+               IsEqualProperty = (Name = objFSInfo.Name _\r
+                       And Attributes = objFSInfo.Attributes _\r
+                       And DateCreated = objFSInfo.DateCreated _\r
+                       And DateLastModified = objFSInfo.DateLastModified _\r
+                       And Size = objFSInfo.Size _\r
+                       And FileType = objFSInfo.FileType)\r
+       Call EndFunction("FileSystemInfo.IsEqualProperty")\r
+       End Function\r
+End Class\r
+\r
+Class DiffInfo\r
+       Public Name                 ' String\8c^\81B\83t\83@\83C\83\8b\96¼\81B\83p\83X\82Å\82Í\82È\82¢\81B\r
+       Public Status               ' String\8c^\81B\8d·\95ª\8fó\8bµ\81B\90V\8bK\82Í"Create"\81A\8dX\90V\82Í"Update"\81A\8dí\8f\9c\82Í"Delete"\81A\83t\83H\83\8b\83_\82Ì\8fê\8d\87\82Ì\82Ý\95Ï\8dX\96³\82µ\82Ì\8fê\8d\87\82Í""\81B\r
+       Public FileType                         ' String\8c^\81B\83I\83u\83W\83F\83N\83g\82Ì\8eí\97Þ\81B\82±\82Ì\83I\83u\83W\83F\83N\83g\82ª\83t\83@\83C\83\8b\82Ì\8fê\8d\87\82Í"File"\81A\83t\83H\83\8b\83_\82Ì\8fê\8d\87\82Í"Folder"\81B\r
+       Public OldFileSystemInfo    ' FileSystemInfo\8c^\81B\8b\8c\83t\83@\83C\83\8b\8fî\95ñ\81B\r
+       Public NewFileSystemInfo    ' FileSystemInfo\8c^\81B\90V\83t\83@\83C\83\8b\8fî\95ñ\81B\r
+       Public Children             ' Collection\8c^\81B\8eq\8d·\95ª\8fî\95ñ\81B\93¯\88ê\96¼\82Å\8dí\8f\9c\81A\8dì\90¬\82ð\8ds\82¤\8fê\8d\87\82ª\82 \82é\82½\82ß\81ADictionary\8c^\82Å\82Í\82È\82¢\81B\r
+       \r
+       Private Sub Class_Initialize()\r
+       Call StartFunction("DiffInfo.Class_Initialize")\r
+               Name = ""\r
+               Status = ""\r
+               Set OldFileSystemInfo = Nothing\r
+               Set NewFileSystemInfo = Nothing\r
+               Set Children = Nothing\r
+       Call EndFunction("DiffInfo.Class_Initialize")\r
+       End Sub\r
+       \r
+       Public Sub BuildFromFileSystemInfo(objOldFileSystemInfo, objNewFileSystemInfo)\r
+       Call StartFunction("DiffInfo.BuildFromFileSystemInfo")\r
+               Dim strName, dicName\r
+               Dim objChildOldFSInfo, objChildNewFSInfo\r
+               \r
+               Set OldFileSystemInfo = objOldFileSystemInfo\r
+               Set NewFileSystemInfo = objNewFileSystemInfo\r
+               \r
+               If OldFileSystemInfo Is Nothing And Not NewFileSystemInfo Is Nothing Then\r
+                       Name = NewFileSystemInfo.Name\r
+                       Status = "Create"\r
+                       FileType = NewFileSystemInfo.FileType\r
+                       \r
+                       If FileType = "Folder" Then\r
+                               Set Children = New Collection\r
+                               For Each objChildNewFSInfo In NewFileSystemInfo.Children.Values\r
+                                       Call AddChildDiffInfo(Nothing, objChildNewFSInfo)\r
+                               Next\r
+                               \r
+                               Call Children.Sort(New DiffInfoComparator)\r
+                       End If\r
+               ElseIf Not OldFileSystemInfo Is Nothing And NewFileSystemInfo Is Nothing Then\r
+                       Name = OldFileSystemInfo.Name\r
+                       Status = "Delete"\r
+                       FileType = OldFileSystemInfo.FileType\r
+               Else\r
+                       Name = NewFileSystemInfo.Name\r
+                       If OldFileSystemInfo.IsEqualProperty(NewFileSystemInfo) Then\r
+                               Status = ""\r
+                       Else\r
+                               Status = "Update"\r
+                       End If\r
+                       FileType = NewFileSystemInfo.FileType\r
+                       \r
+                       If FileType = "Folder" Then\r
+                               Set dicName = CreateObject("Scripting.Dictionary")\r
+                               For Each strName In OldFileSystemInfo.Children.Keys\r
+                                       dicName(strName) = strName\r
+                               Next\r
+                               For Each strName In NewFileSystemInfo.Children.Keys\r
+                                       dicName(strName) = strName\r
+                               Next\r
+                               \r
+                               Set Children = New Collection\r
+                               For Each strName In dicName.Keys\r
+                                       If OldFileSystemInfo.Children.ExistKey(strName) Then\r
+                                               Set objChildOldFSInfo = OldFileSystemInfo.Children.Item(strName)\r
+                                       Else\r
+                                               Set objChildOldFSInfo = Nothing\r
+                                       End If\r
+                                       If NewFileSystemInfo.Children.ExistKey(strName) Then\r
+                                               Set objChildNewFSInfo = NewFileSystemInfo.Children.Item(strName)\r
+                                       Else\r
+                                               Set objChildNewFSInfo = Nothing\r
+                                       End If\r
+                                       \r
+                                       If objChildOldFSInfo Is Nothing Or objChildNewFSInfo Is Nothing Then\r
+                                               Call AddChildDiffInfo(objChildOldFSInfo, objChildNewFSInfo)\r
+                                       ElseIf objChildOldFSInfo.FileType = objChildNewFSInfo.FileType Then\r
+                                               Call AddChildDiffInfo(objChildOldFSInfo, objChildNewFSInfo)\r
+                                       Else\r
+                                               Call AddChildDiffInfo(objChildOldFSInfo, Nothing)\r
+                                               Call AddChildDiffInfo(Nothing, objChildNewFSInfo)\r
+                                       End If\r
+                               Next\r
+                               \r
+                               Call Children.Sort(New DiffInfoComparator)\r
+                       End If\r
+               End If\r
+       Call EndFunction("DiffInfo.BuildFromFileSystemInfo")\r
+       End Sub\r
+       \r
+       Private Sub AddChildDiffInfo(objOldFSInfo, objNewFSInfo)\r
+       Call StartFunction("DiffInfo.AddChildDiffInfo")\r
+               Dim objChildDiffInfo\r
+               \r
+               Set objChildDiffInfo = New DiffInfo\r
+               Call objChildDiffInfo.BuildFromFileSystemInfo(objOldFSInfo, objNewFSInfo)\r
+               If objChildDiffInfo.Status <> "" Then\r
+                       Call Children.Add(objChildDiffInfo)\r
+               ElseIf Not objChildDiffInfo.Children Is Nothing Then\r
+                       If objChildDiffInfo.Children.Count > 0 Then\r
+                               Call Children.Add(objChildDiffInfo)\r
+                       End If\r
+               End If\r
+       Call EndFunction("DiffInfo.AddChildDiffInfo")\r
+       End Sub\r
+       \r
+       Public Sub BuildFromXmlNode(xmlNode)\r
+       Call StartFunction("DiffInfo.BuildFromXmlNode")\r
+               Dim xmlChildNode, objChildDiffInfo\r
+               \r
+               Name = xmlNode.attributes.getNamedItem("name").nodeValue\r
+               Status = xmlNode.attributes.getNamedItem("status").nodeValue\r
+               FileType = xmlNode.attributes.getNamedItem("fileType").nodeValue\r
+               \r
+               If Status = "Delete" Or Status = "Update" Or Status = "" Then\r
+                       Set OldFileSystemInfo = New FileSystemInfo\r
+                       \r
+                       OldFileSystemInfo.Name = Name\r
+                       OldFileSystemInfo.Attributes = CLng(xmlNode.attributes.getNamedItem("oldAttributes").nodeValue)\r
+                       OldFileSystemInfo.DateCreated = CDate(xmlNode.attributes.getNamedItem("oldDateCreated").nodeValue)\r
+                       OldFileSystemInfo.DateLastModified = CDate(xmlNode.attributes.getNamedItem("oldDateLastModified").nodeValue)\r
+                       OldFileSystemInfo.Size = CLng(xmlNode.attributes.getNamedItem("oldSize").nodeValue)\r
+                       OldFileSystemInfo.FileType = FileType\r
+                       OldFileSystemInfo.Revision = CLng(xmlNode.attributes.getNamedItem("oldRevision").nodeValue)\r
+               End If\r
+               \r
+               If Status = "Create" Or Status = "Update" Or Status = "" Then\r
+                       Set NewFileSystemInfo = New FileSystemInfo\r
+                       \r
+                       NewFileSystemInfo.Name = Name\r
+                       NewFileSystemInfo.Attributes = CLng(xmlNode.attributes.getNamedItem("newAttributes").nodeValue)\r
+                       NewFileSystemInfo.DateCreated = CDate(xmlNode.attributes.getNamedItem("newDateCreated").nodeValue)\r
+                       NewFileSystemInfo.DateLastModified = CDate(xmlNode.attributes.getNamedItem("newDateLastModified").nodeValue)\r
+                       NewFileSystemInfo.Size = CLng(xmlNode.attributes.getNamedItem("newSize").nodeValue)\r
+                       NewFileSystemInfo.FileType = FileType\r
+                       NewFileSystemInfo.Revision = CLng(xmlNode.attributes.getNamedItem("newRevision").nodeValue)\r
+               End If\r
+               \r
+               If FileType = "Folder" And Status <> "Delete" Then\r
+                       Set Children = New Collection\r
+                       For Each xmlChildNode In xmlNode.selectNodes("item")\r
+                               Set objChildDiffInfo = New DiffInfo\r
+                               Call objChildDiffInfo.BuildFromXmlNode(xmlChildNode)\r
+                               Call Children.Add(objChildDiffInfo)\r
+                       Next\r
+                       \r
+                       Call Children.Sort(New DiffInfoComparator)\r
+               End If\r
+       Call EndFunction("DiffInfo.BuildFromXmlNode")\r
+       End Sub\r
+       \r
+       Public Sub BuildFromXmlDocument(xmlDocument)\r
+       Call StartFunction("DiffInfo.BuildFromXmlDocument")\r
+               Dim xmlNode, xmlChildNode, objChildDiffInfo\r
+               \r
+               Set xmlNode = xmlDocument.selectSingleNode("diff")\r
+               \r
+               Set OldFileSystemInfo = New FileSystemInfo\r
+               \r
+               OldFileSystemInfo.FileType = "Folder"\r
+               OldFileSystemInfo.Revision = CLng(xmlNode.attributes.getNamedItem("oldRevision").nodeValue)\r
+               \r
+               Set NewFileSystemInfo = New FileSystemInfo\r
+               \r
+               NewFileSystemInfo.FileType = "Folder"\r
+               NewFileSystemInfo.Revision = CLng(xmlNode.attributes.getNamedItem("newRevision").nodeValue)\r
+               \r
+               Set Children = New Collection\r
+               For Each xmlChildNode In xmlNode.selectNodes("item")\r
+                       Set objChildDiffInfo = New DiffInfo\r
+                       Call objChildDiffInfo.BuildFromXmlNode(xmlChildNode)\r
+                       Call Children.Add(objChildDiffInfo)\r
+               Next\r
+       Call EndFunction("DiffInfo.BuildFromXmlDocument")\r
+       End Sub\r
+       \r
+       Public Sub BuildFromXmlFile(strPath)\r
+       Call StartFunction("DiffInfo.BuildFromXmlFile")\r
+               Dim xmlDocument\r
+               \r
+               Set xmlDocument = CreateObject("MSXML2.DOMDocument")\r
+               Call xmlDocument.load(strPath)\r
+               \r
+               Call BuildFromXmlDocument(xmlDocument)\r
+       Call EndFunction("DiffInfo.BuildFromXmlFile")\r
+       End Sub\r
+       \r
+       Public Function ToXmlNode(xmlDocument)\r
+       Call StartFunction("DiffInfo.ToXmlNode")\r
+               Dim xmlNode\r
+               Dim objChildDiffInfo\r
+               \r
+               Set xmlNode = xmlDocument.createElement("item")\r
+               \r
+               Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("name"))\r
+               xmlNode.attributes.getNamedItem("name").nodeValue = Name\r
+               \r
+               Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("status"))\r
+               xmlNode.attributes.getNamedItem("status").nodeValue = Status\r
+               \r
+               Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("fileType"))\r
+               xmlNode.attributes.getNamedItem("fileType").nodeValue = FileType\r
+               \r
+               If Not OldFileSystemInfo Is Nothing Then\r
+                       Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("oldAttributes"))\r
+                       xmlNode.attributes.getNamedItem("oldAttributes").nodeValue = OldFileSystemInfo.Attributes\r
+                       \r
+                       Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("oldDateCreated"))\r
+                       xmlNode.attributes.getNamedItem("oldDateCreated").nodeValue = OldFileSystemInfo.DateCreated\r
+                       \r
+                       Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("oldDateLastModified"))\r
+                       xmlNode.attributes.getNamedItem("oldDateLastModified").nodeValue = OldFileSystemInfo.DateLastModified\r
+                       \r
+                       Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("oldSize"))\r
+                       xmlNode.attributes.getNamedItem("oldSize").nodeValue = OldFileSystemInfo.Size\r
+                       \r
+                       Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("oldRevision"))\r
+                       xmlNode.attributes.getNamedItem("oldRevision").nodeValue = OldFileSystemInfo.Revision\r
+               End If\r
+               \r
+               If Not NewFileSystemInfo Is Nothing Then\r
+                       Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("newAttributes"))\r
+                       xmlNode.attributes.getNamedItem("newAttributes").nodeValue = NewFileSystemInfo.Attributes\r
+                       \r
+                       Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("newDateCreated"))\r
+                       xmlNode.attributes.getNamedItem("newDateCreated").nodeValue = NewFileSystemInfo.DateCreated\r
+                       \r
+                       Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("newDateLastModified"))\r
+                       xmlNode.attributes.getNamedItem("newDateLastModified").nodeValue = NewFileSystemInfo.DateLastModified\r
+                       \r
+                       Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("newSize"))\r
+                       xmlNode.attributes.getNamedItem("newSize").nodeValue = NewFileSystemInfo.Size\r
+                       \r
+                       Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("newRevision"))\r
+                       xmlNode.attributes.getNamedItem("newRevision").nodeValue = NewFileSystemInfo.Revision\r
+               End If\r
+               \r
+               If Not Children Is Nothing Then\r
+                       For Each objChildDiffInfo In Children.Items\r
+                               Call xmlNode.appendChild(objChildDiffInfo.ToXmlNode(xmlDocument))\r
+                       Next\r
+               End If\r
+               \r
+               Set ToXmlNode = xmlNode\r
+       Call EndFunction("DiffInfo.ToXmlNode")\r
+       End Function\r
+       \r
+       Public Function ToXmlDocument()\r
+       Call StartFunction("DiffInfo.ToXmlDocument")\r
+               Dim xmlDocument, xmlNode\r
+               Dim objChildDiffInfo\r
+               \r
+               Set xmlDocument = CreateObject("MSXML2.DOMDocument")\r
+               \r
+               Set xmlNode = xmlDocument.createElement("diff")\r
+               Call xmlDocument.appendChild(xmlNode)\r
+               \r
+               Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("oldRevision"))\r
+               xmlNode.attributes.getNamedItem("oldRevision").nodeValue = OldFileSystemInfo.Revision\r
+               \r
+               Call xmlNode.attributes.setNamedItem(xmlDocument.createAttribute("newRevision"))\r
+               xmlNode.attributes.getNamedItem("newRevision").nodeValue = NewFileSystemInfo.Revision\r
+               \r
+               For Each objChildDiffInfo In Children.Items\r
+                       Call xmlNode.appendChild(objChildDiffInfo.ToXmlNode(xmlDocument))\r
+               Next\r
+               \r
+               Set ToXmlDocument = xmlDocument\r
+       Call EndFunction("DiffInfo.ToXmlDocument")\r
+       End Function\r
+       \r
+       Public Function ToXmlFile(strFilePath)\r
+       Call StartFunction("DiffInfo.ToXmlFile")\r
+               Call ToXmlDocument().save(strFilePath)\r
+       Call EndFunction("DiffInfo.ToXmlFile")\r
+       End Function\r
+       \r
+       Public Sub Backup(strSourceFolderPath, strDestinationFolderPath)\r
+       Call StartFunction("DiffInfo.Backup")\r
+               Dim objChildDiffInfo\r
+               Dim strSrcPath, strDstPath\r
+               \r
+               For Each objChildDiffInfo In Children.Items\r
+                       If objChildDiffInfo.Status = "Create" Or objChildDiffInfo.Status = "Update" Or objChildDiffInfo.Status = "" Then\r
+                               strSrcPath = gfso.BuildPath(strSourceFolderPath, objChildDiffInfo.Name)\r
+                               strDstPath = gfso.BuildPath(strDestinationFolderPath, objChildDiffInfo.Name)\r
+                               \r
+                               If objChildDiffInfo.FileType = "File" Then\r
+                                       Call CopyFile(strSrcPath, strDstPath)\r
+                               Else\r
+                                       Call CreateFolder(strDstPath)\r
+                                       Call objChildDiffInfo.Backup(strSrcPath, strDstPath)\r
+                               End If\r
+                       End If\r
+               Next\r
+       Call EndFunction("DiffInfo.Backup")\r
+       End Sub\r
+       \r
+       Public Sub Merge(objFileSystemInfo)\r
+       Call StartFunction("DiffInfo.Merge")\r
+               Dim objChildDiffInfo\r
+               \r
+               For Each objChildDiffInfo In Children.Items\r
+                       If objChildDiffInfo.Status = "" Then\r
+                               Call objChildDiffInfo.Merge(objFileSystemInfo.Children.Item(objChildDiffInfo.Name))\r
+                       End If\r
+               Next\r
+               \r
+               For Each objChildDiffInfo In Children.Items\r
+                       If objChildDiffInfo.Status = "Delete" Then\r
+                               Call objFileSystemInfo.Children.Remove(objChildDiffInfo.Name)\r
+                       End If\r
+               Next\r
+               \r
+               For Each objChildDiffInfo In Children.Items\r
+                       If objChildDiffInfo.Status = "Update" Then\r
+                               If objChildDiffInfo.FileType = "File" Then\r
+                                       Set objFileSystemInfo.Children.Item(objChildDiffInfo.Name) = objChildDiffInfo.NewFileSystemInfo\r
+                               Else\r
+                                       Set objChildDiffInfo.NewFileSystemInfo.Children = objFileSystemInfo.Children(objChildDiffInfo.Name).Children\r
+                                       Set objFileSystemInfo.Children.Item(objChildDiffInfo.Name) = objChildDiffInfo.NewFileSystemInfo\r
+                                       Call objChildDiffInfo.Merge(objChildDiffInfo.NewFileSystemInfo)\r
+                               End If\r
+                       End If\r
+               Next\r
+               \r
+               For Each objChildDiffInfo In Children.Items\r
+                       If objChildDiffInfo.Status = "Create" Then\r
+                               If objChildDiffInfo.FileType = "File" Then\r
+                                       Set objFileSystemInfo.Children.Item(objChildDiffInfo.Name) = objChildDiffInfo.NewFileSystemInfo\r
+                               Else\r
+                                       Set objChildDiffInfo.NewFileSystemInfo.Children = New Dictionary\r
+                                       Set objFileSystemInfo.Children.Item(objChildDiffInfo.Name) = objChildDiffInfo.NewFileSystemInfo\r
+                                       Call objChildDiffInfo.Merge(objChildDiffInfo.NewFileSystemInfo)\r
+                               End If\r
+                       End If\r
+               Next\r
+               \r
+               If objFileSystemInfo.FileType = "Folder" Then\r
+                       Call objFileSystemInfo.Children.Sort(New PrimitiveKeyComparator)\r
+               End If\r
+       Call EndFunction("DiffInfo.Merge")\r
+       End Sub\r
+End Class\r
+\r
+Class DiffInfoComparator\r
+       Public Function Compare(objDiffInfo1, objDiffInfo2)\r
+       Call StartFunction("DiffInfoComparator.Compare")\r
+               Dim intStatus1, intStatus2\r
+               \r
+               intStatus1 = StatusToInteger(objDiffInfo1.Status)\r
+               intStatus2 = StatusToInteger(objDiffInfo2.Status)\r
+               \r
+               If intStatus1 > intStatus2 Then\r
+                       Compare = 1\r
+               ElseIf intStatus1 < intStatus2 Then\r
+                       Compare = -1\r
+               ElseIf objDiffInfo1.Name > objDiffInfo2.Name Then\r
+                       Compare = 1\r
+               ElseIf objDiffInfo1.Name < objDiffInfo2.Name Then\r
+                       Compare = -1\r
+               Else\r
+                       Compare = 0\r
+               End If\r
+       Call EndFunction("DiffInfoComparator.Compare")\r
+       End Function\r
+       \r
+       Private Function StatusToInteger(strStatus)\r
+       Call StartFunction("DiffInfoComparator.StatusToInteger")\r
+               If strStatus = "Create" Then\r
+                       StatusToInteger = 0\r
+               ElseIf strStatus = "Update" Then\r
+                       StatusToInteger = 1\r
+               ElseIf strStatus = "Delete" Then\r
+                       StatusToInteger = 2\r
+               Else\r
+                       StatusToInteger = 3\r
+               End If\r
+       Call EndFunction("DiffInfoComparator.StatusToInteger")\r
+       End Function\r
+End Class\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+' ********************************************************************************\r
+' \83t\83@\83C\83\8bI/O\r
+' ********************************************************************************\r
+\r
+Sub WriteFile(strFilePath, strText)\r
+Call StartFunction("WriteFile,strFilePath=" & strFilePath & ",Len(strText)=" & Len(strText))\r
+       Dim fsoStream\r
+       \r
+       Set fsoStream = gfso.OpenTextFile(strFilePath, IOMode_ForWriting, True)\r
+       Call fsoStream.Write(strText)\r
+       Call fsoStream.Close()\r
+Call EndFunction("WriteFile")\r
+End Sub\r
+\r
+Sub AppendFile(strFilePath, strText)\r
+Call StartFunction("AppendFile,strFilePath=" & strFilePath & ",Len(strText)=" & Len(strText))\r
+       Dim fsoStream\r
+       \r
+       Set fsoStream = gfso.OpenTextFile(strFilePath, IOMode_ForAppending, True)\r
+       Call fsoStream.Write(strText)\r
+       Call fsoStream.Close()\r
+Call EndFunction("AppendFile")\r
+End Sub\r
+\r
+Function ReadFile(strFilePath)\r
+Call StartFunction("ReadFile,strFilePath=" & strFilePath)\r
+       Dim fsoStream\r
+       \r
+       Set fsoStream = gfso.OpenTextFile(strFilePath)\r
+       ReadFile = fsoStream.ReadAll()\r
+       Call fsoStream.Close()\r
+Call StartFunction("ReadFile,Len=" & Len(ReadFile))\r
+End Function\r
+\r
+Sub CopyFile(strSourceFilePath, strDestinationFilePath)\r
+Call StartFunction("CopyFile,strSourceFilePath=" & strSourceFilePath & ",strDestinationFilePath=" & strDestinationFilePath)\r
+       Call gfso.CopyFile(strSourceFilePath, strDestinationFilePath)\r
+Call EndFunction("CopyFile")\r
+End Sub\r
+\r
+Function CreateFolder(strFolderPath)\r
+Call StartFunction("CreateFolder,strFolderPath=" & strFolderPath)\r
+       Set CreateFolder = gfso.CreateFolder(strFolderPath)\r
+Call EndFunction("CreateFolder")\r
+End Function\r
+\r
+' ***** \83\8d\83O\8fo\97Í *****\r
+\r
+Sub WriteLog(strText)\r
+       If Not gfsoLogStream Is Nothing And Not IsEmpty(gfsoLogStream) Then\r
+               Call gfsoLogStream.Write(GetNowToString() & "," & strText & vbCrLf)\r
+       End If\r
+End Sub\r
+\r
+Sub StartFunction(strFunctionName)\r
+       If Not gfsoLogStream Is Nothing And Not IsEmpty(gfsoLogStream) And gblnDebugLog Then\r
+               Call gfsoLogStream.Write(GetNowToString() & ",[StartFunction]" & strFunctionName & vbCrLf)\r
+       End If\r
+End Sub\r
+\r
+Sub EndFunction(strFunctionName)\r
+       If Not gfsoLogStream Is Nothing And Not IsEmpty(gfsoLogStream) And gblnDebugLog Then\r
+               Call gfsoLogStream.Write(GetNowToString() & ",[EndFunction]" & strFunctionName & vbCrLf)\r
+       End If\r
+End Sub\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+' ********************************************************************************\r
+' \95\8e\9a\97ñ\91\80\8dì\r
+' ********************************************************************************\r
+\r
+Function GetNowToString()\r
+       GetNowToString = Year(Now()) & "-" _\r
+               & Right("00" & Month(Now()), 2) & "-" _\r
+               & Right("00" & Day(Now()), 2) & " " _\r
+               & Right("00" & Hour(Now()), 2) & ":" _\r
+               & Right("00" & Minute(Now()), 2) & ":" _\r
+               & Right("00" & Second(Now()), 2)\r
+End Function\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+' ********************************************************************************\r
+' \83R\83\8c\83N\83V\83\87\83\93\r
+' ********************************************************************************\r
+\r
+Class Collection\r
+       Private paryItem\r
+       \r
+       Private Sub Class_Initialize()\r
+               ReDim paryItem(-1)\r
+       End Sub\r
+       \r
+       Public Property Get Count()\r
+               Count = UBound(paryItem) + 1\r
+       End Property\r
+       \r
+       Public Property Get Item(intIndex)\r
+               If IsObject(paryItem(intIndex)) Then\r
+                       Set Item = paryItem(intIndex)\r
+               Else\r
+                       Item = paryItem(intIndex)\r
+               End If\r
+       End Property\r
+       \r
+       Public Property Let Item(intIndex, varItem)\r
+               paryItem(intIndex) = varItem\r
+       End Property\r
+       \r
+       Public Property Set Item(intIndex, varItem)\r
+               Set paryItem(intIndex) = varItem\r
+       End Property\r
+       \r
+       Public Property Get Items()\r
+               Items = CopyArray(paryItem)\r
+       End Property\r
+       \r
+       Public Sub Add(varItem)\r
+               Call AddArray(paryItem, varItem)\r
+       End Sub\r
+       \r
+       Public Function Remove(intIndex)\r
+               If IsObject(paryItem(intIndex)) Then\r
+                       Set Remove = paryItem(intIndex)\r
+               Else\r
+                       Remove = paryItem(intIndex)\r
+               End If\r
+               \r
+               Call RemoveArray(paryItem, intIndex)\r
+       End Function\r
+       \r
+       Public Function RemoveLast()\r
+               Call Remove(Count - 1)\r
+       End Function\r
+       \r
+       Public Function Exist(varItem)\r
+               Exist = (FindItem(varItem) > -1)\r
+       End Function\r
+       \r
+       Public Function FindItem(varItem)\r
+               Dim intIndex\r
+               \r
+               FindItem = -1\r
+               \r
+               For intIndex = 0 To UBound(paryItem)\r
+                       If paryItem(intIndex) = varItem Then\r
+                               FindItem = intIndex\r
+                               Exit For\r
+                       End If\r
+               Next\r
+       End Function\r
+       \r
+       Public Sub Sort(objComparator)\r
+               Call SortArray(paryItem, objComparator)\r
+       End Sub\r
+       \r
+       Public Function Copy()\r
+               Dim col, varItem\r
+               \r
+               Set col = New Collection\r
+               \r
+               For Each varItem In paryItem\r
+                       Call col.Add(varItem)\r
+               Next\r
+               \r
+               Set Copy = col\r
+       End Function\r
+       \r
+       Public Function IsEqual(col)\r
+               Dim intIndex\r
+               \r
+               If TypeName(col) <> "Collection" Then\r
+                       IsEqual = False\r
+                       Exit Function\r
+               ElseIf col.Count <> Count Then\r
+                       IsEqual = False\r
+                       Exit Function\r
+               Else\r
+                       For intIndex = 0 To Count - 1\r
+                               If Item(intIndex) <> col.Item(intIndex) Then\r
+                                       IsEqual = False\r
+                                       Exit Function\r
+                               End If\r
+                       Next\r
+               End If\r
+               \r
+               IsEqual = True\r
+       End Function\r
+End Class\r
+\r
+Class Dictionary\r
+       Private paryItem\r
+       \r
+       Private Sub Class_Initialize()\r
+               ReDim paryItem(-1)\r
+       End Sub\r
+       \r
+       Public Property Get Count()\r
+               Count = UBound(paryItem) + 1\r
+       End Property\r
+       \r
+       Public Property Set Item(varKey, varValue)\r
+               Call SetItem(varKey, varValue)\r
+       End Property\r
+       \r
+       Public Property Let Item(varKey, varValue)\r
+               Call SetItem(varKey, varValue)\r
+       End Property\r
+       \r
+       Public Property Get Item(varKey)\r
+               Dim intIndex\r
+               \r
+               intIndex = FindIndex(varKey)\r
+               \r
+               If intIndex <> -1 Then\r
+                       If IsObject(paryItem(intIndex).Value) Then\r
+                               Set Item = paryItem(intIndex).Value\r
+                       Else\r
+                               Item = paryItem(intIndex).Value\r
+                       End If\r
+               Else\r
+                       Item = Empty\r
+               End If\r
+       End Property\r
+       \r
+       Public Property Get Items()\r
+               Items = CopyArray(paryItem)\r
+       End Property\r
+       \r
+       Public Property Get Keys()\r
+               Dim aryKey, intIndex\r
+               \r
+               ReDim aryKey(UBound(paryItem))\r
+               \r
+               For intIndex = 0 To UBound(paryItem)\r
+                       If IsObject(paryItem(intIndex).Key) Then\r
+                               Set aryKey(intIndex) = paryItem(intIndex).Key\r
+                       Else\r
+                               aryKey(intIndex) = paryItem(intIndex).Key\r
+                       End If\r
+               Next\r
+               \r
+               Keys = aryKey\r
+       End Property\r
+       \r
+       Public Property Get Values()\r
+               Dim aryValue, intIndex\r
+               \r
+               ReDim aryValue(UBound(paryItem))\r
+               \r
+               For intIndex = 0 To UBound(paryItem)\r
+                       If IsObject(paryItem(intIndex).Value) Then\r
+                               Set aryValue(intIndex) = paryItem(intIndex).Value\r
+                       Else\r
+                               aryValue(intIndex) = paryItem(intIndex).Value\r
+                       End If\r
+               Next\r
+               \r
+               Values = aryValue\r
+       End Property\r
+       \r
+       Private Sub SetItem(varKey, varValue)\r
+               Dim intIndex\r
+               Dim objDicItem\r
+               \r
+               intIndex = FindIndex(varKey)\r
+               \r
+               If intIndex <> -1 Then\r
+                       If IsObject(varValue) Then\r
+                               Set paryItem(intIndex).Value = varValue\r
+                       Else\r
+                               paryItem(intIndex).Value = varValue\r
+                       End If\r
+               Else\r
+                       Set objDicItem = New DictionaryItem\r
+                       If IsObject(varKey) Then\r
+                               Set objDicItem.Key = varKey\r
+                       Else\r
+                               objDicItem.Key = varKey\r
+                       End If\r
+                       If IsObject(varValue) Then\r
+                               Set objDicItem.Value = varValue\r
+                       Else\r
+                               objDicItem.Value = varValue\r
+                       End If\r
+                       \r
+                       Call AddArray(paryItem, objDicItem)\r
+               End If\r
+       End Sub\r
+       \r
+       Public Function Remove(varKey)\r
+               Dim intIndex\r
+               \r
+               intIndex = FindIndex(varKey)\r
+               \r
+               If IsObject(paryItem(intIndex).Value) Then\r
+                       Set Remove = paryItem(intIndex).Value\r
+               Else\r
+                       Remove = paryItem(intIndex).Value\r
+               End If\r
+               \r
+               Call RemoveArray(paryItem, intIndex)\r
+       End Function\r
+       \r
+       Private Function FindIndex(varKey)\r
+               Dim intIndex\r
+               \r
+               FindIndex = -1\r
+               \r
+               For intIndex = 0 To UBound(paryItem)\r
+                       If paryItem(intIndex).Key = varKey Then\r
+                               FindIndex = intIndex\r
+                       End If\r
+               Next\r
+       End Function\r
+       \r
+       Public Sub Sort(objComparator)\r
+               Call SortArray(paryItem, objComparator)\r
+       End Sub\r
+       \r
+       Public Function Copy()\r
+               Dim dic, varKey\r
+               \r
+               Set dic = New Dictionary\r
+               \r
+               For Each varKey In Keys\r
+                       If IsObject(Item(varKey)) Then\r
+                               Set dic.Item(varKey) = Item(varKey)\r
+                       Else\r
+                               dic.Item(varKey) = Item(varKey)\r
+                       End If\r
+               Next\r
+               \r
+               Set Copy = dic\r
+       End Function\r
+       \r
+       Public Function ExistKey(varKey)\r
+               ExistKey = (FindIndex(varKey) <> -1)\r
+       End Function\r
+       \r
+       Public Function ExistValue(varValue)\r
+               Dim var\r
+               \r
+               ExistValue = False\r
+               \r
+               For Each var In Values\r
+                       If var = varValue Then\r
+                               ExistValue = True\r
+                               Exit For\r
+                       End If\r
+               Next\r
+       End Function\r
+       \r
+       Public Function IsEqual(dic)\r
+               Dim varKey\r
+               \r
+               If TypeName(dic) <> "Dictionary" Then\r
+                       IsEqual = False\r
+                       Exit Function\r
+               ElseIf dic.Count <> Count Then\r
+                       IsEqual = False\r
+                       Exit Function\r
+               Else\r
+                       For Each varKey In dic.Keys\r
+                               If dic.Item(varKey) <> Item(varKey) Then\r
+                                       IsEqual = False\r
+                                       Exit Function\r
+                               End If\r
+                       Next\r
+               End If\r
+               \r
+               IsEqual = True\r
+       End Function\r
+End Class\r
+\r
+Class DictionaryItem\r
+       Public Key\r
+       Public Value\r
+End Class\r
+\r
+Sub AddArray(ary, var)\r
+       ReDim Preserve ary(UBound(ary) + 1)\r
+       \r
+       If IsObject(var) Then\r
+               Set ary(UBound(ary)) = var\r
+       Else\r
+               ary(UBound(ary)) = var\r
+       End If\r
+End Sub\r
+\r
+Sub RemoveArray(ary, intRemoveIndex)\r
+       Dim intIndex\r
+       \r
+       For intIndex = intRemoveIndex + 1 To UBound(ary)\r
+               If IsObject(ary(intIndex)) Then\r
+                       Set ary(intIndex - 1) = ary(intIndex)\r
+               Else\r
+                       ary(intIndex - 1) = ary(intIndex)\r
+               End If\r
+       Next\r
+       \r
+       ReDim Preserve ary(UBound(ary) - 1)\r
+End Sub\r
+\r
+Function CopyArray(ary)\r
+       Dim aryDst\r
+       ReDim aryDst(UBound(ary))\r
+       Dim intIndex\r
+       \r
+       For intIndex = 0 To UBound(ary)\r
+               If IsObject(ary(intIndex)) Then\r
+                       Set aryDst(intIndex) = ary(intIndex)\r
+               Else\r
+                       aryDst(intIndex) = ary(intIndex)\r
+               End If\r
+       Next\r
+       \r
+       CopyArray = aryDst\r
+End Function\r
+\r
+Sub SortArray(ary, objComparator)\r
+       Dim intIndex, intIndex2\r
+       Dim varTemp\r
+       \r
+       For intIndex = 0 To UBound(ary) - 1\r
+               For intIndex2 = intIndex + 1 To UBound(ary)\r
+                       If objComparator.Compare(ary(intIndex), ary(intIndex2)) > 0 Then\r
+                               If IsObject(ary(intIndex)) Then\r
+                                       Set varTemp = ary(intIndex)\r
+                               Else\r
+                                       varTemp = ary(intIndex)\r
+                               End If\r
+                               \r
+                               If IsObject(ary(intIndex2)) Then\r
+                                       Set ary(intIndex) = ary(intIndex2)\r
+                               Else\r
+                                       ary(intIndex) = ary(intIndex2)\r
+                               End If\r
+                               \r
+                               If IsObject(varTemp) Then\r
+                                       Set ary(intIndex2) = varTemp\r
+                               Else\r
+                                       ary(intIndex2) = varTemp\r
+                               End If\r
+                       End If\r
+               Next\r
+       Next\r
+End Sub\r
+\r
+Class PrimitiveComparator\r
+       Public Function Compare(var1, var2)\r
+               If var1 > var2 Then\r
+                       Compare = 1\r
+               ElseIf var1 < var2 Then\r
+                       Compare = -1\r
+               Else\r
+                       Compare = 0\r
+               End If\r
+       End Function\r
+End Class\r
+\r
+Class PrimitiveKeyComparator\r
+       Public Function Compare(dicItem1, dicItem2)\r
+               If dicItem1.Key > dicItem2.Key Then\r
+                       Compare = 1\r
+               ElseIf dicItem1.Key < dicItem2.Key Then\r
+                       Compare = -1\r
+               Else\r
+                       Compare = 0\r
+               End If\r
+       End Function\r
+End Class\r
+\r
+' ***** \83e\83X\83g *****\r
+\r
+Sub AssertEqual(var1, var2, strMessage)\r
+       If var1 <> var2 Then\r
+               Call Err.Raise(1, "\83e\83X\83g\8e¸\94s", strMessage)\r
+       End If\r
+End Sub\r
+\r
+Sub TestAddArray()\r
+       Dim ary\r
+       \r
+       ReDim ary(2)\r
+       \r
+       ary(0) = "foo"\r
+       ary(1) = "bar"\r
+       ary(2) = "boo"\r
+       \r
+       Call AddArray(ary, "hoge")\r
+       \r
+       Call AssertEqual(UBound(ary), 3, "TestAddArray - \94z\97ñ\82Ì\92·\82³\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(ary(0), "foo", "TestAddArray - \94z\97ñ\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(ary(1), "bar", "TestAddArray - \94z\97ñ\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(ary(2), "boo", "TestAddArray - \94z\97ñ\82Ì\97v\91f2\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(ary(3), "hoge", "TestAddArray - \94z\97ñ\82Ì\97v\91f3\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestRemoveArray()\r
+       Dim ary\r
+       \r
+       ReDim ary(2)\r
+       \r
+       ary(0) = "foo"\r
+       ary(1) = "bar"\r
+       ary(2) = "boo"\r
+       \r
+       Call RemoveArray(ary, 1)\r
+       \r
+       Call AssertEqual(UBound(ary), 1, "TestRemoveArray - \94z\97ñ\82Ì\92·\82³\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(ary(0), "foo", "TestRemoveArray - \94z\97ñ\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(ary(1), "boo", "TestRemoveArray - \94z\97ñ\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestCopyArray()\r
+       Dim ary, aryDst\r
+       \r
+       ReDim ary(2)\r
+       \r
+       ary(0) = "foo"\r
+       ary(1) = "bar"\r
+       ary(2) = "boo"\r
+       \r
+       aryDst = CopyArray(ary)\r
+       \r
+       Call AssertEqual(UBound(aryDst), 2, "TestCopyArray - \94z\97ñ\82Ì\92·\82³\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(aryDst(0), "foo", "TestCopyArray - \94z\97ñ\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(aryDst(1), "bar", "TestCopyArray - \94z\97ñ\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(aryDst(2), "boo", "TestCopyArray - \94z\97ñ\82Ì\97v\91f2\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestSortArray()\r
+       Dim ary\r
+       \r
+       ReDim ary(2)\r
+       \r
+       ary(0) = "foo"\r
+       ary(1) = "bar"\r
+       ary(2) = "boo"\r
+       \r
+       Call SortArray(ary, New PrimitiveComparator)\r
+       \r
+       Call AssertEqual(UBound(ary), 2, "TestSortArray - \94z\97ñ\82Ì\92·\82³\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(ary(0), "bar", "TestSortArray - \94z\97ñ\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(ary(1), "boo", "TestSortArray - \94z\97ñ\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(ary(2), "foo", "TestSortArray - \94z\97ñ\82Ì\97v\91f2\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestCollectionClassInitialize()\r
+       Dim col\r
+       \r
+       Set col = New Collection\r
+       \r
+       Call AssertEqual(col.Count, 0, "TestCollectionCount - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestCollectionAdd()\r
+       Dim col\r
+       \r
+       Set col = New Collection\r
+       \r
+       Call col.Add("foo")\r
+       Call col.Add("bar")\r
+       Call col.Add("boo")\r
+       \r
+       Call AssertEqual(col.Count, 3, "TestCollectionAdd - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(col.Item(0), "foo", "TestCollectionAdd - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(col.Item(1), "bar", "TestCollectionAdd - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(col.Item(2), "boo", "TestCollectionAdd - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f2\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestCollectionRemove()\r
+       Dim col\r
+       \r
+       Set col = New Collection\r
+       \r
+       Call col.Add("foo")\r
+       Call col.Add("bar")\r
+       Call col.Add("boo")\r
+       \r
+       Call AssertEqual(col.Remove(1), "bar", "TestCollectionRemove - \8dí\8f\9c\82µ\82½\92l\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(col.Count, 2, "TestCollectionRemove - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(col.Item(0), "foo", "TestCollectionRemove - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(col.Item(1), "boo", "TestCollectionRemove - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestCollectionItems()\r
+       Dim col, var, intIndex\r
+       \r
+       Set col = New Collection\r
+       \r
+       For Each var In col.Items\r
+               Call AssertEqual(True, False, "TestCollectionItems - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+       Next\r
+       \r
+       Call col.Add("foo")\r
+       Call col.Add("bar")\r
+       Call col.Add("boo")\r
+       \r
+       Call AssertEqual(col.Count, 3, "TestCollectionItems - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       intIndex = 0\r
+       \r
+       For Each var In col.Items\r
+               If intIndex = 0 Then\r
+                       Call AssertEqual(var, "foo", "TestCollectionItems - \97ñ\8b\93\82³\82ê\82½\92l(0)\82ª\88Ù\82È\82é\81B")\r
+               ElseIf intIndex = 1 Then\r
+                       Call AssertEqual(var, "bar", "TestCollectionItems - \97ñ\8b\93\82³\82ê\82½\92l(1)\82ª\88Ù\82È\82é\81B")\r
+               ElseIf intIndex = 2 Then\r
+                       Call AssertEqual(var, "boo", "TestCollectionItems - \97ñ\8b\93\82³\82ê\82½\92l(2)\82ª\88Ù\82È\82é\81B")\r
+               Else\r
+                       Call AssertEqual(True, False, "TestCollectionItems - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+               End If\r
+               \r
+               intIndex = intIndex + 1\r
+       Next\r
+End Sub\r
+\r
+Sub TestCollectionSort()\r
+       Dim col\r
+       \r
+       Set col = New Collection\r
+       \r
+       Call col.Add("foo")\r
+       Call col.Add("bar")\r
+       Call col.Add("boo")\r
+       \r
+       Call col.Sort(New PrimitiveComparator)\r
+       \r
+       Call AssertEqual(col.Count, 3, "TestCollectionSort - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(col.Item(0), "bar", "TestCollectionSort - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(col.Item(1), "boo", "TestCollectionSort - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(col.Item(2), "foo", "TestCollectionSort - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f2\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestCollectionCopy()\r
+       Dim col, colDst\r
+       \r
+       Set col = New Collection\r
+       \r
+       Call col.Add("foo")\r
+       Call col.Add("bar")\r
+       Call col.Add("boo")\r
+       \r
+       Set colDst = col.Copy()\r
+       \r
+       Call AssertEqual(col.Count, 3, "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(col.Item(0), "foo", "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(col.Item(1), "bar", "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(col.Item(2), "boo", "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f2\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(colDst.Count, 3, "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(colDst.Item(0), "foo", "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(colDst.Item(1), "bar", "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(colDst.Item(2), "boo", "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f2\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call colDst.Add("hoge")\r
+       \r
+       Call AssertEqual(col.Count, 3, "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(colDst.Count, 4, "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestCollectionExist()\r
+       Dim col\r
+       \r
+       Set col = New Collection\r
+       \r
+       Call col.Add("foo")\r
+       Call col.Add("bar")\r
+       Call col.Add("boo")\r
+       \r
+       Call AssertEqual(col.Exist("bar"), True, "TestCollectionExist - \91\8dÝ\94»\92è\82ª\8aÔ\88á\82¦\82Ä\82¢\82é(True)\81B")\r
+       Call AssertEqual(col.Exist("hoge"), False, "TestCollectionExist - \91\8dÝ\94»\92è\82ª\8aÔ\88á\82¦\82Ä\82¢\82é(False)\81B")\r
+End Sub\r
+\r
+Sub TestCollectionFindItem()\r
+       Dim col\r
+       \r
+       Set col = New Collection\r
+       \r
+       Call col.Add("foo")\r
+       Call col.Add("bar")\r
+       Call col.Add("boo")\r
+       \r
+       Call AssertEqual(col.FindItem("bar"), 1, "TestCollectionFindItem - \97v\91f\82Ì\8c\9f\8dõ\8c\8b\89Ê\82ª\88Ù\82È\82é(1)\81B")\r
+       Call AssertEqual(col.FindItem("hoge"), -1, "TestCollectionFindItem - \97v\91f\82Ì\8c\9f\8dõ\8c\8b\89Ê\82ª\88Ù\82È\82é(-1)\81B")\r
+End Sub\r
+\r
+Sub TestCollectionIsEqual()\r
+       Dim col1, col2\r
+       \r
+       Set col1 = New Collection\r
+       \r
+       Call col1.Add("foo")\r
+       Call col1.Add("bar")\r
+       Call col1.Add("boo")\r
+       \r
+       Set col2 = New Collection\r
+       \r
+       Call col2.Add("foo")\r
+       Call col2.Add("bar")\r
+       Call col2.Add("boo")\r
+       \r
+       Call AssertEqual(col1.IsEqual(col2), True, "TestCollectionIsEqual - \93\99\89¿\94»\92è\82ª\88Ù\82È\82é\81B(True)")\r
+       \r
+       Call col2.Add("hoge")\r
+       \r
+       Call AssertEqual(col1.IsEqual(col2), False, "TestCollectionIsEqual - \93\99\89¿\94»\92è\82ª\88Ù\82È\82é\81B(False)")\r
+End Sub\r
+\r
+Public Sub TestDictionaryClassInitialize()\r
+       Dim dic\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       Call AssertEqual(dic.Count, 0, "TestDictionaryInitialize - \83f\83B\83N\83V\83\87\83i\83\8a\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Public Sub TestDictionaryItem()\r
+       Dim dic\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       Call AssertEqual(dic.Count, 3, "TestDictionaryItem - \83f\83B\83N\83V\83\87\83i\83\8a\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(dic.Item("foo"), "\82Ó\81[", "TestDictionaryItem - \97v\91f(foo)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(dic.Item("bar"), "\82Î\81[", "TestDictionaryItem - \97v\91f(bar)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(dic.Item("boo"), "\82Ô\81[", "TestDictionaryItem - \97v\91f(boo)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(dic.Item("hoge"), Empty, "TestDictionaryItem - \91\8dÝ\82µ\82È\82¢\97v\91f\82Ì\92l\82ªEmpty\82Å\82Í\82È\82¢\81B")\r
+End Sub\r
+\r
+Public Sub TestDictionaryRemove()\r
+       Dim dic\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       Call AssertEqual(dic.Remove("bar"), "\82Î\81[", "TestDictionaryRemove - \8dí\8f\9c\82µ\82½\97v\91f\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(dic.Count, 2, "TestDictionaryRemove - \83f\83B\83N\83V\83\87\83i\83\8a\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(dic.Item("foo"), "\82Ó\81[", "TestDictionaryItem - \97v\91f(foo)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(dic.Item("boo"), "\82Ô\81[", "TestDictionaryItem - \97v\91f(boo)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Public Sub TestDictionaryItems()\r
+       Dim dic, varItem, intIndex\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       For Each varItem In dic.Items\r
+               Call AssertEqual(True, False, "TestDictionaryItems - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+       Next\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       intIndex = 0\r
+       \r
+       For Each varItem In dic.Items\r
+               If intIndex = 0 Then\r
+                       Call AssertEqual(varItem.Key, "foo", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(0)")\r
+                       Call AssertEqual(varItem.Value, "\82Ó\81[", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(0)")\r
+               ElseIf intIndex = 1 Then\r
+                       Call AssertEqual(varItem.Key, "bar", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(1)")\r
+                       Call AssertEqual(varItem.Value, "\82Î\81[", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(1)")\r
+               ElseIf intIndex = 2 Then\r
+                       Call AssertEqual(varItem.Key, "boo", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(2)")\r
+                       Call AssertEqual(varItem.Value, "\82Ô\81[", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(2)")\r
+               Else\r
+                       Call AssertEqual(True, False, "TestDictionaryItems - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+               End If\r
+               \r
+               intIndex = intIndex + 1\r
+       Next\r
+End Sub\r
+\r
+Public Sub TestDictionaryKeys()\r
+       Dim dic, varKey, intIndex\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       For Each varKey In dic.Keys\r
+               Call AssertEqual(True, False, "TestDictionaryKeys - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+       Next\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       intIndex = 0\r
+       \r
+       For Each varKey In dic.Keys\r
+               If intIndex = 0 Then\r
+                       Call AssertEqual(varKey, "foo", "TestDictionaryKeys - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(0)")\r
+               ElseIf intIndex = 1 Then\r
+                       Call AssertEqual(varKey, "bar", "TestDictionaryKeys - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(1)")\r
+               ElseIf intIndex = 2 Then\r
+                       Call AssertEqual(varKey, "boo", "TestDictionaryKeys - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(2)")\r
+               Else\r
+                       Call AssertEqual(True, False, "TestDictionaryKeys - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+               End If\r
+               \r
+               intIndex = intIndex + 1\r
+       Next\r
+End Sub\r
+\r
+Public Sub TestDictionaryValues()\r
+       Dim dic, varValue, intIndex\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       For Each varValue In dic.Values\r
+               Call AssertEqual(True, False, "TestDictionaryValues - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+       Next\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       intIndex = 0\r
+       \r
+       For Each varValue In dic.Values\r
+               If intIndex = 0 Then\r
+                       Call AssertEqual(varValue, "\82Ó\81[", "TestDictionaryValues - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(0)")\r
+               ElseIf intIndex = 1 Then\r
+                       Call AssertEqual(varValue, "\82Î\81[", "TestDictionaryValues - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(1)")\r
+               ElseIf intIndex = 2 Then\r
+                       Call AssertEqual(varValue, "\82Ô\81[", "TestDictionaryValues - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(2)")\r
+               Else\r
+                       Call AssertEqual(True, False, "TestDictionaryValues - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+               End If\r
+               \r
+               intIndex = intIndex + 1\r
+       Next\r
+End Sub\r
+\r
+Public Sub TestDictionarySort()\r
+       Dim dic, varItem, intIndex\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       Call dic.Sort(New PrimitiveKeyComparator)\r
+       \r
+       intIndex = 0\r
+       \r
+       For Each varItem In dic.Items\r
+               If intIndex = 0 Then\r
+                       Call AssertEqual(varItem.Key, "bar", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(0)")\r
+                       Call AssertEqual(varItem.Value, "\82Î\81[", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(0)")\r
+               ElseIf intIndex = 1 Then\r
+                       Call AssertEqual(varItem.Key, "boo", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(1)")\r
+                       Call AssertEqual(varItem.Value, "\82Ô\81[", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(1)")\r
+               ElseIf intIndex = 2 Then\r
+                       Call AssertEqual(varItem.Key, "foo", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(2)")\r
+                       Call AssertEqual(varItem.Value, "\82Ó\81[", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(2)")\r
+               Else\r
+                       Call AssertEqual(True, False, "TestDictionaryItems - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+               End If\r
+               \r
+               intIndex = intIndex + 1\r
+       Next\r
+End Sub\r
+\r
+Public Sub TestDictionaryCopy()\r
+       Dim dic, dic2\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       Set dic2 = dic.Copy()\r
+       \r
+       Call AssertEqual(dic.Count, 3, "TestDictionaryItem - \83f\83B\83N\83V\83\87\83i\83\8a\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(dic.Item("foo"), "\82Ó\81[", "TestDictionaryItem - \97v\91f(foo)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(dic.Item("bar"), "\82Î\81[", "TestDictionaryItem - \97v\91f(bar)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(dic.Item("boo"), "\82Ô\81[", "TestDictionaryItem - \97v\91f(boo)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(dic2.Count, 3, "TestDictionaryItem - \83f\83B\83N\83V\83\87\83i\83\8a\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(dic2.Item("foo"), "\82Ó\81[", "TestDictionaryItem - \97v\91f(foo)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(dic2.Item("bar"), "\82Î\81[", "TestDictionaryItem - \97v\91f(bar)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(dic2.Item("boo"), "\82Ô\81[", "TestDictionaryItem - \97v\91f(boo)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       \r
+       dic2.Item("hoge") = "\82Ù\82°"\r
+       \r
+       Call AssertEqual(dic.Count, 3, "TestDictionaryItem - \83f\83B\83N\83V\83\87\83i\83\8a\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(dic2.Count, 4, "TestDictionaryItem - \83f\83B\83N\83V\83\87\83i\83\8a\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Public Sub TestDictionaryExistKey()\r
+       Dim dic\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       Call AssertEqual(dic.ExistKey("foo"), True, "TestDictionaryExistKey - \91\8dÝ\94»\92è\82ª\88Ù\82È\82é\81B(True)")\r
+       Call AssertEqual(dic.ExistKey("hoge"), False, "TestDictionaryExistKey - \91\8dÝ\94»\92è\82ª\88Ù\82È\82é\81B(False)")\r
+End Sub\r
+\r
+Public Sub TestDictionaryExistValue()\r
+       Dim dic\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       Call AssertEqual(dic.ExistValue("\82Ó\81["), True, "TestDictionaryExistValue - \91\8dÝ\94»\92è\82ª\88Ù\82È\82é\81B(True)")\r
+       Call AssertEqual(dic.ExistValue("foo"), False, "TestDictionaryExistValue - \91\8dÝ\94»\92è\82ª\88Ù\82È\82é\81B(False)")\r
+End Sub\r
+\r
+Public Sub TestDictionaryIsEqual()\r
+       Dim dic1, dic2\r
+       \r
+       Set dic1 = New Dictionary\r
+       \r
+       dic1.Item("foo") = "\82Ó\81["\r
+       dic1.Item("bar") = "\82Î\81["\r
+       dic1.Item("boo") = "\82Ô\81["\r
+       \r
+       Set dic2 = New Dictionary\r
+       \r
+       dic2.Item("foo") = "\82Ó\81["\r
+       dic2.Item("bar") = "\82Î\81["\r
+       dic2.Item("boo") = "\82Ô\81["\r
+       \r
+       Call AssertEqual(dic1.IsEqual(dic2), True, "TestDictionaryIsEqual - \93\99\89¿\94»\92è\82ª\88Ù\82È\82é\81B(True)")\r
+       \r
+       dic2.Item("boo") = "\82Ô\82£"\r
+       \r
+       Call AssertEqual(dic1.IsEqual(dic2), False, "TestDictionaryIsEqual - \93\99\89¿\94»\92è\82ª\88Ù\82È\82é\81B(False)")\r
+End Sub\r
+\r
+Sub AllTest()\r
+       Call TestAddArray()\r
+       Call TestRemoveArray()\r
+       Call TestCopyArray()\r
+       Call TestSortArray()\r
+       \r
+       Call TestCollectionClassInitialize()\r
+       Call TestCollectionAdd()\r
+       Call TestCollectionRemove()\r
+       Call TestCollectionItems()\r
+       Call TestCollectionSort()\r
+       Call TestCollectionCopy()\r
+       Call TestCollectionExist()\r
+       Call TestCollectionFindItem()\r
+       Call TestCollectionIsEqual()\r
+       \r
+       Call TestDictionaryClassInitialize()\r
+       Call TestDictionaryItem()\r
+       Call TestDictionaryRemove()\r
+       Call TestDictionaryItems()\r
+       Call TestDictionaryKeys()\r
+       Call TestDictionaryValues()\r
+       Call TestDictionarySort()\r
+       Call TestDictionaryCopy()\r
+       Call TestDictionaryExistKey()\r
+       Call TestDictionaryExistValue()\r
+       Call TestDictionaryIsEqual()\r
+       \r
+       MsgBox "\83e\83X\83g\90¬\8c÷"\r
+End Sub\r
+\r
+Call AllTest()\r
diff --git a/bak.vbs/\83e\83X\83g.vbs b/bak.vbs/\83e\83X\83g.vbs
new file mode 100644 (file)
index 0000000..75285c9
--- /dev/null
@@ -0,0 +1,7 @@
+Option Explicit\r
+\r
+Sub AssertEqual(var1, var2, strMessage)\r
+       If var1 <> var2 Then\r
+               Call Err.Raise(1, "\83e\83X\83g\8e¸\94s", strMessage)\r
+       End If\r
+End Sub\r
diff --git a/bak.vbs/\94z\97ñ\81E\83R\83\8c\83N\83V\83\87\83\93.vbs b/bak.vbs/\94z\97ñ\81E\83R\83\8c\83N\83V\83\87\83\93.vbs
new file mode 100644 (file)
index 0000000..f9c0dbc
--- /dev/null
@@ -0,0 +1,913 @@
+Option Explicit\r
+\r
+Class Collection\r
+       Private paryItem\r
+       \r
+       Private Sub Class_Initialize()\r
+               ReDim paryItem(-1)\r
+       End Sub\r
+       \r
+       Public Property Get Count()\r
+               Count = UBound(paryItem) + 1\r
+       End Property\r
+       \r
+       Public Property Get Item(intIndex)\r
+               If IsObject(paryItem(intIndex)) Then\r
+                       Set Item = paryItem(intIndex)\r
+               Else\r
+                       Item = paryItem(intIndex)\r
+               End If\r
+       End Property\r
+       \r
+       Public Property Let Item(intIndex, varItem)\r
+               paryItem(intIndex) = varItem\r
+       End Property\r
+       \r
+       Public Property Set Item(intIndex, varItem)\r
+               Set paryItem(intIndex) = varItem\r
+       End Property\r
+       \r
+       Public Property Get Items()\r
+               Items = CopyArray(paryItem)\r
+       End Property\r
+       \r
+       Public Sub Add(varItem)\r
+               Call AddArray(paryItem, varItem)\r
+       End Sub\r
+       \r
+       Public Function Remove(intIndex)\r
+               If IsObject(paryItem(intIndex)) Then\r
+                       Set Remove = paryItem(intIndex)\r
+               Else\r
+                       Remove = paryItem(intIndex)\r
+               End If\r
+               \r
+               Call RemoveArray(paryItem, intIndex)\r
+       End Function\r
+       \r
+       Public Function RemoveLast()\r
+               Call Remove(Count - 1)\r
+       End Function\r
+       \r
+       Public Function Exist(varItem)\r
+               Exist = (FindItem(varItem) > -1)\r
+       End Function\r
+       \r
+       Public Function FindItem(varItem)\r
+               Dim intIndex\r
+               \r
+               FindItem = -1\r
+               \r
+               For intIndex = 0 To UBound(paryItem)\r
+                       If paryItem(intIndex) = varItem Then\r
+                               FindItem = intIndex\r
+                               Exit For\r
+                       End If\r
+               Next\r
+       End Function\r
+       \r
+       Public Sub Sort(objComparator)\r
+               Call SortArray(paryItem, objComparator)\r
+       End Sub\r
+       \r
+       Public Function Copy()\r
+               Dim col, varItem\r
+               \r
+               Set col = New Collection\r
+               \r
+               For Each varItem In paryItem\r
+                       Call col.Add(varItem)\r
+               Next\r
+               \r
+               Set Copy = col\r
+       End Function\r
+       \r
+       Public Function IsEqual(col)\r
+               Dim intIndex\r
+               \r
+               If TypeName(col) <> "Collection" Then\r
+                       IsEqual = False\r
+                       Exit Function\r
+               ElseIf col.Count <> Count Then\r
+                       IsEqual = False\r
+                       Exit Function\r
+               Else\r
+                       For intIndex = 0 To Count - 1\r
+                               If Item(intIndex) <> col.Item(intIndex) Then\r
+                                       IsEqual = False\r
+                                       Exit Function\r
+                               End If\r
+                       Next\r
+               End If\r
+               \r
+               IsEqual = True\r
+       End Function\r
+End Class\r
+\r
+Class Dictionary\r
+       Private paryItem\r
+       \r
+       Private Sub Class_Initialize()\r
+               ReDim paryItem(-1)\r
+       End Sub\r
+       \r
+       Public Property Get Count()\r
+               Count = UBound(paryItem) + 1\r
+       End Property\r
+       \r
+       Public Property Set Item(varKey, varValue)\r
+               Call SetItem(varKey, varValue)\r
+       End Property\r
+       \r
+       Public Property Let Item(varKey, varValue)\r
+               Call SetItem(varKey, varValue)\r
+       End Property\r
+       \r
+       Public Property Get Item(varKey)\r
+               Dim intIndex\r
+               \r
+               intIndex = FindIndex(varKey)\r
+               \r
+               If intIndex <> -1 Then\r
+                       If IsObject(paryItem(intIndex).Value) Then\r
+                               Set Item = paryItem(intIndex).Value\r
+                       Else\r
+                               Item = paryItem(intIndex).Value\r
+                       End If\r
+               Else\r
+                       Item = Empty\r
+               End If\r
+       End Property\r
+       \r
+       Public Property Get Items()\r
+               Items = CopyArray(paryItem)\r
+       End Property\r
+       \r
+       Public Property Get Keys()\r
+               Dim aryKey, intIndex\r
+               \r
+               ReDim aryKey(UBound(paryItem))\r
+               \r
+               For intIndex = 0 To UBound(paryItem)\r
+                       If IsObject(paryItem(intIndex).Key) Then\r
+                               Set aryKey(intIndex) = paryItem(intIndex).Key\r
+                       Else\r
+                               aryKey(intIndex) = paryItem(intIndex).Key\r
+                       End If\r
+               Next\r
+               \r
+               Keys = aryKey\r
+       End Property\r
+       \r
+       Public Property Get Values()\r
+               Dim aryValue, intIndex\r
+               \r
+               ReDim aryValue(UBound(paryItem))\r
+               \r
+               For intIndex = 0 To UBound(paryItem)\r
+                       If IsObject(paryItem(intIndex).Value) Then\r
+                               Set aryValue(intIndex) = paryItem(intIndex).Value\r
+                       Else\r
+                               aryValue(intIndex) = paryItem(intIndex).Value\r
+                       End If\r
+               Next\r
+               \r
+               Values = aryValue\r
+       End Property\r
+       \r
+       Private Sub SetItem(varKey, varValue)\r
+               Dim intIndex\r
+               Dim objDicItem\r
+               \r
+               intIndex = FindIndex(varKey)\r
+               \r
+               If intIndex <> -1 Then\r
+                       If IsObject(varValue) Then\r
+                               Set paryItem(intIndex).Value = varValue\r
+                       Else\r
+                               paryItem(intIndex).Value = varValue\r
+                       End If\r
+               Else\r
+                       Set objDicItem = New DictionaryItem\r
+                       If IsObject(varKey) Then\r
+                               Set objDicItem.Key = varKey\r
+                       Else\r
+                               objDicItem.Key = varKey\r
+                       End If\r
+                       If IsObject(varValue) Then\r
+                               Set objDicItem.Value = varValue\r
+                       Else\r
+                               objDicItem.Value = varValue\r
+                       End If\r
+                       \r
+                       Call AddArray(paryItem, objDicItem)\r
+               End If\r
+       End Sub\r
+       \r
+       Public Function Remove(varKey)\r
+               Dim intIndex\r
+               \r
+               intIndex = FindIndex(varKey)\r
+               \r
+               If IsObject(paryItem(intIndex).Value) Then\r
+                       Set Remove = paryItem(intIndex).Value\r
+               Else\r
+                       Remove = paryItem(intIndex).Value\r
+               End If\r
+               \r
+               Call RemoveArray(paryItem, intIndex)\r
+       End Function\r
+       \r
+       Private Function FindIndex(varKey)\r
+               Dim intIndex\r
+               \r
+               FindIndex = -1\r
+               \r
+               For intIndex = 0 To UBound(paryItem)\r
+                       If paryItem(intIndex).Key = varKey Then\r
+                               FindIndex = intIndex\r
+                       End If\r
+               Next\r
+       End Function\r
+       \r
+       Public Sub Sort(objComparator)\r
+               Call SortArray(paryItem, objComparator)\r
+       End Sub\r
+       \r
+       Public Function Copy()\r
+               Dim dic, varKey\r
+               \r
+               Set dic = New Dictionary\r
+               \r
+               For Each varKey In Keys\r
+                       If IsObject(Item(varKey)) Then\r
+                               Set dic.Item(varKey) = Item(varKey)\r
+                       Else\r
+                               dic.Item(varKey) = Item(varKey)\r
+                       End If\r
+               Next\r
+               \r
+               Set Copy = dic\r
+       End Function\r
+       \r
+       Public Function ExistKey(varKey)\r
+               ExistKey = (FindIndex(varKey) <> -1)\r
+       End Function\r
+       \r
+       Public Function ExistValue(varValue)\r
+               Dim var\r
+               \r
+               ExistValue = False\r
+               \r
+               For Each var In Values\r
+                       If var = varValue Then\r
+                               ExistValue = True\r
+                               Exit For\r
+                       End If\r
+               Next\r
+       End Function\r
+       \r
+       Public Function IsEqual(dic)\r
+               Dim varKey\r
+               \r
+               If TypeName(dic) <> "Dictionary" Then\r
+                       IsEqual = False\r
+                       Exit Function\r
+               ElseIf dic.Count <> Count Then\r
+                       IsEqual = False\r
+                       Exit Function\r
+               Else\r
+                       For Each varKey In dic.Keys\r
+                               If dic.Item(varKey) <> Item(varKey) Then\r
+                                       IsEqual = False\r
+                                       Exit Function\r
+                               End If\r
+                       Next\r
+               End If\r
+               \r
+               IsEqual = True\r
+       End Function\r
+End Class\r
+\r
+Class DictionaryItem\r
+       Public Key\r
+       Public Value\r
+End Class\r
+\r
+Sub AddArray(ary, var)\r
+       ReDim Preserve ary(UBound(ary) + 1)\r
+       \r
+       If IsObject(var) Then\r
+               Set ary(UBound(ary)) = var\r
+       Else\r
+               ary(UBound(ary)) = var\r
+       End If\r
+End Sub\r
+\r
+Sub RemoveArray(ary, intRemoveIndex)\r
+       Dim intIndex\r
+       \r
+       For intIndex = intRemoveIndex + 1 To UBound(ary)\r
+               If IsObject(ary(intIndex)) Then\r
+                       Set ary(intIndex - 1) = ary(intIndex)\r
+               Else\r
+                       ary(intIndex - 1) = ary(intIndex)\r
+               End If\r
+       Next\r
+       \r
+       ReDim Preserve ary(UBound(ary) - 1)\r
+End Sub\r
+\r
+Function CopyArray(ary)\r
+       Dim aryDst\r
+       ReDim aryDst(UBound(ary))\r
+       Dim intIndex\r
+       \r
+       For intIndex = 0 To UBound(ary)\r
+               If IsObject(ary(intIndex)) Then\r
+                       Set aryDst(intIndex) = ary(intIndex)\r
+               Else\r
+                       aryDst(intIndex) = ary(intIndex)\r
+               End If\r
+       Next\r
+       \r
+       CopyArray = aryDst\r
+End Function\r
+\r
+Sub SortArray(ary, objComparator)\r
+       Dim intIndex, intIndex2\r
+       Dim varTemp\r
+       \r
+       For intIndex = 0 To UBound(ary) - 1\r
+               For intIndex2 = intIndex + 1 To UBound(ary)\r
+                       If objComparator.Compare(ary(intIndex), ary(intIndex2)) > 0 Then\r
+                               If IsObject(ary(intIndex)) Then\r
+                                       Set varTemp = ary(intIndex)\r
+                               Else\r
+                                       varTemp = ary(intIndex)\r
+                               End If\r
+                               \r
+                               If IsObject(ary(intIndex2)) Then\r
+                                       Set ary(intIndex) = ary(intIndex2)\r
+                               Else\r
+                                       ary(intIndex) = ary(intIndex2)\r
+                               End If\r
+                               \r
+                               If IsObject(varTemp) Then\r
+                                       Set ary(intIndex2) = varTemp\r
+                               Else\r
+                                       ary(intIndex2) = varTemp\r
+                               End If\r
+                       End If\r
+               Next\r
+       Next\r
+End Sub\r
+\r
+Class PrimitiveComparator\r
+       Public Function Compare(var1, var2)\r
+               If var1 > var2 Then\r
+                       Compare = 1\r
+               ElseIf var1 < var2 Then\r
+                       Compare = -1\r
+               Else\r
+                       Compare = 0\r
+               End If\r
+       End Function\r
+End Class\r
+\r
+Class PrimitiveKeyComparator\r
+       Public Function Compare(dicItem1, dicItem2)\r
+               If dicItem1.Key > dicItem2.Key Then\r
+                       Compare = 1\r
+               ElseIf dicItem1.Key < dicItem2.Key Then\r
+                       Compare = -1\r
+               Else\r
+                       Compare = 0\r
+               End If\r
+       End Function\r
+End Class\r
+\r
+' ***** \83e\83X\83g *****\r
+\r
+Sub AssertEqual(var1, var2, strMessage)\r
+       If var1 <> var2 Then\r
+               Call Err.Raise(1, "\83e\83X\83g\8e¸\94s", strMessage)\r
+       End If\r
+End Sub\r
+\r
+Sub TestAddArray()\r
+       Dim ary\r
+       \r
+       ReDim ary(2)\r
+       \r
+       ary(0) = "foo"\r
+       ary(1) = "bar"\r
+       ary(2) = "boo"\r
+       \r
+       Call AddArray(ary, "hoge")\r
+       \r
+       Call AssertEqual(UBound(ary), 3, "TestAddArray - \94z\97ñ\82Ì\92·\82³\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(ary(0), "foo", "TestAddArray - \94z\97ñ\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(ary(1), "bar", "TestAddArray - \94z\97ñ\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(ary(2), "boo", "TestAddArray - \94z\97ñ\82Ì\97v\91f2\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(ary(3), "hoge", "TestAddArray - \94z\97ñ\82Ì\97v\91f3\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestRemoveArray()\r
+       Dim ary\r
+       \r
+       ReDim ary(2)\r
+       \r
+       ary(0) = "foo"\r
+       ary(1) = "bar"\r
+       ary(2) = "boo"\r
+       \r
+       Call RemoveArray(ary, 1)\r
+       \r
+       Call AssertEqual(UBound(ary), 1, "TestRemoveArray - \94z\97ñ\82Ì\92·\82³\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(ary(0), "foo", "TestRemoveArray - \94z\97ñ\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(ary(1), "boo", "TestRemoveArray - \94z\97ñ\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestCopyArray()\r
+       Dim ary, aryDst\r
+       \r
+       ReDim ary(2)\r
+       \r
+       ary(0) = "foo"\r
+       ary(1) = "bar"\r
+       ary(2) = "boo"\r
+       \r
+       aryDst = CopyArray(ary)\r
+       \r
+       Call AssertEqual(UBound(aryDst), 2, "TestCopyArray - \94z\97ñ\82Ì\92·\82³\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(aryDst(0), "foo", "TestCopyArray - \94z\97ñ\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(aryDst(1), "bar", "TestCopyArray - \94z\97ñ\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(aryDst(2), "boo", "TestCopyArray - \94z\97ñ\82Ì\97v\91f2\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestSortArray()\r
+       Dim ary\r
+       \r
+       ReDim ary(2)\r
+       \r
+       ary(0) = "foo"\r
+       ary(1) = "bar"\r
+       ary(2) = "boo"\r
+       \r
+       Call SortArray(ary, New PrimitiveComparator)\r
+       \r
+       Call AssertEqual(UBound(ary), 2, "TestSortArray - \94z\97ñ\82Ì\92·\82³\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(ary(0), "bar", "TestSortArray - \94z\97ñ\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(ary(1), "boo", "TestSortArray - \94z\97ñ\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(ary(2), "foo", "TestSortArray - \94z\97ñ\82Ì\97v\91f2\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestCollectionClassInitialize()\r
+       Dim col\r
+       \r
+       Set col = New Collection\r
+       \r
+       Call AssertEqual(col.Count, 0, "TestCollectionCount - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestCollectionAdd()\r
+       Dim col\r
+       \r
+       Set col = New Collection\r
+       \r
+       Call col.Add("foo")\r
+       Call col.Add("bar")\r
+       Call col.Add("boo")\r
+       \r
+       Call AssertEqual(col.Count, 3, "TestCollectionAdd - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(col.Item(0), "foo", "TestCollectionAdd - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(col.Item(1), "bar", "TestCollectionAdd - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(col.Item(2), "boo", "TestCollectionAdd - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f2\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestCollectionRemove()\r
+       Dim col\r
+       \r
+       Set col = New Collection\r
+       \r
+       Call col.Add("foo")\r
+       Call col.Add("bar")\r
+       Call col.Add("boo")\r
+       \r
+       Call AssertEqual(col.Remove(1), "bar", "TestCollectionRemove - \8dí\8f\9c\82µ\82½\92l\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(col.Count, 2, "TestCollectionRemove - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(col.Item(0), "foo", "TestCollectionRemove - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(col.Item(1), "boo", "TestCollectionRemove - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestCollectionItems()\r
+       Dim col, var, intIndex\r
+       \r
+       Set col = New Collection\r
+       \r
+       For Each var In col.Items\r
+               Call AssertEqual(True, False, "TestCollectionItems - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+       Next\r
+       \r
+       Call col.Add("foo")\r
+       Call col.Add("bar")\r
+       Call col.Add("boo")\r
+       \r
+       Call AssertEqual(col.Count, 3, "TestCollectionItems - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       intIndex = 0\r
+       \r
+       For Each var In col.Items\r
+               If intIndex = 0 Then\r
+                       Call AssertEqual(var, "foo", "TestCollectionItems - \97ñ\8b\93\82³\82ê\82½\92l(0)\82ª\88Ù\82È\82é\81B")\r
+               ElseIf intIndex = 1 Then\r
+                       Call AssertEqual(var, "bar", "TestCollectionItems - \97ñ\8b\93\82³\82ê\82½\92l(1)\82ª\88Ù\82È\82é\81B")\r
+               ElseIf intIndex = 2 Then\r
+                       Call AssertEqual(var, "boo", "TestCollectionItems - \97ñ\8b\93\82³\82ê\82½\92l(2)\82ª\88Ù\82È\82é\81B")\r
+               Else\r
+                       Call AssertEqual(True, False, "TestCollectionItems - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+               End If\r
+               \r
+               intIndex = intIndex + 1\r
+       Next\r
+End Sub\r
+\r
+Sub TestCollectionSort()\r
+       Dim col\r
+       \r
+       Set col = New Collection\r
+       \r
+       Call col.Add("foo")\r
+       Call col.Add("bar")\r
+       Call col.Add("boo")\r
+       \r
+       Call col.Sort(New PrimitiveComparator)\r
+       \r
+       Call AssertEqual(col.Count, 3, "TestCollectionSort - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(col.Item(0), "bar", "TestCollectionSort - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(col.Item(1), "boo", "TestCollectionSort - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(col.Item(2), "foo", "TestCollectionSort - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f2\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestCollectionCopy()\r
+       Dim col, colDst\r
+       \r
+       Set col = New Collection\r
+       \r
+       Call col.Add("foo")\r
+       Call col.Add("bar")\r
+       Call col.Add("boo")\r
+       \r
+       Set colDst = col.Copy()\r
+       \r
+       Call AssertEqual(col.Count, 3, "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(col.Item(0), "foo", "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(col.Item(1), "bar", "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(col.Item(2), "boo", "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f2\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(colDst.Count, 3, "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(colDst.Item(0), "foo", "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f0\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(colDst.Item(1), "bar", "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f1\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(colDst.Item(2), "boo", "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f2\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call colDst.Add("hoge")\r
+       \r
+       Call AssertEqual(col.Count, 3, "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(colDst.Count, 4, "TestCollectionCopy - \83R\83\8c\83N\83V\83\87\83\93\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Sub TestCollectionExist()\r
+       Dim col\r
+       \r
+       Set col = New Collection\r
+       \r
+       Call col.Add("foo")\r
+       Call col.Add("bar")\r
+       Call col.Add("boo")\r
+       \r
+       Call AssertEqual(col.Exist("bar"), True, "TestCollectionExist - \91\8dÝ\94»\92è\82ª\8aÔ\88á\82¦\82Ä\82¢\82é(True)\81B")\r
+       Call AssertEqual(col.Exist("hoge"), False, "TestCollectionExist - \91\8dÝ\94»\92è\82ª\8aÔ\88á\82¦\82Ä\82¢\82é(False)\81B")\r
+End Sub\r
+\r
+Sub TestCollectionFindItem()\r
+       Dim col\r
+       \r
+       Set col = New Collection\r
+       \r
+       Call col.Add("foo")\r
+       Call col.Add("bar")\r
+       Call col.Add("boo")\r
+       \r
+       Call AssertEqual(col.FindItem("bar"), 1, "TestCollectionFindItem - \97v\91f\82Ì\8c\9f\8dõ\8c\8b\89Ê\82ª\88Ù\82È\82é(1)\81B")\r
+       Call AssertEqual(col.FindItem("hoge"), -1, "TestCollectionFindItem - \97v\91f\82Ì\8c\9f\8dõ\8c\8b\89Ê\82ª\88Ù\82È\82é(-1)\81B")\r
+End Sub\r
+\r
+Sub TestCollectionIsEqual()\r
+       Dim col1, col2\r
+       \r
+       Set col1 = New Collection\r
+       \r
+       Call col1.Add("foo")\r
+       Call col1.Add("bar")\r
+       Call col1.Add("boo")\r
+       \r
+       Set col2 = New Collection\r
+       \r
+       Call col2.Add("foo")\r
+       Call col2.Add("bar")\r
+       Call col2.Add("boo")\r
+       \r
+       Call AssertEqual(col1.IsEqual(col2), True, "TestCollectionIsEqual - \93\99\89¿\94»\92è\82ª\88Ù\82È\82é\81B(True)")\r
+       \r
+       Call col2.Add("hoge")\r
+       \r
+       Call AssertEqual(col1.IsEqual(col2), False, "TestCollectionIsEqual - \93\99\89¿\94»\92è\82ª\88Ù\82È\82é\81B(False)")\r
+End Sub\r
+\r
+Public Sub TestDictionaryClassInitialize()\r
+       Dim dic\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       Call AssertEqual(dic.Count, 0, "TestDictionaryInitialize - \83f\83B\83N\83V\83\87\83i\83\8a\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Public Sub TestDictionaryItem()\r
+       Dim dic\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       Call AssertEqual(dic.Count, 3, "TestDictionaryItem - \83f\83B\83N\83V\83\87\83i\83\8a\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(dic.Item("foo"), "\82Ó\81[", "TestDictionaryItem - \97v\91f(foo)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(dic.Item("bar"), "\82Î\81[", "TestDictionaryItem - \97v\91f(bar)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(dic.Item("boo"), "\82Ô\81[", "TestDictionaryItem - \97v\91f(boo)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(dic.Item("hoge"), Empty, "TestDictionaryItem - \91\8dÝ\82µ\82È\82¢\97v\91f\82Ì\92l\82ªEmpty\82Å\82Í\82È\82¢\81B")\r
+End Sub\r
+\r
+Public Sub TestDictionaryRemove()\r
+       Dim dic\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       Call AssertEqual(dic.Remove("bar"), "\82Î\81[", "TestDictionaryRemove - \8dí\8f\9c\82µ\82½\97v\91f\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(dic.Count, 2, "TestDictionaryRemove - \83f\83B\83N\83V\83\87\83i\83\8a\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(dic.Item("foo"), "\82Ó\81[", "TestDictionaryItem - \97v\91f(foo)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(dic.Item("boo"), "\82Ô\81[", "TestDictionaryItem - \97v\91f(boo)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Public Sub TestDictionaryItems()\r
+       Dim dic, varItem, intIndex\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       For Each varItem In dic.Items\r
+               Call AssertEqual(True, False, "TestDictionaryItems - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+       Next\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       intIndex = 0\r
+       \r
+       For Each varItem In dic.Items\r
+               If intIndex = 0 Then\r
+                       Call AssertEqual(varItem.Key, "foo", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(0)")\r
+                       Call AssertEqual(varItem.Value, "\82Ó\81[", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(0)")\r
+               ElseIf intIndex = 1 Then\r
+                       Call AssertEqual(varItem.Key, "bar", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(1)")\r
+                       Call AssertEqual(varItem.Value, "\82Î\81[", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(1)")\r
+               ElseIf intIndex = 2 Then\r
+                       Call AssertEqual(varItem.Key, "boo", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(2)")\r
+                       Call AssertEqual(varItem.Value, "\82Ô\81[", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(2)")\r
+               Else\r
+                       Call AssertEqual(True, False, "TestDictionaryItems - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+               End If\r
+               \r
+               intIndex = intIndex + 1\r
+       Next\r
+End Sub\r
+\r
+Public Sub TestDictionaryKeys()\r
+       Dim dic, varKey, intIndex\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       For Each varKey In dic.Keys\r
+               Call AssertEqual(True, False, "TestDictionaryKeys - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+       Next\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       intIndex = 0\r
+       \r
+       For Each varKey In dic.Keys\r
+               If intIndex = 0 Then\r
+                       Call AssertEqual(varKey, "foo", "TestDictionaryKeys - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(0)")\r
+               ElseIf intIndex = 1 Then\r
+                       Call AssertEqual(varKey, "bar", "TestDictionaryKeys - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(1)")\r
+               ElseIf intIndex = 2 Then\r
+                       Call AssertEqual(varKey, "boo", "TestDictionaryKeys - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(2)")\r
+               Else\r
+                       Call AssertEqual(True, False, "TestDictionaryKeys - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+               End If\r
+               \r
+               intIndex = intIndex + 1\r
+       Next\r
+End Sub\r
+\r
+Public Sub TestDictionaryValues()\r
+       Dim dic, varValue, intIndex\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       For Each varValue In dic.Values\r
+               Call AssertEqual(True, False, "TestDictionaryValues - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+       Next\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       intIndex = 0\r
+       \r
+       For Each varValue In dic.Values\r
+               If intIndex = 0 Then\r
+                       Call AssertEqual(varValue, "\82Ó\81[", "TestDictionaryValues - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(0)")\r
+               ElseIf intIndex = 1 Then\r
+                       Call AssertEqual(varValue, "\82Î\81[", "TestDictionaryValues - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(1)")\r
+               ElseIf intIndex = 2 Then\r
+                       Call AssertEqual(varValue, "\82Ô\81[", "TestDictionaryValues - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(2)")\r
+               Else\r
+                       Call AssertEqual(True, False, "TestDictionaryValues - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+               End If\r
+               \r
+               intIndex = intIndex + 1\r
+       Next\r
+End Sub\r
+\r
+Public Sub TestDictionarySort()\r
+       Dim dic, varItem, intIndex\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       Call dic.Sort(New PrimitiveKeyComparator)\r
+       \r
+       intIndex = 0\r
+       \r
+       For Each varItem In dic.Items\r
+               If intIndex = 0 Then\r
+                       Call AssertEqual(varItem.Key, "bar", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(0)")\r
+                       Call AssertEqual(varItem.Value, "\82Î\81[", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(0)")\r
+               ElseIf intIndex = 1 Then\r
+                       Call AssertEqual(varItem.Key, "boo", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(1)")\r
+                       Call AssertEqual(varItem.Value, "\82Ô\81[", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(1)")\r
+               ElseIf intIndex = 2 Then\r
+                       Call AssertEqual(varItem.Key, "foo", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\83L\81[\82ª\88Ù\82È\82é\81B(2)")\r
+                       Call AssertEqual(varItem.Value, "\82Ó\81[", "TestDictionaryItems - \97ñ\8b\93\82³\82ê\82½\97v\91f\82Ì\92l\82ª\88Ù\82È\82é\81B(2)")\r
+               Else\r
+                       Call AssertEqual(True, False, "TestDictionaryItems - \97ñ\8b\93\94Í\88Í\82ð\92´\82¦\82½\81B")\r
+               End If\r
+               \r
+               intIndex = intIndex + 1\r
+       Next\r
+End Sub\r
+\r
+Public Sub TestDictionaryCopy()\r
+       Dim dic, dic2\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       Set dic2 = dic.Copy()\r
+       \r
+       Call AssertEqual(dic.Count, 3, "TestDictionaryItem - \83f\83B\83N\83V\83\87\83i\83\8a\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(dic.Item("foo"), "\82Ó\81[", "TestDictionaryItem - \97v\91f(foo)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(dic.Item("bar"), "\82Î\81[", "TestDictionaryItem - \97v\91f(bar)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(dic.Item("boo"), "\82Ô\81[", "TestDictionaryItem - \97v\91f(boo)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(dic2.Count, 3, "TestDictionaryItem - \83f\83B\83N\83V\83\87\83i\83\8a\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       \r
+       Call AssertEqual(dic2.Item("foo"), "\82Ó\81[", "TestDictionaryItem - \97v\91f(foo)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(dic2.Item("bar"), "\82Î\81[", "TestDictionaryItem - \97v\91f(bar)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(dic2.Item("boo"), "\82Ô\81[", "TestDictionaryItem - \97v\91f(boo)\82Ì\92l\82ª\88Ù\82È\82é\81B")\r
+       \r
+       dic2.Item("hoge") = "\82Ù\82°"\r
+       \r
+       Call AssertEqual(dic.Count, 3, "TestDictionaryItem - \83f\83B\83N\83V\83\87\83i\83\8a\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+       Call AssertEqual(dic2.Count, 4, "TestDictionaryItem - \83f\83B\83N\83V\83\87\83i\83\8a\82Ì\97v\91f\90\94\82ª\88Ù\82È\82é\81B")\r
+End Sub\r
+\r
+Public Sub TestDictionaryExistKey()\r
+       Dim dic\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       Call AssertEqual(dic.ExistKey("foo"), True, "TestDictionaryExistKey - \91\8dÝ\94»\92è\82ª\88Ù\82È\82é\81B(True)")\r
+       Call AssertEqual(dic.ExistKey("hoge"), False, "TestDictionaryExistKey - \91\8dÝ\94»\92è\82ª\88Ù\82È\82é\81B(False)")\r
+End Sub\r
+\r
+Public Sub TestDictionaryExistValue()\r
+       Dim dic\r
+       \r
+       Set dic = New Dictionary\r
+       \r
+       dic.Item("foo") = "\82Ó\81["\r
+       dic.Item("bar") = "\82Î\81["\r
+       dic.Item("boo") = "\82Ô\81["\r
+       \r
+       Call AssertEqual(dic.ExistValue("\82Ó\81["), True, "TestDictionaryExistValue - \91\8dÝ\94»\92è\82ª\88Ù\82È\82é\81B(True)")\r
+       Call AssertEqual(dic.ExistValue("foo"), False, "TestDictionaryExistValue - \91\8dÝ\94»\92è\82ª\88Ù\82È\82é\81B(False)")\r
+End Sub\r
+\r
+Public Sub TestDictionaryIsEqual()\r
+       Dim dic1, dic2\r
+       \r
+       Set dic1 = New Dictionary\r
+       \r
+       dic1.Item("foo") = "\82Ó\81["\r
+       dic1.Item("bar") = "\82Î\81["\r
+       dic1.Item("boo") = "\82Ô\81["\r
+       \r
+       Set dic2 = New Dictionary\r
+       \r
+       dic2.Item("foo") = "\82Ó\81["\r
+       dic2.Item("bar") = "\82Î\81["\r
+       dic2.Item("boo") = "\82Ô\81["\r
+       \r
+       Call AssertEqual(dic1.IsEqual(dic2), True, "TestDictionaryIsEqual - \93\99\89¿\94»\92è\82ª\88Ù\82È\82é\81B(True)")\r
+       \r
+       dic2.Item("boo") = "\82Ô\82£"\r
+       \r
+       Call AssertEqual(dic1.IsEqual(dic2), False, "TestDictionaryIsEqual - \93\99\89¿\94»\92è\82ª\88Ù\82È\82é\81B(False)")\r
+End Sub\r
+\r
+Sub AllTest()\r
+       Call TestAddArray()\r
+       Call TestRemoveArray()\r
+       Call TestCopyArray()\r
+       Call TestSortArray()\r
+       \r
+       Call TestCollectionClassInitialize()\r
+       Call TestCollectionAdd()\r
+       Call TestCollectionRemove()\r
+       Call TestCollectionItems()\r
+       Call TestCollectionSort()\r
+       Call TestCollectionCopy()\r
+       Call TestCollectionExist()\r
+       Call TestCollectionFindItem()\r
+       Call TestCollectionIsEqual()\r
+       \r
+       Call TestDictionaryClassInitialize()\r
+       Call TestDictionaryItem()\r
+       Call TestDictionaryRemove()\r
+       Call TestDictionaryItems()\r
+       Call TestDictionaryKeys()\r
+       Call TestDictionaryValues()\r
+       Call TestDictionarySort()\r
+       Call TestDictionaryCopy()\r
+       Call TestDictionaryExistKey()\r
+       Call TestDictionaryExistValue()\r
+       Call TestDictionaryIsEqual()\r
+       \r
+       MsgBox "\83e\83X\83g\90¬\8c÷"\r
+End Sub\r
+\r
+Call AllTest()\r