# Kandataアプリケーションの作り方

設計と開発の仕方
Kandataサーバの立ち上げ方
デバッグモードの使い方

## 設計と開発の仕方

サンプルの会議室予約システムを使って説明します。
- データ構造の設計
  サーバ側のデータ構造、クライアント側の大雑把な画面設計、 そしてお互いを結ぶインターフェースを考えます。
  会議室の情報を持つクラス Roomと 予約のクラス `Reservation` です。 これらのクラスの登録、削除、一覧取得等を作成することになります。 この２つのクラスはサーバとクライアントの両方で扱うため、 `roomreservation.common` のパッケージにします。 また、このオブジェクト自体をサーバ・クライアント間でやり取りするので `Serializable`インターフェースにしておきます。
  それ以外のクラスは、クライアント側は`roomreservation.client` に、 サーバ側は`roomreservation.server` のパッケージとします。
- サーバ・クライアント間のインターフェースを設計
  会議室予約システムの場合：
  クライアントが必要な機能は、以下の４つです。
  - 部屋の一覧取得():Roomのリスト
  - 最新の予約状況の一覧取得(日付):Reservationのリスト
  - 予約する(:Reservation):boolean
  - 予約をキャンセルする(:Reservatoin):void
  これを元にコマンド名、引数、戻り値を決定します。
  - 部屋の一覧取得():Roomのリスト

    コマンド | "getRoomList"
    引数 | なし
    戻り値 | Roomのリスト
    備考 | 登録順にソート

  - 最新の予約状況の一覧取得(日付):Reservationのリスト

    コマンド | "getReservatoinList"
    引数 | date:String // "20030731"の形式
    戻り値 | Reservationのリスト
    備考 | 会議室、開始時間の順にソート

  - 予約する(:Reservation):boolean

    コマンド | "registReservation"
    引数 | :Reservation // 予約の申請内容
    戻り値 | boolean // 予約できたか？
    備考 | 他の予約と重なっていないかどうかチェックする

  - 予約をキャンセルする(:Reservatoin):void

    コマンド | "cancelReservation"
    引数 | :Reservation // 予約の申請内容
    戻り値 | なし
    備考 | 登録者しかキャンセルできない。クライアント側でチェック

  ここまで決まれば、クライアントとサーバを別々に開発を進めることができます。
- サーバ側の開発
  サーバ側は、２つのクラスから成っています。 KandataServerインターフェースを実装したRoomReservationServerと、 アプリケーションロジックのRoomReservationです。
  RoomReservationServerは、init()でアプリケーションロジックを生成し、 アクションを登録します。アクションは引数を取得し、アプリケーションロジックを 呼び出しています。
  RoomReservationは、この会議室予約システムの実際の処理を行っているクラスです。 部屋の一覧取得、最新の予約状況の一覧取得、予約、予約キャンセルを実装しています。
- クライアント側の開発
  クライアント側は、Clientインターフェースを実装したクラスを作ります。 そして、そのクラスのinit()メソッドから、クライアントGUIを起動させます。 そのとき、Connectorを引数に渡します。 通常の処理は普通のGUIの作り方と同じです。 サーバを呼ぶときは、connectorのinvoke()メソッドにあらかじめ決めておいた、 コマンド、引数を渡し、結果をキャストして受け取ります。

  ## Kandataサーバの立ち上げ方

  サーバ側に以下のファイルが必要です。
- kandata-roomreservation/WEB-INF/kandata.properties
  アプリケーション名、サーバのリソースのパス、クライアントのクラスのパス等を設定します。

      # kandata.properties
      #
      application.name=roomreservation
      application.serverclassname=roomreservation.server.RoomReservationServer
      application.serverresourcepath=server_resources
      application.cliententryclassname=roomreservation.client.RoomReservationClient
      application.clientclasspath=classes
      application.clientresourcepath=client_resources

- kandata-roomreservation/WEB-INF/web.xml
  Tomcatを起動するために必要ですが、特に変更する必要はありません。
- kandata-roomreservation/WEB-INF/classes/
  このディレクトリ以下にKandata、および作成したアプリケーションのクラスファイルを配置します。 kandata.propertiesに記述したパスと一致している必要があります。
- kandata-roomreservation/WEB-INF/client_resources/
  このディレクトリにクライアントで使用するリソース（画像ファイルなど）を配置します。 kandata.propertiesに記述したパスと一致している必要があります。
- kandata-roomreservation/WEB-INF/server_resources/
  このディレクトリにサーバで使用するリソース（アプリケーションごとの設定ファイルなど）を配置します。 kandata.propertiesに記述したパスと一致している必要があります。 サーバは必要ならばファイルを出力することもできます。
- kandata-home/
  ユーザがアプリケーションを登録するための画面を用意します。 このディレクトリを参考にしてください。

  ## デバッグモードの使い方

  本来はクライアントとサーバは別プロセスなのですが、同一プロセスで実行します。 JBuilder,Eclipseなどのデバッグ機能（ブレークポイントやウォッチなど）が利用できるため、 デバッグが容易になります。
- Tomcatが起動している場合、Tomcatを停止します。
  Tomcatは必要ありません。
- デバッグモードで起動します。(kandata-helloの場合)
  java -cp kandata_client.jar kandata.DebugConnector hello.server.HelloServer
  Antが使える人は以下で起動できます。
  `ant -f hello-build.xml debug`

  戻る