Leon 7 years ago
parent
commit
3e2a070605
42 changed files with 962912 additions and 383 deletions
  1. 341
    321
      .idea/workspace.xml
  2. 7
    6
      src/main/java/com/zipcodewilmington/streams/StreamFilter.java
  3. 14
    3
      src/main/java/com/zipcodewilmington/streams/StreamMap.java
  4. 39
    33
      src/main/java/com/zipcodewilmington/streams/anthropoid/Person.java
  5. 3
    2
      src/main/java/com/zipcodewilmington/streams/anthropoid/PersonFactory.java
  6. 60
    0
      src/main/java/com/zipcodewilmington/streams/anthropoid/PersonWarehouse.java
  7. 4
    5
      src/main/java/com/zipcodewilmington/streams/conversions/ConversionAgent.java
  8. 1
    1
      src/main/java/com/zipcodewilmington/streams/conversions/StreamConverter.java
  9. 46
    0
      src/main/java/com/zipcodewilmington/streams/tools/DateUtils.java
  10. 1
    1
      src/main/java/com/zipcodewilmington/streams/tools/ReflectionUtils.java
  11. 5
    1
      src/main/java/com/zipcodewilmington/streams/tools/StringUtils.java
  12. 102
    0
      src/main/java/com/zipcodewilmington/streams/tools/logging/LoggerHandler.java
  13. 24
    0
      src/main/java/com/zipcodewilmington/streams/tools/logging/LoggerWarehouse.java
  14. 5
    1
      src/test/java/com/zipcodewilmington/streams/TestStreamFilter.java
  15. 2
    1
      src/test/java/com/zipcodewilmington/streams/anthropoid/TestPerson.java
  16. 2
    2
      src/test/java/com/zipcodewilmington/streams/anthropoid/TestPersonFactory.java
  17. 6
    6
      src/test/java/com/zipcodewilmington/streams/conversions/TestConversionAgent.java
  18. 531468
    0
      target/PersonWarehouse.leonlog
  19. BIN
      target/classes/com/zipcodewilmington/streams/StreamFilter.class
  20. BIN
      target/classes/com/zipcodewilmington/streams/StreamMap.class
  21. BIN
      target/classes/com/zipcodewilmington/streams/anthropoid/Person$PersonProperty.class
  22. BIN
      target/classes/com/zipcodewilmington/streams/anthropoid/Person.class
  23. BIN
      target/classes/com/zipcodewilmington/streams/anthropoid/PersonFactory.class
  24. BIN
      target/classes/com/zipcodewilmington/streams/anthropoid/PersonWarehouse.class
  25. BIN
      target/classes/com/zipcodewilmington/streams/conversions/ConversionAgent.class
  26. BIN
      target/classes/com/zipcodewilmington/streams/conversions/StreamConverter.class
  27. BIN
      target/classes/com/zipcodewilmington/streams/tools/DateUtils.class
  28. BIN
      target/classes/com/zipcodewilmington/streams/tools/StringUtils.class
  29. BIN
      target/classes/com/zipcodewilmington/streams/tools/logging/LoggerHandler.class
  30. BIN
      target/classes/com/zipcodewilmington/streams/tools/logging/LoggerWarehouse.class
  31. 2
    0
      target/global.leonlog
  32. 430780
    0
      target/global.leonlog.1
  33. BIN
      target/test-classes/com/zipcodewilmington/streams/TestStreamFilter.class
  34. BIN
      target/test-classes/com/zipcodewilmington/streams/TestStreamMap.class
  35. BIN
      target/test-classes/com/zipcodewilmington/streams/TestSuiteFullRegression.class
  36. BIN
      target/test-classes/com/zipcodewilmington/streams/anthropoid/TestPerson.class
  37. BIN
      target/test-classes/com/zipcodewilmington/streams/anthropoid/TestPersonFactory.class
  38. BIN
      target/test-classes/com/zipcodewilmington/streams/conversions/TestConversionAgent.class
  39. BIN
      target/test-classes/com/zipcodewilmington/streams/conversions/TestConverterArray.class
  40. BIN
      target/test-classes/com/zipcodewilmington/streams/conversions/TestConverterList.class
  41. BIN
      target/test-classes/com/zipcodewilmington/streams/conversions/TestConverterStream.class
  42. BIN
      target/test-classes/com/zipcodewilmington/streams/conversions/TestSuiteConversionRegression.class

+ 341
- 321
.idea/workspace.xml
File diff suppressed because it is too large
View File


