Cloner.java

  1. package org.opentrafficsim.road.network.factory.xml.utils;

  2. import java.io.ByteArrayInputStream;
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.IOException;
  5. import java.io.ObjectInputStream;
  6. import java.io.ObjectOutputStream;

  7. import org.opentrafficsim.road.network.factory.xml.XmlParserException;
  8. import org.opentrafficsim.xml.generated.BASICROADLAYOUT;
  9. import org.opentrafficsim.xml.generated.CSELANE;
  10. import org.opentrafficsim.xml.generated.CSENOTRAFFICLANE;
  11. import org.opentrafficsim.xml.generated.CSESHOULDER;
  12. import org.opentrafficsim.xml.generated.CSESTRIPE;
  13. import org.opentrafficsim.xml.generated.ROADLAYOUT;

  14. /**
  15.  * Cloner makes a deep clone of any serializable object with serializable fields. <br>
  16.  * <br>
  17.  * Copyright (c) 2003-2018 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights reserved. See
  18.  * for project information <a href="https://www.simulation.tudelft.nl/" target="_blank">www.simulation.tudelft.nl</a>. The
  19.  * source code and binary code of this software is proprietary information of Delft University of Technology.
  20.  * @author <a href="https://www.tudelft.nl/averbraeck" target="_blank">Alexander Verbraeck</a>
  21.  */
  22. public final class Cloner
  23. {
  24.     /** */
  25.     private Cloner()
  26.     {
  27.         // utility class
  28.     }

  29.     /**
  30.      * Clone an object that is serializable and that has serializable fields.
  31.      * @param object the object to clone
  32.      * @param <T> the type of the object to clone
  33.      * @return the clone of the object
  34.      * @throws XmlParserException on cloning error
  35.      */
  36.     @SuppressWarnings("unchecked")
  37.     public static <T> T clone(T object) throws XmlParserException
  38.     {
  39.         try
  40.         {
  41.             ByteArrayOutputStream baos = new ByteArrayOutputStream();
  42.             ObjectOutputStream oos = new ObjectOutputStream(baos);
  43.             oos.writeObject(object);
  44.             ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
  45.             ObjectInputStream ois = new ObjectInputStream(bais);
  46.             return (T) ois.readObject();
  47.         }
  48.         catch (SecurityException | IOException | ClassNotFoundException exception)
  49.         {
  50.             throw new XmlParserException(exception);
  51.         }
  52.     }

  53.     /**
  54.      * Clone the BASICROADLAYOUT, as not all DJUNIT types are serializable...
  55.      * @param in the object to clone
  56.      * @return the cloned object
  57.      */
  58.     public static ROADLAYOUT cloneRoadLayout(BASICROADLAYOUT in)
  59.     {
  60.         ROADLAYOUT rl = new ROADLAYOUT();
  61.         rl.setBase(in.getBase());
  62.         rl.setLANEKEEPING(in.getLANEKEEPING());
  63.         rl.setLINKTYPE(in.getBase());
  64.         rl.getSPEEDLIMIT().addAll(in.getSPEEDLIMIT());
  65.         for (Object o : in.getLANEOrNOTRAFFICLANEOrSHOULDER())
  66.         {
  67.             if (o instanceof CSELANE)
  68.             {
  69.                 CSELANE lane = (CSELANE) o;
  70.                 CSELANE lc = new CSELANE();
  71.                 lc.setCENTEROFFSET(lane.getCENTEROFFSET());
  72.                 lc.setCENTEROFFSETEND(lane.getCENTEROFFSETEND());
  73.                 lc.setCENTEROFFSETSTART(lane.getCENTEROFFSETSTART());
  74.                 lc.setLEFTOFFSET(lane.getLEFTOFFSET());
  75.                 lc.setLEFTOFFSETEND(lane.getLEFTOFFSETEND());
  76.                 lc.setLEFTOFFSETSTART(lane.getLEFTOFFSETSTART());
  77.                 lc.setRIGHTOFFSET(lane.getRIGHTOFFSET());
  78.                 lc.setRIGHTOFFSETEND(lane.getRIGHTOFFSETEND());
  79.                 lc.setRIGHTOFFSETSTART(lane.getRIGHTOFFSETSTART());
  80.                 lc.setDESIGNDIRECTION(lane.isDESIGNDIRECTION());
  81.                 lc.setLANETYPE(lane.getLANETYPE());
  82.                 lc.setID(lane.getID());
  83.                 lc.setWIDTH(lane.getWIDTH());
  84.                 lc.setWIDTHEND(lane.getWIDTHEND());
  85.                 lc.setWIDTHSTART(lane.getWIDTHSTART());
  86.                 lc.getSPEEDLIMIT().addAll(lane.getSPEEDLIMIT());
  87.                 rl.getLANEOrNOTRAFFICLANEOrSHOULDER().add(lc);
  88.             }

  89.             else if (o instanceof CSENOTRAFFICLANE)
  90.             {
  91.                 CSENOTRAFFICLANE ntl = (CSENOTRAFFICLANE) o;
  92.                 CSENOTRAFFICLANE ntlc = new CSENOTRAFFICLANE();
  93.                 ntlc.setCENTEROFFSET(ntl.getCENTEROFFSET());
  94.                 ntlc.setCENTEROFFSETEND(ntl.getCENTEROFFSETEND());
  95.                 ntlc.setCENTEROFFSETSTART(ntl.getCENTEROFFSETSTART());
  96.                 ntlc.setLEFTOFFSET(ntl.getLEFTOFFSET());
  97.                 ntlc.setLEFTOFFSETEND(ntl.getLEFTOFFSETEND());
  98.                 ntlc.setLEFTOFFSETSTART(ntl.getLEFTOFFSETSTART());
  99.                 ntlc.setRIGHTOFFSET(ntl.getRIGHTOFFSET());
  100.                 ntlc.setRIGHTOFFSETEND(ntl.getRIGHTOFFSETEND());
  101.                 ntlc.setRIGHTOFFSETSTART(ntl.getRIGHTOFFSETSTART());
  102.                 ntlc.setID(ntl.getID());
  103.                 ntlc.setWIDTH(ntl.getWIDTH());
  104.                 ntlc.setWIDTHEND(ntl.getWIDTHEND());
  105.                 ntlc.setWIDTHSTART(ntl.getWIDTHSTART());
  106.                 rl.getLANEOrNOTRAFFICLANEOrSHOULDER().add(ntlc);
  107.             }

  108.             else if (o instanceof CSESHOULDER)
  109.             {
  110.                 CSESHOULDER shoulder = (CSESHOULDER) o;
  111.                 CSESHOULDER sc = new CSESHOULDER();
  112.                 sc.setCENTEROFFSET(shoulder.getCENTEROFFSET());
  113.                 sc.setCENTEROFFSETEND(shoulder.getCENTEROFFSETEND());
  114.                 sc.setCENTEROFFSETSTART(shoulder.getCENTEROFFSETSTART());
  115.                 sc.setLEFTOFFSET(shoulder.getLEFTOFFSET());
  116.                 sc.setLEFTOFFSETEND(shoulder.getLEFTOFFSETEND());
  117.                 sc.setLEFTOFFSETSTART(shoulder.getLEFTOFFSETSTART());
  118.                 sc.setRIGHTOFFSET(shoulder.getRIGHTOFFSET());
  119.                 sc.setRIGHTOFFSETEND(shoulder.getRIGHTOFFSETEND());
  120.                 sc.setRIGHTOFFSETSTART(shoulder.getRIGHTOFFSETSTART());
  121.                 sc.setID(shoulder.getID());
  122.                 sc.setWIDTH(shoulder.getWIDTH());
  123.                 sc.setWIDTHEND(shoulder.getWIDTHEND());
  124.                 sc.setWIDTHSTART(shoulder.getWIDTHSTART());
  125.                 rl.getLANEOrNOTRAFFICLANEOrSHOULDER().add(sc);
  126.             }

  127.             else if (o instanceof CSESTRIPE)
  128.             {
  129.                 CSESTRIPE stripe = (CSESTRIPE) o;
  130.                 CSESTRIPE sc = new CSESTRIPE();
  131.                 sc.setCENTEROFFSET(stripe.getCENTEROFFSET());
  132.                 sc.setCENTEROFFSETEND(stripe.getCENTEROFFSETEND());
  133.                 sc.setCENTEROFFSETSTART(stripe.getCENTEROFFSETSTART());
  134.                 sc.setID(stripe.getID());
  135.                 sc.setDRAWINGWIDTH(stripe.getDRAWINGWIDTH());
  136.                 sc.setTYPE(stripe.getTYPE());
  137.                 rl.getLANEOrNOTRAFFICLANEOrSHOULDER().add(sc);
  138.             }
  139.         }
  140.         return rl;
  141.     }
  142. }