package com.bagri.core.query;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Build path segments and stores them in internal collection.
*
* @author Denis Sukhoroslov
*
*/
public class PathBuilder {
private List<PathSegment> segments;
/**
* default constructor
*/
public PathBuilder() {
this.segments = new ArrayList<PathSegment>(4);
}
/**
*
* @param source the source path
*/
public PathBuilder(PathBuilder source) {
setPath(source);
}
/**
* Creates a new path segment and adds it to internal segments list.
*
* @param axis the path axis
* @param namespace the path namespace
* @param segment the path local name
* @return this path builder
*/
public PathBuilder addPathSegment(AxisType axis, String namespace, String segment) {
segments.add(new PathSegment(axis, namespace, segment));
return this;
}
/**
*
* @return an unmodifiable copy of internal path segments
*/
public List<PathSegment> getSegments() {
return Collections.unmodifiableList(segments);
}
/**
*
* @return string representation of all path segments
*/
public String getFullPath() {
StringBuilder sb = new StringBuilder();
for (PathSegment segment: segments) {
sb.append(segment.toString());
}
return sb.toString();
}
/**
*
* @return the last stored path segment is any
*/
public PathSegment getLastSegment() {
if (segments.size() > 0) {
return segments.get(segments.size() - 1);
}
return null;
}
/**
*
* @return tru if any internal path segment contains wildcard, false otherwise
*/
public boolean hasRegex() {
for (PathSegment segment: segments) {
if (segment.isPattern()) {
return true;
}
}
return false;
}
/**
* Set path segments from the source provided
*
* @param source the source path
*/
public void setPath(PathBuilder source) {
this.segments = new ArrayList<>(source.segments);
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return getFullPath();
}
/**
*
* @param path the path to check
* @return true if path contains wildcards, false otherwise
*/
public static boolean isRegexPath(String path) {
return path.contains("*");
}
/**
*
* @param path the expression path
* @return regular expression for the path provided
*
*/
public static String regexFromPath(String path) {
// TODO: the regex must match only ONE element between SecurityInformation and Sector !!
//String regex = "^/" + prefix + ":Security/" + prefix + ":SecurityInformation/.*/" + prefix + ":Sector/text\\(\\)$";
int idx = path.indexOf("/*/");
String regex = "^" + path.substring(0, idx + 1) + ".*" + path.substring(idx + 2) + "$";
regex = regex.replace("(", "\\(");
regex = regex.replace(")", "\\)");
return regex;
}
}