[Ngms-svn] SVN-Commit: [38] [NMTree] commit first uncomplete codes.

アーカイブの一覧に戻る

svnno****@sourc***** svnno****@sourc*****
2009年 11月 16日 (月) 23:06:17 JST


Revision: 38
          http://sourceforge.jp/projects/ngms/svn/view?view=rev&revision=38
Author:   osiire
Date:     2009-11-16 23:06:17 +0900 (Mon, 16 Nov 2009)

Log Message:
-----------
[NMTree] commit first uncomplete codes.

Modified Paths:
--------------
    trunk/source/NMTree/.classpath
    trunk/source/NMTree/build.xml

Added Paths:
-----------
    trunk/source/NMTree/src/info/ngms/nmtree/AbstractDescriptionElement.scala
    trunk/source/NMTree/src/info/ngms/nmtree/NMDescription.scala
    trunk/source/NMTree/src/info/ngms/nmtree/NMElementAttribute.scala
    trunk/source/NMTree/src/info/ngms/nmtree/NMElementPermission.scala
    trunk/source/NMTree/src/info/ngms/nmtree/NMFileSystemTree.scala
    trunk/source/NMTree/src/info/ngms/nmtree/NMPath.scala
    trunk/source/NMTree/src/info/ngms/nmtree/NMTree.scala
    trunk/source/NMTree/src/info/ngms/nmtree/NMTreeElements.scala
    trunk/source/NMTree/src/info/ngms/nmtree/NMTreeOperations.scala
    trunk/source/NMTree/src/info/ngms/nmtree/test/
    trunk/source/NMTree/src/info/ngms/nmtree/test/NMTreeTestSuite.scala

Modified: trunk/source/NMTree/.classpath
===================================================================
--- trunk/source/NMTree/.classpath	2009-11-05 09:05:16 UTC (rev 37)
+++ trunk/source/NMTree/.classpath	2009-11-16 14:06:17 UTC (rev 38)
@@ -1,7 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="ch.epfl.lamp.sdt.launching.SCALA_CONTAINER"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
+    <classpathentry kind="src" path="src"/>
+    <classpathentry kind="con" path="ch.epfl.lamp.sdt.launching.SCALA_CONTAINER"/>
+    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+    <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+    <classpathentry kind="lib" path="c:/Users/itp/svns/ngms/trunk/lib/scalatest-1.0.jar"/>
+    <classpathentry kind="output" path="bin"/>
 </classpath>

Modified: trunk/source/NMTree/build.xml
===================================================================
--- trunk/source/NMTree/build.xml	2009-11-05 09:05:16 UTC (rev 37)
+++ trunk/source/NMTree/build.xml	2009-11-16 14:06:17 UTC (rev 38)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <!-- WARNING: Eclipse auto-generated file.
               Any modifications will be overwritten.
               To include a user specific buildfile here, simply create one in the same
@@ -6,21 +6,32 @@
               as the first entry and export the buildfile again. -->
 <project basedir="." default="build" name="NMTree">
     <property environment="env"/>
-    <property name="ECLIPSE_HOME" value="../../../../../../../Applications/eclipse"/>
+    <property name="ECLIPSE_HOME" value="../../../../../../../work/bin/eclipse"/>
     <property name="NMNetWalker.location" value="../NMNetWalker"/>
     <property name="NMShell.location" value="../NMShell"/>
+    <property name="junit.output.dir" value="junit"/>
     <property name="debuglevel" value="source,lines,vars"/>
