/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.everrest.core.impl.uri;
import com.google.common.base.MoreObjects;
import org.everrest.core.impl.MultivaluedMapImpl;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.PathSegment;
import java.util.Objects;
import static com.google.common.base.Strings.isNullOrEmpty;
import static org.everrest.core.impl.uri.UriComponent.PATH_SEGMENT;
import static org.everrest.core.util.StringUtils.charAtIs;
import static org.everrest.core.util.StringUtils.scan;
public final class PathSegmentImpl implements PathSegment {
/** Path. */
private final String path;
/** Matrix parameters. */
private final MultivaluedMap<String, String> matrixParameters;
/**
* @param path
* Path
* @param matrixParameters
* Matrix parameters
*/
PathSegmentImpl(String path, MultivaluedMap<String, String> matrixParameters) {
this.path = path;
this.matrixParameters = matrixParameters;
}
/**
* Create instance of PathSegment from given string.
*
* @param pathSegment
* string which represents PathSegment
* @param decode
* true if character must be decoded false otherwise
* @return instance of PathSegment
*/
public static PathSegment fromString(String pathSegment, boolean decode) {
String path = "";
MultivaluedMap<String, String> matrixParameters = new MultivaluedMapImpl();
if (isNullOrEmpty(pathSegment)) {
return new PathSegmentImpl(path, matrixParameters);
}
int p, n, k;
p = scan(pathSegment, ';');
boolean hasMatrixParameters = charAtIs(pathSegment, p, ';');
if (hasMatrixParameters) {
if (p > 0) {
path = pathSegment.substring(0, p);
}
} else {
path = pathSegment;
}
if (decode) {
path = UriComponent.decode(path, PATH_SEGMENT);
}
if (!hasMatrixParameters) {
return new PathSegmentImpl(path, matrixParameters);
}
++p;
int length = pathSegment.length();
while (p < length) {
n = scan(pathSegment, p, ';');
String name;
String value = "";
k = scan(pathSegment, p, '=', n);
if (charAtIs(pathSegment, k, '=')) {
name = pathSegment.substring(p, k);
value = pathSegment.substring(k + 1, n);
} else {
name = pathSegment.substring(p, n);
}
if (!name.isEmpty()) {
matrixParameters.add(UriComponent.decode(name, PATH_SEGMENT),
decode ? UriComponent.decode(value, PATH_SEGMENT) : value);
}
p = n + 1;
}
return new PathSegmentImpl(path, matrixParameters);
}
@Override
public MultivaluedMap<String, String> getMatrixParameters() {
return matrixParameters;
}
@Override
public String getPath() {
return path;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof PathSegmentImpl)) {
return false;
}
PathSegmentImpl other = (PathSegmentImpl)o;
return Objects.equals(path, other.path) && Objects.equals(matrixParameters, other.matrixParameters);
}
@Override
public int hashCode() {
return Objects.hash(path, matrixParameters);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("path", path)
.add("matrixParameters", matrixParameters)
.toString();
}
}