mirror of
https://github.com/google/nomulus.git
synced 2025-05-01 04:27:51 +02:00
This change replaces all Ref objects in the code with Key objects. These are stored in datastore as the same object (raw datastore keys), so this is not a model change. Our best practices doc says to use Keys not Refs because: * The .get() method obscures what's actually going on - Much harder to visually audit the code for datastore loads - Hard to distinguish Ref<T> get()'s from Optional get()'s and Supplier get()'s * Implicit ofy().load() offers much less control - Antipattern for ultimate goal of making Ofy injectable - Can't control cache use or batch loading without making ofy() explicit anyway * Serialization behavior is surprising and could be quite dangerous/incorrect - Can lead to serialization errors. If it actually worked "as intended", it would lead to a Ref<> on a serialized object being replaced upon deserialization with a stale copy of the old value, which could potentially break all kinds of transactional expectations * Having both Ref<T> and Key<T> introduces extra boilerplate everywhere - E.g. helper methods all need to have Ref and Key overloads, or you need to call .key() to get the Key<T> for every Ref<T> you want to pass in - Creating a Ref<T> is more cumbersome, since it doesn't have all the create() overloads that Key<T> has, only create(Key<T>) and create(Entity) - no way to create directly from kind+ID/name, raw Key, websafe key string, etc. (Note that Refs are treated specially by Objectify's @Load method and Keys are not; we don't use that feature, but it is the one advantage Refs have over Keys.) The direct impetus for this change is that I am trying to audit our use of memcache, and the implicit .get() calls to datastore were making that very hard. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=131965491
147 lines
6 KiB
Java
147 lines
6 KiB
Java
// Copyright 2016 The Domain Registry 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.server;
|
||
|
||
import static google.registry.model.domain.DesignatedContact.Type.ADMIN;
|
||
import static google.registry.model.domain.DesignatedContact.Type.BILLING;
|
||
import static google.registry.model.domain.DesignatedContact.Type.TECH;
|
||
import static google.registry.testing.DatastoreHelper.createTlds;
|
||
import static google.registry.testing.DatastoreHelper.newContactResource;
|
||
import static google.registry.testing.DatastoreHelper.newDomainResource;
|
||
import static google.registry.testing.DatastoreHelper.persistActiveHost;
|
||
import static google.registry.testing.DatastoreHelper.persistResource;
|
||
|
||
import com.google.common.collect.ImmutableList;
|
||
import com.google.common.collect.ImmutableSet;
|
||
import com.googlecode.objectify.Key;
|
||
import google.registry.model.contact.ContactAddress;
|
||
import google.registry.model.contact.ContactResource;
|
||
import google.registry.model.contact.PostalInfo;
|
||
import google.registry.model.domain.DesignatedContact;
|
||
import google.registry.model.ofy.Ofy;
|
||
import google.registry.model.registrar.Registrar;
|
||
import google.registry.testing.FakeClock;
|
||
import google.registry.testing.InjectRule;
|
||
import org.joda.time.DateTime;
|
||
|
||
/**
|
||
* Datastore fixtures for the development webserver.
|
||
*
|
||
* <p><b>Warning:</b> These fixtures aren't really intended for unit tests, since they take upwards
|
||
* of a second to load.
|
||
*/
|
||
public enum Fixture {
|
||
|
||
INJECTED_FAKE_CLOCK {
|
||
@Override
|
||
public void load() {
|
||
new InjectRule()
|
||
.setStaticField(Ofy.class, "clock", new FakeClock(DateTime.parse("2000-01-01TZ")));
|
||
}
|
||
},
|
||
|
||
/** Fixture of two TLDs, three contacts, two domains, and six hosts. */
|
||
BASIC {
|
||
@Override
|
||
public void load() {
|
||
createTlds("xn--q9jyb4c", "example");
|
||
|
||
ContactResource google = persistResource(newContactResource("google")
|
||
.asBuilder()
|
||
.setLocalizedPostalInfo(new PostalInfo.Builder()
|
||
.setType(PostalInfo.Type.LOCALIZED)
|
||
.setName("Mr. Google")
|
||
.setOrg("Google Inc.")
|
||
.setAddress(new ContactAddress.Builder()
|
||
.setStreet(ImmutableList.of("111 8th Ave", "4th Floor"))
|
||
.setCity("New York")
|
||
.setState("NY")
|
||
.setZip("10011")
|
||
.setCountryCode("US")
|
||
.build())
|
||
.build())
|
||
.build());
|
||
|
||
ContactResource justine = persistResource(newContactResource("justine")
|
||
.asBuilder()
|
||
.setLocalizedPostalInfo(new PostalInfo.Builder()
|
||
.setType(PostalInfo.Type.LOCALIZED)
|
||
.setName("Justine Bean")
|
||
.setOrg("(✿◕ ‿◕ )ノ Incorporated")
|
||
.setAddress(new ContactAddress.Builder()
|
||
.setStreet(ImmutableList.of("123 Fake St."))
|
||
.setCity("Stratford")
|
||
.setState("CT")
|
||
.setZip("06615")
|
||
.setCountryCode("US")
|
||
.build())
|
||
.build())
|
||
.build());
|
||
|
||
ContactResource robert = persistResource(newContactResource("robert")
|
||
.asBuilder()
|
||
.setLocalizedPostalInfo(new PostalInfo.Builder()
|
||
.setType(PostalInfo.Type.LOCALIZED)
|
||
.setName("Captain Robert")
|
||
.setOrg("Ancient World")
|
||
.setAddress(new ContactAddress.Builder()
|
||
.setStreet(ImmutableList.of(
|
||
"A skeleton crew is what came back",
|
||
"And once in port he filled his sack",
|
||
"With bribes and cash and fame and coin"))
|
||
.setCity("Things to make a new crew join")
|
||
.setState("NY")
|
||
.setZip("10011")
|
||
.setCountryCode("US")
|
||
.build())
|
||
.build())
|
||
.build());
|
||
|
||
persistResource(
|
||
newDomainResource("love.xn--q9jyb4c", justine).asBuilder()
|
||
.setContacts(ImmutableSet.of(
|
||
DesignatedContact.create(ADMIN, Key.create(robert)),
|
||
DesignatedContact.create(BILLING, Key.create(google)),
|
||
DesignatedContact.create(TECH, Key.create(justine))))
|
||
.setNameservers(ImmutableSet.of(
|
||
Key.create(persistActiveHost("ns1.love.xn--q9jyb4c")),
|
||
Key.create(persistActiveHost("ns2.love.xn--q9jyb4c"))))
|
||
.build());
|
||
|
||
persistResource(
|
||
newDomainResource("moogle.example", justine).asBuilder()
|
||
.setContacts(ImmutableSet.of(
|
||
DesignatedContact.create(ADMIN, Key.create(robert)),
|
||
DesignatedContact.create(BILLING, Key.create(google)),
|
||
DesignatedContact.create(TECH, Key.create(justine))))
|
||
.setNameservers(ImmutableSet.of(
|
||
Key.create(persistActiveHost("ns1.linode.com")),
|
||
Key.create(persistActiveHost("ns2.linode.com")),
|
||
Key.create(persistActiveHost("ns3.linode.com")),
|
||
Key.create(persistActiveHost("ns4.linode.com")),
|
||
Key.create(persistActiveHost("ns5.linode.com"))))
|
||
.build());
|
||
|
||
persistResource(
|
||
Registrar.loadByClientId("TheRegistrar").asBuilder()
|
||
.setAllowedTlds(ImmutableSet.of("example", "xn--q9jyb4c"))
|
||
.setBillingMethod(Registrar.BillingMethod.BRAINTREE)
|
||
.build());
|
||
}
|
||
};
|
||
|
||
/** Loads this fixture into the datastore. */
|
||
public abstract void load();
|
||
}
|