From fe31169282fa5a5fdd7aa52d8c5980a156dfea8c Mon Sep 17 00:00:00 2001 From: Paul Philion Date: Fri, 4 May 2012 17:44:49 -0700 Subject: [PATCH] Initial checkin --- pom.xml | 51 +++ .../CanNeverHappenException.java | 17 + .../java/com/softwarecraftsmen/Optional.java | 109 +++++++ src/main/java/com/softwarecraftsmen/Pair.java | 48 +++ .../dns/HostInformation.java | 68 ++++ .../com/softwarecraftsmen/dns/MailBox.java | 81 +++++ .../softwarecraftsmen/dns/MailExchange.java | 114 +++++++ ...tSupportedInCharacterStringsException.java | 21 ++ .../com/softwarecraftsmen/dns/Seconds.java | 100 ++++++ .../SerializableInternetProtocolAddress.java | 188 +++++++++++ .../dns/ServiceInformation.java | 99 ++++++ .../dns/ServiceInformationPrioritised.java | 56 ++++ .../dns/StatementOfAuthority.java | 100 ++++++ src/main/java/com/softwarecraftsmen/dns/TODO | 64 ++++ .../java/com/softwarecraftsmen/dns/Text.java | 67 ++++ .../softwarecraftsmen/dns/client/Client.java | 127 ++++++++ .../dns/client/resolvers/DnsResolver.java | 12 + .../resolvers/SynchronousDnsResolver.java | 95 ++++++ .../protoolClients/ProtocolClient.java | 15 + .../protoolClients/SelectorKeyHelper.java | 64 ++++ .../protoolClients/TcpProtocolClient.java | 221 +++++++++++++ .../protoolClients/UdpProtocolClient.java | 212 ++++++++++++ .../CachingResourceRecordRepository.java | 83 +++++ .../NonCachingResourceRecordRepository.java | 28 ++ .../ResourceRecordRepository.java | 17 + .../BindLikeServerAddressFinder.java | 33 ++ ...lVersion4LocalHostServerAddressFinder.java | 32 ++ ...lVersion6LocalHostServerAddressFinder.java | 32 ++ .../KnownServerAddressFinder.java | 30 ++ .../PosixServerAddressFinder.java | 117 +++++++ .../ServerAddressFinder.java | 18 ++ .../softwarecraftsmen/dns/labels/Label.java | 17 + .../dns/labels/ServiceLabel.java | 99 ++++++ .../dns/labels/ServiceProtocolLabel.java | 55 ++++ .../dns/labels/SimpleLabel.java | 158 +++++++++ .../dns/messaging/GenericName.java | 132 ++++++++ .../messaging/GenericResourceRecordData.java | 28 ++ .../dns/messaging/InternetClassType.java | 217 +++++++++++++ .../dns/messaging/Message.java | 184 +++++++++++ .../dns/messaging/MessageHeader.java | 155 +++++++++ .../dns/messaging/MessageHeaderFlags.java | 175 ++++++++++ .../dns/messaging/MessageId.java | 72 +++++ .../dns/messaging/OperationCode.java | 45 +++ .../dns/messaging/QClass.java | 64 ++++ .../dns/messaging/Question.java | 82 +++++ .../dns/messaging/ResponseCode.java | 60 ++++ .../messaging/deserializer/AtomicReader.java | 305 ++++++++++++++++++ .../BadlyFormedDnsMessageException.java | 14 + .../deserializer/ByteArrayReader.java | 100 ++++++ .../messaging/deserializer/LabelsReader.java | 67 ++++ .../deserializer/MessageDeserializer.java | 84 +++++ .../deserializer/StructureReader.java | 64 ++++ .../TruncatedDnsMessageException.java | 12 + .../messaging/serializer/AtomicWriter.java | 110 +++++++ .../messaging/serializer/ByteSerializer.java | 39 +++ .../messaging/serializer/Serializable.java | 11 + .../dns/names/AbstractName.java | 142 ++++++++ .../dns/names/DomainName.java | 36 +++ .../softwarecraftsmen/dns/names/HostName.java | 36 +++ .../com/softwarecraftsmen/dns/names/Name.java | 13 + .../dns/names/PointerName.java | 122 +++++++ .../dns/names/ServiceName.java | 93 ++++++ .../AbstractResourceRecord.java | 155 +++++++++ .../CanonicalNameResourceRecord.java | 21 ++ .../GenericResourceRecord.java | 23 ++ .../HostInformationResourceRecord.java | 22 ++ ...ProtocolVersion4AddressResourceRecord.java | 24 ++ ...ProtocolVersion6AddressResourceRecord.java | 24 ++ .../MailExchangeResourceRecord.java | 22 ++ .../NameServerResourceRecord.java | 22 ++ .../PointerResourceRecord.java | 22 ++ .../dns/resourceRecords/ResourceRecord.java | 24 ++ .../ServiceInformationResourceRecord.java | 22 ++ .../StatementOfAuthorityResourceRecord.java | 21 ++ .../resourceRecords/TextResourceRecord.java | 21 ++ .../softwarecraftsmen/toString/ToString.java | 80 +++++ .../Unsigned16BitInteger.java | 201 ++++++++++++ .../Unsigned32BitInteger.java | 95 ++++++ .../unsignedIntegers/Unsigned3BitInteger.java | 63 ++++ .../unsignedIntegers/Unsigned4BitInteger.java | 77 +++++ .../unsignedIntegers/Unsigned8BitInteger.java | 89 +++++ .../ConvenientArrayList.java | 28 ++ .../softwarecraftsmen/dns/MailBoxTest.java | 26 ++ .../dns/MailExchangeTest.java | 59 ++++ .../ServiceInformationPrioritisedTest.java | 111 +++++++ .../dns/ServiceInformationTest.java | 51 +++ .../dns/client/ClientAcceptanceTest.java | 155 +++++++++ .../dns/client/ClientTest.java | 195 +++++++++++ .../dns/client/resolvers/MockDnsResolver.java | 60 ++++ .../CachingResourceRecordRepositoryTest.java | 104 ++++++ ...onCachingResourceRecordRepositoryTest.java | 50 +++ .../dns/labels/ServiceLabelTest.java | 51 +++ .../dns/labels/ServiceProtocolLabelTest.java | 45 +++ .../dns/labels/SimpleLabelTest.java | 100 ++++++ .../dns/messaging/ClassTest.java | 19 ++ .../dns/messaging/InternetClassTypeTest.java | 23 ++ .../dns/messaging/MessageHeaderFlagsTest.java | 27 ++ .../dns/messaging/MessageHeaderTest.java | 50 +++ .../dns/messaging/MessageIdTest.java | 20 ++ .../dns/messaging/MessageTest.java | 65 ++++ .../dns/messaging/QuestionTest.java | 57 ++++ .../deserializer/MessageDeserializerTest.java | 122 +++++++ .../dns/names/AbstractNameTest.java | 93 ++++++ .../dns/names/DomainNameTest.java | 27 ++ .../dns/names/GenericNameTest.java | 27 ++ .../dns/names/HostNameTest.java | 28 ++ .../dns/names/ServiceNameTest.java | 28 ++ 107 files changed, 7759 insertions(+) create mode 100644 pom.xml create mode 100755 src/main/java/com/softwarecraftsmen/CanNeverHappenException.java create mode 100755 src/main/java/com/softwarecraftsmen/Optional.java create mode 100644 src/main/java/com/softwarecraftsmen/Pair.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/HostInformation.java create mode 100644 src/main/java/com/softwarecraftsmen/dns/MailBox.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/MailExchange.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/NonAsciiAndControlCharactersAreNotSupportedInCharacterStringsException.java create mode 100644 src/main/java/com/softwarecraftsmen/dns/Seconds.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/SerializableInternetProtocolAddress.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/ServiceInformation.java create mode 100644 src/main/java/com/softwarecraftsmen/dns/ServiceInformationPrioritised.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/StatementOfAuthority.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/TODO create mode 100755 src/main/java/com/softwarecraftsmen/dns/Text.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/client/Client.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/client/resolvers/DnsResolver.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/client/resolvers/SynchronousDnsResolver.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/client/resolvers/protoolClients/ProtocolClient.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/client/resolvers/protoolClients/SelectorKeyHelper.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/client/resolvers/protoolClients/TcpProtocolClient.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/client/resolvers/protoolClients/UdpProtocolClient.java create mode 100644 src/main/java/com/softwarecraftsmen/dns/client/resourceRecordRepositories/CachingResourceRecordRepository.java create mode 100644 src/main/java/com/softwarecraftsmen/dns/client/resourceRecordRepositories/NonCachingResourceRecordRepository.java create mode 100644 src/main/java/com/softwarecraftsmen/dns/client/resourceRecordRepositories/ResourceRecordRepository.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/client/serverAddressFinders/BindLikeServerAddressFinder.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/client/serverAddressFinders/InternetProtocolVersion4LocalHostServerAddressFinder.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/client/serverAddressFinders/InternetProtocolVersion6LocalHostServerAddressFinder.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/client/serverAddressFinders/KnownServerAddressFinder.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/client/serverAddressFinders/PosixServerAddressFinder.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/client/serverAddressFinders/ServerAddressFinder.java create mode 100644 src/main/java/com/softwarecraftsmen/dns/labels/Label.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/labels/ServiceLabel.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/labels/ServiceProtocolLabel.java create mode 100644 src/main/java/com/softwarecraftsmen/dns/labels/SimpleLabel.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/GenericName.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/GenericResourceRecordData.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/InternetClassType.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/Message.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/MessageHeader.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/MessageHeaderFlags.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/MessageId.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/OperationCode.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/QClass.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/Question.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/ResponseCode.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/deserializer/AtomicReader.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/deserializer/BadlyFormedDnsMessageException.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/deserializer/ByteArrayReader.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/deserializer/LabelsReader.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/deserializer/MessageDeserializer.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/deserializer/StructureReader.java create mode 100644 src/main/java/com/softwarecraftsmen/dns/messaging/deserializer/TruncatedDnsMessageException.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/serializer/AtomicWriter.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/serializer/ByteSerializer.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/messaging/serializer/Serializable.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/names/AbstractName.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/names/DomainName.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/names/HostName.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/names/Name.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/names/PointerName.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/names/ServiceName.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/resourceRecords/AbstractResourceRecord.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/resourceRecords/CanonicalNameResourceRecord.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/resourceRecords/GenericResourceRecord.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/resourceRecords/HostInformationResourceRecord.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/resourceRecords/InternetProtocolVersion4AddressResourceRecord.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/resourceRecords/InternetProtocolVersion6AddressResourceRecord.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/resourceRecords/MailExchangeResourceRecord.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/resourceRecords/NameServerResourceRecord.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/resourceRecords/PointerResourceRecord.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/resourceRecords/ResourceRecord.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/resourceRecords/ServiceInformationResourceRecord.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/resourceRecords/StatementOfAuthorityResourceRecord.java create mode 100755 src/main/java/com/softwarecraftsmen/dns/resourceRecords/TextResourceRecord.java create mode 100755 src/main/java/com/softwarecraftsmen/toString/ToString.java create mode 100755 src/main/java/com/softwarecraftsmen/unsignedIntegers/Unsigned16BitInteger.java create mode 100755 src/main/java/com/softwarecraftsmen/unsignedIntegers/Unsigned32BitInteger.java create mode 100644 src/main/java/com/softwarecraftsmen/unsignedIntegers/Unsigned3BitInteger.java create mode 100644 src/main/java/com/softwarecraftsmen/unsignedIntegers/Unsigned4BitInteger.java create mode 100755 src/main/java/com/softwarecraftsmen/unsignedIntegers/Unsigned8BitInteger.java create mode 100755 src/test/java/com/softwarecraftsmen/ConvenientArrayList.java create mode 100644 src/test/java/com/softwarecraftsmen/dns/MailBoxTest.java create mode 100644 src/test/java/com/softwarecraftsmen/dns/MailExchangeTest.java create mode 100644 src/test/java/com/softwarecraftsmen/dns/ServiceInformationPrioritisedTest.java create mode 100644 src/test/java/com/softwarecraftsmen/dns/ServiceInformationTest.java create mode 100755 src/test/java/com/softwarecraftsmen/dns/client/ClientAcceptanceTest.java create mode 100755 src/test/java/com/softwarecraftsmen/dns/client/ClientTest.java create mode 100644 src/test/java/com/softwarecraftsmen/dns/client/resolvers/MockDnsResolver.java create mode 100644 src/test/java/com/softwarecraftsmen/dns/client/resourceRecordRepositories/CachingResourceRecordRepositoryTest.java create mode 100644 src/test/java/com/softwarecraftsmen/dns/client/resourceRecordRepositories/NonCachingResourceRecordRepositoryTest.java create mode 100644 src/test/java/com/softwarecraftsmen/dns/labels/ServiceLabelTest.java create mode 100644 src/test/java/com/softwarecraftsmen/dns/labels/ServiceProtocolLabelTest.java create mode 100644 src/test/java/com/softwarecraftsmen/dns/labels/SimpleLabelTest.java create mode 100755 src/test/java/com/softwarecraftsmen/dns/messaging/ClassTest.java create mode 100755 src/test/java/com/softwarecraftsmen/dns/messaging/InternetClassTypeTest.java create mode 100755 src/test/java/com/softwarecraftsmen/dns/messaging/MessageHeaderFlagsTest.java create mode 100755 src/test/java/com/softwarecraftsmen/dns/messaging/MessageHeaderTest.java create mode 100755 src/test/java/com/softwarecraftsmen/dns/messaging/MessageIdTest.java create mode 100755 src/test/java/com/softwarecraftsmen/dns/messaging/MessageTest.java create mode 100755 src/test/java/com/softwarecraftsmen/dns/messaging/QuestionTest.java create mode 100755 src/test/java/com/softwarecraftsmen/dns/messaging/deserializer/MessageDeserializerTest.java create mode 100644 src/test/java/com/softwarecraftsmen/dns/names/AbstractNameTest.java create mode 100755 src/test/java/com/softwarecraftsmen/dns/names/DomainNameTest.java create mode 100644 src/test/java/com/softwarecraftsmen/dns/names/GenericNameTest.java create mode 100755 src/test/java/com/softwarecraftsmen/dns/names/HostNameTest.java create mode 100644 src/test/java/com/softwarecraftsmen/dns/names/ServiceNameTest.java diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4ae5a63 --- /dev/null +++ b/pom.xml @@ -0,0 +1,51 @@ + + 4.0.0 + + com.acmerocket.waiter + waiter + 1.0-SNAPSHOT + jar + + waiter + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 4.10 + test + + + com.intellij + annotations + 9.0.4 + + + org.hamcrest + hamcrest-all + 1.1 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.0.2 + + 1.6 + 1.6 + + + + + + diff --git a/src/main/java/com/softwarecraftsmen/CanNeverHappenException.java b/src/main/java/com/softwarecraftsmen/CanNeverHappenException.java new file mode 100755 index 0000000..0b9bc5d --- /dev/null +++ b/src/main/java/com/softwarecraftsmen/CanNeverHappenException.java @@ -0,0 +1,17 @@ +/** + * This file is Copyright © 2008 Software Craftsmen Limited. All Rights Reserved. + */ +package com.softwarecraftsmen; + +import org.jetbrains.annotations.NotNull; + +public class CanNeverHappenException extends RuntimeException +{ + public CanNeverHappenException(final @NotNull Exception cause) + { + super(cause); + } + + public CanNeverHappenException() + {} +} diff --git a/src/main/java/com/softwarecraftsmen/Optional.java b/src/main/java/com/softwarecraftsmen/Optional.java new file mode 100755 index 0000000..b86f9b5 --- /dev/null +++ b/src/main/java/com/softwarecraftsmen/Optional.java @@ -0,0 +1,109 @@ +package com.softwarecraftsmen; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import static java.util.Collections.emptySet; + +public class Optional implements Set +{ + private Set internalSet; + private final T singleValue; + + private Optional() + { + internalSet = emptySet(); + singleValue = null; + } + + public Optional(final @NotNull T singleValue) + { + internalSet = new LinkedHashSet(1); + this.singleValue = singleValue; + internalSet.add(this.singleValue); + } + + @Nullable + public T value() + { + if (isEmpty()) + { + throw new IllegalStateException("IsEmpty"); + } + return singleValue; + } + + public int size() + { + return internalSet.size(); + } + + public boolean isEmpty() + { + return internalSet.isEmpty(); + } + + public boolean contains(final @NotNull Object o) + { + return internalSet.contains(o); + } + + @NotNull + public Iterator iterator() + { + return internalSet.iterator(); + } + + @NotNull + public Object[] toArray() + { + return internalSet.toArray(); + } + + @NotNull + public T[] toArray(final @NotNull T[] a) + { + return internalSet.toArray(a); + } + + public boolean add(final @NotNull T t) + { + throw new UnsupportedOperationException("add"); + } + + public boolean remove(final Object o) + { + throw new UnsupportedOperationException("remove"); + } + + public boolean containsAll(final @NotNull Collection c) + { + return internalSet.containsAll(c); + } + + public boolean addAll(final @NotNull Collection c) + { + throw new UnsupportedOperationException("addAll"); + } + + public boolean retainAll(final Collection c) + { + throw new UnsupportedOperationException("retainAll"); + } + + public boolean removeAll(final Collection c) + { + throw new UnsupportedOperationException("removeAll"); + } + + public void clear() + { + throw new UnsupportedOperationException("clear"); + } + + public static Optional empty() + { + return new Optional(); + } +} diff --git a/src/main/java/com/softwarecraftsmen/Pair.java b/src/main/java/com/softwarecraftsmen/Pair.java new file mode 100644 index 0000000..5987da8 --- /dev/null +++ b/src/main/java/com/softwarecraftsmen/Pair.java @@ -0,0 +1,48 @@ +/** + * This file is Copyright © 2008 Software Craftsmen Limited. All Rights Reserved. + */ +package com.softwarecraftsmen; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public final class Pair +{ + private final A name; + private final B internetClassType; + + public Pair(final @NotNull A name, final @NotNull B internetClassType) + { + this.name = name; + this.internetClassType = internetClassType; + } + + public boolean equals(final @Nullable Object o) + { + if (this == o) + { + return true; + } + if (o == null || getClass() != o.getClass()) + { + return false; + } + + final Pair key = (Pair) o; + return internetClassType == key.internetClassType && name.equals(key.name); + } + + public int hashCode() + { + int result; + result = name.hashCode(); + result = 31 * result + internetClassType.hashCode(); + return result; + } + + @NotNull + public String toString() + { + return com.softwarecraftsmen.toString.ToString.string(this, name, internetClassType); + } +} diff --git a/src/main/java/com/softwarecraftsmen/dns/HostInformation.java b/src/main/java/com/softwarecraftsmen/dns/HostInformation.java new file mode 100755 index 0000000..f8ffb8f --- /dev/null +++ b/src/main/java/com/softwarecraftsmen/dns/HostInformation.java @@ -0,0 +1,68 @@ +package com.softwarecraftsmen.dns; + +import static com.softwarecraftsmen.toString.ToString.string; +import com.softwarecraftsmen.dns.messaging.serializer.AtomicWriter; +import com.softwarecraftsmen.dns.messaging.serializer.Serializable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class HostInformation implements Serializable +{ + public final String cpuType; + public final String operatingSystemType; + + public HostInformation(final @NotNull String cpuType, final @NotNull String operatingSystemType) + { + this.cpuType = cpuType; + this.operatingSystemType = operatingSystemType; + if (cpuType.length() > 255) + { + throw new IllegalArgumentException("cpuType is a character strign which DNS restricts to a maximum length of 255 characters"); + } + if (operatingSystemType.length() > 255) + { + throw new IllegalArgumentException("operatingSystemType is a character strign which DNS restricts to a maximum length of 255 characters"); + } + } + + @NotNull + public String toString() + { + return string(this, cpuType, operatingSystemType); + } + + public boolean equals(final @Nullable Object o) + { + if (this == o) + { + return true; + } + if (o == null || getClass() != o.getClass()) + { + return false; + } + + final HostInformation that = (HostInformation) o; + return cpuType.equals(that.cpuType) && operatingSystemType.equals(that.operatingSystemType); + } + + public int hashCode() + { + int result; + result = cpuType.hashCode(); + result = 31 * result + operatingSystemType.hashCode(); + return result; + } + + public void serialize(final @NotNull AtomicWriter writer) + { + writer.writeCharacterString(cpuType); + writer.writeCharacterString(operatingSystemType); + } + + @NotNull + public static HostInformation hostInformation(final @NotNull String cpuType, final @NotNull String operatingSystemType) + { + return new HostInformation(cpuType, operatingSystemType); + } +} diff --git a/src/main/java/com/softwarecraftsmen/dns/MailBox.java b/src/main/java/com/softwarecraftsmen/dns/MailBox.java new file mode 100644 index 0000000..093abdf --- /dev/null +++ b/src/main/java/com/softwarecraftsmen/dns/MailBox.java @@ -0,0 +1,81 @@ +package com.softwarecraftsmen.dns; + +import com.softwarecraftsmen.dns.messaging.serializer.AtomicWriter; +import static com.softwarecraftsmen.dns.labels.SimpleLabel.simpleLabel; +import com.softwarecraftsmen.dns.labels.Label; +import com.softwarecraftsmen.dns.names.Name; +import com.softwarecraftsmen.dns.names.DomainName; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import static java.lang.String.format; +import java.util.ArrayList; +import java.util.List; +import static java.util.Locale.UK; + +public class MailBox implements Name +{ + private final String userName; + private final DomainName domainName; + + public MailBox(final @NotNull String userName, final @NotNull DomainName domainName) + { + this.userName = userName; + this.domainName = domainName; + if (userName.length() > 63) + { + throw new IllegalArgumentException("An userName must be less than 64 characters in length"); + } + } + + @NotNull + public String toString() + { + return format(UK, "%1$s@%2$s", userName, domainName); + } + + public boolean equals(final @Nullable Object o) + { + if (this == o) + { + return true; + } + if (o == null || getClass() != o.getClass()) + { + return false; + } + + final MailBox mailBox = (MailBox) o; + return domainName.equals(mailBox.domainName) && userName.equals(mailBox.userName); + } + + public int hashCode() + { + int result; + result = userName.hashCode(); + result = 31 * result + domainName.hashCode(); + return result; + } + + public void serialize(final @NotNull AtomicWriter writer) + { + writer.writeCharacterString(userName); + domainName.serialize(writer); + } + + @NotNull + public static MailBox mailBox(final @NotNull String userName, final @NotNull DomainName domainName) + { + return new MailBox(userName, domainName); + } + + @NotNull + public List