+ private static class ShardTransactionCreator implements Creator<ShardTransaction> {
+
+ private static final long serialVersionUID = 1L;
+
+ final AbstractShardDataTreeTransaction<?> transaction;
+ final ActorRef shardActor;
+ final DatastoreContext datastoreContext;
+ final ShardStats shardStats;
+ final TransactionType type;
+
+ ShardTransactionCreator(TransactionType type, AbstractShardDataTreeTransaction<?> transaction, ActorRef shardActor,
+ DatastoreContext datastoreContext, ShardStats shardStats) {
+ this.transaction = Preconditions.checkNotNull(transaction);
+ this.shardActor = shardActor;
+ this.shardStats = shardStats;
+ this.datastoreContext = datastoreContext;
+ this.type = type;
+ }
+
+ @Override
+ public ShardTransaction create() throws Exception {
+ final ShardTransaction tx;
+ switch (type) {
+ case READ_ONLY:
+ tx = new ShardReadTransaction(transaction, shardActor, shardStats);
+ break;
+ case READ_WRITE:
+ tx = new ShardReadWriteTransaction((ReadWriteShardDataTreeTransaction)transaction, shardActor, shardStats);
+ break;
+ case WRITE_ONLY:
+ tx = new ShardWriteTransaction((ReadWriteShardDataTreeTransaction)transaction, shardActor, shardStats);
+ break;
+ default:
+ throw new IllegalArgumentException("Unhandled transaction type " + type);
+ }
+
+ tx.getContext().setReceiveTimeout(datastoreContext.getShardTransactionIdleTimeout());
+ return tx;
+ }
+ }