+ 7
- 6
src/main/java/com/zipcodewilmington/streams/StreamFilter.java View File

3
 import com.zipcodewilmington.streams.anthropoid.Person;
3
 import com.zipcodewilmington.streams.anthropoid.Person;
4
 import com.zipcodewilmington.streams.anthropoid.PersonFactory;
4
 import com.zipcodewilmington.streams.anthropoid.PersonFactory;
5
 import com.zipcodewilmington.streams.tools.RandomUtils;
5
 import com.zipcodewilmington.streams.tools.RandomUtils;
6
+import com.zipcodewilmington.streams.tools.StringUtils;
6
 
7
 
7
 import java.util.List;
8
 import java.util.List;
8
 import java.util.stream.Collectors;
9
 import java.util.stream.Collectors;
19
      * No arg constructor
20
      * No arg constructor
20
      */ //TODO - construct person stream of 100 person objects; startingCharacter is a random capital letter
21
      */ //TODO - construct person stream of 100 person objects; startingCharacter is a random capital letter
21
     public StreamFilter() {
22
     public StreamFilter() {
22
-        this(PersonFactory.createPersonStream(100), RandomUtils.createCharacter('A', 'Z'));
23
+        this(PersonFactory.createPersonStream(999), RandomUtils.createCharacter('A', 'Z'));
23
     }
24
     }
24
 
25
 
25
     /**
26
     /**
35
      * @param startingCharacter - character to filter by
36
      * @param startingCharacter - character to filter by
36
      */ //TODO
37
      */ //TODO
37
     public StreamFilter(List<Person> people, Character startingCharacter) {
38
     public StreamFilter(List<Person> people, Character startingCharacter) {
38
-        this(people.stream(), startingCharacter);
39
+        this(people.parallelStream(), startingCharacter);
39
     }
40
     }
40
 
41
 
41
 
42
 
54
      * @return a list of person object whose name starts with `this.startingCharacter`
55
      * @return a list of person object whose name starts with `this.startingCharacter`
55
      */ //TODO
56
      */ //TODO
56
     public List<Person> toListMultiLine() {
57
     public List<Person> toListMultiLine() {
57
-        Stream<Person> personStreamFiltered = personStream.filter(person -> person.name.getValue().startsWith(startingCharacter));
58
+        Stream<Person> personStreamFiltered = personStream.filter(person -> StringUtils.isPalindromeIgnoreCase(person.getName()));
58
         List list = personStreamFiltered.collect(Collectors.toList());
59
         List list = personStreamFiltered.collect(Collectors.toList());
59
         return list;
60
         return list;
60
     }
61
     }
66
      */ //TODO
67
      */ //TODO
67
     public List<Person> toListOneLine() {
68
     public List<Person> toListOneLine() {
68
         return personStream
69
         return personStream
69
-                .filter(person -> person.name.getValue().startsWith(startingCharacter))
70
+                .filter(person -> StringUtils.isPalindromeIgnoreCase(person.getName()))
70
                 .collect(Collectors.toList());
71
                 .collect(Collectors.toList());
71
     }
72
     }
72
 
73
 
77
      */ //TODO
78
      */ //TODO
78
     public Person[] toArrayOneLine() {
79
     public Person[] toArrayOneLine() {
79
         return personStream
80
         return personStream
80
-                .filter(person -> person.name.getValue().startsWith(startingCharacter))
81
+                .filter(person -> StringUtils.isPalindromeIgnoreCase(person.getName()))
81
                 .toArray(Person[]::new); // method reference
82
                 .toArray(Person[]::new); // method reference
82
     }
83
     }
83
 
84
 
87
      * @return an array of person object whose name starts with `this.startingCharacter`
88
      * @return an array of person object whose name starts with `this.startingCharacter`
88
      */ //TODO
89
      */ //TODO
89
     public Person[] toArrayMultiLine() {
90
     public Person[] toArrayMultiLine() {
90
-        Stream<Person> personStreamFiltered = personStream.filter(person -> person.name.getValue().startsWith(startingCharacter));
91
+        Stream<Person> personStreamFiltered = personStream.filter(person -> StringUtils.isPalindromeIgnoreCase(person.getName()));
91
         Person[] personArray = personStreamFiltered.toArray(Person[]::new); // method reference
92
         Person[] personArray = personStreamFiltered.toArray(Person[]::new); // method reference
92
         return personArray;
93
         return personArray;
93
     }
94
     }

