RelativePathCalculator.java

  1. package org.jbehave.core.io;

  2. import static java.util.Arrays.asList;

  3. import java.util.ArrayList;
  4. import java.util.LinkedList;
  5. import java.util.List;

  6. /**
  7.  * {@link PathCalculator} that finds given stories relative to the current story.
  8.  */
  9. public class RelativePathCalculator implements PathCalculator {

  10.     @Override
  11.     public String calculate(String root, String path) {
  12.         return join(calculatePath(split(root), split(path)));
  13.     }

  14.     private List<String> split(String path) {
  15.         if (path.trim().length() == 0) {
  16.             return new LinkedList<>();
  17.         }

  18.         return new LinkedList<>(asList(path.replace('\\', '/').split("/")));
  19.     }

  20.     private Iterable<String> calculatePath(List<String> root, List<String> path) {
  21.         if (path.get(0).length() == 0) {
  22.             return path.subList(1, path.size());
  23.         }

  24.         List<String> list = new ArrayList<>();
  25.         if (root.size() > 0) {
  26.             list.addAll(root.subList(0, root.size() - 1));
  27.         }
  28.         list.addAll(path);

  29.         return list;
  30.     }

  31.     private String join(Iterable<String> list) {
  32.         StringBuilder sb = new StringBuilder();

  33.         for (String each : list) {
  34.             sb.append("/").append(each);
  35.         }

  36.         return sb.substring(1);
  37.     }
  38. }