001package edu.pdx.cs410J.whitlock;
002
003import java.util.regex.Pattern;
004import java.util.stream.Collectors;
005import java.util.stream.Stream;
006
007/**
008 * This class is represents a <code>Student</code>.
009 */
010public class WordSpinner {
011
012  static String spinWord(String word) {
013    if (word.length() >= 5) {
014      return reverseWord(word);
015
016    } else {
017      return word;
018    }
019  }
020
021  private static String reverseWord(String word) {
022    return new StringBuilder(word).reverse().toString();
023  }
024
025  static String spinSentence(String sentence, WordSpinnerStrategy strategy) {
026    return strategy.spinSentence(sentence);
027  }
028
029  static String spinSentence(String sentence) {
030    return spinSentence(sentence, new StreamBasedStrategy());
031  }
032
033  interface WordSpinnerStrategy {
034    String spinSentence(String sentence);
035  }
036
037  static class OriginalStrategy implements WordSpinnerStrategy {
038    @Override
039    public String spinSentence(String sentence) {
040      String[] words = sentence.split(" ");
041      StringBuilder sb = new StringBuilder();
042      for (String word : words) {
043        sb.append(spinWord(word));
044        sb.append(" ");
045      }
046      return sb.toString().trim();
047    }
048  }
049
050  static class StreamBasedStrategy implements WordSpinnerStrategy {
051    @Override
052    public String spinSentence(String sentence) {
053      Pattern pattern = Pattern.compile(" ");
054
055      Stream<String> stream = pattern.splitAsStream(sentence);
056      return enableParallel(stream)
057        .map(WordSpinner::spinWord)
058        .collect(Collectors.joining(" "));
059    }
060
061    protected Stream<String> enableParallel(Stream<String> stream) {
062      return stream;
063    }
064  }
065
066  static class ParallelStreamBasedStrategy extends StreamBasedStrategy {
067    @Override
068    protected Stream<String> enableParallel(Stream<String> stream) {
069      return stream.parallel();
070    }
071  }
072}