+ 14
- 3
src/main/java/com/zipcodewilmington/streams/StreamMap.java View File

1
 package com.zipcodewilmington.streams;
1
 package com.zipcodewilmington.streams;
2
 
2
 
3
+import com.zipcodewilmington.streams.anthropoid.Person;
4
+import com.zipcodewilmington.streams.conversions.StreamConverter;
5
+
6
+import java.util.Arrays;
7
+import java.util.List;
8
+import java.util.stream.Collectors;
3
 import java.util.stream.Stream;
9
 import java.util.stream.Stream;
4
 
10
 
5
 /**
11
 /**
22
         return Stream.of(someWords).map(w -> letters(w));
28
         return Stream.of(someWords).map(w -> letters(w));
23
     }
29
     }
24
 
30
 
25
-    //TODO
26
-    public static Stream<Stream<String>> wordsFlatMap(String... someWords) {
27
-        return null;//Arrays.asList(someWords).stream().flatMap(w -> letters(w));
31
+    /**
32
+     * @param stringArray - variable amount of String arguments
33
+     * @return - a Stream of several Streams of single characters
34
+     */ //TODO
35
+    public static Stream<String> wordsFlatMap(String... stringArray) {
36
+        Stream<String> wordStream = Stream.of(stringArray);
37
+        List<String> wordList = wordStream.collect(Collectors.toList());
38
+        return wordList.stream().flatMap(w -> letters(w));
28
     }
39
     }
29
 }
40
 }

+ 39
- 33
src/main/java/com/zipcodewilmington/streams/anthropoid/Person.java View File

1
 package com.zipcodewilmington.streams.anthropoid;
1
 package com.zipcodewilmington.streams.anthropoid;
2
 
2
 
3
+import com.zipcodewilmington.streams.tools.DateUtils;
4
+
5
+import java.time.LocalDate;
6
+import java.time.Period;
3
 import java.util.Date;
7
 import java.util.Date;
4
 
8
 
5
 /**
9
 /**
7
  * @ATTENTION_TO_STUDENTS You are FORBIDDEN from modifying this class
11
  * @ATTENTION_TO_STUDENTS You are FORBIDDEN from modifying this class
8
  */
12
  */
9
 public class Person {
13
 public class Person {
10
-    public final PersonProperty<String> name;
11
-    public final PersonProperty<Integer> age;
12
-    public final PersonProperty<Boolean> isMale;
13
-    public final PersonProperty<Long> personalId;
14
-    public final PersonProperty<Date> birthDate;
15
-    public final PersonProperty<String[]> aliases;
16
-
14
+    public final String name;
15
+    public final int age;
16
+    public final boolean isMale;
17
+    public final long personalId;
18
+    public final Date birthDate;
19
+    public final String[] aliases;
17
     /**
20
     /**
18
      * @param name - name of person
21
      * @param name - name of person
19
      * @param age - age of person
22
      * @param age - age of person
21
      * @param personalId - unique id
24
      * @param personalId - unique id
22
      * @param birthDate - date of birth
25
      * @param birthDate - date of birth
23
      */
26
      */
24
-    public Person(String name, int age, boolean isMale, long personalId, Date birthDate, String... aliases) {
25
-        this.name = new PersonProperty<>(name);
26
-        this.age = new PersonProperty<>(age);
27
-        this.isMale = new PersonProperty<>(isMale);
28
-        this.personalId = new PersonProperty<>(personalId);
29
-        this.birthDate = new PersonProperty<>(birthDate);
30
-        this.aliases = new PersonProperty<>(aliases);
27
+    Person(String name, int age, boolean isMale, long personalId, Date birthDate, String... aliases) {
28
+        this.name = name;
29
+        this.isMale = isMale;
30
+        this.personalId = personalId;
31
+        this.birthDate = birthDate;
32
+        this.age = DateUtils.yearsBetween(birthDate, LocalDate.now());
33
+        this.aliases = aliases;
34
+    }
35
+
36
+    public String getName() {
37
+        return name;
38
+    }
39
+
40
+    public int getAge() {
41
+        return age;
42
+    }
43
+
44
+    public boolean isMale() {
45
+        return isMale;
46
+    }
47
+
48
+    public long getPersonalId() {
49
+        return personalId;
50
+    }
51
+
52
+    public Date getBirthDate() {
53
+        return birthDate;
31
     }
54
     }
32
 
55
 
33
-    /** the purpose of this class is to compress verbose getter and setter logic
34
-     * @param <E> the type of data to store */
35
-    public class PersonProperty<E> {
36
-        private E val; // value of the data
37
-
38
-        /** @param val - value of data for this object to store */
39
-        public PersonProperty(E val) {
40
-            this.val = val;
41
-        }
42
-
43
-        /** @return value this object is storing */
44
-        public E getValue() {
45
-            return val;
46
-        }
47
-
48
-        /** set value this object is storing */
49
-        public void setValue(E val) {
50
-            this.val = val;
51
-        }
56
+    public String[] getAliases() {
57
+        return aliases;
52
     }
58
     }
53
 }
59
 }

