/* * Copyright 1999-2019 Seata.io Group. * * 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 io.seata.server.storage.file; import io.seata.common.exception.ShouldNeverHappenException; import io.seata.server.session.BranchSession; import io.seata.server.session.GlobalSession; import io.seata.server.store.SessionStorable; import io.seata.server.store.TransactionStoreManager.LogOperation; import java.nio.ByteBuffer; /** * The type Transaction write store. * * @author slievrly */ public class TransactionWriteStore implements SessionStorable { private SessionStorable sessionRequest; private LogOperation operate; /** * Instantiates a new Transaction write store. * * @param sessionRequest the session request * @param operate the operate */ public TransactionWriteStore(SessionStorable sessionRequest, LogOperation operate) { this.sessionRequest = sessionRequest; this.operate = operate; } /** * Instantiates a new Transaction write store. */ public TransactionWriteStore() {} /** * Gets session request. * * @return the session request */ public SessionStorable getSessionRequest() { return sessionRequest; } /** * Sets session request. * * @param sessionRequest the session request */ public void setSessionRequest(SessionStorable sessionRequest) { this.sessionRequest = sessionRequest; } /** * Gets operate. * * @return the operate */ public LogOperation getOperate() { return operate; } /** * Sets operate. * * @param operate the operate */ public void setOperate(LogOperation operate) { this.operate = operate; } @Override public byte[] encode() { byte[] bySessionRequest = this.sessionRequest.encode(); byte byOpCode = this.getOperate().getCode(); int len = bySessionRequest.length + 1; byte[] byResult = new byte[len]; ByteBuffer byteBuffer = ByteBuffer.wrap(byResult); byteBuffer.put(bySessionRequest); byteBuffer.put(byOpCode); return byResult; } @Override public void decode(byte[] src) { ByteBuffer byteBuffer = ByteBuffer.wrap(src); byte[] bySessionRequest = new byte[src.length - 1]; byteBuffer.get(bySessionRequest); byte byOpCode = byteBuffer.get(); this.operate = LogOperation.getLogOperationByCode(byOpCode); SessionStorable tmpSessionStorable = getSessionInstanceByOperation(this.operate); tmpSessionStorable.decode(bySessionRequest); this.sessionRequest = tmpSessionStorable; } private SessionStorable getSessionInstanceByOperation(LogOperation logOperation) { SessionStorable sessionStorable = null; switch (logOperation) { case GLOBAL_ADD: case GLOBAL_UPDATE: case GLOBAL_REMOVE: sessionStorable = new GlobalSession(); break; case BRANCH_ADD: case BRANCH_UPDATE: case BRANCH_REMOVE: sessionStorable = new BranchSession(); break; default: throw new ShouldNeverHappenException("incorrect logOperation"); } return sessionStorable; } }