/**
* 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.List;
import java.util.Map;
/**
* Indicates the status of an attempt to transport data from or to a remove
* node.
*/
public class RemoteNodeStatus implements Serializable {
private static final long serialVersionUID = 1L;
public static enum Status {
OFFLINE, BUSY, NOT_AUTHORIZED, REGISTRATION_REQUIRED, SYNC_DISABLED, NO_DATA, DATA_PROCESSED, DATA_ERROR, UNKNOWN_ERROR
};
private String nodeId;
private String channelId;
private Status status;
private long dataProcessed;
private long batchesProcessed;
private long reloadBatchesProcessed;
private boolean complete = false;
// TODO for the time being this needs to support multiple channels (until everything supports parallel channels)
private Map<String, Channel> channels;
public RemoteNodeStatus(String nodeId, String channelId, Map<String, Channel> channels) {
this.status = Status.NO_DATA;
this.channelId = channelId;
this.nodeId = nodeId;
this.channels = channels;
}
public RemoteNodeStatus(String nodeId, Map<String, Channel> channels) {
this(nodeId, null, channels);
}
public boolean failed() {
return status != Status.NO_DATA && status != Status.DATA_PROCESSED;
}
public String getChannelId() {
return channelId;
}
public String getNodeId() {
return nodeId;
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
public long getDataProcessed() {
return dataProcessed;
}
public long getBatchesProcessed() {
return batchesProcessed;
}
public long getReloadBatchesProcessed() {
return reloadBatchesProcessed;
}
public void updateIncomingStatus(List<IncomingBatch> incomingBatches) {
if (incomingBatches != null) {
for (IncomingBatch incomingBatch : incomingBatches) {
dataProcessed += incomingBatch.getStatementCount();
batchesProcessed++;
if (incomingBatch.getStatus() == org.jumpmind.symmetric.model.IncomingBatch.Status.ER) {
status = Status.DATA_ERROR;
}
}
}
if (status != Status.DATA_ERROR && dataProcessed > 0) {
status = Status.DATA_PROCESSED;
}
}
public void updateOutgoingStatus(List<OutgoingBatch> outgoingBatches, List<BatchAck> batches) {
if (batches != null) {
for (BatchAck batch : batches) {
if (batch.getStatus() == OutgoingBatch.Status.ER) {
status = Status.DATA_ERROR;
}
}
}
if (outgoingBatches != null) {
for (OutgoingBatch batch : outgoingBatches) {
batchesProcessed++;
dataProcessed += batch.totalEventCount();
Channel channel = channels.get(batch.getChannelId());
if (channel != null && channel.isReloadFlag()) {
reloadBatchesProcessed++;
}
if (batch.getStatus() == OutgoingBatch.Status.ER) {
status = Status.DATA_ERROR;
}
}
}
if (status != Status.DATA_ERROR && dataProcessed > 0) {
status = Status.DATA_PROCESSED;
}
}
public void setComplete(boolean complete) {
this.complete = complete;
}
public boolean isComplete() {
return complete;
}
}