java-itamae クラス設計

# CLI 引数の解析

CLI 引数の設定には [LongOpt](https://www.gnu.org/software/gnuprologjava/api/gnu/getopt/LongOpt.html) を使用し、 CLI 引数の解析には [Getopt](https://www.gnu.org/software/gnuprologjava/api/gnu/getopt/Getopt.html) を使用するものとする。
処理の流れについては CLI 基本設計 [処理の流れ](https://qiita.com/JhonnyBravo/items/cc5c06d917a80c8a8d1b#%E5%87%A6%E7%90%86%E3%81%AE%E6%B5%81%E3%82%8C) を参照。

```mermaid
classDiagram

LongOpt
Getopt
ContentsModel
ContentsModelValidator
GetProperties

class LongOpt {
  -String name
  -int has_arg
  -StringBuffer flag
  -int val
}

class Getopt {
  -String progName
  -String[] argv
  -String optString
  -LongOpt[] long_options
  +getopt() int
  +getOptarg() String
}

class ContentsModel {
  -String path
  -String encoding
  +getPath() String
  +setPath() void
  +getEncoding() String
  +setEncoding() String
}

class ContentsModelValidator {
  +test(ContentsModel model) boolean
}

class GetProperties {
  +apply(ContentsModel model) Map<String, String>
}

LongOpt -- Getopt: CLI 引数 --path, --encoding を設定する。
Getopt --> ContentsModel: CLI 引数 --path, --encoding を解析する。
ContentsModel -- ContentsModelValidator
ContentsModel -- GetProperties: プロパティファイルからプロパティ群を取得する。
```

## ContentsModel

|メソッド名称|説明|初期値|
|---|---|---|
|setPath(String path)|読込対象とするプロパティファイルのパスを変数 ``{path}`` へ設定する。|-|
|getPath()|読込対象とするプロパティファイルのパスを変数 ``{path}`` から取得する。|-|
|setEncoding(String encoding)|プロパティファイル読込時に使用する文字エンコーディングを変数 ``{encoding}`` へ設定する。|-|
|getEncoding()|プロパティファイル読込時に使用する文字エンコーディングを変数 ``{encoding}`` から取得する。|OS のデフォルト文字エンコーディング|

## ContentsModelValidator

|メソッド名称|説明|
|---|---|
|test(ContentsModel) model|[ContentsModel](#contentsmodel) のバリデーションチェックを実行する。バリデーションエラーの場合は ``false`` を、エラーが無い場合は ``true`` を返す。|

## GetProperties

|メソッド名称|説明|
|---|---|
|apply(ContentsModel) model|プロパティファイルを読込み、 ``<<Map>>`` に変換して返す。|

# Resource クラス設計

```mermaid
classDiagram

BaseResource
FileResourceImpl
DirectoryResourceImpl
TemplateResourceImpl
Status

class BaseResource {
  +getLogger() Logger
  +convertToModel(Map<String, String> properties) T
  +validate(T model) boolean
  +apply(Map<String, String> properties) Status
}

class FileResourceImpl {
  +getLogger() Logger
  +convertToModel(Map<String, String> properties) FileResourceModel
  +validate(FileResourceModel model) boolean
  +apply(Map<String, String> properties) Status
}

class DirectoryResourceImpl {
  +getLogger() Logger
  +convertToModel(Map<String, String> properties) DirectoryResourceModel
  +validate(DirectoryResourceModel model) boolean
  +apply(Map<String, String> properties) Status
}

class FileResourceImpl {
  +getLogger() Logger
  +convertToModel(Map<String, String> properties) FileResourceModel
  +validate(FileResourceModel model) boolean
  +apply(Map<String, String> properties) Status
}

class TemplateResourceImpl {
  +getLogger() Logger
  +convertToModel(Map<String, String> properties) TemplateResourceModel
  +validate(TemplateResourceModel model) boolean
  +apply(Map<String, String> properties) Status
  -getSourceContents(TemplateResourceModel model) List<String>
  -updateContents(TemplateResourceModel model, List<String> contents) Status
}

class Status {
  +INIT
  +DONE
  +ERROR
  +getValue()
}

BaseResource <|-- FileResourceImpl
FileResourceImpl --> Status
BaseResource <|-- DirectoryResourceImpl
DirectoryResourceImpl --> Status
BaseResource <|-- TemplateResourceImpl
TemplateResourceImpl --> Status
```

## BaseResource

|メソッド名称|説明|
|---|---|
|getLogger() Logger|``<<Logger>>`` を生成して返す。|
|convertToModel(Map&lt;String, String&gt; properties)|プロパティ群を収めた ``<<Map>>`` を Model クラスに変換して返す。|
|validate(T model)|Model クラスのバリデーションチェックを実行する。バリデーションエラーの場合は ``false`` を、バリデーションエラーが無い場合は ``true`` を返す。|
|apply(Map&lt;String, String&gt; properties)|プロパティ群に定義された情報を基に操作を実行する。|

## FileResourceImpl

|メソッド名称|説明|
|---|---|
|getLogger() Logger|``<<Logger>>`` を生成して返す。|
|convertToModel(Map&lt;String, String&gt; properties)|プロパティ群を収めた ``<<Map>>`` を [FileResourceModel](#fileresourcemodel) に変換して返す。|
|validate(FileResourceModel model)|[FileResourceModel](#fileresourcemodel) のバリデーションチェックを実行する。バリデーションエラーの場合は ``false`` を、バリデーションエラーが無い場合は ``true`` を返す。|
|apply(Map&lt;String, String&gt; properties)|プロパティ群に定義された情報を基に操作を実行する。|

### バリデーションチェックの条件

[FileResourceModel 生成](https://qiita.com/JhonnyBravo/items/cc5c06d917a80c8a8d1b#fileresourcemodel-%E7%94%9F%E6%88%90) を参照。

### 操作の内容と処理の流れ

ファイルの作成については [ファイル作成](https://qiita.com/JhonnyBravo/items/cc5c06d917a80c8a8d1b#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%BD%9C%E6%88%90) を参照。
ファイルの削除については [ファイル削除](https://qiita.com/JhonnyBravo/items/cc5c06d917a80c8a8d1b#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%89%8A%E9%99%A4) を参照。

## DirectoryResourceImpl

|メソッド名称|説明|
|---|---|
|getLogger() Logger|``<<Logger>>`` を生成して返す。|
|convertToModel(Map&lt;String, String&gt; properties)|プロパティ群を収めた ``<<Map>>`` を [DirectoryResourceModel](#directoryresourcemodel) に変換して返す。|
|validate(DirectoryResourceModel model)|[DirectoryResourceModel](#directoryresourcemodel) のバリデーションチェックを実行する。バリデーションエラーの場合は ``false`` を、バリデーションエラーが無い場合は ``true`` を返す。|
|apply(Map&lt;String, String&gt; properties)|プロパティ群に定義された情報を基に操作を実行する。|

### バリデーションチェックの条件

[DirectoryResourceModel 生成](https://qiita.com/JhonnyBravo/items/cc5c06d917a80c8a8d1b#directoryresourcemodel-%E7%94%9F%E6%88%90) を参照。

### 操作の内容と処理の流れ

ディレクトリの作成については [ディレクトリ作成](https://qiita.com/JhonnyBravo/items/cc5c06d917a80c8a8d1b#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E4%BD%9C%E6%88%90) を参照。
ディレクトリの削除については [ディレクトリ削除](https://qiita.com/JhonnyBravo/items/cc5c06d917a80c8a8d1b#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E5%89%8A%E9%99%A4) を参照。

## TemplateResourceImpl

|メソッド名称|説明|
|---|---|
|getLogger() Logger|``<<Logger>>`` を生成して返す。|
|convertToModel(Map&lt;String, String&gt; properties)|プロパティ群を収めた ``<<Map>>`` を [TemplateResourceModel](#templateresourcemodel) に変換して返す。|
|validate(TemplateResourceModel model)|[TemplateResourceModel](#templateresourcemodel) のバリデーションチェックを実行する。バリデーションエラーの場合は ``false`` を、バリデーションエラーが無い場合は ``true`` を返す。|
|apply(Map&lt;String, String&gt; properties)|プロパティ群に定義された情報を基に操作を実行する。|
|getSourceContents(TemplateResourceModel model)|テキストファイルを読込み、 ``List<String>`` に変換して返す。|
|updateContents(TemplateResourceModel model, List&lt;String&gt; contents)|テキストファイルの内容を上書きする。|

### バリデーションチェックの条件

[TemplateResourceModel 生成](https://qiita.com/JhonnyBravo/items/cc5c06d917a80c8a8d1b#templateresourcemodel-%E7%94%9F%E6%88%90) を参照。

### 操作の内容と処理の流れ

ファイル内容の更新については [ファイル内容の更新](https://qiita.com/JhonnyBravo/items/cc5c06d917a80c8a8d1b#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%86%85%E5%AE%B9%E3%81%AE%E6%9B%B4%E6%96%B0) を参照。
ファイル内容の削除については [ファイル内容の削除](https://qiita.com/JhonnyBravo/items/cc5c06d917a80c8a8d1b#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%86%85%E5%AE%B9%E3%81%AE%E5%89%8A%E9%99%A4) を参照。

# Status

|メソッド名称|説明|コード値|
|---|---|---|
|INIT|初期状態を表す。動作を実行せずに正常終了した場合に使用する。|0|
|DONE|動作の実行に成功したことを表す。動作を実行して正常終了した場合に使用する。|2|
|ERROR|動作の実行中にエラーが発生したことを表す。動作の実行中に異常終了した場合に使用する。|1|
|getValue()|コード値を返す。|-|

# ResourceModel クラス設計

```mermaid
classDiagram

ResourceModel
FileResourceModel
DirectoryResourceModel
TemplateResourceModel

class ResourceModel {
  -String resourceName
  -String action
  -String path
  +getResourceName() String
  +setAction(String action) void
  +getAction() String
  +setPath(String path) void
  +getPath() String
}

class FileResourceModel {
  -String resourceName
  -String action
  -String path
  -String owner
  -String group
  -String mode
  +getResourceName() String
  +setAction(String action) void
  +getAction() String
  +setPath(String path) void
  +getPath() String
  +setOwner(String owner) void
  +getOwner() String
  +setGroup(String group) void
  +getGroup() String
  +setMode(String mode) void
  +getMode() String
}

class DirectoryResourceModel {
  -String resourceName
  -String action
  -String path
  -String owner
  -String group
  -String mode
  +getResourceName() String
  +setAction(String action) void
  +getAction() String
  +setPath(String path) void
  +getPath() String
  +setOwner(String owner) void
  +getOwner() String
  +setGroup(String group) void
  +getGroup() String
  +setMode(String mode) void
  +getMode() String
}

class TemplateResourceModel {
  -String resourceName
  -String action
  -String path
  -String encoding
  +getResourceName() String
  +setAction(String action) void
  +getAction() String
  +setPath(String path) void
  +getPath() String
  +setEncoding() void
  +getEncoding() String
}

ResourceModel <|-- FileResourceModel
ResourceModel <|-- DirectoryResourceModel
ResourceModel <|-- TemplateResourceModel
```

## ResourceModel

|メソッド名称|説明|初期値|
|---|---|---|
|getResourceName|変数 ``{resourceName}`` からリソース名を取得する。|インスタンス生成時に ``file`` 、 ``directory`` 、 ``template`` のいずれかを変数 ``{resourceName}`` へ設定する。|
|setAction(String action)|実行対象とする動作名を変数 ``{action}`` へ設定する。|-|
|getAction()|実行対象とする動作名を変数 ``{action}`` から取得する。|-|
|setPath(String path)|操作対象とするファイルまたはディレクトリのパスを変数 ``{path}`` へ設定する。|-|
|getPath()|操作対象とするファイルまたはディレクトリのパスを変数 ``{path}`` から取得する。|-|

## FileResourceModel

|メソッド名称|説明|初期値|
|---|---|---|
|getResourceName|変数 ``{resourceName}`` からリソース名を取得する。|インスタンス生成時に固定値 ``file`` を変数 ``{resourceName}`` へ設定する。|
|setAction(String action)|実行対象とする動作名を変数 ``{action}`` へ設定する。|-|
|getAction()|実行対象とする動作名を変数 ``{action}`` から取得する。|-|
|setPath(String path)|操作対象とするファイルのパスを変数 ``{path}`` へ設定する。|-|
|getPath()|操作対象とするファイルのパスを変数 ``{path}`` から取得する。|-|
|setOwner(String owner)|ファイルへ設定する所有者名を変数 ``{owner}`` へ設定する。|-|
|getOwner()|ファイルへ設定する所有者名を変数 ``{owner}`` から取得する。|-|
|setGroup(String group)|ファイルへ設定するグループ所有者名を変数 ``{group}`` へ設定する。|-|
|getGroup()|ファイルへ設定するグループ所有者名を変数 ``{group}`` から取得する。|-|
|setMode(String mode)|ファイルへ設定するパーミッション設定値を変数 ``{mode}`` へ設定する。|-|
|getMode()|ファイルへ設定するパーミッション設定値を変数 ``{mode}`` から取得する。|-|

## DirectoryResourceModel

|メソッド名称|説明|初期値|
|---|---|---|
|getResourceName|変数 ``{resourceName}`` からリソース名を取得する。|インスタンス生成時に固定値 ``directory`` を変数 ``{resourceName}`` へ設定する。|
|setAction(String action)|実行対象とする動作名を変数 ``{action}`` へ設定する。|-|
|getAction()|実行対象とする動作名を変数 ``{action}`` から取得する。|-|
|setPath(String path)|操作対象とするディレクトリのパスを変数 ``{path}`` へ設定する。|-|
|getPath()|操作対象とするディレクトリのパスを変数 ``{path}`` から取得する。|-|
|setOwner(String owner)|ディレクトリへ設定する所有者名を変数 ``{owner}`` へ設定する。|-|
|getOwner()|ディレクトリへ設定する所有者名を変数 ``{owner}`` から取得する。|-|
|setGroup(String group)|ディレクトリへ設定するグループ所有者名を変数 ``{group}`` へ設定する。|-|
|getGroup()|ディレクトリへ設定するグループ所有者名を変数 ``{group}`` から取得する。|-|
|setMode(String mode)|ディレクトリへ設定するパーミッション設定値を変数 ``{mode}`` へ設定する。|-|
|getMode()|ディレクトリへ設定するパーミッション設定値を変数 ``{mode}`` から取得する。|-|

## TemplateResourceModel

|メソッド名称|説明|初期値|
|---|---|---|
|getResourceName|変数 ``{resourceName}`` からリソース名を取得する。|インスタンス生成時に固定値 ``template`` を変数 ``{resourceName}`` へ設定する。|
|setAction(String action)|実行対象とする動作名を変数 ``{action}`` へ設定する。|-|
|getAction()|実行対象とする動作名を変数 ``{action}`` から取得する。|-|
|setPath(String path)|操作対象とするファイルのパスを変数 ``{path}`` へ設定する。|-|
|getPath()|操作対象とするファイルのパスを変数 ``{path}`` から取得する。|-|
|setEncoding(String encoding)|ファイルの読書きの際に使用する文字エンコーディングを変数 ``{encoding}`` へ設定する。|-|
|getEncoding()|ファイルの読書きの際に使用する文字エンコーディングを変数 ``{encoding}`` から取得する。|OS のデフォルト文字エンコーディング|