View Javadoc
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    * CoordinateAdapter converts between the XML String for a coordinate and a Point3d. Because the ots-xsd project is not
10   * dependent on ots-core, Point3d is chosen instead of OTSPoint3D to store the (x, y, z) information. The marshal function
11   * returns a 2D-coordinate in case the z-value is zero. <br>
12   * <br>
13   * Copyright (c) 2003-2018 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights reserved. See
14   * for project information <a href="https://www.simulation.tudelft.nl/" target="_blank">www.simulation.tudelft.nl</a>. The
15   * source code and binary code of this software is proprietary information of Delft University of Technology.
16   * @author <a href="https://www.tudelft.nl/averbraeck" target="_blank">Alexander Verbraeck</a>
17   */
18  public class CoordinateAdapter extends XmlAdapter<String, Point3d>
19  {
20      /** {@inheritDoc} */
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() - 1);
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      /** {@inheritDoc} */
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  }