X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Fjvcard%2Ftui%2FStringUtils.java;h=efbce6af8a09027b941f3f1dc58344f5a88aef26;hb=cf77cb3542f2aefbebdb9aa00b358dbeb4489a73;hp=3f5d22b2eb283a6a6fa43253affe3b0410408ee0;hpb=ce822a7cd8ff95a031e477e37d23c114228cc5b6;p=jvcard.git diff --git a/src/be/nikiroo/jvcard/tui/StringUtils.java b/src/be/nikiroo/jvcard/tui/StringUtils.java index 3f5d22b..efbce6a 100644 --- a/src/be/nikiroo/jvcard/tui/StringUtils.java +++ b/src/be/nikiroo/jvcard/tui/StringUtils.java @@ -1,7 +1,12 @@ package be.nikiroo.jvcard.tui; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.text.Normalizer; import java.text.Normalizer.Form; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.regex.Pattern; import com.googlecode.lanterna.gui2.LinearLayout.Alignment; @@ -9,7 +14,6 @@ import com.googlecode.lanterna.gui2.LinearLayout.Alignment; public class StringUtils { static private Pattern marks = Pattern .compile("[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+"); - static private Pattern notAscii = Pattern.compile("[^\\p{ASCII}]+"); /** * Fix the size of the given {@link String} either with space-padding or by @@ -122,9 +126,81 @@ public class StringUtils { input = Normalizer.normalize(input, Form.NFKC); if (!allowUnicode) { - input = notAscii.matcher(input).replaceAll(""); + StringBuilder builder = new StringBuilder(); + for (int index = 0; index < input.length(); index++) { + char car = input.charAt(index); + // displayable chars in ASCII are in the range 32<->255, + // except DEL (127) + if (car >= 32 && car <= 255 && car != 127) { + builder.append(car); + } + } + input = builder.toString(); } return input; } + + /** + * Convert between time in milliseconds to {@link String} in a "static" way + * (to exchange data over the wire, for instance). + * + * @param time + * the time in milliseconds + * + * @return the time as a {@link String} + */ + static public String fromTime(long time) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return sdf.format(new Date(time)); + } + + /** + * Convert between time as a {@link String} to milliseconds in a "static" + * way (to exchange data over the wire, for instance). + * + * @param time + * the time as a {@link String} + * + * @return the time in milliseconds + */ + static public long toTime(String display) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + return sdf.parse(display).getTime(); + } catch (ParseException e) { + return -1; + } + } + + /** + * Return a hash of the given {@link String}. + * + * @param input + * the input data + * + * @return the hash + */ + static public String getHash(String input) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(input.getBytes()); + byte byteData[] = md.digest(); + + StringBuffer hexString = new StringBuffer(); + for (int i = 0; i < byteData.length; i++) { + String hex = Integer.toHexString(0xff & byteData[i]); + if (hex.length() == 1) + hexString.append('0'); + hexString.append(hex); + } + + return hexString.toString(); + } catch (NoSuchAlgorithmException e) { + // all JVM most probably have an MD5 implementation, but even if + // not, returning the input is "correct", if inefficient and + // unsecure + return input; + } + } }