package kornell.core.util;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.logging.Logger;
public class StringUtils {
private static final Logger logger = Logger.getLogger(StringUtils.class
.getName());
private static final Sha1 sha1 = new Sha1();
public static class URLBuilder {
private String base;
private String[] segments;
private Map<String, String> params = new HashMap<String, String>();
public URLBuilder(String base) {
this.base = base;
}
public URLBuilder withPath(String... segments) {
this.segments = segments;
return this;
}
public URLBuilder withParam(String key, String value) {
params.put(key, value);
return this;
}
public String build() {
StringBuilder url = new StringBuilder();
url.append(composeURL(base, segments));
url.toString();
if (!params.isEmpty()) {
url.append("?");
for (Map.Entry<String, String> entry : params.entrySet()) {
url.append(entry.getKey());
url.append("=");
url.append(entry.getValue());
}
}
return url.toString();
}
}
public static URLBuilder with(String base) {
return new URLBuilder(base);
}
/**
* Concatenates segments into a single-slashed url or path
*/
public static String mkurl(String base, String... path) {
return composeURL(base, path);
}
/**
* @deprecated Prefer mkurl()
*/
@Deprecated
public static String composeURL(String base, String... path) {
StringBuffer buf = new StringBuffer();
buf.append(base);
if (path != null && path.length > 0) {
for (int i = 0; i < path.length; i++) {
String segment = trimSlashes(path[i]);
if (isSome(segment)) {
if ((buf.length() > 0)
&& (buf.charAt(buf.length() - 1) != '/'))
buf.append("/");
buf.append(segment);
}
}
}
return buf.toString();
}
public static String trimSlashes(String segment) {
if (isSome(segment)) {
if (segment.startsWith("/"))
return trimSlashes(segment.substring(1));
else if (segment.endsWith("/"))
return trimSlashes(segment.substring(0, segment.length() - 1));
else
return segment;
} else
return segment;
}
public static final boolean isNone(String str) {
return str == null || "".equals(str);
}
public static final boolean isSome(String str) {
return !isNone(str);
}
public static String digitsOf(String orig) {
StringBuilder buf = new StringBuilder();
for (int i = 0; i < orig.length(); i++) {
char ch = orig.charAt(i);
if (Character.isDigit(ch))
buf.append(ch);
}
return buf.toString();
}
public static OptionString opt(String str) {
if (isSome(str))
return new SomeString(str);
else
return new NoneString();
}
public interface OptionString {
OptionString orElse(String other);
String getOrNull();
}
public static class SomeString implements OptionString {
String str;
public SomeString(String str) {
this.str = str;
}
@Override
public OptionString orElse(String other) {
return this;
}
@Override
public String getOrNull() {
return str;
}
}
public static class NoneString implements OptionString {
@Override
public OptionString orElse(String other) {
return opt(other);
}
@Override
public String getOrNull() {
return null;
}
}
public static boolean noneEmpty(Object... objs) {
for (Object obj : objs) {
if (obj == null || obj.toString().length() == 0)
return false;
}
return true;
}
private static String i2s(int i) {
return (i < 10 ? "0" : "") + i;
}
@SuppressWarnings("deprecation")
public static String isoNow() {
Date now = new Date();
return toISO(now);
}
//TODO: Differentiate client and server date formatting
public static String toISO(Date date){
if (date == null) return "";
String year = i2s(1900 + date.getYear());
String month = i2s(date.getMonth()+1);
String day = i2s(date.getDate());
String hour = "00";
String min = "00";
String sec = "00";
try {
hour = i2s(date.getHours());
min = i2s(date.getMinutes());
sec = i2s(date.getSeconds());
}catch(Exception e){
logger.warning("Could not get time from date, returning start of day.");
}
String result = year + "-" + month + "-" + day + "T" + hour + ":" + min
+ ":" + sec;
return result;
}
private static final String HASH_SEP = "|#|";
public static String hash(String... args) {
StringBuilder builder = new StringBuilder();
for (String arg : args) {
builder.append(arg);
builder.append(HASH_SEP);
}
return sha1.hex_sha1(builder.toString());
}
public static class RepositoryString {
private String value;
private String repositoryUUID;
private String key;
public String getKey() {
return key;
}
public String getRepositoryUUID() {
return repositoryUUID;
}
public RepositoryString(String value) {
this.value = value;
int idx = value.indexOf("/");
if (idx > 0) {
this.repositoryUUID = value.substring(0, idx);
this.key = value.substring(idx + 1);
} else {
this.repositoryUUID = value;
this.key = "";
}
}
@Override
public String toString() {
return value;
}
}
public static RepositoryString parseRepositoryData(String str) {
RepositoryString result = new RepositoryString(str);
return result;
}
@SuppressWarnings("all")
static final Map<String, String> mimeTypes = new HashMap<String, String>() {
{
put(".txt", "text/plain");
put(".html", "text/html");
put(".js", "application/javascript");
put(".css", "text/css");
}
};
public static final String getMimeType(String key) {
String ext = key.substring(key.lastIndexOf("."));
return mimeTypes.get(ext);
}
private static final String SEP = "--";
public static Map<String, String> parseProperties(String str) {
Map<String, String> result = new HashMap<>();
String[] split = str.split(SEP);
for (String token : split) {
String[] kv = token.split("=");
if (kv.length == 2)
result.put(kv[0], kv[1]);
else
logger.warning("Could not parse [" + token + "]");
}
return result;
}
public static String composeProperties(Map<String, String> props) {
StringBuilder bud = new StringBuilder();
Set<Entry<String, String>> entrySet = props.entrySet();
for (Entry<String, String> entry : entrySet) {
if (bud.length() > 0)
bud.append(SEP);
bud.append(entry.getKey());
bud.append("=");
bud.append(entry.getValue());
}
return bud.toString();
}
public static String[] parseStrings(String str){
return str.split(SEP);
}
public static String composeStrings(String[] strs){
StringBuilder bud = new StringBuilder();
for (String string : strs) {
if(bud.length()>0)
bud.append(SEP);
bud.append(string);
}
return bud.toString();
}
@SuppressWarnings("serial")
public static void main(String[] args) {
Map<String, String> props = new HashMap<String, String>(){{
put("a", "0");
put("b", "1");
put("c", "2");
}};
System.out.println(StringUtils.composeProperties(props));
}
}