-    <property name="target" value="1.5"/>
-    <property name="source" value="1.5"/>
-    <path id="Scala Library version 2.7.7.final.libraryclasspath">
-        <pathelement location="${ECLIPSE_HOME}/configuration/org.eclipse.osgi/bundles/197/1/.cp/lib/scala-library.jar"/>
-        <pathelement location="${ECLIPSE_HOME}/configuration/org.eclipse.osgi/bundles/197/1/.cp/lib/scala-dbc.jar"/>
-        <pathelement location="${ECLIPSE_HOME}/configuration/org.eclipse.osgi/bundles/197/1/.cp/lib/scala-swing.jar"/>
+    <property name="target" value="1.6"/>
+    <property name="source" value="1.6"/>
+    <path id="Scala Library version 2.7.6.final.libraryclasspath">
+        <pathelement location="${ECLIPSE_HOME}/configuration/org.eclipse.osgi/bundles/199/1/.cp/lib/scala-library.jar"/>
+        <pathelement location="${ECLIPSE_HOME}/configuration/org.eclipse.osgi/bundles/199/1/.cp/lib/scala-dbc.jar"/>
+        <pathelement location="${ECLIPSE_HOME}/configuration/org.eclipse.osgi/bundles/199/1/.cp/lib/scala-swing.jar"/>
     </path>
+    <path id="JUnit 4.libraryclasspath">
+        <pathelement location="${ECLIPSE_HOME}/plugins/org.junit4_4.5.0.v20090824/junit.jar"/>
+        <pathelement location="${ECLIPSE_HOME}/plugins/org.hamcrest.core_1.1.0.v20090501071000.jar"/>
+    </path>
     <path id="NMTree.classpath">
         <pathelement location="bin"/>
-        <path refid="Scala Library version 2.7.7.final.libraryclasspath"/>
+        <path refid="Scala Library version 2.7.6.final.libraryclasspath"/>
+        <path refid="JUnit 4.libraryclasspath"/>
+        <pathelement location="../../lib/scalatest-1.0.jar"/>
     </path>
+    <path id="run.NMTreeTest.classpath">
+        <path refid="Scala Library version 2.7.6.final.libraryclasspath"/>
+        <path refid="NMTree.classpath"/>
+    </path>
     <target name="init">
         <mkdir dir="bin"/>
         <copy includeemptydirs="false" todir="bin">
@@ -70,4 +81,20 @@
         <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
         <antcall target="build"/>
     </target>
+    <target name="NMTreeTest">
+        <mkdir dir="${junit.output.dir}"/>
+        <junit fork="yes" printsummary="withOutAndErr">
+            <formatter type="xml"/>
+            <test name="info.ngms.nmtree.test.NMTreeTestSuite" todir="${junit.output.dir}"/>
+            <classpath refid="run.NMTreeTest.classpath"/>
+        </junit>
+    </target>
+    <target name="junitreport">
+        <junitreport todir="${junit.output.dir}">
+            <fileset dir="${junit.output.dir}">
+                <include name="TEST-*.xml"/>
+            </fileset>
+            <report format="frames" todir="${junit.output.dir}"/>
+        </junitreport>
+    </target>
 </project>

Added: trunk/source/NMTree/src/info/ngms/nmtree/AbstractDescriptionElement.scala
===================================================================
--- trunk/source/NMTree/src/info/ngms/nmtree/AbstractDescriptionElement.scala	                        (rev 0)
+++ trunk/source/NMTree/src/info/ngms/nmtree/AbstractDescriptionElement.scala	2009-11-16 14:06:17 UTC (rev 38)
@@ -0,0 +1,70 @@
+/*
+ *  Next Generation Management System Project
+ *  Copyright(c) 2009, NGMS Project Team All Rights Reserved.
+ */
+package info.ngms.nmtree
+
+import scala.collection.mutable.LinkedHashMap
+
+trait AbstractDescriptionElement {
+
+    val header : LinkedHashMap[String, NMDescription]
+    val body : List[String]
+
+    def find(tag : String) : Option[NMDescription] = {
+        val nmlz_tag = DescriptionElement.normalizeTag(tag)
+        try {
+            Some((header(nmlz_tag)))
+        } catch {
+        case _ =>
+            None
+        }
+    }
+
+    def findVal(tag : String) : Option[String] = {
+        val nmlz_tag = DescriptionElement.normalizeTag(tag)
+        try {
+            Some((header(nmlz_tag)).value)
+        } catch {
+        case _ =>
+            None
+        }
+    }
+
+    def findWith[A](tag : String) (default : A) (f : NMDescription => A) : A = {
+        find(tag) match {
+        case Some(desc) =>
+            f(desc)
+        case None =>
+            default
+        }
+    }
+
+    def update(tag : String, value : String) : Unit = {
+        val desc = header(DescriptionElement.normalizeTag(tag))
+        desc.value = value
+     }
+}
+
+object DescriptionElement {
+    def delimiter = ":"
+
+    def unapply(str : String) : Option[((String), (String))] = {
+        val parts = str split delimiter
+        if(parts.length == 1)
+            Some(parts(0).trim, "")
+        else if(parts.length == 2)
+            Some(parts(0).trim, parts(1))
+        else
+            None
+    }
+
+    def normalizeTag(tag : String) : String =
+        tag.toLowerCase // tags in Map should be lower case.
+
+    def normalizeValue(tag : String, value : String) : NMDescription =
+        new NMDescription(tag, value, "")
+
+    def normalize(tag : String, value : String) =
+        normalizeTag(tag) -> normalizeValue(tag, value)
+}

