From fbbc6349283bc8958cad51534da9cb82c46210c9 Mon Sep 17 00:00:00 2001 From: CGantert345 <57003061+CGantert345@users.noreply.github.com> Date: Wed, 15 Dec 2021 16:37:37 +0100 Subject: api layer for dynamic content --- .../dynamicContent/api/DynamicContentCoder.java | 211 +++++++++++++++++++++ .../dynamicContent/api/IUicDynamicContent.java | 130 +++++++++++++ .../api/SimpleUicDynamicContent.java | 150 +++++++++++++++ .../barcode/test/AsnLevelDynamicContentTest.java | 112 +++++++++++ .../uic/barcode/test/DynamicContentCoderTest.java | 118 ++++++++++++ 5 files changed, 721 insertions(+) create mode 100644 src/main/java/org/uic/barcode/dynamicContent/api/DynamicContentCoder.java create mode 100644 src/main/java/org/uic/barcode/dynamicContent/api/IUicDynamicContent.java create mode 100644 src/main/java/org/uic/barcode/dynamicContent/api/SimpleUicDynamicContent.java create mode 100644 src/test/java/org/uic/barcode/test/AsnLevelDynamicContentTest.java create mode 100644 src/test/java/org/uic/barcode/test/DynamicContentCoderTest.java diff --git a/src/main/java/org/uic/barcode/dynamicContent/api/DynamicContentCoder.java b/src/main/java/org/uic/barcode/dynamicContent/api/DynamicContentCoder.java new file mode 100644 index 0000000..d8bf3b4 --- /dev/null +++ b/src/main/java/org/uic/barcode/dynamicContent/api/DynamicContentCoder.java @@ -0,0 +1,211 @@ +package org.uic.barcode.dynamicContent.api; + +import java.util.Date; +import java.util.List; + +import org.uic.barcode.dynamicContent.fdc1.GeoCoordinateType; +import org.uic.barcode.dynamicContent.fdc1.SequenceOfExtension; +import org.uic.barcode.dynamicContent.fdc1.TimeStamp; +import org.uic.barcode.dynamicContent.fdc1.UicDynamicContentDataFDC1; +import org.uic.barcode.ticket.EncodingFormatException; +import org.uic.barcode.asn1.uper.UperEncoder; +import org.uic.barcode.dynamicContent.fdc1.ExtensionData; +import org.uic.barcode.dynamicContent.fdc1.GeoCoordinateSystemType; +import org.uic.barcode.dynamicContent.fdc1.GeoUnitType; +import org.uic.barcode.dynamicContent.fdc1.HemisphereLatitudeType; +import org.uic.barcode.dynamicContent.fdc1.HemisphereLongitudeType; +import org.uic.barcode.ticket.api.impl.SimpleExtension; +import org.uic.barcode.ticket.api.impl.SimpleGeoCoordinate; +import org.uic.barcode.ticket.api.spec.IExtension; +import org.uic.barcode.ticket.api.spec.IGeoCoordinate; +import org.uic.barcode.ticket.api.spec.IGeoCoordinateSystemType; +import org.uic.barcode.ticket.api.spec.IGeoUnitType; +import org.uic.barcode.ticket.api.spec.IHemisphereLatitudeType; +import org.uic.barcode.ticket.api.spec.IHemisphereLongitudeType; +import org.uic.barcode.ticket.api.utils.UicEncoderUtils; + +public class DynamicContentCoder { + + public static byte[] encode(IUicDynamicContent content, String format) throws EncodingFormatException { + + if (format != null && !format.equals("FDC1")) { + throw new EncodingFormatException("Format of dynamic content not supported!"); + } + + UicDynamicContentDataFDC1 asn = new UicDynamicContentDataFDC1(); + + asn.setAppId(content.getAppId()); + + if (content.getChallengeString() != null && content.getChallengeString().length() > 0) { + asn.setChallengeString(content.getChallengeString()); + } + + asn.setDynamicContentExtension(getAsnExtension(content.getExtension())); + + asn.setGeoCoordinate(getAsnGeoCoordinate(content.getGeoCoordinate())); + + asn.setTimeStamp(getAsnTimeStamp(content.getTimeStamp())); + + asn.setExtensions(getAsnContentExtensions(asn, content.getDynamicContentResponseList())); + + return UperEncoder.encode(asn); + + } + + + + private static SequenceOfExtension getAsnContentExtensions(UicDynamicContentDataFDC1 asn, List dynamicContentResponseList) throws EncodingFormatException { + if (dynamicContentResponseList != null && !dynamicContentResponseList.isEmpty()){ + + SequenceOfExtension asnList = asn.getExtensions(); + if (asnList == null) asnList = new SequenceOfExtension(); + for (IExtension extension : dynamicContentResponseList){ + ExtensionData asnExtension = getAsnExtension(extension); + if (asnExtension!= null) { + asnList.add(asnExtension); + } + } + if (!asnList.isEmpty()){ + return asnList; + } + } + + return null; + } + + private static TimeStamp getAsnTimeStamp(Date date) { + + if (date == null) return null; + + TimeStamp asnTimeStamp = new TimeStamp(); + asnTimeStamp.setDateTime(date); + + return asnTimeStamp; + + } + + private static GeoCoordinateType getAsnGeoCoordinate(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; + } + + private static ExtensionData getAsnExtension(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; + } + + public static IUicDynamicContent decode(byte[] bytes) { + + UicDynamicContentDataFDC1 asn = UperEncoder.decode(bytes, UicDynamicContentDataFDC1.class); + + IUicDynamicContent content = new SimpleUicDynamicContent(); + + content.setAppId(asn.getAppId()); + + content.setChallengeString(asn.getChallengeString()); + + content.setExtension(getExtension(asn.getDynamicContentExtension())); + + if (asn.getExtensions() != null && !asn.getExtensions().isEmpty()) { + for (ExtensionData e : asn.getExtensions()) { + content.addDynamicContentResponse(getExtension(e)); + } + } + + content.setGeoCoordinate(getGeoCoordinate(asn.getGeoCoordinate())); + + content.setTimeStamp(asn.getTimeStamp().getTimeAsDate()); + + + return content; + + } + + private static IGeoCoordinate getGeoCoordinate(GeoCoordinateType asnCoordinate) { + + IGeoCoordinate g = new SimpleGeoCoordinate(); + + g.setLatitude(asnCoordinate.getLatitude()); + g.setLongitude(asnCoordinate.getLongitude()); + + if (asnCoordinate.getCoordinateSystem() != null) { + g.setSystem(IGeoCoordinateSystemType.valueOf(asnCoordinate.getCoordinateSystem().name())); + } + + if (asnCoordinate.getAccuracy() != null) { + g.setAccuracy(IGeoUnitType.valueOf(asnCoordinate.getAccuracy().name())); + } + + if (asnCoordinate.getGeoUnit() != null) { + g.setUnit(IGeoUnitType.valueOf(asnCoordinate.getGeoUnit().name())); + } + + if (asnCoordinate.getHemisphereLatitude() != null) { + g.setHemisphereLatitude(IHemisphereLatitudeType.valueOf(asnCoordinate.getHemisphereLatitude().name())); + } + + if (asnCoordinate.getHemisphereLongitude() != null) { + g.setHemisphereLongitude(IHemisphereLongitudeType.valueOf(asnCoordinate.getHemisphereLongitude().name())); + } + + + return g; + } + + + + private static IExtension getExtension(ExtensionData asnExtension) { + + if (asnExtension == null) return null; + + SimpleExtension e = new SimpleExtension(); + e.setBinarydata(asnExtension.getExtensionData()); + e.setId(asnExtension.getExtensionId()); + + return e; + } + + +} diff --git a/src/main/java/org/uic/barcode/dynamicContent/api/IUicDynamicContent.java b/src/main/java/org/uic/barcode/dynamicContent/api/IUicDynamicContent.java new file mode 100644 index 0000000..718d013 --- /dev/null +++ b/src/main/java/org/uic/barcode/dynamicContent/api/IUicDynamicContent.java @@ -0,0 +1,130 @@ +package org.uic.barcode.dynamicContent.api; + +import java.util.Date; +import java.util.List; + +import org.uic.barcode.ticket.api.spec.IExtension; +import org.uic.barcode.ticket.api.spec.IGeoCoordinate; + +// TODO: Auto-generated Javadoc +/** + * The Interface IUicDynamicContent. + */ +public interface IUicDynamicContent { + + /** + * Gets the app id. + * + * @return the app id + */ + public String getAppId(); + + /** + * Sets the app id. + * @param string + * + * @return the string + */ + public void setAppId(String string); + + /** + * Gets the time stamp. + * + * @return the time stamp + */ + public Date getTimeStamp(); + + /** + * Sets the time stamp. + * + * @param date the new time stamp + */ + public void setTimeStamp(Date date); + + /** + * Gets the geo coordinate. + * + * @return the geo coordinate + */ + public IGeoCoordinate getGeoCoordinate(); + + /** + * Sets the geo coordinate. + * + * @param geoCoordinate the new geo coordinate + */ + public void setGeoCoordinate(IGeoCoordinate geoCoordinate); + + + /** + * Gets the extension. + * + * @return the extension + */ + public IExtension getExtension(); + + /** + * Sets the extension. + * + * @param extension the new extension + */ + public void setExtension(IExtension extension); + + /** + * Gets the challenge string. + * + * @return the challenge string + */ + public String getChallengeString(); + + /** + * Sets the challenge string. + * + * @param challenge the new challenge string + */ + public void setChallengeString(String challenge); + + /** + * Gets the phone id hash. + * + * @return the phone id hash + */ + public byte[] getPhoneIdHash(); + + /** + * Sets the phone id hash. + * + * @param phoneIdHash the new phone id hash + */ + public void setPhoneIdHash(byte[] phoneIdHash); + + /** + * Gets the pass id hash. + * + * @return the pass id hash + */ + public byte[] getPassIdHash(); + + /** + * Sets the pass id hash. + * + * @param passIdHash the new pass id hash + */ + public void setPassIdHash(byte[] passIdHash); + + /** + * Gets the dynamic content response list. + * + * @return the dynamic content response list + */ + public List getDynamicContentResponseList(); + + /** + * Adds the dynamic content response. + * + * @param challenge the challenge + */ + public void addDynamicContentResponse(IExtension challenge); + + +} diff --git a/src/main/java/org/uic/barcode/dynamicContent/api/SimpleUicDynamicContent.java b/src/main/java/org/uic/barcode/dynamicContent/api/SimpleUicDynamicContent.java new file mode 100644 index 0000000..ca5880d --- /dev/null +++ b/src/main/java/org/uic/barcode/dynamicContent/api/SimpleUicDynamicContent.java @@ -0,0 +1,150 @@ +package org.uic.barcode.dynamicContent.api; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.uic.barcode.ticket.api.impl.SimpleExtension; +import org.uic.barcode.ticket.api.spec.IExtension; +import org.uic.barcode.ticket.api.spec.IGeoCoordinate; + +public class SimpleUicDynamicContent implements IUicDynamicContent { + + + protected String appId; + + protected Date timeStamp; + + protected String challenge; + + protected IGeoCoordinate geoCoordinate; + + protected IExtension dynamicContentExtension; + + protected List dynamicContentResponseList; + + + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + + public IGeoCoordinate getGeoCoordinate() { + return geoCoordinate; + } + + public void setGeoCoordinate(IGeoCoordinate geoCoordinate) { + this.geoCoordinate = geoCoordinate; + } + + public IExtension getDynamicContentExtension() { + return dynamicContentExtension; + } + + public void setDynamicContentExtension(IExtension dynamicContentExtension) { + this.dynamicContentExtension = dynamicContentExtension; + } + + + @Override + public Date getTimeStamp() { + return timeStamp; + } + + @Override + public void setTimeStamp(Date date) { + timeStamp = date; + + } + + @Override + public IExtension getExtension() { + return dynamicContentExtension; + } + + @Override + public void setExtension(IExtension extension) { + dynamicContentExtension = extension; + } + + @Override + public String getChallengeString() { + return challenge; + } + + @Override + public void setChallengeString(String challenge) { + this.challenge = challenge; + } + + @Override + public byte[] getPhoneIdHash() { + return getExtensionData("phone"); + } + + @Override + public void setPhoneIdHash(byte[] phoneIdHash) { + if (dynamicContentResponseList == null) { + dynamicContentResponseList = new ArrayList(); + } + + IExtension e = new SimpleExtension(); + e.setBinarydata(phoneIdHash); + e.setId("phone"); + getDynamicContentResponseList().add(e); + } + + @Override + public byte[] getPassIdHash() { + return getExtensionData("pass"); + } + + private byte[] getExtensionData(String name) { + if (dynamicContentResponseList == null) return null; + for (IExtension e : dynamicContentResponseList) { + if (e.getId().equals(name)){ + return e.getBinarydata(); + } + } + return null; + } + + @Override + public void setPassIdHash(byte[] passIdHash) { + if (dynamicContentResponseList == null) { + dynamicContentResponseList = new ArrayList(); + } + + IExtension e = new SimpleExtension(); + e.setBinarydata(passIdHash); + e.setId("pass"); + getDynamicContentResponseList().add(e); + } + + @Override + public List getDynamicContentResponseList() { + if (dynamicContentResponseList == null) { + dynamicContentResponseList = new ArrayList(); + } + + return dynamicContentResponseList; + } + + @Override + public void addDynamicContentResponse(IExtension challenge) { + + if (this.dynamicContentResponseList == null) { + this.dynamicContentResponseList = new ArrayList(); + } + + this.dynamicContentResponseList.add(challenge); + + } + + +} diff --git a/src/test/java/org/uic/barcode/test/AsnLevelDynamicContentTest.java b/src/test/java/org/uic/barcode/test/AsnLevelDynamicContentTest.java new file mode 100644 index 0000000..955066d --- /dev/null +++ b/src/test/java/org/uic/barcode/test/AsnLevelDynamicContentTest.java @@ -0,0 +1,112 @@ +package org.uic.barcode.test; + +import org.junit.Before; +import org.junit.Test; +import org.uic.barcode.asn1.uper.UperEncoder; +import org.uic.barcode.dynamicContent.fdc1.ExtensionData; +import org.uic.barcode.dynamicContent.fdc1.TimeStamp; +import org.uic.barcode.dynamicContent.fdc1.UicDynamicContentDataFDC1; +import org.uic.barcode.dynamicContent.fdc1.GeoCoordinateType; + +public class AsnLevelDynamicContentTest { + + UicDynamicContentDataFDC1 asn = null; + + @Before public void initialize() { + + + asn = new UicDynamicContentDataFDC1(); + + asn.setAppId("appID"); + + asn.setChallengeString("challenge string"); + + ExtensionData asnE1 = new ExtensionData(); + asnE1.setExtensionData(UperEncoder.bytesFromHexString("82DA")); + asnE1.setExtensionId("challenge_extension_id1"); + asn.setDynamicContentExtension(asnE1); + + + asn.getExtensions().add(asnE1); + + ExtensionData asnE2 = new ExtensionData(); + asnE2.setExtensionData(UperEncoder.bytesFromHexString("83DA")); + asnE2.setExtensionId("phone"); + asn.getExtensions().add(asnE2); + + ExtensionData asnE3 = new ExtensionData(); + asnE3.setExtensionData(UperEncoder.bytesFromHexString("84DA")); + asnE3.setExtensionId("pass"); + asn.getExtensions().add(asnE3); + + + + asn.setGeoCoordinate(new GeoCoordinateType()); + asn.getGeoCoordinate().setLongitude( 12345L); + asn.getGeoCoordinate().setLatitude( 56789L); + + TimeStamp t = new TimeStamp(); + t.setTime(100L); + t.setDay(20L); + asn.setTimeStamp(t); + + + + } + + @Test public void testDynamicContentEncoding() { + + byte[] encodedBytes = UperEncoder.encode(asn); + + String encoding = UperEncoder.hexStringFromBytes(encodedBytes); + + String expectedEncoding = "7C170F0E126204C00C800230390300DDD504017A20C6D0C2D8D8CADCCECA40E6E8E4D2DCCE2F8F461D9B32EECF96FE5F1D32EEE7A77EEBFA72310282DA05E1A37EECA0507B409C30F3E60509B42F8F461D9B32EECF96FE5F1D32EEE7A77EEBFA72310282DA"; + + assert(expectedEncoding.equals(encoding)); + + } + + @Test public void testDynamicContentDecoding() { + + String encoding = "7C170F0E126204C00C800230390300DDD504017A20C6D0C2D8D8CADCCECA40E6E8E4D2DCCE2F8F461D9B32EECF96FE5F1D32EEE7A77EEBFA72310282DA05E1A37EECA0507B409C30F3E60509B42F8F461D9B32EECF96FE5F1D32EEE7A77EEBFA72310282DA"; + + UicDynamicContentDataFDC1 asn = UperEncoder.decode(UperEncoder.bytesFromHexString(encoding), UicDynamicContentDataFDC1.class); + + + assert("appID".equals(asn.getAppId())); + + assert("challenge string".equals(asn.getChallengeString())); + + ExtensionData asnE1 = asn.getDynamicContentExtension(); + assert(UperEncoder.hexStringFromBytes(asnE1.getExtensionData()).equals("82DA")); + assert(asnE1.getExtensionId().equals("challenge_extension_id1")); + + + assert(asn.getExtensions().size() == 4); + + assert(UperEncoder.hexStringFromBytes(asn.getExtensions().get(0).getExtensionData()).equals("6368616C6C656E676520737472696E67")); + assert(asn.getExtensions().get(0).getExtensionId().equals("=")); + + assert(UperEncoder.hexStringFromBytes(asn.getExtensions().get(1).getExtensionData()).equals("82DA")); + assert(asn.getExtensions().get(1).getExtensionId().equals("challenge_extension_id1")); + + assert(UperEncoder.hexStringFromBytes(asn.getExtensions().get(2).getExtensionData()).equals("83DA")); + assert(asn.getExtensions().get(2).getExtensionId().equals("phone")); + + assert(UperEncoder.hexStringFromBytes(asn.getExtensions().get(3).getExtensionData()).equals("84DA")); + assert(asn.getExtensions().get(3).getExtensionId().equals("pass")); + + + assert(asn.getGeoCoordinate() != null); + assert(asn.getGeoCoordinate().getLongitude() == 12345L); + assert(asn.getGeoCoordinate().getLatitude() == 56789L); + + assert(asn.getTimeStamp() != null); + assert(asn.getTimeStamp().getDay() == 20L); + assert(asn.getTimeStamp().getTime() == 100L); + + } + + + +} diff --git a/src/test/java/org/uic/barcode/test/DynamicContentCoderTest.java b/src/test/java/org/uic/barcode/test/DynamicContentCoderTest.java new file mode 100644 index 0000000..10963c5 --- /dev/null +++ b/src/test/java/org/uic/barcode/test/DynamicContentCoderTest.java @@ -0,0 +1,118 @@ +package org.uic.barcode.test; + +import java.text.ParseException; +import java.text.SimpleDateFormat; + +import org.junit.Before; +import org.junit.Test; +import org.uic.barcode.asn1.uper.UperEncoder; +import org.uic.barcode.dynamicContent.api.DynamicContentCoder; +import org.uic.barcode.dynamicContent.api.IUicDynamicContent; +import org.uic.barcode.dynamicContent.api.SimpleUicDynamicContent; +import org.uic.barcode.ticket.EncodingFormatException; +import org.uic.barcode.ticket.api.impl.SimpleExtension; +import org.uic.barcode.ticket.api.impl.SimpleGeoCoordinate; +import org.uic.barcode.ticket.api.spec.IExtension; +import org.uic.barcode.ticket.api.spec.IGeoCoordinate; + +public class DynamicContentCoderTest { + + IUicDynamicContent content = null; + + @Before public void initialize() { + + content = new SimpleUicDynamicContent(); + + content.setAppId("appID"); + + content.setChallengeString("challenge string"); + + IExtension e = new SimpleExtension(); + e.setId("challenge_extension_id1"); + e.setBinarydata(UperEncoder.bytesFromHexString("82DA")); + content.setExtension(e); + + IExtension e1 = new SimpleExtension(); + e1.setId("challenge_extension_id1"); + e1.setBinarydata(UperEncoder.bytesFromHexString("82DA")); + content.addDynamicContentResponse(e1); + + content.setPhoneIdHash(UperEncoder.bytesFromHexString("83DA")); + + content.setPassIdHash(UperEncoder.bytesFromHexString("84DA")); + + IGeoCoordinate g = new SimpleGeoCoordinate(); + g.setLongitude( 12345L); + g.setLatitude( 56789L); + content.setGeoCoordinate(g); + + try { + content.setTimeStamp(new SimpleDateFormat( "yyyy.MM.dd-HH:mm" ).parse( "2021.03.04-12:30" )); + } catch (ParseException e2) { + // + } + + } + + @Test public void testDynamicContentEncoding() { + + + byte[] encodedBytes = null; + try { + encodedBytes = DynamicContentCoder.encode(content, null); + } catch (EncodingFormatException e) { + assert(false); + } + + String encoding = UperEncoder.hexStringFromBytes(encodedBytes); + + String expectedEncoding = "7C170F0E12620F9437000230390300DDD504017A20C6D0C2D8D8CADCCECA40E6E8E4D2DCCE2F8F461D9B32EECF96FE5F1D32EEE7A77EEBFA72310282DA05E1A37EECA0507B409C30F3E60509B42F8F461D9B32EECF96FE5F1D32EEE7A77EEBFA72310282DA"; + + assert(expectedEncoding.equals(encoding)); + + } + + @Test public void testDynamicContentDecoding() { + + String encoding = "7C170F0E12620F9437000230390300DDD504017A20C6D0C2D8D8CADCCECA40E6E8E4D2DCCE2F8F461D9B32EECF96FE5F1D32EEE7A77EEBFA72310282DA05E1A37EECA0507B409C30F3E60509B42F8F461D9B32EECF96FE5F1D32EEE7A77EEBFA72310282DA"; + + IUicDynamicContent content = DynamicContentCoder.decode(UperEncoder.bytesFromHexString(encoding)); + + + assert("appID".equals(content.getAppId())); + + assert("challenge string".equals(content.getChallengeString())); + + IExtension e1 = content.getExtension(); + assert(UperEncoder.hexStringFromBytes(e1.getBinarydata()).equals("82DA")); + assert(e1.getId().equals("challenge_extension_id1")); + + + assert(content.getChallengeString().equals("challenge string")); + + byte[] ce = null; + for (IExtension e : content.getDynamicContentResponseList()) { + if (e.getId().equals("challenge_extension_id1")) { + ce = e.getBinarydata(); + } + } + assert(UperEncoder.hexStringFromBytes(ce).equals("82DA")); + + assert(UperEncoder.hexStringFromBytes(content.getPhoneIdHash()).equals("83DA")); + + assert(UperEncoder.hexStringFromBytes(content.getPassIdHash()).equals("84DA")); + + assert(content.getGeoCoordinate() != null); + assert(content.getGeoCoordinate().getLongitude() == 12345L); + assert(content.getGeoCoordinate().getLatitude() == 56789L); + + assert(content.getTimeStamp() != null); + + assert(content.getTimeStamp().toString().equals("Wed Dec 15 12:30:00 CET 2021" )); + + + } + + + +} -- cgit v1.2.3