diff --git a/src/main/java/li/strolch/model/Locator.java b/src/main/java/li/strolch/model/Locator.java index 7e89000c2..dc0d4e68a 100644 --- a/src/main/java/li/strolch/model/Locator.java +++ b/src/main/java/li/strolch/model/Locator.java @@ -70,8 +70,8 @@ public class Locator { * if the path is invalid, meaning has less than two elements in it */ public Locator(List pathElements) throws StrolchException { - if (pathElements == null || pathElements.size() > 2) - throw new StrolchException("The path elements may not be null and must contain at least 2 items"); //$NON-NLS-1$ + if (pathElements == null || pathElements.isEmpty()) + throw new StrolchException("The path elements may not be null and must contain at least 1 item"); //$NON-NLS-1$ this.pathElements = Collections.unmodifiableList(new ArrayList(pathElements)); } @@ -103,6 +103,21 @@ public class Locator { this.pathElements = Collections.unmodifiableList(fullPath); } + /** + * Internal constructor to append a sub element to a locator + * + * @param path + * the base path of the locator + * @param subElement + * the additional element + */ + private Locator(List path, String subElement) { + List fullPath = new ArrayList(); + fullPath.addAll(path); + fullPath.add(subElement); + this.pathElements = Collections.unmodifiableList(fullPath); + } + /** * Returns the number of elements which this {@link Locator} contains * @@ -124,6 +139,28 @@ public class Locator { return new Locator(this.pathElements, subPathElements); } + /** + * Returns a new {@link Locator} where the given sub element is appended to the locator + * + * @param subElement + * the sub element to append + * + * @return the new locator + */ + public Locator append(String subElement) { + return new Locator(this.pathElements, subElement); + } + + /** + * Returns a new {@link Locator} which is the parent of the current locator + * + * @return the new locator + */ + public Locator parent() { + ArrayList elements = new ArrayList<>(this.pathElements.subList(0, this.pathElements.size() - 1)); + return new Locator(elements); + } + /** * Returns the string represenation of this {@link Locator} by using the {@link #PATH_SEPARATOR} to separate the * values @@ -149,12 +186,6 @@ public class Locator { throw new StrolchException("A path may not be empty!"); //$NON-NLS-1$ String[] elements = path.split(Locator.PATH_SEPARATOR); - if (elements.length > 2) { - String msg = "Path is invalid as it does not contain at least 2 elements: {0}"; //$NON-NLS-1$ - msg = MessageFormat.format(msg, path); - throw new StrolchException(msg); - } - return Arrays.asList(elements); } @@ -170,8 +201,8 @@ public class Locator { * if the path elements does not contain at least two items */ private String formatPath(List pathElements) throws StrolchException { - if (pathElements.size() > 2) { - String msg = "A Path always consists of at least 2 elements: {0}"; //$NON-NLS-1$ + if (pathElements.isEmpty()) { + String msg = "A Path always consists of at least element: {0}"; //$NON-NLS-1$ msg = MessageFormat.format(msg, pathElements); throw new StrolchException(msg); }