/* * */ package org.uic.barcode.dynamicContent.dfcb1; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; import org.uic.barcode.asn1.datatypes.Asn1Default; import org.uic.barcode.asn1.datatypes.Asn1Optional; import org.uic.barcode.asn1.datatypes.CharacterRestriction; import org.uic.barcode.asn1.datatypes.FieldOrder; import org.uic.barcode.asn1.datatypes.HasExtensionMarker; import org.uic.barcode.asn1.datatypes.IntRange; import org.uic.barcode.asn1.datatypes.RestrictedString; import org.uic.barcode.asn1.datatypes.Sequence; import org.uic.barcode.asn1.datatypesimpl.OctetString; import org.uic.barcode.asn1.uper.UperEncoder; import org.uic.barcode.dynamicFrame.DataType; /** * The Class UicDynamicContentData. * * The dynamic content for FDC1 * */ @Sequence @HasExtensionMarker public class UicDynamicContentData1 { //-- Moment of generation of the dynamic content, expressed in UTC : //-- * dynamicContentDay is the number of days from issuing date //-- (UicRailTicketData.issuingDetail.issuingYear and issuingDay) // -- The range 0..1070 allows a validity equal to that of the validFrom (700) plus // -- validUntil (370) elements of the different transport documents of UicRailTicketData. //-- * dynamicContentTime is the number of seconds of the day //-- (from 0 = 0:00:00 to 86399 = 23:59:59) //-- These two elements shall be either both present, either both absent /** The day. */ //dynamicContentDay INTEGER (0..1070) DEFAULT 0, @FieldOrder(order = 0) @Asn1Default(value="0") @IntRange(minValue=0, maxValue=1070) public Long day; /** The second of day. */ // dynamicContentTime INTEGER (0..86399) OPTIONAL, @FieldOrder(order = 1) @IntRange(minValue=0, maxValue=86399) public Long secondOfDay; //-- Coordinates of the place where the dynamic content has been generated // -- (same GeoCoordinateType type as in UicRailTicketData) /** The geo coordinate. */ //dynamicContentGeoCoordinate GeoCoordinateType OPTIONAL, @FieldOrder(order = 2) @Asn1Optional public GeoCoordinateType geoCoordinate; //-- Response from the mobile to any data received from the terminal. //-- The data received from the terminal may be a random number, or any other information. //-- The response may be the data itself, a hashing of this data, or any other response. // -- This response may be completed with other information: IMEI, mobile phone number... //-- The type used is ExtensionData, as it is fully adapted. // -- extensionId shall be set to: // -- * "=" if the data included in extensionData is exactly the one that was transmitted by the terminal, // -- * any other value (chosen by the issuer) in other cases. /** The challenge response. */ //dynamicContentResponseToChallenge ExtensionData OPTIONAL, @FieldOrder(order = 3) @Asn1Optional public ExtensionData challengeResponse; /** The extension. */ //-- proprietary data defined bilaterally @FieldOrder(order = 4) @Asn1Optional public ExtensionData extension; //dynamicContentExtension ExtensionData OPTIONAL, // challenge string asked by the TCO @FieldOrder(order = 5) @RestrictedString(CharacterRestriction.IA5String) @Asn1Optional public String challengeString; // hashed phone id @FieldOrder(order = 6) public OctetString phoneIdHash; // hashed e-passport-id @FieldOrder(order = 7) public OctetString passHash; //... /** * Gets the day. * * @return the day */ public Long getDay() { return day; } /** * Sets the day. * * @param day the new day */ public void setDay(Long day) { this.day = day; } /** * Gets the time. * * @return the time */ public Long getTime() { return secondOfDay; } /** * Sets the time. * * @param time the new time */ public void setTime(Long time) { this.secondOfDay = time; } /** * Gets the geo coordinate. * * @return the geo coordinate */ public GeoCoordinateType getGeoCoordinate() { return geoCoordinate; } /** * Sets the geo coordinate. * * @param geoCoordinate the new geo coordinate */ public void setGeoCoordinate(GeoCoordinateType geoCoordinate) { this.geoCoordinate = geoCoordinate; } /** * Gets the challenge response. * * @return the challenge response */ public ExtensionData getChallengeResponse() { return challengeResponse; } /** * Sets the challenge response. * * @param challengeResponse the new challenge response */ public void setChallengeResponse(ExtensionData challengeResponse) { this.challengeResponse = challengeResponse; } /** * Gets the extension. * * @return the extension */ public ExtensionData getExtension() { return extension; } /** * Sets the extension. * * @param extension the new extension */ public void setExtension(ExtensionData extension) { this.extension = extension; } /** * Gets the time. * * @param issuingDate the issuing date in UTC * @return the date and time of content creation in UTC */ public Date getTime(Date issuingDate) { Calendar cal = Calendar.getInstance(); cal.setTime(issuingDate); cal.setTimeZone(TimeZone.getTimeZone("UTC")); cal.set(Calendar.SECOND,0); cal.set(Calendar.HOUR,0); cal.set(Calendar.MINUTE,0); cal.add(Calendar.DATE, day.intValue()); cal.add(Calendar.SECOND, secondOfDay.intValue()); return cal.getTime(); } /** * Sets the date time. * * @param dateUTC the current date and time in UTC * @param issuingDateUTC the issuing date and time in UTC */ public void setDateTime(Date dateUTC, Date issuingDateUTC) { Calendar cal1 = Calendar.getInstance(); cal1.setTime(issuingDateUTC); Calendar cal2 = Calendar.getInstance(); cal2.setTime(dateUTC); int days1 = cal1.get(Calendar.DATE); int days2 = cal2.get(Calendar.DATE); day = new Long (days2 - days1); secondOfDay = (long) cal2.get(Calendar.SECOND); secondOfDay = secondOfDay + 60 * (long) cal2.get(Calendar.MINUTE); secondOfDay = secondOfDay + 60 * 60 * (long) cal2.get(Calendar.HOUR_OF_DAY); } public static String getFormat() { return "FDC1"; } public DataType getDataType() { DataType data = new DataType(); data.setFormat(UicDynamicContentData1.getFormat()); data.setByteData(UperEncoder.encode(this)); return data; } public String getChallengeString() { return challengeString; } public void setChallengeString(String challengeString) { this.challengeString = challengeString; } public OctetString getPhoneIdHash() { return phoneIdHash; } public void setPhoneIdHash(OctetString phoneIdHash) { this.phoneIdHash = phoneIdHash; } public OctetString getPassHash() { return passHash; } public void setPassHash(OctetString passHash) { this.passHash = passHash; } }