init commit

This commit is contained in:
m-mun
2026-09-03 09:09:11 +09:00
parent 7e0caa5ac3
commit f22760db5c
180 changed files with 34706 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
# TODO
## 以下仕様で作成してください
### ロガークラス(先にこちらを作成してください)
※ジェネリクスの\は表示上のものなのでプログラムには関係ないです。
- パッケージ名:com.rhizome.example.log;
- クラス名:EMLogger
- クラスジェネリクス:\<T>
- メソッド名:logMessage
- 修飾子:public、static\<T>
- 戻り値の型:void
- 引数:
- Class\<T>
- Object
- Message(ENUM型)
- 処理
1. ロガーオブジェクトを取得
2. Message(ENUM)を使用して条件判定
3. 引数のMessageがINFOの場合、引数のObject.toString()を表示する
4. 引数のMessageがWARNINGの場合、引数のObject.toString()を表示する
5. 引数のMessageがERRORの場合、引数のObject.toString()を表示する
### その他
その他すべてのクラスで以下メッセージを表示している処理(エラー処理も含む)をloggerに置き換えてください。
登録、更新、削除をしている処理で入力している値をログに出力してください。
#### 修正対象メッセージ
- INFO
- システムを開始します
- システムを終了します
- 登録が完了しました
- 更新が完了しました
- 削除をキャンセルしました
- 削除が完了しました
- WARNING
- 指定の番号を入力してください
- 入力された値で情報がみつかりませんでした
- titleName + は入力必須です。
- titleName + は数値入力です。
- ERROR
- 予期せぬエラーが発生しました

View File

@@ -0,0 +1,6 @@
10,役員
11,人事・総務部
12,経理部
13,システム開発事業部
14,教育事業部
15,営業企画部
1 10 役員
2 11 人事・総務部
3 12 経理部
4 13 システム開発事業部
5 14 教育事業部
6 15 営業企画部

View File

@@ -0,0 +1,10 @@
10000,山田龍也,ヤマダタツヤ,yamada@hoge.jp,aaa,10
10001,高橋準,タカハシジュン,jtaka@hoge.jp,bbb,10
10002,麻枝史明,マエダフミアキ,fmak@hoge.jp,ccc,11
10003,丸戸章介,マルトショウスケ,marusyo@hoge.jp,ddd,12
10004,三宅武,ミヤケタケシ,miya@hoge.jp,eee,13
10005,丸井悠,マルイハルカ,haru@hoge.jp,fff,13
10006,涼元香織,スズモトカオリ,suzumoto@hoge.jp,ggg,13
10007,葉山稔,ハヤマミノル,mhayama@hoge.jp,hhh,14
10008,川上朱里,カワカミアカリ,kawakami@hoge.jp,iii,14
10009,杉井肇,スギイハジメ,sugi@hoge.jp,jjj,15
1 10000 山田龍也 ヤマダタツヤ yamada@hoge.jp aaa 10
2 10001 高橋準 タカハシジュン jtaka@hoge.jp bbb 10
3 10002 麻枝史明 マエダフミアキ fmak@hoge.jp ccc 11
4 10003 丸戸章介 マルトショウスケ marusyo@hoge.jp ddd 12
5 10004 三宅武 ミヤケタケシ miya@hoge.jp eee 13
6 10005 丸井悠 マルイハルカ haru@hoge.jp fff 13
7 10006 涼元香織 スズモトカオリ suzumoto@hoge.jp ggg 13
8 10007 葉山稔 ハヤマミノル mhayama@hoge.jp hhh 14
9 10008 川上朱里 カワカミアカリ kawakami@hoge.jp iii 14
10 10009 杉井肇 スギイハジメ sugi@hoge.jp jjj 15

View File

