// 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.ofy; import static java.util.Collections.synchronizedList; import com.google.appengine.api.datastore.AsyncDatastoreService; import com.google.appengine.api.datastore.DatastoreAttributes; import com.google.appengine.api.datastore.Entity; import com.google.appengine.api.datastore.Index; import com.google.appengine.api.datastore.Index.IndexState; import com.google.appengine.api.datastore.Key; import com.google.appengine.api.datastore.KeyRange; import com.google.appengine.api.datastore.PreparedQuery; import com.google.appengine.api.datastore.Query; import com.google.appengine.api.datastore.Transaction; import com.google.appengine.api.datastore.TransactionOptions; import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.concurrent.Future; /** A proxy for {@link AsyncDatastoreService} that exposes call counts. */ public class RequestCapturingAsyncDatastoreService implements AsyncDatastoreService { private final AsyncDatastoreService delegate; // Each outer lists represents datastore operations, with inner lists representing the keys or // entities involved in that operation. We use static lists because we care about overall calls to // datastore, not calls via a specific instance of the service. private static List> reads = synchronizedList(new ArrayList>()); private static List> deletes = synchronizedList(new ArrayList>()); private static List> puts = synchronizedList(new ArrayList>()); RequestCapturingAsyncDatastoreService(AsyncDatastoreService delegate) { this.delegate = delegate; } public static List> getReads() { return reads; } public static List> getDeletes() { return deletes; } public static List> getPuts() { return puts; } @Override public Collection getActiveTransactions() { return delegate.getActiveTransactions(); } @Override public Transaction getCurrentTransaction() { return delegate.getCurrentTransaction(); } @Override public Transaction getCurrentTransaction(Transaction transaction) { return delegate.getCurrentTransaction(transaction); } @Override public PreparedQuery prepare(Query query) { return delegate.prepare(query); } @Override public PreparedQuery prepare(Transaction transaction, Query query) { return delegate.prepare(transaction, query); } @Override public Future allocateIds(String kind, long num) { return delegate.allocateIds(kind, num); } @Override public Future allocateIds(Key parent, String kind, long num) { return delegate.allocateIds(parent, kind, num); } @Override public Future beginTransaction() { return delegate.beginTransaction(); } @Override public Future beginTransaction(TransactionOptions transaction) { return delegate.beginTransaction(transaction); } @Override public Future delete(Key... keys) { deletes.add(ImmutableList.copyOf(keys)); return delegate.delete(keys); } @Override public Future delete(Iterable keys) { deletes.add(ImmutableList.copyOf(keys)); return delegate.delete(keys); } @Override public Future delete(Transaction transaction, Key... keys) { deletes.add(ImmutableList.copyOf(keys)); return delegate.delete(transaction, keys); } @Override public Future delete(Transaction transaction, Iterable keys) { deletes.add(ImmutableList.copyOf(keys)); return delegate.delete(transaction, keys); } @Override public Future get(Key key) { reads.add(ImmutableList.of(key)); return delegate.get(key); } @Override public Future> get(Iterable keys) { reads.add(ImmutableList.copyOf(keys)); return delegate.get(keys); } @Override public Future get(Transaction transaction, Key key) { reads.add(ImmutableList.of(key)); return delegate.get(transaction, key); } @Override public Future> get(Transaction transaction, Iterable keys) { reads.add(ImmutableList.copyOf(keys)); return delegate.get(transaction, keys); } @Override public Future getDatastoreAttributes() { return delegate.getDatastoreAttributes(); } @Override public Future> getIndexes() { return delegate.getIndexes(); } @Override public Future put(Entity entity) { puts.add(ImmutableList.of(entity)); return delegate.put(entity); } @Override public Future> put(Iterable entities) { puts.add(ImmutableList.copyOf(entities)); return delegate.put(entities); } @Override public Future put(Transaction transaction, Entity entity) { puts.add(ImmutableList.of(entity)); return delegate.put(transaction, entity); } @Override public Future> put(Transaction transaction, Iterable entities) { puts.add(ImmutableList.copyOf(entities)); return delegate.put(transaction, entities); } }