/* * Copyright (c) 2008-2014 MongoDB, Inc. * * 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 com.mongodb.async.client; import com.mongodb.ReadPreference; import com.mongodb.async.SingleResultCallback; import com.mongodb.operation.AsyncOperationExecutor; import com.mongodb.operation.AsyncReadOperation; import com.mongodb.operation.AsyncWriteOperation; import java.util.ArrayList; import java.util.List; @SuppressWarnings({ "rawtypes", "unchecked" }) public class TestOperationExecutor implements AsyncOperationExecutor { private final List<Object> responses; private final boolean queueExecution; private final List<ReadPreference> readPreferences = new ArrayList<ReadPreference>(); private final List<AsyncReadOperation> queuedReadOperations = new ArrayList<AsyncReadOperation>(); private final List<AsyncWriteOperation> queuedWriteOperations = new ArrayList<AsyncWriteOperation>(); private final List<SingleResultCallback> queuedReadCallbacks = new ArrayList<SingleResultCallback>(); private final List<SingleResultCallback> queuedWriteCallbacks = new ArrayList<SingleResultCallback>(); private final List<AsyncReadOperation> readOperations = new ArrayList<AsyncReadOperation>(); private final List<AsyncWriteOperation> writeOperations = new ArrayList<AsyncWriteOperation>(); TestOperationExecutor(final List<Object> responses) { this(responses, false); } TestOperationExecutor(final List<Object> responses, final boolean queueExecution) { this.responses = responses; this.queueExecution = queueExecution; } @Override public <T> void execute(final AsyncReadOperation<T> operation, final ReadPreference readPreference, final SingleResultCallback<T> callback) { readPreferences.add(readPreference); if (queueExecution) { queuedReadOperations.add(operation); queuedReadCallbacks.add(callback); } else { readOperations.add(operation); callResult(callback); } } @Override public <T> void execute(final AsyncWriteOperation<T> operation, final SingleResultCallback<T> callback) { if (queueExecution) { queuedWriteOperations.add(operation); queuedWriteCallbacks.add(callback); } else { writeOperations.add(operation); callResult(callback); } } public void proceedWithRead() { readOperations.add(queuedReadOperations.remove(0)); callResult(queuedReadCallbacks.remove(0)); } public void proceedWithWrite() { writeOperations.add(queuedWriteOperations.remove(0)); callResult(queuedWriteCallbacks.remove(0)); } <T> void callResult(final SingleResultCallback<T> callback) { Object response = responses.remove(0); if (response instanceof Throwable) { callback.onResult(null, (Throwable) response); } else { callback.onResult((T) response, null); } } AsyncReadOperation getReadOperation() { return readOperations.isEmpty() ? null : readOperations.remove(0); } ReadPreference getReadPreference() { return readPreferences.isEmpty() ? null : readPreferences.remove(0); } AsyncWriteOperation getWriteOperation() { return writeOperations.isEmpty() ? null : writeOperations.remove(0); } }