1 package org.opentrafficsim.xml.bindings;
2
3 import javax.vecmath.Point3d;
4 import javax.xml.bind.annotation.adapters.XmlAdapter;
5
6 import org.djutils.exceptions.Throw;
7
8
9
10
11
12
13
14
15
16
17
18 public class CoordinateAdapter extends XmlAdapter<String, Point3d>
19 {
20
21 @Override
22 public Point3d unmarshal(final String field) throws IllegalArgumentException
23 {
24 try
25 {
26 String clean = field.replaceAll("\\s", "");
27 Throw.when(!clean.startsWith("("), IllegalArgumentException.class, "Coordinate must start with '(': " + field);
28 Throw.when(!clean.endsWith(")"), IllegalArgumentException.class, "Coordinate must end with ')': " + field);
29 clean = clean.substring(1, clean.length() - 2);
30 String[] digits = clean.split(",");
31 Throw.when(digits.length < 2, IllegalArgumentException.class, "Coordinate must have at least x and y: " + field);
32 Throw.when(digits.length > 3, IllegalArgumentException.class,
33 "Coordinate must have at most 3 dimensions: " + field);
34
35 double x = Double.parseDouble(digits[0]);
36 double y = Double.parseDouble(digits[1]);
37 double z = digits.length == 2 ? 0.0 : Double.parseDouble(digits[2]);
38 return new Point3d(x, y, z);
39 }
40 catch (Exception exception)
41 {
42 throw new IllegalArgumentException("Error parsing coordinate" + field, exception);
43 }
44 }
45
46
47 @Override
48 public String marshal(final Point3d point) throws IllegalArgumentException
49 {
50 if (point.z == 0.0)
51 return "(" + point.x + ", " + point.y + ")";
52 return "(" + point.x + ", " + point.y + ", " + point.z + ")";
53 }
54
55 }