@@ -0,0 +1,119 @@
package com.rhizome.example.access;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import com.rhizome.example.data.BaseData;
public abstract class BaseAccess {
/** 対象ファイル */
File targetFile;
/**
* 引数のファイルパスでファイルオブジェクトを生成して、
* 対象ファイルフィールドを初期化します
* @param filePath ファイルパス(例:"file/aaa.csv" 相対パス指定)
*/
protected BaseAccess(String filePath) {
this.targetFile = new File(filePath);
}
/**
* 対象ファイルの中を全件読み込んで、
* Listの形式で返却します
* @return 読み込み結果リスト(要素(String)の内容は対象ファイルの1行ごとの文字列)
* @throws FileNotFoundException 対象ファイルが見つからない場合
*/
protected List<String> readData() throws FileNotFoundException {
List<String> lineList = new ArrayList<>();
try (Scanner scanner = new Scanner(this.targetFile)) {
while (scanner.hasNext()) {
String lineData = scanner.nextLine();
lineList.add(lineData);
}
}
return lineList;
}
/**
* 対象ファイルにBaseDataの中身のCSV表現を追記します
* @param data 追加データ
* @throws IOException 対象ファイルが開けない場合や書き込めない場合
*/
protected void addData(BaseData data) throws IOException {
//ファイル追記処理
try (FileWriter fw = new FileWriter(this.targetFile, true);
BufferedWriter bw = new BufferedWriter(fw)) {
bw.write(data.toCSV());
bw.newLine();
bw.flush();
}
}
/**
* 対象ファイルの内容を更新対象リストの内容に上書きします
* @param list 更新対象リスト
* @throws IOException 対象ファイルが開けない場合や書き込めない場合
*/
protected void updateData(List<BaseData> list) throws IOException {
//ファイル上書き処理
try (FileWriter fw = new FileWriter(this.targetFile, false);
BufferedWriter bw = new BufferedWriter(fw)) {
for (BaseData data : list) {
bw.write(data.toCSV());
bw.newLine();
}
bw.flush();
}
}
/**
* ファイルの情報を全件取得する
* 利用メソッド:readData()
* @return 検索結果
* @throws FileNotFoundException
*/
public abstract List<BaseData> selectAll() throws FileNotFoundException;
/**
* ファイルの主キーが指定されたkeyに合致する情報を取得する
* 利用メソッド:readData()
* @param key 検索対象のキー
* @return 検索結果
* @throws FileNotFoundException
*/
public abstract List<BaseData> selectById(String key) throws FileNotFoundException;
/**
* ファイルに指定データを追加する
* 利用メソッド:addData()
* @param data 追加対象データ
* @throws IOException
*/
public abstract void insert(BaseData data) throws IOException;
/**
* ファイルの指定データと主キーが一致する行を更新する
* 利用メソッド:updateData()
* @param data 更新対象データ
* @throws IOException
*/
public abstract void update(BaseData data) throws IOException;
/**
* ファイルから主キーが指定されたkeyに合致する行を削除する
* 利用メソッド:updateData()
* @param key 削除対象のキー
* @throws IOException
*/
public abstract void delete(String key) throws IOException;
}

View File

@@ -0,0 +1,102 @@
package com.rhizome.example.access;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.rhizome.example.data.BaseData;
import com.rhizome.example.data.EmployeeData;
public class EmployeeAccess extends BaseAccess {
private static final String EMPDATA_FILEPATH = "file/EmployeeData.csv";
public EmployeeAccess() {
super(EMPDATA_FILEPATH);
}
@Override
public List<BaseData> selectAll() throws FileNotFoundException {
//取得用リスト(CSV形式)
List<String> csvList = readData();
//返却用リスト
List<BaseData> datalist = new ArrayList<>();
for (String line : csvList) {
EmployeeData employee = new EmployeeData();
String[] columns = line.split(",");
employee.setIdEmployee(columns[0]);
employee.setNmEmployee(columns[1]);
employee.setKnEmployee(columns[2]);
employee.setMailAddress(columns[3]);
employee.setPassword(columns[4]);
employee.setIdDepartment(columns[5]);
datalist.add(employee);
}
return datalist;
}
@Override
public List<BaseData> selectById(String key) throws FileNotFoundException {
//全件データ
List<BaseData> allList = selectAll();
//IDでの抽出データ
List<BaseData> selectList = new ArrayList<>();
for (BaseData employee : allList) {
if (employee.getPrimaryKeyValue().equals(key)) {
selectList.add(employee);
}
}
return selectList;
}
@Override
public void insert(BaseData data) throws IOException {
//CSVファイルに追記する
addData(data);
}
@Override
public void update(BaseData updateData) throws IOException {
//更新後データリスト
List<BaseData> updatedList = new ArrayList<>();
//全件取得し、更新データを反映する
List<BaseData> allList = selectAll();
for (BaseData employee : allList) {
if(employee.getPrimaryKeyValue().equals(updateData.getPrimaryKeyValue())) {
//指定されたデータとキーが一致するデータの場合、更新データを設定
updatedList.add(updateData);
} else {
//上記以外は取得したデータをそのまま設定
updatedList.add(employee);
}
}
//ファイル上書き処理
updateData(updatedList);
}
@Override
public void delete(String key) throws IOException {
//全件から削除データを除いたリスト
List<BaseData> deletedList = new ArrayList<>();
//全件取得し、keyに該当するデータをリストから削除する
List<BaseData> allList = selectAll();
for (BaseData employee : allList) {
if(!employee.getPrimaryKeyValue().equals(key)) {
deletedList.add(employee);
}
}
//ファイル上書き処理
updateData(deletedList);
}
}

