From cd02b2304b833c4fdf9144270d2bbc6370cdf2d9 Mon Sep 17 00:00:00 2001 From: n-coding Date: Mon, 13 Aug 2018 22:18:07 +0900 Subject: [PATCH 01/11] =?UTF-8?q?git=E3=81=AE=E7=84=A1=E8=A6=96=E3=83=AA?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..215c811 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +target/ +savefile From 5f636fb37db24592b5236030e5541c4d6eb14a16 Mon Sep 17 00:00:00 2001 From: n-coding Date: Mon, 13 Aug 2018 22:18:57 +0900 Subject: [PATCH 02/11] =?UTF-8?q?author=E3=82=92Book=E3=82=AA=E3=83=96?= =?UTF-8?q?=E3=82=B8=E3=82=A7=E3=82=AF=E3=83=88=E3=81=AE=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=80=8B=E6=89=80=E3=82=92=E5=BE=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/jp/co/training/InsertCommand.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/jp/co/training/InsertCommand.java b/src/main/java/jp/co/training/InsertCommand.java index 80e02fe..1da22fa 100644 --- a/src/main/java/jp/co/training/InsertCommand.java +++ b/src/main/java/jp/co/training/InsertCommand.java @@ -46,8 +46,7 @@ public Result validate() { .author(argments.get(2)) .publisher(argments.get(3)) .publicationDate(argments.get(4)) - .author(argments.get(5)) - .price(argments.get(6)) + .price(argments.get(5)) .build(); result.getErrMesages().addAll(book.validate().getErrMesages()); From 03374268e6f3034b02f1a7e847532e7089fcdaf1 Mon Sep 17 00:00:00 2001 From: n-coding Date: Thu, 16 Aug 2018 23:05:31 +0900 Subject: [PATCH 03/11] =?UTF-8?q?=E3=83=90=E3=83=AA=E3=83=87=E3=83=BC?= =?UTF-8?q?=E3=83=88=E5=87=A6=E7=90=86=E3=82=92=E8=BF=BD=E8=A8=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/jp/co/training/Book.java | 25 ++++++++---- src/main/java/jp/co/training/BookUtil.java | 40 +++++++++++++++++-- src/main/java/jp/co/training/Const.java | 1 + .../java/jp/co/training/InsertCommand.java | 12 +++--- 4 files changed, 61 insertions(+), 17 deletions(-) diff --git a/src/main/java/jp/co/training/Book.java b/src/main/java/jp/co/training/Book.java index ad5515a..82ecfc5 100644 --- a/src/main/java/jp/co/training/Book.java +++ b/src/main/java/jp/co/training/Book.java @@ -1,5 +1,6 @@ package jp.co.training; +import static jp.co.training.Const.DATE_PATTERN; import static jp.co.training.Const.MAX_AUTHOR; import static jp.co.training.Const.MAX_BOOK_NAME; import static jp.co.training.Const.MAX_ISBN; @@ -15,18 +16,27 @@ public class Book { private final String publicationDate; private final String price; - public Result validate() { Result result = new Result(); - //最大最小チェック - BookUtil.checkRange(isbn, 1, MAX_ISBN, "ISBM").ifPresent(msg -> result.addErrMessage(msg)); - BookUtil.checkRange(bookName, 1, MAX_BOOK_NAME, "BOOK_NAME").ifPresent(msg -> result.addErrMessage(msg)); - BookUtil.checkRange(author, 1, MAX_AUTHOR, "AUTHOR").ifPresent(msg -> result.addErrMessage(msg)); - BookUtil.checkRange(publisher, 1, MAX_PUBLISHER, "PUBLISHER").ifPresent(msg -> result.addErrMessage(msg)); - BookUtil.checkRange(price, 1, MAX_PRICE, "PRICE").ifPresent(msg -> result.addErrMessage(msg)); + //isbn + BookUtil.checkLength(isbn, 1, MAX_ISBN).ifPresent(msg -> result.addErrMessage("ISBM:" + msg)); + + //bookName + BookUtil.checkLength(bookName, 1, MAX_BOOK_NAME).ifPresent(msg -> result.addErrMessage("BOOK_NAME:" + msg)); + + //author + BookUtil.checkLength(author, 1, MAX_AUTHOR).ifPresent(msg -> result.addErrMessage("AUTHOR" + msg)); + //publisher + BookUtil.checkLength(publisher, 1, MAX_PUBLISHER).ifPresent(msg -> result.addErrMessage("PUBLISHER:" + msg)); + //price + BookUtil.checkLength(price, 1, MAX_PRICE).ifPresent(msg -> result.addErrMessage("PRICE:" + msg)); + BookUtil.checkNumber(price).ifPresent(msg -> result.addErrMessage("PRICE:" + msg)); + + //publicationDate + BookUtil.checkDatePattern(publicationDate, DATE_PATTERN).ifPresent(msg -> result.addErrMessage("PUBLICATION_DATE:" + msg)); return result; } @@ -65,6 +75,7 @@ private Book(Builder builder) { } public static class Builder { + private String isbn; private String bookName; private String author; diff --git a/src/main/java/jp/co/training/BookUtil.java b/src/main/java/jp/co/training/BookUtil.java index 19e52b7..b44156e 100644 --- a/src/main/java/jp/co/training/BookUtil.java +++ b/src/main/java/jp/co/training/BookUtil.java @@ -1,6 +1,10 @@ package jp.co.training; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.Optional; +import java.util.regex.Pattern; public class BookUtil { @@ -15,15 +19,43 @@ private BookUtil() { * @param target : * @param min * @param max - * @param targetName * @return */ - public static Optional checkRange(String target, int min, int max, String targetName) { + public static Optional checkLength(String target, int min, int max) { if (target.length() < min) { - return Optional.of(targetName + "of size: min is " + min + ". but your input is " + target.length() + "."); + return Optional.of("the length must be " + min + " or more. but actual is " + target.length() + "."); } else if (target.length() > max) { - return Optional.of(targetName + "of size: max is " + max + ". but your input is " + target.length() + "."); + return Optional.of("the length must be " + max + " or less. but actual is " + target.length() + "."); } return Optional.empty(); } + + public static Optional checkDatePattern(String target, String pattern) { + DateTimeFormatter df = DateTimeFormatter.ofPattern(pattern); + try { + LocalDate.parse(target, df); + } catch (DateTimeParseException e) { + return Optional.of("Invalid Pattern. valid pattern is " + pattern + "."); + } + return Optional.empty(); + } + + public static Optional checkNumber(String target) { + if (!isNumber(target)) { + return Optional.of("It is not a numerical format."); + } + return Optional.empty(); + } + + /** + * valueが数値文字列の場合、または空文字の場合はtrueを返す + * + * @param value + * @return + */ + private static boolean isNumber(String value) { + return Pattern.compile("^[0-9]*$").matcher(value).matches(); +// return false; + } + } diff --git a/src/main/java/jp/co/training/Const.java b/src/main/java/jp/co/training/Const.java index a4a3ab8..594d55e 100644 --- a/src/main/java/jp/co/training/Const.java +++ b/src/main/java/jp/co/training/Const.java @@ -13,6 +13,7 @@ public final class Const { public static final int MAX_AUTHOR = 30; public static final int MAX_PUBLISHER = 30; public static final int MAX_PRICE = 9; + public static final String DATE_PATTERN = "yyyyMMdd"; //外部ファイルによる設定が可能な定数 public static final String PROMPT; diff --git a/src/main/java/jp/co/training/InsertCommand.java b/src/main/java/jp/co/training/InsertCommand.java index 1da22fa..3aa6f1c 100644 --- a/src/main/java/jp/co/training/InsertCommand.java +++ b/src/main/java/jp/co/training/InsertCommand.java @@ -41,12 +41,12 @@ public Result validate() { if (argments.size() != 6) { result.addErrMessage("SyntaxError. The number of arguments does not match."); } - book = new Book.Builder().isbn(argments.get(0)) - .bookName(argments.get(1)) - .author(argments.get(2)) - .publisher(argments.get(3)) - .publicationDate(argments.get(4)) - .price(argments.get(5)) + book = new Book.Builder().isbn(argments.get(0).trim()) + .bookName(argments.get(1).trim()) + .author(argments.get(2).trim()) + .publisher(argments.get(3).trim()) + .publicationDate(argments.get(4).trim()) + .price(argments.get(5).trim()) .build(); result.getErrMesages().addAll(book.validate().getErrMesages()); From d8b725d0892025ef2ad955c7239de9fa9760587e Mon Sep 17 00:00:00 2001 From: n-coding Date: Sun, 19 Aug 2018 20:20:31 +0900 Subject: [PATCH 04/11] =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=AF=E3=83=88?= =?UTF-8?q?=E3=83=AA=E3=83=BC=E3=81=AB=E6=B8=A1=E3=81=99=E6=96=87=E5=AD=97?= =?UTF-8?q?=E5=88=97=E3=82=92=E5=B0=8F=E6=96=87=E5=AD=97=E3=81=AB=E3=81=99?= =?UTF-8?q?=E3=82=8B=E5=87=A6=E7=90=86=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/jp/co/training/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/jp/co/training/Main.java b/src/main/java/jp/co/training/Main.java index 8bca169..e09116a 100644 --- a/src/main/java/jp/co/training/Main.java +++ b/src/main/java/jp/co/training/Main.java @@ -14,7 +14,7 @@ public static void main(String... args) throws FileNotFoundException, IOExceptio try (Scanner scan = new Scanner(System.in)) { while (true) { System.out.print(PROMPT); - Command command = CommandFactory.createCommand(scan.next()); + Command command = CommandFactory.createCommand(scan.next().toLowerCase()); List argments = Arrays.asList(scan.nextLine().split(DELIMITER)); command.setArgments(argments); From c974380ad99bab7526542eddddeb99ce527fefc7 Mon Sep 17 00:00:00 2001 From: n-coding Date: Sun, 19 Aug 2018 11:03:11 +0900 Subject: [PATCH 05/11] =?UTF-8?q?=E3=83=90=E3=83=AA=E3=83=87=E3=83=BC?= =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=80=81=E5=AE=9F=E8=A1=8C=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=81=AE=E7=B5=90=E6=9E=9C=E3=81=AB=E5=BF=9C=E3=81=98?= =?UTF-8?q?=E3=81=A6=E3=83=97=E3=83=AD=E3=82=B0=E3=83=A9=E3=83=A0=E3=81=AE?= =?UTF-8?q?=E7=B5=82=E4=BA=86=E7=B6=99=E7=B6=9A=E3=82=92=E5=88=B6=E5=BE=A1?= =?UTF-8?q?=E3=81=99=E3=82=8B=E5=87=A6=E7=90=86=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/jp/co/training/Command.java | 2 +- src/main/java/jp/co/training/Const.java | 3 +++ src/main/java/jp/co/training/ExitCommand.java | 9 ++++--- .../java/jp/co/training/InsertCommand.java | 15 ++++++++--- .../java/jp/co/training/InvalidCommand.java | 6 +++-- src/main/java/jp/co/training/Main.java | 26 ++++++++++++++----- src/main/java/jp/co/training/Result.java | 18 ++++++++++--- src/main/java/jp/co/training/StatusCode.java | 9 +++++++ 8 files changed, 68 insertions(+), 20 deletions(-) create mode 100644 src/main/java/jp/co/training/StatusCode.java diff --git a/src/main/java/jp/co/training/Command.java b/src/main/java/jp/co/training/Command.java index 538072e..4b28041 100644 --- a/src/main/java/jp/co/training/Command.java +++ b/src/main/java/jp/co/training/Command.java @@ -6,7 +6,7 @@ public interface Command { void setArgments(List argments); - void execute(); + Result execute(); Result validate(); } diff --git a/src/main/java/jp/co/training/Const.java b/src/main/java/jp/co/training/Const.java index 594d55e..5b3b4a8 100644 --- a/src/main/java/jp/co/training/Const.java +++ b/src/main/java/jp/co/training/Const.java @@ -17,11 +17,13 @@ public final class Const { //外部ファイルによる設定が可能な定数 public static final String PROMPT; + public static final String END_MESSAGE; public static final String DELIMITER; public static final String SAVE_FILE; //外部ファイルの設定ファイルのキー private static final String PROMPT_KEY = "prompt"; + private static final String END_MESSAGE_KEY = "end.message"; private static final String DELIMITER_KEY = "delimiter"; private static final String SAVE_FILE_KEY = "save.file"; @@ -30,6 +32,7 @@ public final class Const { PROMPT = (rb == null || !rb.containsKey(PROMPT_KEY)) ? "books>" : rb.getString(PROMPT_KEY); DELIMITER = (rb == null || !rb.containsKey(DELIMITER_KEY)) ? "," : rb.getString(DELIMITER_KEY); SAVE_FILE = (rb == null || !rb.containsKey(SAVE_FILE_KEY)) ? "savefile" : rb.getString(SAVE_FILE_KEY); + END_MESSAGE = (rb == null || !rb.containsKey(END_MESSAGE_KEY)) ? "bye." : rb.getString(END_MESSAGE_KEY); } private static ResourceBundle loadResource() { diff --git a/src/main/java/jp/co/training/ExitCommand.java b/src/main/java/jp/co/training/ExitCommand.java index 8487f8f..0723af0 100644 --- a/src/main/java/jp/co/training/ExitCommand.java +++ b/src/main/java/jp/co/training/ExitCommand.java @@ -4,10 +4,14 @@ public final class ExitCommand implements Command { + private final Result result = new Result(); + private List argments; + @Override - public void execute() { - System.exit(0); + public Result execute() { + result.setCode(StatusCode.BREAK); + return result; } @Override @@ -17,7 +21,6 @@ public void setArgments(List argments) { @Override public Result validate() { - Result result = new Result(); //パラメータ数 if (argments != null && !argments.isEmpty()) { if (argments.size() == 1 && argments.get(0).trim().equals("")) { diff --git a/src/main/java/jp/co/training/InsertCommand.java b/src/main/java/jp/co/training/InsertCommand.java index 3aa6f1c..e6da98c 100644 --- a/src/main/java/jp/co/training/InsertCommand.java +++ b/src/main/java/jp/co/training/InsertCommand.java @@ -11,6 +11,7 @@ import static jp.co.training.Const.SAVE_FILE; public final class InsertCommand implements Command { + private final Result result = new Result(); private List argments; @@ -22,7 +23,7 @@ public void setArgments(List argments) { } @Override - public void execute() { + public Result execute() { try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(SAVE_FILE, true), StandardCharsets.UTF_8))) { for (int i = 0, size = argments.size(); i < size; i++) { bw.write((i == 0 ? "" : ",") + argments.get(i).trim()); @@ -32,15 +33,18 @@ public void execute() { Logger.getLogger(InsertCommand.class.getName()).log(Level.SEVERE, null, ex); } System.out.println("inserted."); + return result; } @Override public Result validate() { - Result result = new Result(); - //パラメータ数 + //パラメータ数チェック if (argments.size() != 6) { result.addErrMessage("SyntaxError. The number of arguments does not match."); + result.setCode(StatusCode.CONTINUE); + return result; } + //書籍情報のチェック book = new Book.Builder().isbn(argments.get(0).trim()) .bookName(argments.get(1).trim()) .author(argments.get(2).trim()) @@ -48,7 +52,10 @@ public Result validate() { .publicationDate(argments.get(4).trim()) .price(argments.get(5).trim()) .build(); - result.getErrMesages().addAll(book.validate().getErrMesages()); + result.getMesages().addAll(book.validate().getMesages()); + if (!result.getMesages().isEmpty()) { + result.setCode(StatusCode.CONTINUE); + } return result; } diff --git a/src/main/java/jp/co/training/InvalidCommand.java b/src/main/java/jp/co/training/InvalidCommand.java index f5063ba..1d13d54 100644 --- a/src/main/java/jp/co/training/InvalidCommand.java +++ b/src/main/java/jp/co/training/InvalidCommand.java @@ -3,18 +3,20 @@ import java.util.List; public final class InvalidCommand implements Command { + private final Result result = new Result(); @Override public void setArgments(List argments) { } @Override - public void execute() { + public Result execute() { + return result; } @Override public Result validate() { - Result result = new Result(); + result.setCode(StatusCode.CONTINUE); result.addErrMessage("Invalid Command."); return result; } diff --git a/src/main/java/jp/co/training/Main.java b/src/main/java/jp/co/training/Main.java index 8bca169..66adc4c 100644 --- a/src/main/java/jp/co/training/Main.java +++ b/src/main/java/jp/co/training/Main.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Scanner; import static jp.co.training.Const.DELIMITER; +import static jp.co.training.Const.END_MESSAGE; import static jp.co.training.Const.PROMPT; public final class Main { @@ -18,14 +19,27 @@ public static void main(String... args) throws FileNotFoundException, IOExceptio List argments = Arrays.asList(scan.nextLine().split(DELIMITER)); command.setArgments(argments); - Result result = command.validate(); - if (result != null && result.getErrMesages().size() > 0) { - result.getErrMesages().stream().forEach(message -> { - System.err.println(message); - }); + if (validate(command)) { + continue; + } + if (command.execute().getCode() == StatusCode.BREAK) { + System.out.println(END_MESSAGE); + break; } - command.execute(); } } } + + private static boolean validate(Command command) { + Result result = command.validate(); + if (result != null && result.getMesages().size() > 0) { + result.getMesages().stream().forEach(message -> { + System.out.println(message); + }); + } + if (result != null && result.getCode() == StatusCode.CONTINUE) { + return true; + } + return false; + } } diff --git a/src/main/java/jp/co/training/Result.java b/src/main/java/jp/co/training/Result.java index 6e0a6e2..83c390a 100644 --- a/src/main/java/jp/co/training/Result.java +++ b/src/main/java/jp/co/training/Result.java @@ -5,13 +5,23 @@ public class Result { - private final List errMesages = new ArrayList<>(); + private StatusCode code = StatusCode.KEEP; + private final List mesages = new ArrayList<>(); - public List getErrMesages() { - return errMesages; + public List getMesages() { + return mesages; } public void addErrMessage(String msg) { - errMesages.add(msg); + mesages.add(msg); } + + public StatusCode getCode() { + return code; + } + + public void setCode(StatusCode code) { + this.code = code; + } + } diff --git a/src/main/java/jp/co/training/StatusCode.java b/src/main/java/jp/co/training/StatusCode.java new file mode 100644 index 0000000..4d9d850 --- /dev/null +++ b/src/main/java/jp/co/training/StatusCode.java @@ -0,0 +1,9 @@ +package jp.co.training; + +public enum StatusCode { + + KEEP,//そのまま継続 + CONTINUE,//ループの最初に戻る + BREAK//ループを抜ける + +} From 35800c499a30fefe94d584225ca2b69c101a5b4b Mon Sep 17 00:00:00 2001 From: n-coding Date: Sun, 19 Aug 2018 11:23:02 +0900 Subject: [PATCH 06/11] =?UTF-8?q?book=E3=81=AE=E7=99=BB=E9=8C=B2=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/jp/co/training/InsertCommand.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/jp/co/training/InsertCommand.java b/src/main/java/jp/co/training/InsertCommand.java index e6da98c..2f6b896 100644 --- a/src/main/java/jp/co/training/InsertCommand.java +++ b/src/main/java/jp/co/training/InsertCommand.java @@ -25,9 +25,13 @@ public void setArgments(List argments) { @Override public Result execute() { try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(SAVE_FILE, true), StandardCharsets.UTF_8))) { - for (int i = 0, size = argments.size(); i < size; i++) { - bw.write((i == 0 ? "" : ",") + argments.get(i).trim()); - } + bw.write(book.getIsbn()); + bw.write(book.getBookName()); + bw.write(book.getAuthor()); + bw.write(book.getPublisher()); + bw.write(book.getPublicationDate()); + bw.write(book.getPrice()); + bw.newLine(); } catch (IOException ex) { Logger.getLogger(InsertCommand.class.getName()).log(Level.SEVERE, null, ex); From fbe0fe6efda6df3c5a67391c2589eac3a18eca64 Mon Sep 17 00:00:00 2001 From: n-coding Date: Sun, 19 Aug 2018 21:30:40 +0900 Subject: [PATCH 07/11] =?UTF-8?q?=E3=83=90=E3=83=AA=E3=83=87=E3=83=BC?= =?UTF-8?q?=E3=83=88=E3=81=A8=E3=82=A8=E3=82=B0=E3=82=BC=E3=82=AD=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E3=83=88=E3=81=AE=E5=87=A6=E7=90=86=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/jp/co/training/ExitCommand.java | 2 +- .../java/jp/co/training/InsertCommand.java | 10 ++++------ .../java/jp/co/training/InvalidCommand.java | 5 +++-- src/main/java/jp/co/training/Main.java | 20 +++++++++++-------- src/main/java/jp/co/training/Result.java | 6 +++--- .../training/{StatusCode.java => Status.java} | 2 +- 6 files changed, 24 insertions(+), 21 deletions(-) rename src/main/java/jp/co/training/{StatusCode.java => Status.java} (84%) diff --git a/src/main/java/jp/co/training/ExitCommand.java b/src/main/java/jp/co/training/ExitCommand.java index 0723af0..7adc2be 100644 --- a/src/main/java/jp/co/training/ExitCommand.java +++ b/src/main/java/jp/co/training/ExitCommand.java @@ -10,7 +10,7 @@ public final class ExitCommand implements Command { @Override public Result execute() { - result.setCode(StatusCode.BREAK); + result.setCode(Status.BREAK); return result; } diff --git a/src/main/java/jp/co/training/InsertCommand.java b/src/main/java/jp/co/training/InsertCommand.java index 2f6b896..144a7c5 100644 --- a/src/main/java/jp/co/training/InsertCommand.java +++ b/src/main/java/jp/co/training/InsertCommand.java @@ -6,11 +6,10 @@ import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; import static jp.co.training.Const.SAVE_FILE; public final class InsertCommand implements Command { + private final Result result = new Result(); private List argments; @@ -31,10 +30,9 @@ public Result execute() { bw.write(book.getPublisher()); bw.write(book.getPublicationDate()); bw.write(book.getPrice()); - bw.newLine(); } catch (IOException ex) { - Logger.getLogger(InsertCommand.class.getName()).log(Level.SEVERE, null, ex); + System.out.println(SAVE_FILE + ": cannot open."); } System.out.println("inserted."); return result; @@ -45,7 +43,7 @@ public Result validate() { //パラメータ数チェック if (argments.size() != 6) { result.addErrMessage("SyntaxError. The number of arguments does not match."); - result.setCode(StatusCode.CONTINUE); + result.setCode(Status.CONTINUE); return result; } //書籍情報のチェック @@ -58,7 +56,7 @@ public Result validate() { .build(); result.getMesages().addAll(book.validate().getMesages()); if (!result.getMesages().isEmpty()) { - result.setCode(StatusCode.CONTINUE); + result.setCode(Status.CONTINUE); } return result; diff --git a/src/main/java/jp/co/training/InvalidCommand.java b/src/main/java/jp/co/training/InvalidCommand.java index 1d13d54..a4a7d5b 100644 --- a/src/main/java/jp/co/training/InvalidCommand.java +++ b/src/main/java/jp/co/training/InvalidCommand.java @@ -3,6 +3,7 @@ import java.util.List; public final class InvalidCommand implements Command { + private final Result result = new Result(); @Override @@ -11,12 +12,12 @@ public void setArgments(List argments) { @Override public Result execute() { - return result; + throw new UnsupportedOperationException("Execute invalid Command."); } @Override public Result validate() { - result.setCode(StatusCode.CONTINUE); + result.setCode(Status.CONTINUE); result.addErrMessage("Invalid Command."); return result; } diff --git a/src/main/java/jp/co/training/Main.java b/src/main/java/jp/co/training/Main.java index 5e6b71c..8504cc4 100644 --- a/src/main/java/jp/co/training/Main.java +++ b/src/main/java/jp/co/training/Main.java @@ -6,7 +6,6 @@ import java.util.List; import java.util.Scanner; import static jp.co.training.Const.DELIMITER; -import static jp.co.training.Const.END_MESSAGE; import static jp.co.training.Const.PROMPT; public final class Main { @@ -17,29 +16,34 @@ public static void main(String... args) throws FileNotFoundException, IOExceptio System.out.print(PROMPT); Command command = CommandFactory.createCommand(scan.next().toLowerCase()); List argments = Arrays.asList(scan.nextLine().split(DELIMITER)); - command.setArgments(argments); if (validate(command)) { continue; } - if (command.execute().getCode() == StatusCode.BREAK) { - System.out.println(END_MESSAGE); + if (execute(command)) { break; } } } } + private static boolean execute(Command command) { + Result result = command.execute(); + outputMessages(result); + return result != null && result.getCode() == Status.BREAK; + } + private static boolean validate(Command command) { Result result = command.validate(); + outputMessages(result); + return result != null && result.getCode() == Status.CONTINUE; + } + + private static void outputMessages(Result result) { if (result != null && result.getMesages().size() > 0) { result.getMesages().stream().forEach(message -> { System.out.println(message); }); } - if (result != null && result.getCode() == StatusCode.CONTINUE) { - return true; - } - return false; } } diff --git a/src/main/java/jp/co/training/Result.java b/src/main/java/jp/co/training/Result.java index 83c390a..c23b453 100644 --- a/src/main/java/jp/co/training/Result.java +++ b/src/main/java/jp/co/training/Result.java @@ -5,7 +5,7 @@ public class Result { - private StatusCode code = StatusCode.KEEP; + private Status code = Status.KEEP; private final List mesages = new ArrayList<>(); public List getMesages() { @@ -16,11 +16,11 @@ public void addErrMessage(String msg) { mesages.add(msg); } - public StatusCode getCode() { + public Status getCode() { return code; } - public void setCode(StatusCode code) { + public void setCode(Status code) { this.code = code; } diff --git a/src/main/java/jp/co/training/StatusCode.java b/src/main/java/jp/co/training/Status.java similarity index 84% rename from src/main/java/jp/co/training/StatusCode.java rename to src/main/java/jp/co/training/Status.java index 4d9d850..89bbd0d 100644 --- a/src/main/java/jp/co/training/StatusCode.java +++ b/src/main/java/jp/co/training/Status.java @@ -1,6 +1,6 @@ package jp.co.training; -public enum StatusCode { +public enum Status { KEEP,//そのまま継続 CONTINUE,//ループの最初に戻る From a9317b0f61f91ab5822863e3dbd0199552da5269 Mon Sep 17 00:00:00 2001 From: n-coding Date: Sun, 19 Aug 2018 22:03:21 +0900 Subject: [PATCH 08/11] =?UTF-8?q?Command=E3=82=A4=E3=83=B3=E3=82=BF?= =?UTF-8?q?=E3=83=BC=E3=83=95=E3=82=A7=E3=83=BC=E3=82=B9=E3=81=8B=E3=82=89?= =?UTF-8?q?validate=E3=82=92=E9=99=A4=E5=8E=BB=E3=80=82=E3=83=90=E3=83=AA?= =?UTF-8?q?=E3=83=87=E3=83=BC=E3=83=88=E3=81=AFexecute=E3=83=A1=E3=82=BD?= =?UTF-8?q?=E3=83=83=E3=83=89=E3=81=AE=E4=B8=AD=E3=81=A7=E5=AE=9F=E6=96=BD?= =?UTF-8?q?=E3=81=99=E3=82=8B=E5=BD=A2=E3=81=AB=E5=A4=89=E6=9B=B4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/jp/co/training/Book.java | 14 ++--- src/main/java/jp/co/training/Command.java | 5 +- src/main/java/jp/co/training/ExitCommand.java | 21 +------- .../java/jp/co/training/InsertCommand.java | 51 ++++++++++--------- .../java/jp/co/training/InvalidCommand.java | 12 +---- src/main/java/jp/co/training/Main.java | 25 ++------- src/main/java/jp/co/training/Result.java | 12 ++--- src/main/java/jp/co/training/Status.java | 1 - 8 files changed, 50 insertions(+), 91 deletions(-) diff --git a/src/main/java/jp/co/training/Book.java b/src/main/java/jp/co/training/Book.java index 82ecfc5..9ebb507 100644 --- a/src/main/java/jp/co/training/Book.java +++ b/src/main/java/jp/co/training/Book.java @@ -20,23 +20,23 @@ public Result validate() { Result result = new Result(); //isbn - BookUtil.checkLength(isbn, 1, MAX_ISBN).ifPresent(msg -> result.addErrMessage("ISBM:" + msg)); + BookUtil.checkLength(isbn, 1, MAX_ISBN).ifPresent(msg -> result.addMessage("ISBM:" + msg)); //bookName - BookUtil.checkLength(bookName, 1, MAX_BOOK_NAME).ifPresent(msg -> result.addErrMessage("BOOK_NAME:" + msg)); + BookUtil.checkLength(bookName, 1, MAX_BOOK_NAME).ifPresent(msg -> result.addMessage("BOOK_NAME:" + msg)); //author - BookUtil.checkLength(author, 1, MAX_AUTHOR).ifPresent(msg -> result.addErrMessage("AUTHOR" + msg)); + BookUtil.checkLength(author, 1, MAX_AUTHOR).ifPresent(msg -> result.addMessage("AUTHOR" + msg)); //publisher - BookUtil.checkLength(publisher, 1, MAX_PUBLISHER).ifPresent(msg -> result.addErrMessage("PUBLISHER:" + msg)); + BookUtil.checkLength(publisher, 1, MAX_PUBLISHER).ifPresent(msg -> result.addMessage("PUBLISHER:" + msg)); //price - BookUtil.checkLength(price, 1, MAX_PRICE).ifPresent(msg -> result.addErrMessage("PRICE:" + msg)); - BookUtil.checkNumber(price).ifPresent(msg -> result.addErrMessage("PRICE:" + msg)); + BookUtil.checkLength(price, 1, MAX_PRICE).ifPresent(msg -> result.addMessage("PRICE:" + msg)); + BookUtil.checkNumber(price).ifPresent(msg -> result.addMessage("PRICE:" + msg)); //publicationDate - BookUtil.checkDatePattern(publicationDate, DATE_PATTERN).ifPresent(msg -> result.addErrMessage("PUBLICATION_DATE:" + msg)); + BookUtil.checkDatePattern(publicationDate, DATE_PATTERN).ifPresent(msg -> result.addMessage("PUBLICATION_DATE:" + msg)); return result; } diff --git a/src/main/java/jp/co/training/Command.java b/src/main/java/jp/co/training/Command.java index 4b28041..6c351f0 100644 --- a/src/main/java/jp/co/training/Command.java +++ b/src/main/java/jp/co/training/Command.java @@ -1,12 +1,9 @@ package jp.co.training; -import java.util.List; - public interface Command { - void setArgments(List argments); + void setArgments(String[] argments); Result execute(); - Result validate(); } diff --git a/src/main/java/jp/co/training/ExitCommand.java b/src/main/java/jp/co/training/ExitCommand.java index 7adc2be..6008b4d 100644 --- a/src/main/java/jp/co/training/ExitCommand.java +++ b/src/main/java/jp/co/training/ExitCommand.java @@ -1,34 +1,17 @@ package jp.co.training; -import java.util.List; - public final class ExitCommand implements Command { private final Result result = new Result(); - private List argments; - @Override public Result execute() { - result.setCode(Status.BREAK); + result.setExit(true); return result; } @Override - public void setArgments(List argments) { - this.argments = argments; - } - - @Override - public Result validate() { - //パラメータ数 - if (argments != null && !argments.isEmpty()) { - if (argments.size() == 1 && argments.get(0).trim().equals("")) { - return result; - } - result.addErrMessage("SyntaxError. The number of arguments does not match."); - } - return result; + public void setArgments(String[] argments) { } } diff --git a/src/main/java/jp/co/training/InsertCommand.java b/src/main/java/jp/co/training/InsertCommand.java index 144a7c5..d534670 100644 --- a/src/main/java/jp/co/training/InsertCommand.java +++ b/src/main/java/jp/co/training/InsertCommand.java @@ -5,24 +5,28 @@ import java.io.IOException; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; -import java.util.List; import static jp.co.training.Const.SAVE_FILE; public final class InsertCommand implements Command { private final Result result = new Result(); - - private List argments; - + private String[] argments; private Book book; @Override - public void setArgments(List argments) { + public void setArgments(String[] argments) { this.argments = argments; } @Override public Result execute() { + if (!validate()) { + return result; + } + return createBook(); + } + + private Result createBook() { try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(SAVE_FILE, true), StandardCharsets.UTF_8))) { bw.write(book.getIsbn()); bw.write(book.getBookName()); @@ -32,34 +36,33 @@ public Result execute() { bw.write(book.getPrice()); bw.newLine(); } catch (IOException ex) { - System.out.println(SAVE_FILE + ": cannot open."); + result.addMessage(SAVE_FILE + ": cannot open."); + result.setExit(true); + return result; } - System.out.println("inserted."); + result.addMessage("inserted."); return result; } - @Override - public Result validate() { + /* + 検証の結果OKならtrueを返す。それ以外はfalseを返す + */ + private boolean validate() { //パラメータ数チェック - if (argments.size() != 6) { - result.addErrMessage("SyntaxError. The number of arguments does not match."); - result.setCode(Status.CONTINUE); - return result; + if (argments.length != 6) { + result.addMessage("SyntaxError. The number of arguments does not match."); + return false; } //書籍情報のチェック - book = new Book.Builder().isbn(argments.get(0).trim()) - .bookName(argments.get(1).trim()) - .author(argments.get(2).trim()) - .publisher(argments.get(3).trim()) - .publicationDate(argments.get(4).trim()) - .price(argments.get(5).trim()) + book = new Book.Builder().isbn(argments[0].trim()) + .bookName(argments[1].trim()) + .author(argments[2].trim()) + .publisher(argments[3].trim()) + .publicationDate(argments[4].trim()) + .price(argments[5].trim()) .build(); result.getMesages().addAll(book.validate().getMesages()); - if (!result.getMesages().isEmpty()) { - result.setCode(Status.CONTINUE); - } - - return result; + return result.getMesages().isEmpty(); } } diff --git a/src/main/java/jp/co/training/InvalidCommand.java b/src/main/java/jp/co/training/InvalidCommand.java index a4a7d5b..585fd0e 100644 --- a/src/main/java/jp/co/training/InvalidCommand.java +++ b/src/main/java/jp/co/training/InvalidCommand.java @@ -1,24 +1,16 @@ package jp.co.training; -import java.util.List; - public final class InvalidCommand implements Command { private final Result result = new Result(); @Override - public void setArgments(List argments) { + public void setArgments(String[] argments) { } @Override public Result execute() { - throw new UnsupportedOperationException("Execute invalid Command."); - } - - @Override - public Result validate() { - result.setCode(Status.CONTINUE); - result.addErrMessage("Invalid Command."); + result.addMessage("Invalid Command."); return result; } diff --git a/src/main/java/jp/co/training/Main.java b/src/main/java/jp/co/training/Main.java index 8504cc4..41f97ac 100644 --- a/src/main/java/jp/co/training/Main.java +++ b/src/main/java/jp/co/training/Main.java @@ -2,8 +2,6 @@ import java.io.FileNotFoundException; import java.io.IOException; -import java.util.Arrays; -import java.util.List; import java.util.Scanner; import static jp.co.training.Const.DELIMITER; import static jp.co.training.Const.PROMPT; @@ -15,30 +13,17 @@ public static void main(String... args) throws FileNotFoundException, IOExceptio while (true) { System.out.print(PROMPT); Command command = CommandFactory.createCommand(scan.next().toLowerCase()); - List argments = Arrays.asList(scan.nextLine().split(DELIMITER)); - command.setArgments(argments); - if (validate(command)) { - continue; - } - if (execute(command)) { + command.setArgments(scan.nextLine().split(DELIMITER)); + + Result result = command.execute(); + outputMessages(result); + if (result != null && result.isExit()) { break; } } } } - private static boolean execute(Command command) { - Result result = command.execute(); - outputMessages(result); - return result != null && result.getCode() == Status.BREAK; - } - - private static boolean validate(Command command) { - Result result = command.validate(); - outputMessages(result); - return result != null && result.getCode() == Status.CONTINUE; - } - private static void outputMessages(Result result) { if (result != null && result.getMesages().size() > 0) { result.getMesages().stream().forEach(message -> { diff --git a/src/main/java/jp/co/training/Result.java b/src/main/java/jp/co/training/Result.java index c23b453..be2ecff 100644 --- a/src/main/java/jp/co/training/Result.java +++ b/src/main/java/jp/co/training/Result.java @@ -5,23 +5,23 @@ public class Result { - private Status code = Status.KEEP; + private boolean exit = false; private final List mesages = new ArrayList<>(); public List getMesages() { return mesages; } - public void addErrMessage(String msg) { + public void addMessage(String msg) { mesages.add(msg); } - public Status getCode() { - return code; + public boolean isExit() { + return exit; } - public void setCode(Status code) { - this.code = code; + public void setExit(boolean exit) { + this.exit = exit; } } diff --git a/src/main/java/jp/co/training/Status.java b/src/main/java/jp/co/training/Status.java index 89bbd0d..2379628 100644 --- a/src/main/java/jp/co/training/Status.java +++ b/src/main/java/jp/co/training/Status.java @@ -3,7 +3,6 @@ public enum Status { KEEP,//そのまま継続 - CONTINUE,//ループの最初に戻る BREAK//ループを抜ける } From 0b52cac785a53121a32583a7ac9fc6d9db75cbc1 Mon Sep 17 00:00:00 2001 From: n-coding Date: Mon, 20 Aug 2018 17:39:58 +0900 Subject: [PATCH 09/11] =?UTF-8?q?(=E5=BE=AE=E4=BF=AE=E6=AD=A3)=E5=AE=9A?= =?UTF-8?q?=E6=95=B0=E3=81=AE=E9=A0=86=E7=95=AA=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/jp/co/training/Const.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/jp/co/training/Const.java b/src/main/java/jp/co/training/Const.java index 5b3b4a8..24629ce 100644 --- a/src/main/java/jp/co/training/Const.java +++ b/src/main/java/jp/co/training/Const.java @@ -17,15 +17,15 @@ public final class Const { //外部ファイルによる設定が可能な定数 public static final String PROMPT; - public static final String END_MESSAGE; public static final String DELIMITER; public static final String SAVE_FILE; + public static final String END_MESSAGE; //外部ファイルの設定ファイルのキー private static final String PROMPT_KEY = "prompt"; - private static final String END_MESSAGE_KEY = "end.message"; private static final String DELIMITER_KEY = "delimiter"; private static final String SAVE_FILE_KEY = "save.file"; + private static final String END_MESSAGE_KEY = "end.message"; static { ResourceBundle rb = loadResource(); From 5ac52ee06ce869764a0a1ab259a6b3aba1a03606 Mon Sep 17 00:00:00 2001 From: n-coding Date: Mon, 20 Aug 2018 19:16:30 +0900 Subject: [PATCH 10/11] =?UTF-8?q?junit=E3=83=86=E3=82=B9=E3=83=88=E5=AE=9F?= =?UTF-8?q?=E8=A1=8C=E6=99=82=E3=81=AE=E6=96=87=E5=AD=97=E5=8C=96=E3=81=91?= =?UTF-8?q?=E3=82=92=E8=A7=A3=E6=B6=88=E3=81=99=E3=82=8B=E3=81=9F=E3=82=81?= =?UTF-8?q?=E3=81=AB=E3=83=97=E3=83=A9=E3=82=B0=E3=82=A4=E3=83=B3=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/pom.xml b/pom.xml index 4e600a4..2dc5e53 100644 --- a/pom.xml +++ b/pom.xml @@ -23,24 +23,16 @@ - + + org.apache.maven.plugins + maven-surefire-plugin + 2.18.1 + + + org.apache.maven.plugins + maven-surefire-report-plugin + 2.18.1 + @@ -49,5 +41,11 @@ commons-csv 1.5 + + junit + junit + 4.10 + test + \ No newline at end of file From d99701f3d4b40a5b5af885a4d2f207c82f3ed7ab Mon Sep 17 00:00:00 2001 From: n-coding Date: Sat, 25 Aug 2018 11:29:23 +0900 Subject: [PATCH 11/11] =?UTF-8?q?.gitignore=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 215c811..0000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -target/ -savefile