import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
class Main {
public static void main(String[] args) {
App app = new App();
app.start();
}
}
// Session
// 현재 사용자가 이용중인 정보
// 이 안의 정보는 사용자가 프로그램을 사용할 때 동안은 계속 유지된다.
class Session {
private Member loginedMember;
private Board currentBoard;
public Member getLoginedMember() {
return loginedMember;
}
public void setLoginedMember(Member loginedMember) {
this.loginedMember = loginedMember;
}
public Board getCurrentBoard() {
return currentBoard;
}
public void setCurrentBoard(Board currentBoard) {
this.currentBoard = currentBoard;
}
public boolean isLogined() {
return loginedMember != null;
}
}
// DB 커넥션(진짜 DB와의 연결을 담당)
class DBConnection {
private Connection connection;
public void connect() {
String url = "jdbc:mysql://localhost:3306/site5?serverTimezone=UTC";
String user = "sbsst";
String password = "sbs123414";
String driverName = "com.mysql.cj.jdbc.Driver";
try {
// ① 로드(카카오 택시에 `com.mysql.cj.jdbc.Driver` 라는 실제 택시 드라이버를 등록)
// 하지만 개발자는 실제로 `com.mysql.cj.jdbc.Driver`를 다룰 일은 없다.
// 내부적으로 JDBC가 알아서 다 해주기 때문에 우리는 JDBC의 DriverManager 를 통해서 DB와의 연결을 얻으면 된다.
Class.forName(driverName);
// ② 연결
connection = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
// `com.mysql.cj.jdbc.Driver` 라는 클래스가 라이브러리로 추가되지 않았다면 오류발생
System.out.println("[로드 오류]\n" + e.getStackTrace());
} catch (SQLException e) {
// DB접속정보가 틀렸다면 오류발생
System.out.println("[연결 오류]\n" + e.getStackTrace());
}
}
public int selectRowIntValue(String sql) {
Map<String, Object> row = selectRow(sql);
for (String key : row.keySet()) {
Object value = row.get(key);
if (value instanceof String) {
return Integer.parseInt((String) value);
}
if (value instanceof Long) {
return (int) (long) value;
} else {
return (int) value;
}
}
return -1;
}
public String selectRowStringValue(String sql) {
Map<String, Object> row = selectRow(sql);
for (String key : row.keySet()) {
Object value = row.get(key);
return value + "";
}
return "";
}
public boolean selectRowBooleanValue(String sql) {
int rs = selectRowIntValue(sql);
return rs == 1;
}
public Map<String, Object> selectRow(String sql) {
List<Map<String, Object>> rows = selectRows(sql);
if (rows.size() > 0) {
return rows.get(0);
}
return new HashMap<>();
}
public List<Map<String, Object>> selectRows(String sql) {
// SQL을 적는 문서파일
Statement statement = null;
ResultSet rs = null;
List<Map<String, Object>> rows = new ArrayList<>();
try {
statement = connection.createStatement();
rs = statement.executeQuery(sql);
// ResultSet 의 MetaData를 가져온다.
ResultSetMetaData metaData = rs.getMetaData();
// ResultSet 의 Column의 갯수를 가져온다.
int columnSize = metaData.getColumnCount();
// rs의 내용을 돌려준다.
while (rs.next()) {
// 내부에서 map을 초기화
Map<String, Object> row = new HashMap<>();
for (int columnIndex = 0; columnIndex < columnSize; columnIndex++) {
String columnName = metaData.getColumnName(columnIndex + 1);
// map에 값을 입력 map.put(columnName, columnName으로 getString)
row.put(columnName, rs.getObject(columnName));
}
// list에 저장
rows.add(row);
}
} catch (SQLException e) {
System.err.printf("[SELECT 쿼리 오류, %s]\n" + e.getStackTrace() + "\n", sql);
}
try {
if (statement != null) {
statement.close();
}
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
System.err.println("[SELECT 종료 오류]\n" + e.getStackTrace());
}
return rows;
}
public int update(String sql) {
// UPDATE 명령으로 몇개의 데이터가 수정되었는지
int affectedRows = 0;
// SQL을 적는 문서파일
Statement statement = null;
try {
statement = connection.createStatement();
affectedRows = statement.executeUpdate(sql);
} catch (SQLException e) {
System.err.printf("[UPDATE 쿼리 오류, %s]\n" + e.getStackTrace() + "\n", sql);
}
try {
if (statement != null) {
statement.close();
}
} catch (SQLException e) {
System.err.println("[UPDATE 종료 오류]\n" + e.getStackTrace());
}
return affectedRows;
}
public int insert(String sql) {
int id = -1;
// SQL을 적는 문서파일
Statement statement = null;
// SQL의 실행결과 보고서
ResultSet rs = null;
try {
statement = connection.createStatement();
statement.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
rs = statement.getGeneratedKeys();
if (rs.next()) {
id = rs.getInt(1);
}
} catch (SQLException e) {
System.err.printf("[INSERT 쿼리 오류, %s]\n" + e.getStackTrace() + "\n", sql);
}
try {
if (statement != null) {
statement.close();
}
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
System.err.println("[INSERT 종료 오류]\n" + e.getStackTrace());
}
return id;
}
public void close() {
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
System.err.println("[닫기 오류]\n" + e.getStackTrace());
}
}
}
// Factory
// 프로그램 전체에서 공유되는 객체 리모콘을 보관하는 클래스
class Factory {
private static Session session;
private static DB db;
private static DBConnection dbConnection;
private static BuildService buildService;
private static ArticleService articleService;
private static ArticleDao articleDao;
private static MemberService memberService;
private static MemberDao memberDao;
private static Scanner scanner;
public static DBConnection getDBConnection() {
if (dbConnection == null) {
dbConnection = new DBConnection();
}
return dbConnection;
}
public static Session getSession() {
if (session == null) {
session = new Session();
}
return session;
}
public static Scanner getScanner() {
if (scanner == null) {
scanner = new Scanner(System.in);
}
return scanner;
}
public static DB getDB() {
if (db == null) {
db = new DB();
}
return db;
}
public static ArticleService getArticleService() {
if (articleService == null) {
articleService = new ArticleService();
}
return articleService;
}
public static ArticleDao getArticleDao() {
if (articleDao == null) {
articleDao = new ArticleDao();
}
return articleDao;
}
public static MemberService getMemberService() {
if (memberService == null) {
memberService = new MemberService();
}
return memberService;
}
public static MemberDao getMemberDao() {
if (memberDao == null) {
memberDao = new MemberDao();
}
return memberDao;
}
public static BuildService getBuildService() {
if (buildService == null) {
buildService = new BuildService();
}
return buildService;
}
}
// App
class App {
private Map<String, Controller> controllers;
// 컨트롤러 만들고 한곳에 정리
// 나중에 컨트롤러 이름으로 쉽게 찾아쓸 수 있게 하려고 Map 사용
void initControllers() {
controllers = new HashMap<>();
controllers.put("build", new BuildController());
controllers.put("article", new ArticleController());
}
public App() {
// 컨트롤러 등록
initControllers();
Factory.getDBConnection().connect();
// 공지사항 게시판 생성
Factory.getArticleService().makeBoard("공지시항", "notice");
// 자유 게시판 생성
Factory.getArticleService().makeBoard("자유게시판", "free");
Factory.getSession().setCurrentBoard(Factory.getArticleService().getBoard(1));
}
public void start() {
while (true) {
System.out.printf("명령어 : \n");
String command = Factory.getScanner().nextLine().trim();
if (command.length() == 0) {
continue;
} else if (command.equals("exit")) {
break;
}
Request reqeust = new Request(command);
if (reqeust.isValidRequest() == false) {
continue;
}
if (controllers.containsKey(reqeust.getControllerName()) == false) {
continue;
}
controllers.get(reqeust.getControllerName()).doAction(reqeust);
continue;
}
Factory.getDBConnection().close();
Factory.getScanner().close();
}
}
// Request
class Request {
private String requestStr;
private String controllerName;
private String actionName;
private String arg1;
private String arg2;
private String arg3;
boolean isValidRequest() {
return actionName != null;
}
Request(String requestStr) {
this.requestStr = requestStr;
String[] requestStrBits = requestStr.split(" ");
this.controllerName = requestStrBits[0];
if (requestStrBits.length > 1) {
this.actionName = requestStrBits[1];
}
if (requestStrBits.length > 2) {
this.arg1 = requestStrBits[2];
}
if (requestStrBits.length > 3) {
this.arg2 = requestStrBits[3];
}
if (requestStrBits.length > 4) {
this.arg3 = requestStrBits[4];
}
}
public String getControllerName() {
return controllerName;
}
public void setControllerName(String controllerName) {
this.controllerName = controllerName;
}
public String getActionName() {
return actionName;
}
public void setActionName(String actionName) {
this.actionName = actionName;
}
public String getArg1() {
return arg1;
}
public void setArg1(String arg1) {
this.arg1 = arg1;
}
public String getArg2() {
return arg2;
}
public void setArg2(String arg2) {
this.arg2 = arg2;
}
public String getArg3() {
return arg3;
}
public void setArg3(String arg3) {
this.arg3 = arg3;
}
}
// Controller
abstract class Controller {
abstract void doAction(Request reqeust);
}
class ArticleController extends Controller {
private ArticleService articleService;
private Statement statement;
ArticleController() {
articleService = Factory.getArticleService();
}
public void doAction(Request reqeust) {
if (reqeust.getActionName().equals("list")) {
actionList(reqeust);
} else if (reqeust.getActionName().equals("write")) {
actionWrite(reqeust);
} else if (reqeust.getActionName().equals("detail")) {
actionDetail(reqeust);
} else if (reqeust.getActionName().equals("modify")) {
actionModify(reqeust);
} else if (reqeust.getActionName().equals("delete")) {
actionDelete(reqeust);
} else if (reqeust.getActionName().equals("changeBoard")) {
actionChangeBoard(reqeust);
} else if (reqeust.getActionName().equals("search")) {
actionSearch(reqeust);
}
}
private void actionSearch(Request reqeust) {
System.out.println("== Search 시작 ==");
System.out.println("관련 검색어 : ");
String search = Factory.getScanner().next().trim();
Factory.getArticleService().search(search);
}
private void actionChangeBoard(Request reqeust) {
List<Board> boards = articleService.getBoards();
System.out.println("== ChangeBoard 시작 ==");
System.out.println("");
for ( Board board : boards ) {
System.out.printf(" [ %d ] : %s \n" , board.getId(),board.getName());
}
System.out.print("이동할 게시판 번호를 입력해주세요 : ");
int cmd = Factory.getScanner().nextInt();
for ( Board board : boards ) {
if ( cmd == board.getId() ) {
articleService.changeBoard(cmd);
System.out.printf("[%s] 변경 되었습니다.\n",board.getName());
}
}
}
private void actionDelete(Request reqeust) {
List<Article> articles = articleService.getArticles();
System.out.println("== Delete 시작 == ");
System.out.println("");
System.out.println("삭제할 번호 입력 : ");
int cmd = Factory.getScanner().nextInt();
for ( Article article : articles ) {
if ( cmd == article.getId() ) {
articleService.delete(cmd);
System.out.printf("번호 : [%s] 삭제 완료 \n",cmd);
}
}
System.out.println("== Delete 종료 == \n\n");
}
private void actionModify(Request reqeust) {
List<Article> articles = articleService.getArticles();
System.out.println("== Modify 시작 == ");
System.out.println("");
System.out.println("수정할 번호 입력 : ");
int cmd = Factory.getScanner().nextInt();
for ( Article article : articles ) {
if ( cmd == article.getId() ) {
System.out.println("수정 제목 : ");
String modifyTitle = Factory.getScanner().next();
System.out.println("수정 내용 : ");
String modifyBody = Factory.getScanner().next();
articleService.modify(cmd,modifyTitle,modifyBody);
}
}
System.out.println("== Modify 종료 == ");
}
private void actionDetail(Request reqeust) {
List<Article> articles = articleService.getArticles();
System.out.println("== Detail 시작 == ");
System.out.println("");
System.out.print("번호 입력 : ");
int cmd = Factory.getScanner().nextInt();
for ( Article article : articles ) {
if ( cmd == article.getId() ) {
System.out.printf("날짜 : [%s] \n",article.getRegDate());
System.out.printf("번호 : [%d] \n",article.getId());
System.out.printf("제목 : [%s] \n",article.getTitle());
System.out.printf("내용 : [%s] \n",article.getBody());
}
}
System.out.println("== Detail 종료 ==");
}
private void actionList(Request reqeust) {
List<Article> articles = articleService.getArticles();
// 현재 파일 db에서 가저옴..
System.out.println("== 게시물 리스트 시작 ==");
for (Article article : articles) {
System.out.printf("%d, %s, %s\n", article.getId(), article.getRegDate(), article.getTitle());
}
System.out.println("== 게시물 리스트 끝 ==");
}
private void actionWrite(Request reqeust) {
System.out.printf("제목 : ");
String title = Factory.getScanner().nextLine();
System.out.printf("내용 : ");
String body = Factory.getScanner().nextLine();
// 현재 게시판 id 가져오기
int boardId = Factory.getSession().getCurrentBoard().getId();
String boardName = Factory.getSession().getCurrentBoard().getName();
int newId = articleService.write(boardId,boardName, title, body);
System.out.printf("%d번 글이 생성되었습니다.\n", newId);
}
}
class BuildController extends Controller {
private BuildService buildService;
BuildController() {
buildService = Factory.getBuildService();
}
void doAction(Request reqeust) {
if (reqeust.getActionName().equals("site")) {
actionSite(reqeust);
} else if ( reqeust.getActionName().equals("stop")) {
actionStop(reqeust);
}
}
private void actionStop(Request reqeust) {
buildService.buildStop();
}
private void actionSite(Request reqeust) {
buildService.buildSite();
}
}
// Service
class BuildService {
ArticleService articleService;
private static boolean buildSite;
static {
buildSite = false;
}
BuildService() {
articleService = Factory.getArticleService();
}
public void buildStop() {
buildSite = false;
System.out.println("== 자동생성 종료.. ==");
}
public void buildSite() {
buildSite = true;
new Thread(() -> {
while ( buildSite ) {
Util.makeDir("site");
Util.makeDir("site/article");
String head = Util.getFileContents("site/article/head.html");
String foot = Util.getFileContents("site/article/foot.html");
List<Board> boards = articleService.getBoards();
for (Board board : boards) {
String fileName = board.getCode() + "list-1.html";
String html = "";
List<Article> articles = articleService.getArticles();
for (Article article : articles) {
if ( board.getId() == article.getBoardId()) {
html += "<link rel=\"stylesheet\" href=\"Style.css\">";
html += "<table border=2 height = 100px width = 500px >";
html += "<tr>";
html += "<td>"+" 번호 : " + article.getId() + "</td>";
html += "<td>"+" 날짜 : " + article.getRegDate() + "</td>";
html += "<td><a href=\"" + article.getId() + ".html\">"+"제목 : " + article.getTitle() + "</a></td>";
html += "</tr>";
}
}
html = head + html;
Util.writeFileContents("site/article/" + fileName, html);
}
// 게시물 별 파일 생성
List<Article> articles = articleService.getArticles();
for (Article article : articles) {
String html = "";
html += "<link rel=\"stylesheet\" href=\"Style.css\">";
html += "<nav>제목 : " + article.getTitle() + "</nav>";
html += "<nav>내용 : " + article.getBody() + "</nav>";
html += "<nav><a href=\"" + (article.getId() - 1) + ".html\">이전글</a></nav>";
html += "<nav><a href=\"" + (article.getId() + 1) + ".html\">다음글</a></nav>";
html = head + html ;
Util.writeFileContents("site/article/" + article.getId() + ".html", html);
}
}
}).start();
System.out.println("== 자동생성 중... ==");
}
}
class ArticleService {
private ArticleDao articleDao;
ArticleService() {
articleDao = Factory.getArticleDao();
}
public void search(String search) {
Factory.getArticleDao().search(search);
}
void changeBoard(int cmd) {
Factory.getSession().setCurrentBoard(Factory.getArticleService().getBoard(cmd));
}
public int delete(int cmd) {
articleDao.delete(cmd);
String sql = "";
sql += "DELETE FROM article WHERE id =" +cmd;
return Factory.getDBConnection().insert(sql);
}
public int modify(int cmd, String modifyTitle, String modifyBody) {
String sql = "";
// 작은따음표 때메 1시간 날려먹음...
sql += "UPDATE article SET title ='"+modifyTitle+"',"+"body='"+modifyBody+"' WHERE id = '" +cmd+"'";
return Factory.getDBConnection().update(sql);
}
public List<Article> getArticlesByBoardCode(String code) {
return articleDao.getArticlesByBoardCode(code);
}
public List<Board> getBoards() {
return articleDao.getBoards();
}
public int makeBoard(String name, String code) {
// Board oldBoard = articleDao.getBoardByCode(code);
//
// if (oldBoard != null) {
// return -1;
// }
Board board = new Board(name, code);
return articleDao.saveBoard(board);
}
public Board getBoard(int id) {
return articleDao.getBoard(id);
}
public int write(int boardId,String boardName, String title, String body) {
Article article = new Article(boardId,boardName, title, body);
return articleDao.save(article);
}
public List<Article> getArticles() {
return articleDao.getArticles();
}
}
class MemberService {
private MemberDao memberDao;
MemberService() {
memberDao = Factory.getMemberDao();
}
public Member getMemberByLoginIdAndLoginPw(String loginId, String loginPw) {
return memberDao.getMemberByLoginIdAndLoginPw(loginId, loginPw);
}
public int join(String loginId, String loginPw, String name) {
Member oldMember = memberDao.getMemberByLoginId(loginId);
if (oldMember != null) {
return -1;
}
Member member = new Member(loginId, loginPw, name);
return memberDao.save(member);
}
public Member getMember(int id) {
return memberDao.getMember(id);
}
}
// Dao
class ArticleDao {
DB db;
DBConnection dbConnection;
ArticleDao() {
db = Factory.getDB(); // 나중에 없어질
dbConnection = Factory.getDBConnection();
}
public boolean delete(int cmd) {
List<Article> articles = Factory.getArticleService().getArticles();
String filePath = "site/article/" + cmd + ".html";
File f = new File(filePath);
for ( Article article : articles ) {
if (isFileExists(filePath)) {
if (f.delete()) {
articles.remove(article);
return true;
}
}
}
return false;
}
boolean isFileExists(String filePath) {
File f = new File(filePath);
if ( f.isFile()) {
return true;
}
return false;
}
public List<Map<String, Object>> search(String search) {
String sql = "";
sql += "SELECT * FROM article WHERE title LIKE '%"+ search + "%'";
return dbConnection.selectRows(sql);
}
public int boardsave(Board board) {
String sql = "";
sql += "INSERT INTO board ";
sql += String.format("SET id = '%d'",board.getId() );
sql += String.format(", regDate = '%s'",board.getRegDate() );
sql += String.format(", name = '%s'", board.getName());
sql += String.format(", code = '%s'", board.getCode());
return dbConnection.insert(sql);
}
public int save(int cmd) {
// TODO Auto-generated method stub
return 0;
}
public List<Article> getArticlesByBoardCode(String code) {
return db.getArticlesByBoardCode(code);
}
public List<Board> getBoards() {
return db.getBoards();
}
public Board getBoardByCode(String code) {
return db.getBoardByCode(code);
}
public int saveBoard(Board board) {
String sql = "";
sql += "INSERT INTO board ";
sql += String.format("SET Id = '%d'", board.getId());
sql += String.format(", regDate = '%s'", board.getRegDate());
sql += String.format(", `name` = '%s'", board.getName());
sql += String.format(", `code` = '%s'", board.getCode());
return dbConnection.insert(sql);
}
public int save(Article article) {
String sql = "";
sql += "INSERT INTO article ";
sql += String.format("SET regDate = '%s'", article.getRegDate());
sql += String.format(", title = '%s'", article.getTitle());
sql += String.format(", `body` = '%s'", article.getBody());
sql += String.format(", boardId = '%d'", article.getBoardId());
sql += String.format(", boardName = '%s'", article.getBoardName());
// write도 save써서 글 올
return dbConnection.insert(sql);
}
public Board getBoard(int id) {
return db.getBoard(id);
}
public List<Article> getArticles() {
List<Map<String, Object>> rows = dbConnection.selectRows("SELECT * FROM article ORDER by id ASC");
List<Article> articles = new ArrayList<>();
// List 만들어서 article -> write할떄마다 넣어주기
for (Map<String, Object> row : rows) {
articles.add(new Article(row));
}
return articles;
// return db.getArticles();
}
}
class MemberDao {
DB db;
MemberDao() {
db = Factory.getDB();
}
public Member getMemberByLoginIdAndLoginPw(String loginId, String loginPw) {
return db.getMemberByLoginIdAndLoginPw(loginId, loginPw);
}
public Member getMemberByLoginId(String loginId) {
return db.getMemberByLoginId(loginId);
}
public Member getMember(int id) {
return db.getMember(id);
}
public int save(Member member) {
return db.saveMember(member);
}
}
// DB
class DB {
DBConnection dbconnection;
private Map<String, Table> tables;
public DB() {
String dbDirPath = getDirPath();
Util.makeDir(dbDirPath);
tables = new HashMap<>();
tables.put("article", new Table<Article>(Article.class, dbDirPath));
tables.put("board", new Table<Board>(Board.class, dbDirPath));
tables.put("member", new Table<Member>(Member.class, dbDirPath));
}
public List<Article> getArticlesByBoardCode(String code) {
Board board = getBoardByCode(code);
// free => 2
// notice => 1
List<Article> articles = getArticles();
List<Article> newArticles = new ArrayList<>();
for (Article article : articles) {
if (article.getBoardId() == board.getId()) {
newArticles.add(article);
}
}
return newArticles;
}
public Member getMemberByLoginIdAndLoginPw(String loginId, String loginPw) {
List<Member> members = getMembers();
for (Member member : members) {
if (member.getLoginId().equals(loginId) && member.getLoginPw().equals(loginPw)) {
return member;
}
}
return null;
}
public Member getMemberByLoginId(String loginId) {
List<Member> members = getMembers();
for (Member member : members) {
if (member.getLoginId().equals(loginId)) {
return member;
}
}
return null;
}
public List<Member> getMembers() {
return tables.get("member").getRows();
}
public Board getBoardByCode(String code) {
List<Board> boards = getBoards();
for (Board board : boards) {
if (board.getCode().equals(code)) {
return board;
}
}
return null;
}
public List<Board> getBoards() {
return tables.get("board").getRows();
}
public Member getMember(int id) {
return (Member) tables.get("member").getRow(id);
}
public String getDirPath() {
return "db";
}
public int saveMember(Member member) {
return tables.get("member").saveRow(member);
}
public Board getBoard(int id) {
return (Board) tables.get("board").getRow(id);
}
public List<Article> getArticles() {
return tables.get("article").getRows();
}
public int saveArticle(Article article) {
return tables.get("article").saveRow(article);
}
public void backup() {
for (String tableName : tables.keySet()) {
Table table = tables.get(tableName);
table.backup();
}
}
}
// Table
class Table<T> {
private Class<T> dataCls;
private String tableName;
private String tableDirPath;
public Table(Class<T> dataCls, String dbDirPath) {
this.dataCls = dataCls;
this.tableName = Util.lcfirst(dataCls.getCanonicalName());
this.tableDirPath = dbDirPath + "/" + this.tableName;
Util.makeDir(tableDirPath);
}
private String getTableName() {
return tableName;
}
public int saveRow(T data) {
Dto dto = (Dto) data;
if (dto.getId() == 0) {
int lastId = getLastId();
int newId = lastId + 1;
dto.setId(newId);
setLastId(newId);
}
String rowFilePath = getRowFilePath(dto.getId());
Util.writeJsonFile(rowFilePath, data);
return dto.getId();
};
private String getRowFilePath(int id) {
return tableDirPath + "/" + id + ".json";
}
private void setLastId(int lastId) {
String filePath = getLastIdFilePath();
Util.writeFileContents(filePath, lastId);
}
private int getLastId() {
String filePath = getLastIdFilePath();
if (Util.isFileExists(filePath) == false) {
int lastId = 0;
Util.writeFileContents(filePath, lastId);
return lastId;
}
return Integer.parseInt(Util.getFileContents(filePath));
}
private String getLastIdFilePath() {
return this.tableDirPath + "/lastId.txt";
}
public T getRow(int id) {
return (T) Util.getObjectFromJson(getRowFilePath(id), dataCls);
}
public void backup() {
}
List<T> getRows() {
int lastId = getLastId();
List<T> rows = new ArrayList<>();
for (int id = 1; id <= lastId; id++) {
T row = getRow(id);
if (row != null) {
rows.add(row);
}
}
return rows;
};
}
// DTO
abstract class Dto {
private int id;
private String regDate;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getRegDate() {
return regDate;
}
public void setRegDate(String regDate) {
this.regDate = regDate;
}
Dto() {
this(0);
}
Dto(int id) {
this(id, Util.getNowDateStr());
}
Dto(int id, String regDate) {
this.id = id;
this.regDate = regDate;
}
}
class Board extends Dto {
private String name;
private String code;
public Board() {
}
public Board(String name, String code) {
this.name = name;
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
class Article extends Dto {
private String boardName;
private int boardId;
private String title;
private String body;
public Article() {
}
public Article(int boardId,String boardName,String title, String body) {
this.boardId = boardId;
this.title = title;
this.body = body;
this.boardName = boardName;
}
public Article(Map<String, Object> row) {
this.setId((int) (long) row.get("id"));
String regDate = row.get("regDate") + "";
this.setRegDate(regDate);
this.setTitle((String) row.get("title"));
this.setBody((String) row.get("body"));
this.setBoardId((int) (long) row.get("boardId"));
}
public String getBoardName() {
return boardName;
}
public void setBoardName(String boardName) {
this.boardName = boardName;
}
public Article(String modifyTitle, String modifybody) {
// TODO Auto-generated constructor stub
}
public int getBoardId() {
return boardId;
}
public void setBoardId(int boardId) {
this.boardId = boardId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
}
class ArticleReply extends Dto {
private int id;
private String regDate;
private int articleId;
private int memberId;
private String body;
ArticleReply() {
}
public int getArticleId() {
return articleId;
}
public void setArticleId(int articleId) {
this.articleId = articleId;
}
public int getMemberId() {
return memberId;
}
public void setMemberId(int memberId) {
this.memberId = memberId;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
}
class Member extends Dto {
private String loginId;
private String loginPw;
private String name;
public Member() {
}
public Member(String loginId, String loginPw, String name) {
this.loginId = loginId;
this.loginPw = loginPw;
this.name = name;
}
public String getLoginId() {
return loginId;
}
public void setLoginId(String loginId) {
this.loginId = loginId;
}
public String getLoginPw() {
return loginPw;
}
public void setLoginPw(String loginPw) {
this.loginPw = loginPw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// Util
class Util {
// 현재날짜문장
public static String getNowDateStr() {
Calendar cal = Calendar.getInstance();
SimpleDateFormat Date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = Date.format(cal.getTime());
return dateStr;
}
// 파일에 내용쓰기
public static void writeFileContents(String filePath, int data) {
writeFileContents(filePath, data + "");
}
// 첫 문자 소문자화
public static String lcfirst(String str) {
String newStr = "";
newStr += str.charAt(0);
newStr = newStr.toLowerCase();
return newStr + str.substring(1);
}
// 파일이 존재하는지
public static boolean isFileExists(String filePath) {
File f = new File(filePath);
if (f.isFile()) {
return true;
}
return false;
}
// 파일내용 읽어오기
public static String getFileContents(String filePath) {
String rs = null;
try {
// 바이트 단위로 파일읽기
FileInputStream fileStream = null; // 파일 스트림
fileStream = new FileInputStream(filePath);// 파일 스트림 생성
// 버퍼 선언
byte[] readBuffer = new byte[fileStream.available()];
while (fileStream.read(readBuffer) != -1) {
}
rs = new String(readBuffer);
fileStream.close(); // 스트림 닫기
} catch (Exception e) {
e.getStackTrace();
}
return rs;
}
// 파일 쓰기
public static void writeFileContents(String filePath, String contents) {
BufferedOutputStream bs = null;
try {
bs = new BufferedOutputStream(new FileOutputStream(filePath));
bs.write(contents.getBytes()); // Byte형으로만 넣을 수 있음
} catch (Exception e) {
e.getStackTrace();
} finally {
try {
bs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// Json안에 있는 내용을 가져오기
public static Object getObjectFromJson(String filePath, Class cls) {
ObjectMapper om = new ObjectMapper();
Object obj = null;
try {
obj = om.readValue(new File(filePath), cls);
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
} catch (IOException e) {
e.printStackTrace();
}
return obj;
}
public static void writeJsonFile(String filePath, Object obj) {
ObjectMapper om = new ObjectMapper();
try {
om.writeValue(new File(filePath), obj);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void makeDir(String dirPath) {
File dir = new File(dirPath);
if (!dir.exists()) {
dir.mkdir();
}
}
}