Create *InfoData objects instead of reusing *Resource objects

This is probably best from a code-cleanliness perspective anyways,
but the rationale is that tightly coupling the resources to the
info responses was a straightjacket that required all status
values and fields to be directly available on the resource. With
this change, I already was able to get rid of the preMarshal()
hackery, and I will be able to get rid of cloneWithLinkedStatus()
and most of the contents of cloneProjectedAtTime() for non-domains.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=144252924
This commit is contained in:
cgoldfeder 2017-01-11 14:49:10 -08:00 committed by Ben McIlwain
parent 96a71ded91
commit b0bcc1bb3d
22 changed files with 586 additions and 230 deletions

View file

@ -0,0 +1,99 @@
// Copyright 2016 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.model.host;
import com.google.auto.value.AutoValue;
import com.google.auto.value.AutoValue.CopyAnnotations;
import com.google.common.collect.ImmutableSet;
import google.registry.model.eppcommon.StatusValue;
import google.registry.model.eppoutput.EppResponse.ResponseData;
import java.net.InetAddress;
import javax.annotation.Nullable;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.joda.time.DateTime;
/** The {@link ResponseData} returned for an EPP info flow on a host. */
@XmlRootElement(name = "infData")
@XmlType(propOrder = {
"fullyQualifiedHostName",
"repoId",
"statusValues",
"inetAddresses",
"currentSponsorClientId",
"creationClientId",
"creationTime",
"lastEppUpdateClientId",
"lastEppUpdateTime",
"lastTransferTime" })
@AutoValue
@CopyAnnotations
public abstract class HostInfoData implements ResponseData {
@XmlElement(name = "name")
abstract String getFullyQualifiedHostName();
@XmlElement(name = "roid")
abstract String getRepoId();
@XmlElement(name = "status")
abstract ImmutableSet<StatusValue> getStatusValues();
@XmlElement(name = "addr")
abstract ImmutableSet<InetAddress> getInetAddresses();
@XmlElement(name = "clID")
abstract String getCurrentSponsorClientId();
@XmlElement(name = "crID")
abstract String getCreationClientId();
@XmlElement(name = "crDate")
abstract DateTime getCreationTime();
@XmlElement(name = "upID")
@Nullable
abstract String getLastEppUpdateClientId();
@XmlElement(name = "upDate")
@Nullable
abstract DateTime getLastEppUpdateTime();
@XmlElement(name = "trDate")
@Nullable
abstract DateTime getLastTransferTime();
/** Builder for {@link HostInfoData}. */
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setFullyQualifiedHostName(String fullyQualifiedHostName);
public abstract Builder setRepoId(String repoId);
public abstract Builder setStatusValues(ImmutableSet<StatusValue> statusValues);
public abstract Builder setInetAddresses(ImmutableSet<InetAddress> inetAddresses);
public abstract Builder setCurrentSponsorClientId(String currentSponsorClientId);
public abstract Builder setCreationClientId(String creationClientId);
public abstract Builder setCreationTime(DateTime creationTime);
public abstract Builder setLastEppUpdateClientId(@Nullable String lastEppUpdateClientId);
public abstract Builder setLastEppUpdateTime(@Nullable DateTime lastEppUpdateTime);
public abstract Builder setLastTransferTime(@Nullable DateTime lastTransferTime);
public abstract HostInfoData build();
}
public static Builder newBuilder() {
return new AutoValue_HostInfoData.Builder();
}
}

View file

@ -39,10 +39,6 @@ import google.registry.model.transfer.TransferData;
import google.registry.model.transfer.TransferStatus;
import java.net.InetAddress;
import java.util.Set;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;
import org.joda.time.DateTime;
/**
@ -53,18 +49,6 @@ import org.joda.time.DateTime;
*
* @see <a href="https://tools.ietf.org/html/rfc5732">RFC 5732</a>
*/
@XmlRootElement(name = "infData")
@XmlType(propOrder = {
"fullyQualifiedHostName",
"repoId",
"status",
"inetAddresses",
"currentSponsorClientId",
"creationClientId",
"creationTime",
"lastEppUpdateClientId",
"lastEppUpdateTime",
"lastTransferTime" })
@Cache(expirationSeconds = RECOMMENDED_MEMCACHE_EXPIRATION)
@ReportedOn
@Entity
@ -79,18 +63,15 @@ public class HostResource extends EppResource implements ForeignKeyedEppResource
* However, there can be many hosts with the same name and non-overlapping lifetimes.
*/
@Index
@XmlTransient
String fullyQualifiedHostName;
/** IP Addresses for this host. Can be null if this is an external host. */
@Index
@XmlTransient
Set<InetAddress> inetAddresses;
/** The superordinate domain of this host, or null if this is an external host. */
@Index
@IgnoreSave(IfNull.class)
@XmlTransient
@DoNotHydrate
Key<DomainResource> superordinateDomain;
@ -99,17 +80,14 @@ public class HostResource extends EppResource implements ForeignKeyedEppResource
*
* <p>Can be null if the resource has never been transferred.
*/
@XmlElement(name = "trDate")
DateTime lastTransferTime;
/**
* The most recent time that the superordinate domain was changed, or null if this host is
* external.
*/
@XmlTransient
DateTime lastSuperordinateChange;
@XmlElement(name = "name")
public String getFullyQualifiedHostName() {
return fullyQualifiedHostName;
}
@ -118,7 +96,6 @@ public class HostResource extends EppResource implements ForeignKeyedEppResource
return superordinateDomain;
}
@XmlElement(name = "addr")
public ImmutableSet<InetAddress> getInetAddresses() {
return nullToEmptyImmutableCopy(inetAddresses);
}