+ 3
- 2
src/main/java/com/zipcodewilmington/streams/anthropoid/PersonFactory.java View File

21
      * @return a new instance of a person with fields of random values
21
      * @return a new instance of a person with fields of random values
22
      */
22
      */
23
     public static Person createRandomPerson() {
23
     public static Person createRandomPerson() {
24
-        String name = StringUtils.capitalizeFirstChar(RandomUtils.createString('a', 'z', 10));
25
-        String[] aliases = RandomUtils.createStrings('a', 'z', 10, 100);
24
+        String name = StringUtils.capitalizeFirstChar(RandomUtils.createString('a', 'z', 3));
25
+        String[] aliases = RandomUtils.createStrings('a', 'z', 5, 5);
26
         int age = RandomUtils.createInteger(0, 99);
26
         int age = RandomUtils.createInteger(0, 99);
27
         boolean isMale = RandomUtils.createBoolean(50);
27
         boolean isMale = RandomUtils.createBoolean(50);
28
         long personalId = System.nanoTime();
28
         long personalId = System.nanoTime();
30
 
30
 
31
 
31
 
32
         Person randomPerson = new Person(name, age, isMale, personalId, birthDate, aliases);
32
         Person randomPerson = new Person(name, age, isMale, personalId, birthDate, aliases);
33
+        PersonWarehouse.addPerson(randomPerson);
33
         return randomPerson;
34
         return randomPerson;
34
     }
35
     }
35
 
36
 

+ 60
- 0
src/main/java/com/zipcodewilmington/streams/anthropoid/PersonWarehouse.java View File

1
+package com.zipcodewilmington.streams.anthropoid;
2
+
3
+import com.zipcodewilmington.streams.tools.ReflectionUtils;
4
+import com.zipcodewilmington.streams.tools.logging.LoggerHandler;
5
+import com.zipcodewilmington.streams.tools.logging.LoggerWarehouse;
6
+
7
+import java.util.ArrayList;
8
+import java.util.Map;
9
+import java.util.stream.Collectors;
10
+import java.util.stream.Stream;
11
+
12
+/**
13
+ * Created by leon on 5/29/17.
14
+ * The warehouse is responsible for storing, retrieving, and filtering people
15
+ */
16
+public class PersonWarehouse {
17
+    private static final LoggerHandler loggerHandler = LoggerWarehouse.getLogger(PersonWarehouse.class);
18
+    private static ArrayList<Person> people = new ArrayList<>();
19
+
20
+    public static void addPerson(Person person) {
21
+        loggerHandler.disbalePrinting();
22
+        loggerHandler.info("Registering a new person object to the person warehouse...");
23
+        loggerHandler.info(ReflectionUtils.getFieldMap(person).toString());
24
+        people.add(person);
25
+    }
26
+
27
+    /**
28
+     * @return list of uniquely named Person objects
29
+     */ //TODO
30
+    public static Stream<Person> getUniquelyNamedPeople() {
31
+        ArrayList<String> names = new ArrayList<>();
32
+        return people.parallelStream().filter(
33
+                person -> !names.contains(person.getName()));
34
+    }
35
+
36
+    /**
37
+     * @param character starting character of Person objects' name
38
+     * @return a Stream of respective
39
+     */ //TODO
40
+    public static Stream<Person> getUniquelyNamedPeopleStartingWith(Character character) {
41
+        return getUniquelyNamedPeople().filter(
42
+                person -> person.getName().startsWith(character.toString()));
43
+    }
44
+
45
+    /**
46
+     * @param n starting character of Person objects' name
47
+     * @return a Stream of respective
48
+     */ //TODO
49
+    public static Stream<Person> getFirstNUniquelyNamedPeople(int n) {
50
+        return getUniquelyNamedPeople().limit(n);
51
+    }
52
+
53
+    /**
54
+     * @return a mapping of Person Id to the respective Person name
55
+     */ // TODO
56
+    public static Map<Long, String> getIdToNameMap() {
57
+        return people.parallelStream().collect(
58
+                Collectors.toMap(p -> p.getPersonalId(), p -> p.getName()));
59
+    }
60
+}

