# AMM

アカウント管理モジュール～AMM～
ログインID:sakamoto.ryouma@example.com

フィードバックメッセージ
アプリケーションダッシュボード 兼 動的な実装ガイドライン 兼 ソフトウェア仕様書 兼 TODOリスト として記述します。

# アプリケーションダッシュボード

メッセージ
キャッシュされているメッセージはX件です。

# ソフトウェアアーキテクチャ仕様書

## ミドルウェア

画面プログラム、画面間連携は Apache Wicket を使用する。 データベースアクセスは Hibernate を使用する。 IDコンテナの仕組みを設ける場合は Spring を使用する。

## ライセンス記述

本アプリケーションは Apache Software Foundation (http://www.apache.org)によって開発されたソフトウェアを含んでいる事をここに明記します。

## 用語

AMM
  日点ChattyInftyOnlineのサブプロジェクトである 【アカウント管理モジュール】の略称である。
  なお、ドキュメントやモジュールを汎用化して管理するため、便宜上「本アプリケーション」や「App」として記述する場合がある。

## 機能について

別紙「ChattyInftyOnline 会員管理要件定義書」を参照。
記述内容は 1.システム導入の目的と目標／2.システム化の対象領域／3.機能要求(画面ごとの機能と項目の構成)

## セキュリティ要件について

以下のセキュリティ要件に対応する。

- バッファオーバーフロー（Java）
- クロスサイトスクリプティング（Wicket）
- クロスサイトリクエストフォージェリー（Wicket）
- セッション固定化攻撃（LoginPage）
- SQLインジェクション（Hibernate）

以下は、実装者への教育により達成すべき要件となります。

- 公開領域に機密情報が含まれるファイルを配置しないこと

## 非機能について ～キーメカニズム～

### 表示文字列の管理

画面に表示するメッセージはアプリケーションを停止せずに変更できるものとする。 データベースのテーブル（Localestring）を修正し、ダッシュボード画面で「キャッシュクリア」を指示することにより、 変更が適用されるものとする。

## プログラム構成

### ベース (jp.co.y_net.amm.base)

アプリケーションの根幹となるプログラムで構成される。 このパッケージのクラスは、「ページ」レイヤへの依存性を持たない

- アプリケーション全体の挙動を定義するクラス
- 画面の既定クラス
- エラーハンドリングを行うクラス
- ログ出力を行うクラス
- セッション情報を管理するクラス
- アプリケーション設定値を保持するプロパティファイル

### コモン～共通～ (jp.co.y_net.amm.common)

共通実装の集約を目的としたパッケージ。『車輪の再発明』を防ぐ。 実装量を軽減し、生産性の向上を図る。 同一原因の不具合対策が発生したときに、修正漏れを防ぐ。
このパッケージのクラスは、他レイヤへの依存性を持たない（他のプロジェクトへも容易に移植できる）

### ページ (jp.co.y_net.amm.page)

各画面のサービスを実現する。主に、JavaプログラムとHTMLファイルで構成される。 リソースとしてcssや画像ファイルも配置される。 このパッケージ配下のHTMLのみでデザイン開発が可能

# 実装ガイドライン

## 目的

本アプリケーションの開発担当者における合意事項の集約とする。 このドキュメントに記載されている範囲内のことにおいては設計プロセスを省略できる。

## 開発環境構築手順

統合開発環境Eclipseをセットアップし、SVNから本プロジェクトをインポートし、動的プロジェクトとして実行する。

## 実装標準フロー

1. HTMLファイルを作成する
   本HTMLをコピーし、画面定義書やデザイン定義書を参考にする。
2. 各画面コンポーネントに wicket:id を付与する
3. 対応するJavaクラスを作成する。

### 命名規約

以下は、慣例に従い命名することを原則とし、厳格な規約は設定しない。 効率的な命名が決定できないときに参照されることを想定する。

たとえば、すでに標準化してデジタル化されている文字列がすでに存在するならば、 そのままコピー＆ペーストすればよい。 そのまま使用した方が、効率化と共通化の観点からメリットが高いと考える。

HTML名
  パスカル形式＋"Page.html" ⇒ 例：UserLoginPage.html
WicketID
  キャメル形式で種類と役割を示す。 ⇒ 例：labelUserName
プロパティファイルのkey
  特筆なし

その他

別途対応表などを参照しなくても理解可能な命名を行うこと。

    × ProgramName = "001";
    ○ ProgramName = "UserLogin"

## 出力コンポーネントのサンプル

※ ソースコードも合わせて参照のこと。 動的な文字列の表示【今日の日付を表示する部分】
静的な文字列の表示（プロパティファイルから文字列を取得）【メッセージ】
静的な文字列はアプリケーションを再起動せずに変更ができるようにするため、AppLabelクラスを利用する。

## 入力コンポーネントのサンプル

## 設定値の取得

プロパティファイルから値を取得するためには、共通部品を使用する。詳細は本ページのJavaプログラムを参照。
実装サンプル
プロパティファイルからの値取得:メッセージ１
サーバーを再起動せずに更新されたプロパティファイルからの取得:メッセージ２

## エラーハンドリングのサンプル

TOOD

## ログ出力のサンプル

TODO

# TODOリスト

    ・アクセス管理
    WicketのRoleを使う作戦は中止とする。３分岐以上でスマートで無い。

    http://d.hatena.ne.jp/n314/20110531/1306809192
     ページクラスの表示権限がない場合はそれに対するリンクも表示しない

    ・localestring管理のアーキテクチャ作成
    　開発フロー
    　　デバッグ
    　　　・登録漏れを確認する
    　　　・更新するためのSQLを生成する
    　多言語データ追加フロー

    ・エラーメッセージ管理のアーキテクチャ作成
    ・DB操作のアーキテクチャ作成
    ・Label#setEscapeModelString(false) を使いたいときの考慮

    ・TopPageは開発モード以外のとき表示されてはいけない。

for