/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.alibaba.wasp.fserver.redo;
import com.alibaba.wasp.protobuf.generated.MetaProtos.TransactionProto;
import com.alibaba.wasp.protobuf.generated.WaspProtos.Mutate;
import com.alibaba.wasp.util.MutateList;
import com.google.protobuf.InvalidProtocolBufferException;
import org.apache.hadoop.hbase.util.Bytes;
import java.util.List;
public class Transaction {
/** Id */
long transactionID;
private static final String rowSuffix = "_tid";
private byte[] key;
private String keyStr;
private boolean commited = false;
/** Put and Delete **/
private MutateList edits = new MutateList();
public Transaction(long transactionID) {
this.transactionID = transactionID;
initlize();
}
public Transaction() {
this(System.currentTimeMillis());
}
private void initlize() {
this.keyStr = (Long.MAX_VALUE - this.transactionID) + rowSuffix;
this.key = Bytes.toBytes(keyStr);
}
/**
* @param transactionID
* the transactionID to set
*/
public void setTransactionID(long transactionID) {
this.transactionID = transactionID;
initlize();
}
/**
* @return the transactionID
*/
public long getTransactionID() {
return transactionID;
}
/**
* @return the commited
*/
public boolean isCommited() {
return commited;
}
/**
* @param transactionID
* the commited to set
*/
public void commit(long transactionID) {
if (transactionID == this.transactionID) {
this.commited = true;
}
}
/**
* @return the key
*/
public byte[] getKey() {
return key;
}
public String getKeyStr() {
return this.keyStr;
}
public void addEntity(Mutate mutate) {
edits.add(mutate);
}
public void setTransactionEdits(List<Mutate> edits) {
this.edits.setMutates(edits);
}
/**
* @return the edits
*/
public List<Mutate> getEdits() {
return edits.getMutates();
}
/**
* return this byte[] of this object.
*
* @return
*/
public byte[] getTransactionEntity() {
TransactionProto tProto = conver(this);
return tProto.toByteArray();
}
/**
* Parse data to Transaction.
*
* @param data
* @return
*/
public static Transaction convert(byte[] data) {
TransactionProto tProto;
try {
tProto = TransactionProto.parseFrom(data);
Transaction t = new Transaction(tProto.getTid());
t.setTransactionEdits(tProto.getMutatesList());
return t;
} catch (InvalidProtocolBufferException e) {
RedoLog.LOG.error("Failed from TransactionProto.parseFrom.", e);
return null;
}
}
/**
* convert Java Object to protobuf object.
*
* @param t
* @return
*/
public static TransactionProto conver(Transaction t) {
TransactionProto.Builder builder = TransactionProto.newBuilder();
builder.setTid(t.getTransactionID());
builder.addAllMutates(t.edits.getMutates());
return builder.build();
}
}