summaryrefslogtreecommitdiffstats
path: root/src/org/uic
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/org/uic/barcode/Decoder.java232
-rw-r--r--src/org/uic/barcode/Encoder.java259
-rw-r--r--src/org/uic/barcode/dynamicFrame/Constants.java38
-rw-r--r--src/org/uic/barcode/dynamicFrame/DataType.java (renamed from src/org/uic/header/DataType.java)42
-rw-r--r--src/org/uic/barcode/dynamicFrame/DynamicFrame.java263
-rw-r--r--src/org/uic/barcode/dynamicFrame/Level1DataType.java218
-rw-r--r--src/org/uic/barcode/dynamicFrame/Level2DataType.java98
-rw-r--r--src/org/uic/barcode/dynamicFrame/SequenceOfDataType.java (renamed from src/org/uic/header/SequenceOfDataType.java)2
-rw-r--r--src/org/uic/barcode/dynamicFrame/headerSpec.asn119
-rw-r--r--src/org/uic/barcode/dynamicFrame/package.html9
-rw-r--r--src/org/uic/barcode/package.html21
-rw-r--r--src/org/uic/barcode/staticFrame/DataRecord.java199
-rw-r--r--src/org/uic/barcode/staticFrame/GENERICDataRecord.java62
-rw-r--r--src/org/uic/barcode/staticFrame/StaticFrame.java762
-rw-r--r--src/org/uic/barcode/staticFrame/UFLEXDataRecord.java90
-rw-r--r--src/org/uic/barcode/staticFrame/UHEADDataRecord.java269
-rw-r--r--src/org/uic/barcode/staticFrame/UTLAYDataRecord.java272
-rw-r--r--src/org/uic/barcode/staticFrame/package.html21
-rw-r--r--src/org/uic/barcode/staticHeader/ticketLayoutBarcode/FormatType.java34
-rw-r--r--src/org/uic/barcode/staticHeader/ticketLayoutBarcode/LayoutElement.java50
-rw-r--r--src/org/uic/barcode/staticHeader/ticketLayoutBarcode/TicketLayout.java61
-rw-r--r--src/org/uic/barcode/test/DynamicFrameDoubleSignatureTest.java212
-rw-r--r--src/org/uic/barcode/test/DynamicFrameLOwLevelTest.java116
-rw-r--r--src/org/uic/barcode/test/DynamicFrameSimpleTest.java171
-rw-r--r--src/org/uic/barcode/test/SignatureSplitTest.java76
-rw-r--r--src/org/uic/barcode/test/StaticFrameBarcodeTest.java193
-rw-r--r--src/org/uic/barcode/test/TicketLayoutTest.java45
-rw-r--r--src/org/uic/barcode/test/utils/Level2TestDataFactory.java20
-rw-r--r--src/org/uic/barcode/test/utils/SimpleDynamicFrameTestBarcode.java80
-rw-r--r--src/org/uic/barcode/test/utils/SimpleTestTicketLayout.java33
-rw-r--r--src/org/uic/barcode/test/utils/SimpleUICTestTicket.java254
-rw-r--r--src/org/uic/barcode/test/utils/TestUtils.java38
-rw-r--r--src/org/uic/barcode/utils/AlgorithmNameResolver.java173
-rw-r--r--src/org/uic/barcode/utils/package.html20
-rw-r--r--src/org/uic/header/DataBlockType.java129
-rw-r--r--src/org/uic/header/DynamicHeader.java259
-rw-r--r--src/org/uic/header/Extension.java72
-rw-r--r--src/org/uic/header/SignedDataType.java67
-rw-r--r--src/org/uic/ticket/api/asn/omv2/BerthDetailData.java75
-rw-r--r--src/org/uic/ticket/api/asn/omv2/BerthTypeType.java41
-rw-r--r--src/org/uic/ticket/api/asn/omv2/CarCarriageReservationData.java692
-rw-r--r--src/org/uic/ticket/api/asn/omv2/CardReferenceType.java173
-rw-r--r--src/org/uic/ticket/api/asn/omv2/CodeTableType.java40
-rw-r--r--src/org/uic/ticket/api/asn/omv2/CompartmentDetailsType.java129
-rw-r--r--src/org/uic/ticket/api/asn/omv2/CompartmentGenderType.java42
-rw-r--r--src/org/uic/ticket/api/asn/omv2/CompartmentPositionType.java38
-rw-r--r--src/org/uic/ticket/api/asn/omv2/ConfirmationTypeType.java42
-rw-r--r--src/org/uic/ticket/api/asn/omv2/ControlData.java188
-rw-r--r--src/org/uic/ticket/api/asn/omv2/CountermarkData.java545
-rw-r--r--src/org/uic/ticket/api/asn/omv2/CustomerCardData.java286
-rw-r--r--src/org/uic/ticket/api/asn/omv2/CustomerStatusType.java89
-rw-r--r--src/org/uic/ticket/api/asn/omv2/DateTimeUtils.java198
-rw-r--r--src/org/uic/ticket/api/asn/omv2/DelayConfirmation.java321
-rw-r--r--src/org/uic/ticket/api/asn/omv2/DeltaCoordinates.java55
-rw-r--r--src/org/uic/ticket/api/asn/omv2/DocumentData.java58
-rw-r--r--src/org/uic/ticket/api/asn/omv2/ExtensionData.java61
-rw-r--r--src/org/uic/ticket/api/asn/omv2/FIPTicketData.java315
-rw-r--r--src/org/uic/ticket/api/asn/omv2/GenderType.java42
-rw-r--r--src/org/uic/ticket/api/asn/omv2/GeoCoordinateSystemType.java38
-rw-r--r--src/org/uic/ticket/api/asn/omv2/GeoCoordinateType.java136
-rw-r--r--src/org/uic/ticket/api/asn/omv2/GeoUnitType.java40
-rw-r--r--src/org/uic/ticket/api/asn/omv2/HemisphereLatitudeType.java37
-rw-r--r--src/org/uic/ticket/api/asn/omv2/HemisphereLongitudeType.java36
-rw-r--r--src/org/uic/ticket/api/asn/omv2/IncludedOpenTicketType.java422
-rw-r--r--src/org/uic/ticket/api/asn/omv2/IssuingData.java340
-rw-r--r--src/org/uic/ticket/api/asn/omv2/LineType.java174
-rw-r--r--src/org/uic/ticket/api/asn/omv2/LinkMode.java39
-rw-r--r--src/org/uic/ticket/api/asn/omv2/LoadingDeckType.java38
-rw-r--r--src/org/uic/ticket/api/asn/omv2/LuggageRestrictionType.java84
-rw-r--r--src/org/uic/ticket/api/asn/omv2/OpenTicketData.java632
-rw-r--r--src/org/uic/ticket/api/asn/omv2/ParkingGroundData.java342
-rw-r--r--src/org/uic/ticket/api/asn/omv2/PassData.java556
-rw-r--r--src/org/uic/ticket/api/asn/omv2/PassengerType.java46
-rw-r--r--src/org/uic/ticket/api/asn/omv2/PlacesType.java125
-rw-r--r--src/org/uic/ticket/api/asn/omv2/PolygoneType.java55
-rw-r--r--src/org/uic/ticket/api/asn/omv2/PriceTypeType.java39
-rw-r--r--src/org/uic/ticket/api/asn/omv2/RegionalValidityType.java94
-rw-r--r--src/org/uic/ticket/api/asn/omv2/RegisteredLuggageType.java76
-rw-r--r--src/org/uic/ticket/api/asn/omv2/ReservationData.java664
-rw-r--r--src/org/uic/ticket/api/asn/omv2/ReturnRouteDescriptionType.java141
-rw-r--r--src/org/uic/ticket/api/asn/omv2/RoofRackType.java46
-rw-r--r--src/org/uic/ticket/api/asn/omv2/RouteSectionType.java128
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfActivatedDays.java27
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfBerthDetailData.java10
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfCardReferenceType.java10
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfCarrierIA5.java13
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfCarrierNum.java29
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfCountries.java28
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfCustomerStatusType.java11
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfDeltaCoordinates.java10
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfDocumentData.java10
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfExtensionData.java10
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfIncludedOpenTicketType.java10
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfPlaceNum.java29
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfRegionalValidityType.java10
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfRegisteredLuggageType.java10
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfServiceBrands.java27
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfTariffType.java10
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfTicketLinkType.java10
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfTransportTypes.java27
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfTravelerId.java27
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfTravelerType.java10
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfVatDetail.java10
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SequenceOfViaStationType.java10
-rw-r--r--src/org/uic/ticket/api/asn/omv2/SeriesDetailType.java71
-rw-r--r--src/org/uic/ticket/api/asn/omv2/ServiceType.java38
-rw-r--r--src/org/uic/ticket/api/asn/omv2/StationPassageData.java363
-rw-r--r--src/org/uic/ticket/api/asn/omv2/TariffType.java194
-rw-r--r--src/org/uic/ticket/api/asn/omv2/TicketDetailData.java177
-rw-r--r--src/org/uic/ticket/api/asn/omv2/TicketLinkType.java148
-rw-r--r--src/org/uic/ticket/api/asn/omv2/TicketType.java41
-rw-r--r--src/org/uic/ticket/api/asn/omv2/TimeRangeType.java56
-rw-r--r--src/org/uic/ticket/api/asn/omv2/TokenType.java87
-rw-r--r--src/org/uic/ticket/api/asn/omv2/TrainLinkType.java172
-rw-r--r--src/org/uic/ticket/api/asn/omv2/TravelClassType.java50
-rw-r--r--src/org/uic/ticket/api/asn/omv2/TravelerData.java79
-rw-r--r--src/org/uic/ticket/api/asn/omv2/TravelerType.java303
-rw-r--r--src/org/uic/ticket/api/asn/omv2/UicRailTicketData.java110
-rw-r--r--src/org/uic/ticket/api/asn/omv2/ValidityPeriodDetailType.java70
-rw-r--r--src/org/uic/ticket/api/asn/omv2/ValidityPeriodType.java157
-rw-r--r--src/org/uic/ticket/api/asn/omv2/VatDetailType.java82
-rw-r--r--src/org/uic/ticket/api/asn/omv2/ViaStationType.java170
-rw-r--r--src/org/uic/ticket/api/asn/omv2/VoucherData.java298
-rw-r--r--src/org/uic/ticket/api/asn/omv2/ZoneType.java171
-rw-r--r--src/org/uic/ticket/api/asn/omv2/uicBarcodeFCBv2.0.asn2039
-rw-r--r--src/org/uic/ticket/api/spec/IBerthTypeType.java41
-rw-r--r--src/org/uic/ticket/api/spec/ICompartmentGenderType.java42
-rw-r--r--src/org/uic/ticket/api/spec/ICompartmentPositionType.java38
-rw-r--r--src/org/uic/ticket/api/spec/IGenderType.java42
-rw-r--r--src/org/uic/ticket/api/spec/IGeoCoordinateSystemType.java38
-rw-r--r--src/org/uic/ticket/api/spec/IGeoUnitType.java40
-rw-r--r--src/org/uic/ticket/api/spec/IHemisphereLatitudeType.java37
-rw-r--r--src/org/uic/ticket/api/spec/IHemisphereLongitudeType.java36
-rw-r--r--src/org/uic/ticket/api/spec/ILinkMode.java39
-rw-r--r--src/org/uic/ticket/api/spec/ILoadingDeckType.java38
-rw-r--r--src/org/uic/ticket/api/spec/IPassengerType.java46
-rw-r--r--src/org/uic/ticket/api/spec/IPriceTypeType.java39
-rw-r--r--src/org/uic/ticket/api/spec/IRoofRackType.java46
-rw-r--r--src/org/uic/ticket/api/spec/IServiceType.java38
-rw-r--r--src/org/uic/ticket/api/spec/IStationCodeTable.java25
-rw-r--r--src/org/uic/ticket/api/spec/ITicketType.java41
-rw-r--r--src/org/uic/ticket/api/spec/ITravelClassType.java49
-rw-r--r--src/org/uic/ticket/api/test/SimpleUicTestTicket.java245
-rw-r--r--src/org/uic/ticket/api/utils/Api2OpenAsnEncoderV2.java2299
-rw-r--r--src/org/uic/ticket/api/utils/OpenAsn2ApiDecoderV2.java2246
145 files changed, 22991 insertions, 535 deletions
diff --git a/src/org/uic/barcode/Decoder.java b/src/org/uic/barcode/Decoder.java
new file mode 100644
index 0000000..2ce417c
--- /dev/null
+++ b/src/org/uic/barcode/Decoder.java
@@ -0,0 +1,232 @@
+package org.uic.barcode;
+
+import java.io.IOException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PublicKey;
+import java.security.SignatureException;
+import java.util.zip.DataFormatException;
+
+import org.uic.barcode.dynamicFrame.Constants;
+import org.uic.barcode.dynamicFrame.DataType;
+import org.uic.barcode.dynamicFrame.DynamicFrame;
+import org.uic.barcode.dynamicFrame.Level1DataType;
+import org.uic.barcode.dynamicFrame.Level2DataType;
+import org.uic.barcode.dynamicFrame.SequenceOfDataType;
+import org.uic.barcode.staticFrame.StaticFrame;
+import org.uic.barcode.staticFrame.UFLEXDataRecord;
+import org.uic.barcode.staticFrame.UTLAYDataRecord;
+import org.uic.barcode.staticHeader.ticketLayoutBarcode.TicketLayout;
+import org.uic.ticket.EncodingFormatException;
+import org.uic.ticket.UicRailTicketCoder;
+import org.uic.ticket.api.spec.IUicRailTicket;
+
+
+/**
+ * The Class Decoder.
+ *
+ * signature validation and decoding of UIC bar codes
+ *
+ */
+public class Decoder {
+
+
+ /** The dynamic frame. */
+ private DynamicFrame dynamicFrame = null;
+
+ /** The static frame. */
+ private StaticFrame staticFrame = null;
+
+ /** The uic ticket coder. */
+ private UicRailTicketCoder uicTicketCoder = null;
+
+ /** The uic ticket. */
+ private IUicRailTicket uicTicket = null;
+
+ /** The layout. */
+ private TicketLayout layout = null;
+
+ /** The data. */
+ byte[] data = null;
+
+
+ /**
+ * Instantiates a new decoder.
+ *
+ * @param data the data
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ * @throws DataFormatException the data format exception
+ */
+ public Decoder (byte[] data) throws IOException, EncodingFormatException, DataFormatException {
+ this.data = data;
+ decode(data);
+ }
+
+ /**
+ * Validate level 1.
+ *
+ * @param key the public key
+ * @param signingAlg the signing algorithm OID
+ * @return the return code indicating errors
+ * @throws InvalidKeyException the invalid key exception
+ * @throws NoSuchAlgorithmException the no such algorithm exception
+ * @throws SignatureException the signature exception
+ * @throws IllegalArgumentException the illegal argument exception
+ * @throws UnsupportedOperationException the unsupported operation exception
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ public int validateLevel1(PublicKey key, String signingAlg) throws InvalidKeyException, NoSuchAlgorithmException, SignatureException, IllegalArgumentException, UnsupportedOperationException, IOException, EncodingFormatException {
+ if (!isStaticHeader(data)) {
+ return dynamicFrame.validateLevel1(key) ;
+ } else {
+ if (staticFrame.verifyByAlgorithmOid(key,signingAlg)) {
+ return Constants.LEVEL1_VALIDATION_OK;
+ } else {
+ return Constants.LEVEL1_VALIDATION_FRAUD;
+ }
+ }
+ }
+
+ /**
+ * Validate level 2.
+ *
+ * @return the return code indicating errors
+ */
+ public int validateLevel2() {
+ if (!isStaticHeader(data)) {
+ return dynamicFrame.validateLevel2() ;
+ } else {
+ return Constants.LEVEL2_VALIDATION_NO_SIGNATURE;
+ }
+ }
+
+ /**
+ * Decode.
+ *
+ * @param data the byte array raw data
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ * @throws DataFormatException the data format exception
+ */
+ public void decode(byte[] data) throws IOException, EncodingFormatException, DataFormatException {
+
+ if (!isStaticHeader(data)) {
+
+ dynamicFrame = DynamicFrame.decode(data);
+
+ Level2DataType level2 = dynamicFrame.getLevel2SignedData();
+
+ Level1DataType level1 = level2.getLevel1Data();
+
+ SequenceOfDataType dataList = level1.getData();
+
+ for (DataType level1Content : dataList) {
+
+ uicTicketCoder = new UicRailTicketCoder();
+ if (level1Content.getFormat().equals("FCB1")) {
+ uicTicket = uicTicketCoder.decodeFromAsn(level1Content.getByteData(), 1);
+ } else if (level1Content.getFormat().equals("FCB2")) {
+ uicTicket = uicTicketCoder.decodeFromAsn(level1Content.getByteData(), 2);
+ }
+ }
+
+ } else if (isStaticHeader(data)){
+
+ staticFrame = new StaticFrame();
+
+ staticFrame.decode(data);
+
+ UFLEXDataRecord flex = staticFrame.getuFlex();
+
+ if (flex != null) {
+ uicTicket = flex.getTicket();
+ }
+
+ UTLAYDataRecord tlay = staticFrame.getuTlay();
+
+ if (tlay != null) {
+ layout = tlay.getLayout();
+ }
+ }
+ }
+
+
+ /**
+ * Checks if is static header.
+ *
+ * @param data the data
+ * @return true, if is static header
+ */
+ private boolean isStaticHeader(byte[] data) {
+ byte[] start = "#UT".getBytes();
+ if (start[0] != data[0] || start[1]!= start[1] || start[2] != data[2]) return false;
+ return true;
+ }
+
+ /**
+ * Gets the uic ticket.
+ *
+ * @return the uic ticket
+ */
+ public IUicRailTicket getUicTicket() {
+ return uicTicket;
+ }
+
+ /**
+ * Gets the layout.
+ *
+ * @return the layout
+ */
+ public TicketLayout getLayout() {
+ return layout;
+ }
+
+ /**
+ * Gets the dynamic header.
+ *
+ * @return the dynamic header
+ */
+ public DynamicFrame getDynamicHeader() {
+ return dynamicFrame;
+ }
+
+ /**
+ * Sets the dynamic header.
+ *
+ * @param dynamicHeader the new dynamic header
+ */
+ public void setDynamicHeader(DynamicFrame dynamicHeader) {
+ this.dynamicFrame = dynamicHeader;
+ }
+
+ /**
+ * Gets the static frame.
+ *
+ * @return the static frame
+ */
+ public StaticFrame getStaticFrame() {
+ return staticFrame;
+ }
+
+ /**
+ * Sets the static frame.
+ *
+ * @param staticFrame the new static frame
+ */
+ public void setStaticFrame(StaticFrame staticFrame) {
+ this.staticFrame = staticFrame;
+ }
+
+ public DataType getLevel2Data() {
+ if (!isStaticHeader(data) && dynamicFrame.getLevel2SignedData() != null) {
+ return dynamicFrame.getLevel2SignedData().getLevel2Data();
+ }
+ return null;
+ }
+
+
+
+
+}
diff --git a/src/org/uic/barcode/Encoder.java b/src/org/uic/barcode/Encoder.java
new file mode 100644
index 0000000..301b7c5
--- /dev/null
+++ b/src/org/uic/barcode/Encoder.java
@@ -0,0 +1,259 @@
+package org.uic.barcode;
+
+import java.io.IOException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+
+import org.uic.barcode.dynamicFrame.Constants;
+import org.uic.barcode.dynamicFrame.DataType;
+import org.uic.barcode.dynamicFrame.DynamicFrame;
+import org.uic.barcode.dynamicFrame.Level1DataType;
+import org.uic.barcode.dynamicFrame.Level2DataType;
+import org.uic.barcode.dynamicFrame.SequenceOfDataType;
+import org.uic.barcode.staticFrame.StaticFrame;
+import org.uic.barcode.staticFrame.UFLEXDataRecord;
+import org.uic.barcode.staticFrame.UHEADDataRecord;
+import org.uic.barcode.staticFrame.UTLAYDataRecord;
+import org.uic.barcode.staticHeader.ticketLayoutBarcode.TicketLayout;
+import org.uic.ticket.EncodingFormatException;
+import org.uic.ticket.UicRailTicketCoder;
+import org.uic.ticket.api.spec.IUicRailTicket;
+
+import net.gcdc.asn1.datatypesimpl.OctetString;
+
+
+/**
+ * The Class Encoder.
+ *
+ * signing and encoding of UIC bar codes
+ *
+ *
+ */
+public class Encoder {
+
+ /** The dynamic frame. */
+ private DynamicFrame dynamicFrame = null;
+
+ /** The static frame. */
+ private StaticFrame staticFrame = null;
+
+
+ /** The UIC bar code type classic. */
+ public static String UIC_BARCODE_TYPE_CLASSIC = "UIC_CLASSIC";
+
+ /** The UIC bar code type DOSIPAS. */
+ public static String UIC_BARCODE_TYPE_DOSIPAS = "UIC_DOSIPAS";
+
+ /**
+ * Instantiates a new encoder.
+ *
+ * @param ticket the ticket
+ * @param layout the layout
+ * @param barcodeType the bar code type
+ * @param version the version of the bar code
+ * @param fcbVersion the fcb version
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ public Encoder(IUicRailTicket ticket, TicketLayout layout, String barcodeType, int version, int fcbVersion) throws IOException, EncodingFormatException {
+
+ if (barcodeType == UIC_BARCODE_TYPE_CLASSIC) {
+
+ staticFrame = new StaticFrame();
+ staticFrame.setVersion(version);
+
+ if (layout != null) {
+
+ UHEADDataRecord head = new UHEADDataRecord();
+ head.setVersionId("01");
+ staticFrame.setHeaderRecord(head);
+
+ UTLAYDataRecord tlay = new UTLAYDataRecord();
+ tlay.setLayout(layout);
+ tlay.setVersionId("01");
+ staticFrame.setuTlay(tlay);
+ }
+
+ if (ticket != null) {
+
+ UFLEXDataRecord flex = new UFLEXDataRecord();
+ flex.setTicket(ticket);
+ flex.setVersionId(String.format("%02d",fcbVersion));
+ staticFrame.setuFlex(flex);
+ }
+
+
+ } else if (barcodeType == UIC_BARCODE_TYPE_DOSIPAS) {
+
+ dynamicFrame = new DynamicFrame();
+ dynamicFrame.setLevel2SignedData(new Level2DataType());
+ dynamicFrame.getLevel2SignedData().setLevel1Data(new Level1DataType());
+ dynamicFrame.getLevel2SignedData().getLevel1Data().setData(new SequenceOfDataType());
+
+ if (ticket != null) {
+
+ if (version == 1) {
+ dynamicFrame.setFormat("U1");
+ }
+
+ DataType ticketData = new DataType();
+
+ UicRailTicketCoder uicTicketCoder = new UicRailTicketCoder();
+ ticketData.setFormat(Constants.DATA_TYPE_FCB_VERSION_1);
+ ticketData.setData(new OctetString(uicTicketCoder.encode(ticket, fcbVersion)));
+ dynamicFrame.getLevel2SignedData().getLevel1Data().getData().add(ticketData);
+
+ }
+ }
+ }
+
+
+
+ /**
+ * Signing level 2 of a dynamic bar code
+ *
+ * @param key the key
+ * @throws Exception the exception
+ */
+ public void signLevel2(PrivateKey key) throws Exception {
+ if (dynamicFrame != null) {
+ dynamicFrame.signLevel2(key);
+ }
+ }
+
+ /**
+ * Sets the level 1 algorithm Is.
+ *
+ * @param level1SigningAlg the level 1 signing algorithm (OID)
+ * @param level1KeyAlg the level 1 key algorithm (OID)
+ */
+ public void setLevel1Algs(String level1SigningAlg, String level1KeyAlg) {
+ if (dynamicFrame != null) {
+ dynamicFrame.getLevel2SignedData().getLevel1Data().setLevel1SigningAlg(level1SigningAlg);
+ dynamicFrame.getLevel2SignedData().getLevel1Data().setLevel1KeyAlg(level1KeyAlg);
+ }
+ }
+
+ /**
+ * Sets the level 2 algorithm Is.
+ *
+ * @param level2SigningAlg the level 2 signing algorithm (OID)
+ * @param level2KeyAlg the level 2 key algorithm (OID)
+ * @param publicKey the public key of the level 2 signature
+ */
+ public void setLevel2Algs(String level2SigningAlg, String level2KeyAlg, PublicKey publicKey) {
+ if (dynamicFrame != null) {
+ if (dynamicFrame.getLevel2SignedData() == null) {
+ dynamicFrame.setLevel2SignedData(new Level2DataType());
+ }
+ if (dynamicFrame.getLevel2SignedData().getLevel1Data() == null) {
+ dynamicFrame.getLevel2SignedData().setLevel1Data(new Level1DataType());
+ }
+ dynamicFrame.getLevel2SignedData().getLevel1Data().setLevel2SigningAlg(level2SigningAlg);
+ dynamicFrame.getLevel2SignedData().getLevel1Data().setLevel2KeyAlg(level2KeyAlg);
+ if (publicKey != null) {
+ dynamicFrame.getLevel2SignedData().getLevel1Data().setLevel2publicKey(new OctetString(publicKey.getEncoded()));
+ }
+ }
+ }
+
+ public void setLevel2Data(DataType level2data) {
+ if (dynamicFrame != null) {
+ if (dynamicFrame.getLevel2SignedData() == null) {
+ dynamicFrame.setLevel2SignedData(new Level2DataType());
+ }
+ dynamicFrame.getLevel2SignedData().setLevel2Data(level2data);
+ }
+ }
+
+ public DataType getLevel2Data() {
+ if (dynamicFrame != null && dynamicFrame.getLevel2SignedData() != null) {
+ return dynamicFrame.getLevel2SignedData().getLevel2Data();
+ }
+ return null;
+ }
+
+ /**
+ * Sign level 1 of a dynamic bar code or a static bar code.
+ *
+ * @param securityProvider the security provider
+ * @param key the key
+ * @param signingAlg the signing algorithm (OID)
+ * @param keyId the key id
+ * @throws Exception the exception
+ */
+ public void signLevel1(String securityProvider,PrivateKey key,String signingAlg, String keyId) throws Exception {
+ if (dynamicFrame != null) {
+ dynamicFrame.getLevel2SignedData().getLevel1Data().setSecurityProvider(securityProvider);
+ dynamicFrame.getLevel2SignedData().getLevel1Data().setLevel1SigningAlg(signingAlg);
+ dynamicFrame.getLevel2SignedData().getLevel1Data().setKeyId(Long.parseLong(keyId));
+ dynamicFrame.getLevel2SignedData().signLevel1(key);
+ } else if (staticFrame != null) {
+ staticFrame.setSignatureKey(keyId);
+ staticFrame.setSecurityProvider(securityProvider);
+ if (staticFrame.getHeaderRecord()!= null && staticFrame.getHeaderRecord().getIssuer() == null) {
+ staticFrame.getHeaderRecord().setIssuer(securityProvider);
+ }
+ staticFrame.signByAlgorithmOID(key,signingAlg);
+ }
+ }
+
+ /**
+ * Sets the static header parameter.
+ *
+ * @param ticketId the ticket id
+ * @param language the language
+ */
+ public void setStaticHeaderParams(String ticketId,String language) {
+ if (staticFrame != null && staticFrame.getHeaderRecord()!= null) {
+ staticFrame.getHeaderRecord().setIdentifier(ticketId);
+ staticFrame.getHeaderRecord().setLanguage(language);
+ }
+ }
+
+ /**
+ * Gets the dynamic frame.
+ *
+ * @return the dynamic frame
+ */
+ public DynamicFrame getDynamicFrame() {
+ return dynamicFrame;
+ }
+
+
+
+ /**
+ * Gets the static frame.
+ *
+ * @return the static frame
+ */
+ public StaticFrame getStaticFrame() {
+ return staticFrame;
+ }
+
+
+
+ /**
+ * Encodes the signed bar code data
+ *
+ * @return the byte[]
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws Exception the exception
+ */
+ public byte[] encode() throws IOException, Exception {
+ if (dynamicFrame != null) {
+ return dynamicFrame.encode();
+ } else if (staticFrame != null) {
+ return staticFrame.encode();
+ }
+ return null;
+ }
+
+
+
+
+
+
+
+
+}
diff --git a/src/org/uic/barcode/dynamicFrame/Constants.java b/src/org/uic/barcode/dynamicFrame/Constants.java
new file mode 100644
index 0000000..98b62aa
--- /dev/null
+++ b/src/org/uic/barcode/dynamicFrame/Constants.java
@@ -0,0 +1,38 @@
+package org.uic.barcode.dynamicFrame;
+
+public class Constants {
+
+ /*
+ * Object Identifier for recommended signature algorithms
+ *
+ */
+ public static String KG_EC_256 = "1.2.840.10045.3.1.7";
+ public static String KG_EC = "1.2.840.10045.2.1";
+ public static String ECDSA_SHA256 = "1.2.840.10045.4.3.2";
+
+ public static String DSA_SHA1 = "1.2.840.10040.4.3";
+ public static String DSA_SHA224 = "2.16.840.1.101.3.4.3.1";
+ public static String DSA_SHA248 = "2.16.840.1.101.3.4.3.2";
+
+ public static String DATA_TYPE_FCB_VERSION_1 = "FCB1";
+ public static String DATA_TYPE_FCB_VERSION_2 = "FCB2";
+
+ public static String DYNAMIC_BARCODE_FORMAT_DEFAULT = "U1";
+
+ public static int LEVEL2_VALIDATION_OK = 0;
+ public static int LEVEL2_VALIDATION_NO_KEY = 1;
+ public static int LEVEL2_VALIDATION_NO_SIGNATURE = 2;
+ public static int LEVEL2_VALIDATION_FRAUD = 3;
+ public static int LEVEL2_VALIDATION_SIG_ALG_NOT_IMPLEMENTED = 4;
+ public static int LEVEL2_VALIDATION_KEY_ALG_NOT_IMPLEMENTED = 5;
+ public static int LEVEL2_VALIDATION_ENCODING_ERROR = 6;
+
+ public static int LEVEL1_VALIDATION_OK = 0;
+ public static int LEVEL1_VALIDATION_NO_KEY = 1;
+ public static int LEVEL1_VALIDATION_NO_SIGNATURE = 2;
+ public static int LEVEL1_VALIDATION_FRAUD = 3;
+ public static int LEVEL1_VALIDATION_SIG_ALG_NOT_IMPLEMENTED = 4;
+ public static int LEVEL1_VALIDATION_KEY_ALG_NOT_IMPLEMENTED = 5;
+ public static int LEVEL1_VALIDATION_ENCODING_ERROR = 6;
+
+}
diff --git a/src/org/uic/header/DataType.java b/src/org/uic/barcode/dynamicFrame/DataType.java
index d4e15f7..fb84db6 100644
--- a/src/org/uic/header/DataType.java
+++ b/src/org/uic/barcode/dynamicFrame/DataType.java
@@ -1,8 +1,11 @@
-package org.uic.header;
+package org.uic.barcode.dynamicFrame;
import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.RestrictedString;
import net.gcdc.asn1.datatypes.Sequence;
import net.gcdc.asn1.datatypesimpl.OctetString;
+import net.gcdc.asn1.uper.UperEncoder;
/**
* The Class DataType.
@@ -10,12 +13,7 @@ import net.gcdc.asn1.datatypesimpl.OctetString;
@Sequence
public class DataType {
- /*
- * -- format:
- -- FCB1 FCB version 1
- -- RICS company code + addon
- */
-
+
/** The data format.
*
* -- FCB1 FCB version 1
@@ -23,6 +21,7 @@ public class DataType {
* -- RICS company code + ...
**/
@Asn1Default("FCB1")
+ @RestrictedString(CharacterRestriction.IA5String)
public String format;
/** The data. */
@@ -63,5 +62,34 @@ public class DataType {
public void setData(OctetString data) {
this.data = data;
}
+
+ /**
+ * Gets the data as byte array.
+ *
+ * @return the data
+ */
+ public byte[] getByteData() {
+ return data.toByteArray();
+ }
+
+ /**
+ * Sets the data from a byte array.
+ *
+ * @param data the new data
+ */
+ public void setByteData(byte[] data) {
+ this.data = new OctetString(data);
+ }
+
+ /**
+ * Encode.
+ *
+ * Encode the header as ASN.1 PER UNALIGNED byte array
+ *
+ * @return the byte[]
+ */
+ public byte[] encode() {
+ return UperEncoder.encode(this);
+ }
}
diff --git a/src/org/uic/barcode/dynamicFrame/DynamicFrame.java b/src/org/uic/barcode/dynamicFrame/DynamicFrame.java
new file mode 100644
index 0000000..445990a
--- /dev/null
+++ b/src/org/uic/barcode/dynamicFrame/DynamicFrame.java
@@ -0,0 +1,263 @@
+package org.uic.barcode.dynamicFrame;
+
+import java.security.InvalidKeyException;
+import java.security.KeyFactory;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.Signature;
+import java.security.SignatureException;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.X509EncodedKeySpec;
+
+import org.uic.barcode.utils.AlgorithmNameResolver;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+import net.gcdc.asn1.datatypesimpl.OctetString;
+import net.gcdc.asn1.uper.UperEncoder;
+
+
+/**
+ * The DynamicHeader for bar codes
+ *
+ * Implementation of the Draft under discussion, not final.
+ */
+@Sequence
+@HasExtensionMarker
+public class DynamicFrame extends Object{
+
+ public DynamicFrame() {}
+
+ /** The format. */
+ @RestrictedString(CharacterRestriction.IA5String)
+ public String format;
+
+ /*level 2 data*/
+ Level2DataType level2SignedData;
+
+
+ /** The signature of level 2 data*/
+ @Asn1Optional public OctetString level2Signature;
+
+ /**
+ * Gets the format.
+ *
+ * @return the format
+ */
+ public String getFormat() {
+ return format;
+ }
+
+ /**
+ * Sets the format.
+ *
+ * @param format the new format
+ */
+ public void setFormat(String format) {
+ this.format = format;
+ }
+
+ public Level2DataType getLevel2SignedData() {
+ return level2SignedData;
+ }
+
+ public void setLevel2SignedData(Level2DataType level2SignedData) {
+ this.level2SignedData = level2SignedData;
+ }
+
+ public OctetString getLevel2Signature() {
+ return level2Signature;
+ }
+
+ public void setLevel2Signature(OctetString level2Signature) {
+ this.level2Signature = level2Signature;
+ }
+
+ /**
+ * Encode.
+ *
+ * Encode the header as ASN.1 PER UNALIGNED byte array
+ *
+ * @return the byte[]
+ */
+ public byte[] encode() {
+ return UperEncoder.encode(this);
+ }
+
+ /**
+ * Decode.
+ *
+ * Decode the header from an ASN.1 PER UNALIGNED encoded byte array
+ *
+ * @param bytes the bytes
+ * @return the dynamic header
+ */
+ public static DynamicFrame decode(byte[] bytes) {
+ return UperEncoder.decode(bytes, DynamicFrame.class);
+ }
+
+ /**
+ * Verify the level 2 signature
+ *
+ * Note: an appropriate security provider (e.g. BC) must be registered before
+ *
+ */
+ public int validateLevel2() {
+
+
+ String level2KeyAlg = this.getLevel2SignedData().getLevel1Data().level2KeyAlg;
+
+ if (level2KeyAlg == null || level2KeyAlg.length() == 0) {
+ return Constants.LEVEL2_VALIDATION_NO_KEY;
+ }
+
+ if (this.level2Signature.toByteArray() == null || this.level2Signature.toByteArray().length == 0) {
+ return Constants.LEVEL2_VALIDATION_NO_SIGNATURE;
+ }
+
+
+
+ String keyAlgName = null;
+ try {
+ keyAlgName = AlgorithmNameResolver.getName(AlgorithmNameResolver.TYPE_KEY_GENERATOR_ALG, level2KeyAlg);
+ } catch (Exception e1) {
+ return Constants.LEVEL2_VALIDATION_KEY_ALG_NOT_IMPLEMENTED;
+ }
+ if (keyAlgName == null || keyAlgName.length() == 0) {
+ return Constants.LEVEL2_VALIDATION_KEY_ALG_NOT_IMPLEMENTED;
+ }
+
+ PublicKey key = null;
+ try {
+ key = KeyFactory.getInstance(keyAlgName).generatePublic(new X509EncodedKeySpec(this.getLevel2SignedData().getLevel1Data().level2publicKey.toByteArray()));
+ } catch (InvalidKeySpecException | NoSuchAlgorithmException e1) {
+ return Constants.LEVEL2_VALIDATION_KEY_ALG_NOT_IMPLEMENTED;
+ }
+
+ //find the algorithm name for the signature OID
+ String algo = null;
+ try {
+ algo = AlgorithmNameResolver.getName(AlgorithmNameResolver.TYPE_SIGNATURE_ALG,this.getLevel2SignedData().getLevel1Data().level2SigningAlg);
+ } catch (Exception e1) {
+ return Constants.LEVEL2_VALIDATION_SIG_ALG_NOT_IMPLEMENTED;
+ }
+ if (algo == null) {
+ return Constants.LEVEL2_VALIDATION_SIG_ALG_NOT_IMPLEMENTED;
+ }
+
+ Signature sig;
+ try {
+ sig = Signature.getInstance(algo);
+ } catch (NoSuchAlgorithmException e) {
+ return Constants.LEVEL2_VALIDATION_SIG_ALG_NOT_IMPLEMENTED;
+ }
+ try {
+ sig.initVerify(key);
+ } catch (InvalidKeyException e) {
+ return Constants.LEVEL2_VALIDATION_SIG_ALG_NOT_IMPLEMENTED;
+ }
+
+ try {
+ sig.update(UperEncoder.encode(level2SignedData));
+ } catch (SignatureException e) {
+ return Constants.LEVEL2_VALIDATION_SIG_ALG_NOT_IMPLEMENTED;
+ } catch (IllegalArgumentException e) {
+ return Constants.LEVEL2_VALIDATION_ENCODING_ERROR;
+ } catch (UnsupportedOperationException e) {
+ return Constants.LEVEL2_VALIDATION_ENCODING_ERROR;
+ }
+
+ byte[] signature = level2Signature.toByteArray();
+ try {
+ if (sig.verify(signature)){
+ return Constants.LEVEL2_VALIDATION_OK;
+ } else {
+ return Constants.LEVEL2_VALIDATION_FRAUD;
+ }
+ } catch (SignatureException e) {
+ return Constants.LEVEL2_VALIDATION_SIG_ALG_NOT_IMPLEMENTED;
+ }
+ }
+
+ /**
+ * Verify the level 1 signature
+ *
+ * Note: an appropriate security provider (e.g. BC) must be registered before
+ *
+ */
+ public int validateLevel1(PublicKey key) {
+
+ if (this.level2SignedData == null) {
+ return Constants.LEVEL1_VALIDATION_NO_SIGNATURE;
+ }
+
+
+ if (this.level2SignedData.level1Signature == null || this.level2SignedData.level1Signature.toByteArray().length == 0) {
+ return Constants.LEVEL1_VALIDATION_NO_SIGNATURE;
+ }
+
+ byte[] signature = this.getLevel2SignedData().level1Signature.toByteArray();
+
+ //find the algorithm name for the signature OID
+ String algo = null;
+ try {
+ algo = AlgorithmNameResolver.getSignatureAlgorithmName(getLevel2SignedData().getLevel1Data().level1SigningAlg);
+ } catch (Exception e1) {
+ return Constants.LEVEL1_VALIDATION_SIG_ALG_NOT_IMPLEMENTED;
+ }
+ if (algo == null) {
+ return Constants.LEVEL1_VALIDATION_SIG_ALG_NOT_IMPLEMENTED;
+ }
+
+ Signature sig;
+ try {
+ sig = Signature.getInstance(algo);
+ } catch (NoSuchAlgorithmException e) {
+ return Constants.LEVEL1_VALIDATION_SIG_ALG_NOT_IMPLEMENTED;
+ }
+ try {
+ sig.initVerify(key);
+ } catch (InvalidKeyException e) {
+ return Constants.LEVEL1_VALIDATION_SIG_ALG_NOT_IMPLEMENTED;
+ }
+
+ try {
+ sig.update(this.level2SignedData.level1Data.encode());
+ } catch (SignatureException e) {
+ return Constants.LEVEL1_VALIDATION_SIG_ALG_NOT_IMPLEMENTED;
+ } catch (IllegalArgumentException e) {
+ return Constants.LEVEL1_VALIDATION_ENCODING_ERROR;
+ } catch (UnsupportedOperationException e) {
+ return Constants.LEVEL1_VALIDATION_ENCODING_ERROR;
+ }
+
+
+ try {
+ if (sig.verify(signature)){
+ return Constants.LEVEL2_VALIDATION_OK;
+ } else {
+ return Constants.LEVEL2_VALIDATION_FRAUD;
+ }
+ } catch (SignatureException e) {
+ return Constants.LEVEL2_VALIDATION_SIG_ALG_NOT_IMPLEMENTED;
+ }
+ }
+
+ public void signLevel2(PrivateKey key) throws Exception {
+
+ //find the algorithm name for the signature OID
+ String algo = AlgorithmNameResolver.getSignatureAlgorithmName(this.getLevel2SignedData().getLevel1Data().level2SigningAlg);
+ Signature sig = Signature.getInstance(algo);
+ sig.initSign(key);
+ byte[] data = level2SignedData.encode();
+ sig.update(data);
+ this.level2Signature = new OctetString(sig.sign());
+
+ }
+
+
+}
diff --git a/src/org/uic/barcode/dynamicFrame/Level1DataType.java b/src/org/uic/barcode/dynamicFrame/Level1DataType.java
new file mode 100644
index 0000000..ac48ba8
--- /dev/null
+++ b/src/org/uic/barcode/dynamicFrame/Level1DataType.java
@@ -0,0 +1,218 @@
+package org.uic.barcode.dynamicFrame;
+
+import org.uic.ticket.EncodingFormatException;
+import org.uic.ticket.api.utils.UicEncoderUtils;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+import net.gcdc.asn1.datatypesimpl.OctetString;
+import net.gcdc.asn1.uper.UperEncoder;
+
+/**
+ * The Class SignedDataType.
+ */
+@Sequence
+public class Level1DataType {
+
+ /**
+ * The security provider
+ * numeric codes 1 ...32000
+ *
+ * */
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long securityProviderNum;
+
+ /** The security provider alphanumeric codes. */
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String securityProviderIA5;
+
+
+ /** The key id. */
+ @IntRange(minValue=1,maxValue=99999)
+ @Asn1Optional public Long keyId;
+
+
+ /** The data. */
+ public SequenceOfDataType data;
+
+ /**
+ * The key generator algorithms
+ * Object Identifier of the Algorithm
+ * Number notation:
+ *
+ * e.g.:
+ * -- DSA SHA224 2.16.840.1.101.3.4.3.1
+ * -- DSA SHA248 2.16.840.1.101.3.4.3.2
+ * -- ECC 256 1.2.840.10045.3.1.7
+ *
+ *
+ */
+ @RestrictedString(CharacterRestriction.ObjectIdentifier)
+ @Asn1Optional public String level1KeyAlg;
+
+
+ @RestrictedString(CharacterRestriction.ObjectIdentifier)
+ @Asn1Optional public String level2KeyAlg;
+
+ /**
+ * The signing algorithm
+ * Object Identifier of the Algorithms
+ * Number notation:
+ *
+ * e.g.:
+ * -- DSA SHA224 2.16.840.1.101.3.4.3.1
+ * -- DSA SHA248 2.16.840.1.101.3.4.3.2
+ * -- ECC 256 1.2.840.10045.3.1.7
+ *
+ *
+ */
+ @RestrictedString(CharacterRestriction.ObjectIdentifier)
+ @Asn1Optional public String level1SigningAlg;
+
+ @RestrictedString(CharacterRestriction.ObjectIdentifier)
+ @Asn1Optional public String level2SigningAlg;
+
+
+ /** The level 2 public key*/
+ @Asn1Optional public OctetString level2publicKey;
+
+
+
+ /**
+ * Gets the security provider num.
+ *
+ * @return the security provider num
+ */
+ public Long getSecurityProviderNum() {
+ return securityProviderNum;
+ }
+
+ /**
+ * Sets the security provider num.
+ *
+ * in case the security provider code is encoded in IA5 this will return null
+ *
+ * @param securityProviderNum the new security provider num
+ */
+ public void setSecurityProviderNum(Long securityProviderNum) {
+ this.securityProviderNum = securityProviderNum;
+ }
+
+ /**
+ * Gets the security provider IA5.
+ *
+ * in case the security provider code is encoded numerically this will return null
+ *
+ * @return the security provider IA5
+ */
+ public String getSecurityProviderIA5() {
+ return securityProviderIA5;
+ }
+
+ /**
+ * Sets the security provider
+ *
+ * The security provider code must use the IA5 Alphabet .
+ *
+ * @param securityProvider the new security provider
+ * @throws EncodingFormatException the encoding format exception
+ */
+ public void setSecurityProvider(String securityProvider) throws EncodingFormatException {
+ this.securityProviderNum = UicEncoderUtils.getNum(securityProvider);
+ this.securityProviderIA5 = UicEncoderUtils.getIA5NonNum(securityProvider);
+ }
+
+
+ /**
+ * Gets the security provider.
+ *
+ * @return the security provider
+ */
+ public String getSecurityProvider() {
+ return UicEncoderUtils.mapToString(this.securityProviderNum, this.securityProviderIA5);
+ }
+
+
+ /**
+ * Sets the security provider IA 5.
+ *
+ * @param securityProviderIA5 the new security provider IA 5
+ */
+ public void setSecurityProviderIA5(String securityProviderIA5) {
+ this.securityProviderIA5 = securityProviderIA5;
+ }
+
+ public Long getKeyId() {
+ return keyId;
+ }
+
+ public void setKeyId(Long keyId) {
+ this.keyId = keyId;
+ }
+
+ public SequenceOfDataType getData() {
+ return data;
+ }
+
+ public void setData(SequenceOfDataType data) {
+ this.data = data;
+ }
+
+ public String getLevel2KeyAlg() {
+ return level2KeyAlg;
+ }
+
+ public void setLevel2KeyAlg(String level2KeyAlg) {
+ this.level2KeyAlg = level2KeyAlg;
+ }
+
+ public String getLevel1SigningAlg() {
+ return level1SigningAlg;
+ }
+
+ public void setLevel1SigningAlg(String level1SigningAlg) {
+ this.level1SigningAlg = level1SigningAlg;
+ }
+
+ public String getLevel2SigningAlg() {
+ return level2SigningAlg;
+ }
+
+ public void setLevel2SigningAlg(String level2SigningAlg) {
+ this.level2SigningAlg = level2SigningAlg;
+ }
+
+ public OctetString getLevel2publicKey() {
+ return level2publicKey;
+ }
+
+ public void setLevel2publicKey(OctetString level2publicKey) {
+ this.level2publicKey = level2publicKey;
+ }
+
+
+
+ public String getLevel1KeyAlg() {
+ return level1KeyAlg;
+ }
+
+ public void setLevel1KeyAlg(String level1KeyAlg) {
+ this.level1KeyAlg = level1KeyAlg;
+ }
+
+ /**
+ * Gets the data for signature.
+ *
+ * The byte array containing the ASN.1 PER UNALIGNED encoded data of the DataBlock
+ *
+ *
+ * @return the data for signature
+ */
+ public byte[] encode() {
+ return UperEncoder.encode(this);
+
+ }
+}
diff --git a/src/org/uic/barcode/dynamicFrame/Level2DataType.java b/src/org/uic/barcode/dynamicFrame/Level2DataType.java
new file mode 100644
index 0000000..66e4225
--- /dev/null
+++ b/src/org/uic/barcode/dynamicFrame/Level2DataType.java
@@ -0,0 +1,98 @@
+package org.uic.barcode.dynamicFrame;
+
+import java.security.PrivateKey;
+import java.security.Signature;
+
+import org.uic.barcode.utils.AlgorithmNameResolver;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.Sequence;
+import net.gcdc.asn1.datatypesimpl.OctetString;
+import net.gcdc.asn1.uper.UperEncoder;
+
+/**
+ * The Class DataType.
+ */
+@Sequence
+public class Level2DataType {
+
+ Level1DataType level1Data;
+
+ /** The data. */
+ @Asn1Optional public OctetString level1Signature;
+
+
+ @Asn1Optional DataType level2Data;
+
+
+ public Level1DataType getLevel1Data() {
+ return level1Data;
+ }
+
+
+ public void setLevel1Data(Level1DataType level1Data) {
+ this.level1Data = level1Data;
+ }
+
+
+ public OctetString getLevel1Signature() {
+ return level1Signature;
+ }
+
+ public byte[] getLevel1SignatureBytes() {
+ return level1Signature.toByteArray();
+ }
+
+ public void setLevel1Signature(OctetString level1Signature) {
+ this.level1Signature = level1Signature;
+ }
+
+ public void setLevel1Signature(byte[] level1Signature) {
+ this.level1Signature = new OctetString(level1Signature);
+ }
+
+
+ public DataType getLevel2Data() {
+ return level2Data;
+ }
+
+
+ public void setLevel2Data(DataType level2Data) {
+ this.level2Data = level2Data;
+ }
+
+
+ /**
+ * Encode.
+ *
+ * Encode the header as ASN.1 PER UNALIGNED byte array
+ *
+ * @return the byte[]
+ */
+ public byte[] encode() {
+ return UperEncoder.encode(this);
+ }
+
+ /**
+ * Sign the contained data block.
+ *
+ * Note: an appropriate security provider (e.g. BC) must be registered before
+ *
+ * @param key the key
+ * @return
+ * @return the byte[]
+ * @throws Exception
+ */
+ public void signLevel1(PrivateKey key) throws Exception {
+ //find the algorithm name for the signature OID
+ String algo = AlgorithmNameResolver.getSignatureAlgorithmName(getLevel1Data().level1SigningAlg);
+ Signature sig = Signature.getInstance(algo);
+ sig.initSign(key);
+ byte[] data = level1Data.encode();
+ sig.update(data);
+ this.level1Signature = new OctetString(sig.sign());
+ }
+
+
+
+}
diff --git a/src/org/uic/header/SequenceOfDataType.java b/src/org/uic/barcode/dynamicFrame/SequenceOfDataType.java
index c91b8fa..c879ddd 100644
--- a/src/org/uic/header/SequenceOfDataType.java
+++ b/src/org/uic/barcode/dynamicFrame/SequenceOfDataType.java
@@ -1,4 +1,4 @@
-package org.uic.header;
+package org.uic.barcode.dynamicFrame;
import java.util.Collection;
diff --git a/src/org/uic/barcode/dynamicFrame/headerSpec.asn b/src/org/uic/barcode/dynamicFrame/headerSpec.asn
new file mode 100644
index 0000000..08d84f6
--- /dev/null
+++ b/src/org/uic/barcode/dynamicFrame/headerSpec.asn
@@ -0,0 +1,119 @@
+-- Author: ClemensGantert
+-- Created: Thu Jun 04 17:19:28 CEST 2020
+ASN-Module DEFINITIONS AUTOMATIC TAGS ::= BEGIN
+
+-- imports and exports
+-- EXPORTS ALL;
+
+
+-- ##############################################################################################
+-- #
+-- # UIC barcode header - first draft
+-- #
+-- ##############################################################################################
+
+
+-- ##############################################################################################
+-- #
+-- # Naming and encoding conventions
+-- #
+-- # Elements included as String and as Numeric values:
+-- # Some elements are included in different formats to reduce the data size.
+-- # These elements must be included only once.
+-- # These elements are named with the same name and appendix
+-- # Num (numeric values)
+-- # IA5 (String values according to ASN IA5String (7Bit))
+-- #
+-- # RICS codes must be used to encode companies (issuer, product owner, ...) where available
+-- # other codes are possible based on bilateral agreements
+-- # the format is kept more flexible to cover upcoming extensions of the RICS code by ERA
+-- #
+-- #
+-- # - A bar code which is only static (printed on a paper), and for which the security is in the system, doesn’t need any of these elements.
+-- # - A bar code which is only static, and includes its own security, needs:
+-- # level1Signature
+-- # level1KeyAlg if the associated key does not include the complete certificate in keys.xml but only the public key
+-- # (but level1SigningAlg is not necessary as it is in keys.xml)
+-- # - A dynamic bar code including static and dynamic signatures needs:
+-- # The same elements as a static bar code above,
+-- # level2SigningAlg, level2keyAlg, level2PublicKey, and level2Signature.
+-- #
+-- #########################################################################################
+
+
+-- ############################################################################################
+
+
+-- type assignments
+
+ -- #########################################################################################
+ -- the basic entry point of the data structure
+ -- ##########################################################################################
+ UicBarcodeHeader ::= SEQUENCE {
+ -- barcode format type
+ format IA5String,
+ -- "U1" = UIC ticket
+
+
+ level2SignedData Level2DataType,
+
+ -- signature is calculated on the PER unaligned encoding of level2 signature data
+ level2Signature OCTET STRING OPTIONAL
+
+
+ }
+
+ Level2DataType ::= SEQUENCE {
+
+ level1Data Level1DataType,
+
+ -- signature is calculated on the PER unaligned encoding of level1 signature data
+ level1Signature OCTET STRING OPTIONAL,
+
+ level2Data DataType OPTIONAL
+
+ }
+
+
+ Level1DataType ::= SEQUENCE {
+
+ -- provider of the level1 signature (RICS code)
+ securityProviderNum INTEGER (1..32000) OPTIONAL,
+ securityProviderIA5 IA5String OPTIONAL,
+
+ keyId INTEGER(0..99999) OPTIONAL,
+
+ dataSequence SEQUENCE OF DataType,
+
+
+ -- object identifier of the key algorithms
+ -- e.g.
+ -- ECC P-256 1.2.840.10045.3.1.7
+ level1KeyAlg OBJECT IDENTIFIER OPTIONAL,
+ level2KeyAlg OBJECT IDENTIFIER OPTIONAL,
+
+ -- object identifier of the signing algorithm
+ -- e.g.
+ -- DSA SHA224 2.16.840.1.101.3.4.3.1
+ -- DSA SHA256 2.16.840.1.101.3.4.3.2
+ -- ECDSA-256 1.2.840.10045.4.3.2
+ -- algorithm used for signing
+ level1SigningAlg OBJECT IDENTIFIER OPTIONAL,
+ level2SigningAlg OBJECT IDENTIFIER OPTIONAL,
+
+ level2PublicKey OCTET STRING OPTIONAL
+
+ }
+
+ DataType ::= SEQUENCE {
+ -- Content of data format:
+ -- FCBn (FCB1 = FCB version 1, FCB2 = FCB version 2)
+ -- FDCn dynamic content
+ -- or proprietary:
+ -- _RICS company code + addon
+ dataFormat IA5String,
+ data OCTET STRING
+ }
+
+
+END \ No newline at end of file
diff --git a/src/org/uic/barcode/dynamicFrame/package.html b/src/org/uic/barcode/dynamicFrame/package.html
new file mode 100644
index 0000000..dbe6c06
--- /dev/null
+++ b/src/org/uic/barcode/dynamicFrame/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head></head>
+<body>
+
+<h1>drafted new header for dynamic content </h1>
+<p>Provides a decoding and encoding of the header data frame. (Draft for UIC IRS 90918-9).</p>
+</body>
+</html> \ No newline at end of file
diff --git a/src/org/uic/barcode/package.html b/src/org/uic/barcode/package.html
new file mode 100644
index 0000000..4a6ee0d
--- /dev/null
+++ b/src/org/uic/barcode/package.html
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head></head>
+<body>
+
+ <p>Provides the decoder and encoder for a UIC barcode</p>
+
+
+ <p> Included features:<br/><br/>
+ <ul>
+ <li>dynamic bar code (DOSIPA) (version 1)</li>
+ <li>static bar code (version 1 and 2)</li>
+ <li>- FCB version 1</li>
+ <li>- FCB version 2 (dynamic bar code only)</li>
+ <li>- TLB (static bar code only)</li>
+ </ul>
+ </p>
+
+
+</body>
+</html> \ No newline at end of file
diff --git a/src/org/uic/barcode/staticFrame/DataRecord.java b/src/org/uic/barcode/staticFrame/DataRecord.java
new file mode 100644
index 0000000..27e128f
--- /dev/null
+++ b/src/org/uic/barcode/staticFrame/DataRecord.java
@@ -0,0 +1,199 @@
+package org.uic.barcode.staticFrame;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.uic.ticket.EncodingFormatException;
+
+/**
+ * The Class DataRecord implements the basic decoding and encoding
+ * of the data record structure, the split into tag, version, length and content.
+ *
+ * Implementing classes must provide decoding and encoding of the content
+ *
+ */
+public abstract class DataRecord {
+
+ /** The id tag. */
+ protected String idTag;
+
+ /** The version id. */
+ protected String versionId;
+
+ /** The content. */
+ protected byte[] content;
+
+ /**
+ * Instantiates a new data record.
+ *
+ * @param idTag the id tag
+ * @param version the version
+ */
+ public DataRecord (String idTag, String version) {
+ this.idTag = idTag;
+ this.versionId = version;
+ }
+
+ /**
+ * Instantiates a new data record.
+ *
+ * @param idTag the id tag
+ */
+ public DataRecord (String idTag) {
+ this.idTag = idTag;
+ }
+
+ /**
+ * Encode.
+ *
+ * @return the byte[]
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ public byte[] encode() throws IOException, EncodingFormatException {
+
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+
+ encodeContent();
+
+ //size of tag + version + length
+ int length = 12;
+
+ //size of data
+ length = length + content.length;
+
+ String lengthElement = String.format("%04d",length);
+
+ while (idTag.length() < 6) {
+ idTag = idTag + " ";
+ }
+
+ while (versionId.length() < 2) {
+ versionId = "0" + versionId;
+ }
+
+ outputStream.write(idTag.getBytes());
+
+ outputStream.write(versionId.getBytes());
+
+ outputStream.write(lengthElement.getBytes());
+
+ outputStream.write(content);
+
+ return outputStream.toByteArray();
+ }
+
+ /**
+ * Decode.
+ *
+ * @param byteData the byte data
+ * @return the int
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ public int decode(byte[] byteData) throws IOException, EncodingFormatException {
+
+ int offset = 0;
+ String tag = new String(Arrays.copyOfRange(byteData, offset, offset + 6));
+ this.setIdTag(tag);
+ offset = offset + 6;
+
+ String version = new String(Arrays.copyOfRange(byteData, offset, offset + 2));
+ this.setVersionId(version);
+ offset = offset + 2;
+
+ String dataSize = new String(Arrays.copyOfRange(byteData, offset, offset + 4));
+ offset = offset + 4;
+
+ int length = Integer.parseInt(dataSize) - 12;
+ this.setData(Arrays.copyOfRange(byteData, offset, offset + length));
+
+ decodeContent();
+
+ return length + 12;
+ }
+
+
+ /**
+ * Gets the id tag.
+ *
+ * @return the id tag
+ */
+ public String getIdTag() {
+ return idTag;
+ }
+
+
+ /**
+ * Sets the id tag.
+ *
+ * @param idTag the new id tag
+ */
+ public void setIdTag(String idTag) {
+ this.idTag = idTag;
+ }
+
+
+ /**
+ * Gets the version id.
+ *
+ * @return the version id
+ */
+ public String getVersionId() {
+ return versionId;
+ }
+
+
+ /**
+ * Sets the version id.
+ *
+ * @param versionId the new version id
+ */
+ public void setVersionId(String versionId) {
+ this.versionId = versionId;
+ }
+
+
+ /**
+ * Gets the data.
+ *
+ * @return the data
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ protected byte[] getData() throws IOException, EncodingFormatException {
+ return content;
+ }
+
+
+ /**
+ * Sets the data.
+ *
+ * @param data the new data
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ protected void setData(byte[] data) throws IOException, EncodingFormatException {
+ this.content = data;
+ }
+
+
+
+ /**
+ * Decode content.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ protected abstract void decodeContent() throws IOException, EncodingFormatException;
+
+ /**
+ * Encode content.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ protected abstract void encodeContent() throws IOException, EncodingFormatException;
+
+}
diff --git a/src/org/uic/barcode/staticFrame/GENERICDataRecord.java b/src/org/uic/barcode/staticFrame/GENERICDataRecord.java
new file mode 100644
index 0000000..2477af9
--- /dev/null
+++ b/src/org/uic/barcode/staticFrame/GENERICDataRecord.java
@@ -0,0 +1,62 @@
+package org.uic.barcode.staticFrame;
+
+import java.io.IOException;
+
+import org.uic.ticket.EncodingFormatException;
+
+
+/**
+ * The Class GENERICDataRecord implements a generic bilateral data record included in a static bar code frame.
+ */
+public class GENERICDataRecord extends DataRecord {
+
+ /**
+ * Instantiates a new GENERIC data record.
+ *
+ * @param idTag the id tag
+ */
+ public GENERICDataRecord(String idTag) {
+ super(idTag);
+ }
+
+ /**
+ * Decode content.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ @Override
+ protected void decodeContent() throws IOException, EncodingFormatException {
+ // Do Nothing, needs to be implemented by subclasses
+ }
+
+ /**
+ * Encode content.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ @Override
+ protected void encodeContent() throws IOException, EncodingFormatException {
+ // Do Nothing, needs to be implemented by subclasses
+ }
+
+ /**
+ * Gets the content.
+ *
+ * @return the content
+ */
+ public byte[] getContent() {
+ return content;
+ }
+
+ /**
+ * Sets the content.
+ *
+ * @param content the new content
+ */
+ public void setContent(byte[] content) {
+ this.content = content;
+ }
+
+}
diff --git a/src/org/uic/barcode/staticFrame/StaticFrame.java b/src/org/uic/barcode/staticFrame/StaticFrame.java
new file mode 100644
index 0000000..7a0f029
--- /dev/null
+++ b/src/org/uic/barcode/staticFrame/StaticFrame.java
@@ -0,0 +1,762 @@
+package org.uic.barcode.staticFrame;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.math.BigInteger;
+import java.nio.ByteBuffer;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.Provider;
+import java.security.PublicKey;
+import java.security.Security;
+import java.security.Signature;
+import java.security.SignatureException;
+import java.security.Provider.Service;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.zip.DataFormatException;
+import java.util.zip.Deflater;
+import java.util.zip.Inflater;
+
+import org.uic.ticket.EncodingFormatException;
+
+
+/**
+ * The Class StaticHeader implements the static bar code header frame defined in UIC IRS 90918-9.
+ * It allows to decode and encode the bar code content and to add sub-records as defined in the IRS 90918-9 for:
+ * - additional header data
+ * - Ticket Layout content
+ * - Flexible content
+ * - bilateral data records
+ */
+public class StaticFrame {
+
+ /** The additional header record. */
+ private UHEADDataRecord headerRecord;
+
+ /** The bar code version. */
+ private int version;
+
+ /** The u_flex. */
+ private UFLEXDataRecord uFlex;
+
+ /** The u_tlay. */
+ private UTLAYDataRecord uTlay;
+
+ /** The security provider. */
+ private String securityProvider;
+
+ /** The signature key. */
+ private String signatureKey;
+
+ /** The signature. */
+ private byte[] signature;
+
+ /** The data records. */
+ private ArrayList<DataRecord> dataRecords = new ArrayList<DataRecord>();
+
+
+ private byte[] signedData = null;
+
+ /**
+ * Instantiates a new static header frame.
+ */
+ public StaticFrame (){ }
+
+
+
+ /**
+ * Instantiates a new static header and decodes the provided data.
+ *
+ * @param bytes the bar code data
+ * @throws EncodingFormatException the encoding format exception
+ * @throws DataFormatException the data format exception
+ * @throws IOException Signals that an I/O exception has occurred.
+ */
+ public StaticFrame (byte[] bytes) throws EncodingFormatException, DataFormatException, IOException{
+ decode(bytes);
+ }
+
+
+ /**
+ * Encode the barcode data.
+ *
+ * @param version the barcode version
+ * @return byte[] the encoded data as
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws Exception the exception
+ */
+ /*
+ * creates a UIC bar code of version 1
+ *
+ * limits:
+ * - version 1 allows for signatures up to 50 byte length
+ * - max data length 2048 Byte
+ * input:
+ * data to be included
+ * provider of the signature
+ * processing:
+ * 1. create header informations
+ * 2. compression of the data content
+ * 3. adding a signature
+ * output:
+ * raw data to be included in an aztec bar code
+ *
+ */
+ public byte[] encode() throws IOException, Exception {
+
+ if (headerRecord == null && uFlex == null && uTlay == null
+ && (dataRecords == null || dataRecords.isEmpty())) return null;
+
+ if (signedData == null) {
+ signedData = encodeData();
+ }
+
+ if (version != 1 && version != 2) {
+ throw (new Exception(String.format("UIC Barcode Version %d not supported", version)));
+ }
+
+ if (signedData.length < 1) {
+ throw new IOException("data missing!");
+ }
+ if (signedData.length > 2048) {
+ throw new IOException("too many data!"); //2048 should be enough
+ }
+
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+
+ //UIC bar code version 1
+ String header = "#UT01";
+ if (version == 2) {
+ header = "#UT02";
+ }
+ outputStream.write(header.getBytes());
+
+ outputStream.write(securityProvider.getBytes());
+
+
+ while (signatureKey.length() < 5) {
+ signatureKey = "0" + signatureKey;
+ }
+ outputStream.write(signatureKey.getBytes());
+
+ if (signature.length < 1) {
+ // signature too small for bar code version 1
+ throw new IOException("signature size too small!");
+ }
+
+ if (version == 1) {
+ if (signature.length > 50) {
+ // signature too large for bar code version 1
+ throw new IOException("signature size too large!");
+ }
+ outputStream.write(Arrays.copyOfRange(signature, 0, 50));
+ } else if (version == 2) {
+ BigInteger[] bInts = null;
+ byte zeroByte = 0;
+
+ bInts = decodeSignatureIntegerSequence(signature);
+ byte[] r = toUnsignedBytes(bInts[0]);
+
+ byte[] s = toUnsignedBytes(bInts[1]);
+
+ if (r.length > 32 || s.length > 32) {
+ throw (new EncodingFormatException(String.format("DSA signature too big")));
+ }
+ for (int i = 0; i < 32 - r.length; i++) {
+ outputStream.write(zeroByte);
+ }
+ outputStream.write(r);
+ for (int i = 0; i < 32 - s.length; i++) {
+ outputStream.write(zeroByte);
+ }
+ outputStream.write(s);
+ //outputStream.write(Arrays.copyOfRange(signature, 0, 64));
+ }
+
+ String length = String.format("%04d", signedData.length);
+ outputStream.write(length.getBytes());
+
+ outputStream.write(signedData);
+
+ outputStream.close();
+
+ return outputStream.toByteArray();
+ }
+
+
+ /**
+ * Adds a proprietary data record.
+ *
+ * @param record the record
+ */
+ public void addDataRecord(DataRecord record) {
+ dataRecords.add(record);
+ }
+
+ /**
+ * Gets the version of the header frame.
+ *
+ * @return the version
+ */
+ public int getVersion() {
+ return version;
+ }
+
+ /**
+ * Sets the version of the header frame.
+ * supported values are 1 and 2
+ *
+ * @param version the new version
+ */
+ public void setVersion(int version) {
+ this.version = version;
+ }
+
+ /**
+ * Gets the security provider.
+ *
+ * @return the security provider
+ */
+ public String getSecurityProvider() {
+ return securityProvider;
+ }
+
+ /**
+ * Sets the security provider.
+ *
+ * @param securityProvider the new security provider
+ */
+ public void setSecurityProvider(String securityProvider) {
+ this.securityProvider = securityProvider;
+ }
+
+ /**
+ * Gets the signature key identifier.
+ *
+ * @return the signature key
+ */
+ public String getSignatureKey() {
+ return signatureKey;
+ }
+
+ /**
+ * Sets the signature key identifier.
+ *
+ * @param signatureKey the new signature key
+ */
+ public void setSignatureKey(String signatureKey) {
+ this.signatureKey = signatureKey;
+ }
+
+ /**
+ * Gets the signature.
+ *
+ * @return the signature
+ */
+ public byte[] getSignature() {
+ return signature;
+ }
+
+ /**
+ * Sets the signature.
+ *
+ * @param signature the new signature
+ */
+ public void setSignature(byte[] signature) {
+ this.signature = signature;
+ }
+
+ /**
+ * Gets the additional header record.
+ *
+ * @return the header record
+ */
+ public UHEADDataRecord getHeaderRecord() {
+ return headerRecord;
+ }
+
+ /**
+ * Gets the list of bilateral data records.
+ *
+ * @return the data records
+ */
+ public ArrayList<DataRecord> getDataRecords() {
+ return dataRecords;
+ }
+
+ /**
+ * Gets the data for signing.
+ *
+ * @return the data to be signed
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ public byte[] getDataForSignature() throws IOException, EncodingFormatException {
+ // data compression
+ if (signedData != null) return signedData;
+
+ Deflater deflater = new Deflater();
+ byte[] data = encodeData();
+ deflater.setInput(data);
+ ByteArrayOutputStream compressStream = new ByteArrayOutputStream(data.length);
+ byte[] buffer = new byte[2048];
+ deflater.finish();
+ while (!deflater.finished()) {
+ int count = deflater.deflate(buffer); // returns the number of result bytes
+ compressStream.write(buffer, 0, count);
+ }
+ compressStream.close();
+
+ return compressStream.toByteArray();
+ }
+
+ /**
+ * Get the encoded data for the bar code.
+ *
+ * @return the byte[]
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private byte[] encodeData() throws IOException, EncodingFormatException {
+
+ if (this.uFlex == null && this.uTlay == null && this.headerRecord == null &&
+ (dataRecords == null || dataRecords.isEmpty())) return null;
+
+ ByteArrayOutputStream totalStream = new ByteArrayOutputStream();
+
+ //encode header for layout
+ if (headerRecord != null) {
+ byte[] header = headerRecord.encode();
+
+ if (header != null && header.length > 0) {
+ totalStream.write(header);
+ }
+ }
+
+ //encode layout
+ if (uTlay != null) {
+ byte[] layout = uTlay.encode();
+ if (layout != null && layout.length > 0) {
+ totalStream.write(layout);
+ }
+ }
+
+ if (uFlex != null) {
+ byte[] content = uFlex.encode();
+ if (content != null && content.length > 0){
+ totalStream.write(content);
+ }
+ }
+
+ //third party content
+ for (DataRecord dataRecord : dataRecords){
+
+ byte[] content = dataRecord.encode();
+ if (content != null && content.length > 0){
+ totalStream.write(content);
+ }
+ }
+ return totalStream.toByteArray();
+ }
+
+ /**
+ * Encode signature integer sequence.
+ *
+ * Support function to format two parameters as DER encoded integer list
+ * to get a valid formated DSA signature from the signature parameter
+ *
+ * @param i1 the i 1
+ * @param i2 the i 2
+ * @return the byte[]
+ * @throws IOException Signals that an I/O exception has occurred.
+ */
+ public static byte[] encodeSignatureIntegerSequence(BigInteger i1, BigInteger i2) throws IOException {
+
+ //SEQUENCE OF --> tag 16
+ int sequenceTag = 16 + 32; // (bits 6 = 1 constructed)
+ //INTEGER --> tag 2
+ int integerTag = 2;
+
+ byte[] b1 = toUnsignedBytes(i1);
+ int lb1 = b1.length;
+ byte[] b2 = toUnsignedBytes(i2);
+ int lb2 = b2.length;
+
+ int sequenceLength = lb1 + lb2 + 4;
+
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+ out.write((byte) sequenceTag);
+ out.write((byte) sequenceLength);
+ out.write((byte) integerTag);
+ out.write((byte) lb1);
+ out.write(b1);
+ out.write((byte) integerTag);
+ out.write((byte) lb2);
+ out.write(b2);
+
+ return out.toByteArray();
+ }
+
+ /**
+ * Decode signature integer sequence.
+ *
+ * Support function to decode a DSA signature
+ * Provides the two DSA signature parameter encoded in a DSA signature
+ *
+ * @param bytes the bytes
+ * @return the big integer[]
+ * @throws Exception the exception
+ */
+ public static BigInteger[] decodeSignatureIntegerSequence(byte[] bytes) throws Exception {
+
+ int sequenceTag = (int) bytes[0];
+
+ if (sequenceTag != 48) throw new Exception("signature is not a sequence");
+
+ int sequenceLength = (int) bytes[1];
+
+ if (sequenceLength < 6) throw new Exception("signature sequence too short");
+
+ BigInteger[] result = new BigInteger[2];
+
+ int offset = 2;
+ int i = 0;
+ while (offset < bytes.length && i < 2) {
+ int integerTag = (int) bytes[offset];
+ if (integerTag != 2) throw new Exception("signature is not an integer sequence");
+ int integerLength = (int) bytes[offset + 1];
+ byte[] value = Arrays.copyOfRange(bytes, offset + 2, offset + 2 + integerLength);
+ result[i] = new BigInteger(+1, value);
+ offset = offset + integerLength + 2;
+ i++;
+ }
+
+ return result;
+ }
+
+ /**
+ * Decode.
+ *
+ * @param inputData the input data
+ * @throws EncodingFormatException the encoding format exception
+ * @throws DataFormatException the data format exception
+ * @throws IOException Signals that an I/O exception has occurred.
+ */
+ public void decode(byte[] inputData) throws EncodingFormatException, DataFormatException, IOException {
+
+
+ int offset = 0;
+ String headerTag = new String( Arrays.copyOfRange(inputData,offset,offset + 3));
+ offset = offset + 3;
+ if (!headerTag.equals("#UT")) {
+ throw (new EncodingFormatException("not a UIC barcode"));
+ }
+
+
+ String versionValue = new String(Arrays.copyOfRange(inputData,offset,offset + 2));
+ offset = offset + 2;
+ int barcodeVersion = 0;
+ try {
+ barcodeVersion = Integer.parseInt(versionValue);
+ this.setVersion(barcodeVersion);
+ } catch (NumberFormatException e2) {
+ throw (new EncodingFormatException(String.format("UIC Barcode Version %s not supported", versionValue)));
+ }
+
+ String providerValue = new String( Arrays.copyOfRange(inputData,offset,offset + 4));
+ this.setSecurityProvider(providerValue);
+ offset = offset + 4;
+
+ String signatureKeyIdValue = new String( Arrays.copyOfRange(inputData,offset,offset + 5));
+ this.setSignatureKey(signatureKeyIdValue);
+ offset = offset + 5;
+
+ byte[] sealdata = null;
+
+ if (barcodeVersion == 1) {
+ sealdata = Arrays.copyOfRange(inputData, offset, offset + 50);
+ signature = trimDsaSignature(sealdata);
+ offset = offset + 50;
+ } else if (barcodeVersion == 2) {
+ sealdata = Arrays.copyOfRange(inputData, offset, offset + 64);
+ signature = recombineDsaSignature(sealdata);
+ offset = offset + 64;
+ } else {
+ throw (new EncodingFormatException(String.format("UIC Barcode Version %s not supported", versionValue)));
+ }
+
+
+ String lengthValue = new String( Arrays.copyOfRange(inputData,offset,offset + 4));
+ offset = offset + 4;
+
+ int dataLength = 0;
+ dataLength = Integer.parseInt(lengthValue);
+
+ signedData = Arrays.copyOfRange(inputData, offset, offset + dataLength);
+
+ ByteBuffer containedDataBuffer = ByteBuffer.allocate(dataLength);
+ containedDataBuffer.put(signedData);
+
+ byte[] inflatedDataBuffer = new byte[2000];
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ Inflater inflater = new Inflater();
+ byte[] inflaterInput = containedDataBuffer.array();
+ inflater.setInput(inflaterInput);
+ while (!inflater.finished()) {
+ int count = inflater.inflate(inflatedDataBuffer,0,2000);
+ if (inflater.needsDictionary()) {
+ break;
+ }
+ outputStream.write(inflatedDataBuffer, 0, count);
+ }
+
+ outputStream.close();
+
+ byte[] byteData = outputStream.toByteArray();
+
+ offset = 0;
+ int remainingBytes = byteData.length;
+
+ while (remainingBytes > 0) {
+
+ String tag = new String(Arrays.copyOfRange(byteData, offset, offset + 6));
+ int length = 0;
+
+ if (tag.startsWith("U_TLAY")) {
+ UTLAYDataRecord record = new UTLAYDataRecord();
+ length = record.decode(Arrays.copyOfRange(byteData, offset, byteData.length));
+ this.uTlay = record;
+ } else if (tag.startsWith("U_FLEX")) {
+ UFLEXDataRecord record = new UFLEXDataRecord();
+ length = record.decode(Arrays.copyOfRange(byteData, offset, byteData.length));
+ this.uFlex = record;
+ } else if (tag.startsWith("U_HEAD")) {
+ UHEADDataRecord record = new UHEADDataRecord();
+ length = record.decode(Arrays.copyOfRange(byteData, offset, byteData.length));
+ this.headerRecord = record;
+ } else {
+ DataRecord record = new GENERICDataRecord(tag);
+ length = record.decode(Arrays.copyOfRange(byteData, offset, byteData.length));
+ addDataRecord(record);
+ }
+ offset = offset + length;
+ remainingBytes = remainingBytes - length;
+ }
+ }
+
+
+ private byte[] recombineDsaSignature(byte[] sealdata) throws IOException {
+
+ //check whether the encoding is wrong and the sealdata contain a signature
+ //remove trailing zeroes from the signature
+ BigInteger[] bInts = null;
+ try {
+ bInts = decodeSignatureIntegerSequence(sealdata);
+ byte[] sig = encodeSignatureIntegerSequence(bInts[0],bInts[1]);
+ //decoding the entire signature was ok, so there was no split
+ return sig;
+ } catch (Exception e) {
+ //the signature is correctly implemented, continue with recombination
+ }
+
+ // split the data into two blocks
+ int length = sealdata.length / 2;
+ byte[] rBytes = Arrays.copyOfRange(sealdata, 0, length);
+ byte[] sBytes = Arrays.copyOfRange(sealdata, length, length + length);
+
+ //convert to BigInteger to get rid of leading zeroes
+ BigInteger r = new BigInteger(1,rBytes);
+ BigInteger s = new BigInteger(1,sBytes);
+
+ //encode as DSA signature structure
+ //SEQUENCE OF --> tag 16
+ int sequenceTag = 16 + 32; // (bits 6 = 1 constructed)
+ //INTEGER --> tag 2
+ int integerTag = 2;
+ byte[] b1 = toUnsignedBytes(r);
+ int lb1 = b1.length;
+ byte[] b2 = toUnsignedBytes(s);
+ int lb2 = b2.length;
+ int sequenceLength = lb1 + lb2 + 4;
+
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ out.write((byte) sequenceTag);
+ out.write((byte) sequenceLength);
+ out.write((byte) integerTag);
+ out.write((byte) lb1);
+ out.write(b1);
+ out.write((byte) integerTag);
+ out.write((byte) lb2);
+ out.write(b2);
+ return out.toByteArray();
+
+
+ }
+
+ private static byte[] toUnsignedBytes(BigInteger i) {
+ byte[] b = i.abs().toByteArray();
+ //remove top sign bit
+ if (b[0] == 0) {
+ b = Arrays.copyOfRange(b, 1, b.length);
+ }
+ return b;
+ }
+
+
+ private byte[] trimDsaSignature(byte[] sealdata) throws EncodingFormatException {
+ //remove trailing zeroes from the signature
+ BigInteger[] bInts = null;
+ try {
+ bInts = decodeSignatureIntegerSequence(sealdata);
+ return encodeSignatureIntegerSequence(bInts[0],bInts[1]);
+ } catch (Exception e) {
+ throw (new EncodingFormatException(String.format("Invalid DSA signature")));
+ }
+ }
+
+
+
+ /**
+ * Verify the signature
+ *
+ * Note: an appropriate security provider (e.g. BC) must be registered before
+ *
+ * @param key the key
+ * @param algo the algorithm name
+ * @return true, if successful
+ * @throws InvalidKeyException the invalid key exception
+ * @throws NoSuchAlgorithmException the no such algorithm exception
+ * @throws SignatureException the signature exception
+ * @throws IllegalArgumentException the illegal argument exception
+ * @throws UnsupportedOperationException the unsupported operation exception
+ * @throws EncodingFormatException
+ * @throws IOException
+ */
+ public boolean ByAlgorithmName(PublicKey key, String algo) throws InvalidKeyException, NoSuchAlgorithmException, SignatureException, IllegalArgumentException, UnsupportedOperationException, IOException, EncodingFormatException {
+ Signature sig = Signature.getInstance(algo);
+ sig.initVerify(key);
+ sig.update(this.getDataForSignature());
+ return sig.verify(this.getSignature());
+ }
+
+ /**
+ * Verify the signature
+ *
+ * Note: an appropriate security provider (e.g. BC) must be registered before
+ *
+ * @param key the key
+ * @param singningAlg the Object ID of the signing algorithm
+ * @return true, if successful
+ * @throws InvalidKeyException the invalid key exception
+ * @throws NoSuchAlgorithmException the no such algorithm exception
+ * @throws SignatureException the signature exception
+ * @throws IllegalArgumentException the illegal argument exception
+ * @throws UnsupportedOperationException the unsupported operatign exception
+ * @throws EncodingFormatException
+ * @throws IOException
+ */
+ public boolean verifyByAlgorithmOid(PublicKey key, String signingAlg) throws InvalidKeyException, NoSuchAlgorithmException, SignatureException, IllegalArgumentException, UnsupportedOperationException, IOException, EncodingFormatException {
+ //find the algorithm name for the signature OID
+ String algo = null;
+ Provider[] provs = Security.getProviders();
+ for (Provider prov : provs) {
+ Service service = prov.getService("Signature",signingAlg);
+ if (service != null) {
+ algo = service.getAlgorithm();
+ }
+ }
+ Signature sig = Signature.getInstance(algo);
+ sig.initVerify(key);
+ sig.update(getDataForSignature());
+ return sig.verify(this.getSignature());
+ }
+
+ /**
+ * Sign the contained data block.
+ *
+ * Note: an appropriate security provider (e.g. BC) must be registered before
+ *
+ * @param key the key
+ * @param singningAlg the Object ID of the signing algorithm
+ * @return
+ * @throws NoSuchAlgorithmException the no such algorithm exception
+ * @throws InvalidKeyException the invalid key exception
+ * @throws SignatureException the signature exception
+ * @throws EncodingFormatException
+ * @throws IOException
+ */
+ public void signByAlgorithmOID(PrivateKey key,String signingAlg) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, IOException, EncodingFormatException {
+ //find the algorithm name for the signature OID
+ String algo = null;
+ Provider[] provs = Security.getProviders();
+ for (Provider prov : provs) {
+ Service service = prov.getService("Signature",signingAlg);
+ if (service != null) {
+ algo = service.getAlgorithm();
+ }
+ }
+ Signature sig = Signature.getInstance(algo);
+ sig.initSign(key);
+ signedData = getDataForSignature();
+ sig.update(signedData);
+ signature = sig.sign();
+ }
+
+ /**
+ * Sign the contained data block.
+ *
+ * Note: an appropriate security provider (e.g. BC) must be registered before
+ *
+ * @param key the key
+ * @param algo the name of the signing algorithm
+ * @return
+ * @throws NoSuchAlgorithmException the no such algorithm exception
+ * @throws InvalidKeyException the invalid key exception
+ * @throws SignatureException the signature exception
+ * @throws EncodingFormatException
+ * @throws IOException
+ */
+ public void signUsingAlgorithmName(PrivateKey key,String algo) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, IOException, EncodingFormatException {
+ Signature sig = Signature.getInstance(algo);
+ sig.initSign(key);
+ sig.update(getDataForSignature());
+ signature = sig.sign();
+ }
+
+
+
+ public UFLEXDataRecord getuFlex() {
+ return uFlex;
+ }
+
+
+
+ public UTLAYDataRecord getuTlay() {
+ return uTlay;
+ }
+
+
+
+ public void setuFlex(UFLEXDataRecord uFlex) {
+ this.uFlex = uFlex;
+ }
+
+
+
+ public void setuTlay(UTLAYDataRecord uTlay) {
+ this.uTlay = uTlay;
+ }
+
+
+
+ public void setHeaderRecord(UHEADDataRecord headerRecord) {
+ this.headerRecord = headerRecord;
+ }
+
+
+
+
+}
diff --git a/src/org/uic/barcode/staticFrame/UFLEXDataRecord.java b/src/org/uic/barcode/staticFrame/UFLEXDataRecord.java
new file mode 100644
index 0000000..9731198
--- /dev/null
+++ b/src/org/uic/barcode/staticFrame/UFLEXDataRecord.java
@@ -0,0 +1,90 @@
+package org.uic.barcode.staticFrame;
+
+import java.io.IOException;
+
+import org.uic.ticket.EncodingFormatException;
+import org.uic.ticket.UicRailTicketCoder;
+import org.uic.ticket.api.spec.IUicRailTicket;
+
+/**
+ * The Class UFLEXDataRecord implements the dara record to hold the data of an ASN.1 PER encoded UIC ticket.
+ */
+public class UFLEXDataRecord extends DataRecord {
+
+
+ /** The ticket. */
+ private IUicRailTicket ticket;
+
+ /**
+ * Instantiates a new UFLEX data record.
+ */
+ public UFLEXDataRecord() {
+ super("U_FLEX");
+ }
+
+ /**
+ * Instantiates a new UFLEX data record.
+ *
+ * @param version the version
+ */
+ public UFLEXDataRecord(String version) {
+ super("U_FLEX", version);
+ }
+
+
+ /**
+ * Gets the ticket.
+ *
+ * @return the ticket
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ public IUicRailTicket getTicket() throws IOException, EncodingFormatException {
+ if (ticket != null) {
+ return ticket;
+ }
+ return null;
+ }
+
+ /**
+ * Sets the ticket.
+ *
+ * @param ticket the new ticket
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ public void setTicket(IUicRailTicket ticket) throws IOException, EncodingFormatException {
+ this.ticket = ticket;
+ super.setData(null);
+ }
+
+
+ /**
+ * Decode content.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ @Override
+ protected void decodeContent() throws IOException, EncodingFormatException {
+ UicRailTicketCoder coder = new UicRailTicketCoder();
+ int version = Integer.parseInt(super.getVersionId());
+ this.ticket = coder.decodeFromAsn(content,version);
+ }
+
+ /**
+ * Encode content.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ @Override
+ protected void encodeContent() throws IOException, EncodingFormatException {
+ UicRailTicketCoder coder = new UicRailTicketCoder();
+ int version = Integer.parseInt(super.getVersionId());
+ content = coder.encode(ticket, version);
+ }
+
+
+
+}
diff --git a/src/org/uic/barcode/staticFrame/UHEADDataRecord.java b/src/org/uic/barcode/staticFrame/UHEADDataRecord.java
new file mode 100644
index 0000000..e2ec301
--- /dev/null
+++ b/src/org/uic/barcode/staticFrame/UHEADDataRecord.java
@@ -0,0 +1,269 @@
+package org.uic.barcode.staticFrame;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.uic.ticket.EncodingFormatException;
+
+/**
+ * The Class UHEADDataRecord implements the additional header record of a statis UIC bar code
+ */
+public class UHEADDataRecord extends DataRecord{
+
+
+ /** The issuing date. */
+ private Date issuingDate = null;
+
+ /** The flags. */
+ private int flags;
+
+ /** The issuer. */
+ private String issuer;
+
+ /** The identifier. */
+ private String identifier;
+
+ /** The language. */
+ private String language;
+
+ /** The additional language. */
+ private String additionalLanguage;
+
+ /**
+ * Instantiates a new UHEAD data record.
+ */
+ public UHEADDataRecord() {
+ super("U_HEAD");
+ }
+
+
+ /**
+ * Gets the issuing date.
+ *
+ * @return the issuing date
+ */
+ public Date getIssuingDate() {
+ return issuingDate;
+ }
+
+ /**
+ * Sets the issuing date.
+ *
+ * @param issuingDate the new issuing date
+ */
+ public void setIssuingDate(Date issuingDate) {
+ this.issuingDate = issuingDate;
+ }
+
+ /**
+ * Gets the flags.
+ *
+ * @return the flags
+ */
+ public int getFlags() {
+ return flags;
+ }
+
+ /**
+ * Sets the flags.
+ *
+ * @param flags the new flags
+ */
+ public void setFlags(int flags) {
+ this.flags = flags;
+ }
+
+ /**
+ * Gets the issuer.
+ *
+ * @return the issuer
+ */
+ public String getIssuer() {
+ return issuer;
+ }
+
+ /**
+ * Sets the issuer.
+ *
+ * @param issuer the new issuer
+ */
+ public void setIssuer(String issuer) {
+ this.issuer = issuer;
+ }
+
+ /**
+ * Gets the identifier.
+ *
+ * @return the identifier
+ */
+ public String getIdentifier() {
+ return identifier;
+ }
+
+ /**
+ * Sets the identifier.
+ *
+ * @param identifier the new identifier
+ */
+ public void setIdentifier(String identifier) {
+ this.identifier = identifier;
+ }
+
+ /**
+ * Gets the language.
+ *
+ * @return the language
+ */
+ public String getLanguage() {
+ return language;
+ }
+
+ /**
+ * Sets the language.
+ *
+ * @param language the new language
+ */
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+
+ /**
+ * Gets the additional language.
+ *
+ * @return the additional language
+ */
+ public String getAdditionalLanguage() {
+ return additionalLanguage;
+ }
+
+ /**
+ * Sets the additional language.
+ *
+ * @param additionalLanguage the new additional language
+ */
+ public void setAdditionalLanguage(String additionalLanguage) {
+ this.additionalLanguage = additionalLanguage;
+ }
+
+
+ /**
+ * Decode content.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ protected void decodeContent() throws IOException, EncodingFormatException{
+
+ if (content == null || content.length == 0 ) return;
+
+ issuer = decodeString(content, 0 , 4);
+
+ identifier = decodeString(content, 4 , 20);
+
+ String issuingDateString = decodeString(content, 24 , 12);
+
+ String flagsString = decodeString(content,36 , 1);
+
+ language = decodeString(content, 37 , 2);
+
+ additionalLanguage = decodeString(content,39 , 2);
+
+
+ try {
+ flags = Integer.parseInt(flagsString);
+ } catch (Exception e) {
+ flags = 9;
+ }
+
+ // date format "DDMMYYYYHHMM"
+ SimpleDateFormat formatter = new SimpleDateFormat("ddMMyyyyhhmm");
+ try {
+ issuingDate = formatter.parse(issuingDateString);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+
+ /**
+ * Decode string.
+ *
+ * @param byteData the byte data
+ * @param offset the offset
+ * @param length the length
+ * @return the string
+ */
+ private String decodeString(byte[] byteData, int offset, int length) {
+
+ char[] chars = new char[length];
+
+ for (int i = 0; i < length && i < byteData.length;i++) {
+ byte byteValue = byteData[offset + i];
+ if (byteValue == '\n') {
+ byteValue = ' ';
+ }
+ chars[i] = (char) byteValue;
+ }
+
+ return String.copyValueOf(chars);
+ }
+
+ /**
+ * Encode content.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ protected void encodeContent() throws IOException, EncodingFormatException {
+
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+
+ String issuerElement = String.format("%4s", this.issuer);
+
+ String idElement = String.format("%20s", this.identifier);
+
+ //DDMMYYYYHHMM"
+ Calendar now = Calendar.getInstance();
+
+ // issuing date can be in the ticket or in the header
+ if (this.issuingDate != null) {
+ now.setTime(this.issuingDate);
+ }
+
+ String timeElement = String.format("%02d%02d%04d%02d%02d",
+ now.get(Calendar.DAY_OF_MONTH),
+ now.get(Calendar.MONTH),
+ now.get(Calendar.YEAR),
+ now.get(Calendar.HOUR),
+ now.get(Calendar.MINUTE));
+
+
+ String flagsElement = String.format("%01d",this.flags);
+
+
+ String languageElement = String.format("%2s%2s" ,this.language, this.additionalLanguage);
+
+ try {
+
+ outputStream.write(issuerElement.getBytes());
+ outputStream.write(idElement.getBytes());
+ outputStream.write(timeElement.getBytes());
+
+ outputStream.write(flagsElement.getBytes());
+ outputStream.write(languageElement.getBytes());
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ super.setData(outputStream.toByteArray());
+
+
+ }
+
+}
diff --git a/src/org/uic/barcode/staticFrame/UTLAYDataRecord.java b/src/org/uic/barcode/staticFrame/UTLAYDataRecord.java
new file mode 100644
index 0000000..2e9a2dc
--- /dev/null
+++ b/src/org/uic/barcode/staticFrame/UTLAYDataRecord.java
@@ -0,0 +1,272 @@
+/*
+ *
+ */
+package org.uic.barcode.staticFrame;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+
+import org.uic.barcode.staticHeader.ticketLayoutBarcode.FormatType;
+import org.uic.barcode.staticHeader.ticketLayoutBarcode.LayoutElement;
+import org.uic.barcode.staticHeader.ticketLayoutBarcode.TicketLayout;
+import org.uic.ticket.EncodingFormatException;
+
+/**
+ * The Class UTLAYDataRecord implements a bar code data record containing the ticket layout.
+ */
+public class UTLAYDataRecord extends DataRecord {
+
+ /** The ticket layout. */
+ private TicketLayout layout;
+
+ /**
+ * Instantiates a new empty UTLAY data record.
+ */
+ public UTLAYDataRecord() {
+ super("U_TLAY","01");
+ }
+
+ /**
+ * Decode utf-8 string.
+ *
+ * @param byteData the byte data
+ * @param offset the offset
+ * @param length the length
+ * @return the string
+ * @throws UnsupportedEncodingException the unsupported encoding exception
+ */
+ private static String decodeUtf8String(byte[] byteData, int offset, int length) throws UnsupportedEncodingException {
+ byte[] bytes = new byte[length];
+ for (int i = 0; i < length; i++){
+ bytes[i] = byteData[i + offset];
+ }
+ return StandardCharsets.UTF_8.decode(ByteBuffer.wrap(bytes)).toString();
+ }
+
+ /**
+ * Decode string.
+ *
+ * @param byteData the byte data
+ * @param offset the offset
+ * @param length the length
+ * @return the string
+ */
+ private static String decodeString(byte[] byteData, int offset, int length) {
+ byte[] bytes = new byte[length];
+ for (int i = 0; i < length; i++){
+ bytes[i] = byteData[i + offset];
+ }
+ return StandardCharsets.ISO_8859_1.decode(ByteBuffer.wrap(bytes)).toString();
+ }
+
+ /**
+ * Encode utf-8.
+ *
+ * @param value the value
+ * @return the byte[]
+ */
+ private static byte[] encodeUtf8(String value) {
+
+ try {
+ return value.getBytes("UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ throw new RuntimeException("UTF8 String encoding wrong!",e);
+ }
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ public String toString() {
+
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("TLB: ").append(layout.getLayoutStandard()).append('\n');
+
+ for (LayoutElement e : layout.getElements()){
+ sb.append("column: ").append(e.getColumn()).append(" - ");
+ sb.append("line: ").append(e.getLine()).append(" - ");
+ sb.append("width: ").append(e.getWidth()).append(" - ");
+ sb.append("heigth: ").append(e.getHeight()).append(" - ");
+ sb.append("text: ").append(e.getText()).append(" - ");
+ sb.append("format: ").append(e.getFormat().toString()).append('\n');
+ }
+
+ return sb.toString();
+
+ }
+
+ /**
+ * Decode content.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ @Override
+ protected void decodeContent() throws IOException, EncodingFormatException {
+
+ layout = new TicketLayout();
+
+ if (content == null || content.length == 0 ) return;
+
+ int offset = 0;
+
+ String layoutType = decodeString(content, offset , 4);
+ layout.setLayoutStandard(layoutType);
+ offset = offset + 4;
+
+ String numberValue = decodeString(content, offset , 4);
+ offset = offset + 4;
+
+ int elements = 0;
+ try {
+ elements = Integer.parseInt(numberValue);
+ } catch(NumberFormatException e){
+ //Do Nothing
+ }
+
+ int remainingBytes = content.length - offset;
+
+ for (int i = 0; i < elements && remainingBytes > 0 ;i++){
+
+ String lineValue = decodeString(content, offset , 2);
+ offset = offset + 2;
+ int line = 0;
+ try {
+ line = Integer.parseInt(lineValue);
+ } catch(NumberFormatException e){
+ //Do Nothing
+ }
+ String columnValue = decodeString(content, offset , 2);
+ offset = offset + 2;
+ int column = 0;
+ try {
+ column = Integer.parseInt(columnValue);
+ } catch(NumberFormatException e){
+ //Do Nothing
+ }
+ String heightValue = decodeString(content, offset , 2);
+ offset = offset + 2;
+ int height = 0;
+ try {
+ height = Integer.parseInt(heightValue);
+ } catch(NumberFormatException e){
+ //Do Nothing
+ }
+ String widthValue = decodeString(content, offset , 2);
+ offset = offset + 2;
+ int width = 0;
+ try {
+ width = Integer.parseInt(widthValue);
+ } catch(NumberFormatException e){
+ //Do Nothing
+ }
+ String formatValue = decodeString(content, offset , 1);
+ offset = offset + 1;
+ int format = 0;
+ try {
+ format = Integer.parseInt(formatValue);
+ } catch(NumberFormatException e){
+ //Do Nothing
+ }
+ String lengthValue = decodeString(content, offset , 4);
+ offset = offset + 4;
+ int length = 0;
+ try {
+ length = Integer.parseInt(lengthValue);
+ } catch(NumberFormatException e){
+ //Do Nothing
+ }
+
+ String text;
+ try {
+ text = decodeUtf8String(content, offset ,length);
+ } catch (UnsupportedEncodingException e) {
+ text = "unsupported character set";
+ }
+ offset = offset + length;
+
+ LayoutElement layoutElement = new LayoutElement();
+
+ layoutElement.setColumn(column);
+ layoutElement.setLine(line);
+ layoutElement.setHeight(height);
+ layoutElement.setWidth(width);
+ layoutElement.setText(text);
+
+ layoutElement.setFormat(FormatType.values()[format]);
+
+ layout.addLayoutElement(layoutElement);
+
+ }
+
+ }
+
+ /**
+ * Encode content.
+ *
+ * @throws IOException Signals that an I/O exception has occurred.
+ * @throws EncodingFormatException the encoding format exception
+ */
+ @Override
+ protected void encodeContent() throws IOException, EncodingFormatException {
+
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+
+ if (layout == null || layout.getElements() == null || layout.getElements().isEmpty()) {
+ return;
+ }
+
+ //number of text elements
+ String numberOfFields = String.format("%04d",layout.getElements().size());
+
+ outputStream.write(layout.getLayoutStandard().getBytes());
+ outputStream.write(numberOfFields.getBytes());
+
+ for (LayoutElement e : layout.getElements()){
+
+ String line = String.format("%02d",e.getLine());
+ String column = String.format("%02d",e.getColumn());
+ String heigth = String.format("%02d",e.getHeight());
+ String width = String.format("%02d",e.getWidth());
+ String format = String.format("%01d",e.getFormat().ordinal());
+ String size = String.format("%04d",encodeUtf8(e.getText()).length);
+
+ outputStream.write(line.getBytes());
+ outputStream.write(column.getBytes());
+ outputStream.write(heigth.getBytes());
+ outputStream.write(width.getBytes());
+ outputStream.write(format.getBytes());
+ outputStream.write(size.getBytes());
+ outputStream.write(encodeUtf8(e.getText()));
+
+ }
+
+ content = outputStream.toByteArray();
+ }
+
+ /**
+ * Sets the layout.
+ *
+ * @param layout the new layout
+ */
+ public void setLayout(TicketLayout layout) {
+ this.layout = layout;
+ }
+
+
+ /**
+ * Gets the layout.
+ *
+ * @return the layout
+ */
+ public TicketLayout getLayout() {
+ return layout;
+ }
+
+}
diff --git a/src/org/uic/barcode/staticFrame/package.html b/src/org/uic/barcode/staticFrame/package.html
new file mode 100644
index 0000000..b76540b
--- /dev/null
+++ b/src/org/uic/barcode/staticFrame/package.html
@@ -0,0 +1,21 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head></head>
+<body>
+
+<h1>static bar code header frame</h1>
+
+<p>Provides an implementation of the static bar code header frame specified in UIC IRS 90918-9 including:<br/><br/>
+
+<ul>
+ <li> encoding of the data for creating a bar code</li>
+ <li> decoding of data from bar code content</li>
+ <li> support for the additional header information required with the TLB content</li>
+ <li> support for the TLB bar code content</li>
+ <li> support for the FCB content (using the UIC FCB implementation)</li>
+ <li> support for bilaterally on unilaterally defined additional content </li>
+</ul>
+</p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/src/org/uic/barcode/staticHeader/ticketLayoutBarcode/FormatType.java b/src/org/uic/barcode/staticHeader/ticketLayoutBarcode/FormatType.java
new file mode 100644
index 0000000..c5cc39e
--- /dev/null
+++ b/src/org/uic/barcode/staticHeader/ticketLayoutBarcode/FormatType.java
@@ -0,0 +1,34 @@
+package org.uic.barcode.staticHeader.ticketLayoutBarcode;
+
+
+public enum FormatType {
+ NORMAL("NORMAL"),
+ BOLD("BOLD"),
+ ITALIC("ITALIC"),
+ BOLDITALIC("BOLDITALIC"),
+ SMALL("SMALL"),
+ SMALLBOLD("SMALLBOLD"),
+ SMALLITALIC("SMALLITALIC"),
+ SMALLBOLDITALIC("SMALLBOLDITALIC");
+
+
+
+ public String text;
+
+ FormatType(String text) {
+ this.text = text;
+ }
+
+ public static FormatType getFormatType(int i) {
+ try {
+ return FormatType.values()[i];
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ public String toString(){
+ return text;
+ }
+
+}
diff --git a/src/org/uic/barcode/staticHeader/ticketLayoutBarcode/LayoutElement.java b/src/org/uic/barcode/staticHeader/ticketLayoutBarcode/LayoutElement.java
new file mode 100644
index 0000000..04593f2
--- /dev/null
+++ b/src/org/uic/barcode/staticHeader/ticketLayoutBarcode/LayoutElement.java
@@ -0,0 +1,50 @@
+package org.uic.barcode.staticHeader.ticketLayoutBarcode;
+
+public class LayoutElement {
+
+ private int column;
+ private int line;
+ private int height;
+ private int width;
+ private String text;
+ private FormatType format = FormatType.NORMAL;
+
+ public int getColumn() {
+ return column;
+ }
+ public void setColumn(int column) {
+ this.column = column;
+ }
+ public int getLine() {
+ return line;
+ }
+ public void setLine(int line) {
+ this.line = line;
+ }
+ public int getHeight() {
+ return height;
+ }
+ public void setHeight(int height) {
+ this.height = height;
+ }
+ public int getWidth() {
+ return width;
+ }
+ public void setWidth(int width) {
+ this.width = width;
+ }
+ public String getText() {
+ return text;
+ }
+ public void setText(String text) {
+ this.text = text;
+ }
+ public FormatType getFormat() {
+ return format;
+ }
+ public void setFormat(FormatType format) {
+ this.format = format;
+ }
+
+
+}
diff --git a/src/org/uic/barcode/staticHeader/ticketLayoutBarcode/TicketLayout.java b/src/org/uic/barcode/staticHeader/ticketLayoutBarcode/TicketLayout.java
new file mode 100644
index 0000000..e788f9a
--- /dev/null
+++ b/src/org/uic/barcode/staticHeader/ticketLayoutBarcode/TicketLayout.java
@@ -0,0 +1,61 @@
+package org.uic.barcode.staticHeader.ticketLayoutBarcode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TicketLayout {
+
+ private String layoutStandard = "RCT2";
+
+ /** The layout elements. */
+ private List<LayoutElement> elements = new ArrayList<LayoutElement>();
+
+
+ /**
+ * Gets the layout standard.
+ *
+ * @return the layout standard
+ */
+ public String getLayoutStandard() {
+ if (layoutStandard == null || layoutStandard.length() != 4) {
+ layoutStandard = "RCT2";
+ }
+ return layoutStandard;
+ }
+
+ /**
+ * Sets the layout standard.
+ *
+ * @param layoutStandard the new layout standard
+ */
+ public void setLayoutStandard(String layoutStandard) {
+ this.layoutStandard = layoutStandard;
+ }
+
+ /**
+ * Adds the layout element.
+ *
+ * @param element the element
+ */
+ public void addLayoutElement(LayoutElement element){
+ elements.add(element);
+ }
+
+ /**
+ * Removes the layout elements.
+ */
+ public void removeLayoutElements(){
+ elements.clear();
+ }
+
+ /**
+ * Gets the elements.
+ *
+ * @return the elements
+ */
+ public List<LayoutElement> getElements(){
+ return elements;
+ }
+
+
+}
diff --git a/src/org/uic/barcode/test/DynamicFrameDoubleSignatureTest.java b/src/org/uic/barcode/test/DynamicFrameDoubleSignatureTest.java
new file mode 100644
index 0000000..f74c40f
--- /dev/null
+++ b/src/org/uic/barcode/test/DynamicFrameDoubleSignatureTest.java
@@ -0,0 +1,212 @@
+package org.uic.barcode.test;
+
+import java.io.IOException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.SecureRandom;
+import java.security.Security;
+import java.security.SignatureException;
+import java.util.Arrays;
+import java.util.zip.DataFormatException;
+
+import org.bouncycastle.jce.ECNamedCurveTable;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.jce.spec.ECParameterSpec;
+import org.junit.Before;
+import org.junit.Test;
+import org.uic.barcode.Decoder;
+import org.uic.barcode.Encoder;
+import org.uic.barcode.dynamicFrame.Constants;
+import org.uic.barcode.dynamicFrame.DataType;
+import org.uic.barcode.test.utils.Level2TestDataFactory;
+import org.uic.barcode.test.utils.SimpleUICTestTicket;
+import org.uic.barcode.utils.AlgorithmNameResolver;
+import org.uic.ticket.EncodingFormatException;
+import org.uic.ticket.api.spec.IUicRailTicket;
+
+public class DynamicFrameDoubleSignatureTest {
+
+ public String signatureAlgorithmOID = null;
+ public String elipticCurve = null;
+ public String keyPairAlgorithmOID = null;
+
+ public KeyPair keyPairLevel1 = null;
+ public KeyPair keyPairLevel2 = null;
+
+ public IUicRailTicket testFCBticket = null;
+
+
+ @Before public void initialize() {
+
+ signatureAlgorithmOID = Constants.ECDSA_SHA256;
+ keyPairAlgorithmOID = Constants.KG_EC_256;
+ elipticCurve = "secp256k1";
+
+ testFCBticket = SimpleUICTestTicket.getUicTestTicket();
+
+ Security.addProvider(new BouncyCastleProvider());
+
+ try {
+ keyPairLevel1 = generateECKeys(keyPairAlgorithmOID, elipticCurve);
+ keyPairLevel2 = generateECKeys(keyPairAlgorithmOID, elipticCurve);
+ } catch (Exception e) {
+ assert(false);
+ }
+
+ assert(keyPairLevel1 != null);
+
+ }
+
+
+ @Test public void testDynamicHeaderBarcodeEncoding() {
+
+ IUicRailTicket ticket = testFCBticket;
+
+ Encoder enc = null;
+
+ try {
+ enc = new Encoder(ticket, null, Encoder.UIC_BARCODE_TYPE_DOSIPAS, 1, 1);
+ } catch (IOException | EncodingFormatException e1) {
+ assert(false);
+ }
+
+ assert(enc != null);
+
+ try {
+ enc.setLevel1Algs(signatureAlgorithmOID, keyPairAlgorithmOID);
+ enc.setLevel2Algs(signatureAlgorithmOID, keyPairAlgorithmOID,keyPairLevel2.getPublic());
+ enc.signLevel1("1080", keyPairLevel1.getPrivate(), signatureAlgorithmOID, "1");
+ } catch (Exception e) {
+ assert(false);
+ }
+
+ assert(enc != null);
+
+ try {
+ enc.setLevel2Data(Level2TestDataFactory.getLevel2SimpleTestData());
+ enc.signLevel2(keyPairLevel2.getPrivate());
+ } catch (Exception e) {
+ assert(false);
+ }
+
+
+ byte[] encoded = null;
+ try {
+ encoded = enc.encode();
+ } catch (Exception e) {
+ assert(false);
+ }
+
+ assert(encoded != null);
+
+
+
+ }
+
+ @Test public void testDynamicHeaderBarcodeDecoding() {
+
+ IUicRailTicket ticket = testFCBticket;
+
+ Encoder enc = null;
+
+ try {
+ enc = new Encoder(ticket, null, Encoder.UIC_BARCODE_TYPE_DOSIPAS, 1, 1);
+ } catch (IOException | EncodingFormatException e1) {
+ assert(false);
+ }
+
+ assert(enc != null);
+
+ try {
+ enc.setLevel1Algs(signatureAlgorithmOID, keyPairAlgorithmOID);
+ enc.setLevel2Algs(signatureAlgorithmOID, keyPairAlgorithmOID,keyPairLevel2.getPublic());
+ enc.signLevel1("1080", keyPairLevel1.getPrivate(), signatureAlgorithmOID, "1");
+ } catch (Exception e) {
+ assert(false);
+ }
+
+ assert(enc != null);
+
+
+ DataType level2Data = Level2TestDataFactory.getLevel2SimpleTestData();
+ try {
+ enc.setLevel2Data(level2Data);
+ enc.signLevel2(keyPairLevel2.getPrivate());
+ } catch (Exception e) {
+ assert(false);
+ }
+
+
+ byte[] encoded = null;
+ try {
+ encoded = enc.encode();
+ } catch (Exception e) {
+ assert(false);
+ }
+
+ assert(encoded != null);
+
+ Decoder dec = null;
+ try {
+ dec = new Decoder(encoded);
+ } catch (IOException e) {
+ assert(false);
+ } catch (EncodingFormatException e) {
+ assert(false);
+ } catch (DataFormatException e) {
+ assert(false);
+ }
+ assert(dec != null);
+
+ int signatureCheck = 0;
+ try {
+ signatureCheck = dec.validateLevel1(keyPairLevel1.getPublic(),null);
+ } catch (InvalidKeyException | NoSuchAlgorithmException | SignatureException | IllegalArgumentException
+ | UnsupportedOperationException | IOException | EncodingFormatException e) {
+ assert(false);
+ }
+ assert(signatureCheck == Constants.LEVEL1_VALIDATION_OK);
+
+ signatureCheck = 0;
+ try {
+ signatureCheck = dec.validateLevel2();
+ } catch (IllegalArgumentException | UnsupportedOperationException e) {
+ assert(false);
+ }
+ assert(signatureCheck == Constants.LEVEL2_VALIDATION_OK);
+
+
+ DataType level2DataDec = dec.getLevel2Data();
+
+ assert(level2Data.getFormat().equals(level2DataDec.getFormat()));
+ assert(Arrays.equals(level2Data.getData().toByteArray(),level2DataDec.getData().toByteArray()));
+
+ SimpleUICTestTicket.compare(ticket, dec.getUicTicket());
+
+
+ }
+
+ public KeyPair generateECDSAKeys(String keyAlgorithmName, String paramName) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException{
+ ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec(paramName);
+ KeyPairGenerator g = KeyPairGenerator.getInstance(keyAlgorithmName, "BC");
+ g.initialize(ecSpec, new SecureRandom());
+ return g.generateKeyPair();
+ }
+
+ public KeyPair generateECKeys(String keyAlgorithmOid, String curve) throws Exception{
+
+ String keyAlgorithmName = AlgorithmNameResolver.getName(AlgorithmNameResolver.TYPE_KEY_GENERATOR_ALG, keyAlgorithmOid, "BC");
+
+ keyAlgorithmName = "ECDSA";
+ ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec(curve);
+ KeyPairGenerator g = KeyPairGenerator.getInstance(keyAlgorithmName, "BC");
+ g.initialize(ecSpec, new SecureRandom());
+ return g.generateKeyPair();
+ }
+
+
+}
diff --git a/src/org/uic/barcode/test/DynamicFrameLOwLevelTest.java b/src/org/uic/barcode/test/DynamicFrameLOwLevelTest.java
new file mode 100644
index 0000000..d3148b2
--- /dev/null
+++ b/src/org/uic/barcode/test/DynamicFrameLOwLevelTest.java
@@ -0,0 +1,116 @@
+package org.uic.barcode.test;
+
+import java.security.InvalidAlgorithmParameterException;
+import java.security.KeyFactory;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.SecureRandom;
+import java.security.Security;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+
+import org.bouncycastle.jce.ECNamedCurveTable;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.jce.spec.ECParameterSpec;
+import org.junit.Before;
+import org.junit.Test;
+import org.uic.barcode.dynamicFrame.Constants;
+import org.uic.barcode.dynamicFrame.DynamicFrame;
+import org.uic.barcode.test.utils.SimpleDynamicFrameTestBarcode;
+
+import net.gcdc.asn1.uper.UperEncoder;
+
+public class DynamicFrameLOwLevelTest {
+
+ public String algorithmOID = Constants.ECDSA_SHA256;
+ public KeyPair keyPair = null;
+ public String publicKeyHex = "3081A7301006072A8648CE3D020106052B81040027038192000405B2797BB27F96EC3769B81E563EEB97A4CE3B5BB4EE19BC90A3F496B805644AA042736E5FA9B3A5FBEA5B01CD1D9EC13C009F9655B31FFF9AA52AC6D90B5D6220B58853A1D18BF20779BE5C52356AE70B19242065F82B76961E2A079F42CA9A41A1AB4D5518446AC3721953AE6323C60E15389498DE5F592A24DDDA45F736D93695C797C0F28A712EC25B9CD8078457";
+ public String privateKeyHex = "30820109020100301006072A8648CE3D020106052B810400270481F13081EE020101044801EF44914319A5DD528C06419D7B0FD0CDD7F62A231BEB197E45A0074C02E11FE82ABAD916BE94FD8256260AA9191F19241CFC7E372B3A4E0ADA06CCA51678C54198667DFC9B0DA8A00706052B81040027A18195038192000405B2797BB27F96EC3769B81E563EEB97A4CE3B5BB4EE19BC90A3F496B805644AA042736E5FA9B3A5FBEA5B01CD1D9EC13C009F9655B31FFF9AA52AC6D90B5D6220B58853A1D18BF20779BE5C52356AE70B19242065F82B76961E2A079F42CA9A41A1AB4D5518446AC3721953AE6323C60E15389498DE5F592A24DDDA45F736D93695C797C0F28A712EC25B9CD8078457";
+
+ public String hexReferenceContent = "400EAC986010DF80A021DE008808014374F3E7D72F2A9979F4A13A90086280B40020894DED0DC0688DEEE0AC593368D60220DCF2EED3BF903B6BCA3B937BAB801280EB44AC0505B4200000000100E6F70656E5469636B6574496E666F120220103B830B9B9B0B3B28084A0B6B9BA32B93230B680202F698040100B20004C6C8020404E9979F40201620505B402C80A0F68020AA192338F4100C08008097308194024800DA0C61105BAD7E13ADF9D5A00CBC47732865EA67E8371A5FBE38B4FABBBABD37459D12048DA6664700E787C32962A607A784FD2FC669A9A8EC9F91CD53AF2B922EFECE24FF3D68024800A1F7CF1C0625FB19CF089E74D668F5E8C15179BEF7BA79D9D169A12FA47F6340ED50BADB57CD83110060FEC08B1EF978C6DB08A172B0DE20C442D4507442623A74A624457590040";
+
+
+ @Before public void initialize() {
+
+ Security.addProvider(new BouncyCastleProvider());
+
+ try {
+ keyPair = generateECDSAKeys();
+ } catch (NoSuchAlgorithmException | NoSuchProviderException | InvalidAlgorithmParameterException e) {
+ e.printStackTrace();
+ }
+ privateKeyHex = UperEncoder.hexStringFromBytes(keyPair.getPrivate().getEncoded());
+ publicKeyHex = UperEncoder.hexStringFromBytes(keyPair.getPublic().getEncoded());
+
+ assert(keyPair != null);
+
+ try {
+ PublicKey publicKey = KeyFactory.getInstance("ECDSA").generatePublic(new X509EncodedKeySpec(UperEncoder.bytesFromHexString(publicKeyHex)));
+ PrivateKey privateKey = KeyFactory.getInstance("ECDSA").generatePrivate(new PKCS8EncodedKeySpec(UperEncoder.bytesFromHexString(privateKeyHex)));
+ keyPair = new KeyPair(publicKey,privateKey);
+ } catch (InvalidKeySpecException | NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ }
+ assert(keyPair != null);
+
+ }
+
+
+ @Test public void testDynamicHeaderBarcodeEncoding() {
+
+ DynamicFrame barcode1 = SimpleDynamicFrameTestBarcode.getSimpleDynamicHeaderBarcode(algorithmOID, keyPair);
+
+ byte[] encoded = barcode1.encode();
+
+ //String hex = UperEncoder.hexStringFromBytes(encoded);
+
+ /*
+ * check the available implementations
+ String s = null;
+ try {
+ s = AlgorithmNameResolver.getSecurityNames();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ */
+
+
+ //note: hex is different each time due to the random seed in the signature
+ assert(encoded != null);
+
+ }
+
+ @Test public void testDynamicHeaderBarcodeDecoding() {
+
+ DynamicFrame barcode1 = SimpleDynamicFrameTestBarcode.getSimpleDynamicHeaderBarcode(algorithmOID, keyPair);
+
+ byte[] encoded = barcode1.encode();
+
+ DynamicFrame barcode = DynamicFrame.decode(encoded);
+
+ int signatureCheck = barcode.validateLevel1(keyPair.getPublic());
+
+ assert(signatureCheck == Constants.LEVEL1_VALIDATION_OK);
+
+ SimpleDynamicFrameTestBarcode.compareFrame(barcode1, barcode);
+
+
+
+
+ }
+
+ public KeyPair generateECDSAKeys() throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException{
+ ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("B-571");
+ KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC");
+ g.initialize(ecSpec, new SecureRandom());
+ return g.generateKeyPair();
+ }
+
+
+
+}
diff --git a/src/org/uic/barcode/test/DynamicFrameSimpleTest.java b/src/org/uic/barcode/test/DynamicFrameSimpleTest.java
new file mode 100644
index 0000000..72b137e
--- /dev/null
+++ b/src/org/uic/barcode/test/DynamicFrameSimpleTest.java
@@ -0,0 +1,171 @@
+package org.uic.barcode.test;
+
+import java.io.IOException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.SecureRandom;
+import java.security.Security;
+import java.security.SignatureException;
+import java.util.zip.DataFormatException;
+
+import org.bouncycastle.jce.ECNamedCurveTable;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.jce.spec.ECParameterSpec;
+import org.junit.Before;
+import org.junit.Test;
+import org.uic.barcode.Decoder;
+import org.uic.barcode.Encoder;
+import org.uic.barcode.dynamicFrame.Constants;
+import org.uic.barcode.test.utils.SimpleUICTestTicket;
+import org.uic.barcode.utils.AlgorithmNameResolver;
+import org.uic.ticket.EncodingFormatException;
+import org.uic.ticket.api.spec.IUicRailTicket;
+
+public class DynamicFrameSimpleTest {
+
+ public String signatureAlgorithmOID = null;
+ public String elipticCurve = null;
+ public String keyPairAlgorithmOID = null;
+
+ public KeyPair keyPair = null;
+
+ public IUicRailTicket testFCBticket = null;
+
+
+ @Before public void initialize() {
+
+ signatureAlgorithmOID = Constants.ECDSA_SHA256;
+ keyPairAlgorithmOID = Constants.KG_EC_256;
+ elipticCurve = "secp256k1";
+
+ testFCBticket = SimpleUICTestTicket.getUicTestTicket();
+
+ Security.addProvider(new BouncyCastleProvider());
+
+ try {
+ keyPair = generateECKeys(Constants.KG_EC, elipticCurve);
+ //keyPair = generateECDSAKeys("ECDSA", "B-571");
+ } catch (Exception e) {
+ assert(false);
+ }
+
+ assert(keyPair != null);
+
+ }
+
+
+ @Test public void testDynamicHeaderBarcodeEncoding() {
+
+ IUicRailTicket ticket = testFCBticket;
+
+ Encoder enc = null;
+
+ try {
+ enc = new Encoder(ticket, null, Encoder.UIC_BARCODE_TYPE_DOSIPAS, 1, 1);
+ } catch (IOException | EncodingFormatException e1) {
+ assert(false);
+ }
+
+ assert(enc != null);
+
+ try {
+ enc.signLevel1("1080", keyPair.getPrivate(), signatureAlgorithmOID, "1");
+ } catch (Exception e) {
+ assert(false);
+ }
+
+
+ byte[] encoded = null;
+ try {
+ encoded = enc.encode();
+ } catch (Exception e) {
+ assert(false);
+ }
+
+ assert(encoded != null);
+
+
+
+ }
+
+ @Test public void testDynamicHeaderBarcodeDecoding() {
+
+ IUicRailTicket ticket = testFCBticket;
+
+ Encoder enc = null;
+
+ try {
+ enc = new Encoder(ticket, null, Encoder.UIC_BARCODE_TYPE_DOSIPAS, 1, 1);
+ } catch (IOException | EncodingFormatException e1) {
+ assert(false);
+ }
+
+ assert(enc != null);
+
+ try {
+ enc.signLevel1("1080", keyPair.getPrivate(), signatureAlgorithmOID, "1");
+ } catch (Exception e) {
+ assert(false);
+ }
+
+
+ byte[] encoded = null;
+ try {
+ encoded = enc.encode();
+ } catch (Exception e) {
+ assert(false);
+ }
+
+ assert(encoded != null);
+
+ Decoder dec = null;
+ try {
+ dec = new Decoder(encoded);
+ } catch (IOException e) {
+ assert(false);
+ } catch (EncodingFormatException e) {
+ assert(false);
+ } catch (DataFormatException e) {
+ assert(false);
+ }
+ assert(dec != null);
+
+ int signatureCheck = 0;
+ try {
+ signatureCheck = dec.validateLevel1(keyPair.getPublic(),null);
+ } catch (InvalidKeyException | NoSuchAlgorithmException | SignatureException | IllegalArgumentException
+ | UnsupportedOperationException | IOException | EncodingFormatException e) {
+ assert(false);
+ }
+
+ assert(signatureCheck == Constants.LEVEL1_VALIDATION_OK);
+
+ SimpleUICTestTicket.compare(ticket, dec.getUicTicket());
+
+
+ }
+
+ public KeyPair generateECDSAKeys(String keyAlgorithmName, String paramName) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException{
+ ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec(paramName);
+ KeyPairGenerator g = KeyPairGenerator.getInstance(keyAlgorithmName, "BC");
+ g.initialize(ecSpec, new SecureRandom());
+ return g.generateKeyPair();
+ }
+
+ public KeyPair generateECKeys(String keyAlgorithmOid, String curve) throws Exception{
+
+ String keyAlgorithmName = AlgorithmNameResolver.getName(AlgorithmNameResolver.TYPE_KEY_GENERATOR_ALG, keyAlgorithmOid, "BC");
+
+ keyAlgorithmName = "ECDSA";
+ ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec(curve);
+ KeyPairGenerator g = KeyPairGenerator.getInstance(keyAlgorithmName, "BC");
+ g.initialize(ecSpec, new SecureRandom());
+ return g.generateKeyPair();
+ }
+
+
+}
diff --git a/src/org/uic/barcode/test/SignatureSplitTest.java b/src/org/uic/barcode/test/SignatureSplitTest.java
new file mode 100644
index 0000000..2e51525
--- /dev/null
+++ b/src/org/uic/barcode/test/SignatureSplitTest.java
@@ -0,0 +1,76 @@
+package org.uic.barcode.test;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+import java.math.BigInteger;
+
+import org.junit.Test;
+import org.uic.barcode.staticFrame.StaticFrame;
+import org.uic.barcode.test.utils.TestUtils;
+import org.uic.ticket.EncodingFormatException;
+
+public class SignatureSplitTest {
+
+
+ /*
+ *
+ *
+ * World-Schema DEFINITIONS AUTOMATIC TAGS ::=
+ BEGIN
+ Signature ::= SEQUENCE OF INTEGER
+ END
+
+
+ value Signature ::= {
+ 340282366920938463,
+ 134515671861986
+ }
+
+
+ Encoding using DER encoding rule
+ Signature SEQUENCE OF: tag = [UNIVERSAL 16] constructed; length = 18
+ INTEGER: tag = [UNIVERSAL 2] primitive; length = 8
+ 340282366920938463
+ INTEGER: tag = [UNIVERSAL 2] primitive; length = 6
+ 134515671861986
+ Encoded successfully in 20 bytes: 30120208 04B8ED02 83A6D3DF 02067A57 5ED68AE2
+
+
+ *
+ *
+ */
+
+
+ @Test public void testSplitSignature() throws IOException, EncodingFormatException{
+
+ BigInteger i1 = BigInteger.valueOf(340282366920938463L);
+ BigInteger i2 = BigInteger.valueOf(134515671861986L);
+
+ byte[] encoded = StaticFrame.encodeSignatureIntegerSequence(i1,i2);
+
+
+ String hex = TestUtils.hexStringFromBytes(encoded);
+
+ assertEquals(hex,"3012020804B8ED0283A6D3DF02067A575ED68AE2");
+
+ BigInteger[] ints = null;
+ try {
+ ints = StaticFrame.decodeSignatureIntegerSequence(encoded);
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ assert(ints != null);
+
+ assert(ints.length == 2);
+
+ assert(i1.equals(ints[0]));
+
+ assert(i2.equals(ints[1]));
+
+ }
+
+
+} \ No newline at end of file
diff --git a/src/org/uic/barcode/test/StaticFrameBarcodeTest.java b/src/org/uic/barcode/test/StaticFrameBarcodeTest.java
new file mode 100644
index 0000000..a0855de
--- /dev/null
+++ b/src/org/uic/barcode/test/StaticFrameBarcodeTest.java
@@ -0,0 +1,193 @@
+package org.uic.barcode.test;
+
+import java.io.IOException;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.SecureRandom;
+import java.security.Security;
+import java.security.SignatureException;
+import java.util.zip.DataFormatException;
+
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.junit.Before;
+import org.junit.Test;
+import org.uic.barcode.Decoder;
+import org.uic.barcode.Encoder;
+import org.uic.barcode.dynamicFrame.Constants;
+import org.uic.barcode.staticHeader.ticketLayoutBarcode.TicketLayout;
+import org.uic.barcode.test.utils.SimpleTestTicketLayout;
+import org.uic.barcode.test.utils.SimpleUICTestTicket;
+import org.uic.ticket.EncodingFormatException;
+import org.uic.ticket.api.spec.IUicRailTicket;
+
+/**
+ * The Class StaticFrameBarcodeTest.
+ */
+public class StaticFrameBarcodeTest {
+
+ /** The algorithm OID. */
+ public String algorithmOID = Constants.DSA_SHA224;
+
+ public int keySize = 2048;
+
+ /** The key pair. */
+ public KeyPair keyPair = null;
+
+
+ public IUicRailTicket testFCBticket = null;
+
+ public TicketLayout testLayout = null;
+
+
+ /**
+ * Initialize.
+ *
+ * set the signature algorithm
+ * generate a key pair
+ * set the test content
+ * for ticket and layout
+ */
+ @Before public void initialize() {
+
+ algorithmOID = Constants.DSA_SHA224;
+ keySize = 2048;
+ testFCBticket = SimpleUICTestTicket.getUicTestTicket();
+ testLayout = SimpleTestTicketLayout.getSimpleTestTicketLayout();
+
+ Security.addProvider(new BouncyCastleProvider());
+
+ try {
+ keyPair = generateDSAKeys(keySize);
+ } catch (NoSuchAlgorithmException | NoSuchProviderException | InvalidAlgorithmParameterException e) {
+ e.printStackTrace();
+ }
+
+ assert(keyPair != null);
+
+ }
+
+
+ /**
+ * Test dynamic header barcode encoding.
+ */
+ @Test public void testDynamicHeaderBarcodeEncoding() {
+
+ IUicRailTicket ticket = testFCBticket;
+
+ TicketLayout layout = testLayout;
+
+ Encoder enc = null;
+
+ try {
+ enc = new Encoder(ticket, layout, Encoder.UIC_BARCODE_TYPE_CLASSIC, 2, 1);
+ } catch (IOException | EncodingFormatException e1) {
+ assert(false);
+ }
+
+ enc.setStaticHeaderParams("123456789012", "de");
+
+ assert(enc != null);
+
+ try {
+ enc.signLevel1("1080", keyPair.getPrivate(), algorithmOID, "1");
+ } catch (Exception e) {
+ assert(false);
+ }
+
+ byte[] encoded = null;
+ try {
+ encoded = enc.encode();
+ } catch (Exception e) {
+ assert(false);
+ }
+
+ assert(encoded != null);
+
+ }
+
+ /**
+ * Test dynamic header barcode decoding.
+ */
+ @Test public void testDynamicHeaderBarcodeDecoding() {
+
+
+ IUicRailTicket ticket = testFCBticket;
+
+ TicketLayout layout = testLayout;
+
+
+ Encoder enc = null;
+
+ try {
+ enc = new Encoder(ticket, layout, Encoder.UIC_BARCODE_TYPE_CLASSIC, 2, 1);
+ } catch (IOException | EncodingFormatException e1) {
+ assert(false);
+ }
+
+ enc.setStaticHeaderParams("123456789012", "de");
+
+ assert(enc != null);
+
+ try {
+ enc.signLevel1("1080", keyPair.getPrivate(), algorithmOID, "1");
+ } catch (Exception e) {
+ assert(false);
+ }
+
+
+ byte[] encoded = null;
+ try {
+ encoded = enc.encode();
+ } catch (Exception e) {
+ assert(false);
+ }
+
+ assert(encoded != null);
+
+ Decoder dec = null;
+ try {
+ dec = new Decoder(encoded);
+ } catch (IOException e) {
+ assert(false);
+ } catch (EncodingFormatException e) {
+ assert(false);
+ } catch (DataFormatException e) {
+ assert(false);
+ }
+ assert(dec != null);
+
+ int signatureCheck = 0;
+ try {
+ signatureCheck = dec.validateLevel1(keyPair.getPublic(),algorithmOID);
+ } catch (InvalidKeyException | NoSuchAlgorithmException | SignatureException | IllegalArgumentException
+ | UnsupportedOperationException | IOException | EncodingFormatException e) {
+ assert(false);
+ }
+
+ assert(signatureCheck == Constants.LEVEL1_VALIDATION_OK);
+
+ SimpleUICTestTicket.compare(ticket, dec.getUicTicket());
+
+ SimpleTestTicketLayout.compare(layout, dec.getLayout());
+
+ }
+
+ /**
+ * Generate DSA keys.
+ *
+ * @return the key pair
+ * @throws NoSuchAlgorithmException the no such algorithm exception
+ * @throws NoSuchProviderException the no such provider exception
+ * @throws InvalidAlgorithmParameterException the invalid algorithm parameter exception
+ */
+ public KeyPair generateDSAKeys(int keySize) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException{
+ KeyPairGenerator g = KeyPairGenerator.getInstance("DSA", "BC");
+ g.initialize(keySize, new SecureRandom());
+ return g.generateKeyPair();
+ }
+
+}
diff --git a/src/org/uic/barcode/test/TicketLayoutTest.java b/src/org/uic/barcode/test/TicketLayoutTest.java
new file mode 100644
index 0000000..0210896
--- /dev/null
+++ b/src/org/uic/barcode/test/TicketLayoutTest.java
@@ -0,0 +1,45 @@
+package org.uic.barcode.test;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+import org.junit.Test;
+import org.uic.barcode.staticFrame.UTLAYDataRecord;
+import org.uic.barcode.staticHeader.ticketLayoutBarcode.TicketLayout;
+import org.uic.barcode.test.utils.SimpleTestTicketLayout;
+import org.uic.barcode.test.utils.TestUtils;
+import org.uic.ticket.EncodingFormatException;
+
+
+public class TicketLayoutTest {
+
+
+ @Test public void testTicketLayout() throws IOException, EncodingFormatException{
+
+ UTLAYDataRecord tl1 = new UTLAYDataRecord();
+
+ TicketLayout layout = SimpleTestTicketLayout.getSimpleTestTicketLayout();
+ tl1.setLayout(layout);
+
+ byte[] encoded = null;
+ try {
+ encoded = tl1.encode();
+ } catch (IOException e) {
+ throw (e);
+ }
+
+ String hex = TestUtils.hexStringFromBytes(encoded);
+
+ assertEquals(hex,"555F544C41593031303034305243543230303031303130313031323030303030374DC3BC6C6C6572");
+
+ UTLAYDataRecord tl2 = new UTLAYDataRecord();
+
+ tl2.decode(tl1.encode());
+
+
+ assertEquals(tl1.toString(),tl2.toString());
+
+ }
+
+}
diff --git a/src/org/uic/barcode/test/utils/Level2TestDataFactory.java b/src/org/uic/barcode/test/utils/Level2TestDataFactory.java
new file mode 100644
index 0000000..a361561
--- /dev/null
+++ b/src/org/uic/barcode/test/utils/Level2TestDataFactory.java
@@ -0,0 +1,20 @@
+package org.uic.barcode.test.utils;
+
+import org.uic.barcode.dynamicFrame.DataType;
+
+import net.gcdc.asn1.datatypesimpl.OctetString;
+
+public class Level2TestDataFactory {
+
+ public static DataType getLevel2SimpleTestData() {
+
+ String testContent = "2020.10.01T12:12.20";
+
+ DataType level2Data = new DataType();
+ level2Data.setFormat("TEST");
+ level2Data.setData(new OctetString(testContent.getBytes()));
+
+ return level2Data;
+ }
+
+}
diff --git a/src/org/uic/barcode/test/utils/SimpleDynamicFrameTestBarcode.java b/src/org/uic/barcode/test/utils/SimpleDynamicFrameTestBarcode.java
new file mode 100644
index 0000000..1782ca6
--- /dev/null
+++ b/src/org/uic/barcode/test/utils/SimpleDynamicFrameTestBarcode.java
@@ -0,0 +1,80 @@
+package org.uic.barcode.test.utils;
+
+import java.security.KeyPair;
+
+import org.uic.barcode.dynamicFrame.Constants;
+import org.uic.barcode.dynamicFrame.DataType;
+import org.uic.barcode.dynamicFrame.DynamicFrame;
+import org.uic.barcode.dynamicFrame.Level1DataType;
+import org.uic.barcode.dynamicFrame.Level2DataType;
+import org.uic.barcode.dynamicFrame.SequenceOfDataType;
+import org.uic.ticket.EncodingFormatException;
+import org.uic.ticket.api.asn.omv1.UicRailTicketData;
+import org.uic.ticket.api.test.SimpleUicTestTicket;
+
+
+public class SimpleDynamicFrameTestBarcode {
+
+ public static DynamicFrame getSimpleDynamicHeaderBarcode(String algorithm, KeyPair keyPair) {
+
+
+
+ DynamicFrame barcode = null;
+
+
+
+ try {
+ barcode = new DynamicFrame();
+ barcode.setFormat(Constants.DYNAMIC_BARCODE_FORMAT_DEFAULT);
+ Level2DataType level2Data = new Level2DataType();
+ barcode.setLevel2SignedData(level2Data);
+
+ Level1DataType level1Data = new Level1DataType();
+ level2Data.setLevel1Data(level1Data);
+
+ level1Data.setSecurityProvider("1080");
+ level1Data.setKeyId(1L);
+
+ level1Data.setLevel1SigningAlg(Constants.ECDSA_SHA256);
+
+ DataType data = new DataType();
+ UicRailTicketData ticket = SimpleUicTestTicket.getUicTestTicket();
+ byte[] ticketData = ticket.encode();
+ data.setByteData(ticketData);
+ data.setFormat(Constants.DATA_TYPE_FCB_VERSION_1);
+ SequenceOfDataType dataSequence = new SequenceOfDataType();
+ level1Data.setData(dataSequence);
+ level1Data.getData().add(data);
+
+ try {
+ level2Data.signLevel1(keyPair.getPrivate());
+ } catch (Exception e) {
+ assert(false);
+ }
+
+
+ } catch (EncodingFormatException e) {
+ e.printStackTrace();
+ return null;
+ }
+
+ return barcode;
+ }
+
+
+ public static void compareFrame(DynamicFrame frame1, DynamicFrame frame2) {
+
+ assert(frame1.getLevel2SignedData().getLevel1Data().getKeyId() == frame2.getLevel2SignedData().getLevel1Data().getKeyId());
+
+ assert(frame1.getLevel2SignedData().getLevel1Data().getLevel1SigningAlg().equals(frame2.getLevel2SignedData().getLevel1Data().level1SigningAlg));
+
+ assert(frame1.getLevel2SignedData().getLevel1Data().getSecurityProvider().equals(frame2.getLevel2SignedData().getLevel1Data().getSecurityProvider()));
+
+ DataType data1 = frame1.getLevel2SignedData().getLevel1Data().getData().get(0);
+ DataType data2 = frame2.getLevel2SignedData().getLevel1Data().getData().get(0);
+
+ assert(data1.getFormat().equals(data2.getFormat()));
+
+ }
+
+}
diff --git a/src/org/uic/barcode/test/utils/SimpleTestTicketLayout.java b/src/org/uic/barcode/test/utils/SimpleTestTicketLayout.java
new file mode 100644
index 0000000..24cbf50
--- /dev/null
+++ b/src/org/uic/barcode/test/utils/SimpleTestTicketLayout.java
@@ -0,0 +1,33 @@
+package org.uic.barcode.test.utils;
+
+import org.uic.barcode.staticHeader.ticketLayoutBarcode.LayoutElement;
+import org.uic.barcode.staticHeader.ticketLayoutBarcode.TicketLayout;
+
+public class SimpleTestTicketLayout {
+
+
+ public static TicketLayout getSimpleTestTicketLayout() {
+
+ TicketLayout layout = new TicketLayout();
+
+ layout.setLayoutStandard("RCT2");
+
+ LayoutElement element = new LayoutElement();
+ element.setColumn(1);
+ element.setLine(1);
+ element.setHeight(1);
+ element.setWidth(20);
+ element.setText("Müller");
+ layout.addLayoutElement(element);
+
+ return layout;
+
+ }
+
+ public static void compare(TicketLayout layout1, TicketLayout layout2) {
+
+ assert(layout1.getLayoutStandard().equals(layout2.getLayoutStandard()));
+
+ }
+
+}
diff --git a/src/org/uic/barcode/test/utils/SimpleUICTestTicket.java b/src/org/uic/barcode/test/utils/SimpleUICTestTicket.java
new file mode 100644
index 0000000..3f38515
--- /dev/null
+++ b/src/org/uic/barcode/test/utils/SimpleUICTestTicket.java
@@ -0,0 +1,254 @@
+package org.uic.barcode.test.utils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.uic.ticket.api.impl.SimpleCardReference;
+import org.uic.ticket.api.impl.SimpleControlDetail;
+import org.uic.ticket.api.impl.SimpleCustomerStatusDescription;
+import org.uic.ticket.api.impl.SimpleExtension;
+import org.uic.ticket.api.impl.SimpleIssuingDetail;
+import org.uic.ticket.api.impl.SimpleOpenTicket;
+import org.uic.ticket.api.impl.SimpleStationPassage;
+import org.uic.ticket.api.impl.SimpleTicketLink;
+import org.uic.ticket.api.impl.SimpleToken;
+import org.uic.ticket.api.impl.SimpleTraveler;
+import org.uic.ticket.api.impl.SimpleTravelerDetail;
+import org.uic.ticket.api.impl.SimpleUicRailTicket;
+import org.uic.ticket.api.spec.ICardReference;
+import org.uic.ticket.api.spec.IControlDetail;
+import org.uic.ticket.api.spec.ICustomerStatusDescription;
+import org.uic.ticket.api.spec.IExtension;
+import org.uic.ticket.api.spec.IIssuingDetail;
+import org.uic.ticket.api.spec.ILinkMode;
+import org.uic.ticket.api.spec.IOpenTicket;
+import org.uic.ticket.api.spec.IStationPassage;
+import org.uic.ticket.api.spec.ITicketLink;
+import org.uic.ticket.api.spec.IToken;
+import org.uic.ticket.api.spec.ITraveler;
+import org.uic.ticket.api.spec.IUicRailTicket;
+
+public class SimpleUICTestTicket {
+
+
+ public static IUicRailTicket getUicTestTicket() {
+ IUicRailTicket ticket = new SimpleUicRailTicket();
+ populateTicket(ticket);
+ return ticket;
+ }
+
+
+ private static void populateTicket(IUicRailTicket ticket) {
+
+ ticket.setControlDetails(new SimpleControlDetail());
+ populate(ticket.getControlDetails());
+
+
+ ticket.setIssuerDetails(new SimpleIssuingDetail());
+ populateIssuingData(ticket.getIssuerDetails());
+
+ SimpleTravelerDetail td = new SimpleTravelerDetail();
+ populateTravelerData(td);
+ ticket.setTravelerDetails(td);
+
+
+ //OpenTicket
+ IOpenTicket do1 = new SimpleOpenTicket();
+ populate(do1);
+ ticket.addOpenTicket(do1);
+
+ //StationPassage
+ IStationPassage do2 = new SimpleStationPassage();
+ populateStationPassage(do2);
+ ticket.addStationPassage(do2);
+
+ //token
+ IToken to = new SimpleToken();
+ to.setTokenProvider("VDV");
+ byte[] ba = { (byte) 0x82, (byte) 0xDA };
+ to.setToken(ba);
+
+
+ ticket.addExtension(populateExtension());
+
+ }
+
+ /*
+ ticket stationPassage : {
+ productName "passage"
+ ,station {8312345}
+ ,stationNameUTF8 { "Amsterdam" }
+ ,validFromDay 0
+ ,validUntilDay 4
+ }
+ */
+ private static void populateStationPassage(IStationPassage sp) {
+ sp.setProductName("passage");
+
+ try {
+ Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2018");
+ sp.setValidFrom(date);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ try {
+ Date date = new SimpleDateFormat("dd/MM/yyyy").parse("04/01/2018");
+ sp.setValidUntil(date);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+
+ sp.addStation("8312345");
+ sp.addStationName("Amsterdam");
+
+ }
+
+ /*
+ {
+ token {tokenProviderIA5 "VDV", token '82DA'H }
+ ,ticket openTicket : {
+ returnIncluded FALSE
+ infoText "openTicketInfo"
+ }
+ }
+ */
+
+ private static void populate(IOpenTicket otd) {
+ otd.setInfoText("openTicketInfo");
+ otd.setReturnIncluded(false);
+ }
+
+
+ /*
+ ,travelerDetail{
+ traveler {
+ {
+ firstName "John"
+ ,secondName "Dow"
+ ,idCard "12345"
+ ,ticketHolder TRUE
+ ,status {{customerStatusDescr "senior" }}
+ }
+ }
+ ,groupName "myGroup"
+ }
+ */
+
+ private static void populateTravelerData(SimpleTravelerDetail td) {
+ td.setGroupName("myGroup");
+ ITraveler tr = new SimpleTraveler();
+ tr.setIdCard("12345");
+ tr.setFirstName("John");
+ tr.setSecondName("Dow");
+ tr.setTicketHolder(true);
+ ICustomerStatusDescription cst = new SimpleCustomerStatusDescription();
+ tr.addStatusDescription(cst);
+ cst.setDescription("senior");
+ td.addTraveler(tr);
+ }
+
+ /*
+ ,issuingDetail {
+ issuerNum 1080
+ issuingYear 2018
+ issuingDay 1
+ specimen TRUE,
+ securePaperTicket FALSE,
+ activated TRUE,
+ issuerPNR "issuerTestPNR",
+ issuedOnLine 12
+ }
+ */
+ private static void populateIssuingData(IIssuingDetail iIssuingDetail) {
+
+ try {
+ Date date = new SimpleDateFormat("dd/MM/yyyy").parse("01/01/2018");
+ iIssuingDetail.setIssuer("1080");
+ iIssuingDetail.setIssuingDate(date);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+
+
+ iIssuingDetail.setIssuerPNR("issuerTestPNR");
+ iIssuingDetail.setSpecimen(true);
+ iIssuingDetail.setSecurePaperTicket(false);
+ iIssuingDetail.setActivated(true);
+ iIssuingDetail.setIssuedOnLine(12);
+ }
+
+ /*
+ ,extension {
+ { extensionId "1", extensionData '82DA'H }
+ ,{ extensionId "2", extensionData '83DA'H }
+ }
+ */
+ private static IExtension populateExtension() {
+ IExtension ed1 = new SimpleExtension();
+ ed1.setId("1");
+ byte[] ba1 = { (byte) 0x82, (byte) 0xDA };
+ ed1.setBinarydata(ba1);
+ return ed1;
+ }
+
+ /*
+ ,controlDetail {
+ identificationByCardReference {
+ { trailingCardIdNum 100 }
+ }
+ ,identificationByIdCard FALSE
+ ,identificationByPassportId FALSE
+ ,passportValidationRequired FALSE
+ ,onlineValidationRequired FALSE
+ ,ageCheckRequired FALSE
+ ,reductionCardCheckRequired FALSE
+ ,infoText "cd"
+ ,includedTickets {
+ { productOwnerIA5 "test" }
+ }
+ }
+ */
+ private static void populate(IControlDetail iControlDetail) {
+ iControlDetail.setInfoText("cd");
+ iControlDetail.setAgeCheckRequired(false);
+ iControlDetail.setIdentificationByIdCard(false);
+ iControlDetail.setIdentificationByPassportId(false);
+ iControlDetail.setOnlineValidationRequired(false);
+ iControlDetail.setPassportValidationRequired(false);
+ iControlDetail.setReductionCardCheckRequired(false);
+ iControlDetail.getIdentificationByCardReference().add(populateCardRefrence());
+ iControlDetail.addLinkedTicket(populateLinkedTicket());
+ }
+
+
+ /*
+ *
+ */
+ private static ITicketLink populateLinkedTicket() {
+ ITicketLink it = new SimpleTicketLink();
+ it.setProductOwner("test");
+ it.setLinkMode(ILinkMode.issuedTogether);
+ return it;
+ }
+
+ /*
+ {
+ trailingCardIdNum 100
+ }
+ */
+ private static ICardReference populateCardRefrence() {
+ ICardReference cr = new SimpleCardReference();
+ cr.setTrailingCardId("100");
+ return cr;
+ }
+
+
+ public static void compare(IUicRailTicket ticket1, IUicRailTicket ticket2) {
+
+ assert(ticket1.getIssuerDetails().getIssuer().equals(ticket2.getIssuerDetails().getIssuer()));
+
+ }
+
+
+}
diff --git a/src/org/uic/barcode/test/utils/TestUtils.java b/src/org/uic/barcode/test/utils/TestUtils.java
new file mode 100644
index 0000000..7311ae4
--- /dev/null
+++ b/src/org/uic/barcode/test/utils/TestUtils.java
@@ -0,0 +1,38 @@
+package org.uic.barcode.test.utils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class TestUtils {
+
+ final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
+
+ public static String hexStringFromBytes(byte[] bytes) {
+ char[] hexChars = new char[bytes.length * 2];
+ for (int j = 0; j < bytes.length; j++) {
+ int v = bytes[j] & 0xFF;
+ hexChars[j * 2] = hexArray[v >>> 4];
+ hexChars[j * 2 + 1] = hexArray[v & 0x0F];
+ }
+ return new String(hexChars);
+ }
+
+
+ public static Date parseDate (String source){
+
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+
+ try {
+ return formatter.parse(source);
+ } catch (ParseException e) {
+ try {
+ return formatter.parse("2001-01-01");
+ } catch (ParseException e1) {
+ return null;
+ }
+ }
+
+ }
+
+}
diff --git a/src/org/uic/barcode/utils/AlgorithmNameResolver.java b/src/org/uic/barcode/utils/AlgorithmNameResolver.java
new file mode 100644
index 0000000..300bf7d
--- /dev/null
+++ b/src/org/uic/barcode/utils/AlgorithmNameResolver.java
@@ -0,0 +1,173 @@
+package org.uic.barcode.utils;
+
+import java.security.Provider;
+import java.security.Provider.Service;
+import java.security.Security;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class AlgorithmNameResolver {
+
+
+ public static final String TYPE_KEY_GENERATOR_ALG = "KeyPairGenerator";
+ public static final String TYPE_SIGNATURE_ALG = "Signature";
+
+
+ private static final Pattern KEY_TYPE_PATTERN = Pattern.compile("^(\\w+)[.].*$");
+ private static final Pattern KEY_ALIAS_TYPE_PATTERN = Pattern.compile("^Alg[.]Alias[.](\\w+).*$");
+ private static final Pattern KEY_OID_PATTERN = Pattern.compile(".*?(\\d+(?:[.]\\d+){3,})$");
+
+ public static String getSignatureAlgorithmName (String oid) throws Exception {
+
+ Provider[] provs = Security.getProviders();
+ for (Provider prov : provs) {
+ Service service = prov.getService(AlgorithmNameResolver.TYPE_SIGNATURE_ALG,oid);
+ if (service != null) {
+ return service.getAlgorithm();
+ }
+ }
+ return null;
+
+ }
+
+
+ public static String getName(String type, String oid) throws Exception {
+
+ Provider[] provs = Security.getProviders();
+
+ for (Provider prov : provs) {
+
+ SortedSet<String> typeAndOID = getTypeAndOIDStrings(prov);
+
+ for (String entry : typeAndOID) {
+ String[] typeAndOIDArray = entry.split("-");
+ String ptype = typeAndOIDArray[0];
+ if (ptype.equalsIgnoreCase(type)) {
+ String poid = typeAndOIDArray[1];
+ Service pservice = prov.getService(ptype, poid);
+ String palgo = pservice.getAlgorithm();
+
+ if (ptype.equalsIgnoreCase(type) && poid.equals(oid)) {
+ return palgo;
+ }
+ }
+ }
+ }
+
+
+ if (oid.startsWith("1.2.840.10045")) {
+ return "ECDSA";
+ } else if (oid.startsWith("1.2.840.10040")) {
+ return "DSA";
+ }
+
+ return null;
+
+ }
+
+ public static String getName(String type, String oid, String providerName) throws Exception {
+
+ Provider[] provs = Security.getProviders();
+
+ for (Provider prov : provs) {
+
+ if (providerName == null || prov.getName().equals(providerName)) {
+
+ SortedSet<String> typeAndOID = getTypeAndOIDStrings(prov);
+
+ for (String entry : typeAndOID) {
+ String[] typeAndOIDArray = entry.split("-");
+ String ptype = typeAndOIDArray[0];
+ if (ptype.equalsIgnoreCase(type)) {
+ String poid = typeAndOIDArray[1];
+ Service pservice = prov.getService(ptype, poid);
+ String palgo = pservice.getAlgorithm();
+
+ if (ptype.equalsIgnoreCase(type) && poid.equals(oid)) {
+ return palgo;
+ }
+ }
+ }
+ }
+ }
+
+
+ if (oid.startsWith("1.2.840.10045")) {
+ return "ECDSA";
+ } else if (oid.startsWith("1.2.840.10040")) {
+ return "DSA";
+ }
+
+ return null;
+
+ }
+
+ private static SortedSet<String> getTypeAndOIDStrings(Provider prov) {
+
+ SortedSet<String> typeAndOID = new TreeSet<>();
+
+ Set<Object> keys = prov.keySet();
+ for (Object key : keys) {
+ String keyString = key.toString();
+ Matcher oidMatcher = KEY_OID_PATTERN.matcher(keyString);
+ if (oidMatcher.matches()) {
+ // get OID from matched keyString
+ String oid = oidMatcher.group(1);
+
+ // determine type
+ String type;
+ Matcher aliasTypeMatcher = KEY_ALIAS_TYPE_PATTERN.matcher(keyString);
+ if (aliasTypeMatcher.matches()) {
+ type = aliasTypeMatcher.group(1);
+ } else {
+ Matcher typeMatcher = KEY_TYPE_PATTERN.matcher(keyString);
+ typeMatcher.matches();
+ type = typeMatcher.group(1);
+ }
+ // algorithm parameters are not algorithms, so skip them
+ if (type.equals("AlgorithmParameters")) {
+ continue;
+ }
+
+ // auto-removes dupes
+ typeAndOID.add(type + "-" + oid);
+ }
+ }
+ return typeAndOID;
+ }
+
+
+ public static String getSecurityNames() throws Exception {
+
+ Provider[] provs = Security.getProviders();
+
+ StringBuilder sb = new StringBuilder();
+
+ for (Provider prov : provs) {
+
+ SortedSet<String> typeAndOID = getTypeAndOIDStrings(prov);
+
+ for (String entry : typeAndOID) {
+ String[] typeAndOIDArray = entry.split("-");
+ String ptype = typeAndOIDArray[0];
+ String poid = typeAndOIDArray[1];
+ Service pservice = prov.getService(ptype, poid);
+ String palgo = "";
+ if ( pservice != null) {
+ palgo = pservice.getAlgorithm();
+ }
+ sb.append(prov).append(";");
+ sb.append(ptype).append(";");
+ sb.append(poid).append(";");
+ sb.append(palgo).append(";");
+ sb.append("\r\n");
+
+ }
+ }
+ return sb.toString();
+
+ }
+}
diff --git a/src/org/uic/barcode/utils/package.html b/src/org/uic/barcode/utils/package.html
new file mode 100644
index 0000000..45a73a9
--- /dev/null
+++ b/src/org/uic/barcode/utils/package.html
@@ -0,0 +1,20 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head></head>
+<body>
+
+<h1>Implementation of the header frames to bundle all data for a bar code.</h1>
+
+<p>
+
+ Provides a decoding and encoding of the header data frames for:<br/><br/>
+
+ <ul>
+ <li> static header as defined in UIC IRS 90918-9</li>
+ <li> dynamic header as drafted for the UIC IRS 90918-9</li>
+
+ </ul>
+</p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/src/org/uic/header/DataBlockType.java b/src/org/uic/header/DataBlockType.java
deleted file mode 100644
index 503c203..0000000
--- a/src/org/uic/header/DataBlockType.java
+++ /dev/null
@@ -1,129 +0,0 @@
-package org.uic.header;
-
-import net.gcdc.asn1.datatypes.Asn1Optional;
-import net.gcdc.asn1.datatypes.CharacterRestriction;
-import net.gcdc.asn1.datatypes.IntRange;
-import net.gcdc.asn1.datatypes.RestrictedString;
-import net.gcdc.asn1.datatypes.Sequence;
-import net.gcdc.asn1.uper.UperEncoder;
-
-
-/**
- * The DataBlockType.
- *
- * Data block ready for signing
- *
- */
-@Sequence
-public class DataBlockType {
-
-
- /** The data. */
- public SequenceOfDataType data;
-
- /**
- * The signing algorithm
- * Object Identifier of the Algorithm
- * Number notation:
- *
- * e.g.:
- * -- DSA SHA224 2.16.840.1.101.3.4.3.1
- * -- DSA SHA248 2.16.840.1.101.3.4.3.2
- * -- ECC 1.2.840.10045.3.1.7
- *
- *
- */
- @RestrictedString(CharacterRestriction.ObjectIdentifier)
- @Asn1Optional public String signingAlg;
-
- /** The key id. */
- @IntRange(minValue=1,maxValue=1024)
- @Asn1Optional public Long keyId;
-
- /**
- * Gets the data.
- *
- * @return the data
- */
- public SequenceOfDataType getData() {
- return data;
- }
-
- /**
- * Sets the data.
- *
- * @param data the new data
- */
- public void setData(SequenceOfDataType data) {
- this.data = data;
- }
-
- /**
- * Gets the signing algorithm
- *
- * Object Identifier of algorithm Algorithm
- * Number notation:
- *
- * e.g.:
- * -- DSA SHA224 2.16.840.1.101.3.4.3.1
- * -- DSA SHA248 2.16.840.1.101.3.4.3.2
- * -- ECC 1.2.840.10045.3.1.7
- *
- * @return the signing alg
- */
- public String getSigningAlg() {
- return signingAlg;
- }
-
- /**
- * Sets the signing algorithm
- *
- * Object Identifier of the Algorithm
- * Number notation:
- *
- * e.g.:
- * -- DSA SHA224 2.16.840.1.101.3.4.3.1
- * -- DSA SHA248 2.16.840.1.101.3.4.3.2
- * -- ECC 1.2.840.10045.3.1.7
- *
- * @param signingAlgorithm the new signing alg
- */
- public void setSigningAlg(String signingAlgorithm) {
- this.signingAlg = signingAlgorithm;
- }
-
- /**
- * Gets the key id.
- *
- * @return the key id
- */
- public Long getKeyId() {
- return keyId;
- }
-
- /**
- * Sets the key id.
- *
- * @param keyId the new key id
- */
- public void setKeyId(Long keyId) {
- this.keyId = keyId;
- }
-
-
- /**
- * Gets the data for signature.
- *
- * The byte array containing the ASN.1 PER UNALIGNED encoded data of the DataBlock
- *
- *
- * @return the data for signature
- */
- public byte[] getDataForSignature() {
- return UperEncoder.encode(this);
-
- }
-
-
-
-}
diff --git a/src/org/uic/header/DynamicHeader.java b/src/org/uic/header/DynamicHeader.java
deleted file mode 100644
index 220e7f2..0000000
--- a/src/org/uic/header/DynamicHeader.java
+++ /dev/null
@@ -1,259 +0,0 @@
-package org.uic.header;
-
-import org.uic.ticket.api.EncodingFormatException;
-import org.uic.ticket.api.utils.UicEncoderUtils;
-
-import net.gcdc.asn1.datatypes.Asn1Optional;
-import net.gcdc.asn1.datatypes.CharacterRestriction;
-import net.gcdc.asn1.datatypes.HasExtensionMarker;
-import net.gcdc.asn1.datatypes.IntRange;
-import net.gcdc.asn1.datatypes.RestrictedString;
-import net.gcdc.asn1.datatypes.Sequence;
-import net.gcdc.asn1.datatypesimpl.OctetString;
-import net.gcdc.asn1.uper.UperEncoder;
-
-
-// TODO: Auto-generated Javadoc
-/**
- * The DynamicHeader for bar codes
- *
- * Implementation of the Draft under discussion, not final.
- */
-@Sequence
-@HasExtensionMarker
-public class DynamicHeader {
-
-
- /** The format. */
- @RestrictedString(CharacterRestriction.IA5String)
- public String format;
-
- /** The vesion. */
- @IntRange(minValue=1,maxValue=16)
- public Long version;
-
-
- /**
- * The security provider
- * numeric codes 1 ...32000
- *
- * */
- @IntRange(minValue=1,maxValue=32000)
- @Asn1Optional public Long securityProviderNum;
-
- /** The security provider alphanumeric codes. */
- @RestrictedString(CharacterRestriction.IA5String)
- @Asn1Optional public String securityProviderIA5;
-
-
- /** The static data. */
- public SignedDataType staticData;
-
- /** The dynamic data. */
- @Asn1Optional public SignedDataType dynamicData;
-
- /** The dynamic public key. */
- @Asn1Optional public OctetString dynamicPublicKey;
-
- /** The extension. */
- @Asn1Optional public Extension extension;
-
- /**
- * Gets the format.
- *
- * @return the format
- */
- public String getFormat() {
- return format;
- }
-
- /**
- * Sets the format.
- *
- * @param format the new format
- */
- public void setFormat(String format) {
- this.format = format;
- }
-
- /**
- * Gets the version.
- *
- * @return the version
- */
- public Long getVersion() {
- return version;
- }
-
- /**
- * Sets the version.
- *
- * @param version the new version
- */
- public void setVersion(Long version) {
- this.version = version;
- }
-
- /**
- * Gets the security provider num.
- *
- * @return the security provider num
- */
- public Long getSecurityProviderNum() {
- return securityProviderNum;
- }
-
- /**
- * Sets the security provider num.
- *
- * in case the security provider code is encoded in IA5 this will return null
- *
- * @param securityProviderNum the new security provider num
- */
- public void setSecurityProviderNum(Long securityProviderNum) {
- this.securityProviderNum = securityProviderNum;
- }
-
- /**
- * Gets the security provider IA5.
- *
- * in case the security provider code is encoded numerically this will return null
- *
- * @return the security provider IA5
- */
- public String getSecurityProviderIA5() {
- return securityProviderIA5;
- }
-
- /**
- * Sets the security provider
- *
- * The security provider code must use the IA5 Alphabet .
- *
- * @param securityProvider the new security provider
- * @throws EncodingFormatException the encoding format exception
- */
- public void setSecurityProvider(String securityProvider) throws EncodingFormatException {
- this.securityProviderNum = UicEncoderUtils.getNum(securityProvider);
- this.securityProviderIA5 = UicEncoderUtils.getIA5NonNum(securityProvider);
- }
-
-
- /**
- * Gets the security provider.
- *
- * @return the security provider
- */
- public String getSecurityProvider() {
- return UicEncoderUtils.mapToString(this.securityProviderNum, this.securityProviderIA5);
- }
-
-
- /**
- * Sets the security provider IA 5.
- *
- * @param securityProviderIA5 the new security provider IA 5
- */
- public void setSecurityProviderIA5(String securityProviderIA5) {
- this.securityProviderIA5 = securityProviderIA5;
- }
-
- /**
- * Gets the static data.
- *
- * @return the static data
- */
- public SignedDataType getStaticData() {
- return staticData;
- }
-
- /**
- * Sets the static data.
- *
- * @param staticData the new static data
- */
- public void setStaticData(SignedDataType staticData) {
- this.staticData = staticData;
- }
-
- /**
- * Gets the dynamic data.
- *
- * @return the dynamic data
- */
- public SignedDataType getDynamicData() {
- return dynamicData;
- }
-
- /**
- * Sets the dynamic data.
- *
- * @param dynamicData the new dynamic data
- */
- public void setDynamicData(SignedDataType dynamicData) {
- this.dynamicData = dynamicData;
- }
-
- /**
- * Gets the dynamic public key.
- *
- * @return the dynamic public key
- */
- public OctetString getDynamicPublicKey() {
- return dynamicPublicKey;
- }
-
- /**
- * Sets the dynamic public key.
- *
- * @param dynamicPublicKey the new dynamic public key
- */
- public void setDynamicPublicKey(OctetString dynamicPublicKey) {
- this.dynamicPublicKey = dynamicPublicKey;
- }
-
- /**
- * Gets the extension.
- *
- * @return the extension
- */
- public Extension getExtension() {
- return extension;
- }
-
- /**
- * Sets the extension.
- *
- * @param extension the new extension
- */
- public void setExtension(Extension extension) {
- this.extension = extension;
- }
-
-
- /**
- * Encode.
- *
- * Encode the header as ASN.1 PER UNALIGNED byte array
- *
- * @return the byte[]
- */
- public byte[] encode() {
- return UperEncoder.encode(this);
- }
-
- /**
- * Decode.
- *
- * Decode the header from an ASN.1 PER UNALIGNED encoded byte array
- *
- * @param bytes the bytes
- * @return the dynamic header
- */
- public static DynamicHeader decode(byte[] bytes) {
- return UperEncoder.decode(bytes, DynamicHeader.class);
- }
-
-
-
-}
diff --git a/src/org/uic/header/Extension.java b/src/org/uic/header/Extension.java
deleted file mode 100644
index 98f44d7..0000000
--- a/src/org/uic/header/Extension.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package org.uic.header;
-
-
-import net.gcdc.asn1.datatypes.CharacterRestriction;
-import net.gcdc.asn1.datatypes.RestrictedString;
-import net.gcdc.asn1.datatypes.Sequence;
-import net.gcdc.asn1.datatypesimpl.OctetString;
-
-
-// TODO: Auto-generated Javadoc
-/**
- * The Class Extension.
- */
-@Sequence
-public class Extension extends Object {
-
- /**
- * Instantiates a new extension.
- */
- public Extension() {}
-
- /** The extension id. */
- @RestrictedString(CharacterRestriction.IA5String)
- public String extensionId;
-
- /** The extension data. */
- public OctetString extensionData;
-
- /**
- * Gets the extension id.
- *
- * @return the extension id
- */
- public String getExtensionId() {
-
- return this.extensionId;
- }
-
- /**
- * Gets the extension data.
- *
- * @return the extension data
- */
- public byte[] getExtensionData() {
-
- return extensionData.toByteArray();
- }
-
- /**
- * Sets the extension id.
- *
- * @param extensionId the new extension id
- */
- public void setExtensionId(String extensionId) {
-
- this.extensionId = extensionId;
- }
-
- /**
- * Sets the extension data.
- *
- * @param extensionData the new extension data
- */
- public void setExtensionData(byte[] extensionData) {
-
- this.extensionData = new OctetString(extensionData);
-
- }
-
-
-
-}
diff --git a/src/org/uic/header/SignedDataType.java b/src/org/uic/header/SignedDataType.java
deleted file mode 100644
index 2cd2acd..0000000
--- a/src/org/uic/header/SignedDataType.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.uic.header;
-
-import net.gcdc.asn1.datatypes.Asn1Optional;
-import net.gcdc.asn1.datatypes.Sequence;
-import net.gcdc.asn1.datatypesimpl.OctetString;
-
-/**
- * The Class SignedDataType.
- */
-@Sequence
-public class SignedDataType {
-
- /** The data. */
- public DataBlockType dataBlock;
-
- /** The signature. */
- @Asn1Optional public OctetString signature;
-
- /**
- * Gets the data.
- *
- * @return the data
- */
- public DataBlockType getDataBlock() {
- return dataBlock;
- }
-
- /**
- * Sets the data.
- *
- * @param data the new data
- */
- public void setDataBlock(DataBlockType dataBlock) {
- this.dataBlock = dataBlock;
- }
-
- /**
- * Gets the signature.
- *
- * @return the signature
- */
- public OctetString getSignature() {
- return signature;
- }
-
- /**
- * Sets the signature.
- *
- * @param signature the signature
- */
- public void setSignature(OctetString signature) {
- this.signature = signature;
- }
-
-
- /**
- * Sets the signature.
- *
- * @param signature the signature
- */
- public void setSignature(byte[] signature) {
- this.signature = new OctetString(signature);
- }
-
-
-
-}
diff --git a/src/org/uic/ticket/api/asn/omv2/BerthDetailData.java b/src/org/uic/ticket/api/asn/omv2/BerthDetailData.java
new file mode 100644
index 0000000..31bb1fd
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/BerthDetailData.java
@@ -0,0 +1,75 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.Sequence;
+
+
+@Sequence
+@HasExtensionMarker
+public class BerthDetailData extends Object {
+ public BerthDetailData() {
+ }
+
+ public BerthTypeType berthType;
+
+ @IntRange(minValue=1, maxValue=999)
+ public Long numberOfBerths;
+
+ @Asn1Default(value="family")
+ @Asn1Optional public CompartmentGenderType gender;
+
+
+ public BerthTypeType getBerthType() {
+ return this.berthType;
+ }
+
+ public Long getNumberOfBerths() {
+ return this.numberOfBerths;
+ }
+
+ public CompartmentGenderType getGender() {
+
+ if (gender == null){
+ return CompartmentGenderType.family;
+ } else {
+ return this.gender;
+ }
+ }
+
+ public void setBerthType(BerthTypeType berthType) {
+
+ this.berthType = berthType;
+ }
+
+ public void setNumberOfBerths(Long numberOfBerths) {
+ this.numberOfBerths = numberOfBerths;
+ }
+
+ public void setGender(CompartmentGenderType gender) {
+ this.gender = gender;
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/BerthTypeType.java b/src/org/uic/ticket/api/asn/omv2/BerthTypeType.java
new file mode 100644
index 0000000..72c78a1
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/BerthTypeType.java
@@ -0,0 +1,41 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+public enum BerthTypeType {
+ single("single"),
+ special("special"),
+ double_("double_"),
+ t2("t2"),
+ t3("t3"),
+ t4("t4");
+
+
+ public String text;
+
+ BerthTypeType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/CarCarriageReservationData.java b/src/org/uic/ticket/api/asn/omv2/CarCarriageReservationData.java
new file mode 100644
index 0000000..df96c96
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/CarCarriageReservationData.java
@@ -0,0 +1,692 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import org.uic.ticket.api.asn.omv1.SequenceOfCarrierNum;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Default;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+import net.gcdc.asn1.datatypesimpl.SequenceOfStringIA5;
+
+
+
+@Sequence
+@HasExtensionMarker
+public class CarCarriageReservationData extends Object {
+ public CarCarriageReservationData() {
+ }
+
+ @Asn1Optional public Asn1BigInteger trainNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String trainIA5;
+
+ @IntRange(minValue=-1,maxValue=370)
+ @Asn1Default(value="0")
+ @Asn1Optional public Long beginLoadingDate;
+
+ @IntRange(minValue=0,maxValue=1439)
+ @Asn1Optional public Long beginLoadingTime;
+
+ @IntRange(minValue=0,maxValue=1439)
+ @Asn1Optional public Long endLoadingTime;
+
+ @IntRange(minValue=-60, maxValue=60)
+ @Asn1Optional public Long loadingUTCOffset;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String referenceIA5;
+
+ @Asn1Optional public Asn1BigInteger referenceNum;
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long productOwnerNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productOwnerIA5;
+
+ @IntRange(minValue=0,maxValue=65535)
+ @Asn1Optional public Long productIdNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productIdIA5;
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long serviceBrand;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String serviceBrandAbrUTF8;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String serviceBrandNameUTF8;
+
+ @Asn1Default("stationUICReservation")
+ @Asn1Optional public CodeTableType stationCodeTable;
+
+ @IntRange(minValue=1,maxValue=9999999)
+ @Asn1Optional public Long fromStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String fromStationIA5;
+
+ @IntRange(minValue=1,maxValue=9999999)
+ @Asn1Optional public Long toStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String toStationIA5;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String fromStationNameUTF8;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String toStationNameUTF8;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String coach;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String place;
+
+ @Asn1Optional public CompartmentDetailsType compartmentDetails;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ public String numberPlate;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String trailerPlate;
+
+ @IntRange(minValue=0,maxValue=9)
+ public Long carCategory;
+
+ @IntRange(minValue=0,maxValue=6)
+ @Asn1Optional public Long boatCategory;
+
+ public Boolean textileRoof = false;
+
+ @Asn1Default(value ="norack")
+ @Asn1Optional public RoofRackType roofRackType;
+
+ @IntRange(minValue=0,maxValue=99)
+ @Asn1Optional public Long roofRackHeight;
+
+ @IntRange(minValue=0,maxValue=2)
+ @Asn1Optional public Long attachedBoats;
+
+ @IntRange(minValue=0,maxValue=4)
+ @Asn1Optional public Long attachedBicycles;
+
+ @IntRange(minValue=0,maxValue=5)
+ @Asn1Optional public Long attachedSurfboards;
+
+ @IntRange(minValue=0,maxValue=999)
+ @Asn1Optional public Long loadingListEntry;
+
+ @Asn1Default(value="upper")
+ @Asn1Optional public LoadingDeckType loadingDeck;
+
+ @Asn1Optional public SequenceOfCarrierNum carrierNum;
+
+ @Asn1Optional public SequenceOfStringIA5 carrierIA5;
+
+ public TariffType tariff;
+
+ @Asn1Default(value="travelPrice")
+ @Asn1Optional public PriceTypeType priceType;
+
+
+ @Asn1Optional Asn1BigInteger price;
+
+ @Asn1Optional SequenceOfVatDetail vatDetails;
+
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String infoText;
+
+ @Asn1Optional public ExtensionData extension;
+
+ public Long getTrainNum() {
+ if (this.trainNum == null) return null;
+ return Asn1BigInteger.toLong(this.trainNum);
+ }
+
+ public String getTrainIA5() {
+
+ return this.trainIA5;
+ }
+
+ public Long getBeginLoadingDate() {
+
+ return this.beginLoadingDate;
+ }
+
+ public Long getBeginLoadingTime() {
+
+ if (beginLoadingTime == null) return new Long(0);
+ return beginLoadingTime;
+ }
+
+ public Long getEndLoadingTime() {
+
+ return this.endLoadingTime;
+ }
+
+ public String getReferenceIA5() {
+
+ return this.referenceIA5;
+ }
+
+ public Long getReferenceNum() {
+ return Asn1BigInteger.toLong(this.referenceNum);
+ }
+
+ public Long getProductOwnerNum() {
+
+ return this.productOwnerNum;
+ }
+
+ public String getProductOwnerIA5() {
+
+ return this.productOwnerIA5;
+ }
+
+ public Long getProductIdNum() {
+
+ return this.productIdNum;
+ }
+
+ public String getProductIdIA5() {
+
+ return this.productIdIA5;
+ }
+
+ public Long getServiceBrand() {
+
+ return this.serviceBrand;
+ }
+
+ public String getServiceBrandAbrUTF8() {
+
+ return this.serviceBrandAbrUTF8;
+ }
+
+ public String getServiceBrandNameUTF8() {
+
+ return this.serviceBrandNameUTF8;
+ }
+
+ public CodeTableType getStationCodeTable() {
+
+ if (stationCodeTable == null) {
+ return CodeTableType.stationUICReservation;
+ }
+
+ return this.stationCodeTable;
+ }
+
+ public Long getFromStationNum() {
+
+ return this.fromStationNum;
+ }
+
+ public String getFromStationIA5() {
+
+ return this.fromStationIA5;
+ }
+
+ public Long getToStationNum() {
+
+ return this.toStationNum;
+ }
+
+ public String getToStationIA5() {
+
+ return this.toStationIA5;
+ }
+
+ public String getFromStationNameUTF8() {
+
+ return this.fromStationNameUTF8;
+ }
+
+ public String getToStationNameUTF8() {
+
+ return this.toStationNameUTF8;
+ }
+
+ public String getCoach() {
+
+ return this.coach;
+ }
+
+ public String getPlace() {
+
+ return this.place;
+ }
+
+ public CompartmentDetailsType getCompartmentDetails() {
+
+ return this.compartmentDetails;
+ }
+
+ public String getNumberPlate() {
+
+ return this.numberPlate;
+ }
+
+ public String getTrailerPlate() {
+
+ return this.trailerPlate;
+ }
+
+ public Long getCarCategory() {
+
+ return this.carCategory;
+ }
+
+ public Long getBoatCategory() {
+
+ return this.boatCategory;
+ }
+
+ public Boolean getTextileRoof() {
+
+ return this.textileRoof;
+ }
+
+ public RoofRackType getRoofRackType() {
+
+ if (this.roofRackType == null) return RoofRackType.norack;
+ return this.roofRackType;
+ }
+
+ public Long getRoofRackHeight() {
+
+ return this.roofRackHeight;
+ }
+
+ public Long getAttachedBoats() {
+
+ return this.attachedBoats;
+ }
+
+ public Long getAttachedBicycles() {
+
+ return this.attachedBicycles;
+ }
+
+ public Long getAttachedSurfboards() {
+
+ return this.attachedSurfboards;
+ }
+
+ public Long getLoadingListEntry() {
+
+ return this.loadingListEntry;
+ }
+
+ public LoadingDeckType getLoadingDeck() {
+
+ if (this.loadingDeck == null) return LoadingDeckType.upper;
+ return this.loadingDeck;
+ }
+
+ public SequenceOfCarrierNum getCarrierNum() {
+
+ return this.carrierNum;
+ }
+
+ public SequenceOfStringIA5 getCarrierIA5() {
+
+ return this.carrierIA5;
+ }
+
+ public TariffType getTariff() {
+
+ return this.tariff;
+ }
+
+ public PriceTypeType getPriceType() {
+ if (this.priceType == null) return PriceTypeType.travelPrice;
+ return this.priceType;
+ }
+
+ public String getInfoText() {
+
+ return this.infoText;
+ }
+
+ public ExtensionData getExtension() {
+
+ return this.extension;
+ }
+
+ public void setTrainNum(Long trainNum) {
+
+ this.trainNum = new Asn1BigInteger(trainNum);
+ }
+
+ public void setTrainIA5(String trainIA5) {
+
+ this.trainIA5 = trainIA5;
+ }
+
+ public void setBeginLoadingDate(Long beginLoadingDate) {
+
+ this.beginLoadingDate = beginLoadingDate;
+ }
+
+ public void setBeginLoadingTime(Long beginLoadingTime) {
+
+ this.beginLoadingTime = beginLoadingTime;
+ }
+
+ public void setEndLoadingTime(Long endLoadingTime) {
+ this.endLoadingTime = endLoadingTime;
+ }
+
+ public void setReferenceIA5(String referenceIA5) {
+
+ this.referenceIA5 = referenceIA5;
+ }
+
+ public void setReferenceNum(Long referenceNum) {
+
+ this.referenceNum = Asn1BigInteger.toAsn1(referenceNum);
+ }
+
+ public void setProductOwnerNum(Long productOwnerNum) {
+
+ this.productOwnerNum = productOwnerNum;
+ }
+
+ public void setProductOwnerIA5(String productOwnerIA5) {
+
+ this.productOwnerIA5 = productOwnerIA5;
+ }
+
+ public void setProductIdNum(Long productIdNum) {
+
+ this.productIdNum = productIdNum;
+ }
+
+ public void setProductIdIA5(String productIdIA5) {
+
+ this.productIdIA5 = productIdIA5;
+ }
+
+ public void setServiceBrand(Long serviceBrand) {
+
+ this.serviceBrand = serviceBrand;
+ }
+
+ public void setServiceBrandAbrUTF8(String serviceBrandAbrUTF8) {
+
+ this.serviceBrandAbrUTF8 = serviceBrandAbrUTF8;
+ }
+
+ public void setServiceBrandNameUTF8(String serviceBrandNameUTF8) {
+
+ this.serviceBrandNameUTF8 = serviceBrandNameUTF8;
+ }
+
+ public void setStationCodeTable(CodeTableType stationCodeTable) {
+
+ this.stationCodeTable = stationCodeTable;
+ }
+
+ public void setFromStationNum(Long fromStationNum) {
+
+ this.fromStationNum = fromStationNum;
+ }
+
+ public void setFromStationIA5(String fromStationIA5) {
+
+ this.fromStationIA5 = fromStationIA5;
+ }
+
+ public void setToStationNum(Long toStationNum) {
+
+ this.toStationNum = toStationNum;
+ }
+
+ public void setToStationIA5(String toStationIA5) {
+
+ this.toStationIA5 = toStationIA5;
+ }
+
+ public void setFromStationNameUTF8(String fromStationNameUTF8) {
+
+ this.fromStationNameUTF8 = fromStationNameUTF8;
+ }
+
+ public void setToStationNameUTF8(String toStationNameUTF8) {
+
+ this.toStationNameUTF8 = toStationNameUTF8;
+ }
+
+ public void setCoach(String coach) {
+
+ this.coach = coach;
+ }
+
+ public void setPlace(String place) {
+
+ this.place = place;
+ }
+
+ public void setCompartmentDetails(CompartmentDetailsType compartmentDetails) {
+
+ this.compartmentDetails = compartmentDetails;
+ }
+
+ public void setNumberPlate(String numberPlate) {
+
+ this.numberPlate = numberPlate;
+ }
+
+ public void setTrailerPlate(String trailerPlate) {
+
+ this.trailerPlate = trailerPlate;
+ }
+
+ public void setCarCategory(Long carCategory) {
+
+ this.carCategory = carCategory;
+ }
+
+ public void setBoatCategory(Long boatCategory) {
+
+ this.boatCategory = boatCategory;
+ }
+
+ public void setTextileRoof(Boolean textileRoof) {
+
+ this.textileRoof = textileRoof;
+ }
+
+ public void setRoofRackType(RoofRackType roofRackType) {
+
+ this.roofRackType = roofRackType;
+ }
+
+ public void setRoofRackHeight(Long roofRackHeight) {
+
+ this.roofRackHeight = roofRackHeight;
+ }
+
+ public void setAttachedBoats(Long attachedBoats) {
+
+ this.attachedBoats = attachedBoats;
+ }
+
+ public void setAttachedBicycles(Long attachedBicycles) {
+
+ this.attachedBicycles = attachedBicycles;
+ }
+
+ public void setAttachedSurfboards(Long attachedSurfboards) {
+
+ this.attachedSurfboards = attachedSurfboards;
+ }
+
+ public void setLoadingListEntry(Long loadingListEntry) {
+
+ this.loadingListEntry = loadingListEntry;
+ }
+
+ public void setLoadingDeck(LoadingDeckType loadingDeck) {
+
+ this.loadingDeck = loadingDeck;
+ }
+
+ public void setCarrierNum(SequenceOfCarrierNum carrierNum) {
+
+ this.carrierNum = carrierNum;
+ }
+
+ public void setCarrierNum(List<Long> longs) {
+ if (longs == null || longs.isEmpty()) return;
+ this.carrierNum = new SequenceOfCarrierNum(longs);
+ }
+
+
+ public void setCarrierIA5(SequenceOfStringIA5 carrierIA5) {
+
+ this.carrierIA5 = carrierIA5;
+ }
+
+ public void setTariff(TariffType tariff) {
+
+ this.tariff = tariff;
+ }
+
+ public void setPriceType(PriceTypeType priceType) {
+
+ this.priceType = priceType;
+ }
+
+ public void setInfoText(String infoText) {
+
+ this.infoText = infoText;
+ }
+
+ public void setExtension(ExtensionData extension) {
+
+ this.extension = extension;
+ }
+
+ public Long getPrice() {
+ return Asn1BigInteger.toLong(price);
+ }
+
+ public void setPrice(Long price) {
+ this.price = Asn1BigInteger.toAsn1(price);
+ }
+
+ public SequenceOfVatDetail getVatDetails() {
+ return vatDetails;
+ }
+
+ public void setVatDetails(SequenceOfVatDetail vatDetails) {
+ this.vatDetails = vatDetails;
+ }
+
+ public void addVatDetail(VatDetailType vatDetail) {
+ if (this.vatDetails == null) {
+ this.vatDetails = new SequenceOfVatDetail();
+ }
+ this.vatDetails.add(vatDetail);
+ }
+
+ public void setLoadingDates (Date beginLoading, Date endLoading, Date issuingDate){
+
+ if (issuingDate == null || beginLoading == null) return;
+
+ this.beginLoadingDate = DateTimeUtils.getDateDifference(issuingDate,beginLoading);
+ this.beginLoadingTime = DateTimeUtils.getTime(beginLoading);
+
+ if (endLoading != null) {
+ this.endLoadingTime = DateTimeUtils.getTime(endLoading);
+ }
+ }
+
+ public Date getBeginLoadingDate(Date issuingDate){
+
+ if (issuingDate == null) return null;
+
+ if (this.beginLoadingDate == null) {
+ this.beginLoadingDate = 0L;
+ }
+
+ return DateTimeUtils.getDate(issuingDate, this.beginLoadingDate, this.beginLoadingTime);
+
+ }
+
+ public Date getEndLoadingDate(Date issuingDate){
+
+ if (issuingDate == null) return null;
+
+ if (this.beginLoadingDate == null) {
+ this.beginLoadingDate = 0L;
+ }
+
+ if (this.endLoadingTime == null) {
+ return null;
+ }
+
+ Date begin = DateTimeUtils.getDate(issuingDate, this.beginLoadingDate, this.beginLoadingTime);
+ Date end = DateTimeUtils.getDate(issuingDate, this.beginLoadingDate, this.endLoadingTime);
+
+ //max one day difference assumed
+ if (end.before(begin)) {
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.setTime(end);
+ cal.add(Calendar.DAY_OF_YEAR,1);
+ return cal.getTime();
+ } else {
+ return end;
+ }
+
+ }
+
+ public Long getLoadingUTCOffset() {
+ return loadingUTCOffset;
+ }
+
+ public void setLoadingUTCOffset(Long loadingUTCOffset) {
+ this.loadingUTCOffset = loadingUTCOffset;
+ }
+
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/CardReferenceType.java b/src/org/uic/ticket/api/asn/omv2/CardReferenceType.java
new file mode 100644
index 0000000..946c560
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/CardReferenceType.java
@@ -0,0 +1,173 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.math.BigInteger;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+
+@Sequence
+@HasExtensionMarker
+public class CardReferenceType extends Object {
+ public CardReferenceType() {
+ }
+
+ @Asn1Optional public Asn1BigInteger cardIssuerNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String cardIssuerIA5;
+
+ @Asn1Optional public Asn1BigInteger cardIdNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String cardIdIA5;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String cardName;
+
+ @Asn1Optional public Asn1BigInteger cardType;
+
+ @Asn1Optional public Asn1BigInteger leadingCardIdNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String leadingCardIdIA5;
+
+ @Asn1Optional public Asn1BigInteger trailingCardIdNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String trailingCardIdIA5;
+
+
+ public Asn1BigInteger getCardIssuerNum() {
+
+ return this.cardIssuerNum;
+ }
+
+ public String getCardIssuerIA5() {
+
+ return this.cardIssuerIA5;
+ }
+
+ public Asn1BigInteger getCardIdNum() {
+
+ return this.cardIdNum;
+ }
+
+ public String getCardIdIA5() {
+
+ return this.cardIdIA5;
+ }
+
+ public String getCardName() {
+
+ return this.cardName;
+ }
+
+ public Asn1BigInteger getCardType() {
+ return this.cardType;
+ }
+
+ public BigInteger getLeadingCardIdNum() {
+ if (leadingCardIdNum != null) {
+ return leadingCardIdNum.toBigInteger();
+ }
+ return null;
+ }
+
+ public String getLeadingCardIdIA5() {
+
+ return this.leadingCardIdIA5;
+ }
+
+ public Long getTrailingCardIdNum() {
+
+ return Asn1BigInteger.toLong(this.trailingCardIdNum);
+ }
+
+ public String getTrailingCardIdIA5() {
+
+ return this.trailingCardIdIA5;
+ }
+
+ public void setCardIssuerNum(Long cardIssuerNum) {
+
+ this.cardIssuerNum = Asn1BigInteger.toAsn1(cardIssuerNum);
+ }
+
+ public void setCardIssuerIA5(String cardIssuerIA5) {
+
+ this.cardIssuerIA5 = cardIssuerIA5;
+ }
+
+ public void setCardIdNum(Asn1BigInteger asn1BigInteger) {
+
+ this.cardIdNum = asn1BigInteger;
+ }
+
+ public void setCardIdNum(Long cardIdNum) {
+
+ this.cardIdNum = new Asn1BigInteger(cardIdNum);
+ }
+
+ public void setCardIdIA5(String cardIdIA5) {
+
+ this.cardIdIA5 = cardIdIA5;
+ }
+
+ public void setCardName(String cardName) {
+
+ this.cardName = cardName;
+ }
+
+ public void setCardType(Long cardType) {
+
+ this.cardType = Asn1BigInteger.toAsn1(cardType);
+ }
+
+ public void setLeadingCardIdNum(Long leadingCardIdNum) {
+
+ this.leadingCardIdNum = Asn1BigInteger.toAsn1(leadingCardIdNum);
+ }
+
+ public void setLeadingCardIdIA5(String leadingCardIdIA5) {
+
+ this.leadingCardIdIA5 = leadingCardIdIA5;
+ }
+
+ public void setTrailingCardIdNum(Long trailingCardIdNum) {
+
+ this.trailingCardIdNum = Asn1BigInteger.toAsn1(trailingCardIdNum);
+ }
+
+ public void setTrailingCardIdIA5(String trailingCardIdIA5) {
+
+ this.trailingCardIdIA5 = trailingCardIdIA5;
+ }
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/CodeTableType.java b/src/org/uic/ticket/api/asn/omv2/CodeTableType.java
new file mode 100644
index 0000000..b35221c
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/CodeTableType.java
@@ -0,0 +1,40 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+
+public enum CodeTableType {
+ stationUIC("stationUIC"),
+ stationUICReservation("stationUICReservation"),
+ stationERA("stationERA"),
+ localCarrierStationCodeTable("localCarrierStationCodeTable"),
+ proprietaryIssuerStationCodeTable("proprietaryIssuerStationCodeTable");
+
+ public String text;
+
+ CodeTableType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/CompartmentDetailsType.java b/src/org/uic/ticket/api/asn/omv2/CompartmentDetailsType.java
new file mode 100644
index 0000000..352c2e5
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/CompartmentDetailsType.java
@@ -0,0 +1,129 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1Default;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+
+@Sequence
+@HasExtensionMarker
+public class CompartmentDetailsType extends Object {
+ public CompartmentDetailsType() {
+ }
+
+ @IntRange(minValue=1,maxValue=99)
+ @Asn1Optional public Long coachType;
+
+ @IntRange(minValue=1,maxValue=99)
+ @Asn1Optional public Long compartmentType;
+
+ @IntRange(minValue=1,maxValue=99)
+ @Asn1Optional public Long specialAllocation;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String coachTypeDescr;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String compartmentTypeDescr;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String specialAllocationDescr;
+
+ @Asn1Default(value="unspecified")
+ public CompartmentPositionType position;
+
+ public Long getCoachType() {
+
+ return this.coachType;
+ }
+
+ public Long getCompartmentType() {
+
+ return this.compartmentType;
+ }
+
+ public Long getSpecialAllocation() {
+
+ return this.specialAllocation;
+ }
+
+ public String getCoachTypeDescr() {
+
+ return this.coachTypeDescr;
+ }
+
+ public String getCompartmentTypeDescr() {
+
+ return this.compartmentTypeDescr;
+ }
+
+ public String getSpecialAllocationDescr() {
+
+ return this.specialAllocationDescr;
+ }
+
+ public CompartmentPositionType getPosition() {
+ if (position == null) return CompartmentPositionType.unspecified;
+ return this.position;
+ }
+
+ public void setCoachType(Long coachType) {
+ this.coachType = coachType;
+ }
+
+ public void setCompartmentType(Long compartmentType) {
+
+ this.compartmentType = compartmentType;
+ }
+
+ public void setSpecialAllocation(Long specialAllocation) {
+
+ this.specialAllocation = specialAllocation;
+ }
+
+ public void setCoachTypeDescr(String coachTypeDescr) {
+
+ this.coachTypeDescr = coachTypeDescr;
+ }
+
+ public void setCompartmentTypeDescr(String compartmentTypeDescr) {
+
+ this.compartmentTypeDescr = compartmentTypeDescr;
+ }
+
+ public void setSpecialAllocationDescr(String specialAllocationDescr) {
+
+ this.specialAllocationDescr = specialAllocationDescr;
+ }
+
+ public void setPosition(CompartmentPositionType position) {
+
+ this.position = position;
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/CompartmentGenderType.java b/src/org/uic/ticket/api/asn/omv2/CompartmentGenderType.java
new file mode 100644
index 0000000..32e88cb
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/CompartmentGenderType.java
@@ -0,0 +1,42 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+
+@HasExtensionMarker
+public enum CompartmentGenderType {
+ unspecified("unspecified"),
+ family("family"),
+ female("female"),
+ male("male"),
+ mixed("mixed");
+
+ public String text;
+
+ CompartmentGenderType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+
+} \ No newline at end of file
diff --git a/src/org/uic/ticket/api/asn/omv2/CompartmentPositionType.java b/src/org/uic/ticket/api/asn/omv2/CompartmentPositionType.java
new file mode 100644
index 0000000..b52bdaf
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/CompartmentPositionType.java
@@ -0,0 +1,38 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+
+public enum CompartmentPositionType {
+ unspecified("unspecified"),
+ upperLevel("upperLevel"),
+ lowerLevel("lowerLevel");
+
+ public String text;
+
+ CompartmentPositionType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/ConfirmationTypeType.java b/src/org/uic/ticket/api/asn/omv2/ConfirmationTypeType.java
new file mode 100644
index 0000000..d866496
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/ConfirmationTypeType.java
@@ -0,0 +1,42 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+
+@HasExtensionMarker
+public enum ConfirmationTypeType {
+ trainDelayConfirmation ("trainDelayConfirmation"),
+ travelerDelayConfirmation ("travelerDelayConfirmation"),
+ trainLinkedTicketDelay ("trainLinkedTicketDelay");
+
+
+
+ public String text;
+
+ ConfirmationTypeType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/ControlData.java b/src/org/uic/ticket/api/asn/omv2/ControlData.java
new file mode 100644
index 0000000..5645f62
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/ControlData.java
@@ -0,0 +1,188 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+
+
+@Sequence
+@HasExtensionMarker
+public class ControlData extends Object {
+ public ControlData() {
+ }
+
+ @Asn1Optional public SequenceOfCardReferenceType identificationByCardReference;
+
+ public Boolean identificationByIdCard = false;
+
+ public Boolean identificationByPassportId = false;
+
+ @Asn1Optional public Asn1BigInteger identificationItem;
+
+ public Boolean passportValidationRequired = false;
+
+ public Boolean onlineValidationRequired = false;
+
+ @IntRange(minValue=0,maxValue=99)
+ @Asn1Optional public Long randomDetailedValidationRequired;
+
+ public Boolean ageCheckRequired = false;
+
+ public Boolean reductionCardCheckRequired = false;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String infoText;
+
+ @Asn1Optional public SequenceOfTicketLinkType includedTickets;
+
+ @Asn1Optional public ExtensionData extension;
+
+
+
+
+ public SequenceOfCardReferenceType getIdentificationByCardReference() {
+
+ return this.identificationByCardReference;
+ }
+
+ public Boolean getIdentificationByIdCard() {
+
+ return this.identificationByIdCard;
+ }
+
+ public Boolean getIdentificationByPassportId() {
+
+ return this.identificationByPassportId;
+ }
+
+ public Long getIdentificationItem() {
+
+ return Asn1BigInteger.toLong(this.identificationItem);
+ }
+
+ public Boolean getPassportValidationRequired() {
+
+ return this.passportValidationRequired;
+ }
+
+ public Boolean getOnlineValidationRequired() {
+
+ return this.onlineValidationRequired;
+ }
+
+ public Long getRandomDetailedValidationRequired() {
+
+ return this.randomDetailedValidationRequired;
+ }
+
+ public Boolean getAgeCheckRequired() {
+
+ return this.ageCheckRequired;
+ }
+
+ public Boolean getReductionCardCheckRequired() {
+
+ return this.reductionCardCheckRequired;
+ }
+
+ public String getInfoText() {
+
+ return this.infoText;
+ }
+
+ public SequenceOfTicketLinkType getIncludedTickets() {
+
+ return this.includedTickets;
+ }
+
+ public ExtensionData getExtension() {
+
+ return this.extension;
+ }
+
+ public void setIdentificationByCardReference(SequenceOfCardReferenceType identificationByCardReference) {
+
+ this.identificationByCardReference = identificationByCardReference;
+ }
+
+ public void setIdentificationByIdCard(Boolean identificationByIdCard) {
+
+ this.identificationByIdCard = identificationByIdCard;
+ }
+
+ public void setIdentificationByPassportId(Boolean identificationByPassportId) {
+
+ this.identificationByPassportId = identificationByPassportId;
+ }
+
+ public void setIdentificationItem(Long identificationItem) {
+
+ this.identificationItem = Asn1BigInteger.toAsn1(identificationItem);
+ }
+
+ public void setPassportValidationRequired(Boolean passportValidationRequired) {
+
+ this.passportValidationRequired = passportValidationRequired;
+ }
+
+ public void setOnlineValidationRequired(Boolean onlineValidationRequired) {
+
+ this.onlineValidationRequired = onlineValidationRequired;
+ }
+
+ public void setRandomDetailedValidationRequired(Long randomDetailedValidationRequired) {
+ this.randomDetailedValidationRequired = randomDetailedValidationRequired;
+ }
+
+ public void setAgeCheckRequired(Boolean ageCheckRequired) {
+ this.ageCheckRequired = ageCheckRequired;
+ }
+
+ public void setReductionCardCheckRequired(Boolean reductionCardCheckRequired) {
+
+ this.reductionCardCheckRequired = reductionCardCheckRequired;
+ }
+
+ public void setInfoText(String infoText) {
+
+ this.infoText = infoText;
+ }
+
+ public void setIncludedTickets(SequenceOfTicketLinkType includedTickets) {
+
+ this.includedTickets = includedTickets;
+ }
+
+ public void setExtension(ExtensionData extension) {
+
+ this.extension = extension;
+ }
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/CountermarkData.java b/src/org/uic/ticket/api/asn/omv2/CountermarkData.java
new file mode 100644
index 0000000..1e09c70
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/CountermarkData.java
@@ -0,0 +1,545 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Date;
+import java.util.List;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Default;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+
+import net.gcdc.asn1.datatypesimpl.SequenceOfStringIA5;
+
+@Sequence
+@HasExtensionMarker
+public class CountermarkData extends Object {
+ public CountermarkData() {
+ }
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String referenceIA5;
+
+ @Asn1Optional public Asn1BigInteger referenceNum;
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long productOwnerNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productOwnerIA5;
+
+ @IntRange(minValue=0,maxValue=65535)
+ @Asn1Optional public Long productIdNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productIdIA5;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String ticketReferenceIA5;
+
+ @Asn1Optional public Asn1BigInteger ticketReferenceNum;
+
+ @IntRange(minValue=1,maxValue=200)
+ @Asn1Optional public Long numberOfCountermark;
+
+ @IntRange(minValue=1,maxValue=200)
+ @Asn1Optional public Long totalOfCountermarks;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String groupName;
+
+ @Asn1Default("stationUIC")
+ @Asn1Optional public CodeTableType stationCodeTable;
+
+ @IntRange(minValue=1,maxValue=9999999)
+ @Asn1Optional public Long fromStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String fromStationIA5;
+
+ @IntRange(minValue=1,maxValue=9999999)
+ @Asn1Optional public Long toStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String toStationIA5;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String fromStationNameUTF8;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String toStationNameUTF8;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String validRegionDesc;
+
+ @Asn1Optional public SequenceOfRegionalValidityType validRegion;
+
+ public Boolean returnIncluded = false;
+
+ @Asn1Optional public ReturnRouteDescriptionType returnDescription;
+
+ @IntRange(minValue=-1,maxValue=700)
+ @Asn1Optional public Long validFromDay;
+
+ @IntRange(minValue=0,maxValue=1439)
+ @Asn1Optional public Long validFromTime;
+
+ @IntRange(minValue=-60, maxValue=60)
+ @Asn1Optional public Long validFromUTCOffset;
+
+ @IntRange(minValue=0,maxValue=370)
+ @Asn1Optional public Long validUntilDay;
+
+ @IntRange(minValue=0,maxValue=1439)
+ @Asn1Optional public Long validUntilTime;
+
+ @IntRange(minValue=-60, maxValue=60)
+ @Asn1Optional public Long validUntilUTCOffset;
+
+ @Asn1Default(value="second")
+ @Asn1Optional public TravelClassType classCode;
+
+ @Asn1Optional public SequenceOfCarrierNum carrierNum;
+
+ @Asn1Optional public SequenceOfStringIA5 carrierIA5;
+
+ @Asn1Optional public SequenceOfServiceBrands includedServiceBrands;
+
+ @Asn1Optional public SequenceOfServiceBrands excludedServiceBrands;
+
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String infoText;
+
+ @Asn1Optional public ExtensionData extension;
+
+
+
+
+
+ public String getReferenceIA5() {
+
+ return this.referenceIA5;
+ }
+
+ public Long getReferenceNum() {
+
+ return Asn1BigInteger.toLong(this.referenceNum);
+ }
+
+ public Long getProductOwnerNum() {
+
+ return this.productOwnerNum;
+ }
+
+ public String getProductOwnerIA5() {
+
+ return this.productOwnerIA5;
+ }
+
+ public Long getProductIdNum() {
+
+ return this.productIdNum;
+ }
+
+ public String getProductIdIA5() {
+
+ return this.productIdIA5;
+ }
+
+ public String getTicketReferenceIA5() {
+
+ return this.ticketReferenceIA5;
+ }
+
+ public Long getTicketReferenceNum() {
+
+ return Asn1BigInteger.toLong(this.ticketReferenceNum);
+ }
+
+ public Long getNumberOfCountermark() {
+
+ return this.numberOfCountermark;
+ }
+
+ public Long getTotalOfCountermarks() {
+
+ return this.totalOfCountermarks;
+ }
+
+ public String getGroupName() {
+
+ return this.groupName;
+ }
+
+ public CodeTableType getStationCodeTable() {
+
+ if (stationCodeTable == null) {
+ return CodeTableType.stationUIC;
+ }
+
+ return this.stationCodeTable;
+ }
+
+ public Long getFromStationNum() {
+
+ return this.fromStationNum;
+ }
+
+ public String getFromStationIA5() {
+
+ return this.fromStationIA5;
+ }
+
+ public Long getToStationNum() {
+
+ return this.toStationNum;
+ }
+
+ public String getToStationIA5() {
+
+ return this.toStationIA5;
+ }
+
+ public String getFromStationNameUTF8() {
+
+ return this.fromStationNameUTF8;
+ }
+
+ public String getToStationNameUTF8() {
+
+ return this.toStationNameUTF8;
+ }
+
+ public String getValidRegionDesc() {
+
+ return this.validRegionDesc;
+ }
+
+ public SequenceOfRegionalValidityType getValidRegion() {
+
+ return this.validRegion;
+ }
+
+ public Boolean getReturnIncluded() {
+
+ return this.returnIncluded;
+ }
+
+ public ReturnRouteDescriptionType getReturnDescription() {
+
+ return this.returnDescription;
+ }
+
+ public Long getValidFromDay() {
+
+ return this.validFromDay;
+ }
+
+ public Long getValidFromTime() {
+
+ return this.validFromTime;
+ }
+
+ public Long getValidUntilDay() {
+
+ return this.validUntilDay;
+ }
+
+ public Long getValidUntilTime() {
+
+ return this.validUntilTime;
+ }
+
+ public TravelClassType getClassCode() {
+
+ if (classCode == null){
+ return TravelClassType.second;
+ }
+
+ return this.classCode;
+ }
+
+ public SequenceOfCarrierNum getCarriersNum() {
+
+ return this.carrierNum;
+ }
+
+ public SequenceOfStringIA5 getCarriersIA5() {
+
+ return this.carrierIA5;
+ }
+
+ public SequenceOfServiceBrands getIncludedServiceBrands() {
+
+ return this.includedServiceBrands;
+ }
+
+ public SequenceOfServiceBrands getExcludedServiceBrands() {
+
+ return this.excludedServiceBrands;
+ }
+
+ public String getInfoText() {
+
+ return this.infoText;
+ }
+
+ public ExtensionData getExtension() {
+
+ return this.extension;
+ }
+
+ public void setReferenceIA5(String referenceIA5) {
+
+ this.referenceIA5 = referenceIA5;
+ }
+
+ public void setReferenceNum(Long referenceNum) {
+
+ this.referenceNum = Asn1BigInteger.toAsn1(referenceNum);
+ }
+
+ public void setProductOwnerNum(Long productOwnerNum) {
+
+ this.productOwnerNum = productOwnerNum;
+ }
+
+ public void setProductOwnerIA5(String productOwnerIA5) {
+
+ this.productOwnerIA5 = productOwnerIA5;
+ }
+
+ public void setProductIdNum(Long productIdNum) {
+
+ this.productIdNum = productIdNum;
+ }
+
+ public void setProductIdIA5(String productIdIA5) {
+
+ this.productIdIA5 = productIdIA5;
+ }
+
+ public void setTicketReferenceIA5(String ticketReferenceIA5) {
+
+ this.ticketReferenceIA5 = ticketReferenceIA5;
+ }
+
+ public void setTicketReferenceNum(Long ticketReferenceNum) {
+
+ this.ticketReferenceNum = Asn1BigInteger.toAsn1(ticketReferenceNum);
+ }
+
+ public void setNumberOfCountermark(Long numberOfCountermark) {
+
+ this.numberOfCountermark = numberOfCountermark;
+ }
+
+ public void setTotalOfCountermarks(Long totalOfCountermarks) {
+
+ this.totalOfCountermarks = totalOfCountermarks;
+ }
+
+ public void setGroupName(String groupName) {
+
+ this.groupName = groupName;
+ }
+
+ public void setStationCodeTable(CodeTableType stationCodeTable) {
+
+ this.stationCodeTable = stationCodeTable;
+ }
+
+ public void setFromStationNum(Long fromStationNum) {
+
+ this.fromStationNum = fromStationNum;
+ }
+
+ public void setFromStationIA5(String fromStationIA5) {
+
+ this.fromStationIA5 = fromStationIA5;
+ }
+
+ public void setToStationNum(Long toStationNum) {
+
+ this.toStationNum = toStationNum;
+ }
+
+ public void setToStationIA5(String toStationIA5) {
+
+ this.toStationIA5 = toStationIA5;
+ }
+
+ public void setFromStationNameUTF8(String fromStationNameUTF8) {
+
+ this.fromStationNameUTF8 = fromStationNameUTF8;
+ }
+
+ public void setToStationNameUTF8(String toStationNameUTF8) {
+
+ this.toStationNameUTF8 = toStationNameUTF8;
+ }
+
+ public void setValidRegionDesc(String validRegionDesc) {
+
+ this.validRegionDesc = validRegionDesc;
+ }
+
+ public void setValidRegion(SequenceOfRegionalValidityType validRegion) {
+
+ this.validRegion = validRegion;
+ }
+
+ public void setReturnIncluded(Boolean returnIncluded) {
+
+ this.returnIncluded = returnIncluded;
+ }
+
+ public void setReturnDescription(ReturnRouteDescriptionType returnDescription) {
+
+ this.returnDescription = returnDescription;
+ }
+
+ public void setValidFromDay(Long validFromDay) {
+
+ this.validFromDay = validFromDay;
+ }
+
+ public void setValidFromTime(Long validFromTime) {
+
+ this.validFromTime = validFromTime;
+ }
+
+ public void setValidUntilDay(Long validUntilDay) {
+
+ this.validUntilDay = validUntilDay;
+ }
+
+ public void setValidUntilTime(Long validUntilTime) {
+
+ this.validUntilTime = validUntilTime;
+ }
+
+ public void setClassCode(TravelClassType classCode) {
+
+ this.classCode = classCode;
+ }
+
+ public void setCarriersNum(SequenceOfCarrierNum carrierNum) {
+
+ this.carrierNum = carrierNum;
+ }
+
+ public void setCarriersNum(List<Long> longs) {
+ if (longs == null) return;
+
+ this.carrierNum = new SequenceOfCarrierNum();
+ this.carrierNum.addAll(longs);
+ }
+
+ public void setCarriersIA5(SequenceOfStringIA5 carrierIA5) {
+
+ this.carrierIA5 = carrierIA5;
+ }
+
+ public void setIncludedServiceBrands(SequenceOfServiceBrands includedServiceBrands) {
+
+ this.includedServiceBrands = includedServiceBrands;
+ }
+
+ public void setExcludedServiceBrands(SequenceOfServiceBrands excludedServiceBrands) {
+
+ this.excludedServiceBrands = excludedServiceBrands;
+ }
+
+ public void setInfoText(String infoText) {
+
+ this.infoText = infoText;
+ }
+
+ public void setExtension(ExtensionData extension) {
+
+ this.extension = extension;
+ }
+
+
+ public void setValidityDates (Date fromDate, Date untilDate, Date issuingDate){
+
+ if (issuingDate == null || fromDate == null) return;
+
+ this.validFromDay = DateTimeUtils.getDateDifference(issuingDate,fromDate);
+ this.validFromTime = DateTimeUtils.getTime(fromDate);
+
+ if (untilDate != null){
+ this.validUntilDay = DateTimeUtils.getDateDifference(fromDate, untilDate);
+ this.validUntilTime = DateTimeUtils.getTime(untilDate);
+ }
+
+ }
+
+ public Date getValidFromDate(Date issuingDate){
+
+ return DateTimeUtils.getDate(issuingDate, this.validFromDay, this.validFromTime);
+
+ }
+
+ public Date getValidUntilDate(Date issuingDate){
+
+ if (issuingDate == null) return null;
+
+ if (this.validFromDay == null) {
+ this.validFromDay = 0L;
+ }
+
+ if (this.validUntilDay == null) {
+ return null;
+ }
+
+
+ return DateTimeUtils.getDate(issuingDate, this.validFromDay + this.validUntilDay, this.validUntilTime);
+
+ }
+
+ public Long getValidFromUTCOffset() {
+ return validFromUTCOffset;
+ }
+
+ public void setValidFromUTCOffset(Long validFromUTCOffset) {
+ this.validFromUTCOffset = validFromUTCOffset;
+ }
+
+ public Long getValidUntilUTCOffset() {
+ return validUntilUTCOffset;
+ }
+
+ public void setValidUntilUTCOffset(Long validUntilUTCOffset) {
+ this.validUntilUTCOffset = validUntilUTCOffset;
+ }
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/CustomerCardData.java b/src/org/uic/ticket/api/asn/omv2/CustomerCardData.java
new file mode 100644
index 0000000..336799b
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/CustomerCardData.java
@@ -0,0 +1,286 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+
+import net.gcdc.asn1.datatypesimpl.SequenceOfUnrestrictedLong;
+
+@Sequence
+@HasExtensionMarker
+public class CustomerCardData extends Object {
+ public CustomerCardData() {
+ }
+
+ @Asn1Optional public TravelerType customer;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String cardIdIA5;
+
+ @Asn1Optional public Asn1BigInteger cardIdNum;
+
+
+ @IntRange(minValue=2016,maxValue=2269)
+ @Asn1Optional public Long validFromYear;
+
+ @IntRange(minValue=0,maxValue=700)
+ @Asn1Optional public Long validFromDay;
+
+ @IntRange(minValue=0,maxValue=250)
+ @Asn1Optional public Long validUntilYear;
+
+ @IntRange(minValue=0,maxValue=370)
+ @Asn1Optional public Long validUntilDay;
+
+
+ @Asn1Optional public TravelClassType classCode;
+
+ @IntRange(minValue=0,maxValue=1000)
+ @Asn1Optional public Long cardType;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String cardTypeDescr;
+
+ @Asn1Optional public Asn1BigInteger customerStatus;
+
+ @Asn1Optional public String customerStatusDescr;
+
+ @Asn1Optional public SequenceOfUnrestrictedLong includedServices;
+
+ @Asn1Optional public ExtensionData extension;
+
+
+
+
+ public TravelerType getCustomer() {
+
+ return this.customer;
+ }
+
+ public String getCardIdIA5() {
+
+ return this.cardIdIA5;
+ }
+
+ public Asn1BigInteger getCardIdNum() {
+
+ return this.cardIdNum;
+ }
+
+ public Long getValidFromYear() {
+
+ return this.validFromYear;
+ }
+
+ public Long getValidFromDay() {
+
+ return this.validFromDay;
+ }
+
+ public Long getValidUntilYear() {
+
+ return this.validUntilYear;
+ }
+
+ public Long getValidUntilDay() {
+
+ return this.validUntilDay;
+ }
+
+ public TravelClassType getClassCode() {
+
+ return this.classCode;
+ }
+
+ public Long getCardType() {
+
+ return this.cardType;
+ }
+
+ public String getCardTypeDescr() {
+
+ return this.cardTypeDescr;
+ }
+
+ public Long getCustomerStatus() {
+
+ return Asn1BigInteger.toLong(this.customerStatus);
+ }
+
+ public String getCustomerStatusDescr() {
+
+ return this.customerStatusDescr;
+ }
+
+ public SequenceOfUnrestrictedLong getIncludedServices() {
+
+ return this.includedServices;
+ }
+
+ public ExtensionData getExtension() {
+
+ return this.extension;
+ }
+
+ public void setCustomer(TravelerType customer) {
+
+ this.customer = customer;
+ }
+
+ public void setCardIdIA5(String cardIdIA5) {
+
+ this.cardIdIA5 = cardIdIA5;
+ }
+
+ public void setCardIdNum(Asn1BigInteger cardIdNum) {
+
+ this.cardIdNum = cardIdNum;
+ }
+
+ public void setCardIdNum(Long cardIdNum) {
+
+ this.cardIdNum = new Asn1BigInteger(cardIdNum);
+ }
+
+ public void setValidFromYear(Long validFromYear) {
+
+ this.validFromYear = validFromYear;
+ }
+
+ public void setValidFromDay(Long validFromDay) {
+
+ this.validFromDay = validFromDay;
+ }
+
+ public void setValidUntilYear(Long validUntilYear) {
+
+ this.validUntilYear = validUntilYear;
+ }
+
+ public void setValidUntilDay(Long validUntilDay) {
+
+ this.validUntilDay = validUntilDay;
+ }
+
+ public void setClassCode(TravelClassType classCode) {
+
+ this.classCode = classCode;
+ }
+
+ public void setCardType(Long cardType) {
+
+ this.cardType = cardType;
+ }
+
+ public void setCardTypeDescr(String cardTypeDescr) {
+
+ this.cardTypeDescr = cardTypeDescr;
+ }
+
+ public void setCustomerStatus(Long customerStatus) {
+
+ this.customerStatus = Asn1BigInteger.toAsn1(customerStatus);
+ }
+
+ public void setCustomerStatusDescr(String customerStatusDescr) {
+
+ this.customerStatusDescr = customerStatusDescr;
+ }
+
+ public void setIncludedServices(SequenceOfUnrestrictedLong includedServices) {
+
+ this.includedServices = includedServices;
+ }
+
+ public void setExtension(ExtensionData extension) {
+
+ this.extension = extension;
+ }
+
+ public void setValidity (Date fromDate , Date untilDate){
+
+ Calendar fromCal = Calendar.getInstance();
+ fromCal.clear();
+ fromCal.setTime(fromDate);
+
+ this.validFromYear = new Long( fromCal.get(Calendar.YEAR));
+ this.validFromDay = new Long (fromCal.get(Calendar.DAY_OF_YEAR));
+
+ if (untilDate == null) return;
+
+ Calendar untilCal = Calendar.getInstance();
+ untilCal.clear();
+ untilCal.setTime(untilDate);
+
+ int untildays = untilCal.get(Calendar.DAY_OF_YEAR);
+
+ int yearDiff = untilCal.get(Calendar.YEAR) - fromCal.get(Calendar.YEAR);
+
+ this.validUntilYear = new Long( yearDiff);
+ this.validUntilDay = new Long (untildays);
+
+ }
+
+ public Date getValidFromDate (){
+
+ if (this.validFromYear == null || this.validFromYear == 0) return null;
+
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.setTimeZone(TimeZone.getTimeZone("UTC"));
+ cal.set(Calendar.YEAR, this.validFromYear.intValue());
+ cal.set(Calendar.DAY_OF_YEAR, this.validFromDay.intValue());
+
+ return cal.getTime();
+
+ }
+
+
+ public Date getValidUntilDate (){
+
+ if (this.validUntilYear == null || this.validUntilYear == 0) return null;
+
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.setTimeZone(TimeZone.getTimeZone("UTC"));
+ cal.set(Calendar.YEAR, this.validFromYear.intValue());
+ if (this.validUntilYear != null) {
+ cal.add(Calendar.YEAR, this.validUntilYear.intValue());
+ }
+ cal.set(Calendar.DAY_OF_YEAR, this.validUntilDay.intValue());
+
+ return cal.getTime();
+
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/CustomerStatusType.java b/src/org/uic/ticket/api/asn/omv2/CustomerStatusType.java
new file mode 100644
index 0000000..e53a00a
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/CustomerStatusType.java
@@ -0,0 +1,89 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+
+
+@Sequence
+public class CustomerStatusType extends Object {
+ public CustomerStatusType() {
+ }
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long statusProviderNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String statusProviderIA5;
+
+ @Asn1Optional public Asn1BigInteger customerStatus;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String customerStatusDescr;
+
+ public Long getStatusProviderNum() {
+
+ return this.statusProviderNum;
+ }
+
+ public String getStatusProviderIA5() {
+
+ return this.statusProviderIA5;
+ }
+
+ public Long getCustomerStatus() {
+
+ return Asn1BigInteger.toLong(this.customerStatus);
+ }
+
+ public String getCustomerStatusDescr() {
+
+ return this.customerStatusDescr;
+ }
+
+ public void setStatusProviderNum(Long statusProviderNum) {
+
+ this.statusProviderNum = statusProviderNum;
+ }
+
+ public void setStatusProviderIA5(String statusProviderIA5) {
+
+ this.statusProviderIA5 = statusProviderIA5;
+ }
+
+ public void setCustomerStatus(Long customerStatus) {
+
+ this.customerStatus = Asn1BigInteger.toAsn1(customerStatus);
+ }
+
+ public void setCustomerStatusDescr(String customerStatusDescr) {
+
+ this.customerStatusDescr = customerStatusDescr;
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/DateTimeUtils.java b/src/org/uic/ticket/api/asn/omv2/DateTimeUtils.java
new file mode 100644
index 0000000..005e27d
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/DateTimeUtils.java
@@ -0,0 +1,198 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
+
+public class DateTimeUtils {
+
+ public static Long getDateDifference(Date issuingDate, Date localDate) {
+
+ if (issuingDate == null || localDate == null) return null;
+
+ Calendar issuingCal = Calendar.getInstance();
+ issuingCal.clear();
+ issuingCal.setTime(issuingDate);
+ issuingCal.setTimeZone(TimeZone.getTimeZone("UTC"));
+ issuingCal.set(Calendar.HOUR_OF_DAY, 0);
+ issuingCal.set(Calendar.MINUTE, 0);
+ issuingCal.set(Calendar.SECOND, 0);
+ issuingCal.set(Calendar.MILLISECOND, 0);
+
+ Calendar fromCal = Calendar.getInstance();
+ fromCal.clear();
+ fromCal.setTime(localDate);
+ fromCal.setTimeZone(TimeZone.getTimeZone("UTC"));
+ fromCal.set(Calendar.HOUR_OF_DAY, 0);
+ fromCal.set(Calendar.MINUTE, 0);
+ fromCal.set(Calendar.SECOND, 0);
+ fromCal.set(Calendar.MILLISECOND, 0);
+
+ long diff = localDate.getTime() - issuingDate.getTime();
+ long dayDiff = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
+
+ return new Long(dayDiff);
+
+ }
+
+ public static Date getLocalDateFromDifference(Date issuingDate, int diff , Long time ) {
+
+ if (issuingDate == null) return null;
+
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.setTime(issuingDate);
+ cal.add(Calendar.DAY_OF_YEAR, diff);
+
+ if (time != null) {
+ int hours = time.intValue() / 60;
+ int minutes = time.intValue() - hours * 60;
+ cal.set(Calendar.HOUR_OF_DAY, hours);
+ cal.set(Calendar.MINUTE,minutes);
+ }
+
+ return cal.getTime();
+
+ }
+
+
+ public static void setTime(Calendar cal, Long time){
+
+ if (time != null) {
+ int hours = time.intValue() / 60;
+ int minutes = time.intValue() - hours * 60;
+ cal.set(Calendar.HOUR_OF_DAY, hours);
+ cal.set(Calendar.MINUTE,minutes);
+ }
+
+
+ }
+
+ public static Long getTime (Calendar cal) {
+
+ if (cal == null ||
+ !cal.isSet(Calendar.HOUR_OF_DAY) ||
+ !cal.isSet(Calendar.MINUTE) ) {
+ return null;
+ }
+
+ int time = cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
+ if (time > 0) {
+ return new Long (time );
+ }
+ return null;
+ }
+
+ public static Long getTime (Date date) {
+
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.setTime(date);
+
+ if (cal == null ||
+ !cal.isSet(Calendar.HOUR_OF_DAY) ||
+ !cal.isSet(Calendar.MINUTE) ) {
+ return null;
+ }
+
+ int time = cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
+ if (time > 0) {
+ return new Long (time );
+ }
+ return null;
+ }
+
+ public static Date getDate(Date issuingDate, Long date, Long time){
+
+ if (issuingDate == null) return null;
+
+ if (date == null) {
+ date = 0L;
+ }
+
+ Calendar issuingCal = Calendar.getInstance();
+ issuingCal.clear();
+ issuingCal.setTime(issuingDate);
+
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.set(Calendar.YEAR,issuingCal.get(Calendar.YEAR) );
+ cal.set(Calendar.DAY_OF_YEAR,issuingCal.get(Calendar.DAY_OF_YEAR) );
+
+ cal.add(Calendar.DAY_OF_YEAR, date.intValue());
+
+ DateTimeUtils.setTime(cal,time);
+
+ return cal.getTime();
+
+ }
+
+
+
+ /**
+ * Gets the UTC offset.
+ *
+ * @param date and time of the issuing date
+ * @param date and time of the departure
+ * @return the UTC offset in multiples of 15 minutes
+ * the offset needs to be added to local time to get the UTC time (UTC = local + offset)
+ */
+ public static Long getUTCoffset(Date local) {
+
+
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.setTime(local);
+
+ /*
+ * Returns the amount of time in milliseconds to add to UTC to get standard time in this
+ * time zone. Because this value is not affected by daylight saving time, it is called raw offset.
+ * If an underlying TimeZone implementation subclass supports historical GMT offset changes, the method
+ * returns the raw offset value of the current date. In Honolulu, for example, its raw offset
+ * changed from GMT-10:30 to GMT-10:00 in 1947, and this method
+ * always returns -36000000 milliseconds (i.e., -10 hours).
+ */
+ int minuteOffset = - cal.getTimeZone().getRawOffset()/ ( 1000 * 60 * 15 );
+
+ return new Long (minuteOffset);
+
+ }
+
+ public static Date getUTCDate(Date issuingDate, Long date, Long time, Long UTCOffset) {
+
+ if (issuingDate == null) return null;
+
+ if (UTCOffset == null) return null;
+
+ if (time == null) return null;
+
+ if (date == null) {
+ date = 0L;
+ }
+
+ Calendar issuingCal = Calendar.getInstance();
+ issuingCal.clear();
+ issuingCal.setTime(issuingDate);
+
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.set(Calendar.YEAR,issuingCal.get(Calendar.YEAR) );
+ cal.set(Calendar.DAY_OF_YEAR,issuingCal.get(Calendar.DAY_OF_YEAR) );
+ cal.add(Calendar.DAY_OF_YEAR, date.intValue());
+
+ int hours = time.intValue() / 60;
+ int minutes = time.intValue() - hours * 60;
+ cal.set(Calendar.HOUR_OF_DAY, hours);
+ cal.set(Calendar.MINUTE,minutes);
+
+ cal.add(Calendar.MINUTE, (int) (UTCOffset * 15) );
+
+ cal.setTimeZone(TimeZone.getTimeZone("UTC"));
+
+ return cal.getTime();
+
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/DelayConfirmation.java b/src/org/uic/ticket/api/asn/omv2/DelayConfirmation.java
new file mode 100644
index 0000000..8eb95b7
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/DelayConfirmation.java
@@ -0,0 +1,321 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.TimeZone;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Default;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+
+@Sequence
+@HasExtensionMarker
+public class DelayConfirmation extends Object {
+ public DelayConfirmation() {
+ }
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String referenceIA5;
+
+ @Asn1Optional public Asn1BigInteger referenceNum;
+
+ @Asn1Optional public Asn1BigInteger trainNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String trainIA5;
+
+ @IntRange(minValue=2016, maxValue=2269)
+ @Asn1Optional public Long plannedArrivalYear;
+
+ @IntRange(minValue=1, maxValue=366)
+ @Asn1Optional public Long plannedArrivalDay;
+
+ @IntRange(minValue=0, maxValue=1439)
+ @Asn1Optional public Long plannedArrivalTime;
+
+ @IntRange(minValue=-60, maxValue=60)
+ @Asn1Optional public Long departureUTCOffset;
+
+ @Asn1Default(value="stationUIC")
+ @Asn1Optional public CodeTableType stationCodeTable;
+
+ @IntRange(minValue=1, maxValue=9999999)
+ @Asn1Optional public Long stationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String stationIA5;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String stationNameUTF8;
+
+ @IntRange(minValue=0, maxValue=999, hasExtensionMarker=false)
+ @Asn1Optional public Long delay;
+
+ @Asn1Optional public Boolean trainCancelled = false;
+
+ @Asn1Default(value="travelerDelayConfirmation")
+ @Asn1Optional public ConfirmationTypeType confirmationType;
+
+ @Asn1Optional public SequenceOfTicketLinkType affectedTickets;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String infoText;
+
+ @Asn1Optional public ExtensionData extension;
+
+
+
+ public String getReferenceIA5() {
+
+ return this.referenceIA5;
+ }
+
+ public Asn1BigInteger getReferenceNum() {
+
+ return this.referenceNum;
+ }
+
+ public Long getTrainNum() {
+
+ return Asn1BigInteger.toLong(this.trainNum);
+ }
+
+ public String getTrainIA5() {
+
+ return this.trainIA5;
+ }
+
+ public Long getPlannedArrivalYear() {
+
+ return this.plannedArrivalYear;
+ }
+
+ public Long getPlannedArrivalDay() {
+
+ return this.plannedArrivalDay;
+ }
+
+ public Long getPlannedArrivalTime() {
+
+ return this.plannedArrivalTime;
+ }
+
+ public CodeTableType getStationCodeTable() {
+
+ if (stationCodeTable == null){
+ return CodeTableType.stationUIC;
+ }
+ return this.stationCodeTable;
+ }
+
+ public Long getStationNum() {
+
+ return this.stationNum;
+ }
+
+ public String getStationIA5() {
+
+ return this.stationIA5;
+ }
+
+ public String getStationNameUTF8() {
+
+ return this.stationNameUTF8;
+ }
+
+ public Long getDelay() {
+
+ return this.delay;
+ }
+
+ public Boolean getTrainCancelled() {
+
+ return this.trainCancelled;
+ }
+
+ public ConfirmationTypeType getConfirmationType() {
+
+ if (confirmationType == null){
+ return ConfirmationTypeType.trainDelayConfirmation;
+ }
+
+ return this.confirmationType;
+ }
+
+ public List<TicketLinkType> getAffectedTickets() {
+
+ return this.affectedTickets;
+ }
+
+ public String getInfoText() {
+
+ return this.infoText;
+ }
+
+ public ExtensionData getExtension() {
+
+ return this.extension;
+ }
+
+ public void setReferenceIA5(String referenceIA5) {
+
+ this.referenceIA5 = referenceIA5;
+ }
+
+ public void setReferenceNum(Asn1BigInteger referenceNum) {
+ this.referenceNum = referenceNum;
+ }
+
+ public void setReferenceNum(Long referenceNum) {
+ this.referenceNum = Asn1BigInteger.toAsn1(referenceNum);
+ }
+
+ public void setTrainNum(Asn1BigInteger trainNum) {
+
+ this.trainNum = trainNum;
+ }
+
+ public void setTrainIA5(String trainIA5) {
+
+ this.trainIA5 = trainIA5;
+ }
+
+ public void setPlannedArrivalYear(Long plannedArrivalYear) {
+
+ this.plannedArrivalYear = plannedArrivalYear;
+ }
+
+ public void setPlannedArrivalDay(Long plannedArrivalDay) {
+
+ this.plannedArrivalDay = plannedArrivalDay;
+ }
+
+ public void setPlannedArrivalTime(Long plannedArrivalTime) {
+
+ this.plannedArrivalTime = plannedArrivalTime;
+ }
+
+ public void setStationCodeTable(CodeTableType stationCodeTable) {
+
+ this.stationCodeTable = stationCodeTable;
+ }
+
+ public void setStationNum(Long stationNum) {
+
+ this.stationNum = stationNum;
+ }
+
+ public void setStationIA5(String stationIA5) {
+
+ this.stationIA5 = stationIA5;
+ }
+
+ public void setStationNameUTF8(String stationNameUTF8) {
+
+ this.stationNameUTF8 = stationNameUTF8;
+ }
+
+ public void setDelay(Long delay) {
+
+ this.delay = delay;
+ }
+
+ public void setTrainCancelled(Boolean trainCancelled) {
+
+ this.trainCancelled = trainCancelled;
+ }
+
+ public void setConfirmationType(ConfirmationTypeType confirmationType) {
+
+ this.confirmationType = confirmationType;
+ }
+
+ public void setAffectedTickets(SequenceOfTicketLinkType affectedTickets) {
+
+ this.affectedTickets = affectedTickets;
+ }
+
+ public void setInfoText(String infoText) {
+
+ this.infoText = infoText;
+ }
+
+ public void setExtension(ExtensionData extension) {
+
+ this.extension = extension;
+ }
+
+ public void setPlannedArrivalDate(Date date){
+
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+
+ this.plannedArrivalYear = new Long( cal.get(Calendar.YEAR));
+ this.plannedArrivalDay = new Long (cal.get(Calendar.DAY_OF_YEAR));
+ int time = cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
+ if (time > 0) {
+ this.plannedArrivalTime = new Long (time );
+ }
+
+ }
+
+ public Date getPlannedArrivalDate() {
+
+ if (this.plannedArrivalYear == null || this.plannedArrivalDay == null) return null;
+
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.setTimeZone(TimeZone.getTimeZone("UTC"));
+ cal.set(Calendar.YEAR, this.plannedArrivalYear.intValue());
+ cal.set(Calendar.DAY_OF_YEAR, this.plannedArrivalDay.intValue());
+
+ if (this.plannedArrivalTime != null) {
+
+ int hours = this.plannedArrivalTime.intValue() / 60;
+ int minutes = this.plannedArrivalTime.intValue() % 60;
+ cal.set(Calendar.HOUR_OF_DAY, hours);
+ cal.set(Calendar.MINUTE,minutes);
+
+ }
+
+ return cal.getTime();
+ }
+
+ public Long getDepartureUTCOffset() {
+ return departureUTCOffset;
+ }
+
+ public void setDepartureUTCOffset(Long departureUTCOffset) {
+ this.departureUTCOffset = departureUTCOffset;
+ }
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/DeltaCoordinates.java b/src/org/uic/ticket/api/asn/omv2/DeltaCoordinates.java
new file mode 100644
index 0000000..01d2567
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/DeltaCoordinates.java
@@ -0,0 +1,55 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Sequence;
+
+@Sequence
+public class DeltaCoordinates extends Object {
+ public DeltaCoordinates() {
+ }
+
+ public Asn1BigInteger longitude;
+
+ public Asn1BigInteger latitude;
+
+ public Asn1BigInteger getLongitude() {
+
+ return this.longitude;
+ }
+
+ public Asn1BigInteger getLatitude() {
+
+ return this.latitude;
+ }
+
+ public void setLongitude(Asn1BigInteger longitude) {
+
+ this.longitude = longitude;
+ }
+
+ public void setLatitude(Asn1BigInteger latitude) {
+
+ this.latitude = latitude;
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/DocumentData.java b/src/org/uic/ticket/api/asn/omv2/DocumentData.java
new file mode 100644
index 0000000..37bbebd
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/DocumentData.java
@@ -0,0 +1,58 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.Sequence;
+
+@Sequence
+@HasExtensionMarker
+public class DocumentData extends Object {
+ public DocumentData() {
+ }
+
+ @Asn1Optional public TokenType token;
+
+ public TicketDetailData ticket;
+
+ public TokenType getToken() {
+
+ return this.token;
+ }
+
+ public TicketDetailData getTicket() {
+
+ return this.ticket;
+ }
+
+ public void setToken(TokenType token) {
+
+ this.token = token;
+ }
+
+ public void setTicket(TicketDetailData ticket) {
+
+ this.ticket = ticket;
+ }
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/ExtensionData.java b/src/org/uic/ticket/api/asn/omv2/ExtensionData.java
new file mode 100644
index 0000000..2d9a088
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/ExtensionData.java
@@ -0,0 +1,61 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+import net.gcdc.asn1.datatypesimpl.OctetString;
+
+
+@Sequence
+public class ExtensionData extends Object {
+ public ExtensionData() {
+ }
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ public String extensionId;
+
+ public OctetString extensionData;
+
+ public String getExtensionId() {
+
+ return this.extensionId;
+ }
+
+ public byte[] getExtensionData() {
+
+ return extensionData.toByteArray();
+ }
+
+ public void setExtensionId(String extensionId) {
+
+ this.extensionId = extensionId;
+ }
+
+ public void setExtensionData(byte[] extensionData) {
+
+ this.extensionData = new OctetString(extensionData);
+
+ }
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/FIPTicketData.java b/src/org/uic/ticket/api/asn/omv2/FIPTicketData.java
new file mode 100644
index 0000000..2979d99
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/FIPTicketData.java
@@ -0,0 +1,315 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypesimpl.SequenceOfStringIA5;
+
+public class FIPTicketData extends Object {
+ public FIPTicketData() {
+ }
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String referenceIA5;
+
+ @Asn1Optional public Asn1BigInteger referenceNum;
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long productOwnerNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productOwnerIA5;
+
+ @IntRange(minValue=0,maxValue=65535)
+ @Asn1Optional public Long productIdNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productIdIA5;
+
+ @IntRange(minValue=-1,maxValue=700)
+ @Asn1Optional public Long validFromDay;
+
+ @IntRange(minValue=0,maxValue=370)
+ @Asn1Optional public Long validUntilDay;
+
+ @Asn1Optional public SequenceOfActivatedDays activatedDay;
+
+ @Asn1Optional public SequenceOfCarrierNum carrierNum;
+
+ @Asn1Optional public SequenceOfStringIA5 carrierIA5;
+
+ @IntRange(minValue=1,maxValue=200)
+ public Long numberOfTravelDays;
+
+ public Boolean includesSupplements = false;
+
+ @Asn1Default(value="second")
+ @Asn1Optional public TravelClassType classCode;
+
+ @Asn1Optional public ExtensionData extension;
+
+ public String getReferenceIA5() {
+
+ return this.referenceIA5;
+ }
+
+ public Asn1BigInteger getReferenceNum() {
+
+ return this.referenceNum;
+ }
+
+ public Long getProductOwnerNum() {
+
+ return this.productOwnerNum;
+ }
+
+ public String getProductOwnerIA5() {
+
+ return this.productOwnerIA5;
+ }
+
+ public Long getProductIdNum() {
+
+ return this.productIdNum;
+ }
+
+ public String getProductIdIA5() {
+
+ return this.productIdIA5;
+ }
+
+ public Long getValidFromDay() {
+
+ return this.validFromDay;
+ }
+
+ public Long getValidUntilDay() {
+
+ return this.validUntilDay;
+ }
+
+ public List<Long> getActivatedDay() {
+
+ return this.activatedDay;
+ }
+
+ public List<Long> getCarrierNum() {
+
+ return this.carrierNum;
+ }
+
+ public List<String> getCarrierIA5() {
+
+ return this.carrierIA5;
+ }
+
+ public Long getNumberOfTravelDays() {
+
+ return this.numberOfTravelDays;
+ }
+
+ public Boolean getIncludesSupplements() {
+
+ return this.includesSupplements;
+ }
+
+ public TravelClassType getClassCode() {
+ if (classCode == null) return TravelClassType.second;
+ return this.classCode;
+ }
+
+ public ExtensionData getExtension() {
+
+ return this.extension;
+ }
+
+ public void setReferenceIA5(String referenceIA5) {
+
+ this.referenceIA5 = referenceIA5;
+ }
+
+ public void setReferenceNum(Asn1BigInteger referenceNum) {
+
+ this.referenceNum = referenceNum;
+ }
+
+ public void setProductOwnerNum(Long productOwnerNum) {
+
+ this.productOwnerNum = productOwnerNum;
+ }
+
+ public void setProductOwnerIA5(String productOwnerIA5) {
+
+ this.productOwnerIA5 = productOwnerIA5;
+ }
+
+ public void setProductIdNum(Long productIdNum) {
+
+ this.productIdNum = productIdNum;
+ }
+
+ public void setProductIdIA5(String productIdIA5) {
+
+ this.productIdIA5 = productIdIA5;
+ }
+
+ public void setValidFromDay(Long validFromDay) {
+
+ this.validFromDay = validFromDay;
+ }
+
+ public void setValidUntilDay(Long validUntilDay) {
+
+ this.validUntilDay = validUntilDay;
+ }
+
+ public void setActivatedDay(SequenceOfActivatedDays activatedDay) {
+
+ this.activatedDay = activatedDay;
+ }
+
+ public void setCarrierNum(SequenceOfCarrierNum carrierNum) {
+
+ this.carrierNum = carrierNum;
+ }
+
+ public void setCarrierIA5(SequenceOfStringIA5 carrierIA5) {
+
+ this.carrierIA5 = carrierIA5;
+ }
+
+ public void setNumberOfTravelDays(Long numberOfTravelDays) {
+
+ this.numberOfTravelDays = numberOfTravelDays;
+ }
+
+ public void setIncludesSupplements(Boolean includesSupplements) {
+
+ this.includesSupplements = includesSupplements;
+ }
+
+ public void setClassCode(TravelClassType classCode) {
+ this.classCode = classCode;
+ }
+
+ public void setExtension(ExtensionData extension) {
+
+ this.extension = extension;
+ }
+
+ public void setValidityDates (Date fromDate, Date untilDate, Date issuingDate){
+
+ if (issuingDate == null || fromDate == null) return;
+
+ this.validFromDay = DateTimeUtils.getDateDifference(issuingDate,fromDate);
+
+ if (untilDate != null){
+ this.validUntilDay = DateTimeUtils.getDateDifference(fromDate, untilDate);
+ }
+
+ }
+
+ public Date getValidFromDate(Date issuingDate){
+
+ return DateTimeUtils.getDate(issuingDate, this.validFromDay,null);
+
+ }
+
+ public Date getValidUntilDate(Date issuingDate){
+
+ if (issuingDate == null) return null;
+
+ if (this.validFromDay == null) {
+ this.validFromDay = 0L;
+ }
+
+ if (this.validUntilDay == null) {
+ return null;
+ }
+
+
+ return DateTimeUtils.getDate(issuingDate, this.validFromDay + this.validUntilDay, null);
+
+ }
+
+ public void setActivatedDays(Collection<Date> dates, Date issuingDate){
+
+ if (this.activatedDay != null) {
+ this.activatedDay.clear();
+ } else {
+ this.activatedDay= new SequenceOfActivatedDays();
+ }
+
+ if (dates != null && !dates.isEmpty()) {
+
+ for (Date day : dates) {
+ this.addActivatedDay(issuingDate, day);
+ }
+
+ }
+
+ }
+
+ public void addActivatedDay(Date issuingDate, Date day){
+
+ Long dayDiff = DateTimeUtils.getDateDifference(issuingDate, day);
+
+ if (this.activatedDay == null) {
+ this.activatedDay = new SequenceOfActivatedDays();
+ }
+
+ if (dayDiff != null) {
+ this.activatedDay.add(dayDiff);
+ }
+
+ }
+
+ public Collection<Date> getActivatedDays(Date issuingDate) {
+
+ if (this.activatedDay == null) return null;
+
+ ArrayList<Date> dates = new ArrayList<Date>();
+
+ for (Long diff: this.getActivatedDay()) {
+
+ Date day = DateTimeUtils.getDate(issuingDate, diff, null);
+
+ if (day != null) {
+ dates.add(day);
+ }
+
+ }
+
+ return dates;
+
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/GenderType.java b/src/org/uic/ticket/api/asn/omv2/GenderType.java
new file mode 100644
index 0000000..eea06b0
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/GenderType.java
@@ -0,0 +1,42 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+
+@HasExtensionMarker
+public enum GenderType {
+ unspecified("unspecified"),
+ female("female"),
+ male("male"),
+ other("other");
+
+
+ public String text;
+
+ GenderType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/GeoCoordinateSystemType.java b/src/org/uic/ticket/api/asn/omv2/GeoCoordinateSystemType.java
new file mode 100644
index 0000000..644a4f3
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/GeoCoordinateSystemType.java
@@ -0,0 +1,38 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+
+public enum GeoCoordinateSystemType {
+ wgs84("wgs84"),
+ grs80("grs80");
+
+
+ public String text;
+
+ GeoCoordinateSystemType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/GeoCoordinateType.java b/src/org/uic/ticket/api/asn/omv2/GeoCoordinateType.java
new file mode 100644
index 0000000..a55b0fa
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/GeoCoordinateType.java
@@ -0,0 +1,136 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.Sequence;
+
+@Sequence
+public class GeoCoordinateType extends Object {
+ public GeoCoordinateType() {
+ }
+
+ @Asn1Default(value="milliDegree")
+ @Asn1Optional public GeoUnitType geoUnit;
+
+ @Asn1Default(value="wgs84")
+ @Asn1Optional public GeoCoordinateSystemType coordinateSystem;
+
+ @Asn1Default(value="north")
+ @Asn1Optional public HemisphereLongitudeType hemisphereLongitude;
+
+ @Asn1Default(value="east")
+ @Asn1Optional public HemisphereLatitudeType hemisphereLatitude;
+
+ public Asn1BigInteger longitude;
+
+ public Asn1BigInteger latitude;
+
+ @Asn1Optional public GeoUnitType accuracy;
+
+ public GeoUnitType getGeoUnit() {
+
+ if (geoUnit == null){
+ return GeoUnitType.milliDegree;
+ }
+ return this.geoUnit;
+ }
+
+ public GeoCoordinateSystemType getCoordinateSystem() {
+
+ if (coordinateSystem == null) {
+ return GeoCoordinateSystemType.wgs84;
+ }
+
+ return this.coordinateSystem;
+ }
+
+ public HemisphereLongitudeType getHemisphereLongitude() {
+
+ if (hemisphereLongitude == null){
+ return HemisphereLongitudeType.north;
+ }
+
+ return this.hemisphereLongitude;
+ }
+
+ public HemisphereLatitudeType getHemisphereLatitude() {
+
+ if (hemisphereLatitude == null) {
+ return HemisphereLatitudeType.east;
+ }
+
+ return this.hemisphereLatitude;
+ }
+
+ public Long getLongitude() {
+
+ return Asn1BigInteger.toLong(this.longitude);
+ }
+
+ public Long getLatitude() {
+
+ return Asn1BigInteger.toLong(this.latitude);
+ }
+
+ public GeoUnitType getAccuracy() {
+
+ return this.accuracy;
+ }
+
+ public void setGeoUnit(GeoUnitType geoUnit) {
+
+ this.geoUnit = geoUnit;
+ }
+
+ public void setCoordinateSystem(GeoCoordinateSystemType coordinateSystem) {
+
+ this.coordinateSystem = coordinateSystem;
+ }
+
+ public void setHemisphereLongitude(HemisphereLongitudeType hemisphereLongitude) {
+
+ this.hemisphereLongitude = hemisphereLongitude;
+ }
+
+ public void setHemisphereLatitude(HemisphereLatitudeType hemisphereLatitude) {
+
+ this.hemisphereLatitude = hemisphereLatitude;
+ }
+
+ public void setLongitude(Long longitude) {
+
+ this.longitude = Asn1BigInteger.toAsn1(longitude);
+ }
+
+ public void setLatitude(Long latitude) {
+
+ this.latitude = Asn1BigInteger.toAsn1(latitude);
+ }
+
+ public void setAccuracy(GeoUnitType accuracy) {
+
+ this.accuracy = accuracy;
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/GeoUnitType.java b/src/org/uic/ticket/api/asn/omv2/GeoUnitType.java
new file mode 100644
index 0000000..8b217ad
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/GeoUnitType.java
@@ -0,0 +1,40 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+public enum GeoUnitType {
+ microDegree("microDegree"),
+ tenthmilliDegree("tenthmilliDegree"),
+ milliDegree("milliDegree"),
+ centiDegree("centiDegree"),
+ deciDegree("deciDegree");
+
+
+ public String text;
+
+ GeoUnitType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/HemisphereLatitudeType.java b/src/org/uic/ticket/api/asn/omv2/HemisphereLatitudeType.java
new file mode 100644
index 0000000..a8a5c8c
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/HemisphereLatitudeType.java
@@ -0,0 +1,37 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+public enum HemisphereLatitudeType {
+ east("east"),
+ west("west");
+
+
+ public String text;
+
+ HemisphereLatitudeType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/HemisphereLongitudeType.java b/src/org/uic/ticket/api/asn/omv2/HemisphereLongitudeType.java
new file mode 100644
index 0000000..7cf09bd
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/HemisphereLongitudeType.java
@@ -0,0 +1,36 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+public enum HemisphereLongitudeType {
+ north("north"),
+ south("south");
+
+ public String text;
+
+ HemisphereLongitudeType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/IncludedOpenTicketType.java b/src/org/uic/ticket/api/asn/omv2/IncludedOpenTicketType.java
new file mode 100644
index 0000000..ababa1d
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/IncludedOpenTicketType.java
@@ -0,0 +1,422 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Date;
+import java.util.List;
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.SizeRange;
+import net.gcdc.asn1.datatypesimpl.SequenceOfStringIA5;
+
+public class IncludedOpenTicketType extends Object {
+ public IncludedOpenTicketType() {
+ }
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long productOwnerNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productOwnerIA5;
+
+ @IntRange(minValue=0,maxValue=65535)
+ @Asn1Optional public Long productIdNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productIdIA5;
+
+ @Asn1Optional public Asn1BigInteger externalIssuerId;
+
+ @Asn1Optional public Asn1BigInteger issuerAutorizationId;
+
+ @Asn1Default("stationUIC")
+ @Asn1Optional public CodeTableType stationCodeTable;
+
+ @Asn1Optional public SequenceOfRegionalValidityType validRegion;
+
+ @IntRange(minValue=-1,maxValue=700)
+ @Asn1Optional public Long validFromDay;
+
+ @IntRange(minValue=0,maxValue=1439)
+ @Asn1Optional public Long validFromTime;
+
+ @IntRange(minValue=-60, maxValue=60)
+ @Asn1Optional public Long validFromUTCOffset;
+
+ @IntRange(minValue=0,maxValue=370)
+ @Asn1Optional public Long validUntilDay;
+
+ @IntRange(minValue=0,maxValue=1439)
+ @Asn1Optional public Long validUntilTime;
+
+ @IntRange(minValue=-60, maxValue=60)
+ @Asn1Optional public Long validUntilUTCOffset;
+
+ @Asn1Default(value="second")
+ @Asn1Optional public TravelClassType classCode;
+
+ @SizeRange(minValue = 1, maxValue = 2)
+ @Asn1Optional public String serviceLevel;
+
+ @Asn1Optional public SequenceOfCarrierNum includedCarriersNum;
+
+ @Asn1Optional public SequenceOfStringIA5 includedCarriersIA5;
+
+ @Asn1Optional public SequenceOfServiceBrands includedServiceBrands;
+
+ @Asn1Optional public SequenceOfServiceBrands excludedServiceBrands;
+
+ @Asn1Optional public SequenceOfTariffType tariffs;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String infoText;
+
+
+ @Asn1Optional public SequenceOfTransportTypes includedTransportTypes;
+
+ @Asn1Optional public SequenceOfTransportTypes excludedTransportTypes;
+
+ @Asn1Optional public ExtensionData extension;
+
+ public Long getProductOwnerNum() {
+
+ return this.productOwnerNum;
+ }
+
+ public String getProductOwnerIA5() {
+
+ return this.productOwnerIA5;
+ }
+
+ public Long getProductIdNum() {
+
+ return this.productIdNum;
+ }
+
+ public String getProductIdIA5() {
+
+ return this.productIdIA5;
+ }
+
+ public Long getExternalIssuerId() {
+
+ return Asn1BigInteger.toLong(this.externalIssuerId);
+ }
+
+ public Long getIssuerAutorizationId() {
+
+ return Asn1BigInteger.toLong(this.issuerAutorizationId);
+ }
+
+ public CodeTableType getStationCodeTable() {
+
+ if (stationCodeTable == null) {
+ return CodeTableType.stationUIC;
+ }
+
+ return this.stationCodeTable;
+ }
+
+ public List<RegionalValidityType> getValidRegion() {
+
+ return this.validRegion;
+ }
+
+ public Long getValidFromDay() {
+
+ return this.validFromDay;
+ }
+
+ public Long getValidFromTime() {
+
+ return this.validFromTime;
+ }
+
+ public Long getValidUntilDay() {
+
+ return this.validUntilDay;
+ }
+
+ public Long getValidUntilTime() {
+
+ return this.validUntilTime;
+ }
+
+ public TravelClassType getClassCode() {
+
+ if (classCode == null) {
+ return TravelClassType.second;
+ }
+
+ return this.classCode;
+ }
+
+ public String getServiceLevel() {
+
+ return this.serviceLevel;
+ }
+
+ public List<Long> getIncludedCarriersNum() {
+
+ return this.includedCarriersNum;
+ }
+
+ public List<String> getIncludedCarriersIA5() {
+
+ return this.includedCarriersIA5;
+ }
+
+ public List<Long> getIncludedServiceBrands() {
+
+ return this.includedServiceBrands;
+ }
+
+ public List<Long> getExcludedServiceBrands() {
+
+ return this.excludedServiceBrands;
+ }
+
+
+
+ public SequenceOfTransportTypes getIncludedTransportTypes() {
+ return includedTransportTypes;
+ }
+
+ public void setIncludedTransportTypes(SequenceOfTransportTypes includedTransportTypes) {
+ this.includedTransportTypes = includedTransportTypes;
+ }
+
+ public SequenceOfTransportTypes getExcludedTransportTypes() {
+ return excludedTransportTypes;
+ }
+
+ public void setExcludedTransportTypes(SequenceOfTransportTypes excludedTransportTypes) {
+ this.excludedTransportTypes = excludedTransportTypes;
+ }
+
+ public List<TariffType> getTariffs() {
+
+ return this.tariffs;
+ }
+
+ public String getInfoText() {
+
+ return this.infoText;
+ }
+
+ public ExtensionData getExtension() {
+
+ return this.extension;
+ }
+
+ public void setProductOwnerNum(Long productOwnerNum) {
+
+ this.productOwnerNum = productOwnerNum;
+ }
+
+ public void setProductOwnerIA5(String productOwnerIA5) {
+
+ this.productOwnerIA5 = productOwnerIA5;
+ }
+
+ public void setProductIdNum(Long productIdNum) {
+
+ this.productIdNum = productIdNum;
+ }
+
+ public void setProductIdIA5(String productIdIA5) {
+
+ this.productIdIA5 = productIdIA5;
+ }
+
+ public void setExternalIssuerId(Long externalIssuerId) {
+
+ this.externalIssuerId = Asn1BigInteger.toAsn1(externalIssuerId);
+ }
+
+ public void setIssuerAutorizationId(Long issuerAutorizationId) {
+
+ this.issuerAutorizationId = Asn1BigInteger.toAsn1(issuerAutorizationId);
+ }
+
+ public void setStationCodeTable(CodeTableType stationCodeTable) {
+
+ this.stationCodeTable = stationCodeTable;
+ }
+
+ public void setValidRegion(SequenceOfRegionalValidityType validRegion) {
+
+ this.validRegion = validRegion;
+ }
+
+ public void setValidFromDay(Long validFromDay) {
+
+ this.validFromDay = validFromDay;
+ }
+
+ public void setValidFromTime(Long validFromTime) {
+
+ this.validFromTime = validFromTime;
+ }
+
+ public void setValidUntilDay(Long validUntilDay) {
+
+ this.validUntilDay = validUntilDay;
+ }
+
+ public void setValidUntilTime(Long validUntilTime) {
+
+ this.validUntilTime = validUntilTime;
+ }
+
+ public void setClassCode(TravelClassType classCode) {
+
+ this.classCode = classCode;
+ }
+
+ public void setServiceLevel(String serviceLevel) {
+
+ this.serviceLevel = serviceLevel;
+ }
+
+ public void setIncludedCarriersNum(SequenceOfCarrierNum includedCarriersNum) {
+
+ this.includedCarriersNum = includedCarriersNum;
+ }
+
+ public void setIncludedCarriersIA5(SequenceOfStringIA5 includedCarriersIA5) {
+
+ this.includedCarriersIA5 = includedCarriersIA5;
+ }
+
+ public void setIncludedServiceBrands(SequenceOfServiceBrands includedServiceBrands) {
+
+ this.includedServiceBrands = includedServiceBrands;
+ }
+
+ public void setExcludedServiceBrands(SequenceOfServiceBrands excludedServiceBrands) {
+
+ this.excludedServiceBrands = excludedServiceBrands;
+ }
+
+ public void setTariffs(SequenceOfTariffType tariffs) {
+
+ this.tariffs = tariffs;
+ }
+
+ public void setInfoText(String infoText) {
+
+ this.infoText = infoText;
+ }
+
+ public void setExtension(ExtensionData extension) {
+
+ this.extension = extension;
+ }
+
+ public void setValidityDates (Date fromDate, Date untilDate, Date issuingDate){
+
+ if (issuingDate == null || fromDate == null) return;
+
+ this.validFromDay = DateTimeUtils.getDateDifference(issuingDate,fromDate);
+ this.validFromTime = DateTimeUtils.getTime(fromDate);
+
+
+ if (untilDate != null){
+ this.validUntilDay = DateTimeUtils.getDateDifference(fromDate, untilDate);
+ this.validUntilTime = DateTimeUtils.getTime(untilDate);
+ }
+
+ }
+
+ public void setValidFromTimeZone(Date dateLocal, Date dateUTC ) {
+ // -- (UTC = local + offset * 15 Minutes)
+ this.validFromUTCOffset = new Long(dateLocal.getTime() - dateUTC.getTime()) / (1000 * 60 * 15);
+ }
+
+ public void setValidUntilTimeZone(Date dateLocal, Date dateUTC ) {
+ // -- (UTC = local + offset * 15 Minutes)
+ this.validUntilUTCOffset = new Long(dateLocal.getTime() - dateUTC.getTime()) / (1000 * 60 * 15);
+
+ if (this.validFromUTCOffset.longValue() == this.validUntilUTCOffset.longValue()) {
+ this.validUntilUTCOffset = null;
+ }
+ }
+
+
+
+ public Date getValidFromDate(Date issuingDate){
+
+ return DateTimeUtils.getDate(issuingDate, this.validFromDay, this.validFromTime);
+
+ }
+
+ public Date getValidUntilDate(Date issuingDate){
+
+ if (issuingDate == null) return null;
+
+ if (this.validFromDay == null) {
+ this.validFromDay = 0L;
+ }
+
+ if (this.validUntilDay == null) {
+ return null;
+ }
+
+ return DateTimeUtils.getDate(issuingDate, this.validFromDay + this.validUntilDay, this.validUntilTime);
+
+ }
+
+ public Date getUTCValidFromDate(Date issuingDate){
+ return DateTimeUtils.getUTCDate(issuingDate, this.validFromDay, this.validFromTime, this.validFromUTCOffset);
+ }
+
+ public Date getUTCValidUntilDate(Date issuingDate){
+ if (this.validUntilUTCOffset == null) {
+ return DateTimeUtils.getUTCDate(issuingDate, this.validFromDay, this.validFromTime, this.validFromUTCOffset);
+ } else {
+ return DateTimeUtils.getUTCDate(issuingDate, this.validFromDay, this.validUntilTime, this.validFromUTCOffset);
+ }
+ }
+
+ public Long getValidFromUTCOffset() {
+ return validFromUTCOffset;
+ }
+
+ public void setValidFromUTCOffset(Long validFromUTCOffset) {
+ this.validFromUTCOffset = validFromUTCOffset;
+ }
+
+ public Long getValidUntilUTCOffset() {
+ return validUntilUTCOffset;
+ }
+
+ public void setValidUntilUTCOffset(Long validUntilUTCOffset) {
+ this.validUntilUTCOffset = validUntilUTCOffset;
+ }
+
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/IssuingData.java b/src/org/uic/ticket/api/asn/omv2/IssuingData.java
new file mode 100644
index 0000000..ed517df
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/IssuingData.java
@@ -0,0 +1,340 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.FixedSize;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+@Sequence
+@HasExtensionMarker
+public class IssuingData extends Object {
+ public IssuingData() {
+ }
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long securityProviderNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String securityProviderIA5;
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long issuerNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String issuerIA5;
+
+ @IntRange(minValue=2016,maxValue=2269)
+ public Long issuingYear;
+
+ @IntRange(minValue=1,maxValue=366)
+ public Long issuingDay;
+
+ @IntRange(minValue=0,maxValue=1439)
+ @Asn1Optional public Long issuingTime;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String issuerName;
+
+ public Boolean specimen = false;
+
+ public Boolean securePaperTicket = false;
+
+ public Boolean activated = true;
+
+ @FixedSize(3)
+ @Asn1Default(value="EUR")
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String currency;
+
+ @IntRange(minValue=1,maxValue=3)
+ @Asn1Default(value="2")
+ @Asn1Optional public Long currencyFract;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String issuerPNR;
+
+ @Asn1Optional public ExtensionData extension;
+
+ @Asn1Optional public Asn1BigInteger issuedOnTrainNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String issuedOnTrainIA5;
+
+ @Asn1Optional public Asn1BigInteger issuedOnLine;
+
+ @Asn1Optional public GeoCoordinateType pointOfSale;
+
+
+
+
+
+
+ public Long getSecurityProviderNum() {
+
+ return this.securityProviderNum;
+ }
+
+ public String getSecurityProviderIA5() {
+
+ return this.securityProviderIA5;
+ }
+
+ public Long getIssuerNum() {
+
+ return this.issuerNum;
+ }
+
+ public String getIssuerIA5() {
+
+ return this.issuerIA5;
+ }
+
+ public Long getIssuingYear() {
+
+ return this.issuingYear;
+ }
+
+ public Long getIssuingDay() {
+
+ return this.issuingDay;
+ }
+
+ public Long getIssuingTime() {
+
+ return this.issuingTime;
+ }
+
+ public String getIssuerName() {
+
+ return this.issuerName;
+ }
+
+ public Boolean getSpecimen() {
+
+ return this.specimen;
+ }
+
+ public Boolean getSecurePaperTicket() {
+
+ return this.securePaperTicket;
+ }
+
+ public Boolean getActivated() {
+
+ return this.activated;
+ }
+
+ public String getCurrency() {
+
+ if (currency == null || currency.length() == 0){
+ return "EUR";
+ }
+
+ return this.currency;
+ }
+
+ public Long getCurrencyFract() {
+
+ if (currencyFract == null) {
+ return new Long(2);
+ }
+ return this.currencyFract;
+ }
+
+ public String getIssuerPNR() {
+
+ return this.issuerPNR;
+ }
+
+ public ExtensionData getExtension() {
+
+ return this.extension;
+ }
+
+ public Long getIssuedOnTrainNum() {
+
+ return Asn1BigInteger.toLong(issuedOnTrainNum);
+ }
+
+ public String getIssuedOnTrainIA5() {
+
+ return this.issuedOnTrainIA5;
+ }
+
+ public Long getIssuedOnLine() {
+
+ return Asn1BigInteger.toLong(issuedOnLine);
+ }
+
+ public GeoCoordinateType getPointOfSale() {
+
+ return this.pointOfSale;
+ }
+
+ public void setSecurityProviderNum(Long securityProviderNum) {
+
+ this.securityProviderNum = securityProviderNum;
+ }
+
+ public void setSecurityProviderIA5(String securityProviderIA5) {
+
+ this.securityProviderIA5 = securityProviderIA5;
+ }
+
+ public void setIssuerNum(Long issuerNum) {
+
+ this.issuerNum = issuerNum;
+ }
+
+ public void setIssuerIA5(String issuerIA5) {
+
+ this.issuerIA5 = issuerIA5;
+ }
+
+ public void setIssuingYear(Long issuingYear) {
+
+ this.issuingYear = issuingYear;
+ }
+
+ public void setIssuingDay(Long issuingDay) {
+
+ this.issuingDay = issuingDay;
+ }
+
+ public void setIssuingTime(Long issuingTime) {
+
+ this.issuingTime = issuingTime;
+ }
+
+ public void setIssuerName(String issuerName) {
+
+ this.issuerName = issuerName;
+ }
+
+ public void setSpecimen(Boolean specimen) {
+
+ this.specimen = specimen;
+ }
+
+ public void setSecurePaperTicket(Boolean securePaperTicket) {
+
+ this.securePaperTicket = securePaperTicket;
+ }
+
+ public void setActivated(Boolean activated) {
+
+ this.activated = activated;
+ }
+
+ public void setCurrency(String currency) {
+
+ this.currency = currency;
+ }
+
+ public void setCurrencyFract(Long currencyFract) {
+
+ this.currencyFract = currencyFract;
+ }
+
+ public void setIssuerPNR(String issuerPNR) {
+
+ this.issuerPNR = issuerPNR;
+ }
+
+ public void setExtension(ExtensionData extension) {
+
+ this.extension = extension;
+ }
+
+ public void setIssuedOnTrainNum(Long issuedOnTrainNum) {
+
+ this.issuedOnTrainNum = Asn1BigInteger.toAsn1(issuedOnTrainNum);
+ }
+
+ public void setIssuedOnTrainIA5(String issuedOnTrainIA5) {
+
+ this.issuedOnTrainIA5 = issuedOnTrainIA5;
+ }
+
+ public void setIssuedOnLine(Long issuedOnLine) {
+
+ this.issuedOnLine = Asn1BigInteger.toAsn1(issuedOnLine);
+ }
+
+ public void setPointOfSale(GeoCoordinateType pointOfSale) {
+
+ this.pointOfSale = pointOfSale;
+ }
+
+ public void setIssuingDate(Date date){
+
+ if (date == null) {
+ date = Calendar.getInstance().getTime();
+ }
+
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+
+ this.issuingYear = new Long( cal.get(Calendar.YEAR));
+ this.issuingDay = new Long (cal.get(Calendar.DAY_OF_YEAR));
+ int time = cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
+ if (time > 0) {
+ this.issuingTime = new Long (time );
+ }
+
+ }
+
+ public Date getIssuingDate() {
+
+ if (this.issuingYear == null || this.issuingDay == null) return null;
+
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.setTimeZone(TimeZone.getTimeZone("UTC"));
+ cal.set(Calendar.YEAR, this.issuingYear.intValue());
+ cal.set(Calendar.DAY_OF_YEAR, this.issuingDay.intValue());
+
+ if (this.issuingTime != null) {
+
+ int hours = this.issuingTime.intValue() / 60;
+ int minutes = this.issuingTime.intValue() % 60;
+ cal.set(Calendar.HOUR_OF_DAY, hours);
+ cal.set(Calendar.MINUTE,minutes);
+
+ }
+
+ return cal.getTime();
+ }
+
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/LineType.java b/src/org/uic/ticket/api/asn/omv2/LineType.java
new file mode 100644
index 0000000..78ea99a
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/LineType.java
@@ -0,0 +1,174 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+import net.gcdc.asn1.datatypesimpl.OctetString;
+import net.gcdc.asn1.datatypesimpl.SequenceOfUnrestrictedLong;
+
+@Sequence
+@HasExtensionMarker
+
+public class LineType extends Object {
+ public LineType() {
+ }
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long carrierNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String carrierIA5;
+
+ @Asn1Optional public SequenceOfUnrestrictedLong lineId;
+
+ @Asn1Default("stationUIC")
+ @Asn1Optional public CodeTableType stationCodeTable;
+
+ @IntRange(minValue=0,maxValue=9999999)
+ @Asn1Optional public Long entryStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String entryStationIA5;
+
+ @IntRange(minValue=0,maxValue=9999999)
+ @Asn1Optional public Long terminatingStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String terminatingStationIA5;
+
+ @Asn1Optional public Asn1BigInteger city;
+
+ @Asn1Optional public OctetString binaryZoneId;
+
+
+
+ public Long getCarrierNum() {
+
+ return this.carrierNum;
+ }
+
+ public String getCarrierIA5() {
+
+ return this.carrierIA5;
+ }
+
+ public SequenceOfUnrestrictedLong getLineId() {
+
+ return this.lineId;
+ }
+
+ public CodeTableType getStationCodeTable() {
+
+ if (stationCodeTable == null) {
+ return CodeTableType.stationUIC;
+ }
+
+ return this.stationCodeTable;
+ }
+
+ public Long getEntryStationNum() {
+
+ return this.entryStationNum;
+ }
+
+ public String getEntryStationIA5() {
+
+ return this.entryStationIA5;
+ }
+
+ public Long getTerminatingStationNum() {
+
+ return this.terminatingStationNum;
+ }
+
+ public String getTerminatingStationIA5() {
+
+ return this.terminatingStationIA5;
+ }
+
+ public Long getCity() {
+
+ return Asn1BigInteger.toLong(this.city);
+ }
+
+ public byte[] getBinaryZoneId() {
+
+ return binaryZoneId.toByteArray();
+ }
+
+ public void setCarrierNum(Long carrierNum) {
+
+ this.carrierNum = carrierNum;
+ }
+
+ public void setCarrierIA5(String carrierIA5) {
+
+ this.carrierIA5 = carrierIA5;
+ }
+
+ public void setLineId(SequenceOfUnrestrictedLong lineId) {
+
+ this.lineId = lineId;
+ }
+
+ public void setStationCodeTable(CodeTableType stationCodeTable) {
+
+ this.stationCodeTable = stationCodeTable;
+ }
+
+ public void setEntryStationNum(Long entryStationNum) {
+
+ this.entryStationNum = entryStationNum;
+ }
+
+ public void setEntryStationIA5(String entryStationIA5) {
+
+ this.entryStationIA5 = entryStationIA5;
+ }
+
+ public void setTerminatingStationNum(Long terminatingStationNum) {
+
+ this.terminatingStationNum = terminatingStationNum;
+ }
+
+ public void setTerminatingStationIA5(String terminatingStationIA5) {
+
+ this.terminatingStationIA5 = terminatingStationIA5;
+ }
+
+ public void setCity(Long city) {
+
+ this.city = Asn1BigInteger.toAsn1(city);
+ }
+
+ public void setBinaryZoneId(byte[] binaryZoneId) {
+
+ this.binaryZoneId = new OctetString(binaryZoneId);
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/LinkMode.java b/src/org/uic/ticket/api/asn/omv2/LinkMode.java
new file mode 100644
index 0000000..0e4caf6
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/LinkMode.java
@@ -0,0 +1,39 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+
+@HasExtensionMarker
+public enum LinkMode {
+ issuedTogether("issuedTogether"),
+ onlyValidInCombination("onlyValidInCombination");
+
+ public String text;
+
+ LinkMode(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/LoadingDeckType.java b/src/org/uic/ticket/api/asn/omv2/LoadingDeckType.java
new file mode 100644
index 0000000..317559b
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/LoadingDeckType.java
@@ -0,0 +1,38 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+
+public enum LoadingDeckType {
+ unspecified("unspecified"),
+ upper("upper"),
+ lower("lower");
+
+ public String text;
+
+ LoadingDeckType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/LuggageRestrictionType.java b/src/org/uic/ticket/api/asn/omv2/LuggageRestrictionType.java
new file mode 100644
index 0000000..0f56183
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/LuggageRestrictionType.java
@@ -0,0 +1,84 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.Sequence;
+
+@Sequence
+@HasExtensionMarker
+public class LuggageRestrictionType extends Object {
+ public LuggageRestrictionType() {
+ }
+
+ @IntRange(minValue=0,maxValue=99)
+ @Asn1Default(value="3")
+ @Asn1Optional public Long maxHandLuggagePieces;
+
+ @IntRange(minValue=0,maxValue=99)
+ @Asn1Default(value="1")
+ @Asn1Optional public Long maxNonHandLuggagePieces;
+
+ @Asn1Optional public SequenceOfRegisteredLuggageType registeredLuggage;
+
+
+ public void setRegisteredLuggage(
+ SequenceOfRegisteredLuggageType registeredLuggage) {
+ this.registeredLuggage = registeredLuggage;
+ }
+
+ public Long getMaxHandLuggagePieces() {
+
+ if (maxHandLuggagePieces == null) {
+ return new Long(3);
+ }
+
+ return this.maxHandLuggagePieces;
+ }
+
+ public Long getMaxNonHandLuggagePieces() {
+
+ if (maxNonHandLuggagePieces == null) {
+ return new Long(1);
+ }
+
+ return this.maxNonHandLuggagePieces;
+ }
+
+ public SequenceOfRegisteredLuggageType getRegisteredLuggage() {
+
+ return this.registeredLuggage;
+ }
+
+ public void setMaxHandLuggagePieces(Long maxHandLuggagePieces) {
+
+ this.maxHandLuggagePieces = maxHandLuggagePieces;
+ }
+
+ public void setMaxNonHandLuggagePieces(Long maxNonHandLuggagePieces) {
+
+ this.maxNonHandLuggagePieces = maxNonHandLuggagePieces;
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/OpenTicketData.java b/src/org/uic/ticket/api/asn/omv2/OpenTicketData.java
new file mode 100644
index 0000000..0f5bf9a
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/OpenTicketData.java
@@ -0,0 +1,632 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+import net.gcdc.asn1.datatypes.SizeRange;
+import net.gcdc.asn1.datatypesimpl.SequenceOfStringIA5;
+
+@Sequence
+@HasExtensionMarker
+public class OpenTicketData extends Object {
+ public OpenTicketData() {
+ }
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String referenceIA5;
+
+ @Asn1Optional public Asn1BigInteger referenceNum;
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long productOwnerNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productOwnerIA5;
+
+ @IntRange(minValue=0,maxValue=65535)
+ @Asn1Optional public Long productIdNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productIdIA5;
+
+ @Asn1Optional public Asn1BigInteger externalIssuerId;
+
+ @Asn1Optional public Asn1BigInteger issuerAutorizationId;
+
+ public Boolean returnIncluded = false;
+
+ @Asn1Default("stationUIC")
+ @Asn1Optional public CodeTableType stationCodeTable;
+
+ @IntRange(minValue=1,maxValue=9999999)
+ @Asn1Optional public Long fromStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String fromStationIA5;
+
+ @IntRange(minValue=1,maxValue=9999999)
+ @Asn1Optional public Long toStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String toStationIA5;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String fromStationNameUTF8;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String toStationNameUTF8;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String validRegionDesc;
+
+ @Asn1Optional public SequenceOfRegionalValidityType validRegion;
+
+ @Asn1Optional public ReturnRouteDescriptionType returnDescription;
+
+ @Asn1Default(value = "0")
+ @IntRange(minValue=-1,maxValue=700)
+ @Asn1Optional public Long validFromDay;
+
+ @IntRange(minValue=0,maxValue=1439)
+ @Asn1Optional public Long validFromTime;
+
+ @IntRange(minValue=-60, maxValue=60)
+ @Asn1Optional public Long validFromUTCOffset;
+
+ @Asn1Default(value = "0")
+ @IntRange(minValue=0,maxValue=370)
+ @Asn1Optional public Long validUntilDay;
+
+ @IntRange(minValue=0,maxValue=1439)
+ @Asn1Optional public Long validUntilTime;
+
+ @IntRange(minValue=-60, maxValue=60)
+ @Asn1Optional public Long validUntilUTCOffset;
+
+ @Asn1Optional public SequenceOfActivatedDays activatedDay;
+
+ @Asn1Default(value="second")
+ @Asn1Optional public TravelClassType classCode;
+
+ @SizeRange(minValue = 1, maxValue = 2)
+ @Asn1Optional public String serviceLevel;
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public SequenceOfCarrierNum carrierNum;
+
+ @Asn1Optional public SequenceOfStringIA5 carrierIA5;
+
+ @Asn1Optional public SequenceOfServiceBrands includedServiceBrands;
+
+ @Asn1Optional public SequenceOfServiceBrands excludedServiceBrands;
+
+ @Asn1Optional public SequenceOfTariffType tariffs;
+
+ @Asn1Optional Asn1BigInteger price;
+
+ @Asn1Optional SequenceOfVatDetail vatDetails;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String infoText;
+
+ @Asn1Optional public SequenceOfIncludedOpenTicketType includedAddOns;
+
+ @Asn1Optional public LuggageRestrictionType luggage;
+
+ @Asn1Optional public SequenceOfTransportTypes includedTransportTypes;
+
+ @Asn1Optional public SequenceOfTransportTypes excludedTransportTypes;
+
+
+ @Asn1Optional public ExtensionData extension;
+
+
+
+
+ public Long getReferenceNum() {
+ return Asn1BigInteger.toLong(this.referenceNum);
+ }
+
+ public String getReferenceIA5() {
+
+ return this.referenceIA5;
+ }
+
+ public Long getProductOwnerNum() {
+
+ return this.productOwnerNum;
+ }
+
+ public String getProductOwnerIA5() {
+
+ return this.productOwnerIA5;
+ }
+
+ public Long getProductIdNum() {
+
+ return this.productIdNum;
+ }
+
+ public String getProductIdIA5() {
+
+ return this.productIdIA5;
+ }
+
+ public Long getExtIssuerId() {
+
+ return Asn1BigInteger.toLong(externalIssuerId);
+ }
+
+ public Long getIssuerAutorizationId() {
+
+ return Asn1BigInteger.toLong(issuerAutorizationId);
+ }
+
+ public Boolean getReturnIncluded() {
+
+ return this.returnIncluded;
+ }
+
+ public CodeTableType getStationCodeTable() {
+
+ if (stationCodeTable == null) {
+ return CodeTableType.stationUIC;
+ }
+
+
+ return this.stationCodeTable;
+ }
+
+ public Long getFromStationNum() {
+
+ return this.fromStationNum;
+ }
+
+ public String getFromStationIA5() {
+
+ return this.fromStationIA5;
+ }
+
+ public Long getToStationNum() {
+
+ return this.toStationNum;
+ }
+
+ public String getToStationIA5() {
+
+ return this.toStationIA5;
+ }
+
+ public String getFromStationNameUTF8() {
+
+ return this.fromStationNameUTF8;
+ }
+
+ public String getToStationNameUTF8() {
+
+ return this.toStationNameUTF8;
+ }
+
+ public String getValidRegionDesc() {
+
+ return this.validRegionDesc;
+ }
+
+ public List<RegionalValidityType> getValidRegion() {
+
+ return this.validRegion;
+ }
+
+ public ReturnRouteDescriptionType getReturnDescription() {
+
+ return this.returnDescription;
+ }
+
+ public Long getValidFromDay() {
+
+ return this.validFromDay;
+ }
+
+ public Long getValidFromTime() {
+
+ return this.validFromTime;
+ }
+
+ public Long getValidUntilDay() {
+
+ return this.validUntilDay;
+ }
+
+ public Long getValidUntilTime() {
+
+ return this.validUntilTime;
+ }
+
+ public List<Long> getActivatedDay() {
+
+ return this.activatedDay;
+ }
+
+ public TravelClassType getClassCode() {
+
+ if (classCode == null) {
+ return TravelClassType.second;
+ }
+
+ return this.classCode;
+ }
+
+ public String getServiceLevel() {
+
+ return this.serviceLevel;
+ }
+
+ public List<Long> getCarriersNum() {
+
+ return this.carrierNum;
+ }
+
+ public List<String> getCarriersIA5() {
+
+ return this.carrierIA5;
+ }
+
+ public List<Long> getIncludedServiceBrands() {
+
+ return this.includedServiceBrands;
+ }
+
+ public List<Long> getExcludedServiceBrands() {
+
+ return this.excludedServiceBrands;
+ }
+
+ public List<TariffType> getTariffs() {
+
+ return this.tariffs;
+ }
+
+ public String getInfoText() {
+
+ return this.infoText;
+ }
+
+ public List<IncludedOpenTicketType> getIncludedAddOns() {
+
+ return this.includedAddOns;
+ }
+
+ public LuggageRestrictionType getLuggage() {
+
+ return this.luggage;
+ }
+
+ public ExtensionData getExtension() {
+
+ return this.extension;
+ }
+
+ public void setReferenceNum(Long referenceNum) {
+ this.referenceNum = Asn1BigInteger.toAsn1(referenceNum);
+ }
+
+ public void setReferenceIA5(String referenceIA5) {
+
+ this.referenceIA5 = referenceIA5;
+ }
+
+ public void setProductOwnerNum(Long productOwnerNum) {
+
+ this.productOwnerNum = productOwnerNum;
+ }
+
+ public void setProductOwnerIA5(String productOwnerIA5) {
+
+ this.productOwnerIA5 = productOwnerIA5;
+ }
+
+ public void setProductIdNum(Long productIdNum) {
+
+ this.productIdNum = productIdNum;
+ }
+
+ public void setProductIdIA5(String productIdIA5) {
+ this.productIdIA5 = productIdIA5;
+ }
+
+ public void setExtIssuerId(Long extIssuerId) {
+ this.externalIssuerId = Asn1BigInteger.toAsn1(extIssuerId);
+ }
+
+ public void setIssuerAutorizationId(Long issuerAutorizationId) {
+
+ this.issuerAutorizationId = Asn1BigInteger.toAsn1(issuerAutorizationId);
+ }
+
+ public void setReturnIncluded(Boolean returnIncluded) {
+ this.returnIncluded = returnIncluded;
+ }
+
+ public void setStationCodeTable(CodeTableType stationCodeTable) {
+ this.stationCodeTable = stationCodeTable;
+ }
+
+ public void setFromStationNum(Long fromStationNum) {
+ this.fromStationNum = fromStationNum;
+ }
+
+ public void setFromStationIA5(String fromStationIA5) {
+ this.fromStationIA5 = fromStationIA5;
+ }
+
+ public void setToStationNum(Long toStationNum) {
+ this.toStationNum = toStationNum;
+ }
+
+ public void setToStationIA5(String toStationIA5) {
+ this.toStationIA5 = toStationIA5;
+ }
+
+ public void setFromStationNameUTF8(String fromStationNameUTF8) {
+ this.fromStationNameUTF8 = fromStationNameUTF8;
+ }
+
+ public void setToStationNameUTF8(String toStationNameUTF8) {
+ this.toStationNameUTF8 = toStationNameUTF8;
+ }
+
+ public void setValidRegionDesc(String validRegionDesc) {
+ this.validRegionDesc = validRegionDesc;
+ }
+
+ public void setValidRegion(SequenceOfRegionalValidityType validRegion) {
+ this.validRegion = validRegion;
+ }
+
+ public void setReturnDescription(ReturnRouteDescriptionType returnDescription) {
+ this.returnDescription = returnDescription;
+ }
+
+ public void setValidFromDay(Long validFromDay) {
+ this.validFromDay = validFromDay;
+ }
+
+ public void setValidFromTime(Long validFromTime) {
+ this.validFromTime = validFromTime;
+ }
+
+ public void setValidUntilDay(Long validUntilDay) {
+ this.validUntilDay = validUntilDay;
+ }
+
+ public void setValidUntilTime(Long validUntilTime) {
+ this.validUntilTime = validUntilTime;
+ }
+
+ public void setActivatedDay(SequenceOfActivatedDays activatedDay) {
+ this.activatedDay = activatedDay;
+ }
+
+ public void setClassCode(TravelClassType classCode) {
+ this.classCode = classCode;
+ }
+
+ public void setServiceLevel(String serviceLevel) {
+ this.serviceLevel = serviceLevel;
+ }
+
+ public void setCarriersNum(SequenceOfCarrierNum carriersNum) {
+
+ this.carrierNum = carriersNum;
+ }
+
+ public void setCarriersIA5(SequenceOfStringIA5 carriersIA5) {
+ this.carrierIA5 = carriersIA5;
+ }
+
+ public void setIncludedServiceBrands(SequenceOfServiceBrands includedServiceBrands) {
+ this.includedServiceBrands = includedServiceBrands;
+ }
+
+ public void setExcludedServiceBrands(SequenceOfServiceBrands excludedServiceBrands) {
+ this.excludedServiceBrands = excludedServiceBrands;
+ }
+
+
+ public SequenceOfTransportTypes getIncludedTransportTypes() {
+ return includedTransportTypes;
+ }
+
+ public void setIncludedTransportTypes(SequenceOfTransportTypes includedTransportTypes) {
+ this.includedTransportTypes = includedTransportTypes;
+ }
+
+ public SequenceOfTransportTypes getExcludedTransportTypes() {
+ return excludedTransportTypes;
+ }
+
+ public void setExcludedTransportTypes(SequenceOfTransportTypes excludedTransportTypes) {
+ this.excludedTransportTypes = excludedTransportTypes;
+ }
+
+ public void setTariffs(SequenceOfTariffType tariffs) {
+ this.tariffs = tariffs;
+ }
+
+ public void setInfoText(String infoText) {
+
+ this.infoText = infoText;
+ }
+
+ public void setIncludedAddOns(SequenceOfIncludedOpenTicketType includedAddOns) {
+ this.includedAddOns = includedAddOns;
+ }
+
+ public void setLuggage(LuggageRestrictionType luggage) {
+ this.luggage = luggage;
+ }
+
+ public void setExtension(ExtensionData extension) {
+ this.extension = extension;
+ }
+
+ public Long getPrice() {
+ return Asn1BigInteger.toLong(price);
+ }
+
+ public void setPrice(Long price) {
+ this.price = Asn1BigInteger.toAsn1(price);
+ }
+
+ public SequenceOfVatDetail getVatDetails() {
+ return vatDetails;
+ }
+
+ public void setVatDetails(SequenceOfVatDetail vatDetails) {
+ this.vatDetails = vatDetails;
+ }
+
+ public void addVatDetail(VatDetailType vatDetail) {
+ if (this.vatDetails == null) {
+ this.vatDetails = new SequenceOfVatDetail();
+ }
+ this.vatDetails.add(vatDetail);
+ }
+
+ public void setValidityDates (Date fromDate, Date untilDate, Date issuingDate){
+
+ if (issuingDate == null || fromDate == null) return;
+
+ this.validFromDay = DateTimeUtils.getDateDifference(issuingDate,fromDate);
+ this.validFromTime = DateTimeUtils.getTime(fromDate);
+
+ if (untilDate != null){
+ this.validUntilDay = DateTimeUtils.getDateDifference(fromDate, untilDate);
+ this.validUntilTime = DateTimeUtils.getTime(untilDate);
+ }
+
+ }
+
+ public Date getValidFromDate(Date issuingDate){
+
+ return DateTimeUtils.getDate(issuingDate, this.validFromDay, this.validFromTime);
+
+ }
+
+ public Date getValidUntilDate(Date issuingDate){
+
+ if (issuingDate == null) return null;
+
+ if (this.validFromDay == null) {
+ this.validFromDay = 0L;
+ }
+
+ if (this.validUntilDay == null) {
+ return null;
+ }
+
+
+ return DateTimeUtils.getDate(issuingDate, this.validFromDay + this.validUntilDay, this.validUntilTime);
+
+ }
+
+
+
+ public void setActivatedDays(Collection<Date> dates, Date issuingDate){
+
+ if (this.activatedDay != null) {
+ this.activatedDay.clear();
+ } else {
+ this.activatedDay= new SequenceOfActivatedDays();
+ }
+
+ if (dates != null && !dates.isEmpty()) {
+
+ for (Date day : dates) {
+ this.addActivatedDay(issuingDate, day);
+ }
+
+ }
+
+ }
+
+ public void addActivatedDay(Date issuingDate, Date day){
+
+ Long dayDiff = DateTimeUtils.getDateDifference(issuingDate, day);
+
+ if (this.activatedDay == null) {
+ this.activatedDay = new SequenceOfActivatedDays();
+ }
+
+ if (dayDiff != null) {
+ this.activatedDay.add(dayDiff);
+ }
+
+ }
+
+ public Collection<Date> getActivatedDays(Date issuingDate) {
+
+ if (this.activatedDay == null) return null;
+
+ ArrayList<Date> dates = new ArrayList<Date>();
+
+ for (Long diff: this.getActivatedDay()) {
+
+ Date day = DateTimeUtils.getDate(issuingDate, diff, null);
+
+ if (day != null) {
+ dates.add(day);
+ }
+
+ }
+
+ return dates;
+
+ }
+ public Long getValidFromUTCOffset() {
+ return validFromUTCOffset;
+ }
+
+ public void setValidFromUTCOffset(Long validFromUTCOffset) {
+ this.validFromUTCOffset = validFromUTCOffset;
+ }
+
+ public Long getValidUntilUTCOffset() {
+ return validUntilUTCOffset;
+ }
+
+ public void setValidUntilUTCOffset(Long validUntilUTCOffset) {
+ this.validUntilUTCOffset = validUntilUTCOffset;
+ }
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/ParkingGroundData.java b/src/org/uic/ticket/api/asn/omv2/ParkingGroundData.java
new file mode 100644
index 0000000..dfefc1f
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/ParkingGroundData.java
@@ -0,0 +1,342 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Date;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+@Sequence
+@HasExtensionMarker
+public class ParkingGroundData extends Object {
+ public ParkingGroundData() {
+ }
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String referenceIA5;
+
+ @Asn1Optional public Asn1BigInteger referenceNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ public String parkingGroundId;
+
+ @IntRange(minValue=0,maxValue=370)
+ @Asn1Optional public Long fromParkingDate;
+
+ @IntRange(minValue=0,maxValue=370)
+ @Asn1Optional public Long toParkingDate;
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long productOwnerNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productOwnerIA5;
+
+ @IntRange(minValue=0,maxValue=65535)
+ @Asn1Optional public Long productIdNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productIdIA5;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String accessCode;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ public String location;
+
+ @Asn1Default("stationUIC")
+ @Asn1Optional public CodeTableType stationCodeTable;
+
+ @IntRange(minValue=1,maxValue=9999999)
+ @Asn1Optional public Long stationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String stationIA5;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String specialInformation;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String entryTrack;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String numberPlate;
+
+ @Asn1Optional Asn1BigInteger price;
+
+ @Asn1Optional SequenceOfVatDetail vatDetails;
+
+ @Asn1Optional public ExtensionData extension;
+
+
+
+
+ public String getReferenceIA5() {
+
+ return this.referenceIA5;
+ }
+
+ public Asn1BigInteger getReferenceNum() {
+
+ return this.referenceNum;
+ }
+
+ public String getParkingGroundId() {
+
+ return this.parkingGroundId;
+ }
+
+ public Long getFromParkingDate() {
+
+ return this.fromParkingDate;
+ }
+
+ public Long getToParkingDate() {
+
+ return this.toParkingDate;
+ }
+
+ public Long getProductOwnerNum() {
+
+ return this.productOwnerNum;
+ }
+
+ public String getProductOwnerIA5() {
+
+ return this.productOwnerIA5;
+ }
+
+ public Long getProductIdNum() {
+
+ return this.productIdNum;
+ }
+
+ public String getProductIdIA5() {
+
+ return this.productIdIA5;
+ }
+
+ public String getAccessCode() {
+
+ return this.accessCode;
+ }
+
+ public String getLocation() {
+
+ return this.location;
+ }
+
+ public CodeTableType getStationCodeTable() {
+
+ if (stationCodeTable == null) {
+ return CodeTableType.stationUIC;
+ }
+
+ return this.stationCodeTable;
+ }
+
+ public Long getStationNum() {
+
+ return this.stationNum;
+ }
+
+ public String getStationIA5() {
+
+ return this.stationIA5;
+ }
+
+ public String getSpecialInformation() {
+
+ return this.specialInformation;
+ }
+
+ public String getEntryTrack() {
+
+ return this.entryTrack;
+ }
+
+ public String getNumberPlate() {
+
+ return this.numberPlate;
+ }
+
+ public ExtensionData getExtension() {
+
+ return this.extension;
+ }
+
+ public void setReferenceIA5(String referenceIA5) {
+
+ this.referenceIA5 = referenceIA5;
+ }
+
+ public void setReferenceNum(Asn1BigInteger referenceNum) {
+
+ this.referenceNum = referenceNum;
+ }
+
+ public void setParkingGroundId(String parkingGroundId) {
+
+ this.parkingGroundId = parkingGroundId;
+ }
+
+ public void setFromParkingDate(Long fromParkingDate) {
+
+ this.fromParkingDate = fromParkingDate;
+ }
+
+ public void setToParkingDate(Long toParkingDate) {
+
+ this.toParkingDate = toParkingDate;
+ }
+
+ public void setProductOwnerNum(Long productOwnerNum) {
+
+ this.productOwnerNum = productOwnerNum;
+ }
+
+ public void setProductOwnerIA5(String productOwnerIA5) {
+
+ this.productOwnerIA5 = productOwnerIA5;
+ }
+
+ public void setProductIdNum(Long productIdNum) {
+
+ this.productIdNum = productIdNum;
+ }
+
+ public void setProductIdIA5(String productIdIA5) {
+
+ this.productIdIA5 = productIdIA5;
+ }
+
+ public void setAccessCode(String accessCode) {
+
+ this.accessCode = accessCode;
+ }
+
+ public void setLocation(String location) {
+
+ this.location = location;
+ }
+
+ public void setStationCodeTable(CodeTableType stationCodeTable) {
+
+ this.stationCodeTable = stationCodeTable;
+ }
+
+ public void setStationNum(Long stationNum) {
+
+ this.stationNum = stationNum;
+ }
+
+ public void setStationIA5(String stationIA5) {
+
+ this.stationIA5 = stationIA5;
+ }
+
+ public void setSpecialInformation(String specialInformation) {
+
+ this.specialInformation = specialInformation;
+ }
+
+ public void setEntryTrack(String entryTrack) {
+
+ this.entryTrack = entryTrack;
+ }
+
+ public void setNumberPlate(String numberPlate) {
+
+ this.numberPlate = numberPlate;
+ }
+
+ public void setExtension(ExtensionData extension) {
+
+ this.extension = extension;
+ }
+
+ public Long getPrice() {
+ return Asn1BigInteger.toLong(price);
+ }
+
+ public void setPrice(Long price) {
+ this.price = Asn1BigInteger.toAsn1(price);
+ }
+
+ public SequenceOfVatDetail getVatDetails() {
+ return vatDetails;
+ }
+
+ public void setVatDetails(SequenceOfVatDetail vatDetails) {
+ this.vatDetails = vatDetails;
+ }
+
+ public void addVatDetail(VatDetailType vatDetail) {
+ if (this.vatDetails == null) {
+ this.vatDetails = new SequenceOfVatDetail();
+ }
+ this.vatDetails.add(vatDetail);
+ }
+
+
+ public void setParkingDate (Date fromDate, Date issuingDate){
+
+ if (issuingDate == null || fromDate == null) return;
+
+ this.fromParkingDate = DateTimeUtils.getDateDifference(issuingDate,fromDate);
+
+ }
+
+ public Date getFromParkingDate(Date issuingDate){
+
+ return DateTimeUtils.getDate(issuingDate, this.fromParkingDate, null);
+
+ }
+
+ public Date getToParkingDate(Date issuingDate) {
+
+ if ( this.toParkingDate == null) return null;
+
+ return DateTimeUtils.getDate(issuingDate, this.fromParkingDate + this.toParkingDate, null);
+
+ }
+
+ public void setParkingDates(Date fromDate, Date toDate, Date issuingDate) {
+
+ if (issuingDate == null || fromDate == null) return;
+
+ this.fromParkingDate = DateTimeUtils.getDateDifference(issuingDate,fromDate);
+
+
+ if (toDate != null) {
+ this.toParkingDate = DateTimeUtils.getDateDifference(fromDate,toDate);
+
+ }
+
+ }
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/PassData.java b/src/org/uic/ticket/api/asn/omv2/PassData.java
new file mode 100644
index 0000000..1058d85
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/PassData.java
@@ -0,0 +1,556 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+import net.gcdc.asn1.datatypesimpl.SequenceOfStringIA5;
+
+@Sequence
+@HasExtensionMarker
+public class PassData extends Object {
+ public PassData() {
+ }
+
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String referenceIA5;
+
+ @Asn1Optional public Asn1BigInteger referenceNum;
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long productOwnerNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productOwnerIA5;
+
+ @IntRange(minValue=0,maxValue=65535)
+ @Asn1Optional public Long productIdNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productIdIA5;
+
+ @IntRange(minValue=1,maxValue=250)
+ @Asn1Optional public Long passType;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String passDescription;
+
+ @Asn1Default (value="second")
+ @Asn1Optional public TravelClassType classCode;
+
+ @IntRange(minValue=-1,maxValue=700)
+ @Asn1Optional public Long validFromDay;
+
+ @IntRange(minValue=0,maxValue=1439)
+ @Asn1Optional public Long validFromTime;
+
+ @IntRange(minValue=-60, maxValue=60)
+ @Asn1Optional public Long validFromUTCOffset;
+
+ @IntRange(minValue=0,maxValue=370)
+ @Asn1Optional public Long validUntilDay;
+
+ @IntRange(minValue=0,maxValue=1439)
+ @Asn1Optional public Long validUntilTime;
+
+ @IntRange(minValue=-60, maxValue=60)
+ @Asn1Optional public Long validUntilUTCOffset;
+
+ @Asn1Optional public ValidityPeriodDetailType validityPeriodDetails;
+
+ @IntRange(minValue=0,maxValue=370)
+ @Asn1Optional public Long numberOfValidityDays;
+
+ @IntRange(minValue=1,maxValue=250)
+ @Asn1Optional public Long numberOfPossibleTrips;
+
+ @IntRange(minValue=1,maxValue=250)
+ @Asn1Optional public Long numberOfDaysOfTravel;
+
+ @Asn1Optional public SequenceOfActivatedDays activatedDay;
+
+ @Asn1Optional public SequenceOfCountries countries;
+
+ @Asn1Optional public SequenceOfCarrierNum includedCarriersNum;
+
+ @Asn1Optional public SequenceOfStringIA5 includedCarriersIA5;
+
+ @Asn1Optional public SequenceOfCarrierNum excludedCarriersNum;
+
+ @Asn1Optional public SequenceOfStringIA5 excludedCarriersIA5;
+
+ @Asn1Optional public SequenceOfServiceBrands includedServiceBrands;
+
+ @Asn1Optional public SequenceOfServiceBrands excludedServiceBrands;
+
+ @Asn1Optional public SequenceOfRegionalValidityType validRegion;
+
+ @Asn1Optional public SequenceOfTariffType tariffs;
+
+ @Asn1Optional Asn1BigInteger price;
+
+ @Asn1Optional SequenceOfVatDetail vatDetails;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String infoText;
+
+ @Asn1Optional public ExtensionData extension;
+
+
+
+
+
+ public Asn1BigInteger getReferenceNum() {
+
+ return this.referenceNum;
+ }
+
+ public String getReferenceIA5() {
+
+ return this.referenceIA5;
+ }
+
+ public Long getProductOwnerNum() {
+
+ return this.productOwnerNum;
+ }
+
+ public String getProductOwnerIA5() {
+
+ return this.productOwnerIA5;
+ }
+
+ public Long getProductIdNum() {
+
+ return this.productIdNum;
+ }
+
+ public String getProductIdIA5() {
+
+ return this.productIdIA5;
+ }
+
+ public Long getPassType() {
+
+ return this.passType;
+ }
+
+ public String getPassDescription() {
+
+ return this.passDescription;
+ }
+
+ public TravelClassType getClassCode() {
+
+ if (classCode == null){
+ return TravelClassType.second;
+ }
+
+ return this.classCode;
+ }
+
+ public Long getValidFromDay() {
+
+ return this.validFromDay;
+ }
+
+ public Long getValidFromTime() {
+
+ return this.validFromTime;
+ }
+
+ public Long getValidUntilDay() {
+
+ return this.validUntilDay;
+ }
+
+ public Long getValidUntilTime() {
+
+ return this.validUntilTime;
+ }
+
+ public ValidityPeriodDetailType getValidityPeriodDetails() {
+
+ return this.validityPeriodDetails;
+ }
+
+ public Long getNumberOfValidityDays() {
+
+ return this.numberOfValidityDays;
+ }
+
+ public Long getNumberOfPossibleTrips() {
+
+ return this.numberOfPossibleTrips;
+ }
+
+ public Long getNumberOfDaysOfTravel() {
+
+ return this.numberOfDaysOfTravel;
+ }
+
+ public List<Long> getActivatedDay() {
+
+ return this.activatedDay;
+ }
+
+ public List<Long> getCountries() {
+
+ return this.countries;
+ }
+
+ public List<Long> getIncludedCarriersNum() {
+
+ return this.includedCarriersNum;
+ }
+
+ public List<String> getIncludedCarriersIA5() {
+
+ return this.includedCarriersIA5;
+ }
+
+ public List<Long> getExcludedCarriersNum() {
+
+ return this.excludedCarriersNum;
+ }
+
+ public SequenceOfStringIA5 getExcludedCarriersIA5() {
+
+ return this.excludedCarriersIA5;
+ }
+
+ public SequenceOfServiceBrands getIncludedServiceBrands() {
+
+ return this.includedServiceBrands;
+ }
+
+ public SequenceOfServiceBrands getExcludedServiceBrands() {
+
+ return this.excludedServiceBrands;
+ }
+
+ public List<RegionalValidityType> getValidRegion() {
+
+ return this.validRegion;
+ }
+
+ public List<TariffType> getTariffs() {
+
+ return this.tariffs;
+ }
+
+ public String getInfoText() {
+
+ return this.infoText;
+ }
+
+ public ExtensionData getExtension() {
+
+ return this.extension;
+ }
+
+ public void setReferenceNum(Asn1BigInteger referenceNum) {
+
+ this.referenceNum = referenceNum;
+ }
+
+ public void setReferenceIA5(String referenceIA5) {
+
+ this.referenceIA5 = referenceIA5;
+ }
+
+ public void setProductOwnerNum(Long productOwnerNum) {
+
+ this.productOwnerNum = productOwnerNum;
+ }
+
+ public void setProductOwnerIA5(String productOwnerIA5) {
+
+ this.productOwnerIA5 = productOwnerIA5;
+ }
+
+ public void setProductIdNum(Long productIdNum) {
+
+ this.productIdNum = productIdNum;
+ }
+
+ public void setProductIdIA5(String productIdIA5) {
+
+ this.productIdIA5 = productIdIA5;
+ }
+
+ public void setPassType(Long passType) {
+
+ this.passType = passType;
+ }
+
+ public void setPassDescription(String passDescription) {
+
+ this.passDescription = passDescription;
+ }
+
+ public void setClassCode(TravelClassType classCode) {
+
+ this.classCode = classCode;
+ }
+
+ public void setValidFromDay(Long validFromDay) {
+
+ this.validFromDay = validFromDay;
+ }
+
+ public void setValidFromTime(Long validFromTime) {
+
+ this.validFromTime = validFromTime;
+ }
+
+ public void setValidUntilDay(Long validUntilDay) {
+
+ this.validUntilDay = validUntilDay;
+ }
+
+ public void setValidUntilTime(Long validUntilTime) {
+
+ this.validUntilTime = validUntilTime;
+ }
+
+ public void setValidityPeriodDetails(ValidityPeriodDetailType validityPeriodDetails) {
+
+ this.validityPeriodDetails = validityPeriodDetails;
+ }
+
+ public void setNumberOfValidityDays(Long numberOfValidityDays) {
+
+ this.numberOfValidityDays = numberOfValidityDays;
+ }
+
+ public void setNumberOfPossibleTrips(Long numberOfPossibleTrips) {
+
+ this.numberOfPossibleTrips = numberOfPossibleTrips;
+ }
+
+ public void setNumberOfDaysOfTravel(Long numberOfDaysOfTravel) {
+
+ this.numberOfDaysOfTravel = numberOfDaysOfTravel;
+ }
+
+ public void setActivatedDay(SequenceOfActivatedDays activatedDay) {
+
+ this.activatedDay = activatedDay;
+ }
+
+ public void setCountries(SequenceOfCountries countries) {
+
+ this.countries = countries;
+ }
+
+ public void setIncludedCarriersNum(SequenceOfCarrierNum includedCarriersNum) {
+
+ this.includedCarriersNum = includedCarriersNum;
+ }
+
+ public void setIncludedCarriersIA5(SequenceOfStringIA5 includedCarriersIA5) {
+
+ this.includedCarriersIA5 = includedCarriersIA5;
+ }
+
+ public void setExcludedCarriersNum(SequenceOfCarrierNum excludedCarriersNum) {
+
+ this.excludedCarriersNum = excludedCarriersNum;
+ }
+
+ public void setExcludedCarriersIA5(SequenceOfStringIA5 excludedCarriersIA5) {
+
+ this.excludedCarriersIA5 = excludedCarriersIA5;
+ }
+
+ public void setIncludedServiceBrands(SequenceOfServiceBrands includedServiceBrands) {
+
+ this.includedServiceBrands = includedServiceBrands;
+ }
+
+ public void setExcludedServiceBrands(SequenceOfServiceBrands excludedServiceBrands) {
+
+ this.excludedServiceBrands = excludedServiceBrands;
+ }
+
+ public void setValidRegion(SequenceOfRegionalValidityType validRegion) {
+
+ this.validRegion = validRegion;
+ }
+
+ public void setTariffs(SequenceOfTariffType tariffs) {
+
+ this.tariffs = tariffs;
+ }
+
+ public void setInfoText(String infoText) {
+
+ this.infoText = infoText;
+ }
+
+ public void setExtension(ExtensionData extension) {
+
+ this.extension = extension;
+ }
+
+ public Long getPrice() {
+ return Asn1BigInteger.toLong(price);
+ }
+
+ public void setPrice(Long price) {
+ this.price = Asn1BigInteger.toAsn1(price);
+ }
+
+ public SequenceOfVatDetail getVatDetails() {
+ return vatDetails;
+ }
+
+ public void setVatDetails(SequenceOfVatDetail vatDetails) {
+ this.vatDetails = vatDetails;
+ }
+
+ public void addVatDetail(VatDetailType vatDetail) {
+ if (this.vatDetails == null) {
+ this.vatDetails = new SequenceOfVatDetail();
+ }
+ this.vatDetails.add(vatDetail);
+ }
+
+ public void setValidityDates (Date fromDate, Date untilDate, Date issuingDate){
+
+ if (issuingDate == null || fromDate == null) return;
+
+ this.validFromDay = DateTimeUtils.getDateDifference(issuingDate,fromDate);
+ this.validFromTime = DateTimeUtils.getTime(fromDate);
+
+ if (untilDate != null){
+ this.validUntilDay = DateTimeUtils.getDateDifference(fromDate, untilDate);
+ this.validUntilTime = DateTimeUtils.getTime(untilDate);
+ }
+
+ }
+
+ public Date getValidFromDate(Date issuingDate){
+
+ return DateTimeUtils.getDate(issuingDate, this.validFromDay, this.validFromTime);
+
+ }
+
+ public Date getValidUntilDate(Date issuingDate){
+
+ if (issuingDate == null) return null;
+
+ if (this.validFromDay == null) {
+ this.validFromDay = 0L;
+ }
+
+ if (this.validUntilDay == null) {
+ return null;
+ }
+
+
+ return DateTimeUtils.getDate(issuingDate, this.validFromDay + this.validUntilDay, this.validUntilTime);
+
+ }
+
+ public void setActivatedDays(Collection<Date> dates, Date issuingDate){
+
+ if (this.activatedDay != null) {
+ this.activatedDay.clear();
+ } else {
+ this.activatedDay= new SequenceOfActivatedDays();
+ }
+
+ if (dates != null && !dates.isEmpty()) {
+
+ for (Date day : dates) {
+ this.addActivatedDay(issuingDate, day);
+ }
+
+ }
+
+ }
+
+ public void addActivatedDay(Date issuingDate, Date day){
+
+ Long dayDiff = DateTimeUtils.getDateDifference(issuingDate, day);
+
+ if (this.activatedDay == null) {
+ this.activatedDay = new SequenceOfActivatedDays();
+ }
+
+ if (dayDiff != null) {
+ this.activatedDay.add(dayDiff);
+ }
+
+ }
+
+ public Collection<Date> getActivatedDays(Date issuingDate) {
+
+ if (this.activatedDay == null) return null;
+
+ ArrayList<Date> dates = new ArrayList<Date>();
+
+ for (Long diff: this.getActivatedDay()) {
+
+ Date day = DateTimeUtils.getDate(issuingDate, diff, null);
+
+ if (day != null) {
+ dates.add(day);
+ }
+
+ }
+
+ return dates;
+
+ }
+
+ public Long getValidFromUTCOffset() {
+ return validFromUTCOffset;
+ }
+
+ public void setValidFromUTCOffset(Long validFromUTCOffset) {
+ this.validFromUTCOffset = validFromUTCOffset;
+ }
+
+ public Long getValidUntilUTCOffset() {
+ return validUntilUTCOffset;
+ }
+
+ public void setValidUntilUTCOffset(Long validUntilUTCOffset) {
+ this.validUntilUTCOffset = validUntilUTCOffset;
+ }
+
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/PassengerType.java b/src/org/uic/ticket/api/asn/omv2/PassengerType.java
new file mode 100644
index 0000000..3b8016d
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/PassengerType.java
@@ -0,0 +1,46 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+
+@HasExtensionMarker
+public enum PassengerType {
+ adult("adult"),
+ senior("senior"),
+ child("child"),
+ youth("youth"),
+ dog("dog"),
+ bicycle("bicycle"),
+ freeAddonPassenger("freeAddonPassenger"),
+ freeAddonChild("freeAddonChild");
+
+ public String text;
+
+ PassengerType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/PlacesType.java b/src/org/uic/ticket/api/asn/omv2/PlacesType.java
new file mode 100644
index 0000000..e463b3d
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/PlacesType.java
@@ -0,0 +1,125 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+import net.gcdc.asn1.datatypesimpl.SequenceOfStringIA5;
+
+@Sequence
+public class PlacesType extends Object {
+ public PlacesType() {
+ }
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String coach;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String placeString;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String placeDescription;
+
+ @Asn1Optional public SequenceOfStringIA5 placeIA5;
+
+ @Asn1Optional public SequenceOfPlaceNum placeNum;
+
+
+
+ public String getCoach() {
+
+ return this.coach;
+ }
+
+ public String getPlaceString() {
+
+ return this.placeString;
+ }
+
+ public String getPlaceDescription() {
+
+ return this.placeDescription;
+ }
+
+ public SequenceOfStringIA5 getPlaceIA5() {
+
+ return this.placeIA5;
+ }
+
+ public SequenceOfPlaceNum getPlaceNum() {
+
+ return this.placeNum;
+ }
+
+ public void setCoach(String coach) {
+
+ this.coach = coach;
+ }
+
+ public void setPlaceString(String placeString) {
+
+ this.placeString = placeString;
+ }
+
+ public void setPlaceDescription(String placeDescription) {
+
+ this.placeDescription = placeDescription;
+ }
+
+ public void setPlaceIA5(SequenceOfStringIA5 placeIA5) {
+
+ this.placeIA5 = placeIA5;
+ }
+
+ public void setPlaceNum(SequenceOfPlaceNum placeNum) {
+
+ this.placeNum = placeNum;
+ }
+
+ @Override
+ public boolean equals(Object anObject) {
+ if (this == anObject) return true;
+ if ((anObject == null) || (anObject.getClass() != this.getClass())) return false;
+
+ PlacesType comparator = (PlacesType)anObject;
+
+ if ((this.getCoach() != comparator.getCoach()) && ((this.getCoach() == null) || (! this.getCoach().equals(comparator.getCoach())))) return false;
+ if ((this.getPlaceString() != comparator.getPlaceString()) && ((this.getPlaceString() == null) || (! this.getPlaceString().equals(comparator.getPlaceString())))) return false;
+ if ((this.getPlaceDescription() != comparator.getPlaceDescription()) && ((this.getPlaceDescription() == null) || (! this.getPlaceDescription().equals(comparator.getPlaceDescription())))) return false;
+ if ((this.getPlaceIA5() != comparator.getPlaceIA5()) && ((this.getPlaceIA5() == null) || (! this.getPlaceIA5().equals(comparator.getPlaceIA5())))) return false;
+ if ((this.getPlaceNum() != comparator.getPlaceNum()) && ((this.getPlaceNum() == null) || (! this.getPlaceNum().equals(comparator.getPlaceNum())))) return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 5477;
+
+ hash = 3547 * hash + (null == this.getCoach() ? 0 : this.getCoach().hashCode());
+ hash = 7321 * hash + (null == this.getPlaceString() ? 0 : this.getPlaceString().hashCode());
+ hash = 2083 * hash + (null == this.getPlaceDescription() ? 0 : this.getPlaceDescription().hashCode());
+ hash = 881 * hash + (null == this.getPlaceIA5() ? 0 : this.getPlaceIA5().hashCode());
+ hash = 6679 * hash + (null == this.getPlaceNum() ? 0 : this.getPlaceNum().hashCode());
+ return hash;
+ }
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/PolygoneType.java b/src/org/uic/ticket/api/asn/omv2/PolygoneType.java
new file mode 100644
index 0000000..a5c1986
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/PolygoneType.java
@@ -0,0 +1,55 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Sequence;
+
+@Sequence
+public class PolygoneType extends Object {
+ public PolygoneType() {
+ }
+
+ public GeoCoordinateType firstEdge;
+
+ public SequenceOfDeltaCoordinates edges;
+
+
+ public GeoCoordinateType getFirstEdge() {
+
+ return this.firstEdge;
+ }
+
+ public SequenceOfDeltaCoordinates getEdges() {
+
+ return this.edges;
+ }
+
+ public void setFirstEdge(GeoCoordinateType firstEdge) {
+
+ this.firstEdge = firstEdge;
+ }
+
+ public void setEdges(SequenceOfDeltaCoordinates edges) {
+
+ this.edges = edges;
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/PriceTypeType.java b/src/org/uic/ticket/api/asn/omv2/PriceTypeType.java
new file mode 100644
index 0000000..3f8a6db
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/PriceTypeType.java
@@ -0,0 +1,39 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+public enum PriceTypeType {
+ noPrice("noPrice"),
+ reservationFee("reservationFee"),
+ supplement("supplement"),
+ travelPrice("travelPrice");
+
+
+ public String text;
+
+ PriceTypeType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/RegionalValidityType.java b/src/org/uic/ticket/api/asn/omv2/RegionalValidityType.java
new file mode 100644
index 0000000..307fb5b
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/RegionalValidityType.java
@@ -0,0 +1,94 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Choice;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+
+
+@Choice
+@HasExtensionMarker
+public class RegionalValidityType extends Object {
+ public RegionalValidityType() {
+ }
+
+ public TrainLinkType trainLink;
+
+ public ViaStationType viaStations;
+
+ public ZoneType zones;
+
+ public LineType lines;
+
+ public PolygoneType polygone;
+
+
+ public TrainLinkType getTrainLink() {
+
+ return this.trainLink;
+ }
+
+ public ViaStationType getViaStations() {
+
+ return this.viaStations;
+ }
+
+ public ZoneType getZones() {
+
+ return this.zones;
+ }
+
+ public LineType getLines() {
+
+ return this.lines;
+ }
+
+ public PolygoneType getPolygone() {
+
+ return this.polygone;
+ }
+
+ public void setTrainLink(TrainLinkType trainLink) {
+
+ this.trainLink = trainLink;
+ }
+
+ public void setViaStations(ViaStationType viaStations) {
+
+ this.viaStations = viaStations;
+ }
+
+ public void setZones(ZoneType zones) {
+
+ this.zones = zones;
+ }
+
+ public void setLines(LineType lines) {
+
+ this.lines = lines;
+ }
+
+ public void setPolygone(PolygoneType polygone) {
+
+ this.polygone = polygone;
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/RegisteredLuggageType.java b/src/org/uic/ticket/api/asn/omv2/RegisteredLuggageType.java
new file mode 100644
index 0000000..f50cc51
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/RegisteredLuggageType.java
@@ -0,0 +1,76 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+
+@Sequence
+@HasExtensionMarker
+public class RegisteredLuggageType extends Object {
+ public RegisteredLuggageType() {
+ }
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String registrationId;
+
+ @IntRange(minValue=1,maxValue=99)
+ @Asn1Optional public Long maxWeight;
+
+ @IntRange(minValue=1,maxValue=300)
+ @Asn1Optional public Long maxSize;
+
+ public String getRegistrationId() {
+
+ return this.registrationId;
+ }
+
+ public Long getMaxWeight() {
+
+ return this.maxWeight;
+ }
+
+ public Long getMaxSize() {
+
+ return this.maxSize;
+ }
+
+ public void setRegistrationId(String registrationId) {
+
+ this.registrationId = registrationId;
+ }
+
+ public void setMaxWeight(Long maxWeight) {
+
+ this.maxWeight = maxWeight;
+ }
+
+ public void setMaxSize(Long maxSize) {
+
+ this.maxSize = maxSize;
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/ReservationData.java b/src/org/uic/ticket/api/asn/omv2/ReservationData.java
new file mode 100644
index 0000000..f8a6748
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/ReservationData.java
@@ -0,0 +1,664 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Date;
+import java.util.List;
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+import net.gcdc.asn1.datatypes.SizeRange;
+import net.gcdc.asn1.datatypesimpl.SequenceOfStringIA5;
+
+@Sequence
+@HasExtensionMarker
+public class ReservationData extends Object {
+ public ReservationData() {
+ }
+
+ @Asn1Optional public Asn1BigInteger trainNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String trainIA5;
+
+ @Asn1Default(value="0")
+ @IntRange(minValue=-1,maxValue=370)
+ @Asn1Optional public Long departureDate;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String referenceIA5;
+
+ @Asn1Optional public Asn1BigInteger referenceNum;
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long productOwnerNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productOwnerIA5;
+
+ @IntRange(minValue=0,maxValue=65535)
+ @Asn1Optional public Long productIdNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productIdIA5;
+
+ @IntRange(minValue=0,maxValue=32000)
+ @Asn1Optional public Long serviceBrand;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String serviceBrandAbrUTF8;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String serviceBrandNameUTF8;
+
+ @Asn1Default("seat")
+ @Asn1Optional public ServiceType service;
+
+ @Asn1Default("stationUICReservation")
+ @Asn1Optional public CodeTableType stationCodeTable;
+
+ @IntRange(minValue=1,maxValue=9999999)
+ @Asn1Optional public Long fromStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String fromStationIA5;
+
+ @IntRange(minValue=1,maxValue=9999999)
+ @Asn1Optional public Long toStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String toStationIA5;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String fromStationNameUTF8;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String toStationNameUTF8;
+
+ @IntRange(minValue=0,maxValue=1440)
+ public Long departureTime;
+
+ @IntRange(minValue=-60, maxValue=60)
+ @Asn1Optional public Long departureUTCOffset;
+
+ @IntRange(minValue=-1,maxValue=20)
+ @Asn1Default(value="0")
+ @Asn1Optional public Long arrivalDate;
+
+ @IntRange(minValue=0,maxValue=1439)
+ @Asn1Optional public Long arrivalTime;
+
+ @IntRange(minValue=-60, maxValue=60)
+ @Asn1Optional public Long arrivalUTCOffset;
+
+ @Asn1Optional public SequenceOfCarrierNum carrierNum;
+
+ @Asn1Optional public SequenceOfStringIA5 carrierIA5;
+
+ @Asn1Default("second")
+ @Asn1Optional public TravelClassType classCode;
+
+ @SizeRange(minValue = 1, maxValue = 2)
+ @Asn1Optional public String serviceLevel;
+
+ @Asn1Optional public PlacesType places;
+
+ @Asn1Optional public PlacesType additionalPlaces;
+
+ @Asn1Optional public PlacesType bicyclePlaces;
+
+ @Asn1Optional public CompartmentDetailsType compartmentDetails;
+
+ @IntRange(minValue=0,maxValue=200)
+ @Asn1Default(value="0")
+ @Asn1Optional public Long numberOfOverbooked;
+
+ @Asn1Optional public SequenceOfBerthDetailData berth;
+
+ @Asn1Optional public SequenceOfTariffType tariff;
+
+ @Asn1Default("travelPrice")
+ @Asn1Optional public PriceTypeType priceType;
+
+ @Asn1Optional Asn1BigInteger price;
+
+ @Asn1Optional SequenceOfVatDetail vatDetails;
+
+ @IntRange(minValue=0,maxValue=9)
+ @Asn1Default("0")
+ @Asn1Optional public Long typeOfSupplement;
+
+ @IntRange(minValue=0,maxValue=200)
+ @Asn1Default("0")
+ @Asn1Optional public Long numberOfSupplements;
+
+ @Asn1Optional public LuggageRestrictionType luggage;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String infoText;
+
+ @Asn1Optional public ExtensionData extension;
+
+ public Long getTrainNum() {
+
+ return Asn1BigInteger.toLong(this.trainNum);
+ }
+
+ public String getTrainIA5() {
+ return this.trainIA5;
+ }
+
+ public Long getDepartureDate() {
+ return this.departureDate;
+ }
+
+ public String getReferenceIA5() {
+ return this.referenceIA5;
+ }
+
+ public Long getReferenceNum() {
+ return Asn1BigInteger.toLong(this.referenceNum);
+ }
+
+ public Long getProductOwnerNum() {
+ return this.productOwnerNum;
+ }
+
+ public String getProductOwnerIA5() {
+ return this.productOwnerIA5;
+ }
+
+ public Long getProductIdNum() {
+ return this.productIdNum;
+ }
+
+ public String getProductIdIA5() {
+ return this.productIdIA5;
+ }
+
+ public Long getServiceBrand() {
+ return this.serviceBrand;
+ }
+
+ public String getServiceBrandAbrUTF8() {
+ return this.serviceBrandAbrUTF8;
+ }
+
+ public String getServiceBrandNameUTF8() {
+ return this.serviceBrandNameUTF8;
+ }
+
+ public ServiceType getService() {
+
+ if (service == null){
+ return ServiceType.seat;
+ }
+
+ return this.service;
+ }
+
+ public CodeTableType getStationCodeTable() {
+
+ if (stationCodeTable == null) {
+ return CodeTableType.stationUICReservation;
+ }
+
+ return this.stationCodeTable;
+ }
+
+ public Long getFromStationNum() {
+
+ return this.fromStationNum;
+ }
+
+ public String getFromStationIA5() {
+
+ return this.fromStationIA5;
+ }
+
+ public Long getToStationNum() {
+
+ return this.toStationNum;
+ }
+
+ public String getToStationIA5() {
+
+ return this.toStationIA5;
+ }
+
+ public String getFromStationNameUTF8() {
+
+ return this.fromStationNameUTF8;
+ }
+
+ public String getToStationNameUTF8() {
+
+ return this.toStationNameUTF8;
+ }
+
+ public Long getDepartureTime() {
+
+ return this.departureTime;
+ }
+
+ public Long getArrivalDate() {
+
+ if (arrivalDate == null) {
+ return new Long(0);
+ }
+
+ return this.arrivalDate;
+ }
+
+ public Long getArrivalTime() {
+
+ return this.arrivalTime;
+ }
+
+ public List<Long> getCarrierNum() {
+
+ return this.carrierNum;
+ }
+
+ public List<String> getCarrierIA5() {
+
+ return this.carrierIA5;
+ }
+
+ public TravelClassType getClassCode() {
+
+
+ if (classCode == null) {
+ return TravelClassType.second;
+ }
+
+ return this.classCode;
+ }
+
+ public String getServiceLevel() {
+
+ return this.serviceLevel;
+ }
+
+ public PlacesType getPlaces() {
+
+ return this.places;
+ }
+
+ public PlacesType getAdditionalPlaces() {
+
+ return this.additionalPlaces;
+ }
+
+ public PlacesType getBicyclePlaces() {
+
+ return this.bicyclePlaces;
+ }
+
+ public CompartmentDetailsType getCompartmentDetails() {
+
+ return this.compartmentDetails;
+ }
+
+ public Long getNumberOfOverbooked() {
+
+ return this.numberOfOverbooked;
+ }
+
+ public List<BerthDetailData> getBerth() {
+
+ return this.berth;
+ }
+
+ public List<TariffType> getTariff() {
+
+ return this.tariff;
+ }
+
+ public PriceTypeType getPriceType() {
+
+ if (priceType == null) {
+ return PriceTypeType.travelPrice;
+ }
+
+ return this.priceType;
+ }
+
+ public Long getTypeOfSupplement() {
+
+ if (typeOfSupplement == null){
+ return new Long(0);
+ }
+
+
+ return this.typeOfSupplement;
+ }
+
+ public Long getNumberOfSupplements() {
+
+ if (numberOfSupplements == null) {
+ return new Long(0);
+ }
+
+ return this.numberOfSupplements;
+ }
+
+ public LuggageRestrictionType getLuggage() {
+
+ return this.luggage;
+ }
+
+ public String getInfoText() {
+
+ return this.infoText;
+ }
+
+ public ExtensionData getExtension() {
+
+ return this.extension;
+ }
+
+ public void setTrainNum(Long trainNum) {
+
+ this.trainNum = Asn1BigInteger.toAsn1(trainNum);
+ }
+
+ public void setTrainIA5(String trainIA5) {
+
+ this.trainIA5 = trainIA5;
+ }
+
+ public void setDepartureDate(Long departureDate) {
+
+ this.departureDate = departureDate;
+ }
+
+ public void setReferenceIA5(String referenceIA5) {
+
+ this.referenceIA5 = referenceIA5;
+ }
+
+ public void setReferenceNum(Long referenceNum) {
+ this.referenceNum = Asn1BigInteger.toAsn1(referenceNum);
+ }
+
+ public void setProductOwnerNum(Long productOwnerNum) {
+
+ this.productOwnerNum = productOwnerNum;
+ }
+
+ public void setProductOwnerIA5(String productOwnerIA5) {
+
+ this.productOwnerIA5 = productOwnerIA5;
+ }
+
+ public void setProductIdNum(Long productIdNum) {
+
+ this.productIdNum = productIdNum;
+ }
+
+ public void setProductIdIA5(String productIdIA5) {
+
+ this.productIdIA5 = productIdIA5;
+ }
+
+ public void setServiceBrand(Long serviceBrand) {
+
+ this.serviceBrand = serviceBrand;
+ }
+
+ public void setServiceBrandAbrUTF8(String serviceBrandAbrUTF8) {
+
+ this.serviceBrandAbrUTF8 = serviceBrandAbrUTF8;
+ }
+
+ public void setServiceBrandNameUTF8(String serviceBrandNameUTF8) {
+
+ this.serviceBrandNameUTF8 = serviceBrandNameUTF8;
+ }
+
+ public void setService(ServiceType service) {
+
+ this.service = service;
+ }
+
+ public void setStationCodeTable(CodeTableType stationCodeTable) {
+
+ this.stationCodeTable = stationCodeTable;
+ }
+
+ public void setFromStationNum(Long fromStationNum) {
+
+ this.fromStationNum = fromStationNum;
+ }
+
+ public void setFromStationIA5(String fromStationIA5) {
+
+ this.fromStationIA5 = fromStationIA5;
+ }
+
+ public void setToStationNum(Long toStationNum) {
+
+ this.toStationNum = toStationNum;
+ }
+
+ public void setToStationIA5(String toStationIA5) {
+
+ this.toStationIA5 = toStationIA5;
+ }
+
+ public void setFromStationNameUTF8(String fromStationNameUTF8) {
+
+ this.fromStationNameUTF8 = fromStationNameUTF8;
+ }
+
+ public void setToStationNameUTF8(String toStationNameUTF8) {
+
+ this.toStationNameUTF8 = toStationNameUTF8;
+ }
+
+ public void setDepartureTime(Long departureTime) {
+
+ this.departureTime = departureTime;
+ }
+
+ public void setArrivalDate(Long arrivalDate) {
+
+ this.arrivalDate = arrivalDate;
+ }
+
+ public void setArrivalTime(Long arrivalTime) {
+
+ this.arrivalTime = arrivalTime;
+ }
+
+ public void setCarrierNum(SequenceOfCarrierNum carrierNum) {
+
+ this.carrierNum = carrierNum;
+ }
+
+ public void setCarriersNum(List<Long> longs) {
+ if (longs == null) return;
+
+ this.carrierNum = new SequenceOfCarrierNum();
+ this.carrierNum.addAll(longs);
+ }
+
+ public void setCarrierIA5(SequenceOfStringIA5 carrierIA5) {
+
+ this.carrierIA5 = carrierIA5;
+ }
+
+ public void setClassCode(TravelClassType classCode) {
+
+ this.classCode = classCode;
+ }
+
+ public void setServiceLevel(String serviceLevel) {
+
+ this.serviceLevel = serviceLevel;
+ }
+
+ public void setPlaces(PlacesType places) {
+
+ this.places = places;
+ }
+
+ public void setAdditionalPlaces(PlacesType additionalPlaces) {
+
+ this.additionalPlaces = additionalPlaces;
+ }
+
+ public void setBicyclePlaces(PlacesType bicyclePlaces) {
+
+ this.bicyclePlaces = bicyclePlaces;
+ }
+
+ public void setCompartmentDetails(CompartmentDetailsType compartmentDetails) {
+
+ this.compartmentDetails = compartmentDetails;
+ }
+
+ public void setNumberOfOverbooked(Long numberOfOverbooked) {
+
+ this.numberOfOverbooked = numberOfOverbooked;
+ }
+
+ public void setBerth(SequenceOfBerthDetailData berth) {
+
+ this.berth = berth;
+ }
+
+ public void setTariff(SequenceOfTariffType tariff) {
+
+ this.tariff = tariff;
+ }
+
+ public void setPriceType(PriceTypeType priceType) {
+
+ this.priceType = priceType;
+ }
+
+ public void setTypeOfSupplement(Long typeOfSupplement) {
+
+ this.typeOfSupplement = typeOfSupplement;
+ }
+
+ public void setNumberOfSupplements(Long numberOfSupplements) {
+
+ this.numberOfSupplements = numberOfSupplements;
+ }
+
+ public void setLuggage(LuggageRestrictionType luggage) {
+
+ this.luggage = luggage;
+ }
+
+ public void setInfoText(String infoText) {
+
+ this.infoText = infoText;
+ }
+
+ public void setExtension(ExtensionData extension) {
+
+ this.extension = extension;
+ }
+
+ public Long getPrice() {
+ return Asn1BigInteger.toLong(price);
+ }
+
+ public void setPrice(Long price) {
+ this.price = Asn1BigInteger.toAsn1(price);
+ }
+
+ public SequenceOfVatDetail getVatDetails() {
+ return vatDetails;
+ }
+
+ public void setVatDetails(SequenceOfVatDetail vatDetails) {
+ this.vatDetails = vatDetails;
+ }
+
+ public void addVatDetail(VatDetailType vatDetail) {
+ if (this.vatDetails == null) {
+ this.vatDetails = new SequenceOfVatDetail();
+ }
+ this.vatDetails.add(vatDetail);
+ }
+
+ public void setDepartureArrivalDates (Date departure, Date arrival, Date issuingDate){
+
+ if (issuingDate == null || departure == null) return;
+
+ this.departureDate = DateTimeUtils.getDateDifference(issuingDate,departure);
+ this.departureTime = DateTimeUtils.getTime(departure);
+
+ if (arrival != null){
+ this.arrivalDate = DateTimeUtils.getDateDifference(departure, arrival);
+ this.arrivalTime = DateTimeUtils.getTime(arrival);
+ }
+
+ }
+
+ public Date getDepartureDate(Date issuingDate){
+
+ return DateTimeUtils.getDate(issuingDate, this.departureDate, this.departureTime);
+
+ }
+
+ public Date getArrivalDate(Date issuingDate){
+
+ if (this.departureDate == null) {
+ this.departureDate = 0L;
+ }
+
+ if (this.arrivalDate == null) {
+ return null;
+ }
+
+ return DateTimeUtils.getDate(issuingDate, this.departureDate + this.arrivalDate, this.arrivalTime);
+ }
+
+ public Long getDepartureUTCOffset() {
+ return departureUTCOffset;
+ }
+
+ public void setDepartureUTCOffset(Long departureUTCOffset) {
+ this.departureUTCOffset = departureUTCOffset;
+ }
+
+ public Long getArrivalUTCOffset() {
+ return arrivalUTCOffset;
+ }
+
+ public void setArrivalUTCOffset(Long arrivalUTCOffset) {
+ this.arrivalUTCOffset = arrivalUTCOffset;
+ }
+
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/ReturnRouteDescriptionType.java b/src/org/uic/ticket/api/asn/omv2/ReturnRouteDescriptionType.java
new file mode 100644
index 0000000..d0f8c9d
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/ReturnRouteDescriptionType.java
@@ -0,0 +1,141 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.List;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+@Sequence
+@HasExtensionMarker
+public class ReturnRouteDescriptionType extends Object {
+ public ReturnRouteDescriptionType() {
+ }
+
+ @IntRange(minValue=1,maxValue=9999999)
+ @Asn1Optional public Long fromStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String fromStationIA5;
+
+ @IntRange(minValue=1,maxValue=9999999)
+ @Asn1Optional public Long toStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String toStationIA5;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String fromStationNameUTF8;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String toStationNameUTF8;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String validReturnRegionDesc;
+
+ @Asn1Optional public SequenceOfRegionalValidityType validReturnRegion;
+
+ public Long getFromStationNum() {
+
+ return this.fromStationNum;
+ }
+
+ public String getFromStationIA5() {
+
+ return this.fromStationIA5;
+ }
+
+ public Long getToStationNum() {
+
+ return this.toStationNum;
+ }
+
+ public String getToStationIA5() {
+
+ return this.toStationIA5;
+ }
+
+ public String getFromStationNameUTF8() {
+
+ return this.fromStationNameUTF8;
+ }
+
+ public String getToStationNameUTF8() {
+
+ return this.toStationNameUTF8;
+ }
+
+ public String getValidReturnRegionDesc() {
+
+ return this.validReturnRegionDesc;
+ }
+
+ public List<RegionalValidityType> getValidReturnRegion() {
+
+ return this.validReturnRegion;
+ }
+
+ public void setFromStationNum(Long fromStationNum) {
+
+ this.fromStationNum = fromStationNum;
+ }
+
+ public void setFromStationIA5(String fromStationIA5) {
+
+ this.fromStationIA5 = fromStationIA5;
+ }
+
+ public void setToStationNum(Long toStationNum) {
+
+ this.toStationNum = toStationNum;
+ }
+
+ public void setToStationIA5(String toStationIA5) {
+
+ this.toStationIA5 = toStationIA5;
+ }
+
+ public void setFromStationNameUTF8(String fromStationNameUTF8) {
+
+ this.fromStationNameUTF8 = fromStationNameUTF8;
+ }
+
+ public void setToStationNameUTF8(String toStationNameUTF8) {
+
+ this.toStationNameUTF8 = toStationNameUTF8;
+ }
+
+ public void setValidReturnRegionDesc(String validReturnRegionDesc) {
+
+ this.validReturnRegionDesc = validReturnRegionDesc;
+ }
+
+ public void setValidReturnRegion(SequenceOfRegionalValidityType validReturnRegion) {
+
+ this.validReturnRegion = validReturnRegion;
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/RoofRackType.java b/src/org/uic/ticket/api/asn/omv2/RoofRackType.java
new file mode 100644
index 0000000..a71fd27
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/RoofRackType.java
@@ -0,0 +1,46 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+
+@HasExtensionMarker
+public enum RoofRackType {
+ norack("norack"),
+ roofRailing("roofRailing"),
+ luggageRack("luggageRack"),
+ skiRack("skiRack"),
+ boxRack("boxRack"),
+ rackWithOneBox("rackWithOneBox"),
+ rackWithTwoBoxes("rackWithTwoBoxes"),
+ bicycleRack("bicycleRack"),
+ otherRack("otherRack");
+
+ public String text;
+
+ RoofRackType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/RouteSectionType.java b/src/org/uic/ticket/api/asn/omv2/RouteSectionType.java
new file mode 100644
index 0000000..3093d02
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/RouteSectionType.java
@@ -0,0 +1,128 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+
+public class RouteSectionType extends Object {
+ public RouteSectionType() {
+ }
+
+ @Asn1Default("stationUIC")
+ @Asn1Optional public CodeTableType stationCodeTable;
+
+ @IntRange(minValue=1,maxValue=9999999)
+ @Asn1Optional public Long fromStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String fromStationIA5;
+
+ @IntRange(minValue=1,maxValue=9999999)
+ @Asn1Optional public Long toStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String toStationIA5;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String fromStationNameUTF8;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String toStationNameUTF8;
+
+ public CodeTableType getStationCodeTable() {
+
+ if (stationCodeTable == null) {
+ return CodeTableType.stationUIC;
+ }
+
+ return this.stationCodeTable;
+ }
+
+ public Long getFromStationNum() {
+
+ return this.fromStationNum;
+ }
+
+ public String getFromStationIA5() {
+
+ return this.fromStationIA5;
+ }
+
+ public Long getToStationNum() {
+
+ return this.toStationNum;
+ }
+
+ public String getToStationIA5() {
+
+ return this.toStationIA5;
+ }
+
+ public String getFromStationNameUTF8() {
+
+ return this.fromStationNameUTF8;
+ }
+
+ public String getToStationNameUTF8() {
+
+ return this.toStationNameUTF8;
+ }
+
+ public void setStationCodeTable(CodeTableType stationCodeTable) {
+
+ this.stationCodeTable = stationCodeTable;
+ }
+
+ public void setFromStationNum(Long fromStationNum) {
+
+ this.fromStationNum = fromStationNum;
+ }
+
+ public void setFromStationIA5(String fromStationIA5) {
+
+ this.fromStationIA5 = fromStationIA5;
+ }
+
+ public void setToStationNum(Long toStationNum) {
+
+ this.toStationNum = toStationNum;
+ }
+
+ public void setToStationIA5(String toStationIA5) {
+
+ this.toStationIA5 = toStationIA5;
+ }
+
+ public void setFromStationNameUTF8(String fromStationNameUTF8) {
+
+ this.fromStationNameUTF8 = fromStationNameUTF8;
+ }
+
+ public void setToStationNameUTF8(String toStationNameUTF8) {
+
+ this.toStationNameUTF8 = toStationNameUTF8;
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfActivatedDays.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfActivatedDays.java
new file mode 100644
index 0000000..d6d35f3
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfActivatedDays.java
@@ -0,0 +1,27 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+import java.util.List;
+
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+import net.gcdc.asn1.datatypes.IntRange;
+
+@IntRange(minValue=0,maxValue=370)
+public class SequenceOfActivatedDays extends Asn1SequenceOf<Long> {
+ public SequenceOfActivatedDays() { super(); }
+ public SequenceOfActivatedDays(Collection<Long> coll) { super(coll); }
+
+ public SequenceOfActivatedDays(List<Long> numbers) {
+ super();
+ for (Long number: numbers){
+ this.add(new Long(number));
+ }
+ }
+
+ public static SequenceOfActivatedDays getSequence(List<Long> numList) {
+ if (numList == null || numList.isEmpty()) return null;
+ return new SequenceOfActivatedDays(numList);
+ }
+
+} \ No newline at end of file
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfBerthDetailData.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfBerthDetailData.java
new file mode 100644
index 0000000..cd3a79f
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfBerthDetailData.java
@@ -0,0 +1,10 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+
+public class SequenceOfBerthDetailData extends Asn1SequenceOf<BerthDetailData> {
+ public SequenceOfBerthDetailData() { super(); }
+ public SequenceOfBerthDetailData(Collection<BerthDetailData> coll) { super(coll); }
+} \ No newline at end of file
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfCardReferenceType.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfCardReferenceType.java
new file mode 100644
index 0000000..3ae6d68
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfCardReferenceType.java
@@ -0,0 +1,10 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+
+public class SequenceOfCardReferenceType extends Asn1SequenceOf<CardReferenceType> {
+ public SequenceOfCardReferenceType() { super(); }
+ public SequenceOfCardReferenceType(Collection<CardReferenceType> coll) { super(coll); }
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfCarrierIA5.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfCarrierIA5.java
new file mode 100644
index 0000000..110b8e4
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfCarrierIA5.java
@@ -0,0 +1,13 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.RestrictedString;
+
+@RestrictedString(CharacterRestriction.IA5String)
+public class SequenceOfCarrierIA5 extends Asn1SequenceOf<String> {
+ public SequenceOfCarrierIA5() { super(); }
+ public SequenceOfCarrierIA5(Collection<String> coll) { super(coll); }
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfCarrierNum.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfCarrierNum.java
new file mode 100644
index 0000000..c6e00a1
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfCarrierNum.java
@@ -0,0 +1,29 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+import java.util.List;
+
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+import net.gcdc.asn1.datatypes.IntRange;
+
+@IntRange(minValue=1,maxValue=32000)
+public class SequenceOfCarrierNum extends Asn1SequenceOf<Long> {
+ public SequenceOfCarrierNum() { super(); }
+ public SequenceOfCarrierNum(Collection<Long> coll) { super(coll); }
+
+
+ public SequenceOfCarrierNum(List<Long> numbers) {
+ super();
+ for (Long number: numbers){
+ this.add(new Long(number));
+ }
+ }
+ public static SequenceOfCarrierNum getSequence(List<Long> numList) {
+ if (numList == null || numList.isEmpty()) return null;
+ return new SequenceOfCarrierNum(numList);
+ }
+
+
+
+} \ No newline at end of file
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfCountries.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfCountries.java
new file mode 100644
index 0000000..69a953f
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfCountries.java
@@ -0,0 +1,28 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+import java.util.List;
+
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+import net.gcdc.asn1.datatypes.IntRange;
+
+@IntRange(minValue=1,maxValue=250)
+public class SequenceOfCountries extends Asn1SequenceOf<Long> {
+ public SequenceOfCountries() { super(); }
+ public SequenceOfCountries(Collection<Long> coll) { super(coll); }
+
+
+ public SequenceOfCountries(List<Long> numbers) {
+ super();
+ for (Long number: numbers){
+ this.add(new Long(number));
+ }
+ }
+
+ public static SequenceOfCountries getSequence(List<Long> numList) {
+ if (numList == null || numList.isEmpty()) return null;
+ return new SequenceOfCountries(numList);
+ }
+
+} \ No newline at end of file
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfCustomerStatusType.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfCustomerStatusType.java
new file mode 100644
index 0000000..81bdf82
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfCustomerStatusType.java
@@ -0,0 +1,11 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+
+public class SequenceOfCustomerStatusType extends Asn1SequenceOf<CustomerStatusType> {
+ public SequenceOfCustomerStatusType() { super(); }
+ public SequenceOfCustomerStatusType(Collection<CustomerStatusType> coll) { super(coll); }
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfDeltaCoordinates.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfDeltaCoordinates.java
new file mode 100644
index 0000000..4f29a88
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfDeltaCoordinates.java
@@ -0,0 +1,10 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+
+public class SequenceOfDeltaCoordinates extends Asn1SequenceOf<DeltaCoordinates> {
+ public SequenceOfDeltaCoordinates() { super(); }
+ public SequenceOfDeltaCoordinates(Collection<DeltaCoordinates> coll) { super(coll); }
+} \ No newline at end of file
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfDocumentData.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfDocumentData.java
new file mode 100644
index 0000000..87d7f69
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfDocumentData.java
@@ -0,0 +1,10 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+
+public class SequenceOfDocumentData extends Asn1SequenceOf<DocumentData> {
+ public SequenceOfDocumentData() { super(); }
+ public SequenceOfDocumentData(Collection<DocumentData> coll) { super(coll); }
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfExtensionData.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfExtensionData.java
new file mode 100644
index 0000000..8a6f49c
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfExtensionData.java
@@ -0,0 +1,10 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+
+public class SequenceOfExtensionData extends Asn1SequenceOf<ExtensionData> {
+ public SequenceOfExtensionData() { super(); }
+ public SequenceOfExtensionData(Collection<ExtensionData> coll) { super(coll); }
+} \ No newline at end of file
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfIncludedOpenTicketType.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfIncludedOpenTicketType.java
new file mode 100644
index 0000000..3c26182
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfIncludedOpenTicketType.java
@@ -0,0 +1,10 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+
+public class SequenceOfIncludedOpenTicketType extends Asn1SequenceOf<IncludedOpenTicketType> {
+ public SequenceOfIncludedOpenTicketType() { super(); }
+ public SequenceOfIncludedOpenTicketType(Collection<IncludedOpenTicketType> coll) { super(coll); }
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfPlaceNum.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfPlaceNum.java
new file mode 100644
index 0000000..5575f28
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfPlaceNum.java
@@ -0,0 +1,29 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+import java.util.List;
+
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+import net.gcdc.asn1.datatypes.IntRange;
+
+@IntRange(minValue=1,maxValue=254)
+public class SequenceOfPlaceNum extends Asn1SequenceOf<Long> {
+ public SequenceOfPlaceNum() { super(); }
+ public SequenceOfPlaceNum(Collection<Long> coll) { super(coll); }
+
+
+
+ public SequenceOfPlaceNum(List<Long> numbers) {
+ super();
+ for (Long number: numbers){
+ this.add(new Long(number));
+ }
+ }
+
+ public static SequenceOfPlaceNum getSequence(List<Long> numList) {
+ if (numList == null || numList.isEmpty()) return null;
+ return new SequenceOfPlaceNum(numList);
+ }
+
+} \ No newline at end of file
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfRegionalValidityType.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfRegionalValidityType.java
new file mode 100644
index 0000000..b3e2014
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfRegionalValidityType.java
@@ -0,0 +1,10 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+
+public class SequenceOfRegionalValidityType extends Asn1SequenceOf<RegionalValidityType> {
+ public SequenceOfRegionalValidityType() { super(); }
+ public SequenceOfRegionalValidityType(Collection<RegionalValidityType> coll) { super(coll); }
+} \ No newline at end of file
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfRegisteredLuggageType.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfRegisteredLuggageType.java
new file mode 100644
index 0000000..67e9f1d
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfRegisteredLuggageType.java
@@ -0,0 +1,10 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+
+public class SequenceOfRegisteredLuggageType extends Asn1SequenceOf<RegisteredLuggageType> {
+ public SequenceOfRegisteredLuggageType() { super(); }
+ public SequenceOfRegisteredLuggageType(Collection<RegisteredLuggageType> coll) { super(coll); }
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfServiceBrands.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfServiceBrands.java
new file mode 100644
index 0000000..72255fe
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfServiceBrands.java
@@ -0,0 +1,27 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+import java.util.List;
+
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+import net.gcdc.asn1.datatypes.IntRange;
+
+@IntRange(minValue=0,maxValue=32000)
+public class SequenceOfServiceBrands extends Asn1SequenceOf<Long> {
+ public SequenceOfServiceBrands() { super(); }
+ public SequenceOfServiceBrands(Collection<Long> coll) { super(coll); }
+
+
+ public SequenceOfServiceBrands(List<Long> numbers) {
+ super();
+ for (Long number: numbers){
+ this.add(new Long(number));
+ }
+ }
+
+ public static SequenceOfServiceBrands getSequence(List<Long> numList) {
+ if (numList == null || numList.isEmpty()) return null;
+ return new SequenceOfServiceBrands(numList);
+ }
+} \ No newline at end of file
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfTariffType.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfTariffType.java
new file mode 100644
index 0000000..0cbeb60
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfTariffType.java
@@ -0,0 +1,10 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+
+public class SequenceOfTariffType extends Asn1SequenceOf<TariffType> {
+ public SequenceOfTariffType() { super(); }
+ public SequenceOfTariffType(Collection<TariffType> coll) { super(coll); }
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfTicketLinkType.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfTicketLinkType.java
new file mode 100644
index 0000000..cc1e2bb
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfTicketLinkType.java
@@ -0,0 +1,10 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+
+public class SequenceOfTicketLinkType extends Asn1SequenceOf<TicketLinkType> {
+ public SequenceOfTicketLinkType() { super(); }
+ public SequenceOfTicketLinkType(Collection<TicketLinkType> coll) { super(coll); }
+} \ No newline at end of file
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfTransportTypes.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfTransportTypes.java
new file mode 100644
index 0000000..572cdf9
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfTransportTypes.java
@@ -0,0 +1,27 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+import java.util.List;
+
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+import net.gcdc.asn1.datatypes.IntRange;
+
+@IntRange(minValue=0,maxValue=31)
+public class SequenceOfTransportTypes extends Asn1SequenceOf<Long> {
+ public SequenceOfTransportTypes() { super(); }
+ public SequenceOfTransportTypes(Collection<Long> coll) { super(coll); }
+
+
+ public SequenceOfTransportTypes(List<Long> numbers) {
+ super();
+ for (Long number: numbers){
+ this.add(new Long(number));
+ }
+ }
+
+ public static SequenceOfTransportTypes getSequence(List<Long> numList) {
+ if (numList == null || numList.isEmpty()) return null;
+ return new SequenceOfTransportTypes(numList);
+ }
+} \ No newline at end of file
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfTravelerId.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfTravelerId.java
new file mode 100644
index 0000000..0a0aad0
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfTravelerId.java
@@ -0,0 +1,27 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+import java.util.List;
+
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+import net.gcdc.asn1.datatypes.IntRange;
+
+@IntRange(minValue=1,maxValue=254)
+public class SequenceOfTravelerId extends Asn1SequenceOf<Long> {
+ public SequenceOfTravelerId() { super(); }
+ public SequenceOfTravelerId(Collection<Long> coll) { super(coll); }
+
+ public SequenceOfTravelerId(List<Long> numbers) {
+ super();
+ for (Long number: numbers){
+ this.add(new Long(number));
+ }
+ }
+
+ public static SequenceOfTravelerId getSequence(List<Long> numList) {
+ if (numList == null || numList.isEmpty()) return null;
+ return new SequenceOfTravelerId(numList);
+ }
+
+} \ No newline at end of file
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfTravelerType.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfTravelerType.java
new file mode 100644
index 0000000..8a5c7c0
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfTravelerType.java
@@ -0,0 +1,10 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+
+public class SequenceOfTravelerType extends Asn1SequenceOf<TravelerType> {
+ public SequenceOfTravelerType() { super(); }
+ public SequenceOfTravelerType(Collection<TravelerType> coll) { super(coll); }
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfVatDetail.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfVatDetail.java
new file mode 100644
index 0000000..7847744
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfVatDetail.java
@@ -0,0 +1,10 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+
+public class SequenceOfVatDetail extends Asn1SequenceOf<VatDetailType> {
+ public SequenceOfVatDetail() { super(); }
+ public SequenceOfVatDetail(Collection<VatDetailType> coll) { super(coll); }
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/SequenceOfViaStationType.java b/src/org/uic/ticket/api/asn/omv2/SequenceOfViaStationType.java
new file mode 100644
index 0000000..ea21e35
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SequenceOfViaStationType.java
@@ -0,0 +1,10 @@
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+
+public class SequenceOfViaStationType extends Asn1SequenceOf<ViaStationType> {
+ public SequenceOfViaStationType() { super(); }
+ public SequenceOfViaStationType(Collection<ViaStationType> coll) { super(coll); }
+} \ No newline at end of file
diff --git a/src/org/uic/ticket/api/asn/omv2/SeriesDetailType.java b/src/org/uic/ticket/api/asn/omv2/SeriesDetailType.java
new file mode 100644
index 0000000..fb5d5b6
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/SeriesDetailType.java
@@ -0,0 +1,71 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.Sequence;
+
+@Sequence
+public class SeriesDetailType extends Object {
+ public SeriesDetailType() {
+ }
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long supplyingCarrier;
+
+ @IntRange(minValue=1,maxValue=99)
+ @Asn1Optional public Long offerIdentification;
+
+ @Asn1Optional public Asn1BigInteger series;
+
+
+ public Long getSupplyingCarrier() {
+
+ return this.supplyingCarrier;
+ }
+
+ public Long getOfferIdentification() {
+
+ return this.offerIdentification;
+ }
+
+ public Long getSeries() {
+
+ return Asn1BigInteger.toLong(this.series);
+ }
+
+ public void setSupplyingCarrier(Long supplyingCarrier) {
+
+ this.supplyingCarrier = supplyingCarrier;
+ }
+
+ public void setOfferIdentification(Long offerIdentification) {
+
+ this.offerIdentification = offerIdentification;
+ }
+
+ public void setSeries(Long series) {
+
+ this.series = Asn1BigInteger.toAsn1(series);
+ }
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/ServiceType.java b/src/org/uic/ticket/api/asn/omv2/ServiceType.java
new file mode 100644
index 0000000..55b8faf
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/ServiceType.java
@@ -0,0 +1,38 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+public enum ServiceType {
+ seat("seat"),
+ couchette("couchette"),
+ berth("berth"),
+ carcarriage("carcarriage");
+
+ public String text;
+
+ ServiceType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/StationPassageData.java b/src/org/uic/ticket/api/asn/omv2/StationPassageData.java
new file mode 100644
index 0000000..0848c37
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/StationPassageData.java
@@ -0,0 +1,363 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Date;
+import java.util.List;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+import net.gcdc.asn1.datatypesimpl.SequenceOfStringIA5;
+import net.gcdc.asn1.datatypesimpl.SequenceOfStringUTF8;
+import net.gcdc.asn1.datatypesimpl.SequenceOfUnrestrictedLong;
+
+@Sequence
+@HasExtensionMarker
+public class StationPassageData extends Object {
+ public StationPassageData() {
+ }
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String referenceIA5;
+
+ @Asn1Optional public Asn1BigInteger referenceNum;
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long productOwnerNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productOwnerIA5;
+
+ @IntRange(minValue=0,maxValue=65535)
+ @Asn1Optional public Long productIdNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productIdIA5;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String productName;
+
+ @Asn1Default("stationUIC")
+ @Asn1Optional public CodeTableType stationCodeTable;
+
+ @Asn1Optional public SequenceOfUnrestrictedLong stationNum;
+
+ @Asn1Optional public SequenceOfStringIA5 stationIA5;
+
+ @Asn1Optional public SequenceOfStringUTF8 stationNameUTF8;
+
+ @Asn1Optional public SequenceOfUnrestrictedLong areaCodeNum;
+
+ @Asn1Optional public SequenceOfStringIA5 areaCodeIA5;
+
+ @Asn1Optional public SequenceOfStringUTF8 areaNameUTF8;
+
+ @IntRange(minValue=-1,maxValue=700)
+ public Long validFromDay;
+
+ @IntRange(minValue=0,maxValue=1440)
+ @Asn1Optional public Long validFromTime;
+
+ @IntRange(minValue=-60, maxValue=60)
+ @Asn1Optional public Long validFromUTCOffset;
+
+ @Asn1Default(value="0")
+ @IntRange(minValue=0,maxValue=370)
+ @Asn1Optional public Long validUntilDay;
+
+ @IntRange(minValue=0,maxValue=1440)
+ @Asn1Optional public Long validUntilTime;
+
+ @IntRange(minValue=-60, maxValue=60)
+ @Asn1Optional public Long validUntilUTCOffset;
+
+ @Asn1Optional public Asn1BigInteger numberOfDaysValid;
+
+ @Asn1Optional public ExtensionData extension;
+
+
+ public String getReferenceIA5() {
+
+ return this.referenceIA5;
+ }
+
+ public Asn1BigInteger getReferenceNum() {
+
+ return this.referenceNum;
+ }
+
+ public Long getProductOwnerNum() {
+
+ return this.productOwnerNum;
+ }
+
+ public String getProductOwnerIA5() {
+
+ return this.productOwnerIA5;
+ }
+
+ public Long getProductIdNum() {
+
+ return this.productIdNum;
+ }
+
+ public String getProductIdIA5() {
+
+ return this.productIdIA5;
+ }
+
+ public String getProductName() {
+
+ return this.productName;
+ }
+
+ public CodeTableType getStationCodeTable() {
+
+ if (stationCodeTable == null) {
+ return CodeTableType.stationUIC;
+ }
+
+ return this.stationCodeTable;
+ }
+
+ public SequenceOfUnrestrictedLong getStationNum() {
+
+ return this.stationNum;
+ }
+
+ public List<String> getStationIA5() {
+
+ return this.stationIA5;
+ }
+
+ public SequenceOfStringUTF8 getStationNameUTF8() {
+
+ return this.stationNameUTF8;
+ }
+
+ public SequenceOfUnrestrictedLong getAreaCodeNum() {
+
+ return this.areaCodeNum;
+ }
+
+ public List<String> getAreaCodeIA5() {
+
+ return this.areaCodeIA5;
+ }
+
+ public List<String> getAreaNameUTF8() {
+
+ return this.areaNameUTF8;
+ }
+
+ public Long getValidFromDay() {
+
+ return this.validFromDay;
+ }
+
+ public Long getValidFromTime() {
+
+ return this.validFromTime;
+ }
+
+ public Long getValidUntilDay() {
+
+ return this.validUntilDay;
+ }
+
+ public Long getValidUntilTime() {
+
+ return this.validUntilTime;
+ }
+
+ public Long getNumberOfDaysValid() {
+
+ return Asn1BigInteger.toLong(numberOfDaysValid);
+ }
+
+ public ExtensionData getExtension() {
+
+ return this.extension;
+ }
+
+ public void setReferenceIA5(String referenceIA5) {
+
+ this.referenceIA5 = referenceIA5;
+ }
+
+ public void setReferenceNum(Asn1BigInteger referenceNum) {
+
+ this.referenceNum = referenceNum;
+ }
+
+ public void setProductOwnerNum(Long productOwnerNum) {
+
+ this.productOwnerNum = productOwnerNum;
+ }
+
+ public void setProductOwnerIA5(String productOwnerIA5) {
+
+ this.productOwnerIA5 = productOwnerIA5;
+ }
+
+ public void setProductIdNum(Long productIdNum) {
+
+ this.productIdNum = productIdNum;
+ }
+
+ public void setProductIdIA5(String productIdIA5) {
+
+ this.productIdIA5 = productIdIA5;
+ }
+
+ public void setProductName(String productName) {
+
+ this.productName = productName;
+ }
+
+ public void setStationCodeTable(CodeTableType stationCodeTable) {
+
+ this.stationCodeTable = stationCodeTable;
+ }
+
+ public void setStationNum(SequenceOfUnrestrictedLong stationNum) {
+
+ this.stationNum = stationNum;
+ }
+
+ public void setStationIA5(SequenceOfStringIA5 stationIA5) {
+
+ this.stationIA5 = stationIA5;
+ }
+
+ public void setStationNameUTF8(SequenceOfStringUTF8 stationNameUTF8) {
+
+ this.stationNameUTF8 = stationNameUTF8;
+ }
+
+ public void setAreaCodeNum(SequenceOfUnrestrictedLong sequenceOfUnrestrictedLong) {
+
+ this.areaCodeNum = sequenceOfUnrestrictedLong;
+ }
+
+ public void setAreaCodeIA5(SequenceOfStringIA5 areaCodeIA5) {
+
+ this.areaCodeIA5 = areaCodeIA5;
+ }
+
+ public void setAreaNameUTF8(SequenceOfStringUTF8 areaNameUTF8) {
+
+ this.areaNameUTF8 = areaNameUTF8;
+ }
+
+ public void setValidFromDay(Long validFromDay) {
+
+ this.validFromDay = validFromDay;
+ }
+
+ public void setValidFromTime(Long validFromTime) {
+
+ this.validFromTime = validFromTime;
+ }
+
+ public void setValidUntilDay(Long validUntilDay) {
+
+ this.validUntilDay = validUntilDay;
+ }
+
+ public void setValidUntilTime(Long validUntilTime) {
+
+ this.validUntilTime = validUntilTime;
+ }
+
+ public void setNumberOfDaysValid(Long numberOfDaysValid) {
+
+ this.numberOfDaysValid = Asn1BigInteger.toAsn1(numberOfDaysValid);
+ }
+
+ public void setExtension(ExtensionData extension) {
+
+ this.extension = extension;
+ }
+
+ public void setValidityDates (Date fromDate, Date untilDate, Date issuingDate){
+
+ if (issuingDate == null || fromDate == null) return;
+
+ this.validFromDay = DateTimeUtils.getDateDifference(issuingDate,fromDate);
+ this.validFromTime = DateTimeUtils.getTime(fromDate);
+
+ if (untilDate != null){
+ this.validUntilDay = DateTimeUtils.getDateDifference(fromDate, untilDate);
+ this.validUntilTime = DateTimeUtils.getTime(untilDate);
+ }
+
+ }
+
+ public Date getValidFromDate(Date issuingDate){
+
+ return DateTimeUtils.getDate(issuingDate, this.validFromDay, this.validFromTime);
+
+ }
+
+ public Date getValidUntilDate(Date issuingDate){
+
+ if (issuingDate == null) return null;
+
+ if (this.validFromDay == null) {
+ this.validFromDay = 0L;
+ }
+
+ if (this.validUntilDay == null) {
+ return null;
+ }
+
+
+ return DateTimeUtils.getDate(issuingDate, this.validFromDay + this.validUntilDay, this.validUntilTime);
+
+ }
+
+ public Long getValidFromUTCOffset() {
+ return validFromUTCOffset;
+ }
+
+ public void setValidFromUTCOffset(Long validFromUTCOffset) {
+ this.validFromUTCOffset = validFromUTCOffset;
+ }
+
+ public Long getValidUntilUTCOffset() {
+ return validUntilUTCOffset;
+ }
+
+ public void setValidUntilUTCOffset(Long validUntilUTCOffset) {
+ this.validUntilUTCOffset = validUntilUTCOffset;
+ }
+
+
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/TariffType.java b/src/org/uic/ticket/api/asn/omv2/TariffType.java
new file mode 100644
index 0000000..278efda
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/TariffType.java
@@ -0,0 +1,194 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+@Sequence
+@HasExtensionMarker
+public class TariffType extends Object {
+ public TariffType() {
+ }
+
+ @IntRange(minValue=1,maxValue=200)
+ @Asn1Default(value = "1")
+ @Asn1Optional public Long numberOfPassengers;
+
+ @Asn1Optional public PassengerType passengerType;
+
+ @IntRange(minValue=1,maxValue=64)
+ @Asn1Optional public Long ageBelow;
+
+ @IntRange(minValue=1,maxValue=128)
+ @Asn1Optional public Long ageAbove;
+
+ @Asn1Optional public SequenceOfTravelerId traverlerid;
+
+ public Boolean restrictedToCountryOfResidence;
+
+ @Asn1Optional public RouteSectionType restrictedToRouteSection;
+
+ @Asn1Optional public SeriesDetailType seriesDataDetails;
+
+ @Asn1Optional public Asn1BigInteger tariffIdNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String tariffIdIA5;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String tariffDesc;
+
+ @Asn1Optional public SequenceOfCardReferenceType reductionCard;
+
+
+
+ public Long getNumberOfPassengers() {
+
+ if (numberOfPassengers == null) {
+ return new Long(1);
+ }
+
+ return this.numberOfPassengers;
+ }
+
+ public PassengerType getPassengerType() {
+
+ return this.passengerType;
+ }
+
+ public Long getAgeBelow() {
+
+ return this.ageBelow;
+ }
+
+ public Long getAgeAbove() {
+
+ return this.ageAbove;
+ }
+
+ public SequenceOfTravelerId getTraverlerid() {
+
+ return this.traverlerid;
+ }
+
+ public Boolean getRestrictedToCountryOfResidence() {
+
+ return this.restrictedToCountryOfResidence;
+ }
+
+ public RouteSectionType getRestrictedToRouteSection() {
+
+ return this.restrictedToRouteSection;
+ }
+
+ public SeriesDetailType getSeriesDataDetails() {
+
+ return this.seriesDataDetails;
+ }
+
+ public Long getTariffIdNum() {
+
+ return Asn1BigInteger.toLong(this.tariffIdNum);
+ }
+
+ public String getTariffIdIA5() {
+
+ return this.tariffIdIA5;
+ }
+
+ public String getTariffDesc() {
+
+ return this.tariffDesc;
+ }
+
+ public SequenceOfCardReferenceType getReductionCard() {
+
+ return this.reductionCard;
+ }
+
+ public void setNumberOfPassengers(Long numberOfPassengers) {
+
+ this.numberOfPassengers = numberOfPassengers;
+ }
+
+ public void setPassengerType(PassengerType passengerType) {
+
+ this.passengerType = passengerType;
+ }
+
+ public void setAgeBelow(Long ageBelow) {
+
+ this.ageBelow = ageBelow;
+ }
+
+ public void setAgeAbove(Long ageAbove) {
+
+ this.ageAbove = ageAbove;
+ }
+
+ public void setTraverlerid(SequenceOfTravelerId traverlerid) {
+
+ this.traverlerid = traverlerid;
+ }
+
+ public void setRestrictedToCountryOfResidence(Boolean restrictedToCountryOfResidence) {
+
+ this.restrictedToCountryOfResidence = restrictedToCountryOfResidence;
+ }
+
+ public void setRestrictedToRouteSection(RouteSectionType restrictedToRouteSection) {
+
+ this.restrictedToRouteSection = restrictedToRouteSection;
+ }
+
+ public void setSeriesDataDetails(SeriesDetailType seriesDataDetails) {
+
+ this.seriesDataDetails = seriesDataDetails;
+ }
+
+ public void setTariffIdNum(Long tariffIdNum) {
+
+ this.tariffIdNum = Asn1BigInteger.toAsn1(tariffIdNum);
+ }
+
+ public void setTariffIdIA5(String tariffIdIA5) {
+
+ this.tariffIdIA5 = tariffIdIA5;
+ }
+
+ public void setTariffDesc(String tariffDesc) {
+
+ this.tariffDesc = tariffDesc;
+ }
+
+ public void setReductionCard(SequenceOfCardReferenceType reductionCard) {
+
+ this.reductionCard = reductionCard;
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/TicketDetailData.java b/src/org/uic/ticket/api/asn/omv2/TicketDetailData.java
new file mode 100644
index 0000000..1262f35
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/TicketDetailData.java
@@ -0,0 +1,177 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+
+
+import net.gcdc.asn1.datatypes.Choice;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+
+@Choice
+@HasExtensionMarker
+public class TicketDetailData extends Object {
+ public TicketDetailData() {
+ }
+
+ public ReservationData reservation;
+
+ public CarCarriageReservationData carCarriageReservation;
+
+ public OpenTicketData openTicket;
+
+ public PassData pass;
+
+ public VoucherData voucher;
+
+ public CustomerCardData customerCard;
+
+ public CountermarkData counterMark;
+
+ public ParkingGroundData parkingGround;
+
+ public FIPTicketData fipTicket;
+
+ public StationPassageData stationPassage;
+
+ public DelayConfirmation delayConfirmation;
+
+ public ExtensionData extension;
+
+ public ReservationData getReservation() {
+
+ return this.reservation;
+ }
+
+ public CarCarriageReservationData getCarCarriageReservation() {
+
+ return this.carCarriageReservation;
+ }
+
+ public OpenTicketData getOpenTicket() {
+
+ return this.openTicket;
+ }
+
+ public PassData getPass() {
+
+ return this.pass;
+ }
+
+ public VoucherData getVoucher() {
+
+ return this.voucher;
+ }
+
+ public CustomerCardData getCustomerCard() {
+
+ return this.customerCard;
+ }
+
+ public CountermarkData getCounterMark() {
+
+ return this.counterMark;
+ }
+
+ public ParkingGroundData getParkingGround() {
+
+ return this.parkingGround;
+ }
+
+ public FIPTicketData getFipTicket() {
+
+ return this.fipTicket;
+ }
+
+ public StationPassageData getStationPassage() {
+
+ return this.stationPassage;
+ }
+
+ public DelayConfirmation getDelayConfirmation() {
+
+ return this.delayConfirmation;
+ }
+
+ public ExtensionData getExtension() {
+
+ return this.extension;
+ }
+
+ public void setReservation(ReservationData reservation) {
+
+ this.reservation = reservation;
+ }
+
+ public void setCarCarriageReservation(CarCarriageReservationData carCarriageReservation) {
+
+ this.carCarriageReservation = carCarriageReservation;
+ }
+
+ public void setOpenTicket(OpenTicketData openTicket) {
+
+ this.openTicket = openTicket;
+ }
+
+ public void setPass(PassData pass) {
+
+ this.pass = pass;
+ }
+
+ public void setVoucher(VoucherData voucher) {
+
+ this.voucher = voucher;
+ }
+
+ public void setCustomerCard(CustomerCardData customerCard) {
+
+ this.customerCard = customerCard;
+ }
+
+ public void setCounterMark(CountermarkData counterMark) {
+
+ this.counterMark = counterMark;
+ }
+
+ public void setParkingGround(ParkingGroundData parkingGround) {
+
+ this.parkingGround = parkingGround;
+ }
+
+ public void setFipTicket(FIPTicketData fipTicket) {
+
+ this.fipTicket = fipTicket;
+ }
+
+ public void setStationPassage(StationPassageData stationPassage) {
+
+ this.stationPassage = stationPassage;
+ }
+
+ public void setDelayConfirmation(DelayConfirmation delayConfirmation) {
+
+ this.delayConfirmation = delayConfirmation;
+ }
+
+ public void setExtension(ExtensionData extension) {
+
+ this.extension = extension;
+ }
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/TicketLinkType.java b/src/org/uic/ticket/api/asn/omv2/TicketLinkType.java
new file mode 100644
index 0000000..7c8f1f5
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/TicketLinkType.java
@@ -0,0 +1,148 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+@Sequence
+@HasExtensionMarker
+public class TicketLinkType extends Object {
+ public TicketLinkType() {
+ }
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String referenceIA5;
+
+ @Asn1Optional public Asn1BigInteger referenceNum;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String issuerName;
+
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String issuerPNR;
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long productOwnerNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productOwnerIA5;
+
+ @Asn1Default(value="openTicket")
+ @Asn1Optional public TicketType ticketType;
+
+ @Asn1Default(value="issuedTogether")
+ @Asn1Optional public LinkMode linkMode;
+
+ public String getReferenceIA5() {
+
+ return this.referenceIA5;
+ }
+
+ public Long getReferenceNum() {
+ return Asn1BigInteger.toLong(this.referenceNum);
+ }
+
+ public String getIssuerName() {
+
+ return this.issuerName;
+ }
+
+ public Long getProductOwnerNum() {
+
+ return this.productOwnerNum;
+ }
+
+ public String getProductOwnerIA5() {
+
+ return this.productOwnerIA5;
+ }
+
+ public TicketType getTicketType() {
+
+ if (ticketType == null) {
+ return TicketType.openTicket;
+ }
+
+ return this.ticketType;
+ }
+
+ public LinkMode getLinkMode() {
+
+ if (linkMode == null){
+ return LinkMode.issuedTogether;
+ }
+
+ return this.linkMode;
+ }
+
+ public void setReferenceIA5(String referenceIA5) {
+
+ this.referenceIA5 = referenceIA5;
+ }
+
+ public void setReferenceNum(Long referenceNum) {
+ this.referenceNum = Asn1BigInteger.toAsn1(referenceNum);
+ }
+
+ public void setIssuerName(String issuerName) {
+
+ this.issuerName = issuerName;
+ }
+
+ public void setProductOwnerNum(Long productOwnerNum) {
+
+ this.productOwnerNum = productOwnerNum;
+ }
+
+ public void setProductOwnerIA5(String productOwnerIA5) {
+
+ this.productOwnerIA5 = productOwnerIA5;
+ }
+
+ public void setTicketType(TicketType ticketType) {
+
+ this.ticketType = ticketType;
+ }
+
+ public void setLinkMode(LinkMode linkMode) {
+
+ this.linkMode = linkMode;
+ }
+
+ public String getIssuerPNR() {
+ return issuerPNR;
+ }
+
+ public void setIssuerPNR(String issuerPNR) {
+ this.issuerPNR = issuerPNR;
+ }
+
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/TicketType.java b/src/org/uic/ticket/api/asn/omv2/TicketType.java
new file mode 100644
index 0000000..400c174
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/TicketType.java
@@ -0,0 +1,41 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+
+@HasExtensionMarker
+public enum TicketType {
+ openTicket("openTicket"),
+ pass("openTicket"),
+ reservation("openTicket"),
+ carCarriageReservation("carCarriageReservation");
+
+ public String text;
+
+ TicketType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/TimeRangeType.java b/src/org/uic/ticket/api/asn/omv2/TimeRangeType.java
new file mode 100644
index 0000000..f78f2e0
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/TimeRangeType.java
@@ -0,0 +1,56 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.Sequence;
+
+@Sequence
+public class TimeRangeType extends Object {
+ public TimeRangeType() {
+ }
+
+ @IntRange(minValue=0,maxValue=1439)
+ public Long fromTime;
+
+ @IntRange(minValue=0,maxValue=1439)
+ public Long untilTime;
+
+ public Long getFromTime() {
+
+ return this.fromTime;
+ }
+
+ public Long getUntilTime() {
+
+ return this.untilTime;
+ }
+
+ public void setFromTime(Long fromTime) {
+
+ this.fromTime = fromTime;
+ }
+
+ public void setUntilTime(Long untilTime) {
+
+ this.untilTime = untilTime;
+ }
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/TokenType.java b/src/org/uic/ticket/api/asn/omv2/TokenType.java
new file mode 100644
index 0000000..c06c01a
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/TokenType.java
@@ -0,0 +1,87 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+import net.gcdc.asn1.datatypesimpl.OctetString;
+
+@Sequence
+public class TokenType extends Object {
+ public TokenType() {
+ }
+
+ @Asn1Optional public Long tokenProviderNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String tokenProviderIA5;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String tokenSpecification;
+
+ public OctetString token;
+
+ public Long getTokenProviderNum() {
+
+ return this.tokenProviderNum;
+ }
+
+ public String getTokenProviderIA5() {
+
+ return this.tokenProviderIA5;
+ }
+
+ public String getTokenSpecification() {
+
+ return this.tokenSpecification;
+ }
+
+ public byte[] getToken() {
+
+ return token.toByteArray();
+
+ }
+
+ public void setTokenProviderNum(Long tokenProviderNum) {
+
+ this.tokenProviderNum = tokenProviderNum;
+ }
+
+ public void setTokenProviderIA5(String tokenProviderIA5) {
+
+ this.tokenProviderIA5 = tokenProviderIA5;
+ }
+
+ public void setTokenSpecification(String tokenSpecification) {
+
+ this.tokenSpecification = tokenSpecification;
+ }
+
+ public void setToken(byte[] token) {
+
+ this.token = new OctetString(token);
+
+ }
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/TrainLinkType.java b/src/org/uic/ticket/api/asn/omv2/TrainLinkType.java
new file mode 100644
index 0000000..addca17
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/TrainLinkType.java
@@ -0,0 +1,172 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Date;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+@Sequence
+public class TrainLinkType extends Object {
+ public TrainLinkType() {
+ }
+
+ @Asn1Optional public Asn1BigInteger trainNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String trainIA5;
+
+ @IntRange(minValue=0,maxValue=370)
+ @Asn1Optional public Long travelDate;
+
+ @IntRange(minValue=0,maxValue=1440)
+ @Asn1Optional public Long departureTime;
+
+ @IntRange(minValue=-60, maxValue=60)
+ @Asn1Optional public Long departureUTCOffset;
+
+ @IntRange(minValue=1,maxValue=9999999)
+ @Asn1Optional public Long fromStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String fromStationIA5;
+
+ @IntRange(minValue=1,maxValue=9999999)
+ @Asn1Optional public Long toStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String toStationIA5;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String fromStationName;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String toStationName;
+
+ public Long getTrainNum() {
+ return Asn1BigInteger.toLong(this.trainNum);
+ }
+
+ public String getTrainIA5() {
+ return this.trainIA5;
+ }
+
+ public Long getTravelDate() {
+ return this.travelDate;
+ }
+
+ public Long getDepartureTime() {
+ return this.departureTime;
+ }
+
+ public Long getFromStationNum() {
+ return this.fromStationNum;
+ }
+
+ public String getFromStationIA5() {
+ return this.fromStationIA5;
+ }
+
+ public Long getToStationNum() {
+ return this.toStationNum;
+ }
+
+ public String getToStationIA5() {
+ return this.toStationIA5;
+ }
+
+ public String getFromStationName() {
+ return this.fromStationName;
+ }
+
+ public String getToStationName() {
+ return this.toStationName;
+ }
+
+ public void setTrainNum(Long trainNum) {
+ this.trainNum = Asn1BigInteger.toAsn1(trainNum);
+ }
+
+ public void setTrainIA5(String trainIA5) {
+ this.trainIA5 = trainIA5;
+ }
+
+ public void setTravelDate(Long travelDate) {
+ this.travelDate = travelDate;
+ }
+
+ public void setDepartureTime(Long departureTime) {
+ this.departureTime = departureTime;
+ }
+
+ public void setFromStationNum(Long fromStationNum) {
+ this.fromStationNum = fromStationNum;
+ }
+
+ public void setFromStationIA5(String fromStationIA5) {
+ this.fromStationIA5 = fromStationIA5;
+ }
+
+ public void setToStationNum(Long toStationNum) {
+ this.toStationNum = toStationNum;
+ }
+
+ public void setToStationIA5(String toStationIA5) {
+ this.toStationIA5 = toStationIA5;
+ }
+
+ public void setFromStationName(String fromStationName) {
+ this.fromStationName = fromStationName;
+ }
+
+ public void setToStationName(String toStationName) {
+ this.toStationName = toStationName;
+ }
+
+ public void setDepartureDate(Date departure, Date issuingDate){
+
+ if (issuingDate == null || departure == null) return;
+
+ this.travelDate = DateTimeUtils.getDateDifference(issuingDate,departure);
+ this.departureTime = DateTimeUtils.getTime(departure);
+ }
+
+ public void setDepartureTimeZone(Date dateLocal, Date dateUTC ) {
+ // -- (UTC = local + offset * 15 Minutes)
+ this.departureUTCOffset = new Long(dateLocal.getTime() - dateUTC.getTime()) / (1000 * 60 * 15);
+ }
+
+ public Date getDepartureDate(Date issuingDate){
+ return DateTimeUtils.getDate(issuingDate, this.travelDate, this.departureTime);
+ }
+
+ public Date getUTCDepartureDate(Date issuingDate){
+ return DateTimeUtils.getUTCDate(issuingDate, this.travelDate, this.departureTime, this.departureUTCOffset);
+ }
+
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/TravelClassType.java b/src/org/uic/ticket/api/asn/omv2/TravelClassType.java
new file mode 100644
index 0000000..4fb6c63
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/TravelClassType.java
@@ -0,0 +1,50 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+
+@HasExtensionMarker
+public enum TravelClassType {
+ notApplicabel("notApplicabel"),
+ first("first"),
+ second("second"),
+ tourist("tourist"),
+ comfort("comfort"),
+ premium("premium"),
+ business("business"),
+ all("all"),
+ premiumFirst("A"),
+ standardFirst("B"),
+ premiumSecond("C"),
+ standardSecond("D");
+
+
+ public String text;
+
+ TravelClassType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/asn/omv2/TravelerData.java b/src/org/uic/ticket/api/asn/omv2/TravelerData.java
new file mode 100644
index 0000000..9cdfc7f
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/TravelerData.java
@@ -0,0 +1,79 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.List;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.FixedSize;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+@Sequence
+@HasExtensionMarker
+public class TravelerData extends Object {
+ public TravelerData() {
+ }
+
+ @Asn1Optional public SequenceOfTravelerType traveler;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @FixedSize(2)
+ @Asn1Optional public String preferedLanguage;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String groupName;
+
+
+ public List<TravelerType> getTraveler() {
+
+ return this.traveler;
+ }
+
+ public String getPreferedLanguage() {
+
+ return this.preferedLanguage;
+ }
+
+ public String getGroupName() {
+
+ return this.groupName;
+ }
+
+ public void setTraveler(SequenceOfTravelerType traveler) {
+
+ this.traveler = traveler;
+ }
+
+ public void setPreferedLanguage(String preferedLanguage) {
+
+ this.preferedLanguage = preferedLanguage;
+ }
+
+ public void setGroupName(String groupName) {
+
+ this.groupName = groupName;
+ }
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/TravelerType.java b/src/org/uic/ticket/api/asn/omv2/TravelerType.java
new file mode 100644
index 0000000..682203f
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/TravelerType.java
@@ -0,0 +1,303 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+import net.gcdc.asn1.datatypes.SizeRange;
+
+@Sequence
+@HasExtensionMarker
+public class TravelerType extends Object {
+ public TravelerType() {
+ }
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String firstName;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String secondName;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String lastName;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String idCard;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String passportId;
+
+ @SizeRange(minValue = 1, maxValue = 3)
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String title;
+
+ @Asn1Optional public GenderType gender;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String customerIdIA5;
+
+ @Asn1Optional public Long customerIdNum;
+
+ @IntRange(minValue=1901,maxValue=2155)
+ @Asn1Optional public Long yearOfBirth;
+
+ @IntRange(minValue=0,maxValue=366)
+ @Asn1Optional public Long dayOfBirth;
+
+ public Boolean ticketHolder = true;
+
+ @Asn1Optional public PassengerType passengerType;
+
+ @Asn1Optional public Boolean passengerWithReducedMobility;
+
+ @IntRange(minValue=1,maxValue=999)
+ @Asn1Optional public Long countryOfResidence;
+
+ @IntRange(minValue=1,maxValue=999)
+ @Asn1Optional public Long countryOfPassport;
+
+ @IntRange(minValue=1,maxValue=999)
+ @Asn1Optional public Long countryOfIdCard;
+
+ @Asn1Optional public SequenceOfCustomerStatusType status;
+
+
+
+ public String getFirstName() {
+
+ return this.firstName;
+ }
+
+ public String getSecondName() {
+
+ return this.secondName;
+ }
+
+ public String getLastName() {
+
+ return this.lastName;
+ }
+
+ public String getIdCard() {
+
+ return this.idCard;
+ }
+
+ public String getPassportId() {
+
+ return this.passportId;
+ }
+
+ public String getTitle() {
+
+ return this.title;
+ }
+
+ public GenderType getGender() {
+
+ return this.gender;
+ }
+
+ public String getCustomerIdIA5() {
+
+ return this.customerIdIA5;
+ }
+
+ public Long getCustomerIdNum() {
+
+ return this.customerIdNum;
+ }
+
+ public Long getYearOfBirth() {
+
+ return this.yearOfBirth;
+ }
+
+ public Long getDayOfBirth() {
+
+ return this.dayOfBirth;
+ }
+
+ public Boolean getTicketHolder() {
+
+ return this.ticketHolder;
+ }
+
+ public PassengerType getPassengerType() {
+
+ return this.passengerType;
+ }
+
+ public Boolean getPassengerWithReducedMobility() {
+ return this.passengerWithReducedMobility;
+ }
+
+ public Long getCountryOfResidence() {
+
+ return this.countryOfResidence;
+ }
+
+ public Long getCountryOfPassport() {
+
+ return this.countryOfPassport;
+ }
+
+ public Long getCountryOfIdCard() {
+
+ return this.countryOfIdCard;
+ }
+
+ public SequenceOfCustomerStatusType getStatus() {
+
+ return this.status;
+ }
+
+ public void setFirstName(String firstName) {
+
+ this.firstName = firstName;
+ }
+
+ public void setSecondName(String secondName) {
+
+ this.secondName = secondName;
+ }
+
+ public void setLastName(String lastName) {
+
+ this.lastName = lastName;
+ }
+
+ public void setIdCard(String idCard) {
+
+ this.idCard = idCard;
+ }
+
+ public void setPassportId(String passportId) {
+
+ this.passportId = passportId;
+ }
+
+ public void setTitle(String title) {
+
+ this.title = title;
+ }
+
+ public void setGender(GenderType gender) {
+
+ this.gender = gender;
+ }
+
+ public void setCustomerIdIA5(String customerIdIA5) {
+
+ this.customerIdIA5 = customerIdIA5;
+ }
+
+ public void setCustomerIdNum(Long customerIdNum) {
+
+ this.customerIdNum = customerIdNum;
+ }
+
+ public void setYearOfBirth(Long yearOfBirth) {
+
+ this.yearOfBirth = yearOfBirth;
+ }
+
+ public void setDayOfBirth(Long dayOfBirth) {
+
+ this.dayOfBirth = dayOfBirth;
+ }
+
+ public void setTicketHolder(Boolean ticketHolder) {
+
+ this.ticketHolder = ticketHolder;
+ }
+
+ public void setPassengerType(PassengerType passengerType) {
+
+ this.passengerType = passengerType;
+ }
+
+ public void setPassengerWithReducedMobility(Boolean passengerWithReducedMobility) {
+
+ this.passengerWithReducedMobility = passengerWithReducedMobility;
+ }
+
+ public void setCountryOfResidence(Long countryOfResidence) {
+
+ this.countryOfResidence = countryOfResidence;
+ }
+
+ public void setCountryOfPassport(Long countryOfPassport) {
+
+ this.countryOfPassport = countryOfPassport;
+ }
+
+ public void setCountryOfIdCard(Long countryOfIdCard) {
+
+ this.countryOfIdCard = countryOfIdCard;
+ }
+
+ public void setStatus(SequenceOfCustomerStatusType status) {
+
+ this.status = status;
+ }
+
+
+
+ public void setDateOfBirth(Date date){
+
+ if (date == null) return;
+
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+
+ this.yearOfBirth = new Long( cal.get(Calendar.YEAR));
+ this.dayOfBirth = new Long (cal.get(Calendar.DAY_OF_YEAR));
+
+
+ }
+
+ public Date getDateOfBirth() {
+
+ if (this.yearOfBirth == null) return null;
+ if (this.dayOfBirth == null) return null;
+
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.setTimeZone(TimeZone.getTimeZone("UTC"));
+ cal.set(Calendar.YEAR, this.yearOfBirth.intValue());
+ cal.set(Calendar.DAY_OF_YEAR, this.dayOfBirth.intValue());
+ cal.set(Calendar.HOUR_OF_DAY,0);
+ cal.set(Calendar.MINUTE,0);
+
+ return cal.getTime();
+ }
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/UicRailTicketData.java b/src/org/uic/ticket/api/asn/omv2/UicRailTicketData.java
new file mode 100644
index 0000000..624acf4
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/UicRailTicketData.java
@@ -0,0 +1,110 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.List;
+
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.Sequence;
+import net.gcdc.asn1.uper.UperEncoder;
+
+@Sequence
+@HasExtensionMarker
+public class UicRailTicketData extends Object {
+ public UicRailTicketData() {
+ }
+
+ public IssuingData issuingDetail;
+
+ @Asn1Optional public TravelerData travelerDetail;
+
+ @Asn1Optional public SequenceOfDocumentData transportDocument;
+
+ @Asn1Optional public ControlData controlDetail;
+
+ @Asn1Optional public SequenceOfExtensionData extension;
+
+ public IssuingData getIssuingDetail() {
+
+ return this.issuingDetail;
+ }
+
+ public TravelerData getTravelerDetail() {
+
+ return this.travelerDetail;
+ }
+
+ public List<DocumentData> getTransportDocument() {
+
+ return this.transportDocument;
+ }
+
+ public ControlData getControlDetail() {
+
+ return this.controlDetail;
+ }
+
+ public List<ExtensionData> getExtension() {
+
+ return this.extension;
+ }
+
+ public void setIssuingDetail(IssuingData issuingDetail) {
+
+ this.issuingDetail = issuingDetail;
+ }
+
+ public void setTravelerDetail(TravelerData travelerDetail) {
+
+ this.travelerDetail = travelerDetail;
+ }
+
+ public void setTransportDocument(SequenceOfDocumentData transportDocument) {
+
+ this.transportDocument = transportDocument;
+ }
+
+ public void setControlDetail(ControlData controlDetail) {
+
+ this.controlDetail = controlDetail;
+ }
+
+ public void setExtension(SequenceOfExtensionData extension) {
+
+ this.extension = extension;
+ }
+
+
+ public byte[] encode(){
+ return UperEncoder.encode(this);
+ }
+
+ public String encodeToHex(){
+ return UperEncoder.hexStringFromBytes(UperEncoder.encode(this));
+ }
+
+
+ public static UicRailTicketData decode(byte[] bytes) {
+ return UperEncoder.decode(bytes, UicRailTicketData.class);
+ }
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/ValidityPeriodDetailType.java b/src/org/uic/ticket/api/asn/omv2/ValidityPeriodDetailType.java
new file mode 100644
index 0000000..149e85a
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/ValidityPeriodDetailType.java
@@ -0,0 +1,70 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Collection;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.Asn1SequenceOf;
+import net.gcdc.asn1.datatypes.Sequence;
+
+@Sequence
+public class ValidityPeriodDetailType extends Object {
+ public ValidityPeriodDetailType() {
+ }
+
+ @Asn1Optional public SequenceOfValidityPeriodType validityPeriod;
+
+ @Asn1Optional public SequenceOfTimeRangeType excludedTimeRange;
+
+
+ public class SequenceOfTimeRangeType extends Asn1SequenceOf<TimeRangeType> {
+ public SequenceOfTimeRangeType() { super(); }
+ public SequenceOfTimeRangeType(Collection<TimeRangeType> coll) { super(coll); }
+ }
+
+
+ public class SequenceOfValidityPeriodType extends Asn1SequenceOf<ValidityPeriodType> {
+ public SequenceOfValidityPeriodType() { super(); }
+ public SequenceOfValidityPeriodType(Collection<ValidityPeriodType> coll) { super(coll); }
+ }
+
+ public SequenceOfValidityPeriodType getValidityPeriod() {
+
+ return this.validityPeriod;
+ }
+
+ public SequenceOfTimeRangeType getExcludedTimeRange() {
+
+ return this.excludedTimeRange;
+ }
+
+ public void setValidityPeriod(SequenceOfValidityPeriodType validityPeriod) {
+
+ this.validityPeriod = validityPeriod;
+ }
+
+ public void setExcludedTimeRange(SequenceOfTimeRangeType excludedTimeRange) {
+
+ this.excludedTimeRange = excludedTimeRange;
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/ValidityPeriodType.java b/src/org/uic/ticket/api/asn/omv2/ValidityPeriodType.java
new file mode 100644
index 0000000..2b6468e
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/ValidityPeriodType.java
@@ -0,0 +1,157 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Date;
+
+import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.Sequence;
+
+@Sequence
+public class ValidityPeriodType extends Object {
+ public ValidityPeriodType() {
+ }
+
+ @IntRange(minValue=0,maxValue=700)
+ @Asn1Default(value="0")
+ @Asn1Optional public Long validFromDay;
+
+ @IntRange(minValue=0,maxValue=1440)
+ @Asn1Optional public Long validFromTime;
+
+ @IntRange(minValue=-60, maxValue=60)
+ @Asn1Optional public Long validFromUTCOffset;
+
+ @IntRange(minValue=0,maxValue=370)
+ @Asn1Default(value="0")
+ @Asn1Optional public Long validUntilDay;
+
+ @IntRange(minValue=0,maxValue=1440)
+ @Asn1Optional public Long validUntilTime;
+
+ @IntRange(minValue=-60, maxValue=60)
+ @Asn1Optional public Long validUntilUTCOffset;
+
+ public Long getValidFromDay() {
+
+ if (validFromDay == null) {
+ return new Long(0);
+ }
+
+ return this.validFromDay;
+ }
+
+ public Long getValidFromTime() {
+
+ return this.validFromTime;
+ }
+
+ public Long getValidUntilDay() {
+
+ if (validUntilDay == null) {
+ return new Long(0);
+ }
+
+ return this.validUntilDay;
+ }
+
+ public Long getValidUntilTime() {
+
+ return this.validUntilTime;
+ }
+
+ public void setValidFromDay(Long validFromDay) {
+
+ this.validFromDay = validFromDay;
+ }
+
+ public void setValidFromTime(Long validFromTime) {
+
+ this.validFromTime = validFromTime;
+ }
+
+ public void setValidUntilDay(Long validUntilDay) {
+
+ this.validUntilDay = validUntilDay;
+ }
+
+ public void setValidUntilTime(Long validUntilTime) {
+
+ this.validUntilTime = validUntilTime;
+ }
+
+ public void setValidityDates (Date fromDate, Date untilDate, Date issuingDate){
+
+ if (issuingDate == null || fromDate == null) return;
+
+ this.validFromDay = DateTimeUtils.getDateDifference(issuingDate,fromDate);
+ this.validFromTime = DateTimeUtils.getTime(fromDate);
+
+ if (untilDate != null){
+ this.validUntilDay = DateTimeUtils.getDateDifference(fromDate, untilDate);
+ this.validUntilTime = DateTimeUtils.getTime(untilDate);
+ }
+
+ }
+
+ public Date getValidFromDate(Date issuingDate){
+
+ return DateTimeUtils.getDate(issuingDate, this.validFromDay, this.validFromTime);
+
+ }
+
+ public Date getValidUntilDate(Date issuingDate){
+
+ if (issuingDate == null) return null;
+
+ if (this.validFromDay == null) {
+ this.validFromDay = 0L;
+ }
+
+ if (this.validUntilDay == null) {
+ return null;
+ }
+
+
+ return DateTimeUtils.getDate(issuingDate, this.validFromDay + this.validUntilDay, this.validUntilTime);
+
+ }
+
+ public Long getValidFromUTCOffset() {
+ return validFromUTCOffset;
+ }
+
+ public void setValidFromUTCOffset(Long validFromUTCOffset) {
+ this.validFromUTCOffset = validFromUTCOffset;
+ }
+
+ public Long getValidUntilUTCOffset() {
+ return validUntilUTCOffset;
+ }
+
+ public void setValidUntilUTCOffset(Long validUntilUTCOffset) {
+ this.validUntilUTCOffset = validUntilUTCOffset;
+ }
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/VatDetailType.java b/src/org/uic/ticket/api/asn/omv2/VatDetailType.java
new file mode 100644
index 0000000..de1fa00
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/VatDetailType.java
@@ -0,0 +1,82 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+
+@Sequence
+public class VatDetailType extends Object {
+ public VatDetailType() {
+ }
+
+ @IntRange(minValue = 1, maxValue = 999)
+ public Long country;
+
+ @IntRange(minValue = 0, maxValue = 999)
+ public Long percentage;
+
+ @Asn1Optional public Asn1BigInteger amount;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String vatId;
+
+ public Long getCountry() {
+ return country;
+ }
+
+ public void setCountry(Long country) {
+ this.country = country;
+ }
+
+ public Long getPercentage() {
+ return percentage;
+ }
+
+ public void setPercentage(Long percentage) {
+ this.percentage = percentage;
+ }
+
+ public Long getAmount() {
+ return Asn1BigInteger.toLong(amount);
+ }
+
+ public void setAmount(Long amount) {
+ this.amount = Asn1BigInteger.toAsn1(amount);
+ }
+
+ public String getVatId() {
+ return vatId;
+ }
+
+ public void setVatId(String vatId) {
+ this.vatId = vatId;
+ }
+
+
+
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/ViaStationType.java b/src/org/uic/ticket/api/asn/omv2/ViaStationType.java
new file mode 100644
index 0000000..21d5428
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/ViaStationType.java
@@ -0,0 +1,170 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Default;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+import net.gcdc.asn1.datatypesimpl.SequenceOfStringIA5;
+
+@Sequence
+@HasExtensionMarker
+public class ViaStationType extends Object {
+ public ViaStationType() {
+ }
+
+ @Asn1Default("stationUIC")
+ @Asn1Optional public CodeTableType stationCodeTable;
+
+ @IntRange(minValue=1,maxValue=9999999)
+ @Asn1Optional public Long stationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String stationIA5;
+
+ @Asn1Optional public SequenceOfViaStationType alternativeRoutes;
+
+ @Asn1Optional public SequenceOfViaStationType route;
+
+ @Asn1Optional public Boolean border = false;
+
+ @Asn1Optional public SequenceOfCarrierNum carriersNum;
+
+ @Asn1Optional public SequenceOfStringIA5 carriersIA5;
+
+ @Asn1Optional public Asn1BigInteger seriesId;
+
+ @Asn1Optional public Asn1BigInteger routeId;
+
+
+
+
+
+ public CodeTableType getStationCodeTable() {
+
+ if (stationCodeTable == null) {
+ return CodeTableType.stationUIC;
+ }
+
+ return this.stationCodeTable;
+ }
+
+ public Long getStationNum() {
+
+ return this.stationNum;
+ }
+
+ public String getStationIA5() {
+
+ return this.stationIA5;
+ }
+
+ public SequenceOfViaStationType getAlternativeRoutes() {
+
+ return this.alternativeRoutes;
+ }
+
+ public SequenceOfViaStationType getRoute() {
+
+ return this.route;
+ }
+
+ public Boolean getBorder() {
+
+ return this.border;
+ }
+
+ public SequenceOfCarrierNum getCarriersNum() {
+
+ return this.carriersNum;
+ }
+
+ public SequenceOfStringIA5 getCarriersIA5() {
+
+ return this.carriersIA5;
+ }
+
+ public Long getSeriesId() {
+
+ return Asn1BigInteger.toLong(this.seriesId);
+ }
+
+ public Long getRouteId() {
+
+ return Asn1BigInteger.toLong(this.routeId);
+ }
+
+ public void setStationCodeTable(CodeTableType stationCodeTable) {
+
+ this.stationCodeTable = stationCodeTable;
+ }
+
+ public void setStationNum(Long stationNum) {
+
+ this.stationNum = stationNum;
+ }
+
+ public void setStationIA5(String stationIA5) {
+
+ this.stationIA5 = stationIA5;
+ }
+
+ public void setAlternativeRoutes(SequenceOfViaStationType alternativeRoutes) {
+
+ this.alternativeRoutes = alternativeRoutes;
+ }
+
+ public void setRoute(SequenceOfViaStationType route) {
+
+ this.route = route;
+ }
+
+ public void setBorder(Boolean border) {
+
+ this.border = border;
+ }
+
+ public void setCarriersNum(SequenceOfCarrierNum carriersNum) {
+
+ this.carriersNum = carriersNum;
+ }
+
+ public void setCarriersIA5(SequenceOfStringIA5 carriersIA5) {
+
+ this.carriersIA5 = carriersIA5;
+ }
+
+ public void setSeriesId(Long seriesId) {
+
+ this.seriesId = Asn1BigInteger.toAsn1(seriesId);
+ }
+
+ public void setRouteId(Long routeId) {
+
+ this.routeId = Asn1BigInteger.toAsn1(routeId);
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/VoucherData.java b/src/org/uic/ticket/api/asn/omv2/VoucherData.java
new file mode 100644
index 0000000..1528680
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/VoucherData.java
@@ -0,0 +1,298 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+
+
+@Sequence
+@HasExtensionMarker
+public class VoucherData extends Object {
+ public VoucherData() {
+ }
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String referenceIA5;
+
+ @Asn1Optional public Asn1BigInteger referenceNum;
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long productOwnerNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productOwnerIA5;
+
+ @IntRange(minValue=0,maxValue=65535)
+ @Asn1Optional public Long productIdNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String productIdIA5;
+
+ @IntRange(minValue=2016,maxValue=2269)
+ public Long validFromYear;
+
+ @IntRange(minValue=0,maxValue=370)
+ public Long validFromDay;
+
+ @IntRange(minValue=2016,maxValue=2269)
+ public Long validUntilYear;
+
+ @IntRange(minValue=0,maxValue=370)
+ public Long validUntilDay;
+
+ @Asn1Optional public Long value;
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long type;
+
+ @RestrictedString(CharacterRestriction.UTF8String)
+ @Asn1Optional public String infoText;
+
+ @Asn1Optional public ExtensionData extension;
+
+
+ public String getReferenceIA5() {
+
+ return this.referenceIA5;
+ }
+
+ public Asn1BigInteger getReferenceNum() {
+
+ return this.referenceNum;
+ }
+
+ public Long getProductOwnerNum() {
+
+ return this.productOwnerNum;
+ }
+
+ public String getProductOwnerIA5() {
+
+ return this.productOwnerIA5;
+ }
+
+ public Long getProductIdNum() {
+
+ return this.productIdNum;
+ }
+
+ public String getProductIdIA5() {
+
+ return this.productIdIA5;
+ }
+
+ public Long getValidFromYear() {
+
+ return this.validFromYear;
+ }
+
+ public Long getValidFromDay() {
+
+ return this.validFromDay;
+ }
+
+ public Long getValidUntilYear() {
+
+ return this.validUntilYear;
+ }
+
+ public Long getValidUntilDay() {
+
+ return this.validUntilDay;
+ }
+
+ public Long getValue() {
+
+ return this.value;
+ }
+
+ public Long getType() {
+
+ return this.type;
+ }
+
+ public String getInfoText() {
+
+ return this.infoText;
+ }
+
+ public ExtensionData getExtension() {
+
+ return this.extension;
+ }
+
+ public void setReferenceIA5(String referenceIA5) {
+
+ this.referenceIA5 = referenceIA5;
+ }
+
+ public void setReferenceNum(Asn1BigInteger referenceNum) {
+
+ this.referenceNum = referenceNum;
+ }
+
+ public void setProductOwnerNum(Long productOwnerNum) {
+
+ this.productOwnerNum = productOwnerNum;
+ }
+
+ public void setProductOwnerIA5(String productOwnerIA5) {
+
+ this.productOwnerIA5 = productOwnerIA5;
+ }
+
+ public void setProductIdNum(Long productIdNum) {
+
+ this.productIdNum = productIdNum;
+ }
+
+ public void setProductIdIA5(String productIdIA5) {
+
+ this.productIdIA5 = productIdIA5;
+ }
+
+ public void setValidFromYear(Long validFromYear) {
+
+ this.validFromYear = validFromYear;
+ }
+
+ public void setValidFromDay(Long validFromDay) {
+
+ this.validFromDay = validFromDay;
+ }
+
+ public void setValidUntilYear(Long validUntilYear) {
+
+ this.validUntilYear = validUntilYear;
+ }
+
+ public void setValidUntilDay(Long validUntilDay) {
+
+ this.validUntilDay = validUntilDay;
+ }
+
+ public void setValue(Long value) {
+
+ this.value = value;
+ }
+
+ public void setType(Long type) {
+
+ this.type = type;
+ }
+
+ public void setInfoText(String infoText) {
+
+ this.infoText = infoText;
+ }
+
+ public void setExtension(ExtensionData extension) {
+
+ this.extension = extension;
+ }
+
+
+ public void setValidity (Date fromDate , Date untilDate){
+
+ Calendar fromCal = Calendar.getInstance();
+ fromCal.clear();
+ fromCal.setTime(fromDate);
+
+ this.validFromYear = new Long( fromCal.get(Calendar.YEAR));
+ this.validFromDay = new Long (fromCal.get(Calendar.DAY_OF_YEAR));
+
+ if (untilDate == null) return;
+
+ Calendar untilCal = Calendar.getInstance();
+ untilCal.clear();
+ untilCal.setTime(untilDate);
+
+ this.validUntilYear = new Long( untilCal.get(Calendar.YEAR));
+ this.validUntilDay = new Long (untilCal.get(Calendar.DAY_OF_YEAR));
+
+ }
+
+
+ public void setValidFrom (Date fromDate){
+
+ if (fromDate == null) return;
+
+ Calendar fromCal = Calendar.getInstance();
+ fromCal.clear();
+ fromCal.setTime(fromDate);
+
+ this.validFromYear = new Long( fromCal.get(Calendar.YEAR));
+ this.validFromDay = new Long (fromCal.get(Calendar.DAY_OF_YEAR));
+
+ }
+
+ public void setValidUntil (Date untilDate){
+
+ if (untilDate == null) return;
+
+ Calendar untilCal = Calendar.getInstance();
+ untilCal.clear();
+ untilCal.setTime(untilDate);
+
+ this.validUntilYear = new Long( untilCal.get(Calendar.YEAR));
+ this.validUntilDay = new Long (untilCal.get(Calendar.DAY_OF_YEAR));
+
+ }
+
+ public Date getValidFrom(){
+
+ if (this.validFromYear == null || this.validFromYear == 0) return null;
+
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.setTimeZone(TimeZone.getTimeZone("UTC"));
+ cal.set(Calendar.YEAR, this.validFromYear.intValue());
+ cal.set(Calendar.DAY_OF_YEAR, this.validFromDay.intValue());
+
+ return cal.getTime();
+
+ }
+
+ public Date getValidUntil(){
+
+ if (this.validUntilYear == null || this.validUntilYear == 0) return null;
+
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.setTimeZone(TimeZone.getTimeZone("UTC"));
+ cal.set(Calendar.YEAR, this.validUntilYear.intValue());
+ cal.set(Calendar.DAY_OF_YEAR, this.validUntilDay.intValue());
+
+ return cal.getTime();
+
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/ZoneType.java b/src/org/uic/ticket/api/asn/omv2/ZoneType.java
new file mode 100644
index 0000000..33eac99
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/ZoneType.java
@@ -0,0 +1,171 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.asn.omv2;
+
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypes.Asn1Default;
+
+import net.gcdc.asn1.datatypes.Asn1Optional;
+import net.gcdc.asn1.datatypes.CharacterRestriction;
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+import net.gcdc.asn1.datatypes.IntRange;
+import net.gcdc.asn1.datatypes.RestrictedString;
+import net.gcdc.asn1.datatypes.Sequence;
+import net.gcdc.asn1.datatypesimpl.OctetString;
+import net.gcdc.asn1.datatypesimpl.SequenceOfUnrestrictedLong;
+
+@Sequence
+@HasExtensionMarker
+
+public class ZoneType extends Object {
+ public ZoneType() {
+ }
+
+ @IntRange(minValue=1,maxValue=32000)
+ @Asn1Optional public Long carrierNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String carrierIA5;
+
+ @Asn1Default("stationUIC")
+ @Asn1Optional public CodeTableType stationCodeTable;
+
+ @IntRange(minValue=0,maxValue=9999999)
+ @Asn1Optional public Long entryStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String entryStationIA5;
+
+ @IntRange(minValue=0,maxValue=9999999)
+ @Asn1Optional public Long terminatingStationNum;
+
+ @RestrictedString(CharacterRestriction.IA5String)
+ @Asn1Optional public String terminatingStationIA5;
+
+ @Asn1Optional public Asn1BigInteger city;
+
+ @Asn1Optional public SequenceOfUnrestrictedLong zoneId;
+
+ @Asn1Optional public OctetString binaryZoneId;
+
+ @Asn1Optional public String nutsCode;
+
+
+ public Long getCarrierNum() {
+
+ return this.carrierNum;
+ }
+
+ public String getCarrierIA5() {
+
+ return this.carrierIA5;
+ }
+
+ public CodeTableType getStationCodeTable() {
+
+ if (stationCodeTable == null) {
+ return CodeTableType.stationUIC;
+ }
+
+ return this.stationCodeTable;
+ }
+
+ public Long getEntryStationNum() {
+ return this.entryStationNum;
+ }
+
+ public String getEntryStationIA5() {
+ return this.entryStationIA5;
+ }
+
+ public Long getTerminatingStationNum() {
+ return this.terminatingStationNum;
+ }
+
+ public String getTerminatingStationIA5() {
+ return this.terminatingStationIA5;
+ }
+
+ public Asn1BigInteger getCity() {
+ return this.city;
+ }
+
+ public SequenceOfUnrestrictedLong getZoneId() {
+ return this.zoneId;
+ }
+
+ public byte[] getBinaryZoneId() {
+
+ return binaryZoneId.toByteArray();
+
+ }
+
+ public String getNutsCode() {
+ return this.nutsCode;
+ }
+
+ public void setCarrierNum(Long carrierNum) {
+ this.carrierNum = carrierNum;
+ }
+
+ public void setCarrierIA5(String carrierIA5) {
+ this.carrierIA5 = carrierIA5;
+ }
+
+ public void setStationCodeTable(CodeTableType stationCodeTable) {
+ this.stationCodeTable = stationCodeTable;
+ }
+
+ public void setEntryStationNum(Long entryStationNum) {
+ this.entryStationNum = entryStationNum;
+ }
+
+ public void setEntryStationIA5(String entryStationIA5) {
+ this.entryStationIA5 = entryStationIA5;
+ }
+
+ public void setTerminatingStationNum(Long terminatingStationNum) {
+ this.terminatingStationNum = terminatingStationNum;
+ }
+
+ public void setTerminatingStationIA5(String terminatingStationIA5) {
+ this.terminatingStationIA5 = terminatingStationIA5;
+ }
+
+ public void setCity(Asn1BigInteger city) {
+ this.city = city;
+ }
+
+ public void setZoneId(SequenceOfUnrestrictedLong zoneId) {
+ this.zoneId = zoneId;
+ }
+
+ public void setBinaryZoneId(byte[] binaryZoneId) {
+
+ this.binaryZoneId = new OctetString(binaryZoneId);
+
+ }
+
+ public void setNutsCode(String nutsCode) {
+ this.nutsCode = nutsCode;
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/asn/omv2/uicBarcodeFCBv2.0.asn b/src/org/uic/ticket/api/asn/omv2/uicBarcodeFCBv2.0.asn
new file mode 100644
index 0000000..4b6d5fb
--- /dev/null
+++ b/src/org/uic/ticket/api/asn/omv2/uicBarcodeFCBv2.0.asn
@@ -0,0 +1,2039 @@
+-- Creator: ASN.1 Editor (http://asneditor.sourceforge.net)
+-- Author: ClemensGantert
+-- Created: Tue Aug 11 11:40:28 CEST 2015
+ASN-Module DEFINITIONS AUTOMATIC TAGS ::= BEGIN
+
+-- imports and exports
+-- EXPORTS ALL;
+
+
+-- changes:
+-- product id 1 bit more 65535
+-- open ticket transport mode EN 1545-1
+-- allowing -1 in differences of days between dates (validity of tickets crossing time zones)
+
+-- ##############################################################################################
+-- #
+-- # Draft version 2.0 - value 2 in the UIC bar code version element
+-- # (see element 2 in U_FLEX record definition in leaflet 918.9)
+-- #
+-- ##############################################################################################
+
+
+-- ##############################################################################################
+-- #
+-- # Naming and encoding conventions
+-- #
+-- # Elements included as String and as Numeric values:
+-- # Some elements are included in different formats to reduce the data size.
+-- # These elements must be included only once.
+-- # These elements are named with the same name and appendix
+-- # Num (numeric values)
+-- # IA5 (String values according to ASN IA5String (7Bit))
+-- # Example:
+-- # trainNum - in case of a numeric train number
+-- # trainIA5 - in case of a alphanumeric train Id
+-- #
+-- #
+-- # RICS codes must be used to encode companies (issuer, product owner, ...) where available
+-- # other codes are possible based on bilateral agreements
+-- # the format is kept more flexible to cover upcoming extensions of the RICS code by ERA
+-- #
+-- # Stations can be coded using the UIC and upcoming ERA code lists. Proprietary codes are
+-- # possible based on bilateral agreements. Format: 1..9999999 or alphanumeric without
+-- # special character (IA5String)
+-- #
+-- #
+-- # ! INTEGERS must not exceed the value of 9,223,372,036,854,775,807 (64 bit) even in case
+-- # ! they are unrestricted!!!
+-- # !
+-- # ! Some elements like ReferenceNum or cardIdNum are defined as an unrestricted integer.
+-- # ! Unlike other numerical values the cardIdNum and referenceNum can be larger than a usual 32 bit Integer
+-- # ! Some ASN.1 implementation tools are limited to 32 bit integers which is too small.
+-- # ! Please ensure to use a tool capable of dealing with larger numbers.
+-- #
+-- # Optional BOOLEANs have three values: "true", "false", "unknown" = the Boolean is absent from the data.
+-- #
+-- #
+-- # Encoding of time:
+-- # time is encoded as the number of minutes of the day 0 = 00:00, 1439 = 23:59,
+-- # time data elements end with "time" in their name
+-- #
+-- # Encoding of date:
+-- # .........................................................................................................
+-- # The issuing date is given in UTC, but some other date values are given in local time where the exact time zone is not known.
+-- #
+-- # For local dates the date is associated with the corresponding location:
+-- # e.g.:
+-- # valid from date -> location where the journey starts
+-- # valid until date -> location where the journey covered by the ticket ends
+-- #
+-- # there could be rare cases where this does not provide a unique interpretation:
+-- # e.g. open ticket or pass without start and end location for a collection of zones or countries with different time zones.
+-- # in these cases the fare conditions must clarify the rules for these cases (e.g. by allowing to use the
+-- # ticket a few hours after the end of validity).
+-- #
+-- # The difference in days is calculated from dates only, ignoring the time and time zone information.
+-- #
+-- # example 1: (31.12.2017 23:05 UTC == 01.01.2018 00:05 CET) :
+-- # issuing date (UTC): 31.12.2017 23:05 == 01.01.2018 00:05 CET
+-- # issuingYear = 2017
+-- # issuingDay = 365
+-- # issuingTime = 1385
+-- # local departure date (CET): 01.01.2018 00:15 == 31.12.2017 23:15 UTC
+-- # departureDate = 1 (= 01.01.2018 - 31.12.2017)
+-- # departureTime = 15
+-- # departureUTCOffset = -4 (UTC = local + offset * 15 Minutes)
+-- #
+-- #
+-- # example 2: (01.01.2018 00:05 UTC == 31.12.2017 20:05 AST)
+-- # issuing date (UTC): 01.01.2018 00:05 UTC == 31.12.2017 20:05 AST
+-- # issuingYear = 2018
+-- # issuingDay = 1
+-- # issuingTime = 5
+-- # local departure date (AST): 31.12.2017 22:05 AST == 1.1.2018 02:05 UTC
+-- # departureDate = -1 (= 31.12.2017 - 01.01.2018)
+-- # departureTime = 1325
+-- # departureUTCOffset = 16 (UTC = local + offset * 15 Minutes)
+-- #
+-- # departureDate can become -1 with a departure west of the GMT zone only
+-- #
+-- #
+-- #
+-- #
+-- #
+-- #
+-- # ASN.1 Extensions:
+-- #
+-- # The specification makes use of extension (",...").
+-- # These extensions might be defined in future versions of the UIC specification
+-- # Implementations must support the extension feature of ASN.1, at least they must be able to ignore extensions while decoding the data
+-- # ASN.1 extensions will be defined by UIC. It is not allowed to define bilateral extensions.
+-- #
+-- # Bilateral Extensions:
+-- # Bilateral extensions can be included in the data element "ExtensionData".
+-- #
+-- #
+-- #
+-- #########################################################################################
+
+
+-- ############################################################################################
+
+
+-- type assignments
+
+ -- #########################################################################################
+ -- the basic entry point of the data structure
+ -- the data include:
+ -- -issuer informations
+ -- -the details of the transport document
+ -- -informations required for the control process
+ -- -informations on the travelers independent from the transport document
+ -- -proprietary extensions
+ --
+ -- ##########################################################################################
+ UicRailTicketData ::= SEQUENCE {
+ -- data specific to the issuer
+ issuingDetail IssuingData,
+
+ -- data on the travelers
+ travelerDetail TravelerData OPTIONAL,
+
+ -- data of the transport document
+ --!!! proposal: replace this by a comment in the lealet on the total size of the barcode: more than one document to be used on bilateral agreement only
+ transportDocument SEQUENCE OF DocumentData OPTIONAL,
+
+ -- data specific to support the ticket control process
+ controlDetail ControlData OPTIONAL,
+
+ -- proprietary data defined bilaterally
+ extension SEQUENCE OF ExtensionData OPTIONAL
+ ,...
+ }
+
+
+
+ -- ###########################################################################################
+ -- the choice on the different transport documents that can be included in the bar code data:
+ -- - reservation of seat / couchette or berths (IRT, RES, BOA)
+ -- - reservation of car carriage (VET)
+ -- - open ticket (NRT including NRT group ticket) (NRT, GRT, SUP, UPD, COI)
+ -- - Rail passes (including Eurail, Interail and local passes) (RPT)
+ -- - Voucher (TRV)
+ -- - Customer Cards (including bonus cards and reduction cards)
+ -- - counter marks issued for group tickets
+ -- - parking ground tickets
+ -- - FIP tickets
+ -- - station access / station passage tickets
+ -- - proprietary documents as an extension
+ -- ############################################################################################
+ DocumentData ::= SEQUENCE {
+
+ -- token
+ -- specific id to be exchanged with the ticket (e.g. id of the phone in case of tickets linked to a phone)
+ token TokenType OPTIONAL,
+
+ -- choice of the ticket
+ ticket CHOICE
+ {
+
+ -- Reservation (without car carriage) (IRT and RES)
+ reservation ReservationData,
+
+ -- Reservation of car carriage
+ carCarriageReservation CarCarriageReservationData,
+
+ -- open ticket specification (NRT)
+ openTicket OpenTicketData,
+
+ -- pass specification (RPT) including Eurail and Interrail
+ pass PassData,
+
+ -- voucher
+ voucher VoucherData,
+
+ -- customer card either to identify a customer and / or to provide reductions
+ customerCard CustomerCardData,
+
+ -- countermark to accompagny a group ticket
+ counterMark CountermarkData,
+
+ -- car parking slot
+ parkingGround ParkingGroundData,
+
+ -- FIP duty ticket
+ fipTicket FIPTicketData,
+
+ -- ticket to pass the gates at a station
+ stationPassage StationPassageData,
+
+ -- proprietary data defined bilaterally
+ extension ExtensionData,
+
+ -- delay confirmation
+ delayConfirmation DelayConfirmation
+
+ ,...
+ }
+ ,...
+ }
+
+ -- ########################################################################################
+ -- confirmation of the delay of a train
+ --
+ -- ########################################################################################
+ DelayConfirmation ::= SEQUENCE {
+
+ -- reference of the delay confirmation
+ referenceIA5 IA5String OPTIONAL,
+ referenceNum INTEGER OPTIONAL,
+
+ -- train number of the delayed train - numeric or alphanumeric
+ trainNum INTEGER OPTIONAL,
+ trainIA5 IA5String OPTIONAL,
+
+ -- departure date of the delayed train in local time
+ -- number of year
+ departureYear INTEGER (2016..2269) OPTIONAL,
+ -- number of the day in the year (1.1. = 1)
+ departureDay INTEGER (1..366) OPTIONAL,
+ departureTime INTEGER (0..1439) OPTIONAL,
+ departureUTCOffset INTEGER (-60..60) OPTIONAL, -- offset in units of 15 minutes from local time to UTC
+ -- (UTC = local + offset * 15 Minutes)
+
+
+ -- station where the delay became relevant
+ stationCodeTable CodeTableType DEFAULT stationUIC,
+ stationNum INTEGER (1..9999999) OPTIONAL,
+ stationIA5 IA5String OPTIONAL,
+
+ -- delay in minutes at the mentioned station
+ delay INTEGER (1..999),
+
+ -- indication that the train was cancelled
+ trainCancelled BOOLEAN,
+
+ -- type of confirmation provided
+ confirmationType ConfirmationType DEFAULT travelerDelayConfirmation,
+
+ -- affected original ticket(s)
+ affectedTickets SEQUENCE OF TicketLinkType OPTIONAL,
+
+ -- info text
+ infoText UTF8String OPTIONAL,
+
+ -- proprietary data defined bilaterally
+ extension ExtensionData OPTIONAL
+ ,...
+ }
+
+ ConfirmationType ::= ENUMERATED {
+ trainDelayConfirmation (0), -- confirmation of train delay, whether the traveler was on board in unconfirmed
+ travelerDelayConfirmation (1), -- confirmation that the traveler was on board of the delayed train
+ trainLinkedTicketDelay (2) -- confirmation that a ticket linked to the delayed train was issued
+ ,...
+ }
+
+
+ -- ########################################################################################
+ -- Details of the issuer and the issue of the ticket
+ -- - details on the issuer
+ -- - indication of test tickets (specimen)
+ -- - payment details: method of payment, currency
+ -- - proprietary PNR of the issuer to be used to identify the sale within
+ -- the issuers ecosystem
+ -- - web link to display more information for the customer
+ -- - proprietary extension data
+ -- ########################################################################################
+ IssuingData ::= SEQUENCE {
+
+ -- provider of the signature (RICS code)
+ securityProviderNum INTEGER (1..32000) OPTIONAL,
+ securityProviderIA5 IA5String OPTIONAL,
+
+ -- issuer of the transport document if the issuer is different from the security provider
+ -- (RICS code)
+ issuerNum INTEGER (1..32000) OPTIONAL,
+ issuerIA5 IA5String OPTIONAL,
+
+ -- issuing time stamp in UTC
+ -- number of year
+ issuingYear INTEGER (2016..2269),
+ -- number of the day in the year (1.1. = 1)
+ issuingDay INTEGER (1..366),
+ -- The number of the minutes of issue might be used in case of account
+ -- based ticketing with a delay of n minutes for the replication of central
+ -- booking data to the control devices (e.g. at SBB)
+ -- The time can be compared with the last synchronization time of
+ -- the control device
+ issuingTime INTEGER (0..1439) OPTIONAL,
+
+ -- name of the issuer (E.g. short name mentioned in RICS code table)
+ issuerName UTF8String OPTIONAL,
+
+ -- specimen indicates a test specimen not valid for travelling
+ specimen BOOLEAN,
+
+ -- secure paper indicates that this barcode is issued with a secure paper ticket
+ -- to ensure the uniqueness of the ticket. This allows to use the same control
+ -- procedure as for e-tickets also for anonymous tickets
+ -- the double use of the ticket is in this case excluded by the secure paper
+ securePaperTicket BOOLEAN,
+
+ -- indicates that the ticket is valid for traveling or still needs activation
+ activated BOOLEAN,
+
+ -- currency of the price: ISO4217 currency codes
+ currency IA5String (SIZE(3)) DEFAULT "EUR",
+
+ -- fraction of the prices included
+ currencyFract INTEGER (1..3) DEFAULT 2,
+
+ -- PNR used by the issuer to identify the document
+ issuerPNR IA5String OPTIONAL,
+
+ -- proprietary data defined bilaterally
+ extension ExtensionData OPTIONAL,
+
+ -- location of sale in case of a sale on board of a train
+ -- numeric train number or alphanumeric id of the train where the ticket was sold
+ issuedOnTrainNum INTEGER OPTIONAL,
+ issuedOnTrainIA5 IA5String OPTIONAL,
+ -- line number
+ issuedOnLine INTEGER OPTIONAL,
+
+ -- point of sale
+ pointOfSale GeoCoordinateType OPTIONAL
+ ,...
+ }
+
+ -- ###################################################################################
+ -- data supporting the control process
+ -- - list of items which the traveler can use to identify himself or the unique
+ -- usage of the ticket
+ -- (card ids, parts or identity card numbers, credit card numbers,..)
+ -- - hints on the validation to be made on board
+ --
+ -- ###################################################################################
+ ControlData ::= SEQUENCE {
+
+ -- cards that can be used to identify the ticket holder
+ identificationByCardReference SEQUENCE OF CardReferenceType OPTIONAL,
+
+ -- id-card id must be checked to identify the traveler
+ identificationByIdCard BOOLEAN,
+
+ -- passport id must be checked to identify the traveler
+ identificationByPassportId BOOLEAN,
+
+ -- other items which could be used to identify the ticket holder
+ -- (for future use, code list to be defined)
+ identificationItem INTEGER OPTIONAL,
+
+ -- validation of the passport is required (e.g. in case of Eurail)
+ passportValidationRequired BOOLEAN,
+
+ -- online validation of the ticket required
+ onlineValidationRequired BOOLEAN,
+
+ -- percentage of the tickets to be validated in more detail
+ -- (i.e. via online check or detailed checks later-on)
+ randomDetailedValidationRequired INTEGER (0..99) OPTIONAL,
+
+ -- manual validation of the traveler age required (in case of reductions)
+ ageCheckRequired BOOLEAN,
+
+ -- manual validation of the travelers reduction card required (in case of reductions)
+ reductionCardCheckRequired BOOLEAN,
+
+ -- controler info text
+ infoText UTF8String OPTIONAL,
+
+ -- additional tickets that should be controlled
+ includedTickets SEQUENCE OF TicketLinkType OPTIONAL,
+
+ -- proprietary data defined bilaterally
+ extension ExtensionData OPTIONAL
+ ,...
+ }
+
+ -- ################################################################################
+ -- Traveler data
+ -- these data do not include tariff details of the booked tariffs,
+ -- tariff data are included in the transport document details and might
+ -- have a reference to the traveler defined here.
+ -- - personal data of the travellers
+ -- - the index of the list can be used to identify the
+ -- traveler within other contexts (e.g. in assigned tariffs)
+ -- ################################################################################
+ TravelerData ::= SEQUENCE {
+ -- traveler list
+ traveler SEQUENCE OF TravelerType OPTIONAL,
+
+ -- ISO 639-1 coding of the language preferred for the traveler / ticket holder
+ preferredLanguage IA5String (SIZE(2)) OPTIONAL,
+
+ -- name of the group in case of a group ticket
+ groupName UTF8String OPTIONAL
+ ,...
+ }
+
+ -- ####################################################################################
+ -- the following part contains the different transport document specifications
+ -- ####################################################################################
+
+
+ -- ####################################################################################
+ -- reservations of seats , couchettes and berths
+ -- included are the data defined in:
+ -- - leaflet 918.1 for reservation data exchange
+ -- - a few additional data currently used by some railways via different interfaces
+ -- - information on trach an dplafoorm where the coach stops
+ -- - additional second coach for large groups
+ -- ####################################################################################
+ ReservationData ::= SEQUENCE {
+
+ -- train number - numeric or alphanumeric
+ trainNum INTEGER OPTIONAL,
+ trainIA5 IA5String OPTIONAL,
+
+ -- departure date in local time
+ -- number of the days calculated from the issuing date
+ departureDate INTEGER (-1..370) DEFAULT 0,
+
+
+ -- reservation reference according ton 918.1 in case ade via Hermes
+ referenceIA5 IA5String OPTIONAL,
+ referenceNum INTEGER OPTIONAL,
+
+ -- organization responsible for the product definition
+ -- (RICS Code to be used as standard)
+ productOwnerNum INTEGER (1..32000) OPTIONAL,
+ productOwnerIA5 IA5String OPTIONAL,
+
+ -- product id to identify the issued product codelist defined by the product owner
+ -- !!! productIdNum extended
+ productIdNum INTEGER (0..65535) OPTIONAL,
+ productIdIA5 IA5String OPTIONAL,
+
+ -- service brand: code list https://uic.org/service-brand-code-list
+ serviceBrand INTEGER (0..32000) OPTIONAL,
+ serviceBrandAbrUTF8 UTF8String OPTIONAL,
+ serviceBrandNameUTF8 UTF8String OPTIONAL,
+
+ -- service code list from 918.1 (seat couchette,..)
+ service ServiceType DEFAULT seat,
+
+ -- code table used to encode stations
+ stationCodeTable CodeTableType DEFAULT stationUICReservation,
+
+ -- origin station code
+ fromStationNum INTEGER (1..9999999) OPTIONAL,
+ fromStationIA5 IA5String OPTIONAL,
+
+ -- destination station code
+ toStationNum INTEGER (1..9999999) OPTIONAL,
+ toStationIA5 IA5String OPTIONAL,
+
+ -- origin station name
+ fromStationNameUTF8 UTF8String OPTIONAL,
+
+ -- destination station name
+ toStationNameUTF8 UTF8String OPTIONAL,
+
+ -- departure time
+ departureTime INTEGER (0..1439),
+ departureUTCOffset INTEGER (-60..60) OPTIONAL, -- offset in units of 15 minutes from local time to UTC
+ -- (UTC = local + offset * 15 Minutes)
+
+ -- arrival date and time in local time
+ -- number of days counted from the departure date
+ -- !!! proposal for change: arrivalDate INTEGER (-1..20) DEFAULT 0,
+ arrivalDate INTEGER (-1..20) DEFAULT 0,
+ arrivalTime INTEGER (0..1439) OPTIONAL,
+ arrivalUTCOffset INTEGER (-60..60) OPTIONAL, -- offset in units of 15 minutes from local time to UTC
+ -- (UTC = local + offset * 15 Minutes)
+ -- should be omitted in case it is the same as for departure
+
+ -- responsible carriers on the route
+ carrierNum SEQUENCE OF INTEGER (1..32000) OPTIONAL,
+ carrierIA5 SEQUENCE OF IA5String OPTIONAL,
+
+ -- travel class
+ classCode TravelClassType DEFAULT second,
+
+ -- service level code list from 918.1
+ serviceLevel IA5String (SIZE(1..2)) OPTIONAL,
+
+ -- places
+ places PlacesType OPTIONAL,
+
+ -- additional places in a second coach
+ additionalPlaces PlacesType OPTIONAL,
+
+ --bicycle places
+ bicyclePlaces PlacesType OPTIONAL,
+
+ -- compartment details (open space, wheelchair,..)
+ compartmentDetails CompartmentDetailsType OPTIONAL,
+
+ -- number of persons on the ticket without place numbers (on IRT)
+ numberOfOverbooked INTEGER (0..200) DEFAULT 0,
+
+ -- description of berths
+ berth SEQUENCE OF BerthDetailData OPTIONAL,
+
+ -- tariffs included (Adult, Children,... )
+ tariff SEQUENCE OF TariffType OPTIONAL,
+
+ -- type of the price (supplement,... )
+ priceType PriceTypeType DEFAULT travelPrice,
+
+ price INTEGER OPTIONAL,
+
+ vatDetail SEQUENCE OF VatDetailType OPTIONAL,
+
+ -- type of supplement - code list from 018.1
+ typeOfSupplement INTEGER (0..9) DEFAULT 0,
+
+ numberOfSupplements INTEGER (0..200) DEFAULT 0,
+
+ -- luggage restrictions and registered luggage
+ -- in case the luggage restrictions are general and do not depend on the
+ -- ticket type they should not be included
+ luggage LuggageRestrictionType OPTIONAL,
+
+ infoText UTF8String OPTIONAL,
+
+
+ -- bilaterally agreed proprietary extension
+ extension ExtensionData OPTIONAL
+ ,...
+ }
+
+ -- #################################################################################
+ -- details on the VAT included to be used in after sale processes
+ -- #################################################################################
+ VatDetailType ::= SEQUENCE {
+
+ -- ISO 3166 numeric country code
+ country INTEGER (1..999),
+
+ -- 1/10th of a percent
+ percentage INTEGER (0..999),
+
+ -- amount of VAT, the currency and the currency fraction is included in the issuing data
+ amount INTEGER OPTIONAL,
+
+ -- european tax id of the company paying VAT
+ vatId IA5String OPTIONAL
+
+ }
+
+
+ -- #################################################################################
+ -- reservations of car carriage
+ -- included are the data defined in:
+ -- - leaflet 918.1 for reservation data exchange
+ -- - a few additional data currently used by some railways via different interfaces
+ -- #################################################################################
+ CarCarriageReservationData ::= SEQUENCE {
+
+ trainNum INTEGER OPTIONAL,
+ trainIA5 IA5String OPTIONAL,
+
+
+ -- loading / unloading of the car in local date and time
+ -- number of the days calculated from the issuing date
+ beginLoadingDate INTEGER (-1..370) DEFAULT 0,
+ beginLoadingTime INTEGER (0..1439) OPTIONAL,
+ endLoadingTime INTEGER (0..1439) OPTIONAL,
+ loadingUTCOffset INTEGER (-60..60) OPTIONAL, -- offset in units of 15 minutes from local time to UTC
+ -- (UTC = local + offset * 15 Minutes)
+
+
+ -- reservation reference according on 918.1 in case ade via Hermes
+ referenceIA5 IA5String OPTIONAL,
+ referenceNum INTEGER OPTIONAL,
+
+ -- organization responsible for the product definition
+ -- (RICS Code / proprietary code in case no RICS code is defined, proprietary codes must ensure to be unique)
+ productOwnerNum INTEGER (1..32000) OPTIONAL,
+ productOwnerIA5 IA5String OPTIONAL,
+
+ -- product id to identify the issued product codelist defined by the product owner
+ -- !!! productIdNum extended
+ productIdNum INTEGER (0..65535) OPTIONAL,
+ productIdIA5 IA5String OPTIONAL,
+
+ -- service brand: code list https://uic.org/service-brand-code-list
+ serviceBrand INTEGER (1..32000) OPTIONAL,
+ serviceBrandAbrUTF8 UTF8String OPTIONAL,
+ serviceBrandNameUTF8 UTF8String OPTIONAL,
+
+ stationCodeTable CodeTableType DEFAULT stationUICReservation,
+
+ fromStationNum INTEGER (1..9999999) OPTIONAL,
+ fromStationIA5 IA5String OPTIONAL,
+
+ toStationNum INTEGER (1..9999999) OPTIONAL,
+ toStationIA5 IA5String OPTIONAL,
+
+ fromStationNameUTF8 UTF8String OPTIONAL,
+ toStationNameUTF8 UTF8String OPTIONAL,
+
+ coach IA5String OPTIONAL,
+ place IA5String OPTIONAL,
+
+ compartmentDetails CompartmentDetailsType OPTIONAL,
+
+ -- description of the car
+ numberPlate IA5String,
+ trailerPlate IA5String OPTIONAL,
+ carCategory INTEGER (0..9),
+ boatCategory INTEGER (0..6) OPTIONAL,
+ textileRoof BOOLEAN,
+ roofRackType RoofRackType DEFAULT norack,
+
+ -- height of a roof rack in cm
+ roofRackHeight INTEGER (0..99) OPTIONAL,
+
+ -- number of boats on a rack
+ attachedBoats INTEGER (0..2) OPTIONAL,
+
+ -- number of biycles on a rack
+ attachedBicycles INTEGER (0..4) OPTIONAL,
+
+ -- number of surf boards on a rack
+ attachedSurfboards INTEGER (0..5) OPTIONAL,
+
+ -- reference to an entry on the loading list
+ loadingListEntry INTEGER (0..999) OPTIONAL,
+ loadingDeck LoadingDeckType DEFAULT upper,
+
+ -- responsible carriers on the route (RICS codes)
+ carrierNum SEQUENCE OF INTEGER (1..32000) OPTIONAL,
+ carrierIA5 SEQUENCE OF IA5String OPTIONAL,
+
+ tariff TariffType,
+ priceType PriceTypeType DEFAULT travelPrice,
+
+ price INTEGER OPTIONAL,
+
+ vatDetail SEQUENCE OF VatDetailType OPTIONAL,
+
+ infoText UTF8String OPTIONAL,
+ extension ExtensionData OPTIONAL
+ ,...
+ }
+
+
+ -- #####################################################################################
+ -- data for open tickets (NRT and group tickets)
+ -- included are the data defined in:
+ -- - the ticket layout (leaflet 918.8)
+ -- - the ticket bar code version 3 (leaflet 918.9)
+ -- - additional data based on 108.1 with some extensions as 108.1
+ -- does not provide well structured data,
+ -- especially concerning regional validity
+ --
+ -- #####################################################################################
+
+ OpenTicketData ::= SEQUENCE {
+
+ -- reference must be given either in numeric or alphanumeric format
+ referenceNum INTEGER OPTIONAL,
+ referenceIA5 IA5String OPTIONAL,
+
+ -- organization responsible for the product definition
+ -- (RICS Code / proprietary code in case no RICS code is defined, proprietary codes must ensure to be unique)
+ productOwnerNum INTEGER (1..32000) OPTIONAL,
+ productOwnerIA5 IA5String OPTIONAL,
+
+ -- product id to identify the issued product codelist defined by the product owner
+ -- !!! productIdNum extended
+ productIdNum INTEGER (0..65535) OPTIONAL,
+ productIdIA5 IA5String OPTIONAL,
+
+ -- to support other ticket content (e.g. VDV, UTPF, VÖV, CALYPSO)
+ -- issuer code using the default code table of the product owner
+ extIssuerId INTEGER OPTIONAL,
+ -- authorization id provided to the issuer by the product owner
+ issuerAutorizationId INTEGER OPTIONAL,
+
+ -- ticket includes the return trip - should be set to false if it is not relevant (e.g. zones)
+ returnIncluded BOOLEAN,
+
+ -- for tickets valid in regions without from or to stations no station is provided
+ stationCodeTable CodeTableType DEFAULT stationUIC,
+ fromStationNum INTEGER (1..9999999) OPTIONAL,
+ fromStationIA5 IA5String OPTIONAL,
+
+ -- for tickets valid in regions without from or to stations no station is provided
+ toStationNum INTEGER (1..9999999) OPTIONAL,
+ toStationIA5 IA5String OPTIONAL,
+
+ fromStationNameUTF8 UTF8String OPTIONAL,
+ toStationNameUTF8 UTF8String OPTIONAL,
+
+ -- description for manual evaluation in case structured data are not available
+ validRegionDesc UTF8String OPTIONAL,
+ -- specification of the ordered sequence of valid regions
+ validRegion SEQUENCE OF RegionalValidityType OPTIONAL,
+
+ -- return route description
+ -- the return route description can be omitted if it is identical to the
+ -- inversed outbound validRegion sequence
+ returnDescription ReturnRouteDescriptionType OPTIONAL,
+
+ -- temporal validity data in local time of the location where the journey starts
+ -- number of days from issuing date
+ validFromDay INTEGER (-1..700) DEFAULT 0,
+ validFromTime INTEGER (0..1439) OPTIONAL,
+ validFromUTCOffset INTEGER (-60..60) OPTIONAL, -- offset in units of 15 minutes from local time to UTC
+ -- (UTC = local + offset * 15 Minutes)
+
+ -- number of days from valid-from date, 0 = first day of validity
+ validUntilDay INTEGER (-1..370) DEFAULT 0,
+ validUntilTime INTEGER (0..1439) OPTIONAL,
+ validUntilUTCOffset INTEGER (-60..60) OPTIONAL, -- offset in units of 15 minutes from local time to UTC
+ -- (UTC = local + offset * 15 Minutes)
+ -- should be omitted in case it is the same as for departure
+
+ -- travel days of a ticket might be subject to a separate activation to be valid for traveling
+ -- here it is possible to list the activated days of the ticket:
+ -- list of activated days in case the entire ticket is not activated
+ -- the day is given by the number of days from the first day of validity
+ -- change in V2 1 --> 0..370
+ -- 0 = first day of validity
+ activatedDay SEQUENCE OF INTEGER (0..370) OPTIONAL,
+
+ classCode TravelClassType DEFAULT second,
+
+ -- servicelevel code according to leaflet 918.1 to encode other products
+ -- (e.g. PREMIUM, ...)
+ serviceLevel IA5String (SIZE(1..2)) OPTIONAL,
+
+ -- carriers involved in the transport (RICS codes)
+ -- the indication of carriers is mandatory on international routes, they can be
+ -- listed here but can also be included in viaDetails
+ carrierNum SEQUENCE OF INTEGER (1..32000) OPTIONAL,
+ carrierIA5 SEQUENCE OF IA5String OPTIONAL,
+
+
+ -- list of service brands for which the ticket is valid
+ -- in case the included service brands are listed all other brands are excluded
+ -- service brand: code list https://uic.org/service-brand-code-list
+ includedServiceBrands SEQUENCE OF INTEGER (1..32000) OPTIONAL,
+
+ -- list of service brands for which the ticket is not valid
+ -- service brand: code list https://uic.org/service-brand-code-list
+ excludedServiceBrands SEQUENCE OF INTEGER (1..32000) OPTIONAL,
+
+ tariffs SEQUENCE OF TariffType OPTIONAL,
+
+ price INTEGER OPTIONAL,
+
+ vatDetail SEQUENCE OF VatDetailType OPTIONAL,
+
+ infoText UTF8String OPTIONAL,
+
+ -- additional included open tickets
+ -- e.g. to include local city traffic on parts of a the route
+ includedAddOns SEQUENCE OF IncludedOpenTicketType OPTIONAL,
+
+ -- in case the luggage restrictions are general and do not depend
+ -- on the ticket type they should not be included
+ luggage LuggageRestrictionType OPTIONAL,
+
+ -- included or excluded transport modes
+ -- code list: EN 1545-1 (transport type code)
+ -- new data elements
+ includedTransportType SEQUENCE OF INTEGER (0..31) OPTIONAL,
+ excludedTransportType SEQUENCE OF INTEGER (0..31) OPTIONAL,
+
+ extension ExtensionData OPTIONAL
+ ,...
+ }
+
+
+
+ -- ####################################################################################
+ -- data for passes
+ -- included are the data defined in:
+ -- - the ticket layout (leaflet 918.8)
+ -- - the ticket bar code version 3 (leaflet 918.8)
+ -- ####################################################################################
+ PassData ::= SEQUENCE {
+
+ -- reference must be given in numeric or alphanumeric format
+ referenceNum INTEGER OPTIONAL,
+ referenceIA5 IA5String OPTIONAL,
+
+ -- organization responsible for the product definition
+ -- (RICS Code / proprietary code in case no RICS code is defined, proprietary codes must ensure to be unique)
+ productOwnerNum INTEGER (1..32000) OPTIONAL,
+ productOwnerIA5 IA5String OPTIONAL,
+
+ -- product id to identify the issued product codelist defined by the product owner
+ -- !!! productIdNum extended
+ productIdNum INTEGER (0..65535) OPTIONAL,
+ productIdIA5 IA5String OPTIONAL,
+
+ -- type of the pass, code list provided by the product owner
+ -- in case of Eurail:
+ -- 1 = Interrail
+ -- 2 = Eurail
+ -- 3 = Eurail Global (all countries)
+ passType INTEGER (1..250) OPTIONAL,
+
+ -- literal name of the pass
+ passDescription UTF8String OPTIONAL,
+
+ classCode TravelClassType DEFAULT second,
+
+ -- begin of validity (local time)
+ -- number of days from issuing date
+ validFromDay INTEGER (-1..700) DEFAULT 0,
+ validFromTime INTEGER (0..1439) OPTIONAL,
+ validFromUTCOffset INTEGER (-60..60) OPTIONAL, -- offset in units of 15 minutes from local time to UTC
+ -- (UTC = local + offset * 15 Minutes)
+
+ -- end of validity (local time)
+ -- number of days from valid from day, 0 = valid on valid-from-date
+ validUntilDay INTEGER (-1..370) DEFAULT 0,
+ validUntilTime INTEGER (0..1439) OPTIONAL,
+ validUntilUTCOffset INTEGER (-60..60) OPTIONAL, -- offset in units of 15 minutes from local time to UTC
+ -- (UTC = local + offset * 15 Minutes)
+ -- should be omitted in case it is the same as for departure
+
+
+
+ -- additional validity periods and excluded time ranges
+ validityPeriodDetails ValidityPeriodDetailType OPTIONAL,
+
+ -- max number of days of validity in case the valid from day is open
+ numberOfValidityDays INTEGER (0..370) OPTIONAL,
+
+ -- max number of possible trips to be activated
+ numberOfPossibleTrips INTEGER (1..250) OPTIONAL,
+ numberOfDaysOfTravel INTEGER (1..250) OPTIONAL,
+
+ -- list of activated days in case the entire ticket is not activated
+ -- the day is given by the number of days from the first day of validity
+ -- 0 = first day of validity
+ activatedDay SEQUENCE OF INTEGER (0..370) OPTIONAL,
+
+ -- included countries, code table according to UIC leaflet 918.9
+ countries SEQUENCE OF INTEGER (1..250) OPTIONAL,
+
+ -- included carriers (RICS codes)
+ includedCarrierNum SEQUENCE OF INTEGER (1..32000) OPTIONAL,
+ includedCarrierIA5 SEQUENCE OF IA5String OPTIONAL,
+
+ -- excluded carriers (RICS codes)
+ excludedCarrierNum SEQUENCE OF INTEGER (1..32000) OPTIONAL,
+ excludedCarrierIA5 SEQUENCE OF IA5String OPTIONAL,
+
+ -- service brand: code list https://uic.org/service-brand-code-list
+ includedServiceBrands SEQUENCE OF INTEGER (1..32000) OPTIONAL,
+ excludedServiceBrands SEQUENCE OF INTEGER (1..32000) OPTIONAL,
+
+ -- region description to cover local zones
+ validRegion SEQUENCE OF RegionalValidityType OPTIONAL,
+
+ tariffs SEQUENCE OF TariffType OPTIONAL,
+
+ price INTEGER OPTIONAL,
+
+ vatDetail SEQUENCE OF VatDetailType OPTIONAL,
+
+ infoText UTF8String OPTIONAL,
+ extension ExtensionData OPTIONAL
+ ,...
+ }
+
+ ValidityPeriodDetailType ::= SEQUENCE {
+ validityPeriod SEQUENCE OF ValidityPeriodType OPTIONAL,
+ excludedTimeRange SEQUENCE OF TimeRangeType OPTIONAL
+ }
+
+ ValidityPeriodType ::= SEQUENCE {
+ -- number of days from issuing date (local date)
+ validFromDay INTEGER (-1..700) DEFAULT 0,
+ validFromTime INTEGER (0..1439) OPTIONAL,
+ validFromUTCOffset INTEGER (-60..60) OPTIONAL, -- offset in units of 15 minutes from local time to UTC
+ -- (UTC = local + offset * 15 Minutes)
+
+ -- number of days from valid from day, 0 = valid on valid from date
+ validUntilDay INTEGER (-1..370) DEFAULT 0,
+ validUntilTime INTEGER (0..1439) OPTIONAL,
+ validUntilUTCOffset INTEGER (-60..60) OPTIONAL -- offset in units of 15 minutes from local time to UTC
+ -- (UTC = local + offset * 15 Minutes)
+ -- should be omitted in case it is the same as for departure
+
+ }
+
+ TimeRangeType ::= SEQUENCE {
+ fromTime INTEGER (0..1439),
+ untilTime INTEGER (0..1439)
+ }
+
+ -- ######################################################################################
+ -- data for vouchers
+ -- included are quite basic further study is required
+ -- ######################################################################################
+ VoucherData ::= SEQUENCE {
+
+ -- reference must be given in numeric or alphanumeric format
+ referenceIA5 IA5String OPTIONAL,
+ referenceNum INTEGER OPTIONAL,
+
+ -- organization responsible for the product definition
+ -- (RICS Code / proprietary code in case no RICS code is defined, proprietary codes must ensure to be unique)
+ productOwnerNum INTEGER (1..32000) OPTIONAL,
+ productOwnerIA5 IA5String OPTIONAL,
+
+ -- product id to identify the issued product codelist defined by the product owner
+ -- !!! productIdNum extended
+ productIdNum INTEGER (0..65535) OPTIONAL,
+ productIdIA5 IA5String OPTIONAL,
+
+ -- begin of validity in UTC
+ -- number of year
+ validFromYear INTEGER (2016..2269),
+ -- number of the day in the year (1.1. = 1)
+ validFromDay INTEGER (0..370),
+ -- end of validity
+ -- number of year
+ validUntilYear INTEGER (2016..2269),
+ -- number of the day in the year (1.1. = 1)
+ validUntilDay INTEGER (0..370),
+
+ value INTEGER DEFAULT 0,
+
+ -- type of the voucher, code list defined by the product owner
+ type INTEGER (1..32000) OPTIONAL,
+
+ infoText UTF8String OPTIONAL,
+ extension ExtensionData OPTIONAL
+ ,...
+ }
+ -- ###################################################################################
+ -- data for FIP tickets
+ -- included are data from the FIP ticket layout,
+ -- ###################################################################################
+ FIPTicketData ::= SEQUENCE {
+
+ -- reference must be given in numeric or alphanumeric format
+ referenceIA5 IA5String OPTIONAL,
+ referenceNum INTEGER OPTIONAL,
+
+ -- organization responsible for the product definition
+ -- (RICS Code / proprietary code in case no RICS code is defined, proprietary codes must ensure to be unique)
+ productOwnerNum INTEGER (1..32000) OPTIONAL,
+ productOwnerIA5 IA5String OPTIONAL,
+
+ -- product id to identify the issued product codelist defined by the product owner
+ -- !!! productIdNum extended
+ productIdNum INTEGER (0..65535) OPTIONAL,
+ productIdIA5 IA5String OPTIONAL,
+
+ -- first day of validity in UTC
+ --- number of days from issuing date
+ validFromDay INTEGER (-1..700) DEFAULT 0,
+ -- last day of validity
+ -- number of days from valid from day, 0 = first day of validity
+ validUntilDay INTEGER (-1..370) DEFAULT 0,
+
+ -- activated days: list of days for which the ticket is valid
+ -- the day is given by the number of days from the first day of validity
+ -- 0 = first day of validity
+ activatedDay SEQUENCE OF INTEGER (0..370) OPTIONAL,
+
+ -- included carriers
+ carrierNum SEQUENCE OF INTEGER (1..32000) OPTIONAL,
+ carrierIA5 SEQUENCE OF IA5String OPTIONAL,
+
+ -- number of travel days allowed
+ numberOfTravelDays INTEGER (1..200),
+ includesSupplements BOOLEAN,
+
+ -- travel class
+ classCode TravelClassType DEFAULT second,
+ extension ExtensionData OPTIONAL
+ ,...
+ }
+
+ -- #####################################################################################
+ -- data station passage and access
+ -- ticket used to enter, exit or pass a station without travelling by train.
+ -- E.g. for staff working in a station.
+ -- #####################################################################################
+ StationPassageData ::= SEQUENCE {
+
+ -- reference must be given in numeric or alphanumeric format
+ referenceIA5 IA5String OPTIONAL,
+ referenceNum INTEGER OPTIONAL,
+
+ -- organization responsible for the product definition
+ -- (RICS Code / proprietary code in case no RICS code is defined, proprietary codes must ensure to be unique)
+ productOwnerNum INTEGER (1..32000) OPTIONAL,
+ productOwnerIA5 IA5String OPTIONAL,
+
+ -- product id to identify the issued product codelist defined by the product owner
+ -- !!! productIdNum extended
+ productIdNum INTEGER (0..65535) OPTIONAL,
+ productIdIA5 IA5String OPTIONAL,
+
+ productName UTF8String OPTIONAL,
+
+ -- code table used to encode he stations
+ stationCodeTable CodeTableType DEFAULT stationUIC,
+ -- list of station where the passage is allowed
+ stationNum SEQUENCE OF INTEGER OPTIONAL,
+ stationIA5 SEQUENCE OF IA5String OPTIONAL,
+ -- station names
+ stationNameUTF8 SEQUENCE OF UTF8String OPTIONAL,
+
+ -- list of areas in a station where the access is allowed
+ areaCodeNum SEQUENCE OF INTEGER OPTIONAL,
+ areaCodeIA5 SEQUENCE OF IA5String OPTIONAL,
+ -- area names
+ areaNameUTF8 SEQUENCE OF UTF8String OPTIONAL,
+
+ -- begin of validity in local date and time
+ -- number of days from issuing date
+ validFromDay INTEGER (-1..700),
+ validFromTime INTEGER (0..1439) OPTIONAL,
+ validFromUTCOffset INTEGER (-60..60) OPTIONAL, -- offset in units of 15 minutes from local time to UTC
+ -- (UTC = local + offset * 15 Minutes)
+
+ -- end of validity
+ -- number of days from valid from day, 0 = first day of validity
+ validUntilDay INTEGER (-1..370) DEFAULT 0,
+ validUntilTime INTEGER (0..1439) OPTIONAL,
+ validUntilUTCOffset INTEGER (-60..60) OPTIONAL, -- offset in units of 15 minutes from local time to UTC
+ -- (UTC = local + offset * 15 Minutes)
+ -- should be omitted in case it is the same as for departure
+
+
+ -- number of days for station passage in case the number of days
+ -- is limited and less that the validity period
+ numberOfDaysValid INTEGER OPTIONAL,
+
+ extension ExtensionData OPTIONAL
+ ,...
+ }
+
+ -- ######################################################################################
+ -- data for customer cards
+ -- included are data from:
+ -- - ÖBB requirements on card data
+ -- - DB Bahncard as HandyTicket
+ -- note: customer data are included in the traveler data structure
+ -- ######################################################################################
+ CustomerCardData ::= SEQUENCE {
+
+ -- customer details
+ -- optional, as there might be an anonymous cards
+ customer TravelerType OPTIONAL,
+
+ -- card id might be numerical or alphanumerical
+ cardIdIA5 IA5String OPTIONAL,
+ cardIdNum INTEGER OPTIONAL,
+
+ -- valid from date in UTC
+ -- number of year
+ validFromYear INTEGER (2016..2269),
+ --- number of the day in the year (1.1. = 1)
+ validFromDay INTEGER (0..370) OPTIONAL,
+
+ --- number of year from valid from year onwards
+ validUntilYear INTEGER (0..250) DEFAULT 0,
+ --- number of the day in the year (1.1. = 1)
+ validUntilDay INTEGER (0..370) OPTIONAL,
+
+ classCode TravelClassType OPTIONAL,
+
+ -- code of the card type code list defined by the issuer
+ cardType INTEGER (1..1000) OPTIONAL,
+
+ -- readable description of the card type
+ cardTypeDescr UTF8String OPTIONAL,
+
+ -- customer status code
+ -- 1 = basic
+ -- 2 = premium
+ -- 3 = silver
+ -- 4 = gold
+ -- 5 = platinum
+ -- 6 = senator
+ -- > 50 - code table of the card issuer
+ customerStatus INTEGER OPTIONAL,
+
+ -- readable customer status "e.g. gold",
+ customerStatusDescr IA5String OPTIONAL,
+
+ -- list of included services,
+ -- 1 = Rail Plus
+ -- 2 = access to launch
+ -- > 50 code list of the issuer
+ includedServices SEQUENCE OF INTEGER OPTIONAL,
+
+ extension ExtensionData OPTIONAL
+ ,...
+ }
+
+ -- ######################################################################################
+ -- data for customer cards
+ -- included are data from:
+ -- - DB parking ground reservation
+ -- #######################################################################################
+ ParkingGroundData ::= SEQUENCE {
+
+ -- booking reference
+ referenceIA5 IA5String OPTIONAL,
+ referenceNum INTEGER OPTIONAL,
+
+ parkingGroundId IA5String,
+
+ -- parking date in local date time
+ -- number of days from the issuing date
+ fromParkingDate INTEGER (-1..370),
+ -- number of days from the from parking date in case it is different from that date
+ untilParkingDate INTEGER (0..370) DEFAULT 0,
+
+ -- organization responsible for the product definition
+ -- (RICS Code / proprietary code in case no RICS code is defined, proprietary codes must ensure to be unique)
+ productOwnerNum INTEGER (1..32000) OPTIONAL,
+ productOwnerIA5 IA5String OPTIONAL,
+
+ -- product id to identify the issued product codelist defined by the product owner
+ -- !!! productIdNum extended
+ productIdNum INTEGER (0..65535) OPTIONAL,
+ productIdIA5 IA5String OPTIONAL,
+
+ -- code needed to access the parking lot
+ accessCode IA5String OPTIONAL,
+
+ location UTF8String,
+
+ stationCodeTable CodeTableType DEFAULT stationUIC,
+ -- in case the parking ground is associated with a station
+ stationNum INTEGER OPTIONAL,
+ stationIA5 UTF8String OPTIONAL,
+
+ specialInformation UTF8String OPTIONAL,
+ entryTrack UTF8String OPTIONAL,
+ numberPlate IA5String OPTIONAL,
+
+ price INTEGER OPTIONAL,
+ vatDetail SEQUENCE OF VatDetailType OPTIONAL,
+
+
+ extension ExtensionData OPTIONAL
+ ,...
+ }
+
+ -- #######################################################################
+ -- data for countermarks issued with group tickets
+ -- included are data from:
+ -- - version 3 bar code (leaflet 918.9)
+ -- - printed layout (leaflet 918.8)
+ -- ########################################################################
+ CountermarkData ::= SEQUENCE {
+
+ referenceIA5 IA5String OPTIONAL,
+ referenceNum INTEGER OPTIONAL,
+
+ -- organization responsible for the product definition
+ -- (RICS Code / proprietary code in case no RICS code is defined, proprietary codes must ensure to be unique)
+ productOwnerNum INTEGER (1..32000) OPTIONAL,
+ productOwnerIA5 IA5String OPTIONAL,
+
+ -- product id to identify the issued product codelist defined by the product owner
+ -- !!! productIdNum extended
+ productIdNum INTEGER (0..65535) OPTIONAL,
+ productIdIA5 IA5String OPTIONAL,
+
+ -- reference of the group ticket
+ ticketReferenceIA5 IA5String OPTIONAL,
+ ticketReferenceNum INTEGER OPTIONAL,
+
+ -- sequential number of the countermark
+ numberOfCountermark INTEGER (1..200),
+ -- total number of countermarks
+ totalOfCountermarks INTEGER (1..200),
+ -- name of the group
+ groupName UTF8String,
+
+
+ stationCodeTable CodeTableType DEFAULT stationUIC,
+
+ fromStationNum INTEGER (1..9999999) OPTIONAL,
+ fromStationIA5 IA5String OPTIONAL,
+
+ toStationNum INTEGER (1..9999999) OPTIONAL,
+ toStationIA5 IA5String OPTIONAL,
+
+ fromStationNameUTF8 UTF8String OPTIONAL,
+ toStationNameUTF8 UTF8String OPTIONAL,
+
+ -- description for manual evaluation in case structured data are not available
+ validRegionDesc UTF8String OPTIONAL,
+ -- specification of the ordered sequence of valid regions
+ validRegion SEQUENCE OF RegionalValidityType OPTIONAL,
+
+
+ -- ticket includes the return trip
+ returnIncluded BOOLEAN,
+ -- retrurn route description
+ -- can be omitted if it is identical to the inversed outbound validRegion sequence
+ returnDescription ReturnRouteDescriptionType OPTIONAL,
+
+ -- local date
+ -- number of days from issuing date
+ validFromDay INTEGER (-1..700) DEFAULT 0,
+ validFromTime INTEGER (0..1439) OPTIONAL,
+ validFromUTCOffset INTEGER (-60..60) OPTIONAL, -- offset in units of 15 minutes from local time to UTC
+ -- (UTC = local + offset * 15 Minutes)
+
+
+
+ -- number of days from valid from day, 0 = first day of validity
+ validUntilDay INTEGER (-1..370) DEFAULT 0,
+ validUntilTime INTEGER (0..1439) OPTIONAL,
+ validUntilUTCOffset INTEGER (-60..60) OPTIONAL, -- offset in units of 15 minutes from local time to UTC
+ -- (UTC = local + offset * 15 Minutes)
+ -- should be omitted in case it is the same as for departure
+
+
+ classCode TravelClassType DEFAULT second,
+
+ -- valid carriers
+ carrierNum SEQUENCE OF INTEGER (1..32000) OPTIONAL,
+ carrierIA5 SEQUENCE OF IA5String OPTIONAL,
+
+ -- service brands where the ticket is valid
+ -- in case this list is provided the ticket is invalid on all other service brands
+ -- service brand: code list https://uic.org/service-brand-code-list
+ includedServiceBrands SEQUENCE OF INTEGER (1..32000) OPTIONAL,
+
+ -- service brands where the ticket is not valid
+ -- in case this list is provided the ticket is valid on all other service brands
+ excludedServiceBrands SEQUENCE OF INTEGER (1..32000) OPTIONAL,
+
+ infoText UTF8String OPTIONAL,
+
+ extension ExtensionData OPTIONAL
+ ,...
+ }
+
+
+ -- ###########################################################################################
+ -- generic non standard extension element
+ -- the generic non - standard element contains:
+ -- - an extension id to distinguish different extensions
+ -- - the extension data as binary data
+ -- proprietary extensions are by definition proprietary. This standard provides
+ -- the means to identify these extensions
+ -- within the data and to skip these data.
+ -- the evaluation of these data and the unique identification of the extensions
+ -- via the extension id is in the
+ -- responsibility of the railways which use these extensions.
+ -- ###########################################################################################
+ ExtensionData ::= SEQUENCE {
+ extensionId IA5String,
+ extensionData OCTET STRING
+ }
+
+ -- ############################################################################################
+ -- type definitions
+ -- ############################################################################################
+
+ -- #############################################################################################
+ -- included open ticke for a part of the travel (e.g. local city trafic)
+ -- - data identically already included in the covering open ticket do not need to be
+ -- repeated here
+ -- - main source are the data required for included regional and city traffic tickets
+ -- #############################################################################################
+ IncludedOpenTicketType ::= SEQUENCE {
+
+ -- organization responsible for the product definition
+ -- (RICS Code / proprietary code in case no RICS code is defined, proprietary codes must ensure to be unique)
+ productOwnerNum INTEGER (1..32000) OPTIONAL,
+ productOwnerIA5 IA5String OPTIONAL,
+
+ -- product id to identify the issued product codelist defined by the product owner
+ -- !!! productIdNum extended
+ productIdNum INTEGER (0..65535) OPTIONAL,
+ productIdIA5 IA5String OPTIONAL,
+
+ -- issuer code using the default code table of the product owner (today used e.g. by VDV)
+ externalIssuerId INTEGER OPTIONAL,
+ -- authorization id provided to the issuer by the poroduct owner (today used e.g. by VDV)
+ issuerAutorizationId INTEGER OPTIONAL,
+
+ -- regional validity data
+ stationCodeTable CodeTableType DEFAULT stationUIC,
+ -- specification of the ordered sequence of valid regions, ordered in the direction of travel
+ validRegion SEQUENCE OF RegionalValidityType OPTIONAL,
+
+ -- temporal validity data in local date and time
+ -- number of days from issuing date
+ validFromDay INTEGER (-1..700) DEFAULT 0,
+ validFromTime INTEGER (0..1439) OPTIONAL,
+ validFromUTCOffset INTEGER (-60..60) OPTIONAL, -- offset in units of 15 minutes from local time to UTC
+ -- (UTC = local + offset * 15 Minutes)
+
+
+ -- number of days from valid-from date, 0 = first day of validity
+ validUntilDay INTEGER (-1..370) DEFAULT 0,
+ validUntilTime INTEGER (0..1439) OPTIONAL,
+ validUntilUTCOffset INTEGER (-60..60) OPTIONAL, -- offset in units of 15 minutes from local time to UTC
+ -- (UTC = local + offset * 15 Minutes)
+ -- should be omitted in case it is the same as for departure
+
+
+ -- travel class to be given in case it differs from the class of the main ticket
+ classCode TravelClassType OPTIONAL,
+ -- servicelevel code according to leaflet 918.1 to encode other products (e.g. PREMIUM, ...)
+ -- to be provided in case it differs from the main ticket
+ serviceLevel IA5String (SIZE(1..2)) OPTIONAL,
+
+ -- valid carriers (RICS codes)
+ carrierNum SEQUENCE OF INTEGER (1..32000) OPTIONAL,
+ carrierIA5 SEQUENCE OF IA5String OPTIONAL,
+
+ -- service brands where the ticket is valid
+ -- in case this list is provided the ticket is invalid on all other service brands
+ -- service brand: code list https://uic.org/service-brand-code-list
+ includedServiceBrands SEQUENCE OF INTEGER (1..32000) OPTIONAL,
+
+ -- service brands where the ticket is not valid
+ -- in case this list is provided the ticket is valid on all other service brands
+ excludedServiceBrands SEQUENCE OF INTEGER (1..32000) OPTIONAL,
+
+ tariffs SEQUENCE OF TariffType OPTIONAL,
+ infoText UTF8String OPTIONAL,
+
+ -- included or excluded transport modes
+ -- code list: EN 1545-1 (transport type code)
+ -- !!! new data elements
+ includedTransportType SEQUENCE OF INTEGER (0..31) OPTIONAL,
+ excludedTransportType SEQUENCE OF INTEGER (0..31) OPTIONAL,
+
+ extension ExtensionData OPTIONAL
+ ,...
+ }
+
+ -- ######################################################################################
+ -- tariff data for open tickets
+ -- information included are:
+ -- - number of passengers
+ -- - optionally a link to the traveler data
+ -- #######################################################################################
+ TariffType ::= SEQUENCE {
+
+ -- number of passengers using the tariff
+ numberOfPassengers INTEGER (1..200) DEFAULT 1,
+
+ -- type indication youth, adult, senior,..
+ passengerType PassengerType OPTIONAL,
+
+ -- age restrictions of the tariff
+ ageBelow INTEGER (1..64) OPTIONAL,
+ ageAbove INTEGER (1..128) OPTIONAL,
+
+
+ -- named traveler list
+ -- link to the traveler in case the travelers have to be named (e.g. Eurail passes)
+ -- the number indicates the position in the traveler list starting from 1
+ -- change V2 0 --> 1..
+ travelerid SEQUENCE OF INTEGER (1..254) OPTIONAL,
+
+ -- restriction on country of residence
+ -- this tariff is restricted by the country of residence given in the traveler data
+ -- (e.g. Eurail tickets are not valid in the contry of residence)
+ restrictedToCountryOfResidence BOOLEAN,
+
+ -- section in case the tariff applies to a part of the route only
+ restrictedToRouteSection RouteSectionType OPTIONAL,
+
+ -- details on series according to leaflet 108.1
+ seriesDataDetails SeriesDetailType OPTIONAL,
+
+ -- tariff code
+ tariffIdNum INTEGER OPTIONAL,
+ tariffIdIA5 IA5String OPTIONAL,
+
+ -- tariff description
+ tariffDesc UTF8String OPTIONAL,
+
+ -- reduction cards applied (incl. discount cards, loyalty cards relevant for the tariff)
+ reductionCard SEQUENCE OF CardReferenceType OPTIONAL
+ ,...
+ }
+
+ SeriesDetailType ::= SEQUENCE {
+
+ -- data related to tariffs based on series according UIC leaflet 108.1
+ -- supplying carrier according to UIC leaflet 108.1 (RICS code)
+ supplyingCarrier INTEGER (1..32000) OPTIONAL,
+
+ -- offer identifier of the carrier according to UIC leaflet 108.1
+ offerIdentification INTEGER (1..99) OPTIONAL,
+
+ -- series of the carrier according to UIC leaflet 108.1
+ series INTEGER OPTIONAL
+ }
+
+
+ RouteSectionType ::= SEQUENCE {
+
+ stationCodeTable CodeTableType DEFAULT stationUIC,
+ fromStationNum INTEGER (1..9999999) OPTIONAL,
+ fromStationIA5 IA5String OPTIONAL, -- IA5 or Num not both
+
+ toStationNum INTEGER (1..9999999) OPTIONAL,
+ toStationIA5 IA5String OPTIONAL, -- IA5 or Num not both
+
+ fromStationNameUTF8 UTF8String OPTIONAL,
+ toStationNameUTF8 UTF8String OPTIONAL
+ }
+
+
+ -- #######################################################################################
+ -- customer card reference
+ -- #######################################################################################
+ CardReferenceType ::= SEQUENCE {
+
+ -- issuer of the card
+ -- (RICS Code / proprietary code in case no RICS code is defined, proprietary codes must ensure to be unique)
+ cardIssuerNum INTEGER (1..32000) OPTIONAL,
+ cardIssuerIA5 IA5String OPTIONAL,
+
+ cardIdNum INTEGER OPTIONAL,
+ cardIdIA5 IA5String OPTIONAL,
+
+ -- Name of the card e.g. "VISA-CARD"
+ cardName UTF8String OPTIONAL,
+
+ -- type of the card, code list defined by the issuer
+ cardType INTEGER OPTIONAL,
+
+ -- in case only the leading part of the card number is provided
+ leadingCardIdNum INTEGER OPTIONAL,
+ leadingCardIdIA5 IA5String OPTIONAL,
+
+
+ -- in case only the trailing part of the card number is provided
+ trailingCardIdNum INTEGER OPTIONAL,
+ trailingCardIdIA5 IA5String OPTIONAL
+
+ ,...
+ }
+
+ -- #######################################################################################
+ -- traveler data
+ -- - traveler data might contain all traveler details which are independent
+ -- from the type of travel document
+ -- e.g. it can include the date of birth as this is part of the traveler
+ -- but not the indication "Senior" as this is tariff dependent
+ --
+ -- #######################################################################################
+ TravelerType ::= SEQUENCE {
+
+ firstName UTF8String OPTIONAL,
+ secondName UTF8String OPTIONAL,
+ lastName UTF8String OPTIONAL,
+ idCard IA5String OPTIONAL,
+ passportId IA5String OPTIONAL,
+ title IA5String (SIZE(1..3)) OPTIONAL,
+ gender GenderType OPTIONAL,
+
+ -- customer id might be numerical or alphanumerical
+ customerIdIA5 IA5String OPTIONAL,
+ customerIdNum INTEGER OPTIONAL,
+
+ -- date of birth
+ -- number of year
+ yearOfBirth INTEGER (1901..2155) OPTIONAL,
+ monthOfBirth INTEGER (1..12) OPTIONAL,
+ dayOfBirthInMonth INTEGER (1..31) OPTIONAL,
+
+ -- indicates the ticket holder/group leader in case of groups
+ ticketHolder BOOLEAN,
+
+ passengerType PassengerType OPTIONAL,
+
+ passengerWithReducedMobility BOOLEAN OPTIONAL,
+
+ -- country of residence (numeric ISO country code)
+ -- to be used in case there product restrictions on the country of residence (e.g. Eurail passes)
+ countryOfResidence INTEGER (1..999) OPTIONAL,
+
+ countryOfPassport INTEGER (1..999) OPTIONAL,
+ countryOfIdCard INTEGER (1..999) OPTIONAL,
+
+ status SEQUENCE OF CustomerStatusType OPTIONAL
+ ,...
+ }
+
+ CustomerStatusType ::= SEQUENCE {
+
+ -- compagny providing the status, default is the issuer
+ -- (RICS Code / proprietary code in case no RICS code is defined, proprietary codes must ensure to be unique)
+ statusProviderNum INTEGER (1..32000) OPTIONAL,
+ statusProviderIA5 IA5String OPTIONAL,
+
+ -- customer status code
+ -- 1 = basic
+ -- 2 = premium
+ -- 3 = silver
+ -- 4 = gold
+ -- 5 = platinum
+ -- 6 = senator
+ -- > 50 - code table of the card issuer
+ customerStatus INTEGER OPTIONAL,
+
+ -- customer status "gold"
+ customerStatusDescr IA5String OPTIONAL
+ }
+
+
+ ReturnRouteDescriptionType ::= SEQUENCE {
+
+ fromStationNum INTEGER (1..9999999) OPTIONAL,
+ fromStationIA5 IA5String OPTIONAL,
+
+ toStationNum INTEGER (1..9999999) OPTIONAL,
+ toStationIA5 IA5String OPTIONAL,
+
+ fromStationNameUTF8 UTF8String OPTIONAL,
+ toStationNameUTF8 UTF8String OPTIONAL,
+
+ -- description for manual evaluation in case structured data are not available
+ validReturnRegionDesc UTF8String OPTIONAL,
+
+ -- specification of the ordered sequence of valid regions for the return trip
+ validReturnRegion SEQUENCE OF RegionalValidityType OPTIONAL
+ ,...
+
+ }
+
+ -- ######################################################################################
+ -- regional validity of an open ticket
+ -- specification of the regional validity.
+ -- ######################################################################################
+
+ RegionalValidityType ::= CHOICE {
+ trainLink TrainLinkType,
+ viaStations ViaStationType,
+ zones ZoneType,
+ lines LineType,
+ polygone PolygoneType
+ ,...
+ }
+
+
+
+ -- #######################################################################################
+ -- train link data
+ -- includes a restriction of an open ticket valid only on a specific train
+ -- and date on a part of the route
+ -- #######################################################################################
+ TrainLinkType ::= SEQUENCE {
+
+ trainNum INTEGER OPTIONAL,
+ trainIA5 IA5String OPTIONAL,
+
+ -- local date at the station where the train link starts
+ -- days from the issuing date onwards
+ travelDate INTEGER (-1..370),
+ departureTime INTEGER (0..1439), -- time in minutes
+ departureUTCOffset INTEGER (-60..60) OPTIONAL, -- offset in units of 15 minutes from local time to UTC
+ -- (UTC = local + offset * 15 Minutes)
+
+ fromStationNum INTEGER (1..9999999) OPTIONAL,
+ fromStationIA5 IA5String OPTIONAL,
+
+ toStationNum INTEGER (1..9999999) OPTIONAL,
+ toStationIA5 IA5String OPTIONAL,
+
+ fromStationNameUTF8 UTF8String OPTIONAL,
+ toStationNameUTF8 UTF8String OPTIONAL
+
+ }
+
+
+
+ -- ######################################################################################
+ -- regional validity using a set of lines
+ -- - based on data used in regional city trafic enviromnemnts
+ -- ######################################################################################
+ LineType ::= SEQUENCE {
+
+ -- local service provider / carrier within the zone
+ -- (RICS Code / proprietary code in case no RICS code is defined, proprietary codes must ensure to be unique)
+ carrierNum INTEGER (1..32000) OPTIONAL,
+ carrierIA5 IA5String OPTIONAL,
+
+ -- ids of the valid lines known by the local carriers on that line
+ lineId SEQUENCE OF INTEGER OPTIONAL,
+
+ stationCodeTable CodeTableType DEFAULT stationUIC,
+
+ -- in case the line must be entered via a specific station
+ -- (e.g. local city traffic at the end of a journey
+ -- starting from the main train station)
+ entryStationNum INTEGER (1..9999999) OPTIONAL,
+ entryStationIA5 IA5String OPTIONAL,
+
+ -- in case the line must be left via a specific station
+ -- (e.g. local city trafic at the beginning of a journey
+ -- terminating at the main train station)
+ terminatingStationNum INTEGER (1..9999999) OPTIONAL,
+ terminatingStationIA5 IA5String OPTIONAL,
+
+ -- code of the local city in case the line is part of regional city transport
+ -- code list of the local carrier
+ city INTEGER OPTIONAL
+ ,...
+ }
+
+
+ -- #################################################################################
+ -- regional validity in a zone
+ -- - based on data used in regional city trafic enviromnemnts
+ -- #################################################################################
+ ZoneType ::= SEQUENCE {
+
+ -- local service provider / carrier within the zone
+ -- (RICS Code / proprietary code in case no RICS code is defined, proprietary codes must ensure to be unique)
+ carrierNum INTEGER (1..32000) OPTIONAL,
+ carrierIA5 IA5String OPTIONAL,
+
+ stationCodeTable CodeTableType DEFAULT stationUIC,
+ -- in case the zone must be entered via a specific station
+ -- (e.g. local city traffic at the end of a journey starting
+ -- from the main train station)
+ entryStationNum INTEGER (1..9999999) OPTIONAL,
+ entryStationIA5 IA5String OPTIONAL,
+
+ -- in case the zone must be left via a specific station
+ -- (e.g. local city traffic at the beginning of a journey
+ -- terminating at the main train station)
+ terminatingStationNum INTEGER (1..9999999) OPTIONAL,
+ terminatingStationIA5 IA5String OPTIONAL,
+
+ -- code of the local city in case the zone is part of regional
+ -- city transport code list of the local carrier
+ city INTEGER OPTIONAL,
+
+ -- ids of the valid zones known by the local carriers in that zone
+ zoneId SEQUENCE OF INTEGER OPTIONAL,
+
+ -- binary encoding of zones, encoding specification provided by
+ -- the local service provider
+ binaryZoneId OCTET STRING OPTIONAL,
+
+ -- EU NUTS code for a region
+ nutsCode IA5String OPTIONAL
+ ,...
+ }
+
+
+ -- ##################################################################################
+ -- via station
+ -- includes a description of of the route by via stations.
+ -- Via stations follow the description in leaflet 108.1:
+ -- via stations can e mandatory to pass (but there does not need to be a
+ -- train stop at this stations): visible route description: "*station*"
+ -- there can be a list of alternative routes:
+ -- visible route description: "*(station1/station2)*"
+ -- there can also be alternative routes:
+ -- "*(station1*station2/station3*station4)*" although the
+ -- definition in 108.2 is not very precice on this option
+ -- ###################################################################################
+ ViaStationType ::= SEQUENCE {
+
+ stationCodeTable CodeTableType DEFAULT stationUIC,
+ -- mandatory via station
+ stationNum INTEGER (1..9999999) OPTIONAL,
+ stationIA5 IA5String OPTIONAL,
+
+ -- list of alternative routes, one of these has to be taken
+ alternativeRoutes SEQUENCE OF ViaStationType OPTIONAL,
+
+ -- list of stations along the route
+ route SEQUENCE OF ViaStationType OPTIONAL,
+ border BOOLEAN,
+
+ -- carrier responsible for the transport starting at this station (RICS-Code)
+ -- in case the carrier is included here it might be omitted
+ -- in the carrier list of the region data
+ carrierNum SEQUENCE OF INTEGER (1..32000) OPTIONAL,
+ carrierIA5 SEQUENCE OF IA5String OPTIONAL,
+
+ -- the route id as series number as defined in 108.1 data
+ seriesId INTEGER OPTIONAL,
+
+ -- route id of the route code list defined by the carrier on that route
+ routeId INTEGER OPTIONAL
+ ,...
+ }
+
+
+ PolygoneType ::= SEQUENCE {
+ firstEdge GeoCoordinateType,
+ edges SEQUENCE OF DeltaCoordinates
+ }
+
+
+ -- ###########################################################################################
+ -- TokenType provides an additional identifier
+ -- known use cases
+ -- - identified of the mobile phone for tickets linked with a specific phone (e.g. VDV standard)
+ -- ###########################################################################################
+ TokenType ::= SEQUENCE {
+ -- provider of the token
+ tokenProviderNum INTEGER OPTIONAL,
+ tokenProviderIA5 IA5String OPTIONAL,
+
+ -- in case the provider has multiple tokens
+ tokenSpecification IA5String OPTIONAL,
+ token OCTET STRING
+ }
+
+ -- ###########################################################################################
+ -- TicketLinkType is used to define a link from the ticket in the bar code to another ticket
+ -- (requirement from Eurail)
+ -- use cases
+ -- - DB Alleo (open ticket + reservation)
+ -- - reservation of trailer and car carriage and traveller reservation
+ -- - link between open ticket and bicycle reservations or pass
+ -- - open ticket and vouchers for meals
+ -- ###########################################################################################
+ TicketLinkType ::= SEQUENCE {
+
+ -- data to reference the external ticket
+ -- reference must be given in numeric or alphanumeric format
+ referenceIA5 IA5String OPTIONAL,
+ referenceNum INTEGER OPTIONAL,
+
+ issuerName UTF8String OPTIONAL, -- name of the issuer
+
+ issuerPNR IA5String OPTIONAL, -- in case the ticket can also be identified via
+ -- the issuer PNR
+
+ -- organization responsible for the product definition
+ -- (RICS Code / proprietary code in case no RICS code is defined, proprietary codes must ensure to be unique)
+ productOwnerNum INTEGER (1..32000) OPTIONAL,
+ productOwnerIA5 IA5String OPTIONAL,
+
+ -- type of linked ticket
+ ticketType TicketType DEFAULT openTicket,
+
+ -- type of link
+ linkMode LinkMode DEFAULT issuedTogether
+ ,...
+ }
+
+ -- ############################################################################################
+ -- code table used fort station codes
+ -- defines the code table used e.g. to define station code
+ -- - stationUIC = station codes as used in UIC leaflet 108.1 for open tickets
+ -- - stationUICReservation = station codes as used in Reservation leaflets 918.1 and 108.2
+ -- ############################################################################################
+
+ CodeTableType ::= ENUMERATED {
+ -- standard UIC station code from MERITS (UIC country code + 5 digit local code)
+ stationUIC (0),
+ -- standard UIC station code for reservation
+ stationUICReservation (1),
+ -- future standard ERA station code
+ stationERA (2),
+ -- local carrier code list
+ -- e.g. in case of stations / stops of non-railways stops (city traffic)
+ localCarrierStationCodeTable (3),
+
+ -- non standard code to be used within the issuer eco system only
+ -- not applicable for multi carrier travel documents
+ -- or in case issuer and carrier are different
+ proprietaryIssuerStationCodeTable (4)
+
+ }
+
+
+ ServiceType ::= ENUMERATED {
+ seat (0),
+ couchette (1),
+ berth (2),
+ carcarriage (3)
+ }
+
+
+ PassengerType ::= ENUMERATED {
+ adult (0),
+ senior (1),
+ child (2),
+ youth (3),
+ dog (4),
+ bicycle (5),
+ freeAddonPassenger (6),
+ freeAddonChild (7)
+ ,...
+ }
+
+ TicketType ::= ENUMERATED {
+ openTicket (0),
+ pass (1),
+ reservation (2),
+ carCarriageReservation (3)
+ ,...
+ }
+
+ LinkMode ::= ENUMERATED {
+ issuedTogether (0),
+ onlyValidInCombination (1)
+ ,...
+ }
+
+
+ -- ####################################################################################
+ -- place data corresponding to leaflet 918.1
+ -- placeString = place number ranges in case of groups
+ -- ####################################################################################
+ PlacesType ::= SEQUENCE {
+ coach IA5String OPTIONAL,
+
+ -- printable place string ("15-18, 21, 22" )
+ placeString IA5String OPTIONAL,
+
+ -- printable place description
+ placeDescription UTF8String OPTIONAL,
+
+ -- individual places
+ placeIA5 SEQUENCE OF IA5String OPTIONAL,
+ placeNum SEQUENCE OF INTEGER (1..254) OPTIONAL
+ }
+
+ PriceTypeType ::= ENUMERATED {
+ noPrice (0),
+ reservationFee (1),
+ supplement (2),
+ travelPrice (3)
+ }
+
+ BerthTypeType ::= ENUMERATED {
+ single (0),
+ special (1),
+ double (2),
+ t2 (3),
+ t3 (4),
+ t4 (5)
+ }
+
+ CompartmentGenderType ::= ENUMERATED {
+ unspecified (0),
+ family (1),
+ female (2),
+ male (3),
+ mixed (4)
+ ,...
+ }
+
+ GenderType ::= ENUMERATED {
+ unspecified (0),
+ female (1),
+ male (2),
+ other (3)
+ ,...
+ }
+
+ TravelClassType ::= ENUMERATED {
+ notApplicable (0),
+ first (1),
+ second (2),
+ tourist (3),
+ comfort (4),
+ premium (5),
+ business (6),
+ all (7),
+ premiumFirst (8),
+ standardFirst (9),
+ premiumSecond (10),
+ standardSecond (11)
+ ,...
+ }
+
+ -- ########################################################################################
+ -- sleeper compartment types corresponding to leaflet 918.1
+ -- ########################################################################################
+ BerthDetailData ::= SEQUENCE {
+ berthType BerthTypeType,
+ numberOfBerths INTEGER (1..999),
+ gender CompartmentGenderType DEFAULT family
+ ,...
+ }
+
+ -- ####################################################################################
+ -- compartment details corresponding to leaflet 918.1
+ -- ####################################################################################
+ CompartmentDetailsType ::= SEQUENCE {
+ coachType INTEGER (1..99) OPTIONAL,
+ compartmentType INTEGER (1..99) OPTIONAL,
+ specialAllocation INTEGER (1..99) OPTIONAL,
+ coachTypeDescr UTF8String OPTIONAL,
+ compartmentTypeDescr UTF8String OPTIONAL,
+ specialAllocationDescr UTF8String OPTIONAL,
+ position CompartmentPositionType DEFAULT unspecified
+ ,...
+ }
+
+
+ -- #####################################################################################
+ -- luggage restrictions
+ -- the basis for these data is week:
+ -- SCIC mentions a maximum of three pieces of hand luggage but does not includes
+ -- a definition of hand luggage
+ -- SCIC refers to special conditions on registered luggage, but SCIC NRT does
+ -- not contain definitions on that and UIC 108.1 does not
+ -- contain data structures for luggage
+ -- - current THALYS luggage restrictions
+ -- #####################################################################################
+ LuggageRestrictionType ::= SEQUENCE {
+ -- allowed hand luggage pieces on this ticket (3 = default in current NRT tariff)
+ maxHandLuggagePieces INTEGER(0..99) DEFAULT 3,
+ -- allowed hand luggage pieces on this ticket (3 = default in current NRT tariff)
+ maxNonHandLuggagePieces INTEGER(0..99) DEFAULT 1,
+ registeredLuggage SEQUENCE OF RegisteredLuggageType OPTIONAL
+ ,...
+
+ }
+
+ RegisteredLuggageType ::= SEQUENCE {
+ -- id of the additional registered luggage
+ registrationId IA5String OPTIONAL,
+ -- maximum weight in kg
+ maxWeight INTEGER (1..99) OPTIONAL,
+ -- sum of length with and height in cm
+ maxSize INTEGER (1..300) OPTIONAL
+ ,...
+
+ }
+
+ -- ##########################################################################################
+ -- generic type for geo coordinates
+ -- ##########################################################################################
+ GeoCoordinateType ::= SEQUENCE {
+ geoUnit GeoUnitType DEFAULT milliDegree,
+ coordinateSystem GeoCoordinateSystemType DEFAULT wgs84,
+ -- separate hemishpere flag reduces the data size
+ hemisphereLongitude HemisphereLongitudeType DEFAULT north,
+ -- separate hemishpere flag reduces the data size
+ hemisphereLatitude HemisphereLatitudeType DEFAULT east,
+ longitude INTEGER,
+ latitude INTEGER,
+ accuracy GeoUnitType OPTIONAL
+ }
+
+ DeltaCoordinates ::= SEQUENCE {
+ -- logitude difference to a reference point
+ longitude INTEGER,
+ -- latitude difference to a reference point
+ latitude INTEGER
+ }
+
+ GeoCoordinateSystemType ::= ENUMERATED {
+ wgs84 (0), -- WGS 84 standard system
+ grs80 (1) -- (outdated) GRS 80 coordinate system
+ }
+
+ GeoUnitType ::= ENUMERATED {
+ microDegree (0), -- approx. 11 cm on earth surface
+ tenthmilliDegree (1), -- 1 / 100000 degree is approx. 1.1 meter on earth surface
+ milliDegree (2), -- approx 110 meter on earth surface
+ centiDegree (3),
+ deciDegree (4)
+ }
+
+ HemisphereLongitudeType ::= ENUMERATED {
+ north (0),
+ south (1)
+ }
+
+ HemisphereLatitudeType ::= ENUMERATED {
+ east (0),
+ west (1)
+ }
+
+ LoadingDeckType ::= ENUMERATED {
+ unspecified (0),
+ upper (1),
+ lower (2)
+ }
+
+ CompartmentPositionType ::= ENUMERATED {
+ unspecified (0),
+ upperLevel (1),
+ lowerLevel (2)
+ }
+
+ RoofRackType ::= ENUMERATED {
+ norack (0),
+ roofRailing (1),
+ luggageRack (2),
+ skiRack (3),
+ boxRack (4),
+ rackWithOneBox (5),
+ rackWithTwoBoxes (6),
+ bicycleRack (7),
+ otherRack (8)
+ ,...
+ }
+
+END \ No newline at end of file
diff --git a/src/org/uic/ticket/api/spec/IBerthTypeType.java b/src/org/uic/ticket/api/spec/IBerthTypeType.java
new file mode 100644
index 0000000..abe063c
--- /dev/null
+++ b/src/org/uic/ticket/api/spec/IBerthTypeType.java
@@ -0,0 +1,41 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.spec;
+
+public enum IBerthTypeType {
+ single("single"),
+ special("special"),
+ double_("double_"),
+ t2("t2"),
+ t3("t3"),
+ t4("t4");
+
+
+ public String text;
+
+ IBerthTypeType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/spec/ICompartmentGenderType.java b/src/org/uic/ticket/api/spec/ICompartmentGenderType.java
new file mode 100644
index 0000000..5780a82
--- /dev/null
+++ b/src/org/uic/ticket/api/spec/ICompartmentGenderType.java
@@ -0,0 +1,42 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.spec;
+
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+
+@HasExtensionMarker
+public enum ICompartmentGenderType {
+ unspecified("unspecified"),
+ family("family"),
+ female("female"),
+ male("male"),
+ mixed("mixed");
+
+ public String text;
+
+ ICompartmentGenderType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+
+} \ No newline at end of file
diff --git a/src/org/uic/ticket/api/spec/ICompartmentPositionType.java b/src/org/uic/ticket/api/spec/ICompartmentPositionType.java
new file mode 100644
index 0000000..e7e3061
--- /dev/null
+++ b/src/org/uic/ticket/api/spec/ICompartmentPositionType.java
@@ -0,0 +1,38 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.spec;
+
+
+public enum ICompartmentPositionType {
+ unspecified("unspecified"),
+ upperLevel("upperLevel"),
+ lowerLevel("lowerLevel");
+
+ public String text;
+
+ ICompartmentPositionType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/spec/IGenderType.java b/src/org/uic/ticket/api/spec/IGenderType.java
new file mode 100644
index 0000000..1900e8c
--- /dev/null
+++ b/src/org/uic/ticket/api/spec/IGenderType.java
@@ -0,0 +1,42 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.spec;
+
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+
+@HasExtensionMarker
+public enum IGenderType {
+ unspecified("unspecified"),
+ female("female"),
+ male("male"),
+ other("other");
+
+
+ public String text;
+
+ IGenderType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/spec/IGeoCoordinateSystemType.java b/src/org/uic/ticket/api/spec/IGeoCoordinateSystemType.java
new file mode 100644
index 0000000..3a6842a
--- /dev/null
+++ b/src/org/uic/ticket/api/spec/IGeoCoordinateSystemType.java
@@ -0,0 +1,38 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.spec;
+
+
+public enum IGeoCoordinateSystemType {
+ wgs84("wgs84"),
+ grs80("grs80");
+
+
+ public String text;
+
+ IGeoCoordinateSystemType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/spec/IGeoUnitType.java b/src/org/uic/ticket/api/spec/IGeoUnitType.java
new file mode 100644
index 0000000..1930417
--- /dev/null
+++ b/src/org/uic/ticket/api/spec/IGeoUnitType.java
@@ -0,0 +1,40 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.spec;
+
+public enum IGeoUnitType {
+ microDegree("microDegree"),
+ tenthmilliDegree("tenthmilliDegree"),
+ milliDegree("milliDegree"),
+ centiDegree("centiDegree"),
+ deciDegree("deciDegree");
+
+
+ public String text;
+
+ IGeoUnitType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/spec/IHemisphereLatitudeType.java b/src/org/uic/ticket/api/spec/IHemisphereLatitudeType.java
new file mode 100644
index 0000000..20215ad
--- /dev/null
+++ b/src/org/uic/ticket/api/spec/IHemisphereLatitudeType.java
@@ -0,0 +1,37 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.spec;
+
+public enum IHemisphereLatitudeType {
+ east("east"),
+ west("west");
+
+
+ public String text;
+
+ IHemisphereLatitudeType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/spec/IHemisphereLongitudeType.java b/src/org/uic/ticket/api/spec/IHemisphereLongitudeType.java
new file mode 100644
index 0000000..ece30cc
--- /dev/null
+++ b/src/org/uic/ticket/api/spec/IHemisphereLongitudeType.java
@@ -0,0 +1,36 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.spec;
+
+public enum IHemisphereLongitudeType {
+ north("north"),
+ south("south");
+
+ public String text;
+
+ IHemisphereLongitudeType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/spec/ILinkMode.java b/src/org/uic/ticket/api/spec/ILinkMode.java
new file mode 100644
index 0000000..e098666
--- /dev/null
+++ b/src/org/uic/ticket/api/spec/ILinkMode.java
@@ -0,0 +1,39 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.spec;
+
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+
+@HasExtensionMarker
+public enum ILinkMode {
+ issuedTogether("issuedTogether"),
+ onlyValidInCombination("onlyValidInCombination");
+
+ public String text;
+
+ ILinkMode(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/spec/ILoadingDeckType.java b/src/org/uic/ticket/api/spec/ILoadingDeckType.java
new file mode 100644
index 0000000..da023a5
--- /dev/null
+++ b/src/org/uic/ticket/api/spec/ILoadingDeckType.java
@@ -0,0 +1,38 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.spec;
+
+
+public enum ILoadingDeckType {
+ unspecified("unspecified"),
+ upper("upper"),
+ lower("lower");
+
+ public String text;
+
+ ILoadingDeckType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/spec/IPassengerType.java b/src/org/uic/ticket/api/spec/IPassengerType.java
new file mode 100644
index 0000000..f050d34
--- /dev/null
+++ b/src/org/uic/ticket/api/spec/IPassengerType.java
@@ -0,0 +1,46 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.spec;
+
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+
+@HasExtensionMarker
+public enum IPassengerType {
+ adult("adult"),
+ senior("senior"),
+ child("child"),
+ youth("youth"),
+ dog("dog"),
+ bicycle("bicycle"),
+ freeAddonPassenger("freeAddonPassenger"),
+ freeAddonChild("freeAddonChild");
+
+ public String text;
+
+ IPassengerType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+
+}
+
diff --git a/src/org/uic/ticket/api/spec/IPriceTypeType.java b/src/org/uic/ticket/api/spec/IPriceTypeType.java
new file mode 100644
index 0000000..1033d19
--- /dev/null
+++ b/src/org/uic/ticket/api/spec/IPriceTypeType.java
@@ -0,0 +1,39 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.spec;
+
+public enum IPriceTypeType {
+ noPrice("noPrice"),
+ reservationFee("reservationFee"),
+ supplement("supplement"),
+ travelPrice("travelPrice");
+
+
+ public String text;
+
+ IPriceTypeType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/spec/IRoofRackType.java b/src/org/uic/ticket/api/spec/IRoofRackType.java
new file mode 100644
index 0000000..c5358d0
--- /dev/null
+++ b/src/org/uic/ticket/api/spec/IRoofRackType.java
@@ -0,0 +1,46 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.spec;
+
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+
+@HasExtensionMarker
+public enum IRoofRackType {
+ norack("norack"),
+ roofRailing("roofRailing"),
+ luggageRack("luggageRack"),
+ skiRack("skiRack"),
+ boxRack("boxRack"),
+ rackWithOneBox("rackWithOneBox"),
+ rackWithTwoBoxes("rackWithTwoBoxes"),
+ bicycleRack("bicycleRack"),
+ otherRack("otherRack");
+
+ public String text;
+
+ IRoofRackType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/spec/IServiceType.java b/src/org/uic/ticket/api/spec/IServiceType.java
new file mode 100644
index 0000000..0f77a64
--- /dev/null
+++ b/src/org/uic/ticket/api/spec/IServiceType.java
@@ -0,0 +1,38 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.spec;
+
+public enum IServiceType {
+ seat("seat"),
+ couchette("couchette"),
+ berth("berth"),
+ carcarriage("carcarriage");
+
+ public String text;
+
+ IServiceType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/spec/IStationCodeTable.java b/src/org/uic/ticket/api/spec/IStationCodeTable.java
new file mode 100644
index 0000000..445a773
--- /dev/null
+++ b/src/org/uic/ticket/api/spec/IStationCodeTable.java
@@ -0,0 +1,25 @@
+package org.uic.ticket.api.spec;
+
+ public enum IStationCodeTable {
+
+ stationUIC("stationUIC"),
+ stationUICReservation("stationUICReservation"),
+ stationERA("stationERA"),
+ localCarrierStationCodeTable("localCarrierStationCodeTable"),
+ proprietaryIssuerStationCodeTable("proprietaryIssuerStationCodeTable");
+
+ public String text;
+
+ IStationCodeTable(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+
+
+ }
+
+
+
diff --git a/src/org/uic/ticket/api/spec/ITicketType.java b/src/org/uic/ticket/api/spec/ITicketType.java
new file mode 100644
index 0000000..86b2924
--- /dev/null
+++ b/src/org/uic/ticket/api/spec/ITicketType.java
@@ -0,0 +1,41 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.spec;
+
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+
+@HasExtensionMarker
+public enum ITicketType {
+ openTicket("openTicket"),
+ pass("openTicket"),
+ reservation("openTicket"),
+ carCarriageReservation("carCarriageReservation");
+
+ public String text;
+
+ ITicketType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/spec/ITravelClassType.java b/src/org/uic/ticket/api/spec/ITravelClassType.java
new file mode 100644
index 0000000..0835678
--- /dev/null
+++ b/src/org/uic/ticket/api/spec/ITravelClassType.java
@@ -0,0 +1,49 @@
+/*
+ * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
+ *
+ * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
+ *
+ * openASN.1 is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation, either version 3 of
+ * the License, or (at your option) any later version.
+ *
+ * openASN.1 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.uic.ticket.api.spec;
+
+import net.gcdc.asn1.datatypes.HasExtensionMarker;
+
+@HasExtensionMarker
+public enum ITravelClassType {
+ notApplicabel("notApplicabel"),
+ first("first"),
+ second("second"),
+ tourist("tourist"),
+ comfort("comfort"),
+ premium("premium"),
+ business("business"),
+ all("all"),
+ premiumFirst("A"),
+ standardFirst("B"),
+ premiumSecond("C"),
+ standardSecond("D");
+
+ public String text;
+
+ ITravelClassType(String text) {
+ this.text = text;
+ }
+
+ public String toString(){
+ return text;
+ }
+}
+
diff --git a/src/org/uic/ticket/api/test/SimpleUicTestTicket.java b/src/org/uic/ticket/api/test/SimpleUicTestTicket.java
new file mode 100644
index 0000000..a4788d3
--- /dev/null
+++ b/src/org/uic/ticket/api/test/SimpleUicTestTicket.java
@@ -0,0 +1,245 @@
+package org.uic.ticket.api.test;
+
+import org.uic.ticket.api.asn.omv1.CardReferenceType;
+import org.uic.ticket.api.asn.omv1.ControlData;
+import org.uic.ticket.api.asn.omv1.CustomerStatusType;
+import org.uic.ticket.api.asn.omv1.DocumentData;
+import org.uic.ticket.api.asn.omv1.ExtensionData;
+import org.uic.ticket.api.asn.omv1.IssuingData;
+import org.uic.ticket.api.asn.omv1.OpenTicketData;
+import org.uic.ticket.api.asn.omv1.SequenceOfCardReferenceType;
+import org.uic.ticket.api.asn.omv1.SequenceOfCustomerStatusType;
+import org.uic.ticket.api.asn.omv1.SequenceOfDocumentData;
+import org.uic.ticket.api.asn.omv1.SequenceOfExtensionData;
+import org.uic.ticket.api.asn.omv1.SequenceOfTicketLinkType;
+import org.uic.ticket.api.asn.omv1.SequenceOfTravelerType;
+import org.uic.ticket.api.asn.omv1.StationPassageData;
+import org.uic.ticket.api.asn.omv1.TicketDetailData;
+import org.uic.ticket.api.asn.omv1.TicketLinkType;
+import org.uic.ticket.api.asn.omv1.TokenType;
+import org.uic.ticket.api.asn.omv1.TravelerData;
+import org.uic.ticket.api.asn.omv1.TravelerType;
+import org.uic.ticket.api.asn.omv1.UicRailTicketData;
+
+import net.gcdc.asn1.datatypesimpl.SequenceOfStringUTF8;
+
+public class SimpleUicTestTicket {
+
+
+ public static UicRailTicketData getUicTestTicket() {
+ UicRailTicketData ticket = new UicRailTicketData();
+ populateTicket(ticket);
+ return ticket;
+ }
+
+
+
+ private static void populateTicket(UicRailTicketData ticket) {
+
+ ticket.setControlDetail(new ControlData());
+ populate(ticket.getControlDetail());
+
+
+ ticket.setIssuingDetail(new IssuingData());
+ populateIssuingData(ticket.getIssuingDetail());
+
+ TravelerData td = new TravelerData();
+ populateTravelerData(td);
+ ticket.setTravelerDetail(td);
+
+ SequenceOfDocumentData ds = new SequenceOfDocumentData();
+
+
+ //OpenTicket
+ DocumentData do1 = new DocumentData();
+ addOpenTicketData(do1);
+ ds.add(do1);
+
+ //StationPassage
+ DocumentData do2 = new DocumentData();
+ addStationPassage(do2);
+ ds.add(do2);
+
+ ticket.setTransportDocument(ds);
+
+ SequenceOfExtensionData ed = new SequenceOfExtensionData();
+ populateExtensionSequence(ed);
+ ticket.setExtension(ed);
+
+ }
+
+ /*
+ ticket stationPassage : {
+ productName "passage"
+ ,stationNameUTF8 { "Amsterdam" }
+ ,validFromDay 0
+ ,numberOfDaysValid 123
+ }
+ */
+ private static void addStationPassage(DocumentData dd) {
+ TicketDetailData tdd = new TicketDetailData();
+ StationPassageData sp = new StationPassageData();
+ sp.setProductName("passage");
+ sp.setValidFromDay(0L);
+ sp.setNumberOfDaysValid(123L);
+ SequenceOfStringUTF8 ss = new SequenceOfStringUTF8();
+ ss.add("Amsterdam");
+ sp.setStationNameUTF8(ss);
+ tdd.setStationPassage(sp);
+ dd.setTicket(tdd);
+ }
+
+ /*
+ {
+ token {tokenProviderIA5 "VDV", token '82DA'H }
+ ,ticket openTicket : {
+ returnIncluded FALSE
+ infoText "openTicketInfo"
+ }
+ }
+ */
+
+ private static void addOpenTicketData(DocumentData dd) {
+ TokenType to = new TokenType();
+ to.setTokenProviderIA5("VDV");
+ byte[] ba = { (byte) 0x82, (byte) 0xDA };
+ to.setToken(ba);
+ dd.setToken(to);
+
+ TicketDetailData tdd = new TicketDetailData();
+ OpenTicketData otd = new OpenTicketData();
+ otd.setInfoText("openTicketInfo");
+ otd.setReturnIncluded(false);
+ tdd.setOpenTicket(otd);
+ dd.setTicket(tdd);
+ }
+
+
+ /*
+ ,travelerDetail{
+ traveler {
+ {
+ firstName "John"
+ ,secondName "Dow"
+ ,idCard "12345"
+ ,ticketHolder TRUE
+ ,status {{customerStatusDescr "senior" }}
+ }
+ }
+ ,groupName "myGroup"
+ }
+ */
+
+ private static void populateTravelerData(TravelerData td) {
+ td.setGroupName("myGroup");
+ SequenceOfTravelerType trs = new SequenceOfTravelerType();
+ TravelerType tr = new TravelerType();
+ tr.setIdCard("12345");
+ tr.setFirstName("John");
+ tr.setSecondName("Dow");
+ tr.setTicketHolder(true);
+ SequenceOfCustomerStatusType ts = new SequenceOfCustomerStatusType();
+ CustomerStatusType cst = new CustomerStatusType();
+ cst.setCustomerStatusDescr("senior");
+ ts.add(cst);
+ tr.setStatus(ts);
+ trs.add(tr);
+ td.setTraveler(trs);
+ }
+
+ /*
+ ,issuingDetail {
+ issuingYear 2018
+ issuingDay 1
+ specimen TRUE,
+ securePaperTicket FALSE,
+ activated TRUE,
+ issuerPNR "issuerTestPNR",
+ issuedOnLine 12
+ }
+ */
+ private static void populateIssuingData(IssuingData issuingDetail) {
+ issuingDetail.setIssuingYear(2018L);
+ issuingDetail.setIssuingDay(1L);
+ issuingDetail.setIssuerPNR("issuerTestPNR");
+ issuingDetail.setSpecimen(true);
+ issuingDetail.setSecurePaperTicket(false);
+ issuingDetail.setActivated(true);
+ issuingDetail.setIssuedOnLine(12L);
+ }
+
+ /*
+ ,extension {
+ { extensionId "1", extensionData '82DA'H }
+ ,{ extensionId "2", extensionData '83DA'H }
+ }
+ */
+ private static void populateExtensionSequence(SequenceOfExtensionData ed) {
+ ExtensionData ed1 = new ExtensionData();
+ ed1.setExtensionId("1");
+ byte[] ba1 = { (byte) 0x82, (byte) 0xDA };
+ ed1.setExtensionData(ba1);
+ ExtensionData ed2 = new ExtensionData();
+ ed2.setExtensionId("2");
+ byte[] ba2 = { (byte) 0x83, (byte) 0xDA };
+ ed2.setExtensionData(ba2);
+ ed.add(ed1);
+ ed.add(ed2);
+ }
+
+ /*
+ ,controlDetail {
+ identificationByCardReference {
+ { trailingCardIdNum 100 }
+ }
+ ,identificationByIdCard FALSE
+ ,identificationByPassportId FALSE
+ ,passportValidationRequired FALSE
+ ,onlineValidationRequired FALSE
+ ,ageCheckRequired FALSE
+ ,reductionCardCheckRequired FALSE
+ ,infoText "cd"
+ ,includedTickets {
+ { productOwnerIA5 "test" }
+ }
+ }
+ */
+ private static void populate(ControlData controlDetail) {
+ controlDetail.infoText = "cd";
+ controlDetail.setAgeCheckRequired(false);
+ controlDetail.setIdentificationByIdCard(false);
+ controlDetail.setIdentificationByPassportId(false);
+ controlDetail.setOnlineValidationRequired(false);
+ controlDetail.setPassportValidationRequired(false);
+ controlDetail.setReductionCardCheckRequired(false);
+ controlDetail.setIdentificationByCardReference(new SequenceOfCardReferenceType());
+ controlDetail.getIdentificationByCardReference().add(populateCardRefrence());
+ SequenceOfTicketLinkType sit = new SequenceOfTicketLinkType();
+ populateIncludedTickets(sit);
+ controlDetail.setIncludedTickets(sit);
+ }
+
+
+ /*
+ *
+ */
+ private static void populateIncludedTickets(SequenceOfTicketLinkType sequenceOfTicketLinkType) {
+ TicketLinkType tlt = new TicketLinkType();
+ tlt.productOwnerIA5="test";
+ sequenceOfTicketLinkType.add(tlt);
+ }
+
+ /*
+ {
+ trailingCardIdNum 100
+ }
+ */
+ private static CardReferenceType populateCardRefrence() {
+ CardReferenceType cr = new CardReferenceType();
+ cr.setTrailingCardIdNum(100L);
+ return cr;
+ }
+
+
+
+}
diff --git a/src/org/uic/ticket/api/utils/Api2OpenAsnEncoderV2.java b/src/org/uic/ticket/api/utils/Api2OpenAsnEncoderV2.java
new file mode 100644
index 0000000..c651192
--- /dev/null
+++ b/src/org/uic/ticket/api/utils/Api2OpenAsnEncoderV2.java
@@ -0,0 +1,2299 @@
+/*
+ *
+ */
+package org.uic.ticket.api.utils;
+
+import java.util.Collection;
+import java.util.Date;
+import net.gcdc.asn1.datatypes.Asn1BigInteger;
+import net.gcdc.asn1.datatypesimpl.SequenceOfStringIA5;
+import net.gcdc.asn1.datatypesimpl.SequenceOfStringUTF8;
+import net.gcdc.asn1.datatypesimpl.SequenceOfUnrestrictedLong;
+
+import org.uic.ticket.EncodingFormatException;
+import org.uic.ticket.api.asn.omv2.BerthDetailData;
+import org.uic.ticket.api.asn.omv2.BerthTypeType;
+import org.uic.ticket.api.asn.omv2.CarCarriageReservationData;
+import org.uic.ticket.api.asn.omv2.CardReferenceType;
+import org.uic.ticket.api.asn.omv2.CodeTableType;
+import org.uic.ticket.api.asn.omv2.CompartmentDetailsType;
+import org.uic.ticket.api.asn.omv2.CompartmentGenderType;
+import org.uic.ticket.api.asn.omv2.ConfirmationTypeType;
+import org.uic.ticket.api.asn.omv2.ControlData;
+import org.uic.ticket.api.asn.omv2.CountermarkData;
+import org.uic.ticket.api.asn.omv2.CustomerCardData;
+import org.uic.ticket.api.asn.omv2.CustomerStatusType;
+import org.uic.ticket.api.asn.omv2.DelayConfirmation;
+import org.uic.ticket.api.asn.omv2.DeltaCoordinates;
+import org.uic.ticket.api.asn.omv2.DocumentData;
+import org.uic.ticket.api.asn.omv2.ExtensionData;
+import org.uic.ticket.api.asn.omv2.FIPTicketData;
+import org.uic.ticket.api.asn.omv2.GenderType;
+import org.uic.ticket.api.asn.omv2.GeoCoordinateSystemType;
+import org.uic.ticket.api.asn.omv2.GeoCoordinateType;
+import org.uic.ticket.api.asn.omv2.GeoUnitType;
+import org.uic.ticket.api.asn.omv2.HemisphereLatitudeType;
+import org.uic.ticket.api.asn.omv2.HemisphereLongitudeType;
+import org.uic.ticket.api.asn.omv2.IncludedOpenTicketType;
+import org.uic.ticket.api.asn.omv2.IssuingData;
+import org.uic.ticket.api.asn.omv2.LineType;
+import org.uic.ticket.api.asn.omv2.LinkMode;
+import org.uic.ticket.api.asn.omv2.LoadingDeckType;
+import org.uic.ticket.api.asn.omv2.LuggageRestrictionType;
+import org.uic.ticket.api.asn.omv2.OpenTicketData;
+import org.uic.ticket.api.asn.omv2.ParkingGroundData;
+import org.uic.ticket.api.asn.omv2.PassData;
+import org.uic.ticket.api.asn.omv2.PassengerType;
+import org.uic.ticket.api.asn.omv2.PlacesType;
+import org.uic.ticket.api.asn.omv2.PolygoneType;
+import org.uic.ticket.api.asn.omv2.PriceTypeType;
+import org.uic.ticket.api.asn.omv2.RegionalValidityType;
+import org.uic.ticket.api.asn.omv2.RegisteredLuggageType;
+import org.uic.ticket.api.asn.omv2.ReservationData;
+import org.uic.ticket.api.asn.omv2.ReturnRouteDescriptionType;
+import org.uic.ticket.api.asn.omv2.RoofRackType;
+import org.uic.ticket.api.asn.omv2.RouteSectionType;
+import org.uic.ticket.api.asn.omv2.SequenceOfBerthDetailData;
+import org.uic.ticket.api.asn.omv2.SequenceOfCardReferenceType;
+import org.uic.ticket.api.asn.omv2.SequenceOfCarrierNum;
+import org.uic.ticket.api.asn.omv2.SequenceOfCountries;
+import org.uic.ticket.api.asn.omv2.SequenceOfCustomerStatusType;
+import org.uic.ticket.api.asn.omv2.SequenceOfDeltaCoordinates;
+import org.uic.ticket.api.asn.omv2.SequenceOfDocumentData;
+import org.uic.ticket.api.asn.omv2.SequenceOfExtensionData;
+import org.uic.ticket.api.asn.omv2.SequenceOfIncludedOpenTicketType;
+import org.uic.ticket.api.asn.omv2.SequenceOfPlaceNum;
+import org.uic.ticket.api.asn.omv2.SequenceOfRegionalValidityType;
+import org.uic.ticket.api.asn.omv2.SequenceOfRegisteredLuggageType;
+import org.uic.ticket.api.asn.omv2.SequenceOfServiceBrands;
+import org.uic.ticket.api.asn.omv2.SequenceOfTariffType;
+import org.uic.ticket.api.asn.omv2.SequenceOfTicketLinkType;
+import org.uic.ticket.api.asn.omv2.SequenceOfTransportTypes;
+import org.uic.ticket.api.asn.omv2.SequenceOfTravelerId;
+import org.uic.ticket.api.asn.omv2.SequenceOfTravelerType;
+import org.uic.ticket.api.asn.omv2.SequenceOfViaStationType;
+import org.uic.ticket.api.asn.omv2.SeriesDetailType;
+import org.uic.ticket.api.asn.omv2.ServiceType;
+import org.uic.ticket.api.asn.omv2.StationPassageData;
+import org.uic.ticket.api.asn.omv2.TariffType;
+import org.uic.ticket.api.asn.omv2.TicketDetailData;
+import org.uic.ticket.api.asn.omv2.TicketLinkType;
+import org.uic.ticket.api.asn.omv2.TicketType;
+import org.uic.ticket.api.asn.omv2.TimeRangeType;
+import org.uic.ticket.api.asn.omv2.TokenType;
+import org.uic.ticket.api.asn.omv2.TrainLinkType;
+import org.uic.ticket.api.asn.omv2.TravelClassType;
+import org.uic.ticket.api.asn.omv2.TravelerData;
+import org.uic.ticket.api.asn.omv2.TravelerType;
+import org.uic.ticket.api.asn.omv2.UicRailTicketData;
+import org.uic.ticket.api.asn.omv2.ValidityPeriodDetailType;
+import org.uic.ticket.api.asn.omv2.ValidityPeriodType;
+import org.uic.ticket.api.asn.omv2.VatDetailType;
+import org.uic.ticket.api.asn.omv2.ViaStationType;
+import org.uic.ticket.api.asn.omv2.VoucherData;
+import org.uic.ticket.api.asn.omv2.ZoneType;
+import org.uic.ticket.api.spec.IBerth;
+import org.uic.ticket.api.spec.ICarCarriageReservation;
+import org.uic.ticket.api.spec.ICardReference;
+import org.uic.ticket.api.spec.ICompartmentDetails;
+import org.uic.ticket.api.spec.ICompartmentGenderType;
+import org.uic.ticket.api.spec.IControlDetail;
+import org.uic.ticket.api.spec.ICounterMark;
+import org.uic.ticket.api.spec.ICustomerCard;
+import org.uic.ticket.api.spec.ICustomerStatusDescription;
+import org.uic.ticket.api.spec.IDelayConfirmation;
+import org.uic.ticket.api.spec.IDocumentData;
+import org.uic.ticket.api.spec.IExtension;
+import org.uic.ticket.api.spec.IFipTicket;
+import org.uic.ticket.api.spec.IGeoCoordinate;
+import org.uic.ticket.api.spec.IGeoCoordinateSystemType;
+import org.uic.ticket.api.spec.IGeoUnitType;
+import org.uic.ticket.api.spec.IHemisphereLatitudeType;
+import org.uic.ticket.api.spec.IHemisphereLongitudeType;
+import org.uic.ticket.api.spec.IIncludedOpenTicket;
+import org.uic.ticket.api.spec.IIssuingDetail;
+import org.uic.ticket.api.spec.ILine;
+import org.uic.ticket.api.spec.ILinkMode;
+import org.uic.ticket.api.spec.ILoadingDeckType;
+import org.uic.ticket.api.spec.ILuggageRestriction;
+import org.uic.ticket.api.spec.IOpenTicket;
+import org.uic.ticket.api.spec.IParkingGround;
+import org.uic.ticket.api.spec.IPass;
+import org.uic.ticket.api.spec.IPlaces;
+import org.uic.ticket.api.spec.IPolygone;
+import org.uic.ticket.api.spec.IPriceTypeType;
+import org.uic.ticket.api.spec.IRegionalValidity;
+import org.uic.ticket.api.spec.IRegisteredLuggage;
+import org.uic.ticket.api.spec.IReservation;
+import org.uic.ticket.api.spec.IReturnRouteDescription;
+import org.uic.ticket.api.spec.IRoofRackType;
+import org.uic.ticket.api.spec.IRouteSection;
+import org.uic.ticket.api.spec.ISeriesDataDetails;
+import org.uic.ticket.api.spec.IServiceType;
+import org.uic.ticket.api.spec.IStationPassage;
+import org.uic.ticket.api.spec.ITariff;
+import org.uic.ticket.api.spec.ITicketLink;
+import org.uic.ticket.api.spec.ITicketType;
+import org.uic.ticket.api.spec.ITimeRange;
+import org.uic.ticket.api.spec.IToken;
+import org.uic.ticket.api.spec.ITrainLink;
+import org.uic.ticket.api.spec.ITravelClassType;
+import org.uic.ticket.api.spec.ITraveler;
+import org.uic.ticket.api.spec.ITravelerDetail;
+import org.uic.ticket.api.spec.IUicRailTicket;
+import org.uic.ticket.api.spec.IValidityDetails;
+import org.uic.ticket.api.spec.IValidityRange;
+import org.uic.ticket.api.spec.IVatDetail;
+import org.uic.ticket.api.spec.IViaStation;
+import org.uic.ticket.api.spec.IVoucher;
+import org.uic.ticket.api.spec.IZone;
+import org.uic.ticket.api.spec.IStationCodeTable;
+
+/**
+ * The Class Api2OpenAsnEncoder.
+ */
+public class Api2OpenAsnEncoderV2 {
+
+ /**
+ * encode to asn1 model.
+ *
+ * @param uicTicket the uic ticket
+ * @return the encoded byte array
+ * @throws EncodingFormatException the encoding format exception
+ */
+ public byte[] encode(IUicRailTicket uicTicket) throws EncodingFormatException {
+
+ UicRailTicketData asnUicRailTicketData = populateToAsn1Model(uicTicket);
+
+ return asnUicRailTicketData.encode();
+
+ }
+
+
+ /**
+ * Populate asn1 model.
+ *
+ * @param uicTicket the uic ticket
+ * @return the org.uic.ticket.asn.om. uic rail ticket data
+ * @throws EncodingFormatException the encoding format exception
+ */
+ public UicRailTicketData populateToAsn1Model(IUicRailTicket uicTicket) throws EncodingFormatException {
+
+ UicRailTicketData asnTicket = new UicRailTicketData();
+
+ if (uicTicket.getIssuerDetails() != null) {
+ asnTicket.setIssuingDetail(encodeIssuingDetails(uicTicket.getIssuerDetails()));
+ }
+
+
+ if (uicTicket.getControlDetails() != null) {
+ asnTicket.setControlDetail(encodeControlDetails(uicTicket.getControlDetails(), uicTicket.getIssuerDetails().getIssuingDate()));
+ }
+
+
+ if (uicTicket.getExtensions() != null && !uicTicket.getExtensions().isEmpty()){
+
+ SequenceOfExtensionData asnList = new SequenceOfExtensionData();
+ for (IExtension extension : uicTicket.getExtensions()){
+ ExtensionData asnExtension = encodeExtension(extension);
+ if (asnExtension!= null) {
+ asnList.add(asnExtension);
+ }
+ }
+ if (!asnList.isEmpty()){
+ asnTicket.setExtension(asnList);
+ }
+
+
+ }
+
+
+ if (uicTicket.getTravelerDetails() != null) {
+ asnTicket.setTravelerDetail(encodeTravelers(uicTicket.getTravelerDetails(),uicTicket.getIssuerDetails().getIssuingDate() ));
+ }
+
+ if (uicTicket.getDocumentData() != null && !uicTicket.getDocumentData().isEmpty()) {
+
+ SequenceOfDocumentData documents = new SequenceOfDocumentData();
+
+ for (IDocumentData document : uicTicket.getDocumentData()){
+
+ DocumentData asnDocument = null;
+
+ if (document instanceof IReservation) {
+ asnDocument = convertReservation((IReservation) document , uicTicket.getIssuerDetails().getIssuingDate());
+ }
+
+ if (document instanceof IOpenTicket) {
+ asnDocument = convertOpenTicket((IOpenTicket) document , uicTicket.getIssuerDetails().getIssuingDate());
+ }
+
+ if (document instanceof ICarCarriageReservation) {
+ asnDocument = convertCarCarriageReservation((ICarCarriageReservation) document , uicTicket.getIssuerDetails().getIssuingDate());
+ }
+
+ if (document instanceof IFipTicket) {
+ asnDocument = convertFipTicket((IFipTicket) document , uicTicket.getIssuerDetails().getIssuingDate());
+ }
+
+ if (document instanceof IPass) {
+ asnDocument = convertPass((IPass) document , uicTicket.getIssuerDetails().getIssuingDate());
+ }
+
+ if (document instanceof IVoucher) {
+ asnDocument = convertVoucher((IVoucher) document , uicTicket.getIssuerDetails().getIssuingDate());
+ }
+
+ if (document instanceof ICounterMark) {
+ asnDocument = convertCounterMark((ICounterMark) document , uicTicket.getIssuerDetails().getIssuingDate());
+ }
+
+ if (document instanceof IParkingGround) {
+ asnDocument = convertParkingGround((IParkingGround) document , uicTicket.getIssuerDetails().getIssuingDate());
+ }
+
+ if (document instanceof IStationPassage) {
+ asnDocument = convertStationPassage((IStationPassage) document , uicTicket.getIssuerDetails().getIssuingDate());
+ }
+
+ if (document instanceof ICustomerCard) {
+ asnDocument = encodeCustomerCard((ICustomerCard) document , uicTicket.getIssuerDetails().getIssuingDate());
+ }
+
+
+ if (document instanceof IDelayConfirmation) {
+ asnDocument = encodeDelayConfirmation((IDelayConfirmation) document , uicTicket.getIssuerDetails().getIssuingDate());
+ }
+
+
+ if (asnDocument!= null && document.getToken()!= null) {
+ asnDocument.setToken(encodeToken(document.getToken()));
+ }
+
+ if (asnDocument != null) {
+ documents.add(asnDocument);
+ }
+ }
+ asnTicket.setTransportDocument(documents);
+ }
+
+
+ return asnTicket;
+ }
+
+ private DocumentData encodeDelayConfirmation(IDelayConfirmation document, Date issuingDate) throws EncodingFormatException {
+
+ DocumentData asnDocument = new DocumentData();
+ TicketDetailData asnTicket = new TicketDetailData();
+ asnDocument.setTicket(asnTicket);
+
+ DelayConfirmation asnData = new DelayConfirmation();
+ asnDocument.getTicket().setDelayConfirmation(asnData);
+
+ asnData.setTrainIA5(UicEncoderUtils.getIA5NonNum(document.getTrain()));
+ asnData.setTrainNum(Asn1BigInteger.toAsn1(UicEncoderUtils.getNum(document.getTrain())));
+
+ asnData.setReferenceNum(UicEncoderUtils.getNum(document.getReference()));
+ asnData.setReferenceIA5(UicEncoderUtils.getIA5NonNum(document.getReference()));
+
+ if (document.getStationCodeTable() != IStationCodeTable.stationUIC && document.getStationCodeTable() != null){
+ asnData.setStationCodeTable(CodeTableType.valueOf(document.getStationCodeTable().name()));
+ }
+ asnData.setStationIA5(UicEncoderUtils.getIA5NonNum(document.getStation()));
+ asnData.setStationNum(UicEncoderUtils.getNum(document.getStation()));
+
+
+ asnData.setPlannedArrivalDate(document.getArrivalDate());
+ asnData.setDepartureUTCOffset(document.getArrivalUTCoffset());
+
+ asnData.setAffectedTickets(encodeTicketLickList(document.getLinkedTickets()));
+
+ asnData.setConfirmationType(ConfirmationTypeType.values()[document.getConfirmationType()]);
+
+ asnData.setDelay(new Long(document.getDelay()));
+
+ asnData.setTrainCancelled(document.isTrainCancelled());
+
+
+ asnData.setInfoText(document.getInfoText());
+
+ asnData.setStationNameUTF8(document.getStationName());
+
+ asnData.setExtension(encodeExtension(document.getExtension()));
+
+ return asnDocument;
+ }
+
+
+ /**
+ * Convert car carriage reservation.
+ *
+ * @param document the document
+ * @param issuingDate the issuing date
+ * @return the document data
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private DocumentData convertCarCarriageReservation( ICarCarriageReservation document, Date issuingDate) throws EncodingFormatException {
+
+ DocumentData asnDocument = new DocumentData();
+ TicketDetailData asnTicket = new TicketDetailData();
+ asnDocument.setTicket(asnTicket);
+
+ CarCarriageReservationData asnData = new CarCarriageReservationData();
+ asnDocument.getTicket().setCarCarriageReservation(asnData);
+
+ asnData.setTrainIA5(UicEncoderUtils.getIA5NonNum(document.getTrain()));
+ asnData.setTrainNum(UicEncoderUtils.getNum(document.getTrain()));
+
+ asnData.setProductOwnerNum(UicEncoderUtils.getNum(document.getProductOwner()));
+ asnData.setProductOwnerIA5(UicEncoderUtils.getIA5NonNum(document.getProductOwner()));
+
+ asnData.setReferenceNum(UicEncoderUtils.getNum(document.getReference()));
+ asnData.setReferenceIA5(UicEncoderUtils.getIA5NonNum(document.getReference()));
+
+ if (document.getStationCodeTable() != IStationCodeTable.stationUICReservation && document.getStationCodeTable() != null){
+ asnData.setStationCodeTable(CodeTableType.valueOf(document.getStationCodeTable().name()));
+ }
+
+ asnData.setCarrierNum(SequenceOfCarrierNum.getSequence(UicEncoderUtils.getNumList(document.getCarriers())));
+ asnData.setCarrierIA5(UicEncoderUtils.getIA5NonNumList(document.getCarriers()));
+
+ asnData.setExtension(encodeExtension(document.getExtension()));
+
+ asnData.setCompartmentDetails(encodeCompartmentDetails(document.getCompartmentDetails()));
+
+
+ if (document.getPriceType()!= IPriceTypeType.travelPrice && document.getPriceType() != null){
+ asnData.setPriceType(PriceTypeType.valueOf(document.getPriceType().name()));
+ }
+
+
+ if (document.getServiceBrand()!= null) {
+ asnData.setServiceBrand(UicEncoderUtils.getRestrictedInt(document.getServiceBrand().getServiceBrand(),1,9999));
+ asnData.setServiceBrandAbrUTF8(document.getServiceBrand().getServiceBrandAbbreviation());
+ asnData.setServiceBrandNameUTF8(document.getServiceBrand().getServiceBrandDescription());
+
+ }
+ if (document.getStationCodeTable() != IStationCodeTable.stationUICReservation && document.getStationCodeTable() != null){
+ asnData.setStationCodeTable(CodeTableType.valueOf(document.getStationCodeTable().name()));
+ }
+
+ asnData.setFromStationIA5(UicEncoderUtils.getIA5NonNum(document.getFromStation()));
+ asnData.setFromStationNum(UicEncoderUtils.getNum(document.getFromStation()));
+
+ asnData.setToStationIA5(UicEncoderUtils.getIA5NonNum(document.getToStation()));
+ asnData.setToStationNum(UicEncoderUtils.getNum(document.getToStation()));
+
+ asnData.setFromStationNameUTF8(document.getFromStationName());
+ asnData.setToStationNameUTF8(document.getToStationName());
+
+
+ asnData.setAttachedBicycles(UicEncoderUtils.getRestrictedInt(document.getAttachedBicycles(),1,5));
+ asnData.setAttachedBoats(UicEncoderUtils.getRestrictedInt(document.getAttachedBoats(),1,2));
+ asnData.setAttachedSurfboards(UicEncoderUtils.getRestrictedInt(document.getAttachedSurfboards(),1,5));
+
+ if (document.getLoadingDeck() != ILoadingDeckType.upper && document.getLoadingDeck() != null){
+ asnData.setLoadingDeck(LoadingDeckType.valueOf(document.getLoadingDeck().name()));
+ }
+
+ asnData.setLoadingListEntry(UicEncoderUtils.getRestrictedInt(document.getAttachedSurfboards(),1,200));
+
+ asnData.setBoatCategory(UicEncoderUtils.getRestrictedInt(document.getBoatCategory(),1,6));
+ asnData.setCarCategory(UicEncoderUtils.getRestrictedInt(document.getCarCategory(),1,9));
+ asnData.setCoach(UicEncoderUtils.getIA5(document.getCoach()));
+
+ asnData.setRoofRackHeight(UicEncoderUtils.getRestrictedInt(document.getRoofRackHeight(),1,99));
+
+ if (document.getRoofRackType()!= IRoofRackType.norack && document.getRoofRackType() != null) {
+ asnData.setRoofRackType(RoofRackType.valueOf(document.getRoofRackType().name()));
+ }
+
+ if (document.getTariff() != null) {
+ asnData.setTariff(encodeTariff(document.getTariff()));
+ }
+ asnData.setNumberPlate(UicEncoderUtils.getIA5(document.getNumberPlate()));
+ asnData.setPlace(UicEncoderUtils.getIA5(document.getPlace()));
+
+ if (document.isTextileRoof() ) {
+ asnData.setTextileRoof(true);
+ } else {
+ asnData.setTextileRoof(false);
+ }
+
+ asnData.setTrailerPlate(UicEncoderUtils.getIA5(document.getTrailerPlate()));
+
+ asnData.setLoadingDates(document.getBeginLoading(),document.getEndLoading(), issuingDate);
+
+ asnData.setLoadingUTCOffset(document.getLoadingTimeUTCoffset());
+
+ asnData.setPrice(document.getPrice());
+
+ if (document.getVatDetails() != null && !document.getVatDetails().isEmpty()){
+ for (IVatDetail vat : document.getVatDetails()) {
+ asnData.addVatDetail(encodeVatDetail(vat));
+ }
+ }
+
+
+ return asnDocument;
+ }
+
+
+ /**
+ * Encode places.
+ *
+ * @param places the places
+ * @return the places type
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private PlacesType encodePlaces(IPlaces places) throws EncodingFormatException {
+
+ if (places == null) {
+ return null;
+ }
+
+ PlacesType asnData = new PlacesType();
+
+ asnData.setCoach(UicEncoderUtils.getIA5(places.getCoach()));
+ asnData.setPlaceDescription(places.getPlaceDescription());
+ asnData.setPlaceString(UicEncoderUtils.getIA5(places.getPlaceString()));
+ asnData.setPlaceNum(SequenceOfPlaceNum.getSequence(UicEncoderUtils.getNumList(places.getPlaces())));
+ asnData.setPlaceIA5(UicEncoderUtils.getIA5NonNumList(places.getPlaces()));
+
+ return asnData;
+ }
+
+
+ /**
+ * Encode compartment details.
+ *
+ * @param compartmentDetails the compartment details
+ * @return the compartment details type
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private CompartmentDetailsType encodeCompartmentDetails(ICompartmentDetails compartmentDetails) throws EncodingFormatException {
+
+ if (compartmentDetails == null) {
+ return null;
+ }
+ CompartmentDetailsType asnData = new CompartmentDetailsType();
+
+ asnData.setCoachType(UicEncoderUtils.getRestrictedInt(compartmentDetails.getCoachType(), 1,99));
+ asnData.setCoachTypeDescr(compartmentDetails.getCoachTypeDescr());
+ asnData.setCompartmentType(UicEncoderUtils.getRestrictedInt(compartmentDetails.getCompartmentType(), 1,99));
+ asnData.setCompartmentTypeDescr(compartmentDetails.getCompartmentTypeDescr());
+ asnData.setSpecialAllocation(UicEncoderUtils.getRestrictedInt(compartmentDetails.getSpecialAllocation(), 1,99));
+ asnData.setSpecialAllocationDescr(compartmentDetails.getSpecialAllocationDescr());
+
+ return asnData;
+ }
+
+ /**
+ * Encode berths.
+ *
+ * @param berths the berths
+ * @return the list
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private SequenceOfBerthDetailData encodeBerths(Collection<IBerth> berths) throws EncodingFormatException {
+
+ if (berths == null || berths.isEmpty()) {
+ return null;
+ }
+ SequenceOfBerthDetailData asnList = new SequenceOfBerthDetailData();
+
+ for ( IBerth berth : berths){
+ BerthDetailData asnBerth = new BerthDetailData();
+
+ if (berth.getType() != null) {
+ asnBerth.setBerthType(BerthTypeType.valueOf(berth.getType().name()));
+ }
+
+ if (berth.getGender()!= ICompartmentGenderType.family && berth.getGender() != null) {
+ asnBerth.setGender(CompartmentGenderType.valueOf(berth.getGender().name()));
+ }
+
+ asnBerth.setNumberOfBerths(UicEncoderUtils.getRestrictedInt(berth.getNumberOfBerths(), 1 , 999 ));
+
+ asnList.add(asnBerth);
+ }
+
+ if (asnList.isEmpty()) {
+ return null;
+ }
+ return asnList;
+ }
+
+ /**
+ * Convert reservation.
+ *
+ * @param document the document
+ * @param issuingDate the issuing date
+ * @return the document data
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private DocumentData convertReservation(IReservation document, Date issuingDate) throws EncodingFormatException {
+
+ DocumentData asnDocument = new DocumentData();
+ TicketDetailData asnTicket = new TicketDetailData();
+ asnDocument.setTicket(asnTicket);
+
+ ReservationData asnData = new ReservationData();
+ asnDocument.getTicket().setReservation(asnData);
+
+ asnData.setProductOwnerNum(UicEncoderUtils.getNum(document.getProductOwner()));
+ asnData.setProductOwnerIA5(UicEncoderUtils.getIA5NonNum(document.getProductOwner()));
+
+ asnData.setReferenceNum(UicEncoderUtils.getNum(document.getReference()));
+ asnData.setReferenceIA5(UicEncoderUtils.getIA5NonNum(document.getReference()));
+
+ asnData.setInfoText(document.getInfoText());
+ asnData.setExtension(encodeExtension(document.getExtension()));
+
+ asnData.setCarrierNum(SequenceOfCarrierNum.getSequence(UicEncoderUtils.getNumList(document.getCarriers())));
+ asnData.setCarrierIA5(UicEncoderUtils.getIA5NonNumList(document.getCarriers()));
+
+ if (document.getStationCodeTable() != IStationCodeTable.stationUICReservation && document.getStationCodeTable() != null){
+ asnData.setStationCodeTable(CodeTableType.valueOf(document.getStationCodeTable().name()));
+ }
+
+ asnData.setFromStationIA5(UicEncoderUtils.getIA5NonNum(document.getFromStation()));
+ asnData.setFromStationNum(UicEncoderUtils.getNum(document.getFromStation()));
+
+ asnData.setToStationIA5(UicEncoderUtils.getIA5NonNum(document.getToStation()));
+ asnData.setToStationNum(UicEncoderUtils.getNum(document.getToStation()));
+
+ asnData.setFromStationNameUTF8(document.getFromStationName());
+ asnData.setToStationNameUTF8(document.getToStationName());
+
+ asnData.setTrainIA5(UicEncoderUtils.getIA5NonNum(document.getTrain()));
+ asnData.setTrainNum(UicEncoderUtils.getNum(document.getTrain()));
+
+ asnData.setTariff(encodeTariffCollection(document.getTariffs()));
+
+ asnData.setDepartureArrivalDates(document.getDepartureDate(),document.getArrivalDate(), issuingDate);
+
+ if (document.getDepartureUTCoffset() != null) {
+ asnData.setDepartureUTCOffset(document.getDepartureUTCoffset());
+ if (document.getArrivalUTCoffset() != null && document.getArrivalUTCoffset() != document.getDepartureUTCoffset()){
+ asnData.setArrivalUTCOffset(document.getArrivalUTCoffset());
+ }
+ }
+
+
+
+ if (document.getClassCode() != ITravelClassType.second && document.getClassCode() != null){
+ asnData.setClassCode(TravelClassType.valueOf(document.getClassCode().name()));
+ }
+
+ asnData.setBerth(encodeBerths(document.getBerths()));
+
+ asnData.setCompartmentDetails(encodeCompartmentDetails(document.getCompartmentDetails()));
+
+ asnData.setLuggage(encodeLuggage(document.getLuggageRestriction()));
+
+ asnData.setNumberOfOverbooked(UicEncoderUtils.getRestrictedInt(document.getNumberOfOverbooked(), 1, 200));
+ asnData.setNumberOfSupplements(UicEncoderUtils.getRestrictedInt(document.getNumberOfSupplements(), 1, 200));
+
+ if (document.getPriceType()!= IPriceTypeType.travelPrice && document.getPriceType() != null){
+ asnData.setPriceType(PriceTypeType.valueOf(document.getPriceType().name()));
+ }
+ asnData.setTypeOfSupplement(UicEncoderUtils.getRestrictedInt(document.getTypeOfSupplement(), 1, 9));
+
+ asnData.setPlaces(encodePlaces(document.getPlaces()));
+ asnData.setBicyclePlaces(encodePlaces(document.getBicyclePlaces()));
+
+
+ if (document.getService() != IServiceType.seat && document.getService() != null) {
+ asnData.setService(ServiceType.valueOf(document.getService().name()));
+ }
+
+ if (document.getServiceBrand()!= null) {
+ asnData.setServiceBrand(UicEncoderUtils.getRestrictedInt(document.getServiceBrand().getServiceBrand(),1,9999));
+ asnData.setServiceBrandAbrUTF8(document.getServiceBrand().getServiceBrandAbbreviation());
+ asnData.setServiceBrandNameUTF8(document.getServiceBrand().getServiceBrandDescription());
+
+ }
+
+ if (document.getServiceLevel() != null && document.getServiceLevel().length() > 2) {
+ throw new EncodingFormatException("Service level too long");
+ }
+ asnData.setServiceLevel(UicEncoderUtils.getIA5(document.getServiceLevel()));
+
+ asnData.setPrice(document.getPrice());
+
+ if (document.getVatDetails() != null && !document.getVatDetails().isEmpty()){
+ for (IVatDetail vat : document.getVatDetails()) {
+ asnData.addVatDetail(encodeVatDetail(vat));
+ }
+ }
+
+ return asnDocument;
+ }
+
+ /**
+ * Encode included addons.
+ *
+ * @param tickets the tickets
+ * @param issuingDate the issuing date
+ * @param classCode the class code
+ * @return the list
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private SequenceOfIncludedOpenTicketType encodeIncludedAddons(Collection<IIncludedOpenTicket> tickets, Date issuingDate, ITravelClassType classCode) throws EncodingFormatException {
+
+ if (tickets == null || tickets.isEmpty()) {
+ return null;
+ }
+ SequenceOfIncludedOpenTicketType asnList = new SequenceOfIncludedOpenTicketType();
+
+ for ( IIncludedOpenTicket ticket : tickets){
+
+ IncludedOpenTicketType asnTicket = encodeIncludedOpenTicket(ticket,issuingDate,classCode);
+ if (asnTicket!=null) {
+ asnList.add(asnTicket);
+ }
+ }
+
+ if (asnList.isEmpty()) {
+ return null;
+ }
+ return asnList;
+ }
+
+
+ /**
+ * Encode included open ticket.
+ *
+ * @param document the document
+ * @param issuingDate the issuing date
+ * @param classCode the class code
+ * @return the included open ticket type
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private IncludedOpenTicketType encodeIncludedOpenTicket(IIncludedOpenTicket document, Date issuingDate, ITravelClassType classCode) throws EncodingFormatException {
+
+ if (document == null) return null;
+
+ IncludedOpenTicketType asnData = new IncludedOpenTicketType();
+
+ asnData.setProductOwnerNum(UicEncoderUtils.getNum(document.getProductOwner()));
+ asnData.setProductOwnerIA5(UicEncoderUtils.getIA5NonNum(document.getProductOwner()));
+
+ asnData.setProductIdNum(UicEncoderUtils.getNum(document.getProductId()));
+ asnData.setProductIdIA5(UicEncoderUtils.getIA5NonNum(document.getProductId()));
+
+
+ asnData.setInfoText(document.getInfoText());
+ asnData.setExtension(encodeExtension(document.getExtension()));
+
+ if (document.getStationCodeTable() != IStationCodeTable.stationUIC && document.getStationCodeTable() != null){
+ asnData.setStationCodeTable(CodeTableType.valueOf(document.getStationCodeTable().name()));
+ }
+
+ asnData.setIncludedCarriersNum(SequenceOfCarrierNum.getSequence(UicEncoderUtils.getNumList(document.getIncludedCarriers())));
+ asnData.setIncludedCarriersIA5(UicEncoderUtils.getIA5NonNumList(document.getIncludedCarriers()));
+
+ asnData.setExcludedServiceBrands(SequenceOfServiceBrands.getSequence(UicEncoderUtils.encodeRestrictedIntegerCollection(document.getExcludedServiceBrands(),1,9999)));
+ asnData.setIncludedServiceBrands(SequenceOfServiceBrands.getSequence(UicEncoderUtils.encodeRestrictedIntegerCollection(document.getIncludedServiceBrands(),1,9999)));
+
+ asnData.setExcludedTransportTypes(SequenceOfTransportTypes.getSequence(UicEncoderUtils.encodeRestrictedIntegerCollection(document.getExcludedTransportTypes(),0,31)));
+ asnData.setIncludedTransportTypes(SequenceOfTransportTypes.getSequence(UicEncoderUtils.encodeRestrictedIntegerCollection(document.getIncludedTransportTypes(),0,31)));
+
+
+ asnData.setValidityDates(document.getValidFrom(), document.getValidUntil(), issuingDate);
+
+ if (document.getValidFromUTCoffset() != null) {
+ asnData.setValidFromUTCOffset(document.getValidFromUTCoffset());
+ if (document.getValidUntilUTCoffset() != null && document.getValidUntilUTCoffset() != document.getValidFromUTCoffset()){
+ asnData.setValidUntilUTCOffset(document.getValidUntilUTCoffset());
+ }
+ }
+
+
+ if (document.getTariffs() != null && document.getTariffs().size() > 0){
+ asnData.setTariffs(encodeTariffCollection(document.getTariffs()));
+ }
+
+ if (document.getClassCode() != classCode && document.getClassCode() != null){
+ asnData.setClassCode(TravelClassType.valueOf(document.getClassCode().name()));
+ }
+ if (document.getExternalIssuer() > 0) {
+ asnData.setExternalIssuerId(new Long(document.getExternalIssuer()));
+ }
+
+ if (document.getAuthorizationCode() > 0) {
+ asnData.setIssuerAutorizationId(new Long(document.getAuthorizationCode()));
+ }
+
+ if (document.getValidRegionList()!= null && document.getValidRegionList().size() > 0) {
+ asnData.setValidRegion(encodeRegionCollection(document.getValidRegionList(), issuingDate));
+ }
+
+ return asnData;
+ }
+
+ /**
+ * Encode return description.
+ *
+ * @param route the route
+ * @param issuingDate the issuing date
+ * @return the return route description type
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private ReturnRouteDescriptionType encodeReturnDescription(IReturnRouteDescription route, Date issuingDate) throws EncodingFormatException {
+
+ if (route == null) return null;
+
+ ReturnRouteDescriptionType asnData = new ReturnRouteDescriptionType();
+
+ asnData.setFromStationIA5(UicEncoderUtils.getIA5NonNum(route.getFromStation()));
+ asnData.setFromStationNum(UicEncoderUtils.getNum(route.getFromStation()));
+
+ asnData.setToStationIA5(UicEncoderUtils.getIA5NonNum(route.getToStation()));
+ asnData.setToStationNum(UicEncoderUtils.getNum(route.getToStation()));
+
+ asnData.setFromStationNameUTF8(route.getFromStationName());
+ asnData.setToStationNameUTF8(route.getToStationName());
+
+ if (route.getValidRegionList()!= null && route.getValidRegionList().size() > 0) {
+ asnData.setValidReturnRegion(encodeRegionCollection(route.getValidRegionList(), issuingDate));
+ }
+
+ if (route.getValidRegionDesc() != null && route.getValidRegionDesc().length() > 0){
+ asnData.setValidReturnRegionDesc(route.getValidRegionDesc());
+ }
+
+ return asnData;
+ }
+
+ /**
+ * Encode luggage.
+ *
+ * @param luggageRestriction the luggage restriction
+ * @return the luggage restriction type
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private LuggageRestrictionType encodeLuggage(ILuggageRestriction luggageRestriction) throws EncodingFormatException {
+
+ if (luggageRestriction== null) return null;
+
+ LuggageRestrictionType asnData = new LuggageRestrictionType();
+
+ asnData.setMaxHandLuggagePieces(UicEncoderUtils.getRestrictedIntWithDefault(luggageRestriction.getMaxHandLuggagePieces(),1,99,3));
+
+ asnData.setMaxNonHandLuggagePieces(UicEncoderUtils.getRestrictedIntWithDefault(luggageRestriction.getMaxNonHandLuggagePieces(),1,99,1));
+
+ if (luggageRestriction.getRegisteredLuggage() != null && luggageRestriction.getRegisteredLuggage().size() > 0) {
+ asnData.setRegisteredLuggage(encodeRegisteredLuggage(luggageRestriction.getRegisteredLuggage()));
+ }
+
+ return asnData;
+ }
+
+ /**
+ * Encode registered luggage.
+ *
+ * @param registeredLuggage the registered luggage
+ * @return the list
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private SequenceOfRegisteredLuggageType encodeRegisteredLuggage(Collection<IRegisteredLuggage> registeredLuggage) throws EncodingFormatException {
+ if (registeredLuggage== null || registeredLuggage.isEmpty()) {
+ return null;
+ }
+ SequenceOfRegisteredLuggageType asnList = new SequenceOfRegisteredLuggageType();
+
+ for ( IRegisteredLuggage luggage : registeredLuggage){
+ RegisteredLuggageType asnLuggage = new RegisteredLuggageType();
+ asnLuggage.setMaxSize(UicEncoderUtils.getRestrictedInt(luggage.getMaxSize(),1,300));
+ asnLuggage.setMaxWeight(UicEncoderUtils.getRestrictedInt(luggage.getMaxWeight(),1,99));
+ asnLuggage.setRegistrationId(luggage.getRegistrationId());
+
+ asnList.add(asnLuggage);
+ }
+
+ if (asnList.isEmpty()){
+ return null;
+ }
+ return asnList;
+ }
+
+ /**
+ * Convert open ticket.
+ *
+ * @param document the document
+ * @param issuingDate the issuing date
+ * @return the document data
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private DocumentData convertOpenTicket(IOpenTicket document,Date issuingDate) throws EncodingFormatException {
+
+ DocumentData asnDocument = new DocumentData();
+ TicketDetailData asnTicket = new TicketDetailData();
+ asnDocument.setTicket(asnTicket);
+
+ OpenTicketData asnData = new OpenTicketData();
+ asnTicket.setOpenTicket(asnData);
+
+ asnDocument.setTicket(asnTicket);
+ asnTicket.setOpenTicket(asnData);
+
+ asnData.setProductOwnerNum(UicEncoderUtils.getNum(document.getProductOwner()));
+ asnData.setProductOwnerIA5(UicEncoderUtils.getIA5NonNum(document.getProductOwner()));
+
+ asnData.setProductIdNum(UicEncoderUtils.getNum(document.getProductId()));
+ asnData.setProductIdIA5(UicEncoderUtils.getIA5NonNum(document.getProductId()));
+
+ asnData.setReferenceNum(UicEncoderUtils.getNum(document.getReference()));
+ asnData.setReferenceIA5(UicEncoderUtils.getIA5NonNum(document.getReference()));
+
+ asnData.setInfoText(document.getInfoText());
+ asnData.setExtension(encodeExtension(document.getExtension()));
+
+ if (document.getStationCodeTable() != IStationCodeTable.stationUIC && document.getStationCodeTable() != null){
+ asnData.setStationCodeTable(CodeTableType.valueOf(document.getStationCodeTable().name()));
+ }
+
+ asnData.setFromStationIA5(UicEncoderUtils.getIA5NonNum(document.getFromStation()));
+ asnData.setFromStationNum(UicEncoderUtils.getNum(document.getFromStation()));
+
+ asnData.setToStationIA5(UicEncoderUtils.getIA5NonNum(document.getToStation()));
+ asnData.setToStationNum(UicEncoderUtils.getNum(document.getToStation()));
+
+ asnData.setFromStationNameUTF8(document.getFromStationName());
+ asnData.setToStationNameUTF8(document.getToStationName());
+
+ asnData.setCarriersNum(SequenceOfCarrierNum.getSequence(UicEncoderUtils.getNumList(document.getIncludedCarriers())));
+ asnData.setCarriersIA5(UicEncoderUtils.getIA5NonNumList(document.getIncludedCarriers()));
+
+ asnData.setExcludedServiceBrands(SequenceOfServiceBrands.getSequence(UicEncoderUtils.encodeRestrictedIntegerCollection(document.getExcludedServiceBrands(),1,32000)));
+ asnData.setIncludedServiceBrands(SequenceOfServiceBrands.getSequence(UicEncoderUtils.encodeRestrictedIntegerCollection(document.getIncludedServiceBrands(),1,32000)));
+
+ asnData.setExcludedTransportTypes(SequenceOfTransportTypes.getSequence(UicEncoderUtils.encodeRestrictedIntegerCollection(document.getExcludedTransportTypes(),0,31)));
+ asnData.setIncludedTransportTypes(SequenceOfTransportTypes.getSequence(UicEncoderUtils.encodeRestrictedIntegerCollection(document.getIncludedTransportTypes(),0,31)));
+
+
+ asnData.setValidityDates(document.getValidFrom(), document.getValidUntil(), issuingDate);
+
+ if (document.getValidFromUTCoffset() != null) {
+ asnData.setValidFromUTCOffset(document.getValidFromUTCoffset());
+ if (document.getValidUntilUTCoffset() != null && document.getValidUntilUTCoffset() != document.getValidFromUTCoffset()){
+ asnData.setValidUntilUTCOffset(document.getValidUntilUTCoffset());
+ }
+ }
+
+
+ asnData.setTariffs(encodeTariffCollection(document.getTariffs()));
+
+ asnData.setActivatedDays(document.getActivatedDays(),document.getValidFrom());
+
+ if (document.getClassCode() != ITravelClassType.second && document.getClassCode() != null){
+ asnData.setClassCode(TravelClassType.valueOf(document.getClassCode().name()));
+ }
+ if (document.getExternalIssuer()>0) {
+ asnData.setExtIssuerId(new Long(document.getExternalIssuer()));
+ }
+
+ if (document.getAuthorizationCode()>0) {
+ asnData.setIssuerAutorizationId(new Long (document.getAuthorizationCode()));
+ }
+
+ if (document.getValidRegionList() != null && document.getValidRegionList().size() > 0) {
+ asnData.setValidRegion(encodeRegionCollection(document.getValidRegionList(), issuingDate));
+ }
+ asnData.setValidRegionDesc(document.getValidRegionDesc());
+
+ if (document.getIncludedAddOns() != null && document.getIncludedAddOns().size() > 0) {
+ asnData.setIncludedAddOns(encodeIncludedAddons(document.getIncludedAddOns(),issuingDate, document.getClassCode()));
+ }
+
+ if (document.getLuggageRestriction() != null) {
+ asnData.setLuggage(encodeLuggage(document.getLuggageRestriction()));
+ }
+
+ if (document.isReturnIncluded()) {
+ asnData.setReturnIncluded(true);
+ asnData.setReturnDescription(encodeReturnDescription(document.getReturnDescription(),issuingDate));
+ } else {
+ asnData.setReturnIncluded(false);
+ }
+
+ asnData.setPrice(document.getPrice());
+
+ if (document.getVatDetails() != null && !document.getVatDetails().isEmpty()){
+ for (IVatDetail vat : document.getVatDetails()) {
+ asnData.addVatDetail(encodeVatDetail(vat));
+ }
+ }
+
+
+ return asnDocument;
+ }
+
+ /**
+ * Convert counter mark.
+ *
+ * @param document the document
+ * @param issuingDate the issuing date
+ * @return the document data
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private DocumentData convertCounterMark(ICounterMark document, Date issuingDate) throws EncodingFormatException {
+
+ DocumentData asnDocument = new DocumentData();
+ TicketDetailData asnTicket = new TicketDetailData();
+ asnDocument.setTicket(asnTicket);
+
+ CountermarkData asnData = new CountermarkData();
+ asnDocument.getTicket().setCounterMark(asnData);
+
+ asnData.setProductOwnerNum(UicEncoderUtils.getNum(document.getProductOwner()));
+ asnData.setProductOwnerIA5(UicEncoderUtils.getIA5NonNum(document.getProductOwner()));
+
+
+ asnData.setTicketReferenceNum(UicEncoderUtils.getNum(document.getTicketReference()));
+ asnData.setTicketReferenceIA5(UicEncoderUtils.getIA5NonNum(document.getTicketReference()));
+
+ asnData.setInfoText(document.getInfoText());
+ asnData.setExtension(encodeExtension(document.getExtension()));
+
+ if (document.getStationCodeTable() != IStationCodeTable.stationUIC && document.getStationCodeTable() != null){
+ asnData.setStationCodeTable(CodeTableType.valueOf(document.getStationCodeTable().name()));
+ }
+
+ asnData.setFromStationIA5(UicEncoderUtils.getIA5NonNum(document.getFromStation()));
+ asnData.setFromStationNum(UicEncoderUtils.getNum(document.getFromStation()));
+
+ asnData.setToStationIA5(UicEncoderUtils.getIA5NonNum(document.getToStation()));
+ asnData.setToStationNum(UicEncoderUtils.getNum(document.getToStation()));
+
+ asnData.setFromStationNameUTF8(document.getFromStationName());
+ asnData.setToStationNameUTF8(document.getToStationName());
+
+ asnData.setValidityDates(document.getValidFrom(), document.getValidUntil(), issuingDate);
+
+ if (document.getValidFromUTCoffset() != null) {
+ asnData.setValidFromUTCOffset(document.getValidFromUTCoffset());
+ if (document.getValidUntilUTCoffset() != null && document.getValidUntilUTCoffset() != document.getValidFromUTCoffset()){
+ asnData.setValidUntilUTCOffset(document.getValidUntilUTCoffset());
+ }
+ }
+
+
+
+ asnData.setReferenceNum(UicEncoderUtils.getNum(document.getReference()));
+ asnData.setReferenceIA5(UicEncoderUtils.getIA5NonNum(document.getReference()));
+
+ asnData.setInfoText(document.getInfoText());
+ asnData.setExtension(encodeExtension(document.getExtension()));
+
+ if (document.getStationCodeTable() != IStationCodeTable.stationUIC && document.getStationCodeTable() != null){
+ asnData.setStationCodeTable(CodeTableType.valueOf(document.getStationCodeTable().name()));
+ }
+
+ asnData.setFromStationIA5(UicEncoderUtils.getIA5NonNum(document.getFromStation()));
+ asnData.setFromStationNum(UicEncoderUtils.getNum(document.getFromStation()));
+
+ asnData.setToStationIA5(UicEncoderUtils.getIA5NonNum(document.getToStation()));
+ asnData.setToStationNum(UicEncoderUtils.getNum(document.getToStation()));
+
+ asnData.setFromStationNameUTF8(document.getFromStationName());
+ asnData.setToStationNameUTF8(document.getToStationName());
+
+ asnData.setCarriersNum(SequenceOfCarrierNum.getSequence(UicEncoderUtils.getNumList(document.getIncludedCarriers())));
+ asnData.setCarriersIA5(UicEncoderUtils.getIA5NonNumList(document.getIncludedCarriers()));
+
+ asnData.setExcludedServiceBrands(SequenceOfServiceBrands.getSequence(UicEncoderUtils.encodeRestrictedIntegerCollection(document.getExcludedServiceBrands(),1,32000)));
+ asnData.setIncludedServiceBrands(SequenceOfServiceBrands.getSequence(UicEncoderUtils.encodeRestrictedIntegerCollection(document.getIncludedServiceBrands(),1,32000)));
+
+ if (document.getValidRegionList() != null && document.getValidRegionList().size() > 0) {
+ asnData.setValidRegion(encodeRegionCollection(document.getValidRegionList(), issuingDate));
+ }
+ asnData.setValidRegionDesc(document.getValidRegionDesc());
+
+ if (document.getClassCode() != ITravelClassType.second && document.getClassCode() != null){
+ asnData.setClassCode(TravelClassType.valueOf(document.getClassCode().name()));
+ }
+
+
+ if (document.isReturnIncluded()) {
+ asnData.setReturnIncluded(true);
+ if (document.getReturnDescription()!= null) {
+ asnData.setReturnDescription(encodeReturnDescription(document.getReturnDescription(),issuingDate));
+ }
+ } else {
+ asnData.setReturnIncluded(false);
+ }
+
+ return asnDocument;
+ }
+
+
+
+ /**
+ * Encode via station collection.
+ *
+ * @param stations the stations
+ * @return the list
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private SequenceOfViaStationType encodeViaStationCollection(Collection<IViaStation> stations) throws EncodingFormatException {
+ if (stations== null || stations.isEmpty()) {
+ return null;
+ }
+ SequenceOfViaStationType asnList = new SequenceOfViaStationType();
+
+ for ( IViaStation station : stations) {
+ ViaStationType asnData = encodeViaStation(station);
+ if (asnData != null) {
+ asnList.add(asnData);
+ }
+ }
+
+ if (asnList.isEmpty()) {
+ return null;
+ }
+
+ return asnList;
+ }
+
+
+ /**
+ * Encode via station.
+ *
+ * @param document the data
+ * @return the via station type
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private ViaStationType encodeViaStation(IViaStation document) throws EncodingFormatException {
+ if (document == null) return null;
+
+ ViaStationType asnData =new ViaStationType();
+
+ if (document.getStationCodeTable() != IStationCodeTable.stationUIC && document.getStationCodeTable() != null){
+ asnData.setStationCodeTable(CodeTableType.valueOf(document.getStationCodeTable().name()));
+ }
+
+ asnData.setStationIA5(UicEncoderUtils.getIA5NonNum(document.getStation()));
+ asnData.setStationNum(UicEncoderUtils.getNum(document.getStation()));
+
+ asnData.setAlternativeRoutes(encodeViaStationCollection(document.getAlternativeRoutes()));
+
+ if (document.isBorder()) {
+ asnData.setBorder(true);
+ } else {
+ asnData.setBorder(false);
+ }
+
+ asnData.setCarriersNum(SequenceOfCarrierNum.getSequence(UicEncoderUtils.getNumList(document.getCarriers())));
+ asnData.setCarriersIA5(UicEncoderUtils.getIA5NonNumList(document.getCarriers()));
+
+ asnData.setRoute(encodeViaStationCollection(document.getRoute()));
+
+ if (document.getRouteId() > 0){
+ asnData.setSeriesId(new Long(document.getRouteId()));
+ }
+ return asnData;
+ }
+
+ /**
+ * Encode zone.
+ *
+ * @param document the data
+ * @return the zone type
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private ZoneType encodeZone(IZone document) throws EncodingFormatException {
+ if (document == null) return null;
+
+ ZoneType asnData =new ZoneType();
+
+ if (document.getBinaryZoneId() != null && document.getBinaryZoneId().length > 0) {
+ asnData.setBinaryZoneId(document.getBinaryZoneId());
+ }
+ asnData.setCarrierNum(UicEncoderUtils.getNum(document.getCarrier()));
+ asnData.setCarrierIA5(UicEncoderUtils.getIA5NonNum(document.getCarrier()));
+
+ if (document.getStationCodeTable() != IStationCodeTable.stationUIC && document.getStationCodeTable() != null){
+ asnData.setStationCodeTable(CodeTableType.valueOf(document.getStationCodeTable().name()));
+ }
+ asnData.setEntryStationIA5(UicEncoderUtils.getIA5NonNum(document.getEntryStation()));
+ asnData.setEntryStationNum(UicEncoderUtils.getNum(document.getEntryStation()));
+
+ asnData.setTerminatingStationIA5(UicEncoderUtils.getIA5NonNum(document.getTerminatingStation()));
+ asnData.setTerminatingStationNum(UicEncoderUtils.getNum(document.getTerminatingStation()));
+
+ asnData.setZoneId(SequenceOfUnrestrictedLong.getSequence(UicEncoderUtils.encodeIntegerCollection(document.getZoneIds())));
+
+ if (document.getCity() > 0) {
+ asnData.setCity(Asn1BigInteger.toAsn1(document.getCity()));
+ }
+
+ if (document.getNUTScode() != null && document.getNUTScode().length() > 0) {
+ asnData.setNutsCode(document.getNUTScode());
+ }
+
+ return asnData;
+ }
+
+
+
+
+
+ /**
+ * Encode train link.
+ *
+ * @param data the data
+ * @param issuingDate the issuing date
+ * @return the train link type
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private TrainLinkType encodeTrainLink(ITrainLink data, Date issuingDate) throws EncodingFormatException {
+ if (data == null) return null;
+
+ TrainLinkType asnData =new TrainLinkType();
+
+ asnData.setFromStationIA5(UicEncoderUtils.getIA5NonNum(data.getFromStation()));
+ asnData.setFromStationNum(UicEncoderUtils.getNum(data.getFromStation()));
+
+ asnData.setToStationIA5(UicEncoderUtils.getIA5NonNum(data.getToStation()));
+ asnData.setToStationNum(UicEncoderUtils.getNum(data.getToStation()));
+
+ asnData.setFromStationName(data.getFromStationName());
+ asnData.setToStationName(data.getToStationName());
+
+ asnData.setTrainIA5(UicEncoderUtils.getIA5NonNum(data.getTrain()));
+ asnData.setTrainNum(UicEncoderUtils.getNum(data.getTrain()));
+
+ asnData.setDepartureDate(data.getDepartureDateTime(), issuingDate);
+
+ return asnData;
+ }
+
+ /**
+ * Encode polygone.
+ *
+ * @param data the data
+ * @return the polygone type
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private PolygoneType encodePolygone(IPolygone data) throws EncodingFormatException {
+ if (data == null) return null;
+ if (data.getEdges() == null || data.getEdges().isEmpty()) {
+ return null;
+ }
+
+ PolygoneType asnData = new PolygoneType();
+ SequenceOfDeltaCoordinates asnList = new SequenceOfDeltaCoordinates();
+
+ boolean firstEdge = true;
+
+ for ( IGeoCoordinate edge : data.getEdges()) {
+
+ if (firstEdge) {
+ asnData.setFirstEdge(encodeGeoCoordinate(edge));
+ firstEdge = false;
+ } else {
+ DeltaCoordinates delta = new DeltaCoordinates();
+ delta.setLatitude(Asn1BigInteger.toAsn1(asnData.getFirstEdge().getLatitude() - edge.getLatitude()));
+ delta.setLatitude(Asn1BigInteger.toAsn1(asnData.getFirstEdge().getLongitude() - edge.getLongitude()));
+ }
+
+ }
+ if (!asnList.isEmpty()) {
+ asnData.setEdges(asnList);
+ }
+ return asnData;
+ }
+
+ /**
+ * Encode line.
+ *
+ * @param document the data
+ * @return the line type
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private LineType encodeLine(ILine document) throws EncodingFormatException {
+ if (document == null) return null;
+ LineType asnData =new LineType();
+
+ asnData.setBinaryZoneId(document.getBinaryZoneId());
+ asnData.setCarrierNum(UicEncoderUtils.getNum(document.getCarrier()));
+ asnData.setCarrierIA5(UicEncoderUtils.getIA5NonNum(document.getCarrier()));
+ if (document.getStationCodeTable() != IStationCodeTable.stationUIC && document.getStationCodeTable() != null){
+ asnData.setStationCodeTable(CodeTableType.valueOf(document.getStationCodeTable().name()));
+ }
+ asnData.setEntryStationIA5(UicEncoderUtils.getIA5NonNum(document.getEntryStation()));
+ asnData.setEntryStationNum(UicEncoderUtils.getNum(document.getEntryStation()));
+
+ asnData.setTerminatingStationIA5(UicEncoderUtils.getIA5NonNum(document.getTerminatingStation()));
+ asnData.setTerminatingStationNum(UicEncoderUtils.getNum(document.getTerminatingStation()));
+
+ if (document.getCity() > 0) {
+ asnData.setCity(new Long(document.getCity()));
+ }
+
+ asnData.setLineId(SequenceOfUnrestrictedLong.getSequence(UicEncoderUtils.encodeIntegerCollection(document.getLineIds())));
+
+ return asnData;
+ }
+
+
+
+ /**
+ * Encode region collection.
+ *
+ * @param regionList the region list
+ * @param issuingDate the issuing date
+ * @return the list
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private SequenceOfRegionalValidityType encodeRegionCollection(Collection<IRegionalValidity> regionList, Date issuingDate) throws EncodingFormatException {
+
+ if (regionList == null || regionList.isEmpty()) {
+ return null;
+ }
+
+ SequenceOfRegionalValidityType asnList = new SequenceOfRegionalValidityType();
+
+ for ( IRegionalValidity region :regionList) {
+
+ RegionalValidityType asnRegion = new RegionalValidityType();
+
+ if (region instanceof ILine ) {
+ LineType line = encodeLine((ILine)region);
+ if (line == null){
+ break;
+ }
+ asnRegion.setLines(line);
+ asnList.add(asnRegion);
+ } else if (region instanceof IPolygone ) {
+ PolygoneType line = encodePolygone((IPolygone)region);
+ if (line == null){
+ break;
+ }
+ asnRegion.setPolygone(line);
+ asnList.add(asnRegion);
+ } else if (region instanceof ITrainLink ) {
+ TrainLinkType trainLink = encodeTrainLink((ITrainLink)region, issuingDate);
+ if (trainLink == null){
+ break;
+ }
+ asnRegion.setTrainLink(trainLink);
+ asnList.add(asnRegion);
+ } else if (region instanceof IViaStation ) {
+ ViaStationType viaStation = encodeViaStation((IViaStation)region);
+ if (viaStation == null){
+ break;
+ }
+ asnRegion.setViaStations(viaStation);
+ asnList.add(asnRegion);
+ } else if (region instanceof IZone ) {
+ ZoneType zone = encodeZone((IZone)region);
+ if (zone == null){
+ break;
+ }
+ asnRegion.setZones(zone);
+ asnList.add(asnRegion);
+ }
+
+ }
+
+ if (asnList.isEmpty()) {
+ return null;
+ }
+
+ return asnList;
+ }
+
+ /**
+ * Convert parking ground.
+ *
+ * @param document the document
+ * @param issuingDate the issuing date
+ * @return the document data
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private DocumentData convertParkingGround(IParkingGround document, Date issuingDate) throws EncodingFormatException {
+
+ DocumentData asnDocument = new DocumentData();
+ TicketDetailData asnTicket = new TicketDetailData();
+ asnDocument.setTicket(asnTicket);
+
+ ParkingGroundData asnData = new ParkingGroundData();
+ asnDocument.getTicket().setParkingGround(asnData);
+
+ asnData.setProductOwnerNum(UicEncoderUtils.getNum(document.getProductOwner()));
+ asnData.setProductOwnerIA5(UicEncoderUtils.getIA5NonNum(document.getProductOwner()));
+
+ asnData.setReferenceNum(Asn1BigInteger.toAsn1(UicEncoderUtils.getNum(document.getReference())));
+ asnData.setReferenceIA5(UicEncoderUtils.getIA5NonNum(document.getReference()));
+
+ asnData.setExtension(encodeExtension(document.getExtension()));
+
+ if (document.getStationCodeTable() != IStationCodeTable.stationUIC && document.getStationCodeTable() != null){
+ asnData.setStationCodeTable(CodeTableType.valueOf(document.getStationCodeTable().name()));
+ }
+
+ asnData.setStationIA5(UicEncoderUtils.getIA5NonNum(document.getStation()));
+ asnData.setStationNum(UicEncoderUtils.getNum(document.getStation()));
+
+ asnData.setAccessCode(UicEncoderUtils.getIA5(document.getAccessCode()));
+ asnData.setEntryTrack(document.getEntryTrack());
+
+ if (document.getFromParkingDate() != null){
+ asnData.setParkingDates(document.getFromParkingDate(),document.getToParkingDate(),issuingDate);
+ }
+
+ asnData.setLocation(document.getLocation());
+ asnData.setNumberPlate(UicEncoderUtils.getIA5(document.getNumberPlate()));
+ asnData.setParkingGroundId(UicEncoderUtils.getIA5(document.getParkingGroundId()));
+ asnData.setSpecialInformation(document.getSpecialInformation());
+
+ asnData.setPrice(document.getPrice());
+
+ if (document.getVatDetails() != null && !document.getVatDetails().isEmpty()){
+ for (IVatDetail vat : document.getVatDetails()) {
+ asnData.addVatDetail(encodeVatDetail(vat));
+ }
+ }
+
+ return asnDocument;
+ }
+
+
+ /**
+ * Encode route section.
+ *
+ * @param document the route
+ * @return the route section type
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private RouteSectionType encodeRouteSection(IRouteSection document) throws EncodingFormatException {
+
+ if (document == null) return null;
+
+ RouteSectionType asnRoute = new RouteSectionType();
+
+
+ if (document.getStationCodeTable() != IStationCodeTable.stationUIC && document.getStationCodeTable() != null){
+ asnRoute.setStationCodeTable(CodeTableType.valueOf(document.getStationCodeTable().name()));
+ }
+
+ asnRoute.setFromStationIA5(UicEncoderUtils.getIA5NonNum(document.getFromStation()));
+ asnRoute.setFromStationNum(UicEncoderUtils.getNum(document.getFromStation()));
+
+ asnRoute.setToStationIA5(UicEncoderUtils.getIA5NonNum(document.getToStation()));
+ asnRoute.setToStationNum(UicEncoderUtils.getNum(document.getToStation()));
+
+ asnRoute.setFromStationNameUTF8(document.getFromStationName());
+ asnRoute.setToStationNameUTF8(document.getToStationName());
+
+
+ return asnRoute;
+ }
+
+ /**
+ * Encode tariff collection.
+ *
+ * @param tariffs the tariffs
+ * @return the list
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private SequenceOfTariffType encodeTariffCollection(Collection<ITariff> tariffs) throws EncodingFormatException {
+
+ if (tariffs== null || tariffs.isEmpty()) {
+ return null;
+ }
+
+ SequenceOfTariffType tariffList = new SequenceOfTariffType();
+
+ for (ITariff tariff :tariffs){
+
+ TariffType asnTariff = encodeTariff(tariff);
+
+ if (asnTariff != null) {
+ tariffList.add(asnTariff);
+ }
+ }
+
+ if (tariffList.isEmpty()) {
+ return null;
+ }
+
+ return tariffList;
+ }
+
+ /**
+ * Encode tariff.
+ *
+ * @param tariff the tariff
+ * @return the tariff type
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private TariffType encodeTariff(ITariff tariff) throws EncodingFormatException {
+
+ if (tariff == null ) {
+ return null;
+ }
+
+ TariffType asnTariff = new TariffType();
+
+ asnTariff.setAgeAbove(UicEncoderUtils.getRestrictedInt(tariff.getAgeAbove(),2,120));
+ asnTariff.setAgeBelow(UicEncoderUtils.getRestrictedInt(tariff.getAgeBelow(),1,40));
+
+ asnTariff.setNumberOfPassengers(UicEncoderUtils.getRestrictedIntWithDefault(tariff.getNumberOfPassengers(),1,200,1));
+
+
+ try {
+ if (tariff.getPassengerType() != null) {
+ asnTariff.setPassengerType(PassengerType.valueOf(tariff.getPassengerType().name()));
+ }
+ } catch (Exception e){
+ //no value found
+ }
+
+
+ asnTariff.setReductionCard(encodeCardReferences(tariff.getReductionCards()));
+ asnTariff.setRestrictedToCountryOfResidence(tariff.isRestrictedToCountryOfResidence());
+ asnTariff.setRestrictedToRouteSection(encodeRouteSection(tariff.getRestrictedToRouteSection()));
+
+ if (tariff.getSeriesDataDetails()!= null) {
+ asnTariff.setSeriesDataDetails(encodeSeriesDataDetails(tariff.getSeriesDataDetails()));
+ }
+
+
+ asnTariff.setTariffDesc(tariff.getTariffDescription());
+ asnTariff.setTariffIdIA5(UicEncoderUtils.getIA5NonNum(tariff.getTariffId()));
+ asnTariff.setTariffIdNum(UicEncoderUtils.getNum(tariff.getTariffId()));
+
+ asnTariff.setTraverlerid(SequenceOfTravelerId.getSequence(UicEncoderUtils.encodeRestrictedIntegerCollection(tariff.getTravelerIds(), 1, 254)));
+
+ return asnTariff;
+ }
+
+ private SeriesDetailType encodeSeriesDataDetails( ISeriesDataDetails seriesDataDetails) throws EncodingFormatException {
+ SeriesDetailType details = new SeriesDetailType();
+ details.setSeries(UicEncoderUtils.getRestrictedInt(seriesDataDetails.getSeries(), 1, 99999));
+ details.setSupplyingCarrier(UicEncoderUtils.getRestrictedInt(seriesDataDetails.getSupplyingCarrier(), 1, 9999));
+ details.setOfferIdentification(UicEncoderUtils.getRestrictedInt(seriesDataDetails.getOfferIdentification(), 1, 99));
+ return null;
+ }
+
+ /**
+ * Convert voucher.
+ *
+ * @param document the document
+ * @param issuingDate the issuing date
+ * @return the document data
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private DocumentData convertVoucher(IVoucher document, Date issuingDate) throws EncodingFormatException {
+ DocumentData asnDocument = new DocumentData();
+ TicketDetailData asnTicket = new TicketDetailData();
+ asnDocument.setTicket(asnTicket);
+
+
+ VoucherData asnData = new VoucherData();
+ asnDocument.getTicket().setVoucher(asnData);
+
+ asnData.setProductOwnerNum(UicEncoderUtils.getNum(document.getProductOwner()));
+ asnData.setProductOwnerIA5(UicEncoderUtils.getIA5NonNum(document.getProductOwner()));
+
+ asnData.setProductIdNum(UicEncoderUtils.getNum(document.getProductId()));
+ asnData.setProductIdIA5(UicEncoderUtils.getIA5NonNum(document.getProductId()));
+
+ asnData.setReferenceNum(Asn1BigInteger.toAsn1(UicEncoderUtils.getNum(document.getReference())));
+ asnData.setReferenceIA5(UicEncoderUtils.getIA5NonNum(document.getReference()));
+
+ asnData.setInfoText(document.getInfoText());
+
+ asnData.setValidity(document.getValidFrom(), document.getValidUntil());
+
+ asnData.setType(UicEncoderUtils.getRestrictedInt(document.getType(), 1,9999));
+
+ asnData.setValue(UicEncoderUtils.getRestrictedInt(document.getAmount(),1,9999999));
+
+ return asnDocument;
+ }
+
+ /**
+ * Convert pass.
+ *
+ * @param document the document
+ * @param issuingDate the issuing date
+ * @return the document data
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private DocumentData convertPass(IPass document, Date issuingDate) throws EncodingFormatException {
+
+ DocumentData asnDocument = new DocumentData();
+ TicketDetailData asnTicket = new TicketDetailData();
+ asnDocument.setTicket(asnTicket);
+
+ PassData asnData = new PassData();
+ asnDocument.getTicket().setPass(asnData);
+
+ asnData.setProductOwnerNum(UicEncoderUtils.getNum(document.getProductOwner()));
+ asnData.setProductOwnerIA5(UicEncoderUtils.getIA5NonNum(document.getProductOwner()));
+
+ asnData.setProductIdNum(UicEncoderUtils.getNum(document.getProductId()));
+ asnData.setProductIdIA5(UicEncoderUtils.getIA5NonNum(document.getProductId()));
+
+ asnData.setReferenceNum(Asn1BigInteger.toAsn1(UicEncoderUtils.getNum(document.getReference())));
+ asnData.setReferenceIA5(UicEncoderUtils.getIA5NonNum(document.getReference()));
+
+ asnData.setInfoText(document.getInfoText());
+ asnData.setExtension(encodeExtension(document.getExtension()));
+
+ asnData.setIncludedCarriersNum(SequenceOfCarrierNum.getSequence(UicEncoderUtils.getNumList(document.getIncludedCarriers())));
+ asnData.setIncludedCarriersIA5(UicEncoderUtils.getIA5NonNumList(document.getIncludedCarriers()));
+
+ asnData.setExcludedCarriersNum(SequenceOfCarrierNum.getSequence(UicEncoderUtils.getNumList(document.getExcludedCarriers())));
+ asnData.setExcludedCarriersIA5(UicEncoderUtils.getIA5NonNumList(document.getExcludedCarriers()));
+
+ asnData.setValidityDates(document.getValidFrom(), document.getValidUntil(), issuingDate);
+
+ if (document.getValidFromUTCoffset() != null) {
+ asnData.setValidFromUTCOffset(document.getValidFromUTCoffset());
+ if (document.getValidUntilUTCoffset() != null && document.getValidUntilUTCoffset() != document.getValidFromUTCoffset()){
+ asnData.setValidUntilUTCOffset(document.getValidUntilUTCoffset());
+ }
+ }
+
+
+ if(document.getActivatedDays()!= null && document.getActivatedDays().size() > 0) {
+ if (document.getValidFrom() != null) {
+ asnData.setActivatedDays(document.getActivatedDays(),document.getValidFrom());
+ } else {
+ asnData.setActivatedDays(document.getActivatedDays(),issuingDate);
+ }
+ }
+ if (document.getClassCode() != null) {
+ asnData.setClassCode(TravelClassType.valueOf(document.getClassCode().name()));
+ }
+ if (document.getCountries() != null && document.getCountries().size() > 0){
+ asnData.setCountries(SequenceOfCountries.getSequence(UicEncoderUtils.encodeRestrictedIntegerCollection(document.getCountries(),1,250)));
+ }
+
+ asnData.setExcludedServiceBrands(SequenceOfServiceBrands.getSequence(UicEncoderUtils.encodeRestrictedIntegerCollection(document.getExcludedServiceBrands(),1,32000)));
+ asnData.setIncludedServiceBrands(SequenceOfServiceBrands.getSequence(UicEncoderUtils.encodeRestrictedIntegerCollection(document.getIncludedServiceBrands(),1,32000)));
+
+ asnData.setNumberOfDaysOfTravel(UicEncoderUtils.getRestrictedInt(document.getNumberOfDaysOfTravel(), 1, 93));
+ asnData.setNumberOfPossibleTrips(UicEncoderUtils.getRestrictedInt(document.getNumberOfPossibleTrips(), 1, 30));
+ asnData.setNumberOfValidityDays(UicEncoderUtils.getRestrictedInt(document.getNumberOfValidityDays(), 1, 370));
+ asnData.setPassDescription(document.getPassDescription());
+ if (document.getPassType() > 0 ){
+ asnData.setPassType(new Long(document.getPassType()));
+ }
+
+ asnData.setTariffs(encodeTariffCollection(document.getTariffs()));
+
+
+
+ if(document.getValidRegionList()!= null && document.getValidRegionList().size() > 0) {
+ asnData.setValidRegion(encodeRegionCollection(document.getValidRegionList(), issuingDate));
+ }
+
+ if (document.getValidityDetails() != null) {
+ asnData.setValidityPeriodDetails(encodeValidityDetails(document.getValidityDetails(), issuingDate));
+ }
+
+
+
+ asnData.setPrice(document.getPrice());
+
+ if (document.getVatDetails() != null && !document.getVatDetails().isEmpty()){
+ for (IVatDetail vat : document.getVatDetails()) {
+ asnData.addVatDetail(encodeVatDetail(vat));
+ }
+ }
+
+
+ return asnDocument;
+ }
+
+
+ private ValidityPeriodDetailType encodeValidityDetails( IValidityDetails validityDetails, Date referenceDate) throws EncodingFormatException {
+
+ if ( (validityDetails.getTimeRanges() == null || validityDetails.getTimeRanges().isEmpty())
+ ||
+ (validityDetails.getValidityRanges() == null || validityDetails.getValidityRanges().isEmpty()) ) {
+ return null;
+ }
+
+
+ ValidityPeriodDetailType asnData = new ValidityPeriodDetailType();
+
+ if (validityDetails.getTimeRanges() != null) {
+ for (ITimeRange range : validityDetails.getTimeRanges()) {
+
+ if (range.getFromTime() == range.getUntilTime()){
+ break;
+ }
+
+ TimeRangeType asnRange = new TimeRangeType();
+ asnRange.setFromTime(new Long(range.getFromTime()));
+ asnRange.setUntilTime(new Long(range.getUntilTime()));
+
+ asnData.getExcludedTimeRange().add(asnRange);
+ }
+ }
+
+ if (validityDetails.getValidityRanges() != null) {
+ for (IValidityRange range : validityDetails.getValidityRanges()) {
+
+ ValidityPeriodType asnRange = new ValidityPeriodType();
+
+ asnRange.setValidityDates(range.getFromDate(), range.getUntilDate(), referenceDate);
+
+ if (range.getValidFromUTCoffset() != null) {
+ asnRange.setValidFromUTCOffset(range.getValidFromUTCoffset());
+ if (range.getValidUntilUTCoffset() != null && range.getValidUntilUTCoffset() != range.getValidFromUTCoffset()){
+ asnRange.setValidUntilUTCOffset(range.getValidUntilUTCoffset());
+ }
+ }
+
+
+ asnData.getValidityPeriod().add(asnRange);
+ }
+ }
+
+ return asnData;
+ }
+
+ /**
+ * Convert fip ticket.
+ *
+ * @param document the document
+ * @param issuingDate the issuing date
+ * @return the document data
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private DocumentData convertFipTicket(IFipTicket document, Date issuingDate) throws EncodingFormatException {
+
+ DocumentData asnDocument = new DocumentData();
+ TicketDetailData asnTicket = new TicketDetailData();
+ asnDocument.setTicket(asnTicket);
+
+
+ FIPTicketData asnData = new FIPTicketData();
+ asnDocument.getTicket().setFipTicket(asnData);
+
+ asnData.setProductOwnerNum(UicEncoderUtils.getNum(document.getProductOwner()));
+ asnData.setProductOwnerIA5(UicEncoderUtils.getIA5NonNum(document.getProductOwner()));
+
+ asnData.setProductIdNum(UicEncoderUtils.getNum(document.getProductId()));
+ asnData.setProductIdIA5(UicEncoderUtils.getIA5NonNum(document.getProductId()));
+
+ asnData.setReferenceNum(Asn1BigInteger.toAsn1(UicEncoderUtils.getNum(document.getReference())));
+ asnData.setReferenceIA5(UicEncoderUtils.getIA5NonNum(document.getReference()));
+
+ asnData.setCarrierNum(SequenceOfCarrierNum.getSequence(UicEncoderUtils.getNumList(document.getCarriers())));
+ asnData.setCarrierIA5(UicEncoderUtils.getIA5NonNumList(document.getCarriers()));
+
+ if (document.getClassCode() != null) {
+ asnData.setClassCode(TravelClassType.valueOf(document.getClassCode().name()));
+ }
+ if (!document.isIncludesSupplements()){
+ asnData.setIncludesSupplements(false);
+ }
+ asnData.setNumberOfTravelDays(UicEncoderUtils.getRestrictedInt(document.getNumberOfTravelDates(), 1, 8));
+
+ asnData.setValidityDates(document.getValidFrom(), document.getValidUntil(), issuingDate);
+
+ if(document.getActivatedDays()!= null && document.getActivatedDays().size() > 0) {
+ asnData.setActivatedDays(document.getActivatedDays(), document.getValidFrom());
+ }
+
+ asnData.setExtension(encodeExtension(document.getExtension()));
+
+ return asnDocument;
+ }
+
+ /**
+ * Convert station passage.
+ *
+ * @param document the document
+ * @param issuingDate the issuing date
+ * @return the document data
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private DocumentData convertStationPassage(IStationPassage document,Date issuingDate) throws EncodingFormatException {
+
+ DocumentData asnDocument = new DocumentData();
+ TicketDetailData asnTicket = new TicketDetailData();
+ asnDocument.setTicket(asnTicket);
+
+ StationPassageData asnData = new StationPassageData();
+ asnDocument.getTicket().setStationPassage(asnData);
+
+ asnData.setProductOwnerNum(UicEncoderUtils.getNum(document.getProductOwner()));
+ asnData.setProductOwnerIA5(UicEncoderUtils.getIA5NonNum(document.getProductOwner()));
+
+ asnData.setProductIdNum(UicEncoderUtils.getNum(document.getProductId()));
+ asnData.setProductIdIA5(UicEncoderUtils.getIA5NonNum(document.getProductId()));
+
+ asnData.setReferenceNum(Asn1BigInteger.toAsn1(UicEncoderUtils.getNum(document.getReference())));
+ asnData.setReferenceIA5(UicEncoderUtils.getIA5NonNum(document.getReference()));
+
+ if (document.getNumberOfdaysAllowed() > 0) {
+ asnData.setNumberOfDaysValid(new Long(document.getNumberOfdaysAllowed()));
+ }
+
+ asnData.setProductName(document.getProductName());
+
+ if (document.getStationCodeTable() != IStationCodeTable.stationUIC && document.getStationCodeTable() != null){
+ asnData.setStationCodeTable(CodeTableType.valueOf(document.getStationCodeTable().name()));
+ }
+
+
+ if (document.getStations()!= null && !document.getStations().isEmpty()){
+ SequenceOfStringIA5 stationsIA5 = new SequenceOfStringIA5();
+ SequenceOfUnrestrictedLong stationsNum = new SequenceOfUnrestrictedLong();
+
+ for (String station : document.getStations()) {
+ String ia5 = UicEncoderUtils.getIA5NonNum(station);
+ Long num = UicEncoderUtils.getNum(station);
+ if (ia5 != null && ia5.length() > 0) {
+ stationsIA5.add(ia5);
+ }
+ if (num != null && num > 0){
+ stationsNum.add(num);
+ }
+ }
+ if (!stationsIA5.isEmpty()){
+ asnData.setStationIA5(stationsIA5);
+ }
+ if (!stationsNum.isEmpty()){
+ asnData.setStationNum(stationsNum);
+ }
+ }
+
+ if (document.getStationNames()!= null && !document.getStationNames().isEmpty()) {
+
+ SequenceOfStringUTF8 asnList = new SequenceOfStringUTF8();
+ for ( String text :document.getStationNames()){
+ if (text.length() > 0) {
+ asnList.add(text);
+ }
+ }
+
+ if (!asnList.isEmpty()) {
+ asnData.setStationNameUTF8(asnList);
+ }
+
+ }
+
+ asnData.setValidityDates(document.getValidFrom(), document.getValidUntil(), issuingDate);
+
+ if (document.getValidFromUTCoffset() != null) {
+ asnData.setValidFromUTCOffset(document.getValidFromUTCoffset());
+ if (document.getValidUntilUTCoffset() != null && document.getValidUntilUTCoffset() != document.getValidFromUTCoffset()){
+ asnData.setValidUntilUTCOffset(document.getValidUntilUTCoffset());
+ }
+ }
+
+
+ asnData.setExtension(encodeExtension(document.getExtension()));
+
+ asnData.setAreaCodeNum(SequenceOfUnrestrictedLong.getSequence(UicEncoderUtils.getNumList(document.getAreaCodes())));
+ asnData.setAreaCodeIA5(UicEncoderUtils.getIA5NonNumList(document.getAreaCodes()));
+
+ asnData.setAreaNameUTF8(UicEncoderUtils.encodeStringCollection(document.getAreaNames()));
+
+ return asnDocument;
+ }
+
+
+ /**
+ * Encode control details.
+ *
+ * @param data the data
+ * @param issuingDate the issuing date
+ * @return the control data
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private ControlData encodeControlDetails(IControlDetail data, Date issuingDate) throws EncodingFormatException {
+
+ if (data == null) return null;
+
+ ControlData asnData = new ControlData();
+
+ asnData.setExtension(encodeExtension(data.getExtension()));
+
+ if (data.isAgeCheckRequired()) {
+ asnData.setAgeCheckRequired(true);
+ } else {
+ asnData.setAgeCheckRequired(false);
+ }
+
+ if (data.isIdentificationByIdCard()){
+ asnData.setIdentificationByIdCard(true);
+ } else {
+ asnData.setIdentificationByIdCard(false);
+ }
+
+ if (data.isIdentificationByPassportId()){
+ asnData.setIdentificationByPassportId(true);
+ } else {
+ asnData.setIdentificationByPassportId(false);
+ }
+
+ if (data.isOnlineValidationRequired()){
+ asnData.setOnlineValidationRequired(true);
+ } else {
+ asnData.setOnlineValidationRequired(false);
+ }
+
+ if (data.isPassportValidationRequired()){
+ asnData.setPassportValidationRequired(true);
+ } else {
+ asnData.setPassportValidationRequired(false);
+ }
+
+ if (data.isReductionCardCheckRequired()){
+ asnData.setReductionCardCheckRequired(true);
+ } else {
+ asnData.setReductionCardCheckRequired(false);
+ }
+
+ asnData.setInfoText(data.getInfoText());
+
+ asnData.setRandomDetailedValidationRequired(UicEncoderUtils.getRestrictedInt(data.getRandomDetailedValidationRequired(), 0,99));
+
+ asnData.setIdentificationItem(UicEncoderUtils.getUnRestrictedInt(data.getIdentificationItem()));
+
+ asnData.setIncludedTickets(encodeTicketLickList(data.getLinkedTickets()));
+
+ asnData.setIdentificationByCardReference(encodeCardReferences(data.getIdentificationByCardReference()));
+
+ return asnData;
+ }
+
+
+
+ /**
+ * Encode card references.
+ *
+ * @param cardReferences the card references
+ * @return the list
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private SequenceOfCardReferenceType encodeCardReferences(Collection<ICardReference> cardReferences) throws EncodingFormatException {
+
+ if (cardReferences == null || cardReferences.isEmpty()) return null;
+
+ SequenceOfCardReferenceType asnList = new SequenceOfCardReferenceType();
+
+ for (ICardReference card : cardReferences){
+
+ CardReferenceType asnCard = new CardReferenceType();
+
+ if (card.getCardId() != null && card.getCardId().length() > 0){
+ //only longs allowed
+ try {
+ long num = Long.parseLong(card.getCardId());
+ asnCard.setCardIdNum(num);
+ } catch (Exception e ){
+ asnCard.setCardIdIA5(card.getCardId());
+ }
+ }
+
+
+ asnCard.setCardIssuerNum(UicEncoderUtils.getNum(card.getCardIssuer()));
+ asnCard.setCardIssuerIA5(UicEncoderUtils.getIA5NonNum(card.getCardIssuer()));
+ asnCard.setCardName(card.getCardName());
+ asnCard.setCardType(UicEncoderUtils.getUnRestrictedInt(card.getCardType()));
+
+ asnCard.setLeadingCardIdNum(UicEncoderUtils.getNum(card.getLeadingCardId()));
+ asnCard.setLeadingCardIdIA5(UicEncoderUtils.getIA5NonNum(card.getLeadingCardId()));
+
+ asnCard.setTrailingCardIdNum(UicEncoderUtils.getNum(card.getTrailingCardId()));
+ asnCard.setTrailingCardIdIA5(UicEncoderUtils.getIA5NonNum(card.getTrailingCardId()));
+
+ asnList.add(asnCard);
+
+ }
+
+
+ if (asnList.isEmpty()) return null;
+
+ return asnList;
+ }
+
+ /**
+ * Encode ticket lick list.
+ *
+ * @param linkedTickets the linked tickets
+ * @return the list
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private SequenceOfTicketLinkType encodeTicketLickList(Collection<ITicketLink> linkedTickets) throws EncodingFormatException {
+
+ if (linkedTickets == null || linkedTickets.isEmpty()) return null;
+
+ SequenceOfTicketLinkType asnList = new SequenceOfTicketLinkType();
+
+ for (ITicketLink ticket : linkedTickets){
+
+ TicketLinkType asnTicket = new TicketLinkType();
+
+ asnTicket.setIssuerName(ticket.getIssuer());
+
+ asnTicket.setIssuerPNR(ticket.getIssuerPNR());
+
+ asnTicket.setProductOwnerNum(UicEncoderUtils.getNum(ticket.getProductOwner()));
+ asnTicket.setProductOwnerIA5(UicEncoderUtils.getIA5NonNum(ticket.getProductOwner()));
+
+ asnTicket.setReferenceNum(UicEncoderUtils.getNum(ticket.getReference()));
+ asnTicket.setReferenceIA5(UicEncoderUtils.getIA5NonNum(ticket.getReference()));
+
+ if (ticket.getTicketType() != ITicketType.openTicket && ticket.getTicketType() != null){
+ asnTicket.setTicketType(TicketType.valueOf(ticket.getTicketType().name()));
+ }
+
+ if (ticket.getLinkMode() != ILinkMode.issuedTogether && ticket.getLinkMode() != null){
+ asnTicket.setLinkMode(LinkMode.valueOf(ticket.getLinkMode().name()));
+ }
+
+ asnList.add(asnTicket);
+ }
+
+ if (asnList.isEmpty()) return null;
+
+ return asnList;
+ }
+
+ /**
+ * Encode travelers.
+ *
+ * @param data the data
+ * @param issuingDate the issuing date
+ * @return the traveler data
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private TravelerData encodeTravelers(ITravelerDetail data,Date issuingDate) throws EncodingFormatException {
+
+ if (data == null) return null;
+
+ TravelerData asnData = new TravelerData();
+
+ asnData.setGroupName(data.getGroupName());
+
+ asnData.setPreferedLanguage(data.getPreferredLanguage());
+
+ if (data.getTravelers()!=null && !data.getTravelers().isEmpty()) {
+
+ SequenceOfTravelerType asnTravelers = new SequenceOfTravelerType();
+
+ for (ITraveler traveler : data.getTravelers()){
+
+ TravelerType asnTraveler = encodeTraveler(traveler);
+
+ if (asnTraveler !=null){
+ asnTravelers.add(asnTraveler);
+ }
+ }
+
+ if (!asnTravelers.isEmpty()) {
+ asnData.setTraveler(asnTravelers);
+ }
+
+ }
+
+ return asnData;
+ }
+
+ /**
+ * Encode issuing details.
+ *
+ * @param data the data
+ * @return the issuing data
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private IssuingData encodeIssuingDetails(IIssuingDetail data) throws EncodingFormatException {
+
+ if (data == null){
+ throw new EncodingFormatException("Issuind data missing");
+ }
+
+ IssuingData asnData = new IssuingData();
+
+ if (!data.isActivated()){
+ asnData.setActivated(false);
+ } else {
+ asnData.setActivated(true);
+ }
+
+ if (!data.isSecurePaperTicket()) {
+ asnData.setSecurePaperTicket(false);
+ } else {
+ asnData.setSecurePaperTicket(true);
+ }
+
+ asnData.setExtension(encodeExtension(data.getExtension()));
+
+
+ asnData.setIssuedOnLine(UicEncoderUtils.getRestrictedInt(data.getIssuedOnLine(), 1, 99999));
+
+ asnData.setIssuedOnTrainNum(UicEncoderUtils.getNum(data.getIssuedOnTrain()));
+ asnData.setIssuedOnTrainIA5(UicEncoderUtils.getIA5NonNum(data.getIssuedOnTrain()));
+
+
+ asnData.setSecurityProviderNum(UicEncoderUtils.getNum(data.getSecurityProvider()));
+
+
+ if (data.getIssuer()!= null && !data.getIssuer().equals(data.getSecurityProvider()) ){
+ asnData.setIssuerNum(UicEncoderUtils.getNum(data.getIssuer()));
+ asnData.setIssuerIA5(UicEncoderUtils.getIA5NonNum(data.getIssuer()));
+ }
+
+ asnData.setIssuerName(data.getIssuerName());
+ asnData.setIssuerPNR(UicEncoderUtils.getIA5(data.getIssuerPNR()));
+
+
+ asnData.setIssuingDate(data.getIssuingDate());
+
+ if (data.isSpecimen()){
+ asnData.setSpecimen(true);
+ } else {
+ asnData.setSpecimen(false);
+ }
+
+ if (data.getPointOfSale()!= null){
+ asnData.setPointOfSale(encodeGeoCoordinate(data.getPointOfSale()));
+ }
+
+ return asnData;
+ }
+
+ /**
+ * Encode geo coordinate.
+ *
+ * @param point the point
+ * @return the geo coordinate type
+ */
+ private GeoCoordinateType encodeGeoCoordinate(IGeoCoordinate point) {
+
+ if (point == null) return null;
+
+ GeoCoordinateType asnPoint = new GeoCoordinateType();
+
+ asnPoint.setLatitude(point.getLatitude());
+ asnPoint.setLongitude(point.getLongitude());
+
+ if (point.getUnit() != IGeoUnitType.milliDegree && point.getUnit() != null){
+ asnPoint.setGeoUnit(GeoUnitType.valueOf(point.getUnit().name()));
+ }
+
+ if (point.getAccuracy() != null) {
+ asnPoint.setAccuracy(GeoUnitType.valueOf(point.getAccuracy().name()));
+ }
+
+ if (point.getHemisphereLatitude() != IHemisphereLatitudeType.east && point.getHemisphereLatitude() != null) {
+ asnPoint.setHemisphereLatitude(HemisphereLatitudeType.valueOf(point.getHemisphereLatitude().name()));
+ }
+
+ if (point.getHemisphereLongitude() != IHemisphereLongitudeType.north && point.getHemisphereLongitude() != null) {
+ asnPoint.setHemisphereLongitude(HemisphereLongitudeType.valueOf(point.getHemisphereLongitude().name()));
+ }
+
+ if (point.getSystem() != IGeoCoordinateSystemType.wgs84 && point.getSystem() != null){
+ asnPoint.setCoordinateSystem(GeoCoordinateSystemType.valueOf(point.getSystem().name()));
+ }
+
+
+ return asnPoint;
+ }
+
+ /**
+ * Encode customer card.
+ *
+ * @param document the customer card
+ * @param issuingDate the issuing date
+ * @return the document data
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private DocumentData encodeCustomerCard(ICustomerCard document,Date issuingDate) throws EncodingFormatException {
+
+ DocumentData asnDocument = new DocumentData();
+ TicketDetailData asnTicket = new TicketDetailData();
+ asnDocument.setTicket(asnTicket);
+
+ CustomerCardData asnCustomerCard = new CustomerCardData();
+ asnDocument.getTicket().setCustomerCard(asnCustomerCard);
+
+
+ if (document.getCardId() != null && document.getCardId().length() > 0){
+ //only longs allowed
+ try {
+ long num = Long.parseLong(document.getCardId());
+ asnCustomerCard.setCardIdNum(num);
+ } catch (Exception e ){
+ asnCustomerCard.setCardIdIA5(document.getCardId());
+ }
+ }
+
+
+ asnCustomerCard.setCardType(UicEncoderUtils.getRestrictedInt(document.getCardType(),1,1000));
+
+ asnCustomerCard.setCardTypeDescr(document.getCardTypeDescr());
+
+ if (document.getClassCode() != null) {
+ asnCustomerCard.setClassCode(TravelClassType.valueOf(document.getClassCode().name()));
+ }
+
+ if (document.getCustomer()!=null){
+ asnCustomerCard.setCustomer(encodeTraveler(document.getCustomer()));
+ }
+
+ asnCustomerCard.setCustomerStatus(UicEncoderUtils.getUnRestrictedInt(document.getCustomerStatus()));
+
+ asnCustomerCard.setCustomerStatusDescr(document.getCustomerStatusDescr());
+
+ asnCustomerCard.setExtension(encodeExtension(document.getExtension()));
+
+ asnCustomerCard.setIncludedServices(SequenceOfUnrestrictedLong.getSequence(UicEncoderUtils.getUnRestrictedIntList(document.getIncludedServices())));
+
+ asnCustomerCard.setValidity(document.getValidFrom(), document.getValidUntil());
+
+ return asnDocument;
+ }
+
+ private TokenType encodeToken(IToken token) throws EncodingFormatException {
+ TokenType asnToken = new TokenType();
+ asnToken.setToken(token.getToken());
+ asnToken.setTokenProviderNum(UicEncoderUtils.getNum(token.getTokenProvider()));
+ asnToken.setTokenProviderIA5(UicEncoderUtils.getIA5NonNum(token.getTokenProvider()));
+ asnToken.setTokenSpecification(token.getTokenSpecification());
+ return asnToken;
+ }
+
+
+
+
+ private VatDetailType encodeVatDetail(IVatDetail vatDetail) {
+
+ if (vatDetail == null) return null;
+
+ VatDetailType asnVatDetail = new VatDetailType();
+
+ asnVatDetail.setAmount(vatDetail.getAmount());
+ asnVatDetail.setCountry(new Long(vatDetail.getCountry()));
+ asnVatDetail.setPercentage(new Long(vatDetail.getPercentage()));
+ asnVatDetail.setVatId(vatDetail.getVatId());
+
+ return asnVatDetail;
+
+ }
+
+ /**
+ * Encode traveler.
+ *
+ * @param traveler the traveler
+ * @return the traveler type
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private TravelerType encodeTraveler(ITraveler traveler) throws EncodingFormatException {
+
+ if (traveler == null) return null;
+
+ TravelerType asnTraveler = new TravelerType();
+
+ asnTraveler.setCountryOfResidence(UicEncoderUtils.getRestrictedInt(traveler.getCountryOfResidence(), 1, 999));
+ asnTraveler.setCountryOfPassport(UicEncoderUtils.getRestrictedInt(traveler.getPassportCountry(), 1, 999));
+ asnTraveler.setCountryOfIdCard(UicEncoderUtils.getRestrictedInt(traveler.getIDCardCountry(), 1, 999));
+
+
+ asnTraveler.setCustomerIdNum(UicEncoderUtils.getNum(traveler.getCustomerId()));
+ asnTraveler.setCustomerIdIA5(UicEncoderUtils.getIA5NonNum(traveler.getCustomerId()));
+
+ asnTraveler.setDateOfBirth(traveler.getDateOfBirth());
+
+ asnTraveler.setFirstName(traveler.getFirstName());
+ asnTraveler.setSecondName(traveler.getSecondName());
+ asnTraveler.setLastName(traveler.getLastName());
+ asnTraveler.setGender(GenderType.valueOf(traveler.getGender().toString()));
+ asnTraveler.setIdCard(UicEncoderUtils.getIA5(traveler.getIdCard()));
+ asnTraveler.setPassportId(UicEncoderUtils.getIA5(traveler.getPassportId()));
+ asnTraveler.setTitle(UicEncoderUtils.getIA5(traveler.getTitle()));
+
+ if (traveler.getPassengerType() != null) {
+ asnTraveler.setPassengerType(PassengerType.valueOf(traveler.getPassengerType().name()));
+ }
+
+ asnTraveler.setPassengerWithReducedMobility(traveler.isPassengerWithReducedMobility());
+ if (traveler.isTicketHolder()){
+ asnTraveler.setTicketHolder(true);
+ } else {
+ asnTraveler.setTicketHolder(false);
+ }
+
+ if (traveler.getStatusCollection()!= null && !traveler.getStatusCollection().isEmpty()){
+
+ SequenceOfCustomerStatusType asnList = new SequenceOfCustomerStatusType();
+
+ for (ICustomerStatusDescription status : traveler.getStatusCollection() ) {
+ asnList.add(mapCustomerStatusType(status));
+ }
+ if (!asnList.isEmpty()) {
+ asnTraveler.setStatus(asnList);
+ }
+ }
+
+
+ return asnTraveler;
+ }
+
+ /**
+ * Map customer status type.
+ *
+ * @param status the status
+ * @return the customer status type
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private CustomerStatusType mapCustomerStatusType(ICustomerStatusDescription status) throws EncodingFormatException {
+
+ CustomerStatusType asnStatus = new CustomerStatusType();
+
+ if (status.getStatus() > 0) {
+ asnStatus.setCustomerStatus(new Long(status.getStatus()));
+ }
+ asnStatus.setCustomerStatusDescr(status.getDescription());
+ asnStatus.setStatusProviderIA5(UicEncoderUtils.getIA5NonNum(status.getStatusProvider()));
+ asnStatus.setStatusProviderNum(UicEncoderUtils.getNum(status.getStatusProvider()));
+
+ return asnStatus;
+ }
+
+ /**
+ * Encode extension.
+ *
+ * @param extension the extension
+ * @return the extension data
+ * @throws EncodingFormatException the encoding format exception
+ */
+ private ExtensionData encodeExtension(IExtension extension) throws EncodingFormatException {
+
+ if (extension==null) return null;
+
+ if (extension.getBinarydata() == null || extension.getBinarydata().length == 0) {
+ throw new EncodingFormatException("Extension does not include data");
+ }
+
+ if (extension.getId() == null || extension.getId().length() == 0) {
+ throw new EncodingFormatException("Extension does not include id");
+ }
+
+ ExtensionData asnExtension = new ExtensionData();
+
+ asnExtension.setExtensionData(extension.getBinarydata());
+ asnExtension.setExtensionId(UicEncoderUtils.getIA5(extension.getId()));
+
+ return asnExtension;
+ }
+
+
+}
diff --git a/src/org/uic/ticket/api/utils/OpenAsn2ApiDecoderV2.java b/src/org/uic/ticket/api/utils/OpenAsn2ApiDecoderV2.java
new file mode 100644
index 0000000..2ffdb7b
--- /dev/null
+++ b/src/org/uic/ticket/api/utils/OpenAsn2ApiDecoderV2.java
@@ -0,0 +1,2246 @@
+/*
+ *
+ */
+package org.uic.ticket.api.utils;
+
+import java.io.IOException;
+import java.util.Date;
+import java.util.List;
+
+import org.uic.ticket.api.asn.omv2.BerthDetailData;
+import org.uic.ticket.api.asn.omv2.CarCarriageReservationData;
+import org.uic.ticket.api.asn.omv2.CardReferenceType;
+import org.uic.ticket.api.asn.omv2.CompartmentDetailsType;
+import org.uic.ticket.api.asn.omv2.ControlData;
+import org.uic.ticket.api.asn.omv2.CountermarkData;
+import org.uic.ticket.api.asn.omv2.CustomerCardData;
+import org.uic.ticket.api.asn.omv2.CustomerStatusType;
+import org.uic.ticket.api.asn.omv2.DelayConfirmation;
+import org.uic.ticket.api.asn.omv2.DeltaCoordinates;
+import org.uic.ticket.api.asn.omv2.DocumentData;
+import org.uic.ticket.api.asn.omv2.ExtensionData;
+import org.uic.ticket.api.asn.omv2.FIPTicketData;
+import org.uic.ticket.api.asn.omv2.GeoCoordinateType;
+import org.uic.ticket.api.asn.omv2.IncludedOpenTicketType;
+import org.uic.ticket.api.asn.omv2.IssuingData;
+import org.uic.ticket.api.asn.omv2.LineType;
+import org.uic.ticket.api.asn.omv2.LuggageRestrictionType;
+import org.uic.ticket.api.asn.omv2.OpenTicketData;
+import org.uic.ticket.api.asn.omv2.ParkingGroundData;
+import org.uic.ticket.api.asn.omv2.PassData;
+import org.uic.ticket.api.asn.omv2.PlacesType;
+import org.uic.ticket.api.asn.omv2.PolygoneType;
+import org.uic.ticket.api.asn.omv2.RegionalValidityType;
+import org.uic.ticket.api.asn.omv2.RegisteredLuggageType;
+import org.uic.ticket.api.asn.omv2.ReservationData;
+import org.uic.ticket.api.asn.omv2.ReturnRouteDescriptionType;
+import org.uic.ticket.api.asn.omv2.RouteSectionType;
+import org.uic.ticket.api.asn.omv2.SeriesDetailType;
+import org.uic.ticket.api.asn.omv2.StationPassageData;
+import org.uic.ticket.api.asn.omv2.TariffType;
+import org.uic.ticket.api.asn.omv2.TicketLinkType;
+import org.uic.ticket.api.asn.omv2.TimeRangeType;
+import org.uic.ticket.api.asn.omv2.TokenType;
+import org.uic.ticket.api.asn.omv2.TrainLinkType;
+import org.uic.ticket.api.asn.omv2.TravelerData;
+import org.uic.ticket.api.asn.omv2.TravelerType;
+import org.uic.ticket.api.asn.omv2.UicRailTicketData;
+import org.uic.ticket.api.asn.omv2.ValidityPeriodDetailType;
+import org.uic.ticket.api.asn.omv2.ValidityPeriodType;
+import org.uic.ticket.api.asn.omv2.VatDetailType;
+import org.uic.ticket.api.asn.omv2.ViaStationType;
+import org.uic.ticket.api.asn.omv2.VoucherData;
+import org.uic.ticket.api.asn.omv2.ZoneType;
+import org.uic.ticket.api.impl.SimpleUicTicketObjectFactory;
+import org.uic.ticket.api.spec.IBerth;
+import org.uic.ticket.api.spec.IBerthTypeType;
+import org.uic.ticket.api.spec.ICarCarriageReservation;
+import org.uic.ticket.api.spec.ICardReference;
+import org.uic.ticket.api.spec.ICompartmentDetails;
+import org.uic.ticket.api.spec.ICompartmentGenderType;
+import org.uic.ticket.api.spec.ICompartmentPositionType;
+import org.uic.ticket.api.spec.IControlDetail;
+import org.uic.ticket.api.spec.ICounterMark;
+import org.uic.ticket.api.spec.ICustomerCard;
+import org.uic.ticket.api.spec.ICustomerStatusDescription;
+import org.uic.ticket.api.spec.IDelayConfirmation;
+import org.uic.ticket.api.spec.IDocumentExtension;
+import org.uic.ticket.api.spec.IExtension;
+import org.uic.ticket.api.spec.IFipTicket;
+import org.uic.ticket.api.spec.IGenderType;
+import org.uic.ticket.api.spec.IGeoCoordinate;
+import org.uic.ticket.api.spec.IGeoCoordinateSystemType;
+import org.uic.ticket.api.spec.IGeoUnitType;
+import org.uic.ticket.api.spec.IHemisphereLatitudeType;
+import org.uic.ticket.api.spec.IHemisphereLongitudeType;
+import org.uic.ticket.api.spec.IIncludedOpenTicket;
+import org.uic.ticket.api.spec.IIssuingDetail;
+import org.uic.ticket.api.spec.ILine;
+import org.uic.ticket.api.spec.ILinkMode;
+import org.uic.ticket.api.spec.ILoadingDeckType;
+import org.uic.ticket.api.spec.ILuggageRestriction;
+import org.uic.ticket.api.spec.IOpenTicket;
+import org.uic.ticket.api.spec.IParkingGround;
+import org.uic.ticket.api.spec.IPass;
+import org.uic.ticket.api.spec.IPassengerType;
+import org.uic.ticket.api.spec.IPlaces;
+import org.uic.ticket.api.spec.IPolygone;
+import org.uic.ticket.api.spec.IPriceTypeType;
+import org.uic.ticket.api.spec.IRegionalValidity;
+import org.uic.ticket.api.spec.IRegisteredLuggage;
+import org.uic.ticket.api.spec.IReservation;
+import org.uic.ticket.api.spec.IReturnRouteDescription;
+import org.uic.ticket.api.spec.IRoofRackType;
+import org.uic.ticket.api.spec.IRouteSection;
+import org.uic.ticket.api.spec.ISeriesDataDetails;
+import org.uic.ticket.api.spec.IServiceBrand;
+import org.uic.ticket.api.spec.IStationPassage;
+import org.uic.ticket.api.spec.ITariff;
+import org.uic.ticket.api.spec.ITicketLink;
+import org.uic.ticket.api.spec.ITicketType;
+import org.uic.ticket.api.spec.ITimeRange;
+import org.uic.ticket.api.spec.IToken;
+import org.uic.ticket.api.spec.ITrainLink;
+import org.uic.ticket.api.spec.ITravelClassType;
+import org.uic.ticket.api.spec.ITraveler;
+import org.uic.ticket.api.spec.ITravelerDetail;
+import org.uic.ticket.api.spec.IUicRailTicket;
+import org.uic.ticket.api.spec.IUicTicketObjectFactory;
+import org.uic.ticket.api.spec.IValidityDetails;
+import org.uic.ticket.api.spec.IValidityRange;
+import org.uic.ticket.api.spec.IVatDetail;
+import org.uic.ticket.api.spec.IViaStation;
+import org.uic.ticket.api.spec.IVoucher;
+import org.uic.ticket.api.spec.IZone;
+import org.uic.ticket.api.spec.IStationCodeTable;
+
+
+/**
+ * The Class OpenAsn2ApiDecoder.
+ */
+public class OpenAsn2ApiDecoderV2 {
+
+ IUicTicketObjectFactory factory = SimpleUicTicketObjectFactory.getInstance();
+
+ /**
+ * Decode from asn.1 unaligned PER encoded data.
+ *
+ * @param asnUicRailTicketData the asn uic rail ticket data
+ * @return the decoded uic rail ticket
+ * @throws IOException Signals that an I/O exception has occurred.
+ */
+ public IUicRailTicket decodeFromAsn (UicRailTicketData asnUicRailTicketData) throws IOException{
+
+ IUicRailTicket uicRailTicket = factory.createUicRailTicket();
+
+ populateFromAsn1Model(uicRailTicket, asnUicRailTicketData);
+
+ return uicRailTicket;
+
+ }
+
+ /**
+ * Decode from asn.1 unaligned PER encoded data.
+ *
+ * @param data byte array of the asn.1 encoded FCB data
+ * @return the decoded uic rail ticket
+ * @throws IOException Signals that an I/O exception has occurred.
+ */
+ public IUicRailTicket decodeFromAsn (byte[] data) throws IOException{
+
+ UicRailTicketData asnUicRailTicketData = UicRailTicketData.decode(data);
+
+ IUicRailTicket uicRailTicket = factory.createUicRailTicket();
+
+ populateFromAsn1Model(uicRailTicket, asnUicRailTicketData);
+
+ return uicRailTicket;
+
+ }
+
+
+
+
+
+
+
+ /**
+ * Populate from asn1 model.
+ *
+ * @param uicRailTicket the uic rail ticket
+ * @param asnUicRailTicketData the asn uic rail ticket data
+ */
+ protected void populateFromAsn1Model(IUicRailTicket uicRailTicket, UicRailTicketData asnUicRailTicketData) {
+
+ if (asnUicRailTicketData.getExtension()!= null && !asnUicRailTicketData.getExtension().isEmpty()) {
+ for (ExtensionData asnExtension : asnUicRailTicketData.getExtension()){
+ uicRailTicket.addExtension(convertExtension(asnExtension));
+ }
+ }
+
+ if (asnUicRailTicketData.getIssuingDetail() != null) {
+ populateIssuingDetail(asnUicRailTicketData.getIssuingDetail(), uicRailTicket.getIssuerDetails());
+ }
+
+ if (asnUicRailTicketData.getControlDetail() != null) {
+ populateControlDetails(asnUicRailTicketData.getControlDetail(),uicRailTicket.getControlDetails());
+ }
+
+ if (asnUicRailTicketData.getTravelerDetail() != null) {
+ populateTravelerDetails(asnUicRailTicketData.getTravelerDetail(),uicRailTicket.getTravelerDetails());
+ }
+
+ if (asnUicRailTicketData.getTransportDocument() != null && !asnUicRailTicketData.getTransportDocument().isEmpty()) {
+ populateTravelDocuments(asnUicRailTicketData.getTransportDocument(),uicRailTicket,uicRailTicket.getIssuerDetails().getIssuingDate() );
+ }
+
+
+ }
+
+
+
+
+
+
+ /**
+ * Populate travel documents.
+ *
+ * @param asnTransportDocuments the asn transport documents
+ * @param uicRailTicket the uic rail ticket
+ * @param issuingDate the issuing date
+ */
+ protected void populateTravelDocuments(List<DocumentData> asnTransportDocuments,IUicRailTicket uicRailTicket, Date issuingDate) {
+
+ for ( DocumentData asnDocument : asnTransportDocuments){
+
+ if (asnDocument.getTicket() == null) {
+ break;
+ }
+
+ if (asnDocument.getTicket().getExtension() != null) {
+ IDocumentExtension ticket = convertDocumentExtension(asnDocument.getTicket().getExtension());
+ if (asnDocument.getToken() != null) {
+ IToken token = convertToken(asnDocument.getToken());
+ ticket.setToken(token);
+ }
+ uicRailTicket.addDocumentExtension(ticket);
+ }
+
+ if (asnDocument.getTicket().getCarCarriageReservation() != null) {
+ ICarCarriageReservation ticket = convertCarCarriage(asnDocument.getTicket().getCarCarriageReservation(),issuingDate);
+ if (asnDocument.getToken() != null) {
+ IToken token = convertToken(asnDocument.getToken());
+ ticket.setToken(token);
+ }
+ uicRailTicket.addCarCarriageReservation(ticket);
+ }
+
+ if (asnDocument.getTicket().getCounterMark() != null) {
+ ICounterMark ticket = convertCountermark(asnDocument.getTicket().getCounterMark(),issuingDate);
+ if (asnDocument.getToken() != null) {
+ IToken token = convertToken(asnDocument.getToken());
+ ticket.setToken(token);
+ }
+ uicRailTicket.addCounterMark(ticket);
+ }
+
+ if (asnDocument.getTicket().getCustomerCard()!= null) {
+ ICustomerCard ticket = convertCustomerCard(asnDocument.getTicket().getCustomerCard(),issuingDate);
+ if (asnDocument.getToken() != null) {
+ IToken token = convertToken(asnDocument.getToken());
+ ticket.setToken(token);
+ }
+ uicRailTicket.addCustomerCard(ticket);
+ }
+
+ if (asnDocument.getTicket().getFipTicket()!= null) {
+ IFipTicket ticket = convertFipTicket(asnDocument.getTicket().getFipTicket(),issuingDate);
+ if (asnDocument.getToken() != null) {
+ IToken token = convertToken(asnDocument.getToken());
+ ticket.setToken(token);
+ }
+ uicRailTicket.addFipTicket(ticket);
+ }
+
+ if (asnDocument.getTicket().getOpenTicket()!= null) {
+ IOpenTicket ticket = convertOpenTicket(asnDocument.getTicket().getOpenTicket(),issuingDate);
+ if (asnDocument.getToken() != null) {
+ IToken token = convertToken(asnDocument.getToken());
+ ticket.setToken(token);
+ }
+ uicRailTicket.addOpenTicket(ticket);
+ }
+
+
+ if (asnDocument.getTicket().getParkingGround()!= null) {
+ IParkingGround ticket = convertParkingGround(asnDocument.getTicket().getParkingGround(),issuingDate);
+ if (asnDocument.getToken() != null) {
+ IToken token = convertToken(asnDocument.getToken());
+ ticket.setToken(token);
+ }
+ uicRailTicket.addParkingGround(ticket);
+ }
+
+ if (asnDocument.getTicket().getPass() != null) {
+ IPass ticket = convertPass(asnDocument.getTicket().getPass(),issuingDate);
+ if (asnDocument.getToken() != null) {
+ IToken token = convertToken(asnDocument.getToken());
+ ticket.setToken(token);
+ }
+ uicRailTicket.addPass(ticket);
+ }
+
+ if (asnDocument.getTicket().getStationPassage() != null) {
+ IStationPassage ticket = convertStationPassage(asnDocument.getTicket().getStationPassage(),issuingDate);
+ if (asnDocument.getToken() != null) {
+ IToken token = convertToken(asnDocument.getToken());
+ ticket.setToken(token);
+ }
+ uicRailTicket.addStationPassage(ticket);
+ }
+
+ if (asnDocument.getTicket().getReservation() != null) {
+ IReservation ticket = convertReservation(asnDocument.getTicket().getReservation(),issuingDate);
+ if (asnDocument.getToken() != null) {
+ IToken token = convertToken(asnDocument.getToken());
+ ticket.setToken(token);
+ }
+ uicRailTicket.addReservation(ticket);
+ }
+
+ if (asnDocument.getTicket().getVoucher()!= null) {
+ IVoucher ticket = convertVoucher(asnDocument.getTicket().getVoucher(),issuingDate);
+ if (asnDocument.getToken() != null) {
+ IToken token = convertToken(asnDocument.getToken());
+ ticket.setToken(token);
+ }
+ uicRailTicket.addVoucher(ticket);
+ }
+
+ if (asnDocument.getTicket().getDelayConfirmation()!= null) {
+ IDelayConfirmation ticket = convertDelayConfirmation(asnDocument.getTicket().getDelayConfirmation(),issuingDate);
+ if (asnDocument.getToken() != null) {
+ IToken token = convertToken(asnDocument.getToken());
+ ticket.setToken(token);
+ }
+ uicRailTicket.addDelayConfirmation(ticket);
+ }
+ }
+ }
+
+
+
+
+
+
+
+
+
+
+ private IToken convertToken(TokenType asnToken) {
+
+ if (asnToken == null) return null;
+
+ IToken token = factory.createToken();
+ token.setToken(asnToken.getToken());
+ token.setTokenProvider(UicEncoderUtils.mapToString(asnToken.getTokenProviderNum(), asnToken.getTokenProviderIA5()));
+ token.setTokenSpecification(asnToken.getTokenSpecification());
+ return token;
+ }
+
+
+
+ private IDelayConfirmation convertDelayConfirmation(DelayConfirmation asnDocument, Date issuingDate) {
+
+ IDelayConfirmation document = factory.createDelayConfirmation();
+ document.setReference(UicEncoderUtils.mapToString(asnDocument.getReferenceNum().longValue(),asnDocument.getReferenceIA5()));
+
+
+ document.setExtension(convertExtension(asnDocument.getExtension()));
+ document.setInfoText(asnDocument.getInfoText());
+
+ if (asnDocument.getStationCodeTable()!=null){
+ document.setStationCodeTable(IStationCodeTable.valueOf(asnDocument.getStationCodeTable().toString()));
+ }
+ document.setStation(UicEncoderUtils.mapToString(asnDocument.getStationNum(),asnDocument.getStationIA5()));
+
+ document.setStationName(asnDocument.getStationNameUTF8());
+
+ document.setArrivalDate(asnDocument.getPlannedArrivalDate());
+ document.setArrivalUTCoffset(asnDocument.getDepartureUTCOffset());
+
+ if (asnDocument.getConfirmationType() != null) {
+ document.setConfirmationType(asnDocument.getConfirmationType().ordinal());
+ }
+
+ if (asnDocument.getDelay() != null) {
+ document.setDelay(asnDocument.getDelay().intValue());
+ }
+
+ if (asnDocument.getTrainCancelled() != null) {
+ document.setTrainCancelled(asnDocument.getTrainCancelled());
+ } else {
+ document.setTrainCancelled(false);
+ }
+
+ if (asnDocument.getAffectedTickets() !=null && !asnDocument.getAffectedTickets().isEmpty()) {
+ for (TicketLinkType asnTicketLink : asnDocument.getAffectedTickets()) {
+ document.addLinkedTicket(convertTicketLink(asnTicketLink));
+ }
+ }
+
+ return document;
+ }
+
+
+
+
+
+
+ /**
+ * Convert reservation.
+ *
+ * @param asnDocument the asn document
+ * @param issuingDate the issuing date
+ * @return the i reservation
+ */
+ protected IReservation convertReservation(ReservationData asnDocument, Date issuingDate) {
+
+ IReservation document = factory.createReservation();
+ document.setReference(UicEncoderUtils.mapToString(asnDocument.getReferenceNum(),asnDocument.getReferenceIA5()));
+
+ document.setProductId(UicEncoderUtils.mapToString(asnDocument.getProductIdNum(),asnDocument.getProductIdIA5()));
+ document.setProductOwner(UicEncoderUtils.mapToString(asnDocument.getProductOwnerNum(),asnDocument.getProductOwnerIA5()));
+
+ document.setExtension(convertExtension(asnDocument.getExtension()));
+ document.setInfoText(asnDocument.getInfoText());
+
+ if (asnDocument.getStationCodeTable()!=null){
+ document.setStationCodeTable(IStationCodeTable.valueOf(asnDocument.getStationCodeTable().name()));
+ }
+ document.setFromStation(UicEncoderUtils.mapToString(asnDocument.getFromStationNum(),asnDocument.getFromStationIA5()));
+ document.setToStation(UicEncoderUtils.mapToString(asnDocument.getToStationNum(),asnDocument.getToStationIA5()));
+ document.setFromStationName(asnDocument.getFromStationNameUTF8());
+ document.setToStationName(asnDocument.getToStationNameUTF8());
+
+ document.setDepartureDate(asnDocument.getDepartureDate(issuingDate));
+ document.setArrivalDate(asnDocument.getArrivalDate(issuingDate));
+
+ document.setDepartureUTCoffset(asnDocument.getDepartureUTCOffset());
+ if (asnDocument.getArrivalUTCOffset() != null) {
+ document.setArrivalUTCoffset(asnDocument.getArrivalUTCOffset());
+ } else {
+ document.setArrivalUTCoffset(asnDocument.getDepartureUTCOffset());
+ }
+
+ if(asnDocument.getClassCode()!=null){
+ document.setClassCode(ITravelClassType.valueOf(asnDocument.getClassCode().name()));
+ }
+
+ document.setCompartmentDetails(convertCompartmentDetails(asnDocument.getCompartmentDetails()));
+
+ document.setLuggageRestriction(convertLuggageRestriction(asnDocument.getLuggage()));
+
+ if (asnDocument.getNumberOfOverbooked() != null) {
+ document.setNumberOfOverbooked(asnDocument.getNumberOfOverbooked().intValue());
+ }
+
+ if (asnDocument.getNumberOfSupplements() != null) {
+ document.setNumberOfSupplements(asnDocument.getNumberOfSupplements().intValue());
+ }
+
+ if (asnDocument.getPlaces()!=null) {
+ document.setPlaces(convertPlaces(asnDocument.getPlaces()));
+ }
+
+ if (asnDocument.getBicyclePlaces()!=null) {
+ document.setBicyclePlaces(convertPlaces(asnDocument.getBicyclePlaces()));
+ }
+
+ document.setPriceType(IPriceTypeType.valueOf(asnDocument.getPriceType().name()));
+
+ IServiceBrand serviceBrand = factory.createServiceBrand();
+
+ if (asnDocument.getServiceBrand()!=null){
+ serviceBrand.setServiceBrand(asnDocument.getServiceBrand().intValue());
+ }
+ serviceBrand.setServiceBrandAbbreviation(asnDocument.getServiceBrandAbrUTF8());
+ serviceBrand.setServiceBrandDescription(asnDocument.getServiceBrandNameUTF8());
+
+ document.setServiceBrand(serviceBrand);
+
+ if (asnDocument.getServiceLevel()!=null && asnDocument.getServiceLevel().length() != 0) {
+ document.setServiceLevel(asnDocument.getServiceLevel());
+ }
+
+ document.setTrain(UicEncoderUtils.mapToString(asnDocument.getTrainNum(), asnDocument.getTrainIA5()));
+
+ if (asnDocument.getTypeOfSupplement()!=null) {
+ document.setTypeOfSupplement(asnDocument.getTypeOfSupplement().intValue());
+ }
+
+ if (asnDocument.getBerth()!=null && !asnDocument.getBerth().isEmpty()){
+ for (BerthDetailData asnBerth : asnDocument.getBerth()){
+ document.addBerth(convertBerth(asnBerth));
+ }
+ }
+
+ if (asnDocument.getCarrierNum()!=null && !asnDocument.getCarrierNum().isEmpty()){
+ for(Long carrier :asnDocument.getCarrierNum()){
+ document.addCarrier(carrier.toString());
+ }
+ }
+ if (asnDocument.getCarrierIA5()!=null && !asnDocument.getCarrierIA5().isEmpty()){
+ for(String carrier :asnDocument.getCarrierIA5()){
+ document.addCarrier(carrier);
+ }
+ }
+
+ if (asnDocument.getTariff()!=null && !asnDocument.getTariff().isEmpty()){
+ for (TariffType asnTariff : asnDocument.getTariff()) {
+ document.addTariff(convertTariff(asnTariff));
+ }
+ }
+
+ document.setPrice(asnDocument.getPrice());
+
+ if (asnDocument.getVatDetails() != null && !asnDocument.getVatDetails().isEmpty()){
+ for (VatDetailType vat : asnDocument.getVatDetails()) {
+ document.addVatDetail(decodeVatDetail(vat));
+ }
+ }
+
+ return document;
+ }
+
+
+
+
+
+
+
+
+
+ /**
+ * Convert car carriage.
+ *
+ * @param asnDocument the asn document
+ * @param issuingDate the issuing date
+ * @return the i car carriage reservation
+ */
+ protected ICarCarriageReservation convertCarCarriage(CarCarriageReservationData asnDocument , Date issuingDate) {
+
+ ICarCarriageReservation document = factory.createCarCarriageReservation();
+ document.setReference(UicEncoderUtils.mapToString(asnDocument.getReferenceNum(),asnDocument.getReferenceIA5()));
+
+ document.setProductId(UicEncoderUtils.mapToString(asnDocument.getProductIdNum(),asnDocument.getProductIdIA5()));
+ document.setProductOwner(UicEncoderUtils.mapToString(asnDocument.getProductOwnerNum(),asnDocument.getProductOwnerIA5()));
+
+ document.setExtension(convertExtension(asnDocument.getExtension()));
+ document.setInfoText(asnDocument.getInfoText());
+
+ if (asnDocument.getStationCodeTable()!=null){
+ document.setStationCodeTable(IStationCodeTable.valueOf(asnDocument.getStationCodeTable().name()));
+ }
+ document.setFromStation(UicEncoderUtils.mapToString(asnDocument.getFromStationNum(),asnDocument.getFromStationIA5()));
+ document.setToStation(UicEncoderUtils.mapToString(asnDocument.getToStationNum(),asnDocument.getToStationIA5()));
+ document.setFromStationName(asnDocument.getFromStationNameUTF8());
+ document.setToStationName(asnDocument.getToStationNameUTF8());
+
+ document.setBeginLoading(asnDocument.getBeginLoadingDate(issuingDate));
+ document.setEndLoading(asnDocument.getEndLoadingDate(issuingDate));
+
+ document.setLoadingTimeUTCoffset(asnDocument.getLoadingUTCOffset());
+
+
+ if(asnDocument.getAttachedBicycles()!=null){
+ document.setAttachedBicycles(asnDocument.getAttachedBicycles().intValue());
+ }
+
+ if (asnDocument.getAttachedBoats()!=null) {
+ document.setAttachedBoats(asnDocument.getAttachedBoats().intValue());
+ }
+
+ if(asnDocument.getAttachedSurfboards()!=null) {
+ document.setAttachedSurfboards(asnDocument.getAttachedSurfboards().intValue());
+ }
+
+ if (asnDocument.getBoatCategory()!=null){
+ document.setBoatCategory(asnDocument.getBoatCategory().intValue());
+ }
+
+ if(asnDocument.getCarCategory()!=null){
+ document.setCarCategory(asnDocument.getCarCategory().intValue());
+ }
+
+ if (asnDocument.getLoadingDeck()!=null){
+ document.setLoadingDeck(ILoadingDeckType.valueOf(asnDocument.getLoadingDeck().name()));
+ }
+
+ if(asnDocument.getLoadingListEntry()!=null){
+ document.setLoadingListEntry(asnDocument.getLoadingListEntry().intValue());
+ }
+
+ if (asnDocument.getRoofRackHeight()!=null){
+ document.setRoofRackHeight(asnDocument.getRoofRackHeight().intValue());
+ }
+
+ document.setNumberPlate(asnDocument.getNumberPlate());
+ document.setTrailerPlate(asnDocument.getTrailerPlate());
+
+ if(asnDocument.getRoofRackType()!=null){
+ document.setRoofRackType(IRoofRackType.valueOf(asnDocument.getRoofRackType().name()));
+ }
+
+ if(asnDocument.getTextileRoof()) {
+ document.setTextileRoof(asnDocument.getTextileRoof());
+ }
+
+
+ document.setCompartmentDetails(convertCompartmentDetails(asnDocument.getCompartmentDetails()));
+
+ if (asnDocument.getCarrierNum()!=null && !asnDocument.getCarrierNum().isEmpty()){
+ for(Long carrier :asnDocument.getCarrierNum()){
+ document.addCarrier(carrier.toString());
+ }
+ }
+ if (asnDocument.getCarrierIA5()!=null && !asnDocument.getCarrierIA5().isEmpty()){
+ for(String carrier :asnDocument.getCarrierIA5()){
+ document.addCarrier(carrier);
+ }
+ }
+
+ if (asnDocument.getCoach()!=null) {
+ document.setCoach(asnDocument.getCoach());
+ }
+ if (asnDocument.getPlace()!=null) {
+ document.setPlace(asnDocument.getPlace());
+ }
+
+
+ document.setPriceType(IPriceTypeType.valueOf(asnDocument.getPriceType().name()));
+
+ IServiceBrand serviceBrand = factory.createServiceBrand();
+
+ if (asnDocument.getServiceBrand()!=null){
+ serviceBrand.setServiceBrand(asnDocument.getServiceBrand().intValue());
+ }
+ serviceBrand.setServiceBrandAbbreviation(asnDocument.getServiceBrandAbrUTF8());
+ serviceBrand.setServiceBrandDescription(asnDocument.getServiceBrandNameUTF8());
+
+ document.setServiceBrand(serviceBrand);
+
+ document.setTrain(UicEncoderUtils.mapToString(asnDocument.getTrainNum(), asnDocument.getTrainIA5()));
+
+
+ if (asnDocument.getTariff()!=null){
+ document.setTariff(convertTariff(asnDocument.getTariff()));
+ }
+
+ document.setPrice(asnDocument.getPrice());
+
+ if (asnDocument.getVatDetails() != null && !asnDocument.getVatDetails().isEmpty()){
+ for (VatDetailType vat : asnDocument.getVatDetails()) {
+ document.addVatDetail(decodeVatDetail(vat));
+ }
+ }
+
+ return null;
+ }
+
+
+ private IVatDetail decodeVatDetail(VatDetailType asnVat) {
+
+ IVatDetail vat = factory.createVatDetail();
+
+ vat.setAmount(asnVat.getAmount());
+ if (asnVat.getPercentage() != null){
+ vat.setPercentage(asnVat.getPercentage().intValue());
+ }
+ if (asnVat.getCountry() != null) {
+ vat.setCountry(asnVat.getCountry().intValue());
+ }
+ vat.setVatId(asnVat.getVatId());
+ return vat;
+ }
+
+
+
+
+
+
+
+ /**
+ * Convert compartment details.
+ *
+ * @param asnDetails the asn details
+ * @return the i compartment details
+ */
+ protected ICompartmentDetails convertCompartmentDetails(CompartmentDetailsType asnDetails) {
+
+ if (asnDetails == null) return null;
+
+ ICompartmentDetails details = factory.createCompartmentDetails();
+
+ if (asnDetails.getCompartmentType()!=null) {
+ details.setCompartmentType(asnDetails.getCompartmentType().intValue());
+ }
+
+ if (asnDetails.getCoachType()!=null){
+ details.setCoachType(asnDetails.getCoachType().intValue());
+ }
+
+ if (asnDetails.getSpecialAllocation()!=null) {
+ details.setSpecialAllocation(asnDetails.getSpecialAllocation().intValue());
+ }
+
+ details.setCoachTypeDescr(asnDetails.getCoachTypeDescr());
+ details.setCompartmentTypeDescr(asnDetails.getCompartmentTypeDescr());
+ details.setSpecialAllocationDescr(asnDetails.getSpecialAllocationDescr());
+
+ details.setPosition(ICompartmentPositionType.valueOf(asnDetails.getPosition().name()));
+
+ return details;
+ }
+
+ /**
+ * Convert places.
+ *
+ * @param asnPlaces the asn places
+ * @return the i places
+ */
+ protected IPlaces convertPlaces(PlacesType asnPlaces) {
+
+ if (asnPlaces == null) return null;
+
+ IPlaces places = factory.createPlaces();
+
+ places.setCoach(asnPlaces.getCoach());
+ places.setPlaceDescription(asnPlaces.getPlaceDescription());
+
+ if (asnPlaces.getPlaceNum()!=null && !asnPlaces.getPlaceNum().isEmpty()){
+ for (Long place: asnPlaces.getPlaceNum()){
+ places.addPlace(place.toString());
+ }
+ }
+
+ if (asnPlaces.getPlaceIA5()!=null && !asnPlaces.getPlaceIA5().isEmpty()){
+ for (String place: asnPlaces.getPlaceIA5()){
+ places.addPlace(place);
+ }
+ }
+
+ places.setPlaceString(asnPlaces.getPlaceString());
+
+ return places;
+ }
+
+ /**
+ * Convert berth.
+ *
+ * @param asnBerth the asn berth
+ * @return the i berth
+ */
+ protected IBerth convertBerth(BerthDetailData asnBerth) {
+
+ if (asnBerth == null) return null;
+
+ IBerth berth = factory.createBerth();
+ if (asnBerth.getGender()!= null) {
+ berth.setGender(ICompartmentGenderType.valueOf(asnBerth.getGender().name()));
+ }
+ if (asnBerth.getNumberOfBerths()!=null) {
+ berth.setNumberOfBerths(asnBerth.getNumberOfBerths().intValue());
+ }
+ if (asnBerth.getBerthType()!=null){
+ berth.setType(IBerthTypeType.valueOf(asnBerth.getBerthType().name()));
+ }
+
+ return berth;
+ }
+
+ /**
+ * Convert countermark.
+ *
+ * @param asnDocument the asn document
+ * @param issuingDate the issuing date
+ * @return the i counter mark
+ */
+ protected ICounterMark convertCountermark(CountermarkData asnDocument , Date issuingDate) {
+
+ ICounterMark document = factory.createCounterMark();
+
+ document.setProductId(UicEncoderUtils.mapToString(asnDocument.getProductIdNum(),asnDocument.getProductIdIA5()));
+ document.setProductOwner(UicEncoderUtils.mapToString(asnDocument.getProductOwnerNum(),asnDocument.getProductOwnerIA5()));
+
+ if(asnDocument.getClassCode()!=null){
+ document.setClassCode(ITravelClassType.valueOf(asnDocument.getClassCode().name()));
+ }
+
+ document.setValidFrom(asnDocument.getValidFromDate(issuingDate));
+ document.setValidUntil(asnDocument.getValidUntilDate(issuingDate));
+
+ document.setValidFromUTCoffset(asnDocument.getValidFromUTCOffset());
+ if (asnDocument.getValidUntilUTCOffset() != null) {
+ document.setValidUntilUTCoffset(asnDocument.getValidUntilUTCOffset());
+ } else {
+ document.setValidUntilUTCoffset(asnDocument.getValidFromUTCOffset());
+ }
+
+
+ document.setExtension(convertExtension(asnDocument.getExtension()));
+ document.setInfoText(asnDocument.getInfoText());
+
+ document.setReference(UicEncoderUtils.mapToString(asnDocument.getReferenceNum(),asnDocument.getReferenceIA5()));
+ document.setTicketReference(UicEncoderUtils.mapToString(asnDocument.getTicketReferenceNum(),asnDocument.getTicketReferenceIA5()));
+
+ document.setFromStation(UicEncoderUtils.mapToString(asnDocument.getFromStationNum(),asnDocument.getFromStationIA5()));
+ document.setToStation(UicEncoderUtils.mapToString(asnDocument.getToStationNum(),asnDocument.getToStationIA5()));
+
+ document.setFromStationName(asnDocument.getFromStationNameUTF8());
+ document.setToStationName(asnDocument.getToStationNameUTF8());
+ document.setValidRegionDesc(asnDocument.getValidRegionDesc());
+
+ if (asnDocument.getValidRegion()!= null && !asnDocument.getValidRegion().isEmpty()) {
+ for (RegionalValidityType validRegion :asnDocument.getValidRegion()){
+ document.addValidRegionList(convertValidRegion(validRegion, issuingDate));
+ }
+ }
+
+ document.setReturnDescription(convertReturnDescription(asnDocument.getReturnDescription(), issuingDate));
+
+
+ if(asnDocument.getReturnIncluded()!=null){
+ document.setReturnIncluded(asnDocument.getReturnIncluded());
+ } else {
+ document.setReturnIncluded(false);
+ }
+
+
+
+ document.setGroupName(asnDocument.getGroupName());
+
+ if (asnDocument.getNumberOfCountermark() != null) {
+ document.setNumberOfCountermark(asnDocument.getNumberOfCountermark().intValue());
+ }
+
+ if (asnDocument.getTotalOfCountermarks() != null) {
+ document.setTotalOfCountermarks(asnDocument.getTotalOfCountermarks().intValue());
+ }
+
+ return document;
+
+ }
+
+ /**
+ * Convert return description.
+ *
+ * @param asnReturnRoute the asn return route
+ * @param issuingDate the issuing date
+ * @return the i return route description
+ */
+ protected IReturnRouteDescription convertReturnDescription(ReturnRouteDescriptionType asnReturnRoute, Date issuingDate) {
+
+ if (asnReturnRoute == null) return null;
+
+ IReturnRouteDescription route = factory.createReturnRouteDescription();
+
+ route.setFromStation(UicEncoderUtils.mapToString(asnReturnRoute.getFromStationNum(),asnReturnRoute.getFromStationIA5()));
+ route.setToStation(UicEncoderUtils.mapToString(asnReturnRoute.getToStationNum(),asnReturnRoute.getToStationIA5()));
+
+ route.setFromStationName(asnReturnRoute.getFromStationNameUTF8());
+ route.setToStationName(asnReturnRoute.getToStationNameUTF8());
+ route.setValidRegionDesc(asnReturnRoute.getValidReturnRegionDesc());
+
+ if (asnReturnRoute.getValidReturnRegion()!= null && !asnReturnRoute.getValidReturnRegion().isEmpty()) {
+ for (RegionalValidityType validRegion :asnReturnRoute.getValidReturnRegion()){
+ route.addValidRegionList(convertValidRegion(validRegion, issuingDate));
+ }
+ }
+
+ return route;
+ }
+
+ /**
+ * Convert luggage restriction.
+ *
+ * @param asnLuggage the asn luggage
+ * @return the i luggage restriction
+ */
+ protected ILuggageRestriction convertLuggageRestriction(LuggageRestrictionType asnLuggage) {
+
+ if (asnLuggage == null) return null;
+
+ ILuggageRestriction luggage = factory.createLuggageRestriction();
+ if (asnLuggage.getMaxHandLuggagePieces()!=null){
+ luggage.setMaxHandLuggagePieces(asnLuggage.getMaxHandLuggagePieces().intValue());
+ }
+ if (asnLuggage.getMaxNonHandLuggagePieces()!=null){
+ luggage.setMaxNonHandLuggagePieces(asnLuggage.getMaxNonHandLuggagePieces().intValue());
+ }
+
+
+ if (asnLuggage.getRegisteredLuggage()!= null &&!asnLuggage.getRegisteredLuggage().isEmpty()){
+ for (RegisteredLuggageType rl: asnLuggage.getRegisteredLuggage()){
+ luggage.addRegisteredLuggage(convertRegisteredLuggage(rl));
+ }
+ }
+ return luggage;
+ }
+
+ /**
+ * Convert registered luggage.
+ *
+ * @param rl the rl
+ * @return the i registered luggage
+ */
+ protected IRegisteredLuggage convertRegisteredLuggage(RegisteredLuggageType rl) {
+
+ if (rl == null) return null;
+
+ IRegisteredLuggage luggage= factory.createRegisteredLuggage();
+ if (rl.getMaxSize()!=null){
+ if (rl.getMaxSize()!=null) {
+ luggage.setMaxSize(rl.getMaxSize().intValue());
+ }
+ }
+ if (rl.getMaxWeight()!=null){
+ if(rl.getMaxWeight()!=null){
+ luggage.setMaxWeight(rl.getMaxWeight().intValue());
+ }
+ }
+ luggage.setRegistrationId(rl.getRegistrationId());
+ return luggage;
+ }
+
+
+ /**
+ * Convert open ticket.
+ *
+ * @param asnDocument the asn document
+ * @param issuingDate the issuing date
+ * @return the i open ticket
+ */
+ protected IOpenTicket convertOpenTicket(OpenTicketData asnDocument , Date issuingDate) {
+
+ IOpenTicket document = factory.createOpenTicket();
+
+ if(asnDocument.getClassCode()!=null){
+ document.setClassCode(ITravelClassType.valueOf(asnDocument.getClassCode().name()));
+ }
+
+ document.setValidFrom(asnDocument.getValidFromDate(issuingDate));
+ document.setValidUntil(asnDocument.getValidUntilDate(issuingDate));
+
+ document.setValidFromUTCoffset(asnDocument.getValidFromUTCOffset());
+ if (asnDocument.getValidUntilUTCOffset() != null) {
+ document.setValidUntilUTCoffset(asnDocument.getValidUntilUTCOffset());
+ } else {
+ document.setValidUntilUTCoffset(asnDocument.getValidFromUTCOffset());
+ }
+
+
+ document.setExtension(convertExtension(asnDocument.getExtension()));
+ document.setInfoText(asnDocument.getInfoText());
+ document.setProductId(UicEncoderUtils.mapToString(asnDocument.getProductIdNum(),asnDocument.getProductIdIA5()));
+ document.setProductOwner(UicEncoderUtils.mapToString(asnDocument.getProductOwnerNum(),asnDocument.getProductOwnerIA5()));
+ document.setReference(UicEncoderUtils.mapToString(asnDocument.getReferenceNum(),asnDocument.getReferenceIA5()));
+
+ if (asnDocument.getExcludedServiceBrands()!=null && !asnDocument.getExcludedServiceBrands().isEmpty()){
+ for(Long number :asnDocument.getExcludedServiceBrands()){
+ document.addExcludedServiceBrand(number.intValue());
+ }
+ }
+
+ if (asnDocument.getCarriersNum()!=null && !asnDocument.getCarriersNum().isEmpty()){
+ for(Long carrier :asnDocument.getCarriersNum()){
+ document.addIncludedCarrier(carrier.toString());
+ }
+ }
+ if (asnDocument.getCarriersIA5()!=null && !asnDocument.getCarriersIA5().isEmpty()){
+ for(String carrier :asnDocument.getCarriersIA5()){
+ document.addIncludedCarrier(carrier);
+ }
+ }
+
+
+ if (asnDocument.getIncludedServiceBrands()!=null && !asnDocument.getIncludedServiceBrands().isEmpty()){
+ for(Long number :asnDocument.getIncludedServiceBrands()){
+ document.addIncludedServiceBrand(number.intValue());
+ }
+ }
+
+ if (asnDocument.getIncludedTransportTypes()!=null && !asnDocument.getIncludedTransportTypes().isEmpty()){
+ for(Long number :asnDocument.getIncludedTransportTypes()){
+ document.addInludedTransportType(number.intValue());
+ }
+ }
+
+ if (asnDocument.getExcludedTransportTypes()!=null && !asnDocument.getExcludedTransportTypes().isEmpty()){
+ for(Long number :asnDocument.getExcludedTransportTypes()){
+ document.addExcludedTransportType(number.intValue());
+ }
+ }
+
+
+
+ if (asnDocument.getTariffs()!=null && !asnDocument.getTariffs().isEmpty()){
+ for(TariffType asnTariff :asnDocument.getTariffs()){
+ document.addTariff(convertTariff(asnTariff));
+ }
+ }
+
+ if (asnDocument.getStationCodeTable()!=null){
+ document.setStationCodeTable(IStationCodeTable.valueOf(asnDocument.getStationCodeTable().name()));
+ }
+ document.setFromStation(UicEncoderUtils.mapToString(asnDocument.getFromStationNum(),asnDocument.getFromStationIA5()));
+ document.setToStation(UicEncoderUtils.mapToString(asnDocument.getToStationNum(),asnDocument.getToStationIA5()));
+ document.setFromStationName(asnDocument.getFromStationNameUTF8());
+ document.setToStationName(asnDocument.getToStationNameUTF8());
+ document.setValidRegionDesc(asnDocument.getValidRegionDesc());
+ if (asnDocument.getValidRegion()!= null && !asnDocument.getValidRegion().isEmpty()) {
+ for (RegionalValidityType validRegion :asnDocument.getValidRegion()){
+ document.addValidRegionList(convertValidRegion(validRegion, issuingDate));
+ }
+ }
+
+ if (asnDocument.getIssuerAutorizationId() != null) {
+ document.setAuthorizationCode(asnDocument.getIssuerAutorizationId().intValue());
+ }
+
+ if (asnDocument.getExtIssuerId() != null) {
+ document.setExternalIssuer(asnDocument.getExtIssuerId().intValue());
+ }
+
+ document.setLuggageRestriction(convertLuggageRestriction(asnDocument.getLuggage()));
+
+ document.setReturnDescription(convertReturnDescription(asnDocument.getReturnDescription(), issuingDate));
+ if(asnDocument.getReturnIncluded()!=null){
+ document.setReturnIncluded(asnDocument.getReturnIncluded());
+ }
+
+ if (asnDocument.getActivatedDay()!=null && !asnDocument.getActivatedDay().isEmpty()) {
+ document.getActivatedDays().addAll(asnDocument.getActivatedDays(issuingDate));
+ }
+
+ if (asnDocument.getIncludedAddOns()!= null && !asnDocument.getIncludedAddOns().isEmpty()) {
+
+ for (IncludedOpenTicketType asnAddOn :asnDocument.getIncludedAddOns()) {
+
+ IIncludedOpenTicket addOn = convertIncludedOpenTicket(asnAddOn, issuingDate, document.getClassCode());
+ if (addOn != null) {
+ document.addIncludedAddOn(addOn);
+ }
+ }
+
+
+
+ }
+
+ document.setPrice(asnDocument.getPrice());
+
+ if (asnDocument.getVatDetails() != null && !asnDocument.getVatDetails().isEmpty()){
+ for (VatDetailType vat : asnDocument.getVatDetails()) {
+ document.addVatDetail(decodeVatDetail(vat));
+ }
+ }
+
+ return document;
+
+ }
+
+
+
+ /**
+ * Convert included open ticket.
+ *
+ * @param asnDocument the asn document
+ * @param issuingDate the issuing date
+ * @param classCode the class code
+ * @return the simple included open ticket
+ */
+ private IIncludedOpenTicket convertIncludedOpenTicket( IncludedOpenTicketType asnDocument, Date issuingDate, ITravelClassType classCode) {
+
+ IIncludedOpenTicket document = factory.createIncludedOpenTicket();
+
+ if(asnDocument.getClassCode()!=null){
+ document.setClassCode(ITravelClassType.valueOf(asnDocument.getClassCode().name()));
+ } else {
+ document.setClassCode(classCode);
+ }
+
+ document.setValidFrom(asnDocument.getValidFromDate(issuingDate));
+ document.setValidUntil(asnDocument.getValidUntilDate(issuingDate));
+
+ document.setValidFromUTCoffset(asnDocument.getValidFromUTCOffset());
+ if (asnDocument.getValidUntilUTCOffset() != null) {
+ document.setValidUntilUTCoffset(asnDocument.getValidUntilUTCOffset());
+ } else {
+ document.setValidUntilUTCoffset(asnDocument.getValidFromUTCOffset());
+ }
+
+
+ document.setExtension(convertExtension(asnDocument.getExtension()));
+ document.setInfoText(asnDocument.getInfoText());
+ document.setProductId(UicEncoderUtils.mapToString(asnDocument.getProductIdNum(),asnDocument.getProductIdIA5()));
+ document.setProductOwner(UicEncoderUtils.mapToString(asnDocument.getProductOwnerNum(),asnDocument.getProductOwnerIA5()));
+
+ if (asnDocument.getExcludedServiceBrands()!=null && !asnDocument.getExcludedServiceBrands().isEmpty()){
+ for(Long number :asnDocument.getExcludedServiceBrands()){
+ document.addExcludedServiceBrand(number.intValue());
+ }
+ }
+ if (asnDocument.getIncludedCarriersNum()!=null && !asnDocument.getIncludedCarriersNum().isEmpty()){
+ for(Long carrier :asnDocument.getIncludedCarriersNum()){
+ document.addIncludedCarrier(carrier.toString());
+ }
+ }
+ if (asnDocument.getIncludedCarriersIA5()!=null && !asnDocument.getIncludedCarriersIA5().isEmpty()){
+ for(String carrier :asnDocument.getIncludedCarriersIA5()){
+ document.addIncludedCarrier(carrier);
+ }
+ }
+
+ if (asnDocument.getIncludedServiceBrands()!=null && !asnDocument.getIncludedServiceBrands().isEmpty()){
+ for(Long number :asnDocument.getIncludedServiceBrands()){
+ document.addIncludedServiceBrand(number.intValue());
+ }
+ }
+
+ if (asnDocument.getIncludedTransportTypes()!=null && !asnDocument.getIncludedTransportTypes().isEmpty()){
+ for(Long number :asnDocument.getIncludedTransportTypes()){
+ document.addInludedTransportType(number.intValue());
+ }
+ }
+
+ if (asnDocument.getExcludedTransportTypes()!=null && !asnDocument.getExcludedTransportTypes().isEmpty()){
+ for(Long number :asnDocument.getExcludedTransportTypes()){
+ document.addExcludedTransportType(number.intValue());
+ }
+ }
+
+ if (asnDocument.getTariffs()!=null && !asnDocument.getTariffs().isEmpty()){
+ for(TariffType asnTariff :asnDocument.getTariffs()){
+ document.addTariff(convertTariff(asnTariff));
+ }
+ }
+
+ if (asnDocument.getStationCodeTable()!=null){
+ document.setStationCodeTable(IStationCodeTable.valueOf(asnDocument.getStationCodeTable().name()));
+ }
+
+ if (asnDocument.getValidRegion()!= null && !asnDocument.getValidRegion().isEmpty()) {
+ for (RegionalValidityType validRegion :asnDocument.getValidRegion()){
+ document.addValidRegionList(convertValidRegion(validRegion, issuingDate));
+ }
+ }
+
+ if (asnDocument.getIssuerAutorizationId()!=null){
+ document.setAuthorizationCode(asnDocument.getIssuerAutorizationId().intValue());
+ }
+ if (asnDocument.getExternalIssuerId()!=null){
+ document.setExternalIssuer(asnDocument.getExternalIssuerId().intValue());
+ }
+ return document;
+ }
+
+
+
+
+
+
+
+ /**
+ * Convert station passage.
+ *
+ * @param asnDocument the asn document
+ * @param issuingDate the issuing date
+ * @return the i station passage
+ */
+ protected IStationPassage convertStationPassage(StationPassageData asnDocument , Date issuingDate) {
+
+ IStationPassage document = factory.createStationPassage();
+
+ document.setValidFrom(asnDocument.getValidFromDate(issuingDate));
+ document.setValidUntil(asnDocument.getValidUntilDate(issuingDate));
+
+ document.setValidFromUTCoffset(asnDocument.getValidFromUTCOffset());
+ if (asnDocument.getValidUntilUTCOffset() != null) {
+ document.setValidUntilUTCoffset(asnDocument.getValidUntilUTCOffset());
+ } else {
+ document.setValidUntilUTCoffset(asnDocument.getValidFromUTCOffset());
+ }
+
+ document.setReference(UicEncoderUtils.mapToString(asnDocument.getReferenceNum(),asnDocument.getReferenceIA5()));
+
+ if (asnDocument.getNumberOfDaysValid()!=null) {
+ document.setNumberOfdaysAllowed(asnDocument.getNumberOfDaysValid().intValue());
+ }
+
+ if (asnDocument.getStationNum()!=null && !asnDocument.getStationNum().isEmpty()){
+ for (Long station : asnDocument.getStationNum()) {
+ if (station != null) {
+ document.addStation(station.toString());
+ }
+ }
+ }
+ if (asnDocument.getStationIA5()!=null && !asnDocument.getStationIA5().isEmpty()){
+ for (String station : asnDocument.getStationIA5()) {
+ document.addStation(station);
+ }
+ }
+
+ document.setProductId(UicEncoderUtils.mapToString(asnDocument.getProductIdNum(),asnDocument.getProductIdIA5()));
+ document.setProductOwner(UicEncoderUtils.mapToString(asnDocument.getProductOwnerNum(),asnDocument.getProductOwnerIA5()));
+
+ document.setProductName(asnDocument.getProductName());
+ document.setProductOwner(UicEncoderUtils.mapToString(asnDocument.getProductOwnerNum(),asnDocument.getProductOwnerIA5()));
+
+ if (asnDocument.getStationNameUTF8()!= null && asnDocument.getStationNameUTF8().isEmpty() ) {
+ for (String name : asnDocument.getStationNameUTF8()) {
+ document.addStation(name);
+ }
+ }
+
+ if (asnDocument.getStationCodeTable()!=null){
+ document.setStationCodeTable(IStationCodeTable.valueOf(asnDocument.getStationCodeTable().name()));
+ }
+
+ document.setExtension(convertExtension(asnDocument.getExtension()));
+
+ if (asnDocument.getAreaCodeIA5() != null && !asnDocument.getAreaCodeIA5().isEmpty()) {
+ for (String code : asnDocument.getAreaCodeIA5()) {
+ document.addAreaCode(code);
+ }
+ }
+ if (asnDocument.getAreaCodeNum() != null && !asnDocument.getAreaCodeNum().isEmpty()) {
+ for (Long code : asnDocument.getAreaCodeNum()) {
+ if (code != null) {
+ document.addAreaCode(code.toString());
+ }
+ }
+ }
+
+ if (asnDocument.getAreaNameUTF8() != null && !asnDocument.getAreaNameUTF8().isEmpty()) {
+ for (String code : asnDocument.getAreaNameUTF8()) {
+ document.addAreaName(code);
+ }
+ }
+
+
+
+ return document;
+ }
+
+
+ /**
+ * Convert valid region.
+ *
+ * @param asnRegion the asn region
+ * @param issuingDate the issuing date
+ * @return the i regional validity
+ */
+ protected IRegionalValidity convertValidRegion(RegionalValidityType asnRegion, Date issuingDate) {
+
+ if (asnRegion == null) return null;
+
+ if (asnRegion.getLines()!=null){
+ return convertLine(asnRegion.getLines());
+ }
+ if (asnRegion.getPolygone()!=null){
+ return convertPolygone(asnRegion.getPolygone());
+ }
+ if (asnRegion.getTrainLink()!=null){
+ return convertTrainLink(asnRegion.getTrainLink(),issuingDate);
+ }
+ if (asnRegion.getViaStations()!=null){
+ return convertViaStation(asnRegion.getViaStations());
+ }
+ if (asnRegion.getZones()!=null){
+ return convertZone(asnRegion.getZones());
+ }
+ return null;
+ }
+
+
+ /**
+ * Convert parking ground.
+ *
+ * @param asnDocument the asn document
+ * @param issuingDate the issuing date
+ * @return the i parking ground
+ */
+ protected IParkingGround convertParkingGround(ParkingGroundData asnDocument , Date issuingDate) {
+
+ IParkingGround document = factory.createParkingGround();
+
+ document.setReference(UicEncoderUtils.mapToString(asnDocument.getReferenceNum(),asnDocument.getReferenceIA5()));
+
+ document.setProductId(UicEncoderUtils.mapToString(asnDocument.getProductIdNum(),asnDocument.getProductIdIA5()));
+ document.setProductOwner(UicEncoderUtils.mapToString(asnDocument.getProductOwnerNum(),asnDocument.getProductOwnerIA5()));
+
+
+ document.setAccessCode(asnDocument.getAccessCode());
+ document.setLocation(asnDocument.getLocation());
+
+ document.setExtension(convertExtension(asnDocument.getExtension()));
+
+ document.setNumberPlate(asnDocument.getNumberPlate());
+ document.setEntryTrack(asnDocument.getEntryTrack());
+
+
+ document.setFromParkingDate(asnDocument.getFromParkingDate(issuingDate));
+ document.setToParkingDate(asnDocument.getToParkingDate(issuingDate));
+
+ document.setParkingGroundId(asnDocument.getParkingGroundId());
+
+ document.setSpecialInformation(asnDocument.getSpecialInformation());
+
+ if (asnDocument.getStationCodeTable()!=null){
+ document.setStationCodeTable(IStationCodeTable.valueOf(asnDocument.getStationCodeTable().name()));
+ }
+
+ document.setStation(UicEncoderUtils.mapToString(asnDocument.getStationNum(),asnDocument.getStationIA5()));
+
+ document.setPrice(asnDocument.getPrice());
+
+ if (asnDocument.getVatDetails() != null && !asnDocument.getVatDetails().isEmpty()){
+ for (VatDetailType vat : asnDocument.getVatDetails()) {
+ document.addVatDetail(decodeVatDetail(vat));
+ }
+ }
+
+ return document;
+ }
+
+ /**
+ * Convert via station.
+ *
+ * @param asnDocument the asn via
+ * @return the i via station
+ */
+ protected IViaStation convertViaStation(ViaStationType asnDocument) {
+
+ if (asnDocument == null) return null;
+
+ IViaStation via = factory.createViaStation();
+
+ if (asnDocument.getBorder()!=null) {
+ via.setBorder(asnDocument.getBorder());
+ }
+
+ if (asnDocument.getRouteId() != null) {
+ via.setRouteId(asnDocument.getRouteId().intValue());
+ }
+
+ if (asnDocument.getStationCodeTable()!=null){
+ via.setStationCodeTable(IStationCodeTable.valueOf(asnDocument.getStationCodeTable().name()));
+ }
+
+ if (asnDocument.getStationNum() != null) {
+ via.setStation(asnDocument.getStationNum().toString());
+ } else if (asnDocument.getStationIA5() != null) {
+ via.setStation(asnDocument.getStationIA5());
+ }
+
+ if (asnDocument.getCarriersNum()!=null && !asnDocument.getCarriersNum().isEmpty()){
+ for(Long carrier :asnDocument.getCarriersNum()){
+ via.addCarrier(carrier.toString());
+ }
+ }
+ if (asnDocument.getCarriersIA5()!=null && !asnDocument.getCarriersIA5().isEmpty()){
+ for(String carrier :asnDocument.getCarriersIA5()){
+ via.addCarrier(carrier);
+ }
+ }
+
+ if (asnDocument.getRoute()!= null && !asnDocument.getRoute().isEmpty()) {
+ for ( ViaStationType routeVia: asnDocument.getRoute()) {
+ via.addRouteStation(convertViaStation(routeVia));
+ }
+ }
+ if (asnDocument.getAlternativeRoutes()!= null && !asnDocument.getAlternativeRoutes().isEmpty()) {
+ for ( ViaStationType routeVia: asnDocument.getAlternativeRoutes()) {
+ via.addRouteStation(convertViaStation(routeVia));
+ }
+ }
+
+
+ return via;
+ }
+
+ /**
+ * Convert train link.
+ *
+ * @param asnTrainLink the asn train link
+ * @param issuingDate the issuing date
+ * @return the i regional validity
+ */
+ protected IRegionalValidity convertTrainLink(TrainLinkType asnTrainLink, Date issuingDate) {
+
+ ITrainLink trainLink = factory.createTrainLink();
+
+ trainLink.setTrain(UicEncoderUtils.mapToString(asnTrainLink.getTrainNum(), asnTrainLink.getTrainIA5()));
+
+ trainLink.setFromStation(UicEncoderUtils.mapToString(asnTrainLink.getFromStationNum(),asnTrainLink.getFromStationIA5()));
+ trainLink.setToStation(UicEncoderUtils.mapToString(asnTrainLink.getToStationNum(),asnTrainLink.getToStationIA5()));
+ trainLink.setFromStationName(asnTrainLink.getFromStationName());
+ trainLink.setToStationName(asnTrainLink.getToStationName());
+
+ trainLink.setDepartureDateTime(asnTrainLink.getDepartureDate(issuingDate));
+
+ return trainLink;
+ }
+
+ /**
+ * Convert zone.
+ *
+ * @param asnDocument the asn zone
+ * @return the i regional validity
+ */
+ protected IRegionalValidity convertZone(ZoneType asnDocument) {
+
+ if (asnDocument == null) return null;
+
+ IZone zone = factory.createZone();
+
+ zone.setBinaryZoneId(asnDocument.getBinaryZoneId());
+ zone.setCarrier(UicEncoderUtils.mapToString(asnDocument.getCarrierNum(),asnDocument.getCarrierIA5()));
+
+ if (asnDocument.getCity() != null) {
+ zone.setCity(asnDocument.getCity().intValue());
+ }
+ if (asnDocument.getStationCodeTable()!=null){
+ zone.setStationCodeTable(IStationCodeTable.valueOf(asnDocument.getStationCodeTable().name()));
+ }
+ zone.setEntryStation(UicEncoderUtils.mapToString(asnDocument.getEntryStationNum(),asnDocument.getEntryStationIA5()));
+ zone.setTerminatingStation(UicEncoderUtils.mapToString(asnDocument.getTerminatingStationNum(),asnDocument.getTerminatingStationIA5()));
+
+ zone.setNUTScode(asnDocument.getNutsCode());
+
+ return zone;
+ }
+
+ /**
+ * Convert polygone.
+ *
+ * @param asnPolygone the asn polygone
+ * @return the i regional validity
+ */
+ protected IRegionalValidity convertPolygone(PolygoneType asnPolygone) {
+
+ if (asnPolygone == null) return null;
+
+ IPolygone polygone = factory.createPolygone();
+
+ IGeoCoordinate firstEdge = convertGeoCoordinate(asnPolygone.getFirstEdge());
+
+ if (firstEdge == null) return null;
+
+ if (asnPolygone.getEdges()!=null && !asnPolygone.getEdges().isEmpty()) {
+ for (DeltaCoordinates asnEdge :asnPolygone.getEdges()){
+
+ IGeoCoordinate edge = firstEdge.clone();
+ try {
+ edge.addLongitude(asnEdge.getLongitude().longValue());
+ edge.addLatitude(asnEdge.getLatitude().longValue());
+ } catch (Exception e) {
+
+ }
+ polygone.addEdge(edge);
+ }
+ }
+ return polygone;
+ }
+
+ /**
+ * Convert line.
+ *
+ * @param asnDocument the asn line
+ * @return the i regional validity
+ */
+ protected IRegionalValidity convertLine(LineType asnDocument) {
+
+ if (asnDocument == null) return null;
+
+ ILine line = factory.createLine();
+
+ line.setBinaryZoneId(asnDocument.getBinaryZoneId());
+ line.setCarrier(UicEncoderUtils.mapToString(asnDocument.getCarrierNum(),asnDocument.getCarrierIA5()));
+ if (asnDocument.getCity()!=null) {
+ line.setCity(asnDocument.getCity().intValue());
+ }
+ if (asnDocument.getStationCodeTable()!=null){
+ line.setStationCodeTable(IStationCodeTable.valueOf(asnDocument.getStationCodeTable().name()));
+ }
+ line.setEntryStation(UicEncoderUtils.mapToString(asnDocument.getEntryStationNum(),asnDocument.getEntryStationIA5()));
+ line.setTerminatingStation(UicEncoderUtils.mapToString(asnDocument.getTerminatingStationNum(),asnDocument.getTerminatingStationIA5()));
+ if (asnDocument.getLineId()!=null && !asnDocument.getLineId().isEmpty()){
+ for (Long lineId : asnDocument.getLineId()) {
+ line.addLineId(lineId.intValue());
+ }
+ }
+ return line;
+ }
+
+ /**
+ * Convert tariff.
+ *
+ * @param asnTariff the asn tariff
+ * @return the i tariff
+ */
+ protected ITariff convertTariff(TariffType asnTariff) {
+
+ if (asnTariff== null) return null;
+
+ ITariff tariff = factory.createTariff();
+
+ if (asnTariff.getAgeAbove() != null) {
+ tariff.setAgeAbove(asnTariff.getAgeAbove().intValue());
+ }
+
+ if (asnTariff.getAgeBelow() != null) {
+ tariff.setAgeBelow(asnTariff.getAgeBelow().intValue());
+ }
+
+ if(asnTariff.getNumberOfPassengers()!=null){
+ tariff.setNumberOfPassengers(asnTariff.getNumberOfPassengers().intValue());
+ }
+
+ if (asnTariff.getSeriesDataDetails() != null) {
+ tariff.setSeriesDataDetails(convertSeriesDataDetails(asnTariff.getSeriesDataDetails()));
+ }
+
+
+ if (asnTariff.getPassengerType()!=null) {
+ tariff.setPassengerType(IPassengerType.valueOf(asnTariff.getPassengerType().name()));
+ }
+
+
+ if(asnTariff.getRestrictedToCountryOfResidence()!=null){
+ tariff.setRestrictedToCountryOfResidence(asnTariff.getRestrictedToCountryOfResidence());
+ }
+ if (asnTariff.getRestrictedToRouteSection()!=null){
+ tariff.setRestrictedToRouteSection(convertRouteSection(asnTariff.getRestrictedToRouteSection()));
+ }
+
+
+ tariff.setTariffDescription(asnTariff.getTariffDesc());
+ tariff.setTariffId(UicEncoderUtils.mapToString(asnTariff.getTariffIdNum(),asnTariff.getTariffIdIA5()));
+
+ if (asnTariff.getTraverlerid()!= null && !asnTariff.getTraverlerid().isEmpty() ) {
+ for (Long number : asnTariff.getTraverlerid()){
+ tariff.addTravelerId(number.intValue());
+ }
+ }
+
+ if (asnTariff.getReductionCard()!=null && !asnTariff.getReductionCard().isEmpty()){
+ for(CardReferenceType card : asnTariff.getReductionCard()){
+ tariff.addReductionCard(convertCardReference(card));
+ }
+ }
+
+ return tariff;
+ }
+
+ private ISeriesDataDetails convertSeriesDataDetails(SeriesDetailType asnDetails) {
+
+ if (asnDetails == null) return null;
+
+ ISeriesDataDetails details = factory.createSeriesDataDetails();
+
+ if (asnDetails.getSeries() != null) {
+ details.setSeries(asnDetails.getSeries().intValue());
+ }
+
+ if (asnDetails.getSupplyingCarrier() != null) {
+ details.setSupplyingCarrier(asnDetails.getSupplyingCarrier().intValue());
+ }
+
+ if (asnDetails.getOfferIdentification() != null) {
+ details.setOfferIdentification(asnDetails.getOfferIdentification().intValue());
+ }
+
+ return details;
+ }
+
+
+
+
+
+
+
+ /**
+ * Convert route section.
+ *
+ * @param asnDocument the asn document
+ * @return the i route section
+ */
+ protected IRouteSection convertRouteSection(RouteSectionType asnDocument) {
+
+ if (asnDocument == null) return null;
+
+ IRouteSection document = factory.createRouteSection();
+ if (asnDocument.getStationCodeTable()!=null){
+ document.setStationCodeTable(IStationCodeTable.valueOf(asnDocument.getStationCodeTable().name()));
+ }
+ document.setFromStation(UicEncoderUtils.mapToString(asnDocument.getFromStationNum(),asnDocument.getFromStationIA5()));
+ document.setToStation(UicEncoderUtils.mapToString(asnDocument.getToStationNum(),asnDocument.getToStationIA5()));
+ document.setFromStationName(asnDocument.getFromStationNameUTF8());
+ document.setToStationName(asnDocument.getToStationNameUTF8());
+ return document;
+ }
+
+ /**
+ * Convert fip ticket.
+ *
+ * @param asnDocument the asn document
+ * @param issuingDate the issuing date
+ * @return the i fip ticket
+ */
+ protected IFipTicket convertFipTicket(FIPTicketData asnDocument , Date issuingDate) {
+
+ if (asnDocument == null) return null;
+
+ IFipTicket document = factory.createFipTicket();
+ if(asnDocument.getClassCode()!=null){
+ document.setClassCode(ITravelClassType.valueOf(asnDocument.getClassCode().name()));
+ }
+
+ document.setValidFrom(asnDocument.getValidFromDate(issuingDate));
+ document.setValidUntil(asnDocument.getValidUntilDate(issuingDate));
+
+
+
+ document.setProductId(UicEncoderUtils.mapToString(asnDocument.getProductIdNum(),asnDocument.getProductIdIA5()));
+ document.setProductOwner(UicEncoderUtils.mapToString(asnDocument.getProductOwnerNum(),asnDocument.getProductOwnerIA5()));
+ document.setReference(UicEncoderUtils.mapToString(asnDocument.getReferenceNum(),asnDocument.getReferenceIA5()));
+
+ if (asnDocument.getActivatedDay()!=null && !asnDocument.getActivatedDay().isEmpty()) {
+ document.getActivatedDays().addAll(asnDocument.getActivatedDays(issuingDate));
+ }
+
+ if(asnDocument.getIncludesSupplements()!=null) {
+ document.setIncludesSupplements(asnDocument.getIncludesSupplements());
+ }
+ if(asnDocument.getNumberOfTravelDays()!=null){
+ document.setNumberOfTravelDates(asnDocument.getNumberOfTravelDays().intValue());
+ }
+
+ document.setExtension(convertExtension(asnDocument.getExtension()));
+
+ return document;
+ }
+
+ /**
+ * Convert pass.
+ *
+ * @param asnDocument the asn document
+ * @param issuingDate the issuing date
+ * @return the i pass
+ */
+ protected IPass convertPass(PassData asnDocument, Date issuingDate) {
+
+ if (asnDocument == null) return null;
+
+ IPass document = factory.createPass();
+
+ if(asnDocument.getClassCode()!=null){
+ document.setClassCode(ITravelClassType.valueOf(asnDocument.getClassCode().name()));
+ }
+
+ document.setValidFrom(asnDocument.getValidFromDate(issuingDate));
+ document.setValidUntil(asnDocument.getValidUntilDate(issuingDate));
+
+ if (asnDocument.getActivatedDay()!=null && !asnDocument.getActivatedDay().isEmpty()) {
+ if (document.getValidFrom() != null) {
+ document.getActivatedDays().addAll(asnDocument.getActivatedDays(document.getValidFrom()));
+ } else {
+ document.getActivatedDays().addAll(asnDocument.getActivatedDays(issuingDate));
+ }
+ }
+
+ document.setExtension(convertExtension(asnDocument.getExtension()));
+ document.setInfoText(asnDocument.getInfoText());
+ document.setProductId(UicEncoderUtils.mapToString(asnDocument.getProductIdNum(),asnDocument.getProductIdIA5()));
+ document.setProductOwner(UicEncoderUtils.mapToString(asnDocument.getProductOwnerNum(),asnDocument.getProductOwnerIA5()));
+ document.setReference(UicEncoderUtils.mapToString(asnDocument.getReferenceNum(),asnDocument.getReferenceIA5()));
+
+ if (asnDocument.getNumberOfDaysOfTravel() != null) {
+ document.setNumberOfDaysOfTravel(asnDocument.getNumberOfDaysOfTravel().intValue());
+ }
+ if (asnDocument.getNumberOfPossibleTrips() != null) {
+ document.setNumberOfPossibleTrips(asnDocument.getNumberOfPossibleTrips().intValue());
+ }
+
+ document.setPassDescription(asnDocument.getPassDescription());
+ if(asnDocument.getPassType()!=null){
+ document.setPassType(asnDocument.getPassType().intValue());
+ }
+
+
+
+ if (asnDocument.getCountries()!=null && !asnDocument.getCountries().isEmpty()){
+ for(Long number :asnDocument.getCountries()){
+ document.addCountry(number.intValue());
+ }
+ }
+ if (asnDocument.getExcludedServiceBrands()!=null && !asnDocument.getExcludedServiceBrands().isEmpty()){
+ for(Long number :asnDocument.getExcludedServiceBrands()){
+ document.addExcludedServiceBrand(number.intValue());
+ }
+ }
+
+ if (asnDocument.getIncludedCarriersNum()!=null && !asnDocument.getIncludedCarriersNum().isEmpty()){
+ for(Long carrier :asnDocument.getIncludedCarriersNum()){
+ document.addIncludedCarrier(carrier.toString());
+ }
+ }
+ if (asnDocument.getIncludedCarriersIA5()!=null && !asnDocument.getIncludedCarriersIA5().isEmpty()){
+ for(String carrier :asnDocument.getIncludedCarriersIA5()){
+ document.addIncludedCarrier(carrier);
+ }
+ }
+
+ if (asnDocument.getExcludedCarriersNum()!=null && !asnDocument.getExcludedCarriersNum().isEmpty()){
+ for(Long carrier :asnDocument.getExcludedCarriersNum()){
+ document.addExcludedCarrier(carrier.toString());
+ }
+ }
+ if (asnDocument.getExcludedCarriersIA5()!=null && !asnDocument.getExcludedCarriersIA5().isEmpty()){
+ for(String carrier :asnDocument.getExcludedCarriersIA5()){
+ document.addExcludedCarrier(carrier);
+ }
+ }
+
+
+ if (asnDocument.getIncludedServiceBrands()!=null && !asnDocument.getIncludedServiceBrands().isEmpty()){
+ for(Long number :asnDocument.getIncludedServiceBrands()){
+ document.addIncludedServiceBrand(number.intValue());
+ }
+ }
+
+ if (asnDocument.getTariffs()!=null && !asnDocument.getTariffs().isEmpty()){
+ for(TariffType asnTariff :asnDocument.getTariffs()){
+ document.addTariff(convertTariff(asnTariff));
+ }
+ }
+
+ if (asnDocument.getValidRegion()!=null && !asnDocument.getValidRegion().isEmpty()){
+ for(RegionalValidityType asnRegion :asnDocument.getValidRegion()){
+ document.addValidRegion(convertValidRegion(asnRegion, issuingDate));
+ }
+ }
+
+
+ if (asnDocument.getValidityPeriodDetails() != null) {
+ document.setValidityDetails(convertValidityDetails(asnDocument.getValidityPeriodDetails(), issuingDate));
+ }
+
+ document.setPrice(asnDocument.getPrice());
+
+ if (asnDocument.getVatDetails() != null && !asnDocument.getVatDetails().isEmpty()){
+ for (VatDetailType vat : asnDocument.getVatDetails()) {
+ document.addVatDetail(decodeVatDetail(vat));
+ }
+ }
+
+
+ return document;
+ }
+
+ private IValidityDetails convertValidityDetails(ValidityPeriodDetailType asnDetails, Date issuingDate) {
+
+ if (asnDetails == null) return null;
+
+ IValidityDetails details = factory.createValidityDetails();
+
+ if (asnDetails.getExcludedTimeRange()!= null && !asnDetails.getExcludedTimeRange().isEmpty()) {
+
+ ITimeRange range = factory.createTimeRange();
+
+ for (TimeRangeType asnRange : asnDetails.getExcludedTimeRange() ) {
+
+ if (asnRange.getFromTime() != null) {
+ range.setFromTime(asnRange.getFromTime().intValue());
+ }
+ if (asnRange.getUntilTime() != null) {
+ range.setUntilTime(asnRange.getUntilTime().intValue());
+ }
+
+ details.addTimeRanges(range);
+ }
+
+
+
+ }
+
+ if (asnDetails.getValidityPeriod()!= null && !asnDetails.getValidityPeriod().isEmpty()) {
+
+ IValidityRange range = factory.createValidityRange();
+
+ for (ValidityPeriodType asnRange : asnDetails.getValidityPeriod() ) {
+
+ range.setFromDate(asnRange.getValidFromDate(issuingDate));
+ range.setUntilDate(asnRange.getValidUntilDate(issuingDate));
+
+ range.setValidFromUTCoffset(asnRange.getValidFromUTCOffset());
+ if (asnRange.getValidUntilUTCOffset() != null) {
+ range.setValidUntilUTCoffset(asnRange.getValidUntilUTCOffset());
+ } else {
+ range.setValidUntilUTCoffset(asnRange.getValidFromUTCOffset());
+ }
+
+ details.addValidityRanges(range);
+ }
+
+ }
+
+ return details;
+ }
+
+
+
+
+
+
+
+ /**
+ * Convert voucher.
+ *
+ * @param asnDocument the asn document
+ * @param issuingDate the issuing date
+ * @return the i voucher
+ */
+ protected IVoucher convertVoucher(VoucherData asnDocument , Date issuingDate) {
+
+ if (asnDocument == null) return null;
+
+ IVoucher document = factory.createVoucher();
+
+ document.setValidFrom(asnDocument.getValidFrom());
+
+ document.setValidUntil(asnDocument.getValidUntil());
+
+ document.setInfoText(asnDocument.getInfoText());
+ document.setProductId(UicEncoderUtils.mapToString(asnDocument.getProductIdNum(),asnDocument.getProductIdIA5()));
+ document.setProductOwner(UicEncoderUtils.mapToString(asnDocument.getProductOwnerNum(),asnDocument.getProductOwnerIA5()));
+ document.setReference(UicEncoderUtils.mapToString(asnDocument.getReferenceNum(),asnDocument.getReferenceIA5()));
+
+ if (asnDocument.getValue()!=null) {
+ document.setAmount(asnDocument.getValue().intValue());
+ }
+
+ if (asnDocument.getType()!= null) {
+ document.setType(asnDocument.getType().intValue());
+ }
+
+ document.setExtension(convertExtension(asnDocument.getExtension()));
+
+ return document;
+ }
+
+ /**
+ * Convert customer card.
+ *
+ * @param asnDocument the asn card
+ * @param issuingDate the issuing date
+ * @return the i customer card
+ */
+ protected ICustomerCard convertCustomerCard(CustomerCardData asnDocument, Date issuingDate ) {
+
+ if (asnDocument == null) return null;
+
+ ICustomerCard card = factory.createCustomerCard();
+
+ card.setCardId(UicEncoderUtils.mapToString(asnDocument.getCardIdNum(), asnDocument.getCardIdIA5()));
+ if (asnDocument.getCardType()!= null) {
+ card.setCardType(asnDocument.getCardType().intValue());
+ }
+ card.setCardTypeDescr(asnDocument.getCardTypeDescr());
+ if(asnDocument.getClassCode()!=null){
+ card.setClassCode(ITravelClassType.valueOf(asnDocument.getClassCode().name()));
+ }
+ if(asnDocument.getCustomer()!=null) {
+ card.setCustomer(convertTraveler(asnDocument.getCustomer()));
+ }
+ if (asnDocument.getCustomerStatus()!=null) {
+ card.setCustomerStatus(asnDocument.getCustomerStatus().intValue());
+ }
+
+ card.setCustomerStatusDescr(asnDocument.getCustomerStatusDescr());
+
+ card.setValidFrom(asnDocument.getValidFromDate());
+
+ card.setValidUntil(asnDocument.getValidUntilDate());
+
+
+ if (asnDocument.getIncludedServices() != null && !asnDocument.getIncludedServices().isEmpty()){
+ for (Long service: asnDocument.getIncludedServices()){
+ card.addIncludedService(new Integer(service.intValue()));
+ }
+ }
+ return card;
+ }
+
+
+ /**
+ * Convert document extension.
+ *
+ * @param extension the extension
+ * @return the i document extension
+ */
+ protected IDocumentExtension convertDocumentExtension(ExtensionData asnExtension) {
+
+ if (asnExtension == null) return null;
+
+ IDocumentExtension documentExtension = factory.createDocumentExtension();
+ documentExtension.setId(asnExtension.getExtensionId());
+ documentExtension.setBinarydata(asnExtension.getExtensionData());
+ return documentExtension;
+ }
+
+
+ /**
+ * Populate traveler details.
+ *
+ * @param asnTravelerDetails the asn traveler details
+ * @param travelerDetails the traveler details
+ */
+ protected void populateTravelerDetails(TravelerData asnTravelerDetails,ITravelerDetail travelerDetails) {
+
+ if (asnTravelerDetails == null) return;
+
+ travelerDetails.setGroupName(asnTravelerDetails.getGroupName());
+
+ travelerDetails.setPreferredLanguage(asnTravelerDetails.getPreferedLanguage());
+
+ if (asnTravelerDetails.getTraveler() != null && !asnTravelerDetails.getTraveler().isEmpty() ) {
+ for ( TravelerType asnTraveler : asnTravelerDetails.getTraveler() ){
+ travelerDetails.addTraveler(convertTraveler(asnTraveler));
+ }
+ }
+ }
+
+ /**
+ * Convert traveler.
+ *
+ * @param asnTraveler the asn traveler
+ * @return the i traveler
+ */
+ protected ITraveler convertTraveler(TravelerType asnTraveler) {
+
+ if (asnTraveler == null) return null;
+
+ ITraveler traveler = factory.createTraveler();
+
+ if (asnTraveler.getCountryOfResidence() != null){
+ traveler.setCountryOfResidence(asnTraveler.getCountryOfResidence().intValue());
+ }
+ if (asnTraveler.getCountryOfPassport() != null) {
+ traveler.setPassportCountry(asnTraveler.getCountryOfPassport().intValue());
+ }
+
+ if (asnTraveler.getCountryOfIdCard() != null) {
+ traveler.setIDCardCountry(asnTraveler.getCountryOfIdCard().intValue());
+ }
+
+
+ traveler.setCustomerId(UicEncoderUtils.mapToString(asnTraveler.getCustomerIdNum(),asnTraveler.getCustomerIdIA5()));
+
+ traveler.setDateOfBirth(asnTraveler.getDateOfBirth());
+
+ traveler.setFirstName(asnTraveler.getFirstName());
+ if (asnTraveler.getGender()!= null) {
+ traveler.setGender(IGenderType.valueOf(asnTraveler.getGender().name()));
+ }
+ traveler.setIdCard(asnTraveler.getIdCard());
+ traveler.setLastName(asnTraveler.getLastName());
+
+ if (asnTraveler.getPassengerType()!= null) {
+ traveler.setPassengerType(IPassengerType.valueOf(asnTraveler.getPassengerType().name()));
+ }
+ if (asnTraveler.getPassengerWithReducedMobility()!= null) {
+ traveler.setPassengerWithReducedMobility(asnTraveler.getPassengerWithReducedMobility());
+ }
+
+ traveler.setPassportId(asnTraveler.getPassportId());
+ traveler.setSecondName(asnTraveler.getSecondName());
+
+ if (asnTraveler.getTicketHolder() != null) {
+ traveler.setTicketHolder(asnTraveler.getTicketHolder());
+ }
+
+ if (asnTraveler.getStatus()!= null && !asnTraveler.getStatus().isEmpty()) {
+
+ for (CustomerStatusType asnStatus : asnTraveler.getStatus()){
+
+ traveler.addStatusDescription( mapToStatusDescription(asnStatus) );
+
+ }
+
+ }
+
+ traveler.setTitle(asnTraveler.getTitle());
+
+ return traveler;
+ }
+
+ /**
+ * Map to status description.
+ *
+ * @param asnStatus the asn status
+ * @return the i customer status description
+ */
+ private ICustomerStatusDescription mapToStatusDescription( CustomerStatusType asnStatus) {
+
+ if (asnStatus == null) return null;
+
+ ICustomerStatusDescription status = factory.createCustomerStatusDescription();
+
+ status.setDescription(asnStatus.getCustomerStatusDescr());
+
+ if (asnStatus.getCustomerStatus()!=null) {
+ status.setStatus(asnStatus.getCustomerStatus().intValue());
+ }
+
+ status.setStatusProvider(UicEncoderUtils.mapToString(asnStatus.getStatusProviderNum(), asnStatus.getStatusProviderIA5()));
+
+ return status;
+ }
+
+
+
+
+
+
+
+ /**
+ * Populate control details.
+ *
+ * @param asnControlDetails the asn control details
+ * @param controlDetails the control details
+ */
+ protected void populateControlDetails(ControlData asnControlDetails, IControlDetail controlDetails) {
+
+ if (asnControlDetails == null || controlDetails==null ) return;
+
+ if (asnControlDetails.getAgeCheckRequired()!= null) {
+ controlDetails.setAgeCheckRequired(asnControlDetails.getAgeCheckRequired());
+ }
+
+ controlDetails.setExtension(convertExtension(asnControlDetails.getExtension()));
+
+ if (asnControlDetails.getIdentificationByIdCard()!=null){
+ controlDetails.setIdentificationByIdCard(asnControlDetails.getIdentificationByIdCard());
+ }
+
+ if (asnControlDetails.getIdentificationByPassportId()!= null){
+ controlDetails.setIdentificationByPassportId(asnControlDetails.getIdentificationByPassportId());
+ }
+
+ if(asnControlDetails.getIdentificationItem()!=null){
+ controlDetails.setIdentificationItem(asnControlDetails.getIdentificationItem().intValue());
+ }
+
+ controlDetails.setInfoText(asnControlDetails.getInfoText());
+
+ if (asnControlDetails.getOnlineValidationRequired()!=null){
+ controlDetails.setOnlineValidationRequired(asnControlDetails.getOnlineValidationRequired());
+ }
+
+ if (asnControlDetails.getRandomDetailedValidationRequired()!= null){
+ controlDetails.setRandomDetailedValidationRequired(asnControlDetails.getRandomDetailedValidationRequired().intValue());
+ }
+
+ if (asnControlDetails.getReductionCardCheckRequired() != null){
+ controlDetails.setReductionCardCheckRequired(asnControlDetails.getReductionCardCheckRequired());
+ }
+
+ if(asnControlDetails.getIdentificationByCardReference()!=null && !asnControlDetails.getIdentificationByCardReference().isEmpty()) {
+ for (CardReferenceType asnCardReference : asnControlDetails.getIdentificationByCardReference()){
+ controlDetails.addIdentificationByCardReference(convertCardReference(asnCardReference));
+ }
+ }
+
+ if (asnControlDetails.getIncludedTickets()!=null && !asnControlDetails.getIncludedTickets().isEmpty()) {
+ for (TicketLinkType asnTicketLink : asnControlDetails.getIncludedTickets()) {
+ controlDetails.addLinkedTicket(convertTicketLink(asnTicketLink));
+ }
+ }
+
+
+ }
+
+
+
+
+
+ /**
+ * Populate issuing detail.
+ *
+ * @param asnIssuingDetail the asn issuing detail
+ * @param issuingDetail the issuing detail
+ */
+ protected void populateIssuingDetail(IssuingData asnIssuingDetail,IIssuingDetail issuingDetail){
+
+ if (asnIssuingDetail== null || issuingDetail == null) return;
+
+ if (asnIssuingDetail.getActivated() != null) {
+ issuingDetail.setActivated(asnIssuingDetail.getActivated());
+ }
+
+ if (asnIssuingDetail.getSpecimen() != null) {
+ issuingDetail.setSpecimen(asnIssuingDetail.getSpecimen());
+ } else {
+ issuingDetail.setSpecimen(false);
+ }
+
+
+ if (asnIssuingDetail.getSecurePaperTicket() != null) {
+ issuingDetail.setSecurePaperTicket(asnIssuingDetail.getSecurePaperTicket());
+ } else {
+ issuingDetail.setSecurePaperTicket(false);
+ }
+
+ issuingDetail.setExtension(convertExtension(asnIssuingDetail.getExtension()));
+
+ if (asnIssuingDetail.getIssuedOnLine()!= null) {
+ issuingDetail.setIssuedOnLine(asnIssuingDetail.getIssuedOnLine().intValue());
+ }
+
+ if (asnIssuingDetail.getIssuedOnTrainIA5()!= null) {
+ issuingDetail.setIssuedOnTrain(asnIssuingDetail.getIssuedOnTrainIA5());
+ }
+ if (asnIssuingDetail.getIssuedOnTrainNum()!= null) {
+ issuingDetail.setIssuedOnTrain(asnIssuingDetail.getIssuedOnTrainNum().toString());
+ }
+
+ if (asnIssuingDetail.getIssuerNum() != null || asnIssuingDetail.getIssuerIA5() != null) {
+ issuingDetail.setIssuer(UicEncoderUtils.mapToString(asnIssuingDetail.getIssuerNum(), asnIssuingDetail.getIssuerIA5()));
+ }
+
+ issuingDetail.setIssuerName(asnIssuingDetail.getIssuerName());
+
+ issuingDetail.setIssuerPNR(asnIssuingDetail.getIssuerPNR());
+
+ issuingDetail.setSecurityProvider(UicEncoderUtils.mapToString(asnIssuingDetail.getSecurityProviderNum(),asnIssuingDetail.getSecurityProviderIA5()));
+
+
+ issuingDetail.setIssuingDate(asnIssuingDetail.getIssuingDate());
+
+
+ if (asnIssuingDetail.getPointOfSale() != null) {
+ issuingDetail.setPointOfSale(convertGeoCoordinate(asnIssuingDetail.getPointOfSale()));
+ }
+
+ }
+
+
+
+ /**
+ * Convert geo coordinate.
+ *
+ * @param asnCoordinate the asn coordinate
+ * @return the i geo coordinate
+ */
+ protected IGeoCoordinate convertGeoCoordinate(GeoCoordinateType asnCoordinate) {
+
+ if (asnCoordinate == null) return null;
+
+ IGeoCoordinate coordinate = factory.createGeoCoordinate();
+
+ if (asnCoordinate.getCoordinateSystem() != null) {
+ coordinate.setSystem(IGeoCoordinateSystemType.valueOf(asnCoordinate.getCoordinateSystem().name()));
+ }
+
+ if (asnCoordinate.getAccuracy() != null) {
+ coordinate.setAccuracy(IGeoUnitType.valueOf(asnCoordinate.getAccuracy().name()));
+ }
+
+ if (asnCoordinate.getGeoUnit() != null) {
+ coordinate.setUnit(IGeoUnitType.valueOf(asnCoordinate.getGeoUnit().name()));
+ }
+
+ if (asnCoordinate.getHemisphereLatitude() != null) {
+ coordinate.setHemisphereLatitude(IHemisphereLatitudeType.valueOf(asnCoordinate.getHemisphereLatitude().name()));
+ }
+
+ if (asnCoordinate.getHemisphereLongitude() != null) {
+ coordinate.setHemisphereLongitude(IHemisphereLongitudeType.valueOf(asnCoordinate.getHemisphereLongitude().name()));
+ }
+
+ coordinate.setLongitude (asnCoordinate.getLongitude());
+ coordinate.setLatitude (asnCoordinate.getLatitude());
+
+
+ return coordinate;
+ }
+
+
+ /**
+ * Convert extension.
+ *
+ * @param asnExtension the asn extension
+ * @return the i extension
+ */
+ protected IExtension convertExtension(ExtensionData asnExtension) {
+ if (asnExtension == null) return null;
+ IExtension extension = factory.createExtension();
+ extension.setId(asnExtension.getExtensionId());
+ extension.setBinarydata(asnExtension.getExtensionData());
+ return extension;
+ }
+
+
+ /**
+ * Convert ticket link.
+ *
+ * @param asnTicketLink the asn ticket link
+ * @return the i ticket link
+ */
+ protected ITicketLink convertTicketLink(TicketLinkType asnTicketLink) {
+
+ if (asnTicketLink == null) return null;
+
+ ITicketLink ticketLink = factory.createTicketLink();
+ ticketLink.setIssuer(asnTicketLink.getIssuerName());
+ ticketLink.setIssuerPNR(asnTicketLink.getIssuerPNR());
+ ticketLink.setProductOwner(UicEncoderUtils.mapToString(asnTicketLink.getProductOwnerNum(),asnTicketLink.getProductOwnerIA5()));
+ ticketLink.setReference(UicEncoderUtils.mapToString(asnTicketLink.getReferenceNum(),asnTicketLink.getReferenceIA5()));
+ if(asnTicketLink.getTicketType()!=null) {
+ ticketLink.setTicketType(ITicketType.valueOf(asnTicketLink.getTicketType().name()));
+ }
+ if(asnTicketLink.getLinkMode()!=null) {
+ ticketLink.setLinkMode(ILinkMode.valueOf(asnTicketLink.getLinkMode().name()));
+ }
+ return ticketLink;
+ }
+
+ /**
+ * Convert card reference.
+ *
+ * @param asnCardReference the asn card reference
+ * @return the card reference
+ */
+ protected ICardReference convertCardReference(CardReferenceType asnCardReference) {
+
+ if (asnCardReference == null) return null;
+
+ ICardReference cardReference = factory.createCardReference();
+ cardReference.setCardId(UicEncoderUtils.mapToString(asnCardReference.getCardIdNum(),asnCardReference.getCardIdIA5()));
+ cardReference.setCardIssuer(UicEncoderUtils.mapToString(asnCardReference.getCardIssuerNum(),asnCardReference.getCardIssuerIA5()));
+ cardReference.setCardName(asnCardReference.getCardName());
+
+ if(asnCardReference.getCardType()!=null) {
+ cardReference.setCardType(asnCardReference.getCardType().intValue());
+ }
+
+
+ cardReference.setLeadingCardId(UicEncoderUtils.mapToString(asnCardReference.getLeadingCardIdNum(),asnCardReference.getLeadingCardIdIA5()));
+ cardReference.setTrailingCardId(UicEncoderUtils.mapToString(asnCardReference.getTrailingCardIdNum(),asnCardReference.getTrailingCardIdIA5()));
+
+ return cardReference;
+ }
+
+}