Fortune v1.0
In one of recent discussions with Mr. X
I was asked about my approach to solving the Linux cookie problem
- A random quote
- Repository will be a text file
- Each quote will be segregated by a
'%'
- Can be multiline.
I always believe in incremental steps so here is what I could think of
- Read the File for the DB
- Parse each line and merge or drop as required for
'%
‘. - randomization can be an external factor – but that is step 2.
Read DB
The final class looks like something below
public class FortuneTeller {
private final Logger logger = Logger.getLogger(FortuneTeller.class.getName());
private List<String> allData = new LinkedList<String>();
public FortuneTeller(File dbFile) {
this.dbFile = dbFile;
}
private File dbFile;
public FortuneTeller() {
this(null);
logger.log(Level.WARNING, "empty initialization");
}
public void populateDB() {
this.populateDB(this.dbFile);
}
/**
* Read the complete data.
* @param localFile
*/
public void populateDB(File localFile) {
if (localFile == null ){
throw new IllegalArgumentException("NO FILE SPECIFIED: file name is invalid");
}
if ( localFile.exists()) {
System.out.println( " File found ");
try {
/**
* https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html
*/
List<String> allLines = Files.readAllLines(localFile.toPath()).stream().collect(Collectors.toList());
StringBuffer sb = new StringBuffer();
for (String str: allLines) {
if (str.compareTo("%") != 0) {
sb.append(str);
if (allLines.indexOf(str) == allLines.size() - 1) {
allData.add(sb.toString() +"\n");
break;
} else {
sb.append("\n");
continue;
}
} else {
allData.add(sb.toString());
sb.setLength(0);
}
}
return;
} catch (IOException e) {
throw new InternalError("something went wrong");
}
} else {
System.out.println("file not found: " + localFile.getPath());
}
}
public String myFortune(int index) {
if (allData.size() == 0) {
System.out.println("no data in the system");
throw new InternalError("no data in the system");
}
return allData.get(index%allData.size()).toString();
}
}
DB population: populateDB
public void populateDB(File localFile) {
if (localFile == null ){
throw new IllegalArgumentException("NO FILE SPECIFIED: file name is invalid");
}
if ( localFile.exists()) {
System.out.println( " File found ");
try {
List<String> allLines = Files.readAllLines(localFile.toPath()).stream().collect(Collectors.toList());
StringBuffer sb = new StringBuffer();
for (String str: allLines) {
if (str.compareTo("%") != 0) {
sb.append(str);
if (allLines.indexOf(str) == allLines.size() - 1) {
allData.add(sb.toString() +"\n");
break;
} else {
sb.append("\n");
continue;
}
} else {
allData.add(sb.toString());
sb.setLength(0);
}
}
return;
} catch (IOException e) {
throw new InternalError("something went wrong");
}
} else {
System.out.println("file not found: " + localFile.getPath());
}
}
- If the file-argument is null Throw
illegalArgumentException
- Read all the files ‘no explicit` skipping
Files.readAllLines(localFile.toPath()).stream().collect(Collectors.toList());
Once the Lines are read – time to parse each line and
- Drop all ‘
%
‘ - All lines terminated by ‘
%
‘ will be joined by a new line character.
for (String str: allLines) {
if (str.compareTo("%") != 0) {
sb.append(str);
if (allLines.indexOf(str) == allLines.size() - 1) {
allData.add(sb.toString() + "\n");
break;
} else {
sb.append("\n");
continue;
}
} else {
allData.add(sb.toString());
sb.setLength(0);
}
}
Iterate through all the Lines read, and if the line is not just ‘%
‘ we can append the next line.
At the end of the loop we will have allData
populated with all the contents.
public String myFortune(int index) {
if (allData.size() == 0) {
System.out.println("no data in the system");
throw new InternalError("no data in the system");
}
return allData.get(index % allData.size()).toString();
}
Fortune.DB
My life is simple
%
Life is easier when you have the right set of people around you,
as friends and family to help you enjoy the moment.
- Saurabh
%
S
%
Life is never that simple
Test – JUNIT
public class FortuneTellerTest {
private final FortuneTeller ft = new FortuneTeller();
@Test
void testFT() {
IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, () -> ft.populateDB(null));
assertEquals(ex.getMessage(), "NO FILE SPECIFIED: file name is invalid");
}
@Test
void readLocal() {
ft.populateDB(new File("/Users/ss670121/sourcebox/learn/golang/exercism/java/MissingNumber/src/test/resources/fortune.txt"));
assertEquals(ft.myFortune(0), "My life is simple\n");
assertEquals(ft.myFortune(1), "Life is easier when you have the right set of people around you,\n" +
"as friends and family to help you enjoy the moment.\n" +
" - Saurabh\n");
assertEquals(ft.myFortune(2), "S\n");
assertEquals(ft.myFortune(3), "Life is never that simple\n");
}
}