View Javadoc
1   package org.opentrafficsim.road.network.factory.xml.utils;
2   
3   import java.io.ByteArrayInputStream;
4   import java.io.ByteArrayOutputStream;
5   import java.io.IOException;
6   import java.io.ObjectInputStream;
7   import java.io.ObjectOutputStream;
8   
9   import org.opentrafficsim.road.network.factory.xml.XmlParserException;
10  import org.opentrafficsim.xml.generated.BASICROADLAYOUT;
11  import org.opentrafficsim.xml.generated.CSELANE;
12  import org.opentrafficsim.xml.generated.CSENOTRAFFICLANE;
13  import org.opentrafficsim.xml.generated.CSESHOULDER;
14  import org.opentrafficsim.xml.generated.CSESTRIPE;
15  import org.opentrafficsim.xml.generated.ROADLAYOUT;
16  
17  /**
18   * Cloner makes a deep clone of any serializable object with serializable fields. <br>
19   * <br>
20   * Copyright (c) 2003-2018 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights reserved. See
21   * for project information <a href="https://www.simulation.tudelft.nl/" target="_blank">www.simulation.tudelft.nl</a>. The
22   * source code and binary code of this software is proprietary information of Delft University of Technology.
23   * @author <a href="https://www.tudelft.nl/averbraeck" target="_blank">Alexander Verbraeck</a>
24   */
25  public final class Cloner
26  {
27      /** */
28      private Cloner()
29      {
30          // utility class
31      }
32  
33      /**
34       * Clone an object that is serializable and that has serializable fields.
35       * @param object the object to clone
36       * @param <T> the type of the object to clone
37       * @return the clone of the object
38       * @throws XmlParserException on cloning error
39       */
40      @SuppressWarnings("unchecked")
41      public static <T> T clone(T object) throws XmlParserException
42      {
43          try
44          {
45              ByteArrayOutputStream baos = new ByteArrayOutputStream();
46              ObjectOutputStream oos = new ObjectOutputStream(baos);
47              oos.writeObject(object);
48              ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
49              ObjectInputStream ois = new ObjectInputStream(bais);
50              return (T) ois.readObject();
51          }
52          catch (SecurityException | IOException | ClassNotFoundException exception)
53          {
54              throw new XmlParserException(exception);
55          }
56      }
57  
58      /**
59       * Clone the BASICROADLAYOUT, as not all DJUNIT types are serializable...
60       * @param in the object to clone
61       * @return the cloned object
62       */
63      public static ROADLAYOUT cloneRoadLayout(BASICROADLAYOUT in)
64      {
65          ROADLAYOUT rl = new ROADLAYOUT();
66          rl.setBase(in.getBase());
67          rl.setLANEKEEPING(in.getLANEKEEPING());
68          rl.setLINKTYPE(in.getBase());
69          rl.getSPEEDLIMIT().addAll(in.getSPEEDLIMIT());
70          for (Object o : in.getLANEOrNOTRAFFICLANEOrSHOULDER())
71          {
72              if (o instanceof CSELANE)
73              {
74                  CSELANE lane = (CSELANE) o;
75                  CSELANE lc = new CSELANE();
76                  lc.setCENTEROFFSET(lane.getCENTEROFFSET());
77                  lc.setCENTEROFFSETEND(lane.getCENTEROFFSETEND());
78                  lc.setCENTEROFFSETSTART(lane.getCENTEROFFSETSTART());
79                  lc.setLEFTOFFSET(lane.getLEFTOFFSET());
80                  lc.setLEFTOFFSETEND(lane.getLEFTOFFSETEND());
81                  lc.setLEFTOFFSETSTART(lane.getLEFTOFFSETSTART());
82                  lc.setRIGHTOFFSET(lane.getRIGHTOFFSET());
83                  lc.setRIGHTOFFSETEND(lane.getRIGHTOFFSETEND());
84                  lc.setRIGHTOFFSETSTART(lane.getRIGHTOFFSETSTART());
85                  lc.setDESIGNDIRECTION(lane.isDESIGNDIRECTION());
86                  lc.setLANETYPE(lane.getLANETYPE());
87                  lc.setID(lane.getID());
88                  lc.setWIDTH(lane.getWIDTH());
89                  lc.setWIDTHEND(lane.getWIDTHEND());
90                  lc.setWIDTHSTART(lane.getWIDTHSTART());
91                  lc.getSPEEDLIMIT().addAll(lane.getSPEEDLIMIT());
92                  rl.getLANEOrNOTRAFFICLANEOrSHOULDER().add(lc);
93              }
94  
95              else if (o instanceof CSENOTRAFFICLANE)
96              {
97                  CSENOTRAFFICLANE ntl = (CSENOTRAFFICLANE) o;
98                  CSENOTRAFFICLANE ntlc = new CSENOTRAFFICLANE();
99                  ntlc.setCENTEROFFSET(ntl.getCENTEROFFSET());
100                 ntlc.setCENTEROFFSETEND(ntl.getCENTEROFFSETEND());
101                 ntlc.setCENTEROFFSETSTART(ntl.getCENTEROFFSETSTART());
102                 ntlc.setLEFTOFFSET(ntl.getLEFTOFFSET());
103                 ntlc.setLEFTOFFSETEND(ntl.getLEFTOFFSETEND());
104                 ntlc.setLEFTOFFSETSTART(ntl.getLEFTOFFSETSTART());
105                 ntlc.setRIGHTOFFSET(ntl.getRIGHTOFFSET());
106                 ntlc.setRIGHTOFFSETEND(ntl.getRIGHTOFFSETEND());
107                 ntlc.setRIGHTOFFSETSTART(ntl.getRIGHTOFFSETSTART());
108                 ntlc.setID(ntl.getID());
109                 ntlc.setWIDTH(ntl.getWIDTH());
110                 ntlc.setWIDTHEND(ntl.getWIDTHEND());
111                 ntlc.setWIDTHSTART(ntl.getWIDTHSTART());
112                 rl.getLANEOrNOTRAFFICLANEOrSHOULDER().add(ntlc);
113             }
114 
115             else if (o instanceof CSESHOULDER)
116             {
117                 CSESHOULDER shoulder = (CSESHOULDER) o;
118                 CSESHOULDER sc = new CSESHOULDER();
119                 sc.setCENTEROFFSET(shoulder.getCENTEROFFSET());
120                 sc.setCENTEROFFSETEND(shoulder.getCENTEROFFSETEND());
121                 sc.setCENTEROFFSETSTART(shoulder.getCENTEROFFSETSTART());
122                 sc.setLEFTOFFSET(shoulder.getLEFTOFFSET());
123                 sc.setLEFTOFFSETEND(shoulder.getLEFTOFFSETEND());
124                 sc.setLEFTOFFSETSTART(shoulder.getLEFTOFFSETSTART());
125                 sc.setRIGHTOFFSET(shoulder.getRIGHTOFFSET());
126                 sc.setRIGHTOFFSETEND(shoulder.getRIGHTOFFSETEND());
127                 sc.setRIGHTOFFSETSTART(shoulder.getRIGHTOFFSETSTART());
128                 sc.setID(shoulder.getID());
129                 sc.setWIDTH(shoulder.getWIDTH());
130                 sc.setWIDTHEND(shoulder.getWIDTHEND());
131                 sc.setWIDTHSTART(shoulder.getWIDTHSTART());
132                 rl.getLANEOrNOTRAFFICLANEOrSHOULDER().add(sc);
133             }
134 
135             else if (o instanceof CSESTRIPE)
136             {
137                 CSESTRIPE stripe = (CSESTRIPE) o;
138                 CSESTRIPE sc = new CSESTRIPE();
139                 sc.setCENTEROFFSET(stripe.getCENTEROFFSET());
140                 sc.setCENTEROFFSETEND(stripe.getCENTEROFFSETEND());
141                 sc.setCENTEROFFSETSTART(stripe.getCENTEROFFSETSTART());
142                 sc.setID(stripe.getID());
143                 sc.setDRAWINGWIDTH(stripe.getDRAWINGWIDTH());
144                 sc.setTYPE(stripe.getTYPE());
145                 rl.getLANEOrNOTRAFFICLANEOrSHOULDER().add(sc);
146             }
147         }
148         return rl;
149     }
150 }