Added: trunk/source/NMTree/src/info/ngms/nmtree/NMDescription.scala
===================================================================
--- trunk/source/NMTree/src/info/ngms/nmtree/NMDescription.scala	                        (rev 0)
+++ trunk/source/NMTree/src/info/ngms/nmtree/NMDescription.scala	2009-11-16 14:06:17 UTC (rev 38)
@@ -0,0 +1,21 @@
+/*
+ *  Next Generation Management System Project
+ *  Copyright(c) 2009, NGMS Project Team All Rights Reserved.
+ */
+package info.ngms.nmtree
+
+object NMDescription {
+    def commentDelimiter = "#"
+
+    def make(tag : String, value : String) = {
+        val parts = value split commentDelimiter
+        if (parts.length == 1)
+            new NMDescription(tag, parts(0).trim, "")
+        else
+            new NMDescription(tag, parts(0).trim, parts(1).trim)
+    }
+}
+
+class NMDescription ( val tag : String, var value : String, var comment : String) {
+    import NMDescription.commentDelimiter
+}

Added: trunk/source/NMTree/src/info/ngms/nmtree/NMElementAttribute.scala
===================================================================
--- trunk/source/NMTree/src/info/ngms/nmtree/NMElementAttribute.scala	                        (rev 0)
+++ trunk/source/NMTree/src/info/ngms/nmtree/NMElementAttribute.scala	2009-11-16 14:06:17 UTC (rev 38)
@@ -0,0 +1,28 @@
+/*
+ *  Next Generation Management System Project
+ *  Copyright(c) 2009, NGMS Project Team All Rights Reserved.
+ */
+package info.ngms.nmtree
+
+/**
+ * NGTreeのエレメントが持つ属性を定義する抽象クラス
+ *
+ * @version $Id$
+ * @author ogasa****@itpl*****
+ */
+trait NMElementAttribute {
+    import java.util.Date
+
+    /**
+     * パスが示すエレメントのサイズ(byte)を返す。
+     * @return パスが示すエレメントのサイズ。
+     */
+    val size : Long
+
+    /**
+     * パスが示すエレメントが最後に更新された日時を返す
+     * @return パスが示すエレメントが最後に更新された日時。
+     */
+    val lastUpdateDate : Date
+
+}

Added: trunk/source/NMTree/src/info/ngms/nmtree/NMElementPermission.scala
===================================================================
--- trunk/source/NMTree/src/info/ngms/nmtree/NMElementPermission.scala	                        (rev 0)
+++ trunk/source/NMTree/src/info/ngms/nmtree/NMElementPermission.scala	2009-11-16 14:06:17 UTC (rev 38)
@@ -0,0 +1,14 @@
+/*
+ *  Next Generation Management System Project
+ *  Copyright(c) 2009, NGMS Project Team All Rights Reserved.
+ */
+package info.ngms.nmtree
+
+/**
+ * NGTreeのエレメントが持つアクセス許可を表現する抽象クラス
+ *
+ * @version $Id$
+ * @author ogasa****@itpl*****
+ */
+abstract class NMElementPermission {
+}