View File

@@ -0,0 +1,22 @@
package com.rhizome.example.data;
public abstract class BaseData {
/**
* インスタンスのフィールドの値をタブ区切りで連結して返却
* @return タブ区切り文字列
*/
public abstract String toString();
/**
* インスタンスのフィールドの値をカンマ区切りで連結して返却
* @return CSV形式文字列
*/
public abstract String toCSV();
/**
* ファイルの主キーの値を取得
* @return 主キーの値
*/
public abstract String getPrimaryKeyValue();
}

View File

@@ -0,0 +1,122 @@
package com.rhizome.example.data;
public class EmployeeData extends BaseData {
/** 社員ID */
private String idEmployee;
/** 社員名 */
private String nmEmployee;
/** 社員名カナ */
private String knEmployee;
/** メールアドレス */
private String mailAddress;
/** パスワード */
private String password;
/** 役職ID */
private String idDepartment;
/**
* @return 社員ID
*/
public String getIdEmployee() {
return idEmployee;
}
/**
* @param idEmployee 社員ID
*/
public void setIdEmployee(String idEmployee) {
this.idEmployee = idEmployee;
}
/**
* @return 社員名
*/
public String getNmEmployee() {
return nmEmployee;
}
/**
* @param nmEmployee 社員名
*/
public void setNmEmployee(String nmEmployee) {
this.nmEmployee = nmEmployee;
}
/**
* @return 社員名カナ
*/
public String getKnEmployee() {
return knEmployee;
}
/**
* @param knEmployee 社員名カナ
*/
public void setKnEmployee(String knEmployee) {
this.knEmployee = knEmployee;
}
/**
* @return メールアドレス
*/
public String getMailAddress() {
return mailAddress;
}
/**
* @param mailAddress メールアドレス
*/
public void setMailAddress(String mailAddress) {
this.mailAddress = mailAddress;
}
/**
* @return パスワード
*/
public String getPassword() {
return password;
}
/**
* @param password パスワード
*/
public void setPassword(String password) {
this.password = password;
}
/**
* @return 役職ID
*/
public String getIdDepartment() {
return idDepartment;
}
/**
* @param idDepartment 役職ID
*/
public void setIdDepartment(String idDepartment) {
this.idDepartment = idDepartment;
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return getIdEmployee() + "\t" + getNmEmployee() + "\t" + getKnEmployee() + "\t"
+ getMailAddress() + "\t" + getPassword() + "\t" + getIdDepartment();
}
@Override
public String toCSV() {
return getIdEmployee() + "," + getNmEmployee() + "," + getKnEmployee() + ","
+ getMailAddress() + "," + getPassword() + "," + getIdDepartment();
}
@Override
public String getPrimaryKeyValue() {
return idEmployee;
}
}

View File