+ 4
- 5
src/main/java/com/zipcodewilmington/streams/conversions/ConversionAgent.java View File

6
 import java.util.function.Function;
6
 import java.util.function.Function;
7
 import java.util.function.Predicate;
7
 import java.util.function.Predicate;
8
 import java.util.stream.Stream;
8
 import java.util.stream.Stream;
9
-
10
 /**
9
 /**
11
  * Created by leon on 5/25/17.
10
  * Created by leon on 5/25/17.
12
- * ConversionAgent is responsible for conversion between different collection types
13
- * for the sake of this assignment and my sanity, consider primitive arrays to be collection type
11
+ * ConversionAgent is responsible for conversion between different object sequent data types
12
+ * Object sequent data types include: collections, arrays, lists, maps, iterators
14
  */
13
  */
15
 public abstract class ConversionAgent<T> {
14
 public abstract class ConversionAgent<T> {
16
     protected T people;
15
     protected T people;
17
 
16
 
18
-    public ConversionAgent(T val) {
19
-        this.people = val;
17
+    public ConversionAgent(T objectSequence) {
18
+        this.people = objectSequence;
20
     }
19
     }
21
 
20
 
22
     abstract public List<Person> toList();
21
     abstract public List<Person> toList();

+ 1
- 1
src/main/java/com/zipcodewilmington/streams/conversions/StreamConverter.java View File

30
 
30
 
31
     // TODO
31
     // TODO
32
     public Stream<Person> toStream() {
32
     public Stream<Person> toStream() {
33
-        return this.personList.stream();
33
+        return this.personList.parallelStream();
34
     }
34
     }
35
 
35
 
36
     // TODO
36
     // TODO

+ 46
- 0
src/main/java/com/zipcodewilmington/streams/tools/DateUtils.java View File

1
+package com.zipcodewilmington.streams.tools;
2
+
3
+import java.time.*;
4
+import java.util.Date;
5
+
6
+/**
7
+ * Created by leon on 5/1/17.
8
+ * @ATTENTION_TO_STUDENTS You are FORBIDDEN from modifying this class
9
+ */
10
+public final class DateUtils {
11
+    private DateUtils() {
12
+        /** this class is uninstantiable */
13
+    }
14
+
15
+    /**
16
+     * @param localDate LocalDate object to convert
17
+     * @return respective Date-object-representation
18
+     */
19
+    public static Date asDate(LocalDate localDate) {
20
+        return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
21
+    }
22
+
23
+    public static Date asDate(LocalDateTime localDateTime) {
24
+        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
25
+    }
26
+
27
+    public static LocalDate asLocalDate(Date date) {
28
+        return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
29
+    }
30
+
31
+    public static LocalDateTime asLocalDateTime(Date date) {
32
+        return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
33
+    }
34
+
35
+    public static int yearsBetween(Date startDate, Date endDate) {
36
+        return yearsBetween(DateUtils.asLocalDate(startDate), DateUtils.asLocalDate(endDate));
37
+    }
38
+
39
+    public static int yearsBetween(Date startDate, LocalDate endDate) {
40
+        return yearsBetween(DateUtils.asLocalDate(startDate), endDate);
41
+    }
42
+
43
+    public static int yearsBetween(LocalDate startDate, LocalDate endDate) {
44
+        return Period.between(startDate, endDate).getYears();
45
+    }
46
+}

+ 1
- 1
src/main/java/com/zipcodewilmington/streams/tools/ReflectionUtils.java View File

32
             try {
32
             try {
33
                 boolean defaultAccess = f.isAccessible();
33
                 boolean defaultAccess = f.isAccessible();
34
 
34
 
35
-                // attempt to modify visibility
35
+                // attempt to modify field visibility
36
                 f.setAccessible(true);
36
                 f.setAccessible(true);
37
                 hm.put(f, f.get(object).toString());
37
                 hm.put(f, f.get(object).toString());
38
                 f.setAccessible(defaultAccess);
38
                 f.setAccessible(defaultAccess);

+ 5
- 1
src/main/java/com/zipcodewilmington/streams/tools/StringUtils.java View File

43
      * @return the padded-left String
43
      * @return the padded-left String
44
      */
44
      */
45
     public static String padRight(String s, int n) {
45
     public static String padRight(String s, int n) {
46
-        return String.format("%1$-" + n + "s", s);
46
+        return padLeft(s, -n);
47
+    }
48
+
49
+    public static boolean isPalindromeIgnoreCase(String str) {
50
+        return new StringBuilder(str).reverse().toString().equalsIgnoreCase(str);
47
     }
51
     }
48
 }
52
 }

+ 102
- 0
src/main/java/com/zipcodewilmington/streams/tools/logging/LoggerHandler.java View File

1
+package com.zipcodewilmington.streams.tools.logging;
2
+
3
+
4
+import java.io.IOException;
5
+import java.io.PrintWriter;
6
+import java.io.StringWriter;
7
+import java.util.logging.*;
8
+import java.util.stream.Stream;
9
+
10
+import static java.util.logging.Level.*;
11
+
12
+/**
13
+ * Created by leon on 5/15/17.
14
+ */
15
+public final class LoggerHandler {
16
+    private final Logger logger;
17
+    private final String loggerName;
18
+    private boolean printingEnabled;
19
+
20
+    public LoggerHandler(Class c) {
21
+        this(c.getSimpleName());
22
+    }
23
+
24
+    public LoggerHandler(String loggerName) {
25
+        this(Logger.getLogger(loggerName));
26
+    }
27
+
28
+    public LoggerHandler(Logger logger) {
29
+        this.logger = logger;
30
+        this.loggerName = logger.getName();
31
+        this.logger.addHandler(getFileHandler());
32
+        this.printingEnabled = true;
33
+    }
34
+
35
+    public void throwable(Throwable t, Level level) {
36
+        StringWriter out = new StringWriter();
37
+        t.printStackTrace(new PrintWriter(out));
38
+        String description = out.toString();
39
+        log(level, description);
40
+    }
41
+
42
+    public void throwable(Throwable t) {
43
+        throwable(t, WARNING);
44
+    }
45
+
46
+    public void info(String s, Object... args) {
47
+        log(INFO, s, args);
48
+    }
49
+
50
+    public void warn(String s, Object... args) {
51
+        log(WARNING, String.format(s, args));
52
+    }
53
+
54
+    public void error(String s, Object... args) {
55
+        log(SEVERE, s, args);
56
+    }
57
+
58
+    private void log(Level level, String message, Object... messageArgs) {
59
+        if(printingEnabled) {
60
+            System.out.println(String.format(message, messageArgs));
61
+        }
62
+        logger.log(level, String.format(message, messageArgs));
63
+    }
64
+
65
+    public void setLevel(Level level) {
66
+        logger.setLevel(level);
67
+    }
68
+
69
+    public void enablePrinting() {
70
+        this.printingEnabled = true;
71
+    }
72
+
73
+    public void disbalePrinting() {
74
+        this.printingEnabled = false;
75
+    }
76
+
77
+    private FileHandler getFileHandler() {
78
+        return getFileHandler(new SimpleFormatter());
79
+    }
80
+
81
+    private FileHandler getFileHandler(Formatter formatter) {
82
+        FileHandler fh = null;
83
+        try {
84
+            removeHandlers(); // enables better printing control
85
+            String fileName = String.format("./target/%s.leonlog", loggerName, System.nanoTime());
86
+            fh = new FileHandler(fileName);
87
+            fh.setFormatter(formatter);
88
+        } catch (IOException ioe) {
89
+            ioe.printStackTrace();
90
+        } catch (NullPointerException npe) {
91
+
92
+        }
93
+        return fh;
94
+    }
95
+
96
+    private void removeHandlers() {
97
+        logger.setUseParentHandlers(false);
98
+        for (Handler handler : logger.getHandlers()) {
99
+            logger.removeHandler(handler);
100
+        }
101
+    }
102
+}

+ 24
- 0
src/main/java/com/zipcodewilmington/streams/tools/logging/LoggerWarehouse.java View File

1
+package com.zipcodewilmington.streams.tools.logging;
2
+
3
+import java.util.HashMap;
4
+import java.util.logging.Logger;
5
+
6
+/**
7
+ * Created by leon on 5/15/17.
8
+ */
9
+public class LoggerWarehouse {
10
+    public static final LoggerHandler globalLogger = new LoggerHandler(Logger.getGlobal());
11
+    private static final HashMap<Class, LoggerHandler> loggerMap = new HashMap<>();
12
+
13
+    public static final LoggerHandler getLogger(Class c) {
14
+        addLogger(c);
15
+        return loggerMap.get(c);
16
+    }
17
+
18
+    private static final void addLogger(Class c) {
19
+        if (!loggerMap.containsKey(c)) {
20
+            globalLogger.info(String.format("Instantiating logger for [ %s ] ... ", c.getName()));
21
+            loggerMap.put(c, new LoggerHandler(c));
22
+        }
23
+    }
24
+}

+ 5
- 1
src/test/java/com/zipcodewilmington/streams/TestStreamFilter.java View File

1
 package com.zipcodewilmington.streams;
1
 package com.zipcodewilmington.streams;
2
 
2
 
3
 import com.zipcodewilmington.streams.anthropoid.Person;
3
 import com.zipcodewilmington.streams.anthropoid.Person;
4
+import com.zipcodewilmington.streams.tools.StringUtils;
5
+import com.zipcodewilmington.streams.tools.logging.LoggerHandler;
6
+import com.zipcodewilmington.streams.tools.logging.LoggerWarehouse;
4
 import org.junit.Before;
7
 import org.junit.Before;
5
 import org.junit.Test;
8
 import org.junit.Test;
6
 
9
 
47
     }
50
     }
