From e9434a04aebdb06736e19b4968ecb4b8b07cce21 Mon Sep 17 00:00:00 2001 From: Melvin Merk Date: Fri, 5 Mar 2021 14:36:17 +0100 Subject: [PATCH 01/19] Initial commit --- .../src/main/java/ch/heigvd/res/labio/impl/Application.java | 1 + 1 file changed, 1 insertion(+) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java index 25e835c..6e098a5 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java @@ -17,6 +17,7 @@ import java.util.logging.Level; import java.util.logging.Logger; + /** * * @author Olivier Liechti From d208f326812430203d49178f9f2f16da4109cd2b Mon Sep 17 00:00:00 2001 From: Melvin Merk Date: Fri, 5 Mar 2021 14:41:32 +0100 Subject: [PATCH 02/19] Initial commit --- .../src/main/java/ch/heigvd/res/labio/impl/Application.java | 1 - 1 file changed, 1 deletion(-) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java index 6e098a5..25e835c 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java @@ -17,7 +17,6 @@ import java.util.logging.Level; import java.util.logging.Logger; - /** * * @author Olivier Liechti From 93ec3fed1a6fbce2c6a7ad5ba3ef497c68d6e033 Mon Sep 17 00:00:00 2001 From: Melvin Merk Date: Fri, 5 Mar 2021 15:06:19 +0100 Subject: [PATCH 03/19] Start of file exporer fix --- .../java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java index b97c4a7..7d6ef53 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java @@ -17,6 +17,7 @@ public class DFSFileExplorer implements IFileExplorer { @Override public void explore(File rootDirectory, IFileVisitor vistor) { + // TODO throw new UnsupportedOperationException("The student has not implemented this method yet."); } From f3f0b8cee3f062defa96796eeb7ed7da4a84f07e Mon Sep 17 00:00:00 2001 From: Melvin Merk Date: Fri, 5 Mar 2021 15:55:02 +0100 Subject: [PATCH 04/19] File explorer passes test --- .../res/labio/impl/explorers/DFSFileExplorer.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java index 7d6ef53..ecc58bd 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java @@ -4,6 +4,8 @@ import ch.heigvd.res.labio.interfaces.IFileVisitor; import java.io.File; +import java.util.Arrays; +import java.util.Objects; /** * This implementation of the IFileExplorer interface performs a depth-first @@ -16,9 +18,14 @@ public class DFSFileExplorer implements IFileExplorer { @Override - public void explore(File rootDirectory, IFileVisitor vistor) { - // TODO - throw new UnsupportedOperationException("The student has not implemented this method yet."); - } + public void explore(File rootDirectory, IFileVisitor visitor) { + visitor.visit(rootDirectory); + if(rootDirectory.isDirectory()) { // Only recurse if rootDirectory is a directory + String[] filesPath = rootDirectory.list(); + for (String filePath : filesPath) { + explore(new File(rootDirectory + "/" + filePath), visitor); + } + } + } } From 1ef5b1112b947eeed51cba2c5d9dcdeeefbd4409 Mon Sep 17 00:00:00 2001 From: Melvin Merk Date: Fri, 5 Mar 2021 15:59:24 +0100 Subject: [PATCH 05/19] Removed unused imports --- .../ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java index ecc58bd..22d7d03 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java @@ -4,7 +4,6 @@ import ch.heigvd.res.labio.interfaces.IFileVisitor; import java.io.File; -import java.util.Arrays; import java.util.Objects; /** @@ -22,8 +21,7 @@ public void explore(File rootDirectory, IFileVisitor visitor) { visitor.visit(rootDirectory); if(rootDirectory.isDirectory()) { // Only recurse if rootDirectory is a directory - String[] filesPath = rootDirectory.list(); - for (String filePath : filesPath) { + for (String filePath : Objects.requireNonNull(rootDirectory.list())) { explore(new File(rootDirectory + "/" + filePath), visitor); } } From 64221f46e5e80936eddd6df928c0a0f33d64434d Mon Sep 17 00:00:00 2001 From: Melvin Merk Date: Fri, 5 Mar 2021 17:50:50 +0100 Subject: [PATCH 06/19] added sort --- .../ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java index 22d7d03..69eb81d 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java @@ -4,6 +4,7 @@ import ch.heigvd.res.labio.interfaces.IFileVisitor; import java.io.File; +import java.util.Arrays; import java.util.Objects; /** @@ -21,7 +22,9 @@ public void explore(File rootDirectory, IFileVisitor visitor) { visitor.visit(rootDirectory); if(rootDirectory.isDirectory()) { // Only recurse if rootDirectory is a directory - for (String filePath : Objects.requireNonNull(rootDirectory.list())) { + String[] paths = Objects.requireNonNull(rootDirectory.list()); + Arrays.sort(paths); // Sort the arrays so it is alphabetical order on every os + for (String filePath : paths) { explore(new File(rootDirectory + "/" + filePath), visitor); } } From 6c4c15b293943c8fa93818d8a90d6c5c6b909bd8 Mon Sep 17 00:00:00 2001 From: Melvin Merk Date: Fri, 12 Mar 2021 14:03:06 +0100 Subject: [PATCH 07/19] First version of utils --- .../java/ch/heigvd/res/labio/impl/Utils.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Utils.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Utils.java index c8a3a5a..dc13186 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Utils.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Utils.java @@ -20,7 +20,36 @@ public class Utils { * contain any line separator, then the first element is an empty string. */ public static String[] getNextLine(String lines) { - throw new UnsupportedOperationException("The student has not implemented this method yet."); + String[] array = new String[2]; + + array[0] = ""; + array[1] = lines; + + for(int i = 0; i < lines.length(); i++) { + char c = lines.charAt(i); + if(c == '\n') { + array[0] = lines.substring(0, i+1); + array[1] = lines.substring(i+1); + break; + } else if(c == '\r') { + if(i < lines.length()-1) { + + if(lines.charAt(i+1) == '\n') { + array[0] = lines.substring(0, i+2); + array[1] = lines.substring(i+2); + } else { + array[0] = lines.substring(0, i+1); + array[1] = lines.substring(i+1); + } + } else { + array[0] = lines.substring(0, i+1); + array[1] = lines.substring(i+1); + } + break; + } + } + + return array; } } From 70f854ba5691e6c69535e4b836d56eaf0f823fe9 Mon Sep 17 00:00:00 2001 From: Melvin Merk Date: Fri, 12 Mar 2021 14:28:55 +0100 Subject: [PATCH 08/19] new utils version --- .../java/ch/heigvd/res/labio/impl/Utils.java | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Utils.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Utils.java index dc13186..007884e 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Utils.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Utils.java @@ -23,33 +23,25 @@ public static String[] getNextLine(String lines) { String[] array = new String[2]; array[0] = ""; - array[1] = lines; + array[1] = lines; // Set default result if no new line separator for(int i = 0; i < lines.length(); i++) { char c = lines.charAt(i); - if(c == '\n') { - array[0] = lines.substring(0, i+1); - array[1] = lines.substring(i+1); - break; - } else if(c == '\r') { - if(i < lines.length()-1) { + if(c == '\n' || c == '\r') { + if(c == '\r' && i < lines.length()-1) { // Handle \r\n if(lines.charAt(i+1) == '\n') { array[0] = lines.substring(0, i+2); array[1] = lines.substring(i+2); - } else { - array[0] = lines.substring(0, i+1); - array[1] = lines.substring(i+1); + break; } - } else { - array[0] = lines.substring(0, i+1); - array[1] = lines.substring(i+1); } + array[0] = lines.substring(0, i+1); + array[1] = lines.substring(i+1); break; } } return array; } - } From 925de59b7c9ea9904be4dbb272a3bfe7aee4ccad Mon Sep 17 00:00:00 2001 From: gab-thr Date: Fri, 12 Mar 2021 15:24:53 +0100 Subject: [PATCH 09/19] add methods for storing quotes --- .../ch/heigvd/res/labio/impl/Application.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java index 25e835c..cab2170 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java @@ -9,10 +9,7 @@ import ch.heigvd.res.labio.quotes.QuoteClient; import org.apache.commons.io.FileUtils; -import java.io.File; -import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; +import java.io.*; import java.net.URISyntaxException; import java.util.logging.Level; import java.util.logging.Logger; @@ -98,6 +95,8 @@ public void fetchAndStoreQuotes(int numberOfQuotes) throws IOException { * one method provided by this class, which is responsible for storing the content of the * quote in a text file (and for generating the directories based on the tags). */ + // TODO : storeQuote(quote,); ? + storeQuote(quote, "quote-" + (i + 1) + ".utf8") ; LOG.info("Received a new joke with " + quote.getTags().size() + " tags."); for (String tag : quote.getTags()) { LOG.info("> " + tag); @@ -133,7 +132,17 @@ void clearOutputDirectory() throws IOException { * @throws IOException */ void storeQuote(Quote quote, String filename) throws IOException { - throw new UnsupportedOperationException("The student has not implemented this method yet."); + String path = WORKSPACE_DIRECTORY + "/"; + for (String tag : quote.getTags()) { + path += (tag + "/"); + } + + File file = new File(path); + file.mkdirs(); + path += filename; + FileWriter writer = new FileWriter(path); + writer.write(quote.getQuote()); + writer.close(); } /** @@ -144,12 +153,13 @@ void printFileNames(final Writer writer) { IFileExplorer explorer = new DFSFileExplorer(); explorer.explore(new File(WORKSPACE_DIRECTORY), new IFileVisitor() { @Override - public void visit(File file) { + public void visit(File file) throws IOException { /* * There is a missing piece here. Notice how we use an anonymous class here. We provide the implementation * of the the IFileVisitor interface inline. You just have to add the body of the visit method, which should * be pretty easy (we want to write the filename, including the path, to the writer passed in argument). */ + writer.write(file.getPath().toCharArray()); } }); } From 4e8ee8663d4f69c047451b96ac9d8269c3a1bdf2 Mon Sep 17 00:00:00 2001 From: gab-thr Date: Fri, 12 Mar 2021 15:33:47 +0100 Subject: [PATCH 10/19] update annotations --- .../src/main/java/ch/heigvd/res/labio/impl/Application.java | 2 +- .../ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java | 3 ++- .../java/ch/heigvd/res/labio/interfaces/IFileExplorer.java | 3 ++- .../java/ch/heigvd/res/labio/interfaces/IFileVisitor.java | 3 ++- .../heigvd/res/labio/impl/explorers/DFSFileExplorerTest.java | 4 ++-- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java index cab2170..dde0d03 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java @@ -149,7 +149,7 @@ void storeQuote(Quote quote, String filename) throws IOException { * This method uses a IFileExplorer to explore the file system and prints the name of each * encountered file and directory. */ - void printFileNames(final Writer writer) { + void printFileNames(final Writer writer) throws IOException { IFileExplorer explorer = new DFSFileExplorer(); explorer.explore(new File(WORKSPACE_DIRECTORY), new IFileVisitor() { @Override diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java index 69eb81d..fe6b2a9 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorer.java @@ -4,6 +4,7 @@ import ch.heigvd.res.labio.interfaces.IFileVisitor; import java.io.File; +import java.io.IOException; import java.util.Arrays; import java.util.Objects; @@ -18,7 +19,7 @@ public class DFSFileExplorer implements IFileExplorer { @Override - public void explore(File rootDirectory, IFileVisitor visitor) { + public void explore(File rootDirectory, IFileVisitor visitor) throws IOException { visitor.visit(rootDirectory); if(rootDirectory.isDirectory()) { // Only recurse if rootDirectory is a directory diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/interfaces/IFileExplorer.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/interfaces/IFileExplorer.java index 7d387e7..1dc83f3 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/interfaces/IFileExplorer.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/interfaces/IFileExplorer.java @@ -1,6 +1,7 @@ package ch.heigvd.res.labio.interfaces; import java.io.File; +import java.io.IOException; /** * This interface is used to perform one operation on each element (file and @@ -23,6 +24,6 @@ public interface IFileExplorer { * @param rootDirectory the directory where to start the traversal * @param vistor defines the operation to be performed on each file */ - public void explore(File rootDirectory, IFileVisitor vistor); + public void explore(File rootDirectory, IFileVisitor vistor) throws IOException; } diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/interfaces/IFileVisitor.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/interfaces/IFileVisitor.java index b0abe27..11ddfb2 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/interfaces/IFileVisitor.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/interfaces/IFileVisitor.java @@ -1,6 +1,7 @@ package ch.heigvd.res.labio.interfaces; import java.io.File; +import java.io.IOException; /** * This interface is used together with the IFileExplorer interface. It defines @@ -18,6 +19,6 @@ public interface IFileVisitor { * * @param file the current file or directory visited by the IFileExplorer instance */ - public void visit(File file); + public void visit(File file) throws IOException; } diff --git a/LabJavaIO/src/test/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorerTest.java b/LabJavaIO/src/test/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorerTest.java index e0fb8a1..efc45e2 100644 --- a/LabJavaIO/src/test/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorerTest.java +++ b/LabJavaIO/src/test/java/ch/heigvd/res/labio/impl/explorers/DFSFileExplorerTest.java @@ -23,7 +23,7 @@ public class DFSFileExplorerTest { private static final Logger LOG = Logger.getLogger(DFSFileExplorerTest.class.getName()); @Test - public void dfsExplorerShouldWork() { + public void dfsExplorerShouldWork() throws IOException { List dfsNodes = generateTestTree(5, 5, 5); final List directories = new ArrayList<>(); @@ -39,7 +39,7 @@ public void visit(File file) { } @Test - public void dfsExplorerShouldWorkWhenThereIsNoFile() { + public void dfsExplorerShouldWorkWhenThereIsNoFile() throws IOException { List dfsNodes = generateTestTree(0, 0, 0); final List directories = new ArrayList<>(); From f24c6417ee630e650cd7d4bb5320c9aa84a84de6 Mon Sep 17 00:00:00 2001 From: Melvin Merk Date: Fri, 12 Mar 2021 15:36:55 +0100 Subject: [PATCH 11/19] Uppercase file filter implementation --- .../res/labio/impl/filters/UpperCaseFilterWriter.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/UpperCaseFilterWriter.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/UpperCaseFilterWriter.java index 0f41a5d..433740c 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/UpperCaseFilterWriter.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/UpperCaseFilterWriter.java @@ -16,17 +16,20 @@ public UpperCaseFilterWriter(Writer wrappedWriter) { @Override public void write(String str, int off, int len) throws IOException { - throw new UnsupportedOperationException("The student has not implemented this method yet."); + super.write(str.substring(0, off) + str.substring(off, off+len).toUpperCase(), off, len); } @Override public void write(char[] cbuf, int off, int len) throws IOException { - throw new UnsupportedOperationException("The student has not implemented this method yet."); + + for(int i = off; i < off+len; i++) { + cbuf[i] = Character.toUpperCase(cbuf[i]); + } + super.write(cbuf, off, len); } @Override public void write(int c) throws IOException { - throw new UnsupportedOperationException("The student has not implemented this method yet."); + super.write(Character.toUpperCase(c)); } - } From 76ca9560d81955f060de75f1ba45928a86f049e7 Mon Sep 17 00:00:00 2001 From: Melvin Merk Date: Fri, 12 Mar 2021 16:07:35 +0100 Subject: [PATCH 12/19] file transformer impl --- .../labio/impl/transformers/CompleteFileTransformer.java | 5 ++--- .../res/labio/impl/transformers/FileTransformer.java | 7 +++++++ .../res/labio/impl/transformers/NoOpFileTransformer.java | 3 +-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/CompleteFileTransformer.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/CompleteFileTransformer.java index 4beca48..4decce8 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/CompleteFileTransformer.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/CompleteFileTransformer.java @@ -15,9 +15,6 @@ public class CompleteFileTransformer extends FileTransformer { @Override public Writer decorateWithFilters(Writer writer) { - if (true) { - throw new UnsupportedOperationException("The student has not implemented this method yet."); - } /* * If you uncomment the following line (and get rid of th 3 previous lines...), you will restore the decoration * of the writer (connected to the file. You can see that you first decorate the writer with an UpperCaseFilterWriter, which you then @@ -25,6 +22,8 @@ public Writer decorateWithFilters(Writer writer) { * input files. So, the input is first prefixed with line numbers, then transformed to uppercase, then sent to the output file.f */ //writer = new FileNumberingFilterWriter(new UpperCaseFilterWriter(writer)); + //TODO change to above when implemented + writer = new NoOpFileTransformer().decorateWithFilters(writer); return writer; } diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/FileTransformer.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/FileTransformer.java index bde833e..9b41fed 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/FileTransformer.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/FileTransformer.java @@ -52,6 +52,13 @@ public void visit(File file) { * writer has been decorated by the concrete subclass!). You need to write a loop to read the * characters and write them to the writer. */ + + BufferedReader bufferedReader = new BufferedReader(reader); + + int c; + while((c = bufferedReader.read()) != -1) { + writer.write(c); + } reader.close(); writer.flush(); diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/NoOpFileTransformer.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/NoOpFileTransformer.java index 5971a30..e0651e6 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/NoOpFileTransformer.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/NoOpFileTransformer.java @@ -13,14 +13,13 @@ public class NoOpFileTransformer extends FileTransformer { @Override public Writer decorateWithFilters(Writer writer) { - throw new UnsupportedOperationException("The student has not implemented this method yet."); /* * The NoOpFileTransformer does not apply any transformation of the character stream * (no uppercase, no line number, etc.). So, we don't need to decorate the writer connected to * the output file at all. Just uncomment the following line and get rid of the UnsupportedOperationException and * you will be all set. */ - //return writer; + return writer; } } From f983edf080a4d0f198d9b2ae26d9050ea597b110 Mon Sep 17 00:00:00 2001 From: Melvin Merk Date: Fri, 19 Mar 2021 14:32:25 +0100 Subject: [PATCH 13/19] fixed comments --- .../res/labio/impl/transformers/FileTransformer.java | 7 +------ .../res/labio/impl/transformers/NoOpFileTransformer.java | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/FileTransformer.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/FileTransformer.java index 9b41fed..993c04a 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/FileTransformer.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/FileTransformer.java @@ -47,12 +47,7 @@ public void visit(File file) { Writer writer = new OutputStreamWriter(new FileOutputStream(file.getPath()+ ".out"), StandardCharsets.UTF_8); // the bug fix by teacher writer = decorateWithFilters(writer); - /* - * There is a missing piece here: you have an input reader and an ouput writer (notice how the - * writer has been decorated by the concrete subclass!). You need to write a loop to read the - * characters and write them to the writer. - */ - + // buffered reader for performance BufferedReader bufferedReader = new BufferedReader(reader); int c; diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/NoOpFileTransformer.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/NoOpFileTransformer.java index e0651e6..4bacd7d 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/NoOpFileTransformer.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/NoOpFileTransformer.java @@ -12,7 +12,7 @@ public class NoOpFileTransformer extends FileTransformer { @Override - public Writer decorateWithFilters(Writer writer) { + public Writer decorateWithFilters(Writer writer) { /* * The NoOpFileTransformer does not apply any transformation of the character stream * (no uppercase, no line number, etc.). So, we don't need to decorate the writer connected to From 4b48f3c23e799325c5850da53ed423bc7f296a49 Mon Sep 17 00:00:00 2001 From: Melvin Merk Date: Fri, 19 Mar 2021 14:35:03 +0100 Subject: [PATCH 14/19] fixed comments --- .../res/labio/impl/transformers/NoOpFileTransformer.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/NoOpFileTransformer.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/NoOpFileTransformer.java index 4bacd7d..d3c5c76 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/NoOpFileTransformer.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/NoOpFileTransformer.java @@ -12,12 +12,11 @@ public class NoOpFileTransformer extends FileTransformer { @Override - public Writer decorateWithFilters(Writer writer) { + public Writer decorateWithFilters(Writer writer) { /* * The NoOpFileTransformer does not apply any transformation of the character stream * (no uppercase, no line number, etc.). So, we don't need to decorate the writer connected to - * the output file at all. Just uncomment the following line and get rid of the UnsupportedOperationException and - * you will be all set. + * the output file at all. */ return writer; } From ded9468196cc8b9455fbf9d56f6adabf3c2da14b Mon Sep 17 00:00:00 2001 From: Melvin Merk Date: Fri, 19 Mar 2021 14:24:44 +0100 Subject: [PATCH 15/19] File number filter --- .../impl/filters/FileNumberingFilterWriter.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/FileNumberingFilterWriter.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/FileNumberingFilterWriter.java index 976c946..32e75ea 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/FileNumberingFilterWriter.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/FileNumberingFilterWriter.java @@ -1,5 +1,7 @@ package ch.heigvd.res.labio.impl.filters; +import ch.heigvd.res.labio.impl.Utils; + import java.io.FilterWriter; import java.io.IOException; import java.io.Writer; @@ -25,17 +27,21 @@ public FileNumberingFilterWriter(Writer out) { @Override public void write(String str, int off, int len) throws IOException { - throw new UnsupportedOperationException("The student has not implemented this method yet."); + + String[] lines; + do { + lines = Utils.getNextLine(str); + } while(!lines[0].equals("")); } @Override public void write(char[] cbuf, int off, int len) throws IOException { - throw new UnsupportedOperationException("The student has not implemented this method yet."); + } @Override public void write(int c) throws IOException { - throw new UnsupportedOperationException("The student has not implemented this method yet."); + } } From b0a020e74cddeb5bc39d5fec4378fd178e7b4f31 Mon Sep 17 00:00:00 2001 From: gab-thr Date: Sun, 21 Mar 2021 15:11:58 +0100 Subject: [PATCH 16/19] implement FileNumberingFilterWriter --- .../filters/FileNumberingFilterWriter.java | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/FileNumberingFilterWriter.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/FileNumberingFilterWriter.java index 32e75ea..7d11734 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/FileNumberingFilterWriter.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/FileNumberingFilterWriter.java @@ -13,13 +13,14 @@ * It then sends the line number and a tab character, before resuming the write * process. * - * Hello\n\World -> 1\Hello\n2\tWorld + * Hello\n\World -> 1\tHello\n2\tWorld * * @author Olivier Liechti */ public class FileNumberingFilterWriter extends FilterWriter { private static final Logger LOG = Logger.getLogger(FileNumberingFilterWriter.class.getName()); + private int lineNumber = 1; // lines are numbered from 1 not 0 public FileNumberingFilterWriter(Writer out) { super(out); @@ -28,20 +29,42 @@ public FileNumberingFilterWriter(Writer out) { @Override public void write(String str, int off, int len) throws IOException { - String[] lines; - do { - lines = Utils.getNextLine(str); - } while(!lines[0].equals("")); + /* + * This function writes the input string to the output, recursing if the given string contains multiple newline- + * separated parts. We can establish whether recursion is required using Utils.getNextLine. Additionally, if the + * given string ends with a newline, we write the next line number already, not at the next call of this function. + */ + if (lineNumber == 1) out.write(lineNumber++ + "\t"); // handle initial write + String substr = str.substring(off, off + len); + String[] lines = Utils.getNextLine(substr); + + if (!lines[0].equals("") && !lines[1].equals("")) { + out.write(lines[0], 0, lines[0].length()); + out.write(lineNumber++ + "\t"); // already write next line number + tab before recursing + this.write(lines[1]); + } else if (!lines[0].equals("")) { + out.write(lines[0], 0, lines[0].length()); + out.write(lineNumber++ + "\t"); // same here, write next line number + tab already. + } else if (!lines[1].equals("")) { + out.write(lines[1], 0, lines[1].length()); + } + } @Override public void write(char[] cbuf, int off, int len) throws IOException { - + // just use our recursive String implementation + this.write(new String(cbuf), off, len); } @Override public void write(int c) throws IOException { - + // Write the character, but as in String impl. we write the next line number as soon as we encounter \n. + if (lineNumber == 1) out.write(lineNumber++ + "\t"); + out.write(c); + if (c == '\n') { + out.write(lineNumber++ + "\t"); + } } } From 235b0603e162a707fc929f18e63e8de197f4d754 Mon Sep 17 00:00:00 2001 From: gab-thr Date: Sun, 21 Mar 2021 15:50:59 +0100 Subject: [PATCH 17/19] handle broken single caracter writing --- .../filters/FileNumberingFilterWriter.java | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/FileNumberingFilterWriter.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/FileNumberingFilterWriter.java index 7d11734..81adc02 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/FileNumberingFilterWriter.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/FileNumberingFilterWriter.java @@ -21,6 +21,7 @@ public class FileNumberingFilterWriter extends FilterWriter { private static final Logger LOG = Logger.getLogger(FileNumberingFilterWriter.class.getName()); private int lineNumber = 1; // lines are numbered from 1 not 0 + private boolean hasSeenCarriageReturn = false; public FileNumberingFilterWriter(Writer out) { super(out); @@ -59,12 +60,35 @@ public void write(char[] cbuf, int off, int len) throws IOException { @Override public void write(int c) throws IOException { - // Write the character, but as in String impl. we write the next line number as soon as we encounter \n. + // Write the character, but when we encounter a carriage return we need to "remember" that we saw it, to handle all + // possible newline permutations (\r, \r\n and \n) correctly. if (lineNumber == 1) out.write(lineNumber++ + "\t"); + + if (hasSeenCarriageReturn) { // if we saw a carriage return before + if (c == '\n') { // if newline, write newline then next line number + out.write(c); + out.write(lineNumber++ + "\t"); + } else { // otherwise, write next line number before writing the character + out.write(lineNumber++ + "\t"); + out.write(c); + } + hasSeenCarriageReturn = c == '\r'; + } else { // otherwise, handle single newlines without carriage return out.write(c); - if (c == '\n') { - out.write(lineNumber++ + "\t"); + if (c == '\n') { + out.write(lineNumber++ + "\t"); + } else { + hasSeenCarriageReturn = c == '\r'; + } } + + + + +// out.write(c); +// if (c == '\n') { +// out.write(lineNumber++ + "\t"); +// } } } From f3ee02eb5e5677b3b1eeb5db47f2964d7e2a10af Mon Sep 17 00:00:00 2001 From: gab-thr Date: Sun, 21 Mar 2021 17:02:17 +0100 Subject: [PATCH 18/19] remove dead code --- .../res/labio/impl/filters/FileNumberingFilterWriter.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/FileNumberingFilterWriter.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/FileNumberingFilterWriter.java index 81adc02..dc6d8b7 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/FileNumberingFilterWriter.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/filters/FileNumberingFilterWriter.java @@ -81,14 +81,6 @@ public void write(int c) throws IOException { hasSeenCarriageReturn = c == '\r'; } } - - - - -// out.write(c); -// if (c == '\n') { -// out.write(lineNumber++ + "\t"); -// } } } From 7b127cb15474db34baa32bc32960b6de402188c3 Mon Sep 17 00:00:00 2001 From: gab-thr Date: Sun, 21 Mar 2021 18:23:18 +0100 Subject: [PATCH 19/19] add Application functions --- .../ch/heigvd/res/labio/impl/Application.java | 15 +-------------- .../transformers/CompleteFileTransformer.java | 9 +++++---- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java index dde0d03..ceb44a2 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/Application.java @@ -89,13 +89,6 @@ public void fetchAndStoreQuotes(int numberOfQuotes) throws IOException { e.printStackTrace(); } if (quote != null) { - /* There is a missing piece here! - * As you can see, this method handles the first part of the lab. It uses the web service - * client to fetch quotes. We have removed a single line from this method. It is a call to - * one method provided by this class, which is responsible for storing the content of the - * quote in a text file (and for generating the directories based on the tags). - */ - // TODO : storeQuote(quote,); ? storeQuote(quote, "quote-" + (i + 1) + ".utf8") ; LOG.info("Received a new joke with " + quote.getTags().size() + " tags."); for (String tag : quote.getTags()) { @@ -154,12 +147,7 @@ void printFileNames(final Writer writer) throws IOException { explorer.explore(new File(WORKSPACE_DIRECTORY), new IFileVisitor() { @Override public void visit(File file) throws IOException { - /* - * There is a missing piece here. Notice how we use an anonymous class here. We provide the implementation - * of the the IFileVisitor interface inline. You just have to add the body of the visit method, which should - * be pretty easy (we want to write the filename, including the path, to the writer passed in argument). - */ - writer.write(file.getPath().toCharArray()); + writer.write(file.getPath()+"\n"); } }); } @@ -169,5 +157,4 @@ public void processQuoteFiles() throws IOException { IFileExplorer explorer = new DFSFileExplorer(); explorer.explore(new File(WORKSPACE_DIRECTORY), new CompleteFileTransformer()); } - } diff --git a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/CompleteFileTransformer.java b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/CompleteFileTransformer.java index 4decce8..0b8042e 100644 --- a/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/CompleteFileTransformer.java +++ b/LabJavaIO/src/main/java/ch/heigvd/res/labio/impl/transformers/CompleteFileTransformer.java @@ -1,5 +1,8 @@ package ch.heigvd.res.labio.impl.transformers; +import ch.heigvd.res.labio.impl.filters.FileNumberingFilterWriter; +import ch.heigvd.res.labio.impl.filters.UpperCaseFilterWriter; + import java.io.Writer; /** @@ -19,11 +22,9 @@ public Writer decorateWithFilters(Writer writer) { * If you uncomment the following line (and get rid of th 3 previous lines...), you will restore the decoration * of the writer (connected to the file. You can see that you first decorate the writer with an UpperCaseFilterWriter, which you then * decorate with a FileNumberingFilterWriter. The resulting writer is used by the abstract class to write the characters read from the - * input files. So, the input is first prefixed with line numbers, then transformed to uppercase, then sent to the output file.f + * input files. So, the input is first prefixed with line numbers, then transformed to uppercase, then sent to the output file. */ - //writer = new FileNumberingFilterWriter(new UpperCaseFilterWriter(writer)); - //TODO change to above when implemented - writer = new NoOpFileTransformer().decorateWithFilters(writer); + writer = new FileNumberingFilterWriter(new UpperCaseFilterWriter(writer)); return writer; }