/*
* The MIT License
*
* Copyright 2013 Tim Boudreau.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.mastfrog.url;
import com.mastfrog.util.Checks;
import org.openide.util.NbBundle;
/**
* One element of a URL's path.
*
* @author Tim Boudreau
*/
public final class PathElement implements URLComponent {
private static final long serialVersionUID = 1L;
private final String element;
private final boolean trailingSlash;
private final boolean noEncode;
public PathElement(String element) {
this(element, false);
}
public PathElement(String element, boolean trailingSlash) {
this(element, trailingSlash, false);
}
public PathElement(String element, boolean trailingSlash, boolean noEncode) {
Checks.notNull("element", element);
this.element = element;
this.trailingSlash = trailingSlash;
this.noEncode = noEncode;
}
String rawText() {
return element;
}
PathElement toTrailingSlashElement() {
return trailingSlash ? this : new PathElement(element, true, noEncode);
}
PathElement toNonTrailingSlashElement() {
return trailingSlash ? new PathElement(element, false) : this;
}
@Override
public boolean isValid() {
return element.indexOf('/') < 0 && URLBuilder.isEncodableInLatin1(element);
}
@Override
public String toString() {
return noEncode ? element : URLBuilder.escape(element, '/', '+', ':', '?', '=', '_');
}
@Override
public String getComponentName() {
return NbBundle.getMessage(PathElement.class, "path_element");
}
@Override
public void appendTo(StringBuilder sb) {
appendTo(sb, false);
}
public void appendTo(StringBuilder sb, boolean includeTrailingSlashIfPresent) {
if (noEncode) {
sb.append(element);
} else {
URLBuilder.append(sb, element, '/', '+', ':', '?', '=', '-');
}
if (trailingSlash && includeTrailingSlashIfPresent) {
sb.append('/');
}
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final PathElement other = (PathElement) obj;
if ((this.element == null) ? (other.element != null) : !this.element.equals(other.element)) {
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 5;
hash = 71 * hash + (this.element != null ? this.element.hashCode() : 0);
return hash;
}
public boolean isProbableFileReference() {
return !trailingSlash && !"..".equals(element)
&& !".".equals(element) && element.indexOf('.') > 0;
}
}