X-Git-Url: http://wamblee.org/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fwamblee%2Fphotos%2Fmodel%2FPath.java;fp=src%2Fmain%2Fjava%2Forg%2Fwamblee%2Fphotos%2Fmodel%2FPath.java;h=974e47a220235adc0ec90091cf522917e95c606d;hb=8845e7fe6141ccc98fd070ee4e653941f6e60508;hp=0000000000000000000000000000000000000000;hpb=b5dd7f771153492ebf5b70949dba8914af58a3cd;p=photos diff --git a/src/main/java/org/wamblee/photos/model/Path.java b/src/main/java/org/wamblee/photos/model/Path.java new file mode 100644 index 0000000..974e47a --- /dev/null +++ b/src/main/java/org/wamblee/photos/model/Path.java @@ -0,0 +1,161 @@ +/* + * Copyright 2005 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.wamblee.photos.model; + +import java.io.Serializable; + +/** + * Represents a path to a photo. + * + */ +public class Path implements Serializable { + + static final long serialVersionUID = 1287597039089552731L; + + /** + * The parts of the path. + */ + private String[] _path; + + /** + * Constructs an empty path. + * + */ + public Path() { + _path = new String[0]; + } + + /** + * Construcst the path based on a path string. + * @param aPath Path, must start with a / + */ + public Path(String aPath) { + if ( aPath == null ) { + throw new IllegalArgumentException("path is null"); + } + if ( !aPath.startsWith("/")) { + throw new IllegalArgumentException("path must start with / '" + aPath + "'"); + } + if ( aPath.length() == 1 ) { + _path = new String[0]; + return; + } + _path = aPath.substring(1).split("/"); + } + + /** + * Constructs the path based on an array of the parts. + * @param aPath Path. + */ + private Path(String[] aPath) { + _path = aPath; + } + + /** + * Returns the child of a path by appending a part. + * @param aId Id to append. + * @return Child. + * @throws IllegalArgumentException In case the id contains a / + */ + public Path child(String aId) { + if ( aId.matches("/")) { + throw new IllegalArgumentException("Id '" + aId + "' contains a /"); + } + String[] newpath = new String[_path.length + 1]; + System.arraycopy(_path, 0, newpath, 0, _path.length); + newpath[_path.length] = aId; + return new Path(newpath); + } + + /** + * Checks if the path is the root path. + * @return True if the path is the root. + */ + public boolean isRoot() { + return _path.length == 0; + } + + /** + * Gets the parent of the path. + * @return Parent of the path or the root if the path is already at the root. + */ + public Path parent() { + if ( isRoot() ) { + return this; + } + String[] newpath = new String[_path.length -1]; + System.arraycopy(_path, 0, newpath, 0, _path.length - 1); + return new Path(newpath); + } + + /** + * Converts the path to a regular path. + * @return A path, always starting with a / + */ + public String toString() { + if ( _path.length == 0 ) { + return "/"; + } + String result = ""; + for (String part: _path) { + result += "/" + part; + } + return result; + } + + /** + * Gets the id (last part) of the path. + * @return Id or null if the path has no parts (root) + */ + public String getId() { + if ( _path.length == 0 ) { + return null; + } + return _path[_path.length -1]; + } + + /** + * Returns the number of components in the path. + * @return Size. + */ + public int size() { + return _path.length; + } + + /** + * Returns a part of the path. + * @param aPart Part number (starts at 0). + * @return Part. + */ + public String getPart(int aPart) { + return _path[aPart]; + } + + /** + * Strips the first part of the path and returns the remainder. + * @return Remainder. + */ + public Path remainder() { + if ( _path.length == 0 ) { + return null; + } + String[] result = new String[_path.length-1]; + for (int i = 0; i < _path.length-1; i++) { + result[i] = _path[i+1]; + } + return new Path(result); + } +}