48
 
51
 
49
     private void testFilter(List<Person> persons) {
52
     private void testFilter(List<Person> persons) {
53
+        assert(persons.size() > 0);
50
         for (Person p : persons) {
54
         for (Person p : persons) {
51
-            assert (p.name.getValue().startsWith(streamFilter.startingCharacter));
55
+            assert (StringUtils.isPalindromeIgnoreCase(p.getName()));
52
         }
56
         }
53
     }
57
     }
54
 }
58
 }

+ 2
- 1
src/test/java/com/zipcodewilmington/streams/anthropoid/TestPerson.java View File

2
 
2
 
3
 /**
3
 /**
4
  * Created by leon on 5/25/17.
4
  * Created by leon on 5/25/17.
5
+ *
5
  * @ATTENTION_TO_STUDENTS You are FORBIDDEN from modifying this class
6
  * @ATTENTION_TO_STUDENTS You are FORBIDDEN from modifying this class
6
  */
7
  */
7
 public class TestPerson {
8
 public class TestPerson {
8
-}
9
+}

+ 2
- 2
src/test/java/com/zipcodewilmington/streams/anthropoid/TestPersonFactory.java View File

33
         checkStream(PersonFactory.createPersonStream(collectionSize));
33
         checkStream(PersonFactory.createPersonStream(collectionSize));
