-public class ShardTransaction extends UntypedActor {
-
- private final DOMStoreReadWriteTransaction transaction;
-
- private final LoggingAdapter log = Logging.getLogger(getContext().system(), this);
-
- public ShardTransaction(DOMStoreReadWriteTransaction transaction) {
- this.transaction = transaction;
- }
-
-
- public static Props props(final DOMStoreReadWriteTransaction transaction){
- return Props.create(new Creator<ShardTransaction>(){
-
- @Override
- public ShardTransaction create() throws Exception {
- return new ShardTransaction(transaction);
- }
- });
- }
-
- @Override
- public void onReceive(Object message) throws Exception {
- if(message instanceof ReadData){
- readData((ReadData) message);
- } else if(message instanceof WriteData){
- writeData((WriteData) message);
- } else if(message instanceof MergeData){
- mergeData((MergeData) message);
- } else if(message instanceof DeleteData){
- deleteData((DeleteData) message);
- } else if(message instanceof ReadyTransaction){
- readyTransaction((ReadyTransaction) message);
- } else if(message instanceof CloseTransaction){
- closeTransaction((CloseTransaction) message);
+public abstract class ShardTransaction extends AbstractUntypedActorWithMetering {
+ private final ActorRef shardActor;
+ private final ShardStats shardStats;
+ private final TransactionIdentifier transactionId;
+
+ protected ShardTransaction(final ActorRef shardActor, final ShardStats shardStats,
+ final TransactionIdentifier transactionId) {
+ // actor name override used for metering. This does not change the "real" actor name
+ super("shard-tx");
+ this.shardActor = shardActor;
+ this.shardStats = shardStats;
+ this.transactionId = requireNonNull(transactionId);
+ }
+
+ public static Props props(final TransactionType type, final AbstractShardDataTreeTransaction<?> transaction,
+ final ActorRef shardActor, final DatastoreContext datastoreContext, final ShardStats shardStats) {
+ return Props.create(ShardTransaction.class,
+ new ShardTransactionCreator(type, transaction, shardActor, datastoreContext, shardStats));
+ }
+
+ protected abstract AbstractShardDataTreeTransaction<?> getDOMStoreTransaction();
+
+ protected ActorRef getShardActor() {
+ return shardActor;
+ }
+
+ protected final TransactionIdentifier getTransactionId() {
+ return transactionId;
+ }
+
+ @Override
+ public void handleReceive(final Object message) {
+ if (CloseTransaction.isSerializedType(message)) {
+ closeTransaction(true);
+ } else if (message instanceof ReceiveTimeout) {
+ LOG.debug("Got ReceiveTimeout for inactivity - closing transaction {}", transactionId);
+ closeTransaction(false);
+ } else {
+ unknownMessage(message);
+ }
+ }
+
+ protected boolean returnCloseTransactionReply() {
+ return true;