/**
* Licensed to JumpMind Inc under one or more contributor
* license agreements. See the NOTICE file distributed
* with this work for additional information regarding
* copyright ownership. JumpMind Inc licenses this file
* to you under the GNU General Public License, version 3.0 (GPLv3)
* (the "License"); you may not use this file except in compliance
* with the License.
*
* You should have received a copy of the GNU General Public License,
* version 3.0 (GPLv3) along with this library; if not, see
* <http://www.gnu.org/licenses/>.
*
* 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 org.jumpmind.symmetric.model;
import java.io.Serializable;
import java.util.Date;
import org.jumpmind.symmetric.io.data.Batch;
import org.jumpmind.symmetric.io.data.DataEventType;
/**
* Used for tracking the sending a collection of data to a node in the system. A
* new outgoing_batch is created and given a status of 'NE'. After sending the
* outgoing_batch to its target node, the status becomes 'SE'. The node responds
* with either a success status of 'OK' or an error status of 'ER'. An error
* while sending to the node also results in an error status of 'ER' regardless
* of whether the node sends that acknowledgement.
*/
public class OutgoingBatch implements Serializable {
private static final long serialVersionUID = 1L;
public enum Status {
OK("Ok"), ER("Error"), RQ("Request"), NE("New"), QY("Querying"), SE("Sending"), LD("Loading"), RT("Routing"), IG("Ignored"),;
private String description;
Status(String description) {
this.description = description;
}
@Override
public String toString() {
return description;
}
public static boolean inProgress(Status status) {
return status != OK && status != RQ && status != RT && status != IG && status != NE;
}
}
private long batchId = -1;
private String nodeId;
private String channelId;
private long loadId = -1;
private Status status = Status.RT;
private boolean loadFlag;
private boolean errorFlag;
private boolean extractJobFlag;
private boolean commonFlag;
private long routerMillis;
private long networkMillis;
private long filterMillis;
private long loadMillis;
private long extractMillis;
private long byteCount;
private long sentCount;
private long extractCount;
private long loadCount;
private long ignoreCount;
private long dataEventCount;
private long reloadEventCount;
private long insertEventCount;
private long updateEventCount;
private long deleteEventCount;
private long otherEventCount;
private long failedDataId;
private String sqlState;
private int sqlCode;
private String sqlMessage;
private String lastUpdatedHostName;
private Date lastUpdatedTime;
private Date createTime;
private String createBy;
private long oldDataEventCount = 0;
private long oldByteCount = 0;
private long oldFilterMillis = 0;
private long oldExtractMillis = 0;
private long oldLoadMillis = 0;
private long oldNetworkMillis = 0;
public OutgoingBatch() {
}
public OutgoingBatch(String nodeId, long batchId, String channelId, Status status) {
this(nodeId, channelId, status);
this.batchId = batchId;
}
public OutgoingBatch(String nodeId, String channelId, Status status) {
this.nodeId = nodeId;
this.channelId = channelId;
this.status = status;
this.createTime = new Date();
}
public void resetStats() {
// save off old stats in case there
// is an error and we want to be able to
// restore the previous stats
this.oldByteCount = this.byteCount;
this.oldDataEventCount = this.dataEventCount;
this.oldExtractMillis = this.extractMillis;
this.oldLoadMillis = this.loadMillis;
this.oldNetworkMillis = this.networkMillis;
this.oldFilterMillis = this.filterMillis;
this.dataEventCount = 0;
this.byteCount = 0;
this.filterMillis = 0;
this.extractMillis = 0;
this.loadMillis = 0;
this.networkMillis = 0;
}
public void revertStatsOnError() {
if (this.oldDataEventCount > 0) {
this.byteCount = this.oldByteCount;
this.dataEventCount = this.oldDataEventCount;
this.extractMillis = this.oldExtractMillis;
this.loadMillis = this.oldLoadMillis;
this.networkMillis = this.oldNetworkMillis;
this.filterMillis = this.oldFilterMillis;
}
}
public void setErrorFlag(boolean errorFlag) {
this.errorFlag = errorFlag;
}
public boolean isErrorFlag() {
return errorFlag;
}
public void setLoadFlag(boolean loadFlag) {
this.loadFlag = loadFlag;
}
public boolean isLoadFlag() {
return loadFlag;
}
public void setSentCount(long sentCount) {
this.sentCount = sentCount;
}
public long getSentCount() {
return sentCount;
}
public void setExtractCount(long extractCount) {
this.extractCount = extractCount;
}
public long getExtractCount() {
return extractCount;
}
public void setLoadCount(long loadCount) {
this.loadCount = loadCount;
}
public long getLoadCount() {
return loadCount;
}
public String getNodeBatchId() {
return String.format("%s-%d", nodeId, batchId);
}
public long getBatchId() {
return batchId;
}
public void setBatchId(long batchId) {
this.batchId = batchId;
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
public String getNodeId() {
return nodeId;
}
public void setNodeId(String locationId) {
this.nodeId = locationId;
}
public String getChannelId() {
return channelId;
}
public void setChannelId(String channelId) {
this.channelId = channelId;
}
public void setStatus(String status) {
this.status = Status.valueOf(status);
}
public long getRouterMillis() {
return routerMillis;
}
public void setUpdateEventCount(long updateEventCount) {
this.updateEventCount = updateEventCount;
}
public long getUpdateEventCount() {
return updateEventCount;
}
public void setDeleteEventCount(long deleteEventCount) {
this.deleteEventCount = deleteEventCount;
}
public long getDeleteEventCount() {
return deleteEventCount;
}
public void incrementEventCount(DataEventType type) {
switch (type) {
case RELOAD:
reloadEventCount++;
break;
case INSERT:
insertEventCount++;
break;
case UPDATE:
updateEventCount++;
break;
case DELETE:
deleteEventCount++;
break;
default:
otherEventCount++;
break;
}
}
public void setInsertEventCount(long insertEventCount) {
this.insertEventCount = insertEventCount;
}
public long getInsertEventCount() {
return insertEventCount;
}
public void setOtherEventCount(long otherEventCount) {
this.otherEventCount = otherEventCount;
}
public long getOtherEventCount() {
return otherEventCount;
}
public void setReloadEventCount(long reloadEventCount) {
this.reloadEventCount = reloadEventCount;
}
public long getReloadEventCount() {
return reloadEventCount;
}
public void setRouterMillis(long routerMillis) {
this.routerMillis = routerMillis;
}
public long getNetworkMillis() {
return networkMillis;
}
public void setNetworkMillis(long networkMillis) {
this.networkMillis = networkMillis;
}
public long getFilterMillis() {
return filterMillis;
}
public void setFilterMillis(long filterMillis) {
this.filterMillis = filterMillis;
}
public long getLoadMillis() {
return loadMillis;
}
public void setLoadMillis(long databaseMillis) {
this.loadMillis = databaseMillis;
}
public long getByteCount() {
return byteCount;
}
public void setByteCount(long byteCount) {
this.byteCount = byteCount;
}
public long getDataEventCount() {
return dataEventCount;
}
public void setDataEventCount(long dataEventCount) {
this.dataEventCount = dataEventCount;
}
public void setExtractMillis(long extractMillis) {
this.extractMillis = extractMillis;
}
public long getExtractMillis() {
return extractMillis;
}
public void incrementDataEventCount() {
this.dataEventCount++;
}
public void incrementInsertEventCount() {
this.insertEventCount++;
}
public void incrementByteCount(int size) {
this.byteCount += size;
}
public long getFailedDataId() {
return failedDataId;
}
public void setFailedDataId(long failedDataId) {
this.failedDataId = failedDataId;
}
public String getSqlState() {
return sqlState;
}
public void setSqlState(String sqlState) {
this.sqlState = sqlState;
}
public int getSqlCode() {
return sqlCode;
}
public void setSqlCode(int sqlCode) {
this.sqlCode = sqlCode;
}
public String getSqlMessage() {
return sqlMessage;
}
public void setSqlMessage(String sqlMessage) {
this.sqlMessage = sqlMessage;
}
public String getLastUpdatedHostName() {
return lastUpdatedHostName;
}
public void setLastUpdatedHostName(String lastUpdatedHostName) {
this.lastUpdatedHostName = lastUpdatedHostName;
}
public Date getLastUpdatedTime() {
if (lastUpdatedTime == null) {
return new Date();
} else {
return lastUpdatedTime;
}
}
public void setLastUpdatedTime(Date lastUpdatedTime) {
this.lastUpdatedTime = lastUpdatedTime;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public void setIgnoreCount(long ignoreCount) {
this.ignoreCount = ignoreCount;
}
public long getIgnoreCount() {
return ignoreCount;
}
public void incrementIgnoreCount() {
ignoreCount++;
}
public long totalEventCount() {
return insertEventCount + updateEventCount + deleteEventCount + otherEventCount;
}
public void setCommonFlag(boolean commonFlag) {
this.commonFlag = commonFlag;
}
public boolean isCommonFlag() {
return commonFlag;
}
public String getStagedLocation() {
return Batch.getStagedLocation(commonFlag, nodeId);
}
@Override
public String toString() {
return String.format("%s-%d-%s", nodeId, batchId, channelId);
}
public void setCreateBy(String createBy) {
this.createBy = createBy;
}
public String getCreateBy() {
return createBy;
}
public void setLoadId(long loadId) {
this.loadId = loadId;
}
public long getLoadId() {
return loadId;
}
public void setExtractJobFlag(boolean extractJobFlag) {
this.extractJobFlag = extractJobFlag;
}
public boolean isExtractJobFlag() {
return extractJobFlag;
}
}