Added: trunk/source/NMTree/src/info/ngms/nmtree/NMFileSystemTree.scala
===================================================================
--- trunk/source/NMTree/src/info/ngms/nmtree/NMFileSystemTree.scala	                        (rev 0)
+++ trunk/source/NMTree/src/info/ngms/nmtree/NMFileSystemTree.scala	2009-11-16 14:06:17 UTC (rev 38)
@@ -0,0 +1,113 @@
+/*
+ *  Next Generation Management System Project
+ *  Copyright(c) 2009, NGMS Project Team All Rights Reserved.
+ */
+package info.ngms.nmtree
+
+import java.io.File
+import java.io.InputStream
+import java.io.OutputStream
+import java.io.FileInputStream
+import java.io.FileOutputStream
+import java.util.Date
+import scala.collection.mutable.LinkedHashMap
+
+
+class NMFileSystemTree( realRoot : String, mnt : NMPath ) {
+    var mountPoint : NMPath = mnt
+
+    implicit def ofRealPath( path : NMPath ) : String = {
+        NMPath.diff( mnt.canonical, path.canonical )
+    }
+
+    implicit def toNMPath( path : String ) : NMPath = {
+        new NMPath( path )
+    }
+
+    trait Identifier {
+        val id = 0L // 未実装
+    }
+
+    def createStream( path : NMPath ) : NMTree.TStreamElement = {
+        val file = new File( path )
+        new {
+            // 未実装
+            val id : Long = 0L
+            val input : InputStream = new FileInputStream( file )
+            val output : OutputStream = new FileOutputStream( file )
+        }
+    }
+
+    def createDescription( path : NMPath ) : NMTree.TDescriptionElement = {
+        // 未実装
+        val h = new LinkedHashMap[String, NMDescription]()
+        val b = Nil
+        new AbstractDescriptionElement {
+            val id : Long = 0L
+            val header = h
+            val body = b
+            def localCommit() : Unit = { }
+        }
+    }
+
+    def createTable( path : NMPath ) : NMTree.TTableElement = {
+      // 未実装
+      new {
+        val id : Long = 0L
+        val lines : Array[Array[String]] = Array(Array())
+        def localCommit() : Unit = {}
+      }
+    }
+
+    object PathOperations {
+        /**
+         * 自身のパスが実際に存在するかどうかを判定する。
+         * @return 自身のパスが実際に存在すればtrue, そうでなければfalseが返される。
+         */
+        def exists( path : NMPath ) : Boolean = {
+            (new File(path)).exists()
+        }
+
+        /*
+         * 自身のパスがノード(ファイルシステムの場合はディレクトリに対応)かどうかを判定する。
+         * @return 自身のパスがノードならtrue, そうでなければfalse。
+         */
+        def isNode( path : NMPath ) : Boolean = {
+            (new File(path)).isDirectory()
+        }
+
+        /**
+         * 自身のパスが持つ直下の子供のパスのリストを作成する。
+         * @return 自身のパスが持つ直下の子供のパスのリスト。
+         * 自身のパスに子供がいない場合は空リストになる。
+         */
+        def children( path : NMPath ) : List[NMPath] = {
+            (new File(path)).list().toList.map(toNMPath)
+        }
+
+        /**
+         * パスが示すエレメントが持つ属性を返す。
+         * @return パスが示すエレメントが持つ属性。
+         */
+        def attribute( path : NMPath ) : NMElementAttribute = {
+            var file = new File( path )
+            new NMElementAttribute {
+                val size = 0L
+                val lastUpdateDate = new Date( file.lastModified() )
+            }
+        }
+    }
+
+    object TreeOperations {
+        def move( src : NMPath, dst : NMPath ) : Unit = { }
+
+        def copy( src : NMPath, dst : NMPath, overwrite : Boolean ) : Unit = { }
+
+        def delete( path : NMPath, recursive : Boolean ) : Unit = { }
+
+        def symLink( src : NMPath, dst : NMPath ) : Unit = { }
+    }
+
+    def pathOp : NMTree.TPathOperations = PathOperations
+    def treeOp : NMTree.TTreeOperations = TreeOperations
+}
\ No newline at end of file

