package org.smartly.packages.cms.impl.cms.endpoint;
import org.smartly.commons.cryptograph.MD5;
import org.smartly.commons.util.StringUtils;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* Url wrapper
*/
public final class CMSUrl {
private final String _path;
private String _id;
private String _path_id;
private String[] _path_params;
private int _countParams;
// --------------------------------------------------------------------
// c o n s t r u c t o r
// --------------------------------------------------------------------
public CMSUrl(final String path) {
_path = path;
_countParams = 0;
this.parse(path);
}
@Override
public boolean equals(final Object obj) {
if (obj instanceof CMSUrl) {
final CMSUrl url = (CMSUrl) obj;
return super.equals(obj) ||
(this.getId().equalsIgnoreCase(url.getId()));
}
return false;
}
@Override
public int hashCode() {
return 9 + this.getId().hashCode();
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append(this.getClass().getName()).append("{");
sb.append("id=").append(_id);
sb.append(", ");
sb.append("pathId=").append(_path_id);
sb.append(", ");
sb.append("path=").append(_path);
sb.append(", ");
sb.append("params=").append(_countParams);
sb.append("}");
return sb.toString();
}
// --------------------------------------------------------------------
// p u b l i c
// --------------------------------------------------------------------
public String getPath() {
return _path;
}
public String getId() {
return _id;
}
public boolean hasParams() {
return _countParams > 0;
}
public int countParams() {
return _countParams;
}
public Map<String, String> getParams(final String path) {
if (this.hasParams()) {
return pluckParams(path, _path_params);
}
return new HashMap<String, String>();
}
public boolean match(final String url) {
final String[] check_tokens = StringUtils.split(url, "/");
final String[] path_tokens = StringUtils.split(_path, "/");
if (check_tokens.length != path_tokens.length) {
return false;
}
for (int i = 0; i < check_tokens.length; i++) {
if (!check_tokens[i].equalsIgnoreCase(path_tokens[i]) && !isParam(path_tokens[i])) {
return false;
}
}
return true;
}
// ------------------------------------------------------------------------
// p r i v a t e
// ------------------------------------------------------------------------
private void parse(final String url) {
// set path id
_path_id = getPathId(_path);
// set method id
_id = MD5.encode(null != _path_id ? _path_id : "");
_path_params = getPathParams(_path);
_countParams = 0;
for (final String val : _path_params) {
if (StringUtils.hasText(val)) {
_countParams++;
}
}
}
// --------------------------------------------------------------------
// S T A T I C
// --------------------------------------------------------------------
public static boolean hasParams(final String url) {
return getPathParams(url).length > 0;
}
/**
* From "/folder1/{id}/folder2" to "folder1.*.folder2"
*
* @param path Original path. i.e. "/folder1/{id}/folder2"
* @return "folder1.*.folder2"
*/
private static String getPathId(final String path) {
final StringBuilder sb = new StringBuilder();
final String[] tokens = StringUtils.split(path, "/");
for (final String t : tokens) {
if (sb.length() > 0) {
sb.append(".");
}
if (isParam(t)) {
sb.append("*");
} else {
sb.append(t);
}
}
return sb.toString();
}
private static boolean isParam(final String path_token) {
return (path_token.trim().startsWith("{"));
}
private static String[] getPathParams(final String path) {
final List<String> result = new LinkedList<String>();
final String[] tokens = StringUtils.split(path, "/");
for (final String t : tokens) {
if (isParam(t)) {
result.add(t.substring(t.indexOf("{") + 1, t.indexOf("}")));
} else {
result.add(""); // empty space
}
}
return result.toArray(new String[result.size()]);
}
private static Map<String, String> pluckParams(final String path, final String[] path_params) {
final String[] tokens = StringUtils.split(path, "/");
final Map<String, String> result = new HashMap<String, String>();
if (tokens.length > 0 && tokens.length == path_params.length) {
for (int i = 0; i < path_params.length; i++) {
if (StringUtils.hasText(path_params[i])) {
result.put(path_params[i], tokens[i]);
}
}
}
return result;
}
}