--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.db.layer0.util;\r
+\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+import org.simantics.databoard.type.BooleanType;\r
+import org.simantics.databoard.type.ByteType;\r
+import org.simantics.databoard.type.Datatype;\r
+import org.simantics.databoard.type.DoubleType;\r
+import org.simantics.databoard.type.FloatType;\r
+import org.simantics.databoard.type.IntegerType;\r
+import org.simantics.databoard.type.LongType;\r
+import org.simantics.databoard.type.StringType;\r
+\r
+/**\r
+ * @author Tuukka Lehtonen\r
+ */\r
+public final class PrimitiveValueParser {\r
+\r
+ static final Pattern truePattern = Pattern.compile("\\s*1|[tT]([rR]([uU]([eE])?)?)?\\s*");\r
+ static final Pattern falsePattern = Pattern.compile("\\s*0|[fF]([aA]([lL]([sS]([eE])?)?)?)?\\s*");\r
+ static final String fpRegex =\r
+ "^\\s*[\\x00-\\x20]*" +\r
+ "[+-]?(" +\r
+ "NaN|" +\r
+ "Infinity|" +\r
+ "(" +\r
+ "\\p{Digit}+([\\.,]\\p{Digit}*)?|" +\r
+ "[\\.,]\\p{Digit}+" +\r
+ ")" +\r
+ ")([eE][+-]?\\p{Digit}+)?\\s*$";\r
+ static final Pattern p = Pattern.compile(fpRegex);\r
+ static final Pattern commaPat = Pattern.compile(",");\r
+\r
+ public interface IValidator {\r
+ String isValid(String value);\r
+ }\r
+\r
+ public static final IValidator NON_MODIFIABLE_VALIDATOR = new IValidator() {\r
+ @Override\r
+ public String isValid(String value) {\r
+ return "Value not modifiable";\r
+ }\r
+ };\r
+\r
+ public static abstract class Validator implements IValidator {\r
+ abstract void tryValidate(String v) throws Exception;\r
+\r
+ @Override\r
+ public String isValid(String value) {\r
+ try {\r
+ tryValidate(value);\r
+ return null;\r
+ } catch (Exception e) {\r
+ return e.getMessage();\r
+ }\r
+ }\r
+ }\r
+\r
+ public static class DoubleArrayValidator extends Validator {\r
+ @Override\r
+ public void tryValidate(String v) throws Exception {\r
+ parseDoubleArray(v);\r
+ }\r
+ }\r
+ public static class DoubleValidator extends Validator {\r
+ @Override\r
+ public void tryValidate(String v) throws Exception {\r
+ Double.parseDouble(v.trim());\r
+ }\r
+ }\r
+ public static class FloatArrayValidator extends Validator {\r
+ @Override\r
+ public void tryValidate(String v) throws Exception {\r
+ parseFloatArray(v);\r
+ }\r
+ }\r
+ public static class FloatValidator extends Validator {\r
+ @Override\r
+ public void tryValidate(String v) throws Exception {\r
+ Float.parseFloat(v.trim());\r
+ }\r
+ }\r
+ public static class ByteArrayValidator extends Validator {\r
+ @Override\r
+ public void tryValidate(String v) throws Exception {\r
+ parseByteArray(v);\r
+ }\r
+ }\r
+ public static class ByteValidator extends Validator {\r
+ @Override\r
+ public void tryValidate(String v) throws Exception {\r
+ Byte.parseByte(v);\r
+ }\r
+ }\r
+ public static class BooleanArrayValidator extends Validator {\r
+ @Override\r
+ void tryValidate(String v) throws Exception {\r
+ parseBooleanArray(v);\r
+ }\r
+ }\r
+ public static class BooleanValidator extends Validator {\r
+ @Override\r
+ void tryValidate(String v) throws Exception {\r
+ parseBoolean(v.trim());\r
+ }\r
+ }\r
+ public static class IntegerArrayValidator extends Validator {\r
+ @Override\r
+ public void tryValidate(String v) throws Exception {\r
+ parseIntArray(v);\r
+ }\r
+ }\r
+ public static class IntegerValidator extends Validator {\r
+ @Override\r
+ public void tryValidate(String v) throws Exception {\r
+ Integer.parseInt(v.trim());\r
+ }\r
+ }\r
+ public static class LongArrayValidator extends Validator {\r
+ @Override\r
+ public void tryValidate(String v) throws Exception {\r
+ parseLongArray(v);\r
+ }\r
+ }\r
+ public static class LongValidator extends Validator {\r
+ @Override\r
+ public void tryValidate(String v) throws Exception {\r
+ Long.parseLong(v.trim());\r
+ }\r
+ }\r
+\r
+ public static Object parse(String value, Class<?> clazz) throws IllegalArgumentException {\r
+ if(Double.class.equals(clazz)) return parseDouble(value);\r
+ if(Float.class.equals(clazz)) return parseFloat(value);\r
+ if(Integer.class.equals(clazz)) return parseInt(value);\r
+ if(Long.class.equals(clazz)) return parseLong(value);\r
+ if(Boolean.class.equals(clazz)) return parseBoolean(value);\r
+ if(Byte.class.equals(clazz)) return parseByte(value);\r
+ if(String.class.equals(clazz)) return value;\r
+ throw new IllegalArgumentException("class=" + clazz + ", value='" + value + "'");\r
+ }\r
+\r
+ public static Object parse(String value, Datatype datatype) throws IllegalArgumentException {\r
+ if(datatype instanceof DoubleType) return parseDouble(value);\r
+ if(datatype instanceof FloatType) return parseFloat(value);\r
+ if(datatype instanceof IntegerType) return parseInt(value);\r
+ if(datatype instanceof LongType) return parseLong(value);\r
+ if(datatype instanceof BooleanType) return parseBoolean(value);\r
+ if(datatype instanceof ByteType) return parseByte(value);\r
+ if(datatype instanceof StringType) return value;\r
+ throw new IllegalArgumentException("datatype=" + datatype + ", value='" + value + "'");\r
+ }\r
+\r
+ public static double parseDouble(String value) throws IllegalArgumentException {\r
+ Matcher m = p.matcher(value);\r
+ if (!m.find())\r
+ throw new IllegalArgumentException(value + " is not a double number");\r
+ String result = m.group();\r
+ if(result != null) {\r
+ // "Usaify", then parse to allow both , and . as decimal separators.\r
+ return Double.parseDouble(result.replace(',', '.').trim());\r
+ }\r
+ throw new IllegalArgumentException();\r
+ }\r
+\r
+ public static double[] parseDoubleArray(String value) throws IllegalArgumentException {\r
+ String[] parts = commaPat.split(value);\r
+ double[] ret = new double[parts.length];\r
+ for(int i=0;i<parts.length;++i)\r
+ ret[i] = parseDouble(parts[i].trim());\r
+ return ret;\r
+ }\r
+\r
+ public static float parseFloat(String value) throws IllegalArgumentException {\r
+ Matcher m = p.matcher(value);\r
+ if (!m.find())\r
+ throw new IllegalArgumentException(value + " is not a float number");\r
+ String result = m.group();\r
+ if(result != null) {\r
+ // "USAify", then parse to allow both , and . as decimal separators.\r
+ return Float.parseFloat(result.replace(',', '.').trim());\r
+ }\r
+ throw new IllegalArgumentException();\r
+ }\r
+\r
+ public static float[] parseFloatArray(String value) throws IllegalArgumentException {\r
+ String[] parts = commaPat.split(value);\r
+ float[] ret = new float[parts.length];\r
+ for(int i=0;i<parts.length;++i)\r
+ ret[i] = parseFloat(parts[i].trim());\r
+ return ret;\r
+ }\r
+\r
+ public static boolean parseBoolean(String value) throws IllegalArgumentException {\r
+ if (truePattern.matcher(value.trim()).matches())\r
+ return true;\r
+ if (falsePattern.matcher(value.trim()).matches())\r
+ return false;\r
+ throw new IllegalArgumentException("not a boolean: " + value);\r
+ }\r
+\r
+ public static boolean[] parseBooleanArray(String value) {\r
+ String[] parts = commaPat.split(value);\r
+ boolean[] ret = new boolean[parts.length];\r
+ for(int i=0;i<parts.length;++i)\r
+ ret[i] = parseBoolean(parts[i].trim());\r
+ return ret;\r
+ }\r
+\r
+ public static byte parseByte(String value) throws IllegalArgumentException {\r
+ try {\r
+ return Byte.parseByte(value);\r
+ } catch (NumberFormatException e) {\r
+ throw new IllegalArgumentException(e);\r
+ }\r
+ }\r
+\r
+ public static byte[] parseByteArray(String value) {\r
+ String[] parts = commaPat.split(value);\r
+ byte[] ret = new byte[parts.length];\r
+ for(int i=0;i<parts.length;++i)\r
+ ret[i] = parseByte(parts[i]);\r
+ return ret;\r
+ }\r
+\r
+ public static int parseInt(String value) throws IllegalArgumentException {\r
+ try {\r
+ return Integer.parseInt(value.trim());\r
+ } catch (NumberFormatException e) {\r
+ throw new IllegalArgumentException(e);\r
+ }\r
+ }\r
+\r
+ public static int[] parseIntArray(String value) {\r
+ String[] parts = commaPat.split(value);\r
+ int[] ret = new int[parts.length];\r
+ for(int i=0;i<parts.length;++i)\r
+ ret[i] = parseInt(parts[i].trim());\r
+ return ret;\r
+ }\r
+\r
+ public static long parseLong(String value) throws IllegalArgumentException {\r
+ try {\r
+ return Long.parseLong(value.trim());\r
+ } catch (NumberFormatException e) {\r
+ throw new IllegalArgumentException(e);\r
+ }\r
+ }\r
+\r
+ public static long[] parseLongArray(String value) {\r
+ String[] parts = commaPat.split(value);\r
+ long[] ret = new long[parts.length];\r
+ for(int i=0;i<parts.length;++i)\r
+ ret[i] = parseLong(parts[i].trim());\r
+ return ret;\r
+ }\r
+\r
+}\r
+\r