Added: trunk/source/NMTree/src/info/ngms/nmtree/NMPath.scala
===================================================================
--- trunk/source/NMTree/src/info/ngms/nmtree/NMPath.scala	                        (rev 0)
+++ trunk/source/NMTree/src/info/ngms/nmtree/NMPath.scala	2009-11-16 14:06:17 UTC (rev 38)
@@ -0,0 +1,121 @@
+/*
+ *  Next Generation Management System Project
+ *  Copyright(c) 2009, NGMS Project Team All Rights Reserved.
+ */
+package info.ngms.nmtree
+
+object NMPath {
+
+    val separator : String = "/"
+
+    def name( path : String ) : String = {
+        /* 未実装 */
+        ""
+    }
+
+    def concat ( path : String, child : String ) : String = {
+        /* 未実装 */
+        ""
+    }
+
+    def parent( path : String ) : String = {
+        /* 未実装 */
+        ""
+    }
+
+    def canonical( path : String ) : String = {
+        /* 未実装 */
+        ""
+    }
+
+    def diff( p1 : String, p2 : String ) : String = {
+        /* 未実装 */
+        ""
+    }
+}
+
+class NMPath ( path : String ) {
+
+    val canonical = NMPath.canonical(path)
+
+    /**
+     * 自身のパスが持つエレメントの名前(ファイルシステムではファイル名かディレクトリ名)を返す。
+     * @return 自身のパスが持つエレメントの名前が返される。
+     */
+    def name : String = NMPath.name(canonical)
+
+    /**
+     * 自身の親のパスを生成する。
+     * @return このインスタンスの親のパスを生成する。このインスタンスがルートパスの場合は、自身が返される。
+     */
+    def parent : NMPath = {
+      new NMPath( NMPath.parent(canonical) )
+    }
+
+    /**
+     * 指定された名前を自身のパスの直下の子供としたパスを返す。
+     * @param child 子供の名前。
+     * @return 自身のパスに子供の名前を加えたパスが返される。
+     */
+    def concat( child : String ) : NMPath = {
+      new NMPath( NMPath.concat( canonical, child ) )
+    }
+
+    /**
+     * 自身のパスが実際に存在するかどうかを判定する。
+     * @return 自身のパスが実際に存在すればtrue, そうでなければfalseが返される。
+     */
+    def exists : Boolean = {
+        NMTree.ImplMap.withImpl(
+                canonical,
+                impl => impl.pathOp.exists( this ) )
+    }
+
+    /**
+     * 自身のパスが持つ直下の子供のパスのリストを作成する。
+     * @return 自身のパスが持つ直下の子供のパスのリストが返される。
+     * 自身のパスに子供がいない場合は空リストが返される。
+     */
+    def children : List[NMPath] =
+        NMTree.ImplMap.withImpl(
+                canonical,
+                impl => impl.pathOp.children( this ) )
+
+    /**
+     * 指定されたパスのインスタンスと自身を比較する。
+     * @param that 比較したいパスインスタンス。
+     * @return 自身のパスと指定されたパスが同じパスを示しているならtrue, それ以外はfalse。
+     */
+    def ==( that : NMPath ) : Boolean =
+        canonical == that.canonical
+
+    /*
+     * パスが示すエレメントが持つ属性を返す。
+     * @return パスが示すエレメントが持つ属性。
+     */
+    def attribute : NMElementAttribute =
+        NMTree.ImplMap.withImpl(
+                canonical,
+                impl => impl.pathOp.attribute( this ) )
+
+
+    /*
+     * パスが示すエレメントが持つアクセス許可を返す。
+     * @return パスが示すエレメントが持つアクセス許可。
+     */
+//    def permisson : NMElementPermission =
+//        NMTree.PermissionMap.find( spath )
+
+
+    def kind : NMTreeElementKind = {
+        Node
+    }
+
+
+    /**
+     * 自身のパスの正規パス名の文字列外部表現を返す。canonicalと同じ。
+     * @return 正規パス名の文字列外部表現。
+     */
+    override def toString : String = canonical
+
+}