@@ -0,0 +1,226 @@
package com.rhizome.example.main;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import java.util.Scanner;
import com.rhizome.example.access.EmployeeAccess;
import com.rhizome.example.data.BaseData;
import com.rhizome.example.data.EmployeeData;
public class Main {
static Scanner sc = new Scanner(System.in);
/**
* 処理開始位置
*
* @param args
*/
public static void main(String[] args) {
System.out.println("システムを開始します");
while (true) {
try {
new Main().start();
} catch (Exception e) {
System.out.println("予期せぬエラーが発生しました");
e.printStackTrace();
}
}
}
/**
* 処理選択を行う
* @throws IOException
*
*/
public void start() throws IOException {
System.out.println();
System.out.println("1:検索 2:登録 3:更新 4:削除 0:終了");
String ope = sc.nextLine();
switch (ope) {
case "1": //検索
empSelect();
break;
case "2": //登録
empInsert();
break;
case "3": //更新
empUpdate();
break;
case "4": //削除
empDelete();
break;
case "0": //修了
System.out.println("システムを終了します");
System.exit(0);
default:
System.out.println("指定の番号を入力してください");
break;
}
}
/**
* 社員ファイルから情報を検索する
*
* @throws FileNotFoundException
*/
public void empSelect() throws FileNotFoundException {
EmployeeAccess ea = new EmployeeAccess();
List<BaseData> list;
System.out.println("1:全検索 2:条件検索 それ以外:戻る");
String select = sc.nextLine();
switch (select) {
case "1": //全検索
//ファイル全件取得処理
list = ea.selectAll();
break;
case "2": //条件検索
//IDの入力および入力チェック
String id = inputCheck("ID", true);
//idに一致する社員データ取得
list = ea.selectById(id);
if (list.size() == 0) { //取得結果が0件の場合
System.out.println("入力された値で情報がみつかりませんでした");
}
break;
default:
return;
}
//取得結果件数分、データをタブ区切りで出力する
for (BaseData employee : list) {
System.out.println(employee.toString());
}
}
/**
* 社員ファイルに情報を登録する
*
* @throws IOException
*/
public void empInsert() throws IOException {
//各項目の入力および入力チェック処理
String id = inputCheck("社員ID", true);
String name = inputCheck("社員名", false);
String kana = inputCheck("フリガナ", false);
String mail = inputCheck("メールアドレス", false);
String pass = inputCheck("パスワード", false);
String depId = inputCheck("部署ID", true);
//社員データインスタンスを生成し、入力値を設定
EmployeeData employee = new EmployeeData();
employee.setIdEmployee(id);
employee.setNmEmployee(name);
employee.setKnEmployee(kana);
employee.setMailAddress(mail);
employee.setPassword(pass);
employee.setIdDepartment(depId);
EmployeeAccess ea = new EmployeeAccess();
//ファイルデータ追加処理
ea.insert(employee);
System.out.println("登録が完了しました");
}
/**
* 社員ファイルの情報を更新する
*
* @throws IOException
*/
public void empUpdate() throws IOException {
EmployeeAccess ea = new EmployeeAccess();
//IDの入力および入力チェック
String id = inputCheck("ID", true);
//IDの存在チェック
if (ea.selectById(id).size() == 0) {
System.out.println("入力された値で情報がみつかりませんでした");
return;
}
//各項目の入力および入力チェック処理
String name = inputCheck("社員名", false);
String kana = inputCheck("フリガナ", false);
String mail = inputCheck("メールアドレス", false);
String pass = inputCheck("パスワード", false);
String depId = inputCheck("部署ID", true);
//社員データインスタンスを生成し、入力値を設定
EmployeeData employee = new EmployeeData();
employee.setIdEmployee(id);
employee.setNmEmployee(name);
employee.setKnEmployee(kana);
employee.setMailAddress(mail);
employee.setPassword(pass);
employee.setIdDepartment(depId);
//ファイルデータ更新処理
ea.update(employee);
System.out.println("更新が完了しました");
}
/**
* 社員ファイルの情報を削除する
*
* @throws IOException
*/
public void empDelete() throws IOException {
EmployeeAccess ea = new EmployeeAccess();
//IDの入力および入力チェック
String id = inputCheck("ID", true);
//IDの存在チェック
if (ea.selectById(id).size() == 0) {
System.out.println("入力された値で情報がみつかりませんでした");
return;
}
System.out.println("指定されたIDの情報を削除します? Y/y");
System.out.println("(Y/y以外の入力であればキャンセル)");
String yY = sc.nextLine();
if (!"y".equals(yY) && !"Y".equals(yY)) {
System.out.println("削除をキャンセルしました");
return;
}
//ファイルデータ削除処理
ea.delete(id);
System.out.println("削除が完了しました");
}
/**
* 入力値を判定し、返却する
*
* @param titleName 入力項目名
* @param flg 数値チェック可否フラグ
* @return チェック済み入力値
*/
public static String inputCheck(String titleName, boolean flg) {
String str = null;
while (true) {
System.out.println(titleName + "を入力してください");
str = sc.nextLine();
if (str.trim().length() == 0) {
System.out.println(titleName + "は入力必須です。");
continue;
}
if (flg) {
if (str.trim().length() > 0) {
try {
Integer.parseInt(str);
} catch (NumberFormatException e) {
System.out.println(titleName + "は数値入力です");
continue;
}
}
}
break;
}
return str;
}
}