34
     }
34
     }
35
 
35
 
36
+    //8.1 - 8.6; 8.7 - rest
36
     private final void checkStream(Stream<Person> personStream) {
37
     private final void checkStream(Stream<Person> personStream) {
37
         String messageCheckSize = "Ensuring appropriately sized stream was produced.";
38
         String messageCheckSize = "Ensuring appropriately sized stream was produced.";
38
 
39
 
39
         Person[] personArray = personStream.toArray(Person[]::new);
40
         Person[] personArray = personStream.toArray(Person[]::new);
40
         Assert.assertEquals(messageCheckSize, collectionSize, personArray.length);
41
         Assert.assertEquals(messageCheckSize, collectionSize, personArray.length);
41
-        for (Person person : personArray) { // TODO - Move to a `TestPerson` class
42
+        for (Person person : personArray) {
42
            checkPerson(person);
43
            checkPerson(person);
43
         }
44
         }
44
     }
45
     }
48
         String messageCheckValue = "Ensuring field-value is non-null";
49
         String messageCheckValue = "Ensuring field-value is non-null";
49
 
50
 
50
         HashMap<Field, String> fieldMap = ReflectionUtils.getFieldMap(person);
51
         HashMap<Field, String> fieldMap = ReflectionUtils.getFieldMap(person);