Added: trunk/source/NMTree/src/info/ngms/nmtree/NMTree.scala
===================================================================
--- trunk/source/NMTree/src/info/ngms/nmtree/NMTree.scala	                        (rev 0)
+++ trunk/source/NMTree/src/info/ngms/nmtree/NMTree.scala	2009-11-16 14:06:17 UTC (rev 38)
@@ -0,0 +1,201 @@
+/*
+ *  Next Generation Management System Project
+ *  Copyright(c) 2009, NGMS Project Team All Rights Reserved.
+ *  See License file.
+ */
+package info.ngms.nmtree
+
+import java.io.InputStream
+import java.io.OutputStream
+
+
+/**
+ * NGMS用木構造を表現するクラス
+ *
+ * @version $Id$
+ * @author ogasa****@itpl*****
+ */
+object NMTree {
+
+    type TPathOperations = {
+
+        /*
+         * 自身のパスが実際に存在するかどうかを判定する。
+         * @return 自身のパスが実際に存在すればtrue, そうでなければfalse。
+         */
+        def exists( path : NMPath ) : Boolean
+
+        /*
+         * 自身のパスがノード(ファイルシステムの場合はディレクトリに対応)かどうかを判定する。
+         * @return 自身のパスがノードならtrue, そうでなければfalse。
+         */
+        def isNode( path : NMPath ) : Boolean
+
+        /*
+         * 自身のパスが持つ直下の子供のパスのリストを作成する。
+         * @return 自身のパスが持つ直下の子供のパスのリスト。
+         * 自身のパスに子供がいない場合は空リストになる。
+         */
+        def children( path : NMPath ) : List[NMPath]
+
+        /*
+         * パスが示すエレメントが持つ属性を返す。
+         * @return パスが示すエレメントが持つ属性。
+         */
+        def attribute( path : NMPath ) : NMElementAttribute
+
+    }
+
+    type TTreeOperations = {
+        /*
+         * パスの移動を定義する関数。
+         * @param src 移動元のパス。
+         * @param dst 移動先のパス。移動先のパスが移動元のパスの親になる。
+         * @throws AppPermissionException
+         * @throws SourceNotFoundException
+         * @throws DestinationNotFoundException
+         * @throws DestinationAlreadyExistsException
+         */
+        def move( src : NMPath, dst : NMPath ) : Unit
+
+         /*
+          * パスのコピーを定義する関数。
+          * @param src コピー元のパス
+          * @param dst コピー先のパス。コピー先のパスが作成されたコピーの親になる。
+          * @param overwrite trueの場合、コピー先にすでに同じパスが存在しても上書きを行う。
+          * @throws AppPermissionException
+          * @throws SourceNotFoundException
+          * @throws DestinationNotFoundException
+          * @throws DestinationAlreadyExistsException
+          */
+         def copy( src : NMPath, dst : NMPath, overwrite : Boolean ) : Unit
+
+         /*
+          * パスの削除を定義する関数。
+          * @param path 削除したいパス。
+          * @param recursive trueが指定された場合は、指定されたパスの子供を再帰的に辿り、全ての子供を削除する。
+          * @throws AppPermissionException
+          * @throws DestinationNotFoundException
+          */
+         def delete( path : NMPath, recursive : Boolean ) : Unit
+
+         /*
+          * シンボリックリンクを定義する関数。
+          * @param src リンクされる側のパス。
+          * @param dst リンクした結果新しく作成されるパス。
+          * @throws AppPermissionException
+          * @throws DestinationNotFoundException
+          * @throws DestinationAlreadyExistsException
+          */
+         def symLink( src : NMPath, dst : NMPath ) : Unit
+    }
+
+    type TStreamElement = {
+        /*
+         * グローバルに一意な番号。同一ファイルには同一のIDが割り振られ、変化しない。
+         * このIDはパスに依存しない。
+         */
+        val id : Long
+
+        /*
+         * ストリームから読み込みを行うためのハンドラインスタンス。
+         */
+        val input : InputStream
+
+        /*
+         * ストリームへの書き込みを行うためのハンドラインスタンス。
+         */
+        val output : OutputStream
+    }
+
+    type TDescriptionElement = {
+        /*
+         * グローバルに一意な番号。同一ファイルには同一のIDが割り振られ、変化しない。
+         * このIDはパスに依存しない。
+         */
+        val id : Long
+
+        val header : scala.collection.mutable.LinkedHashMap[String, NMDescription]
+        def findVal(tag : String) : Option[String]
+        def findWith[A](tag : String) (default : A) (f : NMDescription => A) : A
+        def update(tag : String, value : String) : Unit
+        def localCommit() : Unit
+    }
+
+    type TTableElement = {
+        /*
+         * グローバルに一意な番号。同一ファイルには同一のIDが割り振られ、変化しない。
+         * このIDはパスに依存しない。
+         */
+        val id : Long
+        val lines : Array[Array[String]]
+        def localCommit() : Unit
+    }
+
+    type NMTreeImplimentation = {
+        def createStream( path : NMPath ) : TStreamElement
+        def createDescription( path : NMPath ) : TDescriptionElement
+        def createTable( path : NMPath ) : TTableElement
+        def pathOp : TPathOperations
+        def treeOp : TTreeOperations
+    }
+
+    object ImplMap {
+        val impls = scala.collection.mutable.Map.empty[String, NMTreeImplimentation]
+        def find( path : String ) : Option[NMTreeImplimentation] = {
+            // 未実装
+            None
+        }
+        def withImpl[T] ( path : String,  f : NMTreeImplimentation => T ) : T = {
+            ImplMap.find(path) match {
+            case None =>
+                throw new PathNotFoundException( path )
+            case Some( impl ) =>
+                f( impl )
+            }
+        }
+    }
+
+    def createStream ( path : NMPath ) : TStreamElement = {
+        ImplMap.withImpl( path.canonical, impl => impl.createStream( path ) )
+    }
+
+    def createDescription ( path : NMPath ) : TDescriptionElement = {
+        ImplMap.withImpl( path.canonical, impl => impl.createDescription( path ) )
+    }
+
+    def createTable ( path : NMPath ) : TTableElement = {
+        ImplMap.withImpl( path.canonical, impl => impl.createTable( path ) )
+    }
+
+    def mount( path : NMPath , impl : NMTreeImplimentation ) : Unit = {
+        // 未実装
+    }
+
+    def isValidOperations( ops : Seq[ NMTreeOperations ] ) : Boolean = {
+        // 未実装
+        true
+    }
+
+    def localCommit( ops : Seq[ NMTreeOperations ] ) : Unit = {
+        // 未実装
+    }
+
+    def globalCommit( root : NMPath ) : Unit = {
+        // 未実装
+    }
+
+    sealed abstract class WalkOrder
+    case object PreOrder
+    case object InOrder
+    case object PostOrder
+
+    sealed abstract class WalkDirection
+    case class DepthFirst( order : WalkOrder ) extends WalkDirection
+    case object BreadthFirst extends WalkDirection
+
+    def traversal[T]( root : NMPath, dir : WalkDirection) (f : Tuple2[T, NMPath] => T) ( init : T ) : T = {
+        // 未実装
+        init
+    }
+}

