package org.etk.orm.plugins.common.jcr;
import java.util.ArrayList;
import java.util.List;
public class Path {
public static void parseAbsolutePath(String path, PathVisitor visitor) throws PathException {
Parser.parseAbsolutePath(visitor, path, 0, path.length());
}
public static void parsePath(String path, PathVisitor visitor) throws PathException {
Parser.parsePath(visitor, path, 0, path.length());
}
public static void parseRelativePath(PathVisitor visitor, String s) throws PathException {
Parser.parseRelativePath(visitor, s, 0, s.length());
}
public static void parsePathSegment(String s, PathVisitor visitor) throws PathException {
Parser.parsePathSegment(visitor, s, 0, s.length());
}
private static class Normalizer implements PathVisitor {
/** . */
private final StringBuilder builder = new StringBuilder("/");
public void onPathSegment(String s, int start, int end, Integer number) throws PathException {
if (builder.length() > 1) {
builder.append('/');
}
builder.append(s, start, end);
if (number != null) {
builder.append('[');
builder.append(number);
builder.append(']');
}
}
public void onPrefixPathSegment(String s, int prefixStart, int prefixEnd, int start, int end, Integer number) throws PathException {
if (builder.length() > 1) {
builder.append('/');
}
builder.append(s, prefixStart, prefixEnd);
builder.append(':');
builder.append(s, start, end);
if (number != null) {
builder.append('[');
builder.append(number);
builder.append(']');
}
builder.append('/');
}
public void onURIPathSegment(String s, int uriStart, int uriEnd, int start, int end, Integer number) throws PathException {
if (builder.length() > 1) {
builder.append('/');
}
builder.append('{');
builder.append(s, uriStart, uriEnd);
builder.append('}');
builder.append(s, start, end);
if (number != null) {
builder.append('[');
builder.append(number);
builder.append(']');
}
builder.append('/');
}
public void onSelf() throws PathException {
// Do nothing
}
public void onParent() throws PathException {
if (builder.length() == 1) {
throw new PathException("Invalid absolute path");
}
int pos = builder.lastIndexOf("/");
if (pos == 0) {
builder.setLength(1);
} else {
builder.setLength(pos);
}
}
}
public static String normalizeAbsolutePath(String absolutePath) throws PathException {
Normalizer normalizer = new Normalizer();
parseAbsolutePath(absolutePath, normalizer);
return normalizer.builder.toString();
}
private static class Splitter implements PathVisitor {
/** . */
private final List<String> pathSegments = new ArrayList<String>();
public void onPathSegment(String s, int start, int end, Integer number) throws PathException {
String pathSegment = s.substring(start, end);
if (number != null) {
pathSegment += "[" + number + "]";
}
pathSegments.add(pathSegment);
}
public void onPrefixPathSegment(String s, int prefixStart, int prefixEnd, int start, int end, Integer number) throws PathException {
String pathSegment = s.substring(prefixStart, prefixEnd) + ":" + s.substring(start, end);
if (number != null) {
pathSegment += "[" + number + "]";
}
pathSegments.add(pathSegment);
}
public void onURIPathSegment(String s, int uriStart, int uriEnd, int start, int end, Integer number) throws PathException {
String pathSegment = "{" + s.substring(uriStart, uriEnd) + "}" + s.substring(start, end);
if (number != null) {
pathSegment += "[" + number + "]";
}
pathSegments.add(pathSegment);
}
public void onSelf() throws PathException {
// Do nothing
}
public void onParent() throws PathException {
if (pathSegments.isEmpty()) {
throw new PathException("Invalid absolute path");
}
pathSegments.remove(pathSegments.size() - 1);
}
}
public static List<String> splitAbsolutePath(String absolutePath) throws PathException {
Splitter splitter = new Splitter();
parseAbsolutePath(absolutePath, splitter);
return splitter.pathSegments;
}
/** . */
private static final PathVisitor LOCAL_NAME_VALIDATOR = new PathVisitor() {
public void onPathSegment(String s, int start, int end, Integer number) {
}
public void onPrefixPathSegment(String s, int prefixStart, int prefixEnd, int start, int end, Integer number) throws PathException {
throw new PathException();
}
public void onURIPathSegment(String s, int uriStart, int uriEnd, int start, int end, Integer number) throws PathException {
throw new PathException();
}
public void onSelf() throws PathException {
throw new PathException();
}
public void onParent() throws PathException {
throw new PathException();
}
};
/** . */
private static final PathVisitor NAME_VALIDATOR = new PathVisitor() {
public void onPathSegment(String s, int start, int end, Integer number) {
}
public void onPrefixPathSegment(String s, int prefixStart, int prefixEnd, int start, int end, Integer number) {
}
public void onURIPathSegment(String s, int uriStart, int uriEnd, int start, int end, Integer number) {
}
public void onSelf() throws PathException {
throw new PathException();
}
public void onParent() throws PathException {
throw new PathException();
}
};
public static void validateName(String name) {
try {
parsePathSegment(name, NAME_VALIDATOR);
}
catch (PathException e) {
IllegalArgumentException iae = new IllegalArgumentException("Invalid name " + name);
iae.initCause(e);
throw iae;
}
}
public static void validateLocalName(String localName) {
try {
parsePathSegment(localName, LOCAL_NAME_VALIDATOR);
}
catch (PathException e) {
IllegalArgumentException iae = new IllegalArgumentException("Invalid local name " + localName);
iae.initCause(e);
throw iae;
}
}
}