2 * Copyright © 2019 Orange, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.transportpce.pce.gnpy;
11 import java.math.BigDecimal;
12 import java.math.RoundingMode;
13 import java.util.ArrayList;
14 import java.util.Collection;
15 import java.util.HashMap;
16 import java.util.List;
18 import java.util.concurrent.ExecutionException;
19 import java.util.stream.IntStream;
20 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
21 import org.opendaylight.transportpce.common.NetworkUtils;
22 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
23 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Coordinate;
24 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Km;
25 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.edfa.params.Operational;
26 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.edfa.params.OperationalBuilder;
27 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.Edfa;
28 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.EdfaBuilder;
29 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.FiberRoadmBuilder;
30 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.Transceiver;
31 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.TransceiverBuilder;
32 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.Params;
33 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.ParamsBuilder;
34 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.Fiber;
35 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.FiberBuilder;
36 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.Roadm;
37 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.RoadmBuilder;
38 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.location.attributes.Location;
39 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.location.attributes.LocationBuilder;
40 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.Connections;
41 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.ConnectionsBuilder;
42 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.Elements;
43 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.ElementsBuilder;
44 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.ElementsKey;
45 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.elements.Metadata;
46 import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.elements.MetadataBuilder;
47 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
48 import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.SpanAttributes;
49 import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.AmplifiedLink;
50 import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.amplified.link.section.element.section.element.Span;
51 import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.amplified.link.section.element.section.element.ila.Ila;
52 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev211210.Node1;
53 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.OMSAttributes;
54 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
55 import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenation;
56 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
57 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
58 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
59 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
60 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
61 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
62 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
63 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
64 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
65 import org.opendaylight.yangtools.yang.common.Decimal64;
66 import org.slf4j.Logger;
67 import org.slf4j.LoggerFactory;
70 * Class to create the topology corresponding to GNPy requirements.
72 * @author Ahmed Triki ( ahmed.triki@orange.com )
76 public class GnpyTopoImpl {
77 private static final Logger LOG = LoggerFactory.getLogger(GnpyTopoImpl.class);
78 private final NetworkTransactionService networkTransactionService;
80 private Map<ElementsKey, Elements> elements = new HashMap<>();
81 private List<Connections> connections = new ArrayList<>();
82 private List<String> elementsList = new ArrayList<>();
84 //Mapping between the ord-topo and ord-ntw node
85 private Map<String, String> mapDisgNodeRefNode = new HashMap<>();
86 //Mapping between the ROADM-ROADM linkId/secElement and the linkId
87 private Map<String, List<String>> mapLinkFiber = new HashMap<>();
89 private List<String> trxList = new ArrayList<>();
90 private static final double LATITUDE = 0;
91 private static final double LONGITUTE = 0;
92 private static final String REGION = "N/A";
93 private static final String CITY = "N/A";
94 private static final int CONVERT_KM_M = 1000;
95 private static final double TARGET_PCH_OUT_DB = -20;
98 * Construct the ExtractTopoDataStoreImpl.
100 public GnpyTopoImpl(final NetworkTransactionService networkTransactionService) throws GnpyException {
101 this.networkTransactionService = networkTransactionService;
106 * extract the topology
109 private void extractTopo() throws GnpyException {
110 // Define the instance identifier of the OpenRoadm topology
111 InstanceIdentifier<Network> insIdOpenRoadmTopo = InstanceIdentifier
112 .builder(Networks.class)
113 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).build();
114 // Define the instance identifier of the OpenRoadm network
115 InstanceIdentifier<Network> insIdrOpenRoadmNet = InstanceIdentifier
116 .builder(Networks.class)
117 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))).build();
119 // Initialize the reading of the networkTransactionService
120 // read the configuration part of the data broker that concerns the openRoadm topology and get all the nodes
121 java.util.Optional<Network> openRoadmTopo = this.networkTransactionService
122 .read(LogicalDatastoreType.CONFIGURATION, insIdOpenRoadmTopo).get();
123 java.util.Optional<Network> openRoadmNet = this.networkTransactionService
124 .read(LogicalDatastoreType.CONFIGURATION, insIdrOpenRoadmNet).get();
125 if (openRoadmNet.isPresent() && openRoadmTopo.isPresent()) {
126 extractElements(openRoadmTopo,openRoadmNet);
127 extractConnections(openRoadmTopo);
128 LOG.debug("In GnpyTopoImpl : elements and connections are well extracted");
131 throw new GnpyException(
132 "In GnpyTopoImpl : openroadm topology network or openroadm network are not well mounted ...");
134 } catch (InterruptedException | ExecutionException e) {
135 this.networkTransactionService.close();
136 throw new GnpyException("In gnpyTopoImpl: error in reading the topology", e);
138 this.networkTransactionService.close();
141 private void extractElements(java.util.Optional<Network> openRoadmTopo,
142 java.util.Optional<Network> openRoadmNet) throws GnpyException {
143 if ((!openRoadmNet.isPresent()) || (!openRoadmTopo.isPresent())) {
144 throw new GnpyException("In gnpyTopoImpl: openRoadmNet or openRoadmTopo is not present");
146 // Create the list of nodes
147 Collection<Node> openRoadmNetNodeList = openRoadmNet.get().nonnullNode().values();
148 Collection<Node> openRoadmTopoNodeList = openRoadmTopo.get().nonnullNode().values();
150 if (openRoadmTopoNodeList.isEmpty() || openRoadmNetNodeList.isEmpty()) {
151 throw new GnpyException("In gnpyTopoImpl: no nodes in the openradm topology or openroadm network");
154 for (Node openRoadmTopoNode : openRoadmTopoNodeList) {
155 // Retrieve the supporting node and the type of the node in openRoadm network
156 Collection<SupportingNode> supportingNodeList = openRoadmTopoNode.nonnullSupportingNode().values();
158 for (SupportingNode supportingNode : supportingNodeList) {
159 if (!supportingNode.getNetworkRef().getValue().equals("openroadm-network")) {
162 String nodeRef = supportingNode.getNodeRef().getValue();
163 if (nodeRef == null) {
164 throw new GnpyException("In gnpyTopoImpl: nodeRef is null");
166 // Retrieve the mapping between the openRoadm topology and openRoadm network
167 mapDisgNodeRefNode.put(openRoadmTopoNode.getNodeId().getValue(), nodeRef);
168 Node1 openRoadmNetNode1 = null;
169 org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
170 .Node1 commonNetworkNode1 = null;
171 for (Node openRoadmNetNode : openRoadmNetNodeList) {
172 if (openRoadmNetNode.getNodeId().getValue().equals(nodeRef)) {
173 openRoadmNetNode1 = openRoadmNetNode.augmentation(Node1.class);
174 commonNetworkNode1 = openRoadmNetNode.augmentation(org.opendaylight.yang.gen.v1
175 .http.org.openroadm.common.network.rev211210.Node1.class);
179 if (commonNetworkNode1 == null) {
180 throw new GnpyException(String.format("In gnpyTopoImpl: the node type of %s is null",nodeRef));
182 if (commonNetworkNode1.getNodeType().getName().equals("ROADM")) {
183 if (!elementsList.contains(nodeRef)) {
184 Elements element = createElementsRoadm(LATITUDE, LONGITUTE, nodeRef,
185 openRoadmNetNode1.getShelf(),TARGET_PCH_OUT_DB, nodeRef);
186 this.elements.put(element.key(),element);
187 elementsList.add(nodeRef);
189 } else if (commonNetworkNode1.getNodeType().getName().equals("XPONDER")) {
190 if (!elementsList.contains(nodeRef)) {
191 Elements element = createElementsTransceiver(LATITUDE, LONGITUTE, nodeRef,
192 openRoadmNetNode1.getShelf(), nodeRef);
193 this.elements.put(element.key(),element);
194 elementsList.add(nodeRef);
195 trxList.add(nodeRef);
198 throw new GnpyException("In gnpyTopoImpl: the type is not implemented");
204 private void extractConnections(java.util.Optional<Network> openRoadmTopo) throws GnpyException {
205 // Create the list of connections
206 if (!openRoadmTopo.isPresent()) {
207 throw new GnpyException("In gnpyTopoImpl: openroadmTopo is not present");
209 Network1 nw1 = openRoadmTopo.get().augmentation(Network1.class);
210 Collection<Link> linksList = nw1.nonnullLink().values();
211 // 1:EXPRESS-LINK 2:ADD-LINK 3:DROP-LINK
212 // 4:ROADM-To-ROADM 5:XPONDER-INPUT 6:XPONDER-OUTPUT
213 int[] externalLink = {OpenroadmLinkType.ROADMTOROADM.getIntValue(),OpenroadmLinkType.XPONDERINPUT.getIntValue(),
214 OpenroadmLinkType.XPONDEROUTPUT.getIntValue()};
216 if (linksList.isEmpty()) {
217 throw new GnpyException("In gnpyTopoImpl: no links in the network");
220 for (Link link : linksList) {
221 Link1 link1 = link.augmentation(Link1.class);
222 org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210
223 .Link1 openroadmNetworkLink1 = link.augmentation(org.opendaylight.yang.gen.v1.http
224 .org.openroadm.network.topology.rev211210.Link1.class);
225 if (link1.getLinkType() == null) {
226 throw new GnpyException("In gnpyTopoImpl: the link type is null");
228 int linkType = link1.getLinkType().getIntValue();
229 if (! IntStream.of(externalLink).anyMatch(x -> x == linkType)) {
233 String srcId = mapDisgNodeRefNode.get(link.getSource().getSourceNode().getValue());
234 String linkId = link.getLinkId().getValue();
235 String destId = null;
236 if (linkType == OpenroadmLinkType.ROADMTOROADM.getIntValue()) {
237 OMSAttributes omsAttributes = openroadmNetworkLink1.getOMSAttributes();
238 if (omsAttributes == null) {
239 throw new GnpyException(String.format(
240 "In gnpyTopoImpl: OMS attributes do not exit for ROADM to ROADM link: %s",linkId));
242 //Case of amplified link
243 if (omsAttributes.getAmplifiedLink() != null) {
244 srcId = extractAmplifiedLink(omsAttributes, linkId, srcId);
246 //Case of one span link
247 if (omsAttributes.getSpan() != null) {
248 srcId = extractSpanLink(omsAttributes, linkId, srcId);
252 destId = mapDisgNodeRefNode.get(link.getDestination().getDestNode().getValue());
253 createNewConnection(srcId,destId);
257 private String extractAmplifiedLink(OMSAttributes omsAttributes, String linkId, String srcId)
258 throws GnpyException {
260 List<AmplifiedLink> amplifiedLinkList = new ArrayList<>(omsAttributes.getAmplifiedLink()
261 .nonnullAmplifiedLink().values());
262 String destId = null;
263 if (!amplifiedLinkList.isEmpty()) {
264 for (AmplifiedLink amplifiedLink: amplifiedLinkList) {
265 String secElt = amplifiedLink .getSectionEltNumber().toString();
267 if (amplifiedLink.getSectionElement().getSectionElement() instanceof Ila) {
268 Ila ila = (Ila) amplifiedLink.getSectionElement().getSectionElement();
269 destId = extractILAFromAmpLink(ila);
272 if (amplifiedLink.getSectionElement().getSectionElement() instanceof Span) {
273 Span span = (Span) amplifiedLink.getSectionElement().getSectionElement();
274 destId = extractSpan(span.getSpan(), linkId, secElt);
277 if (createNewConnection(srcId,destId)) {
285 private String extractSpanLink(OMSAttributes omsAttributes, String linkId, String srcId)
286 throws GnpyException {
288 SpanAttributes span = omsAttributes.getSpan();
289 String destId = extractSpan(span, linkId, linkId);
290 if (createNewConnection(srcId, destId)) {
296 private String extractILAFromAmpLink(Ila ila) throws GnpyException {
297 String nodeId = ila.getNodeId().getValue();
298 mapDisgNodeRefNode.put(nodeId, nodeId);
299 Elements element = createElementsEdfa(LATITUDE, LONGITUTE, REGION, CITY,
300 ila.getGain().getValue().decimalValue(), ila.getTilt().getValue().decimalValue(),
301 ila.getOutVoaAtt().getValue().decimalValue(), "std_medium_gain",
303 this.elements.put(element.key(),element);
307 private String extractSpan(SpanAttributes span, String linkId, String subLinkId) throws GnpyException {
308 if (!mapLinkFiber.containsKey(linkId)) {
309 mapLinkFiber.put(linkId, new ArrayList<>());
311 mapLinkFiber.get(linkId).add(subLinkId);
312 //mapFiberIp.put(subLinkId, ipFiber);
313 //fiberId = incrementIdentifier(fiberId);
317 String typeVariety = "SSMF";
319 // Compute the length of the link
320 for (LinkConcatenation linkConcatenation : span.nonnullLinkConcatenation().values()) {
321 double srlgLength = linkConcatenation.getSRLGLength().doubleValue();
322 //convert to kilometer
323 length += srlgLength / CONVERT_KM_M;
326 throw new GnpyException(String.format(
327 "In gnpyTopoImpl: length of the link %s is equal to zero",linkId));
329 double lossCoef = span.getSpanlossCurrent().getValue().doubleValue() / length;
330 Elements element = createElementsFiber(LATITUDE, LONGITUTE, REGION, CITY,
331 subLinkId, length, attIn, lossCoef, connIn, connOut, typeVariety);
332 this.elements.put(element.key(),element);
337 * Method to create Fiber
339 private Elements createElementsFiber(double latitude, double longitude, String region, String city, String uidFiber,
340 double length, double attIn, double lossCoef, double connIn, double connOut, String typeVariety) {
341 // Create an amplifier after the ROADM
342 Coordinate c1 = new Coordinate(Decimal64.valueOf(String.valueOf(latitude)));
343 Coordinate c2 = new Coordinate(Decimal64.valueOf(String.valueOf(longitude)));
344 Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2)
346 Metadata metadata1 = new MetadataBuilder().setLocation(location1).build();
347 Fiber fiber = new FiberBuilder()
348 .setLength(Decimal64.valueOf(String.valueOf(length)))
349 .setLengthUnits(Km.VALUE)
350 .setAttIn(Decimal64.valueOf(String.valueOf(attIn)))
351 .setLossCoef(Decimal64.valueOf(String.valueOf(lossCoef)).scaleTo(5, RoundingMode.CEILING))
352 .setConIn(Decimal64.valueOf(String.valueOf(connIn)))
353 .setConOut(Decimal64.valueOf(String.valueOf(connOut)))
355 Params params1 = new ParamsBuilder().setFiberroadmfused(fiber).build();
356 return new ElementsBuilder().setUid(uidFiber)
357 .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Fiber.VALUE)
358 .setTypeVariety(typeVariety).setMetadata(metadata1)
359 .setElementType(new FiberRoadmBuilder().setParams(params1).build()).build();
363 * Method to create EDFA
365 private Elements createElementsEdfa(double latitude, double longitude, String region, String city,
366 BigDecimal gainTarget, BigDecimal tiltTarget, BigDecimal outVoa, String typeVariety, String uidEdfa) {
367 // Create an amplifier after the ROADM
368 Coordinate c1 = new Coordinate(Decimal64.valueOf(String.valueOf(latitude)));
369 Coordinate c2 = new Coordinate(Decimal64.valueOf(String.valueOf(longitude)));
370 Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2)
372 Metadata metadata1 = new MetadataBuilder().setLocation(location1).build();
373 Operational operational = new OperationalBuilder()
374 .setGainTarget(Decimal64.valueOf(gainTarget))
375 .setTiltTarget(Decimal64.valueOf(tiltTarget))
376 .setOutVoa(Decimal64.valueOf(outVoa))
378 Edfa edfa = new EdfaBuilder()
379 .setOperational(operational).build();
380 return new ElementsBuilder().setUid(uidEdfa)
381 .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Edfa.VALUE)
382 .setMetadata(metadata1).setElementType(edfa).setTypeVariety(typeVariety).build();
386 * Method to create ROADM
388 private Elements createElementsRoadm(double latitude, double longitude, String region, String city,
389 double targetPchOutDb, String uidRoadm) {
390 Coordinate c1 = new Coordinate(Decimal64.valueOf(String.valueOf(latitude)));
391 Coordinate c2 = new Coordinate(Decimal64.valueOf(String.valueOf(longitude)));
392 Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2)
394 Metadata metadata1 = new MetadataBuilder().setLocation(location1).build();
395 Roadm roadm = new RoadmBuilder()
396 .setTargetPchOutDb(Decimal64.valueOf(String.valueOf(targetPchOutDb)))
398 Params params1 = new ParamsBuilder().setFiberroadmfused(roadm).build();
399 return new ElementsBuilder().setUid(uidRoadm)
400 .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Roadm.VALUE)
401 .setMetadata(metadata1).setElementType(new FiberRoadmBuilder().setParams(params1).build()).build();
405 * Method to create Transceiver
407 private Elements createElementsTransceiver(double latitude, double longitude, String region, String city,
409 Coordinate c1 = new Coordinate(Decimal64.valueOf(String.valueOf(latitude)));
410 Coordinate c2 = new Coordinate(Decimal64.valueOf(String.valueOf(longitude)));
411 Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2)
413 Metadata metadata1 = new MetadataBuilder().setLocation(location1).build();
414 Transceiver transceiver = new TransceiverBuilder().build();
415 return new ElementsBuilder().setUid(uidTrans)
416 .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Transceiver.VALUE)
417 .setMetadata(metadata1).setElementType(transceiver).build();
421 * Method to create Connection
423 private boolean createNewConnection(String fromNode, String toNode) throws GnpyException {
424 if (fromNode == null || toNode == null) {
425 throw new GnpyException("create new connection : null node IpAddress");
427 if (fromNode.equals(toNode)) {
430 Connections connection = new ConnectionsBuilder().setFromNode(fromNode).setToNode(toNode).build();
431 this.connections.add(connection);
435 public Map<ElementsKey, Elements> getElements() {
439 public void setElements(Map<ElementsKey, Elements> elements) {
440 this.elements = elements;
443 public List<Connections> getConnections() {
447 public void setConnections(List<Connections> connections) {
448 this.connections = connections;
451 public List<String> getElementsList() {
455 public void setElementsList(List<String> elementsList) {
456 this.elementsList = elementsList;
459 public Map<String, String> getMapDisgNodeRefNode() {
460 return mapDisgNodeRefNode;
463 public void setMapDisgNodeRefNode(Map<String, String> mapDisgNodeRefNode) {
464 this.mapDisgNodeRefNode = mapDisgNodeRefNode;
467 public Map<String, List<String>> getMapLinkFiber() {
471 public void setMapLinkFiber(Map<String, List<String>> mapLinkFiber) {
472 this.mapLinkFiber = mapLinkFiber;
475 public List<String> getTrxList() {
479 public void setTrxList(List<String> trxList) {
480 this.trxList = trxList;