mirror of
https://github.com/google/nomulus.git
synced 2025-07-20 17:56:08 +02:00
Use the built-in replicaJpaTm() in RDAP (#1506)
* Use the built-in replicaJpaTm() in RDAP This includes a test for the replica-simulating transaction manager and removal of any replica-specific code in RDAP tests, because it's unnecessary due to the existing tests.
This commit is contained in:
parent
77600ba404
commit
4d08fadc11
8 changed files with 162 additions and 158 deletions
|
@ -18,7 +18,6 @@ import static google.registry.persistence.transaction.TransactionManagerFactory.
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import javax.persistence.EntityManager;
|
|
||||||
import javax.persistence.criteria.CriteriaBuilder;
|
import javax.persistence.criteria.CriteriaBuilder;
|
||||||
import javax.persistence.criteria.CriteriaQuery;
|
import javax.persistence.criteria.CriteriaQuery;
|
||||||
import javax.persistence.criteria.Expression;
|
import javax.persistence.criteria.Expression;
|
||||||
|
@ -42,12 +41,14 @@ public class CriteriaQueryBuilder<T> {
|
||||||
|
|
||||||
private final CriteriaQuery<T> query;
|
private final CriteriaQuery<T> query;
|
||||||
private final Root<?> root;
|
private final Root<?> root;
|
||||||
|
private final JpaTransactionManager jpaTm;
|
||||||
private final ImmutableList.Builder<Predicate> predicates = new ImmutableList.Builder<>();
|
private final ImmutableList.Builder<Predicate> predicates = new ImmutableList.Builder<>();
|
||||||
private final ImmutableList.Builder<Order> orders = new ImmutableList.Builder<>();
|
private final ImmutableList.Builder<Order> orders = new ImmutableList.Builder<>();
|
||||||
|
|
||||||
private CriteriaQueryBuilder(CriteriaQuery<T> query, Root<?> root) {
|
private CriteriaQueryBuilder(CriteriaQuery<T> query, Root<?> root, JpaTransactionManager jpaTm) {
|
||||||
this.query = query;
|
this.query = query;
|
||||||
this.root = root;
|
this.root = root;
|
||||||
|
this.jpaTm = jpaTm;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Adds a WHERE clause to the query, given the specified operation, field, and value. */
|
/** Adds a WHERE clause to the query, given the specified operation, field, and value. */
|
||||||
|
@ -75,18 +76,18 @@ public class CriteriaQueryBuilder<T> {
|
||||||
*/
|
*/
|
||||||
public <V> CriteriaQueryBuilder<T> whereFieldContains(String fieldName, Object value) {
|
public <V> CriteriaQueryBuilder<T> whereFieldContains(String fieldName, Object value) {
|
||||||
return where(
|
return where(
|
||||||
jpaTm().getEntityManager().getCriteriaBuilder().isMember(value, root.get(fieldName)));
|
jpaTm.getEntityManager().getCriteriaBuilder().isMember(value, root.get(fieldName)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Orders the result by the given field ascending. */
|
/** Orders the result by the given field ascending. */
|
||||||
public CriteriaQueryBuilder<T> orderByAsc(String fieldName) {
|
public CriteriaQueryBuilder<T> orderByAsc(String fieldName) {
|
||||||
orders.add(jpaTm().getEntityManager().getCriteriaBuilder().asc(root.get(fieldName)));
|
orders.add(jpaTm.getEntityManager().getCriteriaBuilder().asc(root.get(fieldName)));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Orders the result by the given field descending. */
|
/** Orders the result by the given field descending. */
|
||||||
public CriteriaQueryBuilder<T> orderByDesc(String fieldName) {
|
public CriteriaQueryBuilder<T> orderByDesc(String fieldName) {
|
||||||
orders.add(jpaTm().getEntityManager().getCriteriaBuilder().desc(root.get(fieldName)));
|
orders.add(jpaTm.getEntityManager().getCriteriaBuilder().desc(root.get(fieldName)));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,23 +104,24 @@ public class CriteriaQueryBuilder<T> {
|
||||||
|
|
||||||
/** Creates a query builder that will SELECT from the given class. */
|
/** Creates a query builder that will SELECT from the given class. */
|
||||||
public static <T> CriteriaQueryBuilder<T> create(Class<T> clazz) {
|
public static <T> CriteriaQueryBuilder<T> create(Class<T> clazz) {
|
||||||
return create(jpaTm().getEntityManager(), clazz);
|
return create(jpaTm(), clazz);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Creates a query builder for the given entity manager. */
|
/** Creates a query builder for the given entity manager. */
|
||||||
public static <T> CriteriaQueryBuilder<T> create(EntityManager em, Class<T> clazz) {
|
public static <T> CriteriaQueryBuilder<T> create(JpaTransactionManager jpaTm, Class<T> clazz) {
|
||||||
CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(clazz);
|
CriteriaQuery<T> query = jpaTm.getEntityManager().getCriteriaBuilder().createQuery(clazz);
|
||||||
Root<T> root = query.from(clazz);
|
Root<T> root = query.from(clazz);
|
||||||
query = query.select(root);
|
query = query.select(root);
|
||||||
return new CriteriaQueryBuilder<>(query, root);
|
return new CriteriaQueryBuilder<>(query, root, jpaTm);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Creates a "count" query for the table for the class. */
|
/** Creates a "count" query for the table for the class. */
|
||||||
public static <T> CriteriaQueryBuilder<Long> createCount(EntityManager em, Class<T> clazz) {
|
public static <T> CriteriaQueryBuilder<Long> createCount(
|
||||||
CriteriaBuilder builder = em.getCriteriaBuilder();
|
JpaTransactionManager jpaTm, Class<T> clazz) {
|
||||||
|
CriteriaBuilder builder = jpaTm.getEntityManager().getCriteriaBuilder();
|
||||||
CriteriaQuery<Long> query = builder.createQuery(Long.class);
|
CriteriaQuery<Long> query = builder.createQuery(Long.class);
|
||||||
Root<T> root = query.from(clazz);
|
Root<T> root = query.from(clazz);
|
||||||
query = query.select(builder.count(root));
|
query = query.select(builder.count(root));
|
||||||
return new CriteriaQueryBuilder<>(query, root);
|
return new CriteriaQueryBuilder<>(query, root, jpaTm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1131,7 +1131,7 @@ public class JpaTransactionManagerImpl implements JpaTransactionManager {
|
||||||
|
|
||||||
private TypedQuery<T> buildQuery() {
|
private TypedQuery<T> buildQuery() {
|
||||||
CriteriaQueryBuilder<T> queryBuilder =
|
CriteriaQueryBuilder<T> queryBuilder =
|
||||||
CriteriaQueryBuilder.create(getEntityManager(), entityClass);
|
CriteriaQueryBuilder.create(JpaTransactionManagerImpl.this, entityClass);
|
||||||
return addCriteria(queryBuilder);
|
return addCriteria(queryBuilder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1178,7 +1178,7 @@ public class JpaTransactionManagerImpl implements JpaTransactionManager {
|
||||||
@Override
|
@Override
|
||||||
public long count() {
|
public long count() {
|
||||||
CriteriaQueryBuilder<Long> queryBuilder =
|
CriteriaQueryBuilder<Long> queryBuilder =
|
||||||
CriteriaQueryBuilder.createCount(getEntityManager(), entityClass);
|
CriteriaQueryBuilder.createCount(JpaTransactionManagerImpl.this, entityClass);
|
||||||
return addCriteria(queryBuilder).getSingleResult();
|
return addCriteria(queryBuilder).getSingleResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ import static com.google.common.collect.ImmutableSet.toImmutableSet;
|
||||||
import static google.registry.model.EppResourceUtils.loadByForeignKey;
|
import static google.registry.model.EppResourceUtils.loadByForeignKey;
|
||||||
import static google.registry.model.index.ForeignKeyIndex.loadAndGetKey;
|
import static google.registry.model.index.ForeignKeyIndex.loadAndGetKey;
|
||||||
import static google.registry.model.ofy.ObjectifyService.auditedOfy;
|
import static google.registry.model.ofy.ObjectifyService.auditedOfy;
|
||||||
|
import static google.registry.persistence.transaction.TransactionManagerFactory.replicaJpaTm;
|
||||||
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
|
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
|
||||||
import static google.registry.request.Action.Method.GET;
|
import static google.registry.request.Action.Method.GET;
|
||||||
import static google.registry.request.Action.Method.HEAD;
|
import static google.registry.request.Action.Method.HEAD;
|
||||||
|
@ -37,10 +38,8 @@ import com.google.common.primitives.Booleans;
|
||||||
import com.googlecode.objectify.cmd.Query;
|
import com.googlecode.objectify.cmd.Query;
|
||||||
import google.registry.model.domain.DomainBase;
|
import google.registry.model.domain.DomainBase;
|
||||||
import google.registry.model.host.HostResource;
|
import google.registry.model.host.HostResource;
|
||||||
import google.registry.persistence.PersistenceModule.ReadOnlyReplicaJpaTm;
|
|
||||||
import google.registry.persistence.VKey;
|
import google.registry.persistence.VKey;
|
||||||
import google.registry.persistence.transaction.CriteriaQueryBuilder;
|
import google.registry.persistence.transaction.CriteriaQueryBuilder;
|
||||||
import google.registry.persistence.transaction.JpaTransactionManager;
|
|
||||||
import google.registry.rdap.RdapJsonFormatter.OutputDataType;
|
import google.registry.rdap.RdapJsonFormatter.OutputDataType;
|
||||||
import google.registry.rdap.RdapMetrics.EndpointType;
|
import google.registry.rdap.RdapMetrics.EndpointType;
|
||||||
import google.registry.rdap.RdapMetrics.SearchType;
|
import google.registry.rdap.RdapMetrics.SearchType;
|
||||||
|
@ -93,8 +92,6 @@ public class RdapDomainSearchAction extends RdapSearchActionBase {
|
||||||
@Inject @Parameter("nsLdhName") Optional<String> nsLdhNameParam;
|
@Inject @Parameter("nsLdhName") Optional<String> nsLdhNameParam;
|
||||||
@Inject @Parameter("nsIp") Optional<String> nsIpParam;
|
@Inject @Parameter("nsIp") Optional<String> nsIpParam;
|
||||||
|
|
||||||
@Inject @ReadOnlyReplicaJpaTm JpaTransactionManager readOnlyJpaTm;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public RdapDomainSearchAction() {
|
public RdapDomainSearchAction() {
|
||||||
super("domain search", EndpointType.DOMAINS);
|
super("domain search", EndpointType.DOMAINS);
|
||||||
|
@ -228,12 +225,13 @@ public class RdapDomainSearchAction extends RdapSearchActionBase {
|
||||||
resultSet = getMatchingResources(query, true, querySizeLimit);
|
resultSet = getMatchingResources(query, true, querySizeLimit);
|
||||||
} else {
|
} else {
|
||||||
resultSet =
|
resultSet =
|
||||||
readOnlyJpaTm.transact(
|
replicaJpaTm()
|
||||||
|
.transact(
|
||||||
() -> {
|
() -> {
|
||||||
CriteriaBuilder criteriaBuilder =
|
CriteriaBuilder criteriaBuilder =
|
||||||
readOnlyJpaTm.getEntityManager().getCriteriaBuilder();
|
replicaJpaTm().getEntityManager().getCriteriaBuilder();
|
||||||
CriteriaQueryBuilder<DomainBase> queryBuilder =
|
CriteriaQueryBuilder<DomainBase> queryBuilder =
|
||||||
CriteriaQueryBuilder.create(DomainBase.class)
|
CriteriaQueryBuilder.create(replicaJpaTm(), DomainBase.class)
|
||||||
.where(
|
.where(
|
||||||
"fullyQualifiedDomainName",
|
"fullyQualifiedDomainName",
|
||||||
criteriaBuilder::like,
|
criteriaBuilder::like,
|
||||||
|
@ -274,7 +272,8 @@ public class RdapDomainSearchAction extends RdapSearchActionBase {
|
||||||
resultSet = getMatchingResources(query, true, querySizeLimit);
|
resultSet = getMatchingResources(query, true, querySizeLimit);
|
||||||
} else {
|
} else {
|
||||||
resultSet =
|
resultSet =
|
||||||
readOnlyJpaTm.transact(
|
replicaJpaTm()
|
||||||
|
.transact(
|
||||||
() -> {
|
() -> {
|
||||||
CriteriaQueryBuilder<DomainBase> builder =
|
CriteriaQueryBuilder<DomainBase> builder =
|
||||||
queryItemsSql(
|
queryItemsSql(
|
||||||
|
@ -357,7 +356,8 @@ public class RdapDomainSearchAction extends RdapSearchActionBase {
|
||||||
.map(VKey::from)
|
.map(VKey::from)
|
||||||
.collect(toImmutableSet());
|
.collect(toImmutableSet());
|
||||||
} else {
|
} else {
|
||||||
return readOnlyJpaTm.transact(
|
return replicaJpaTm()
|
||||||
|
.transact(
|
||||||
() -> {
|
() -> {
|
||||||
CriteriaQueryBuilder<HostResource> builder =
|
CriteriaQueryBuilder<HostResource> builder =
|
||||||
queryItemsSql(
|
queryItemsSql(
|
||||||
|
@ -370,7 +370,7 @@ public class RdapDomainSearchAction extends RdapSearchActionBase {
|
||||||
builder =
|
builder =
|
||||||
builder.where(
|
builder.where(
|
||||||
"currentSponsorClientId",
|
"currentSponsorClientId",
|
||||||
readOnlyJpaTm.getEntityManager().getCriteriaBuilder()::equal,
|
replicaJpaTm().getEntityManager().getCriteriaBuilder()::equal,
|
||||||
desiredRegistrar.get());
|
desiredRegistrar.get());
|
||||||
}
|
}
|
||||||
return getMatchingResourcesSql(builder, true, maxNameserversInFirstStage)
|
return getMatchingResourcesSql(builder, true, maxNameserversInFirstStage)
|
||||||
|
@ -512,10 +512,11 @@ public class RdapDomainSearchAction extends RdapSearchActionBase {
|
||||||
parameters.put("desiredRegistrar", desiredRegistrar.get());
|
parameters.put("desiredRegistrar", desiredRegistrar.get());
|
||||||
}
|
}
|
||||||
hostKeys =
|
hostKeys =
|
||||||
readOnlyJpaTm.transact(
|
replicaJpaTm()
|
||||||
|
.transact(
|
||||||
() -> {
|
() -> {
|
||||||
javax.persistence.Query query =
|
javax.persistence.Query query =
|
||||||
readOnlyJpaTm
|
replicaJpaTm()
|
||||||
.getEntityManager()
|
.getEntityManager()
|
||||||
.createNativeQuery(queryBuilder.toString())
|
.createNativeQuery(queryBuilder.toString())
|
||||||
.setMaxResults(maxNameserversInFirstStage);
|
.setMaxResults(maxNameserversInFirstStage);
|
||||||
|
@ -570,15 +571,16 @@ public class RdapDomainSearchAction extends RdapSearchActionBase {
|
||||||
}
|
}
|
||||||
stream.forEach(domainSetBuilder::add);
|
stream.forEach(domainSetBuilder::add);
|
||||||
} else {
|
} else {
|
||||||
readOnlyJpaTm.transact(
|
replicaJpaTm()
|
||||||
|
.transact(
|
||||||
() -> {
|
() -> {
|
||||||
for (VKey<HostResource> hostKey : hostKeys) {
|
for (VKey<HostResource> hostKey : hostKeys) {
|
||||||
CriteriaQueryBuilder<DomainBase> queryBuilder =
|
CriteriaQueryBuilder<DomainBase> queryBuilder =
|
||||||
CriteriaQueryBuilder.create(DomainBase.class)
|
CriteriaQueryBuilder.create(replicaJpaTm(), DomainBase.class)
|
||||||
.whereFieldContains("nsHosts", hostKey)
|
.whereFieldContains("nsHosts", hostKey)
|
||||||
.orderByAsc("fullyQualifiedDomainName");
|
.orderByAsc("fullyQualifiedDomainName");
|
||||||
CriteriaBuilder criteriaBuilder =
|
CriteriaBuilder criteriaBuilder =
|
||||||
readOnlyJpaTm.getEntityManager().getCriteriaBuilder();
|
replicaJpaTm().getEntityManager().getCriteriaBuilder();
|
||||||
if (!shouldIncludeDeleted()) {
|
if (!shouldIncludeDeleted()) {
|
||||||
queryBuilder =
|
queryBuilder =
|
||||||
queryBuilder.where(
|
queryBuilder.where(
|
||||||
|
@ -591,7 +593,7 @@ public class RdapDomainSearchAction extends RdapSearchActionBase {
|
||||||
criteriaBuilder::greaterThan,
|
criteriaBuilder::greaterThan,
|
||||||
cursorString.get());
|
cursorString.get());
|
||||||
}
|
}
|
||||||
readOnlyJpaTm
|
replicaJpaTm()
|
||||||
.criteriaQuery(queryBuilder.build())
|
.criteriaQuery(queryBuilder.build())
|
||||||
.getResultStream()
|
.getResultStream()
|
||||||
.filter(this::isAuthorized)
|
.filter(this::isAuthorized)
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
package google.registry.rdap;
|
package google.registry.rdap;
|
||||||
|
|
||||||
import static com.google.common.collect.ImmutableList.toImmutableList;
|
import static com.google.common.collect.ImmutableList.toImmutableList;
|
||||||
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
|
import static google.registry.persistence.transaction.TransactionManagerFactory.replicaJpaTm;
|
||||||
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
|
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
|
||||||
import static google.registry.persistence.transaction.TransactionManagerUtil.transactIfJpaTm;
|
import static google.registry.persistence.transaction.TransactionManagerUtil.transactIfJpaTm;
|
||||||
import static google.registry.rdap.RdapUtils.getRegistrarByIanaIdentifier;
|
import static google.registry.rdap.RdapUtils.getRegistrarByIanaIdentifier;
|
||||||
|
@ -277,7 +277,7 @@ public class RdapEntitySearchAction extends RdapSearchActionBase {
|
||||||
resultSet = getMatchingResources(query, false, rdapResultSetMaxSize + 1);
|
resultSet = getMatchingResources(query, false, rdapResultSetMaxSize + 1);
|
||||||
} else {
|
} else {
|
||||||
resultSet =
|
resultSet =
|
||||||
jpaTm()
|
replicaJpaTm()
|
||||||
.transact(
|
.transact(
|
||||||
() -> {
|
() -> {
|
||||||
CriteriaQueryBuilder<ContactResource> builder =
|
CriteriaQueryBuilder<ContactResource> builder =
|
||||||
|
@ -399,7 +399,7 @@ public class RdapEntitySearchAction extends RdapSearchActionBase {
|
||||||
querySizeLimit);
|
querySizeLimit);
|
||||||
} else {
|
} else {
|
||||||
contactResultSet =
|
contactResultSet =
|
||||||
jpaTm()
|
replicaJpaTm()
|
||||||
.transact(
|
.transact(
|
||||||
() ->
|
() ->
|
||||||
getMatchingResourcesSql(
|
getMatchingResourcesSql(
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
package google.registry.rdap;
|
package google.registry.rdap;
|
||||||
|
|
||||||
import static google.registry.model.EppResourceUtils.loadByForeignKey;
|
import static google.registry.model.EppResourceUtils.loadByForeignKey;
|
||||||
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
|
import static google.registry.persistence.transaction.TransactionManagerFactory.replicaJpaTm;
|
||||||
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
|
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
|
||||||
import static google.registry.request.Action.Method.GET;
|
import static google.registry.request.Action.Method.GET;
|
||||||
import static google.registry.request.Action.Method.HEAD;
|
import static google.registry.request.Action.Method.HEAD;
|
||||||
|
@ -233,7 +233,7 @@ public class RdapNameserverSearchAction extends RdapSearchActionBase {
|
||||||
return makeSearchResults(
|
return makeSearchResults(
|
||||||
getMatchingResources(query, shouldIncludeDeleted(), querySizeLimit), CursorType.NAME);
|
getMatchingResources(query, shouldIncludeDeleted(), querySizeLimit), CursorType.NAME);
|
||||||
} else {
|
} else {
|
||||||
return jpaTm()
|
return replicaJpaTm()
|
||||||
.transact(
|
.transact(
|
||||||
() -> {
|
() -> {
|
||||||
CriteriaQueryBuilder<HostResource> queryBuilder =
|
CriteriaQueryBuilder<HostResource> queryBuilder =
|
||||||
|
@ -290,11 +290,11 @@ public class RdapNameserverSearchAction extends RdapSearchActionBase {
|
||||||
}
|
}
|
||||||
queryBuilder.append(" ORDER BY repo_id ASC");
|
queryBuilder.append(" ORDER BY repo_id ASC");
|
||||||
rdapResultSet =
|
rdapResultSet =
|
||||||
jpaTm()
|
replicaJpaTm()
|
||||||
.transact(
|
.transact(
|
||||||
() -> {
|
() -> {
|
||||||
javax.persistence.Query query =
|
javax.persistence.Query query =
|
||||||
jpaTm()
|
replicaJpaTm()
|
||||||
.getEntityManager()
|
.getEntityManager()
|
||||||
.createNativeQuery(queryBuilder.toString(), HostResource.class)
|
.createNativeQuery(queryBuilder.toString(), HostResource.class)
|
||||||
.setMaxResults(querySizeLimit);
|
.setMaxResults(querySizeLimit);
|
||||||
|
|
|
@ -16,7 +16,7 @@ package google.registry.rdap;
|
||||||
|
|
||||||
import static com.google.common.base.Charsets.UTF_8;
|
import static com.google.common.base.Charsets.UTF_8;
|
||||||
import static google.registry.model.ofy.ObjectifyService.auditedOfy;
|
import static google.registry.model.ofy.ObjectifyService.auditedOfy;
|
||||||
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
|
import static google.registry.persistence.transaction.TransactionManagerFactory.replicaJpaTm;
|
||||||
import static google.registry.util.DateTimeUtils.END_OF_TIME;
|
import static google.registry.util.DateTimeUtils.END_OF_TIME;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
|
@ -193,16 +193,17 @@ public abstract class RdapSearchActionBase extends RdapActionBase {
|
||||||
*/
|
*/
|
||||||
<T extends EppResource> RdapResultSet<T> getMatchingResourcesSql(
|
<T extends EppResource> RdapResultSet<T> getMatchingResourcesSql(
|
||||||
CriteriaQueryBuilder<T> builder, boolean checkForVisibility, int querySizeLimit) {
|
CriteriaQueryBuilder<T> builder, boolean checkForVisibility, int querySizeLimit) {
|
||||||
jpaTm().assertInTransaction();
|
replicaJpaTm().assertInTransaction();
|
||||||
Optional<String> desiredRegistrar = getDesiredRegistrar();
|
Optional<String> desiredRegistrar = getDesiredRegistrar();
|
||||||
if (desiredRegistrar.isPresent()) {
|
if (desiredRegistrar.isPresent()) {
|
||||||
builder =
|
builder =
|
||||||
builder.where(
|
builder.where(
|
||||||
"currentSponsorClientId", jpaTm().getEntityManager().getCriteriaBuilder()::equal,
|
"currentSponsorClientId",
|
||||||
|
replicaJpaTm().getEntityManager().getCriteriaBuilder()::equal,
|
||||||
desiredRegistrar.get());
|
desiredRegistrar.get());
|
||||||
}
|
}
|
||||||
List<T> queryResult =
|
List<T> queryResult =
|
||||||
jpaTm().criteriaQuery(builder.build()).setMaxResults(querySizeLimit).getResultList();
|
replicaJpaTm().criteriaQuery(builder.build()).setMaxResults(querySizeLimit).getResultList();
|
||||||
if (checkForVisibility) {
|
if (checkForVisibility) {
|
||||||
return filterResourcesByVisibility(queryResult, querySizeLimit);
|
return filterResourcesByVisibility(queryResult, querySizeLimit);
|
||||||
} else {
|
} else {
|
||||||
|
@ -395,7 +396,7 @@ public abstract class RdapSearchActionBase extends RdapActionBase {
|
||||||
RdapSearchPattern partialStringQuery,
|
RdapSearchPattern partialStringQuery,
|
||||||
Optional<String> cursorString,
|
Optional<String> cursorString,
|
||||||
DeletedItemHandling deletedItemHandling) {
|
DeletedItemHandling deletedItemHandling) {
|
||||||
jpaTm().assertInTransaction();
|
replicaJpaTm().assertInTransaction();
|
||||||
if (partialStringQuery.getInitialString().length()
|
if (partialStringQuery.getInitialString().length()
|
||||||
< RdapSearchPattern.MIN_INITIAL_STRING_LENGTH) {
|
< RdapSearchPattern.MIN_INITIAL_STRING_LENGTH) {
|
||||||
throw new UnprocessableEntityException(
|
throw new UnprocessableEntityException(
|
||||||
|
@ -403,8 +404,8 @@ public abstract class RdapSearchActionBase extends RdapActionBase {
|
||||||
"Initial search string must be at least %d characters",
|
"Initial search string must be at least %d characters",
|
||||||
RdapSearchPattern.MIN_INITIAL_STRING_LENGTH));
|
RdapSearchPattern.MIN_INITIAL_STRING_LENGTH));
|
||||||
}
|
}
|
||||||
CriteriaBuilder criteriaBuilder = jpaTm().getEntityManager().getCriteriaBuilder();
|
CriteriaBuilder criteriaBuilder = replicaJpaTm().getEntityManager().getCriteriaBuilder();
|
||||||
CriteriaQueryBuilder<T> builder = CriteriaQueryBuilder.create(clazz);
|
CriteriaQueryBuilder<T> builder = CriteriaQueryBuilder.create(replicaJpaTm(), clazz);
|
||||||
if (partialStringQuery.getHasWildcard()) {
|
if (partialStringQuery.getHasWildcard()) {
|
||||||
builder =
|
builder =
|
||||||
builder.where(
|
builder.where(
|
||||||
|
@ -493,9 +494,9 @@ public abstract class RdapSearchActionBase extends RdapActionBase {
|
||||||
"Initial search string must be at least %d characters",
|
"Initial search string must be at least %d characters",
|
||||||
RdapSearchPattern.MIN_INITIAL_STRING_LENGTH));
|
RdapSearchPattern.MIN_INITIAL_STRING_LENGTH));
|
||||||
}
|
}
|
||||||
jpaTm().assertInTransaction();
|
replicaJpaTm().assertInTransaction();
|
||||||
CriteriaQueryBuilder<T> builder = CriteriaQueryBuilder.create(clazz);
|
CriteriaQueryBuilder<T> builder = CriteriaQueryBuilder.create(replicaJpaTm(), clazz);
|
||||||
CriteriaBuilder criteriaBuilder = jpaTm().getEntityManager().getCriteriaBuilder();
|
CriteriaBuilder criteriaBuilder = replicaJpaTm().getEntityManager().getCriteriaBuilder();
|
||||||
builder = builder.where(filterField, criteriaBuilder::equal, queryString);
|
builder = builder.where(filterField, criteriaBuilder::equal, queryString);
|
||||||
if (cursorString.isPresent()) {
|
if (cursorString.isPresent()) {
|
||||||
if (cursorField.isPresent()) {
|
if (cursorField.isPresent()) {
|
||||||
|
@ -544,7 +545,7 @@ public abstract class RdapSearchActionBase extends RdapActionBase {
|
||||||
RdapSearchPattern partialStringQuery,
|
RdapSearchPattern partialStringQuery,
|
||||||
Optional<String> cursorString,
|
Optional<String> cursorString,
|
||||||
DeletedItemHandling deletedItemHandling) {
|
DeletedItemHandling deletedItemHandling) {
|
||||||
jpaTm().assertInTransaction();
|
replicaJpaTm().assertInTransaction();
|
||||||
return queryItemsSql(clazz, "repoId", partialStringQuery, cursorString, deletedItemHandling);
|
return queryItemsSql(clazz, "repoId", partialStringQuery, cursorString, deletedItemHandling);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -553,7 +554,9 @@ public abstract class RdapSearchActionBase extends RdapActionBase {
|
||||||
if (!Objects.equals(deletedItemHandling, DeletedItemHandling.INCLUDE)) {
|
if (!Objects.equals(deletedItemHandling, DeletedItemHandling.INCLUDE)) {
|
||||||
builder =
|
builder =
|
||||||
builder.where(
|
builder.where(
|
||||||
"deletionTime", jpaTm().getEntityManager().getCriteriaBuilder()::equal, END_OF_TIME);
|
"deletionTime",
|
||||||
|
replicaJpaTm().getEntityManager().getCriteriaBuilder()::equal,
|
||||||
|
END_OF_TIME);
|
||||||
}
|
}
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ package google.registry.persistence.transaction;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
|
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
|
||||||
|
import static google.registry.persistence.transaction.TransactionManagerFactory.replicaJpaTm;
|
||||||
import static google.registry.testing.DatabaseHelper.insertInDb;
|
import static google.registry.testing.DatabaseHelper.insertInDb;
|
||||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||||
|
|
||||||
|
@ -62,6 +63,17 @@ public class JpaTransactionManagerExtensionTest {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testReplicaJpaTm() {
|
||||||
|
TestEntity testEntity = new TestEntity("foo", "bar");
|
||||||
|
assertThat(
|
||||||
|
assertThrows(
|
||||||
|
PersistenceException.class,
|
||||||
|
() -> replicaJpaTm().transact(() -> replicaJpaTm().put(testEntity))))
|
||||||
|
.hasMessageThat()
|
||||||
|
.isEqualTo("Error while committing the transaction");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testExtraParameters() {
|
void testExtraParameters() {
|
||||||
// This test verifies that 1) withEntityClass() has registered TestEntity and 2) The table
|
// This test verifies that 1) withEntityClass() has registered TestEntity and 2) The table
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
package google.registry.rdap;
|
package google.registry.rdap;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
|
|
||||||
import static google.registry.rdap.RdapTestHelper.assertThat;
|
import static google.registry.rdap.RdapTestHelper.assertThat;
|
||||||
import static google.registry.rdap.RdapTestHelper.parseJsonObject;
|
import static google.registry.rdap.RdapTestHelper.parseJsonObject;
|
||||||
import static google.registry.request.Action.Method.POST;
|
import static google.registry.request.Action.Method.POST;
|
||||||
|
@ -46,7 +45,6 @@ import google.registry.model.registrar.Registrar;
|
||||||
import google.registry.model.reporting.HistoryEntry;
|
import google.registry.model.reporting.HistoryEntry;
|
||||||
import google.registry.model.tld.Registry;
|
import google.registry.model.tld.Registry;
|
||||||
import google.registry.persistence.VKey;
|
import google.registry.persistence.VKey;
|
||||||
import google.registry.persistence.transaction.ReplicaSimulatingJpaTransactionManager;
|
|
||||||
import google.registry.rdap.RdapMetrics.EndpointType;
|
import google.registry.rdap.RdapMetrics.EndpointType;
|
||||||
import google.registry.rdap.RdapMetrics.SearchType;
|
import google.registry.rdap.RdapMetrics.SearchType;
|
||||||
import google.registry.rdap.RdapMetrics.WildcardType;
|
import google.registry.rdap.RdapMetrics.WildcardType;
|
||||||
|
@ -376,7 +374,6 @@ class RdapDomainSearchActionTest extends RdapSearchActionTestCase<RdapDomainSear
|
||||||
action.nsIpParam = Optional.empty();
|
action.nsIpParam = Optional.empty();
|
||||||
action.cursorTokenParam = Optional.empty();
|
action.cursorTokenParam = Optional.empty();
|
||||||
action.requestPath = actionPath;
|
action.requestPath = actionPath;
|
||||||
action.readOnlyJpaTm = jpaTm();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private JsonObject generateExpectedJsonForTwoDomainsNsReply() {
|
private JsonObject generateExpectedJsonForTwoDomainsNsReply() {
|
||||||
|
@ -724,18 +721,6 @@ class RdapDomainSearchActionTest extends RdapSearchActionTestCase<RdapDomainSear
|
||||||
verifyMetrics(SearchType.BY_DOMAIN_NAME, Optional.of(1L));
|
verifyMetrics(SearchType.BY_DOMAIN_NAME, Optional.of(1L));
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestSqlOnly
|
|
||||||
void testDomainMatch_readOnlyReplica() {
|
|
||||||
login("evilregistrar");
|
|
||||||
rememberWildcardType("cat.lol");
|
|
||||||
action.readOnlyJpaTm = new ReplicaSimulatingJpaTransactionManager(jpaTm());
|
|
||||||
action.nameParam = Optional.of("cat.lol");
|
|
||||||
action.parameterMap = ImmutableListMultimap.of("name", "cat.lol");
|
|
||||||
action.run();
|
|
||||||
assertThat(response.getPayload()).contains("Yes Virginia <script>");
|
|
||||||
assertThat(response.getStatus()).isEqualTo(200);
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestOfyAndSql
|
@TestOfyAndSql
|
||||||
void testDomainMatch_foundWithUpperCase() {
|
void testDomainMatch_foundWithUpperCase() {
|
||||||
login("evilregistrar");
|
login("evilregistrar");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue