MATSIM
LanesWriter.java
Go to the documentation of this file.
1 /* *********************************************************************** *
2  * project: org.matsim.*
3  * MatsimLaneWriter
4  * *
5  * *********************************************************************** *
6  * *
7  * copyright : (C) 2009 by the members listed in the COPYING, *
8  * LICENSE and WARRANTY file. *
9  * email : info at matsim dot org *
10  * *
11  * *********************************************************************** *
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * See also COPYING, LICENSE and WARRANTY file *
18  * *
19  * *********************************************************************** */
20 package org.matsim.lanes;
21 
22 import java.io.BufferedWriter;
23 import java.io.IOException;
24 import java.util.Map;
25 
26 import jakarta.xml.bind.JAXBContext;
27 import jakarta.xml.bind.JAXBException;
28 import jakarta.xml.bind.Marshaller;
29 import javax.xml.crypto.MarshalException;
30 
31 import org.apache.logging.log4j.LogManager;
32 import org.apache.logging.log4j.Logger;
33 import org.matsim.api.core.v01.Id;
36 import org.matsim.core.gbl.Gbl;
37 import org.matsim.core.utils.io.IOUtils;
41 
48 public final class LanesWriter extends MatsimJaxbXmlWriter implements MatsimSomeWriter {
49 
50  private static final Logger log = LogManager.getLogger(LanesWriter.class);
51 
53 
55 
62  public LanesWriter(Lanes lanedefs) {
63 // log.info("Using LaneDefinitionWriter20...");
64  this.laneDefinitions = lanedefs;
65  }
66 
70  @Override
71  public void write(String filename) {
72  log.info( Gbl.aboutToWrite( "lanes", filename ) ) ;
73  JAXBContext jc;
74  try {
75  XMLLaneDefinitions xmlLaneDefinitions = convertDataToXml();
76  jc = JAXBContext.newInstance(org.matsim.jaxb.lanedefinitions20.ObjectFactory.class);
77  Marshaller m = jc.createMarshaller();
78  super.setMarshallerProperties(LanesReader.SCHEMALOCATIONV20, m);
79  BufferedWriter bufout = IOUtils.getBufferedWriter(filename);
80  m.marshal(xmlLaneDefinitions, bufout);
81  bufout.close();
82  } catch (JAXBException | IOException | MarshalException e) {
83  throw new RuntimeException(e);
84  }
85  }
86 
87  private XMLLaneDefinitions convertDataToXml() throws MarshalException {
88  ObjectFactory fac = new ObjectFactory();
89  XMLLaneDefinitions xmllaneDefs = fac.createXMLLaneDefinitions();
90 
91  for (LanesToLinkAssignment ltla : this.laneDefinitions.getLanesToLinkAssignments().values()) {
93  xmlltla.setLinkIdRef(ltla.getLinkId().toString());
94 
95  for (Lane bl : ltla.getLanes().values()) {
96  XMLLaneType xmllane = fac.createXMLLaneType();
97  xmllane.setId(bl.getId().toString());
98 
99  if ((bl.getToLinkIds() == null && bl.getToLaneIds() != null) ||
100  (bl.getToLinkIds() != null && bl.getToLaneIds() == null)){
102  }
103  else {
104  throw new MarshalException("Either at least one toLinkId or (exclusive) one toLaneId must" +
105  "be set for Lane Id " + bl.getId() + " on link Id " + ltla.getLinkId() + "! Cannot write according to XML grammar.");
106  }
107 
108  if (bl.getToLinkIds() != null){
109  for (Id<Link> id : bl.getToLinkIds()) {
110  XMLIdRefType xmlToLink = fac.createXMLIdRefType();
111  xmlToLink.setRefId(id.toString());
112  xmllane.getLeadsTo().getToLink().add(xmlToLink);
113  }
114  }
115  else if (bl.getToLaneIds() != null){
116  for (Id<Lane> id : bl.getToLaneIds()) {
117  XMLIdRefType xmlToLink = fac.createXMLIdRefType();
118  xmlToLink.setRefId(id.toString());
119  xmllane.getLeadsTo().getToLane().add(xmlToLink);
120  }
121  }
122 
124  capacity.setVehiclesPerHour(bl.getCapacityVehiclesPerHour());
125  xmllane.setCapacity(capacity);
126 
128  lanes.setNumber(bl.getNumberOfRepresentedLanes());
129  xmllane.setRepresentedLanes(lanes);
130 
132  startsAt.setMeterFromLinkEnd(bl.getStartsAtMeterFromLinkEnd());
133  xmllane.setStartsAt(startsAt);
134 
135  xmllane.setAlignment(bl.getAlignment());
136 
137  if (bl.getAttributes() != null) {
139 
140  // write attributes
141  for (Map.Entry<String, Object> objAttribute : bl.getAttributes().getAsMap().entrySet()) {
142  Class<?> clazz = objAttribute.getValue().getClass();
143  String converted = attributesConverter.convertToString(objAttribute.getValue());
144  if (converted != null) {
146  att.setName(objAttribute.getKey());
147  att.setValue(converted);
148  att.setClazz(clazz.getCanonicalName());
149  xmllane.getAttributes().getAttributeList().add(att);
150  }
151  }
152  }
153 
154  xmlltla.getLane().add(xmllane);
155  }
156  xmllaneDefs.getLanesToLinkAssignment().add(xmlltla);
157  } //end writing lanesToLinkAssignments
158 
159  return xmllaneDefs;
160  }
161 
162 }
SortedMap< Id< Link >, LanesToLinkAssignment > getLanesToLinkAssignments()
final ObjectAttributesConverter attributesConverter
void setRepresentedLanes(XMLLaneType.XMLRepresentedLanes value)
XMLLaneDefinitions convertDataToXml()
void setAttributes(XMLLaneType.XMLAttributes attributes)
XMLLaneType.XMLAttributes getAttributes()
static BufferedWriter getBufferedWriter(URL url, Charset charset, boolean append)
Definition: IOUtils.java:390
void setLeadsTo(XMLLaneType.XMLLeadsTo value)
XMLLanesToLinkAssignmentType createXMLLanesToLinkAssignmentType()
static String aboutToWrite(String what, String filename)
Definition: Gbl.java:254
List< XMLLanesToLinkAssignmentType > getLanesToLinkAssignment()
void setCapacity(XMLLaneType.XMLCapacity value)
void setStartsAt(XMLLaneType.XMLStartsAt value)
static final Logger log
XMLLaneType.XMLAttributes createXMLLaneTypeXMLAttributes()
void write(String filename)
static final String SCHEMALOCATIONV20