package board;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
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) {
Scanner scanner = new Scanner(System.in);
// 여러곳에서 자주 사용되는 로직을 담는다.
DB db = new DB();
db.loadGlobal();
// 데이터 Access Object, 오직 이 객체가, 실제로 어디에 파일이 저장되고,
// 어떤 형태로(XML 또는 JSON) 저장되는지 알고 있다.
ArticleDao articleDao = new ArticleDao(db);
// 핵심로직을 담고 있다.
ArticleService articleService = new ArticleService(articleDao);
// 고객의 요청을 받아서 service의 적절한 기능 호출
ArticleController controller = new ArticleController(articleService);
controller.setScanner(scanner);
controller.shwHelp();
while (true) {
System.out.print(" > ");
String cmd = scanner.next().trim();
if (cmd.equals("add")) {
scanner.nextLine();
controller.doCommandAdd();
}else if (cmd.equals("help")) {
controller.shwHelp();
} else if (cmd.equals("modify")) {
scanner.nextLine();
int num = scanner.nextInt();
controller.doCommandModify(num);
} else if (cmd.equals("delete")) {
scanner.nextLine();
controller.doCommandDelete();
} else if (cmd.equals("list")) {
scanner.nextLine();
controller.doCommandList();
} else if (cmd.equals("exit")) {
System.out.println("프로그램을 종료합니다.");
break;
}
}
scanner.close();
}
}
class ArticleController {
ArticleService articleService;
Scanner scanner;
ArticleController(ArticleService articleService) {
this.articleService = articleService;
}
public void setScanner(Scanner scanner) {
this.scanner =scanner;
}
void shwHelp() {
System.out.printf(" 명렁어 : add - 작성%n" + "\tmodify - 수정%n" + "\tdelete - 삭제%n" + "\tlist - 리스트%n");
}
void doCommandList() {
Article[] articles = articleService.getForListArticles();
System.out.println("==게시물 리스트==");
System.out.printf("%-4s/%-6s/%-10s%n","번호","제목","날짜");
for (int i = 0; i < articles.length; i++) {
System.out.printf("%d / %s / %s%n",articles[i].id,articles[i].title,articles[i].regDate);
}
}
void doCommandDelete() {
articleService.delete(4);
}
public void doCommandModify(int num) {
System.out.print("제목을 입력하세요. : ");
String title = scanner.nextLine();
System.out.print("내용을 입력하세요. : ");
String body = scanner.nextLine();
articleService.modify(num, title , body );
}
void doCommandAdd() {
System.out.print("제목을 입력하세요. : ");
String title = scanner.nextLine();
System.out.print("내용을 입력하세요. : ");
String body = scanner.nextLine();
articleService.add(title, body);
}
}
class ArticleService {
ArticleDao articleDao;
ArticleService(ArticleDao articleDao) {
this.articleDao = articleDao;
}
public Article[] getForListArticles() {
return articleDao.getArticlesOrderByIdDesc();
}
void delete(int id) {
articleDao.delete(id);
}
public void modify(int id, String title, String body) {
articleDao.modify(id, title, body);
}
void add(String title, String body) {
articleDao.add(title, body);
}
}
class ArticleDao {
DB db;
Article[] articles;
int lastArticleIndex;
int lastArticleId;
ArticleDao(DB db) {
this.db = db;
articles = db.getArticlesFromFiles();
for (int i = 0; i < articles.length; i++) {
if (articles[i] == null) {
lastArticleIndex = i - 1;
break;
}
}
lastArticleId = db.getLastArticleId();
}
public Article[] getArticlesOrderByIdDesc() {
Article[] articlesOrderByIdDesc = new Article[lastArticleIndex + 1];
int articlesOrderByIdDescIndex = 0;
for (int i = lastArticleIndex; i >= 0; i--) {
articlesOrderByIdDesc[articlesOrderByIdDescIndex] = articles[i];
articlesOrderByIdDescIndex++;
}
return articlesOrderByIdDesc;
}
void delete(int id) {
int index = getArticleIndexById(id);
if (index == -1) {
return;
}
for (int i = index; i < lastArticleIndex; i++) {
articles[i] = articles[i + 1];
}
String articleFilePath = id + ".txt";
db.deleteArticleJsonFile(articleFilePath);
}
void modify(int id, String title, String body) {
Article article = getArticleById(id);
article.title = title;
article.body = body;
String articleFilePath = article.id + ".txt";
db.writeArticleJsonFile(articleFilePath, article);
}
Article getArticleById(int id) {
int index = getArticleIndexById(id);
if (index >= 0) {
return articles[index];
}
return null;
}
int getArticleIndexById(int id) {
for (int i = 0; i <= lastArticleIndex; i++) {
if (articles[i].id == id) {
return i;
}
}
return -1;
}
void add(String title, String body) {
int id = lastArticleId + 1;
String regDate = Util.getNowDateStr();
Article article = new Article(id, regDate, title, body);
lastArticleIndex++;
articles[lastArticleIndex] = article;
String articleFilePath = article.id + ".txt";
db.writeArticleJsonFile(articleFilePath, article);
lastArticleId++;
db.updateLastArticleId(lastArticleId);
}
}
class Article {
public int id;
public String regDate;
public String title;
public String body;
public Article() {
}
public Article(int id, String regDate, String title, String body) {
super();
this.id = id;
this.regDate = regDate;
this.title = title;
this.body = body;
}
@Override
public String toString() {
return "Article [id=" + id + ", regDate=" + regDate + ", title=" + title + ", body=" + body + "]";
}
}
class DB {
Global global;
void init() {
loadGlobal();
}
public void deleteArticleJsonFile(String articleFilePath) {
deleteFile(articleFilePath);
}
public void deleteFile(String filePath) {
File file = new File(filePath);
if (file.exists()) {
file.delete();
}
}
void updateLastArticleId(int lastArticleId) {
global.lastArticleId = lastArticleId;
writeGlobalJsonFile("global.txt", global);
}
void writeArticleJsonFile(String filePath, Article article) {
ObjectMapper om = new ObjectMapper();
try {
om.writeValue(new File(filePath), article);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Article[] getArticlesFromFiles() {
Article[] articles = new Article[100];
int lastArticleId = getLastArticleId();
int articlesIndex = 0;
for (int i = 1; i <= lastArticleId; i++) {
String fileName = i + ".txt";
Article article = readArticleFromJsonFile(fileName);
if (article != null) {
articles[articlesIndex] = article;
articlesIndex++;
}
}
return articles;
}
void loadGlobal() {
global = readGlobalFromJsonFile("global.txt");
}
int getLastArticleId() {
return global.lastArticleId;
}
Article readArticleFromJsonFile(String filePath) {
ObjectMapper om = new ObjectMapper();
Article article = null;
try {
article = om.readValue(new File(filePath), Article.class);
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
} catch (IOException e) {
e.printStackTrace();
}
return article;
}
Global readGlobalFromJsonFile(String filePath) {
ObjectMapper om = new ObjectMapper();
Global global = null;
try {
global = om.readValue(new File(filePath), Global.class);
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
// 파일이 없으면 여기서 생성
global = new Global();
writeGlobalJsonFile(filePath, global);
}
return global;
}
void writeGlobalJsonFile(String filePath, Global global) {
ObjectMapper om = new ObjectMapper();
try {
om.writeValue(new File(filePath), global);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Util {
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;
}
}
class Global {
public int lastArticleId;
Global() {
lastArticleId = 0;
}
}
수업관련