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  }