51
-        System.out.println(fieldMap.toString());
52
         for (Map.Entry<Field, String> entry : fieldMap.entrySet()) {
52
         for (Map.Entry<Field, String> entry : fieldMap.entrySet()) {
53
             Field key = entry.getKey();
53
             Field key = entry.getKey();
54
             String value = entry.getValue();
54
             String value = entry.getValue();

+ 6
- 6
src/test/java/com/zipcodewilmington/streams/conversions/TestConversionAgent.java View File

44
     @Test
44
     @Test
45
     public void testToList() {
45
     public void testToList() {
46
         for (int i = 0; i < personList.size(); i++) {
46
         for (int i = 0; i < personList.size(); i++) {
47
-            long listId = personList.get(i).personalId.getValue();
48
-            long arrayId = personArray[i].personalId.getValue();
47
+            long listId = personList.get(i).getPersonalId();
48
+            long arrayId = personArray[i].getPersonalId();
49
 
49
 
50
             Assert.assertEquals(listId, arrayId);
50
             Assert.assertEquals(listId, arrayId);
51
         }
51
         }
57
         List<Person> people = personStream.collect(Collectors.toList());
57
         List<Person> people = personStream.collect(Collectors.toList());
58
 
58
 
59
         for (int i = 0; i < people.size(); i++) {
59
         for (int i = 0; i < people.size(); i++) {
60
-            long arrayId = personArray[i].personalId.getValue();
61
-            long streamId = people.get(i).personalId.getValue();
60
+            long arrayId = personArray[i].getPersonalId();
61
+            long streamId = people.get(i).getPersonalId();
62
 
62
 
63
             Assert.assertEquals(streamId, arrayId);
63
             Assert.assertEquals(streamId, arrayId);
64
         }
64
         }
67
     @Test
67
     @Test
68
     public void testToArray() {
68
     public void testToArray() {
69
         for (int i = 0; i < personArray.length; i++) {
69
         for (int i = 0; i < personArray.length; i++) {
70
-            long arrayId = personArray[i].personalId.getValue();
71
-            long listId = personList.get(i).personalId.getValue();
70
+            long arrayId = personArray[i].getPersonalId();
71
+            long listId = personList.get(i).getPersonalId();
72
 
72
 
73
             Assert.assertEquals(listId, arrayId);
73
             Assert.assertEquals(listId, arrayId);
74
         }
74
         }

+ 531468
- 0
target/PersonWarehouse.leonlog
File diff suppressed because it is too large
View File


BIN
target/classes/com/zipcodewilmington/streams/StreamFilter.class View File


BIN
target/classes/com/zipcodewilmington/streams/StreamMap.class View File


BIN
target/classes/com/zipcodewilmington/streams/anthropoid/Person$PersonProperty.class View File


BIN
target/classes/com/zipcodewilmington/streams/anthropoid/Person.class View File


BIN
target/classes/com/zipcodewilmington/streams/anthropoid/PersonFactory.class View File


BIN
target/classes/com/zipcodewilmington/streams/anthropoid/PersonWarehouse.class View File


BIN
target/classes/com/zipcodewilmington/streams/conversions/ConversionAgent.class View File


BIN
target/classes/com/zipcodewilmington/streams/conversions/StreamConverter.class View File


BIN
target/classes/com/zipcodewilmington/streams/tools/DateUtils.class View File


BIN
target/classes/com/zipcodewilmington/streams/tools/StringUtils.class View File


BIN
target/classes/com/zipcodewilmington/streams/tools/logging/LoggerHandler.class View File


BIN
target/classes/com/zipcodewilmington/streams/tools/logging/LoggerWarehouse.class View File


+ 2
- 0
target/global.leonlog View File

1
+May 30, 2017 4:24:18 PM com.zipcodewilmington.streams.tools.logging.LoggerHandler log
2
+INFO: Instantiating logger for [ com.zipcodewilmington.streams.anthropoid.PersonWarehouse ] ... 

+ 430780
- 0
target/global.leonlog.1
File diff suppressed because it is too large
View File


BIN
target/test-classes/com/zipcodewilmington/streams/TestStreamFilter.class View File


BIN
target/test-classes/com/zipcodewilmington/streams/TestStreamMap.class View File


BIN
target/test-classes/com/zipcodewilmington/streams/TestSuiteFullRegression.class View File


BIN
target/test-classes/com/zipcodewilmington/streams/anthropoid/TestPerson.class View File


BIN
target/test-classes/com/zipcodewilmington/streams/anthropoid/TestPersonFactory.class View File


BIN
target/test-classes/com/zipcodewilmington/streams/conversions/TestConversionAgent.class View File


BIN
target/test-classes/com/zipcodewilmington/streams/conversions/TestConverterArray.class View File


BIN
target/test-classes/com/zipcodewilmington/streams/conversions/TestConverterList.class View File


BIN
target/test-classes/com/zipcodewilmington/streams/conversions/TestConverterStream.class View File


BIN
target/test-classes/com/zipcodewilmington/streams/conversions/TestSuiteConversionRegression.class View File