/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.jackrabbit.spi.commons.name;
import java.util.ArrayList;
/**
* <code>PathParserTest</code>...
*/
public final class JcrPath {
private static final int ABS = 1;
private static final int NOR = 2;
private static final int VAL = 4;
public final String path;
public final String normalizedPath;
public final int flags;
// create tests
private static ArrayList list = new ArrayList();
static {
// absolute paths
list.add(new JcrPath("/", NOR|VAL));
list.add(new JcrPath("/", NOR|VAL));
list.add(new JcrPath("/", NOR|VAL));
list.add(new JcrPath("/a/b/c", NOR|VAL));
list.add(new JcrPath("/prefix:name/prefix:name", NOR|VAL));
list.add(new JcrPath("/name[2]/name[2]", NOR|VAL));
list.add(new JcrPath("/prefix:name[2]/prefix:name[2]", NOR|VAL));
list.add(new JcrPath("/a/b/c/", "/a/b/c", NOR|VAL));
list.add(new JcrPath("/a/..../", "/a/....", NOR|VAL));
list.add(new JcrPath("/a/b:.a./", "/a/b:.a.", NOR|VAL));
// ... containing special characters allowed since JCR 2.0
list.add(new JcrPath("/name's[2]/'name[2]", NOR|VAL));
list.add(new JcrPath("/\"name\"[2]/name[2]", NOR|VAL));
// relative paths
list.add(new JcrPath("a/b/c/", "a/b/c", NOR|VAL));
list.add(new JcrPath("a/b/c", NOR|VAL));
list.add(new JcrPath("prefix:name/prefix:name", NOR|VAL));
list.add(new JcrPath("name[2]/name[2]", NOR|VAL));
list.add(new JcrPath("prefix:name[2]/prefix:name[2]", NOR|VAL));
list.add(new JcrPath(".a./.b.", NOR|VAL));
list.add(new JcrPath(".../...", NOR|VAL));
// invalid paths
list.add(new JcrPath(""));
list.add(new JcrPath("//"));
list.add(new JcrPath("/a//b"));
list.add(new JcrPath(" /a/b/c/"));
list.add(new JcrPath("/a/b/c/ "));
list.add(new JcrPath("/:name/prefix:name"));
list.add(new JcrPath("/prefix:name "));
list.add(new JcrPath("/prefix: name"));
list.add(new JcrPath("/ prefix:name"));
list.add(new JcrPath("/prefix : name"));
list.add(new JcrPath("/name[0]/name[2]"));
list.add(new JcrPath("/prefix:name[2]foo/prefix:name[2]"));
list.add(new JcrPath(":name/prefix:name"));
list.add(new JcrPath("name[0]/name[2]"));
list.add(new JcrPath("prefix:name[2]foo/prefix:name[2]"));
list.add(new JcrPath("/..", "/..", 0));
list.add(new JcrPath("/a/b/../../..", "/a/b/../../..", 0));
list.add(new JcrPath("/a/b/../../../c", "/a/b/../../../c", 0));
list.add(new JcrPath("/prefix:*name"));
list.add(new JcrPath("/prefix:n*ame"));
list.add(new JcrPath("/prefix:|name"));
list.add(new JcrPath("/prefix:n|ame"));
list.add(new JcrPath("/name[2]\""));
list.add(new JcrPath("/name[2]\"/name"));
list.add(new JcrPath("/name[2]'"));
list.add(new JcrPath("/name[2]'/name"));
// normalized, relative paths
list.add(new JcrPath(".", ".", NOR|VAL));
list.add(new JcrPath("..", "..", NOR|VAL));
list.add(new JcrPath("../..", "../..", NOR|VAL));
list.add(new JcrPath("../../a/b", "../../a/b", NOR|VAL));
list.add(new JcrPath("../a", "../a",NOR|VAL));
// non-normalized paths
list.add(new JcrPath("/a/../b", "/b", VAL));
list.add(new JcrPath("/a/../b/./c/d/..", "/b/c", VAL));
list.add(new JcrPath("./../.", "..", VAL));
list.add(new JcrPath("/a/./b", "/a/b", VAL));
list.add(new JcrPath("/a/b/../..", "/", VAL));
list.add(new JcrPath("/a/b/c/../d/..././f", "/a/b/d/.../f", VAL));
list.add(new JcrPath("../a/b/../../../../f", "../../../f", VAL));
list.add(new JcrPath("a/../..", "..", VAL));
list.add(new JcrPath("../../a/.", "../../a", VAL));
// other non-normalized, relative paths
list.add(new JcrPath("./.", ".", VAL));
list.add(new JcrPath("./a", "a", VAL));
list.add(new JcrPath("a/..", ".", VAL));
list.add(new JcrPath("../a/..", "..", VAL));
list.add(new JcrPath("../a/.", "../a", VAL));
list.add(new JcrPath("a/./b", "a/b", VAL));
}
/**
* creates an invalid path test
* @param path
*/
public JcrPath(String path) {
this(path, null, 0);
}
/**
* @param path
* @param flags
*/
public JcrPath(String path, int flags) {
this(path, null, flags);
}
public JcrPath(String path, String normalizedPath, int flags) {
this.path = path;
this.normalizedPath = normalizedPath;
this.flags = flags | ((path.length() > 0 && path.charAt(0)=='/') ? ABS : 0);
}
public static JcrPath[] getTests() {
return (JcrPath[]) list.toArray(new JcrPath[list.size()]);
}
public boolean isAbsolute() {
return (flags&ABS) > 0;
}
public boolean isNormalized() {
return (flags&NOR) > 0;
}
public boolean isValid() {
return (flags&VAL) > 0;
}
public String toString() {
StringBuffer b = new StringBuffer(path);
if (normalizedPath!=null) {
b.append(" -> ").append(normalizedPath);
}
if (isAbsolute()) {
b.append(",ABS");
}
if (isNormalized()) {
b.append(",NOR");
}
if (isValid()) {
b.append(",VAL");
}
return b.toString();
}
}