본문 바로가기

수업관련

별로 못함

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;
	}
}

'수업관련' 카테고리의 다른 글

a  (0) 2020.05.22
로그인 메커니즘??  (0) 2020.05.22
젝슨  (0) 2020.05.21
회원  (0) 2020.05.21
게시판 에드 참조  (0) 2020.05.20