MATSIM
NetworkChangeEventsParser.java
Go to the documentation of this file.
1 /* *********************************************************************** *
2  * project: org.matsim.*
3  * NetworkChangeEventsParser.java
4  * *
5  * *********************************************************************** *
6  * *
7  * copyright : (C) 2007 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 
21 package org.matsim.core.network.io;
22 
23 import java.util.List;
24 import java.util.Stack;
25 
26 import org.apache.logging.log4j.LogManager;
27 import org.apache.logging.log4j.Logger;
28 import org.matsim.api.core.v01.Id;
35 import org.matsim.core.utils.misc.Time;
36 import org.xml.sax.Attributes;
37 
38 
45 public final class NetworkChangeEventsParser extends MatsimXmlParser {
46 
47  // ========================================================================
48  // static fields
49  // ========================================================================
50 
51  private static final Logger log = LogManager.getLogger(NetworkChangeEventsParser.class);
52 
53  static final String NETWORK_CHANGE_EVENTS_TAG = "networkChangeEvents";
54 
55  static final String NETWORK_CHANGE_EVENT_TAG = "networkChangeEvent";
56 
57  static final String START_TIME_TAG = "startTime";
58 
59  static final String LINK_TAG = "link";
60 
61  static final String REF_ID_TAG = "refId";
62 
63  static final String FLOW_CAPACITY_TAG = "flowCapacity";
64 
65  static final String FREESPEED_TAG = "freespeed";
66 
67  static final String LANES_TAG = "lanes";
68 
69  static final String CHANGE_TYPE_TAG = "type";
70 
71  static final String VALUE_TAG = "value";
72 
73  // ========================================================================
74  // private members
75  // ========================================================================
76 
77  private final Network network;
78 
80 
81  private final List<NetworkChangeEvent> events ;
82 
83  // ========================================================================
84  // constructor
85  // ========================================================================
86 
87  public NetworkChangeEventsParser(Network network, List<NetworkChangeEvent> events ) {
88  super(ValidationType.XSD_ONLY);
89  this.network = network;
90  this.events = events;
91  }
92 
93  // ========================================================================
94  // parsing
95  // ========================================================================
96 
97 // /**
98 // * Parses a file with network change events and returns a list with
99 // * instances of {@link NetworkChangeEvent}.
100 // *
101 // * @param file
102 // * a xml file containing network change events.
103 // */
104 // public List<NetworkChangeEvent> parseEvents(String file) {
105 // events = new ArrayList<>();
106 // super.parse(file);
107 // return events;
108 // }
109 //
110 //
111 // @Override
112 // public void parse(String filename) throws UncheckedIOException {
113 // events = new ArrayList<>();
114 // super.parse(filename);
115 // }
116 //
117 // @Override
118 // public void parse(URL url) throws UncheckedIOException {
119 // events = new ArrayList<>();
120 // super.parse(url);
121 // }
122 
123  // ========================================================================
124  // accessor
125  // ========================================================================
126 
127 // /**
128 // * Returns the list with network change events. Be sure to call
129 // * {@link #parseEvents(String)}, {@link #parse(String)} or
130 // * {@link #parse(URL)} before.
131 // *
132 // * @return a list of network change events, or <tt>null</tt> if
133 // * {@link #parseEvents(String)}, {@link #parse(String)} nor
134 // * {@link #parse(URL)} has been called before.
135 // */
136 // public List<NetworkChangeEvent> getEvents() {
137 // return events;
138 // }
139 
140  // ========================================================================
141  // parsing methods
142  // ========================================================================
143 
144  @Override
145  public void endTag(String name, String content, Stack<String> context) {
146  if(name.equalsIgnoreCase(NETWORK_CHANGE_EVENT_TAG)) {
147  this.events.add(this.currentEvent);
148  this.currentEvent = null;
149  }
150  }
151 
152  @Override
153  public void startTag(String name, Attributes atts, Stack<String> context) {
154  /*
155  * NetworkChangeEvent
156  */
157  if(name.equalsIgnoreCase(NETWORK_CHANGE_EVENT_TAG)) {
158  String value = atts.getValue(START_TIME_TAG);
159  if(value != null) {
160  this.currentEvent = new NetworkChangeEvent(Time.parseTime(value));
161  } else {
162  this.currentEvent = null;
163  log.warn("A start time must be defined!");
164  }
165  /*
166  * Links
167  */
168  } else if(name.equalsIgnoreCase(LINK_TAG) && this.currentEvent != null) {
169  String value = atts.getValue(REF_ID_TAG);
170  if(value != null) {
171  Link link = this.network.getLinks().get(Id.create(value, Link.class));
172  if(link != null)
173  this.currentEvent.addLink(link);
174  else
175  log.warn(String.format("Link %1$s not found!", value));
176  }
177  /*
178  * flow capacity changes
179  */
180  } else if(name.equalsIgnoreCase(FLOW_CAPACITY_TAG) && this.currentEvent != null) {
181  this.currentEvent.setFlowCapacityChange(newNetworkChangeType(atts
182  .getValue(CHANGE_TYPE_TAG), atts.getValue(VALUE_TAG)));
183  /*
184  * freespeed change
185  */
186  } else if(name.equalsIgnoreCase(FREESPEED_TAG) && this.currentEvent != null) {
187  this.currentEvent.setFreespeedChange(newNetworkChangeType(atts
188  .getValue(CHANGE_TYPE_TAG), atts.getValue(VALUE_TAG)));
189  /*
190  * lanes changes
191  */
192  } else if(name.equalsIgnoreCase(LANES_TAG) && this.currentEvent != null) {
193  this.currentEvent.setLanesChange(newNetworkChangeType(atts
194  .getValue(CHANGE_TYPE_TAG), atts.getValue(VALUE_TAG)));
195  }
196 
197  }
198 
199  static final String ABSOLUTE_VALUE = "absolute";
200  static final String FACTOR_VALUE = "scaleFactor";
201  static final String OFFSET_VALUE = "offset" ;
202  // the enum is different from the xml value, since the "in_SI_units" was considered important, but changing it also
203  // in the xml was considered too messy. kai, nov'17
204  private static ChangeValue newNetworkChangeType(String typeStr, String valueStr) {
205  if(typeStr != null && valueStr != null) {
206  double value = Double.parseDouble(valueStr);
207  if(typeStr.equalsIgnoreCase(ABSOLUTE_VALUE))
208  return new ChangeValue(ChangeType.ABSOLUTE_IN_SI_UNITS, value);
209  else if(typeStr.equalsIgnoreCase(FACTOR_VALUE))
210  return new ChangeValue(ChangeType.FACTOR, value);
211  else if(typeStr.equalsIgnoreCase(OFFSET_VALUE))
212  return new ChangeValue(ChangeType.OFFSET_IN_SI_UNITS, value);
213  else {
214  log.warn(String.format(
215  "The change type %1$s is not allowed. Alowed: %2$s %3$s %4$s",
216  typeStr, ABSOLUTE_VALUE, FACTOR_VALUE, OFFSET_VALUE ));
217  return null;
218  }
219  } else {
220  log.warn("Change type and value must be specified!");
221  return null;
222  }
223  }
224 }
static ChangeValue newNetworkChangeType(String typeStr, String valueStr)
void setFlowCapacityChange(ChangeValue flowCapacityChange)
void setFreespeedChange(ChangeValue freespeedChange)
void startTag(String name, Attributes atts, Stack< String > context)
static< T > Id< T > create(final long key, final Class< T > type)
Definition: Id.java:68
static final double parseTime(final String time)
Definition: Time.java:163
NetworkChangeEventsParser(Network network, List< NetworkChangeEvent > events)
Map< Id< Link >, ? extends Link > getLinks()
void endTag(String name, String content, Stack< String > context)
void setLanesChange(ChangeValue lanesChange)