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
19
20
21
22
23
24
25 public final class Cloner
26 {
27
28 private Cloner()
29 {
30
31 }
32
33
34
35
36
37
38
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
60
61
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 }