package org.etk.core.rest.impl.uri;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.PathSegment;
import org.etk.core.rest.impl.MultivaluedMapImpl;
public final class PathSegmentImpl implements PathSegment {
/**
* Path.
*/
private String path;
/**
* Matrix parameters.
*/
private 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> m = new MultivaluedMapImpl();
if (pathSegment == null || pathSegment.length() == 0)
return new PathSegmentImpl(path, m);
int n = 0;
// first ';' the start point for matrix parameter
int p = pathSegment.indexOf(';', n);
if (p > 0)
path = pathSegment.substring(0, p);
else
path = pathSegment;
if (decode)
path = UriComponent.decode(path, UriComponent.PATH_SEGMENT);
if (p < 0) // no matrix parameters
return new PathSegmentImpl(path, m);
p++; // next character after ';'
int length = pathSegment.length();
while (p < length) {
n = pathSegment.indexOf(';', p); // find next ';'
String pair; // should look like 'a=b', but value can absent
if (n < 0) { // last pair in the string
n = pathSegment.length();
pair = pathSegment.substring(p);
} else
pair = pathSegment.substring(p, n);
String name;
String value = ""; // default value
int eq = pair.indexOf('=');
if (eq == -1) // no value, default is ""
name = pair;
else {
name = pair.substring(0, eq);
value = pair.substring(eq + 1);
}
m.add(decode ? UriComponent.decode(name, UriComponent.PATH_SEGMENT) : name,
decode ? UriComponent.decode(value, UriComponent.PATH_SEGMENT) : value);
p = n + 1;
}
return new PathSegmentImpl(path, m);
}
/**
* {@inheritDoc}
*/
public MultivaluedMap<String, String> getMatrixParameters() {
return matrixParameters;
}
/**
* {@inheritDoc}
*/
public String getPath() {
return path;
}
}