View File

@@ -0,0 +1,28 @@
package com.rhizome.example.message;
public enum Message {
INFO("INFO", "info", "情報"),
WARNING("WARN", "warn", "警告"),
ERROR("ERROR", "error", "エラー");
private final String usUpper;
private final String usLower;
private final String jpWord;
private Message(String usUpper, String usLower, String jpWord) {
this.usUpper = usUpper;
this.usLower = usLower;
this.jpWord = jpWord;
}
String getUsUpper() {
return this.usUpper;
}
String getUsLower() {
return this.usLower;
}
String getJpWord() {
return this.jpWord;
}
}

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy/MM/dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<RollingFile name="em-log" fileName="./log/em-oop.log" filePattern="./log/%d{yyyyMM}/em-oop_%d{yyyyMMdd}_%i.log">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger - %msg%n"/>
<Policies>
<OnStartupTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10KB" />
<TimeBasedTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="5"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="em-log" />
</Root>
</Loggers>
</Configuration>

View File

@@ -0,0 +1,10 @@
10000,山田龍也,ヤマダタツヤ,yamada@hoge.jp,aaa,10
10001,高橋準,タカハシジュン,jtaka@hoge.jp,bbb,10
10002,麻枝史明,マエダフミアキ,fmak@hoge.jp,ccc,11
10003,丸戸章介,マルトショウスケ,marusyo@hoge.jp,ddd,12
10004,三宅武,ミヤケタケシ,miya@hoge.jp,eee,13
10005,丸井悠,マルイハルカ,haru@hoge.jp,fff,13
10006,涼元香織,スズモトカオリ,suzumoto@hoge.jp,ggg,13
10007,葉山稔,ハヤマミノル,mhayama@hoge.jp,hhh,14
10008,川上朱里,カワカミアカリ,kawakami@hoge.jp,iii,14
10009,杉井肇,スギイハジメ,sugi@hoge.jp,jjj,15
1 10000 山田龍也 ヤマダタツヤ yamada@hoge.jp aaa 10
2 10001 高橋準 タカハシジュン jtaka@hoge.jp bbb 10
3 10002 麻枝史明 マエダフミアキ fmak@hoge.jp ccc 11
4 10003 丸戸章介 マルトショウスケ marusyo@hoge.jp ddd 12
5 10004 三宅武 ミヤケタケシ miya@hoge.jp eee 13
6 10005 丸井悠 マルイハルカ haru@hoge.jp fff 13
7 10006 涼元香織 スズモトカオリ suzumoto@hoge.jp ggg 13
8 10007 葉山稔 ハヤマミノル mhayama@hoge.jp hhh 14
9 10008 川上朱里 カワカミアカリ kawakami@hoge.jp iii 14
10 10009 杉井肇 スギイハジメ sugi@hoge.jp jjj 15