Added: trunk/source/NMTree/src/info/ngms/nmtree/NMTreeElements.scala
===================================================================
--- trunk/source/NMTree/src/info/ngms/nmtree/NMTreeElements.scala	                        (rev 0)
+++ trunk/source/NMTree/src/info/ngms/nmtree/NMTreeElements.scala	2009-11-16 14:06:17 UTC (rev 38)
@@ -0,0 +1,12 @@
+package info.ngms.nmtree
+
+abstract class NMTreeElementKind
+case object Node extends NMTreeElementKind
+case object Stream extends NMTreeElementKind
+case object Description extends NMTreeElementKind
+case object Table extends NMTreeElementKind
+
+abstract class NMTreeElements
+case class Stream( handler : NMTree.TStreamElement ) extends NMTreeElements
+case class Description( handler : NMTree.TDescriptionElement ) extends NMTreeElements
+case class Table( handler : NMTree.TTableElement ) extends NMTreeElements

Added: trunk/source/NMTree/src/info/ngms/nmtree/NMTreeOperations.scala
===================================================================
--- trunk/source/NMTree/src/info/ngms/nmtree/NMTreeOperations.scala	                        (rev 0)
+++ trunk/source/NMTree/src/info/ngms/nmtree/NMTreeOperations.scala	2009-11-16 14:06:17 UTC (rev 38)
@@ -0,0 +1,67 @@
+/*
+ *  Next Generation Management System Project
+ *  Copyright(c) 2009, NGMS Project Team All Rights Reserved.
+ */
+package info.ngms.nmtree
+
+/**
+ * 木構造の操作が行われた際に発生する例外を表現する抽象クラス。
+ */
+abstract class NMTreeOperationException extends Exception
+
+/**
+ * アプリケーションレベルの権限例外を表現するケースクラス。
+ */
+ case class AppPermissionException( msg : String ) extends NMTreeOperationException
+
+ /**
+  * 指定されたパスが存在しない事を意味する例外。
+  */
+ case class PathNotFoundException( path : String ) extends NMTreeOperationException
+
+ /**
+  * 指定された操作元が存在しない事を意味する例外。
+  */
+ case class SourceNotFoundException( src : NMPath ) extends NMTreeOperationException
+
+ /**
+  * 指定された操作先が存在しない事を意味する例外。
+  */
+ case class DestinationNotFoundException( dst : NMPath ) extends NMTreeOperationException
+
+ /**
+  * 指定された操作先がすでに存在することを意味する例外。
+  */
+ case class DestinationAlreadyExistsException( dst : NMPath ) extends NMTreeOperationException
+
+/**
+  * 木構造の操作を定義する抽象クラス。
+ */
+abstract class NMTreeOperations
+
+/**
+ * パスの移動を定義するケースクラス。
+ * @param src 移動元のパス。
+ * @param dst 移動先のパス。移動先のパスが移動元のパスの親になる。
+ */
+case class Move( src : NMPath, dst : NMPath ) extends NMTreeOperations
+
+/**
+ * パスのコピーを定義するケースクラス。
+ * @param src コピー元のパス
+ * @param dst コピー先のパス。コピー先のパスが作成されたコピーの親になる。
+ */
+case class Copy( src : NMPath, dst : NMPath ) extends NMTreeOperations
+
+/**
+ * パスの削除を定義するケースクラス。
+ * @param path 指定されたパスが削除される。
+ */
+case class Delete( path : NMPath ) extends NMTreeOperations
+
+/**
+ * シンボリックリンクを定義するケースクラス。
+ * @param src リンクされる側のパス。
+ * @param dst リンクした結果新しく作成されるパス。
+ */
+case class SymLink( src : NMPath, dst : NMPath ) extends NMTreeOperations

Added: trunk/source/NMTree/src/info/ngms/nmtree/test/NMTreeTestSuite.scala
===================================================================
--- trunk/source/NMTree/src/info/ngms/nmtree/test/NMTreeTestSuite.scala	                        (rev 0)
+++ trunk/source/NMTree/src/info/ngms/nmtree/test/NMTreeTestSuite.scala	2009-11-16 14:06:17 UTC (rev 38)
@@ -0,0 +1,19 @@
+package info.ngms.nmtree.test
+
+import org.scalatest.junit.AssertionsForJUnit
+import scala.collection.mutable.ListBuffer
+import org.junit.Assert._
+import org.junit.Test
+import org.junit.Before
+
+class NMTreeTestSuite extends AssertionsForJUnit  {
+
+    @Before def initialize() {
+        val root = new NMPath("/")
+        val fs = new NMFileSystemTree( "c:/work", root )
+        NMTree.mount( root, fs )
+    }
+
+    @Test def verifyFun() {
+    }
+}




Ngms-svn メーリングリストの案内
アーカイブの一覧に戻る