org.waarp.openr66.protocol.localhandler.Monitoring.java Source code

Java tutorial

Introduction

Here is the source code for org.waarp.openr66.protocol.localhandler.Monitoring.java

Source

/**
 * This file is part of Waarp Project.
 * 
 * Copyright 2009, Frederic Bregier, and individual contributors by the @author tags. See the
 * COPYRIGHT.txt in the distribution for a full listing of individual contributors.
 * 
 * All Waarp Project is free software: you can redistribute it and/or modify it under the terms of
 * the GNU General Public License as published by the Free Software Foundation, either version 3 of
 * the License, or (at your option) any later version.
 * 
 * Waarp is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
 * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
 * Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along with Waarp . If not, see
 * <http://www.gnu.org/licenses/>.
 */
package org.waarp.openr66.protocol.localhandler;

import io.netty.handler.traffic.TrafficCounter;
import org.joda.time.DateTime;
import org.waarp.common.database.DbAdmin;
import org.waarp.common.database.DbPreparedStatement;
import org.waarp.common.database.DbSession;
import org.waarp.common.database.data.AbstractDbData.UpdatedInfo;
import org.waarp.common.database.exception.WaarpDatabaseNoConnectionException;
import org.waarp.common.database.exception.WaarpDatabaseSqlException;
import org.waarp.common.database.model.DbModelFactory;
import org.waarp.common.json.JsonHandler;
import org.waarp.common.logging.WaarpLogger;
import org.waarp.common.logging.WaarpLoggerFactory;
import org.waarp.openr66.commander.CommanderNoDb;
import org.waarp.openr66.context.ErrorCode;
import org.waarp.openr66.database.DbConstant;
import org.waarp.openr66.database.data.DbTaskRunner;
import org.waarp.openr66.database.data.DbTaskRunner.TASKSTEP;
import org.waarp.openr66.protocol.configuration.Configuration;
import org.waarp.openr66.protocol.snmp.R66PrivateMib;
import org.waarp.snmp.WaarpSnmpAgent;
import org.waarp.snmp.interf.WaarpInterfaceMonitor;
import org.waarp.snmp.r66.WaarpPrivateMib.MibLevel;
import org.waarp.snmp.r66.WaarpPrivateMib.WaarpDetailedValuesIndex;
import org.waarp.snmp.r66.WaarpPrivateMib.WaarpErrorValuesIndex;
import org.waarp.snmp.r66.WaarpPrivateMib.WaarpGlobalValuesIndex;

import com.fasterxml.jackson.databind.node.ObjectNode;

/**
 * Monitoring class as an helper to get values of interest. Also used by SNMP support.
 * 
 * @author Frederic Bregier
 * 
 */
public class Monitoring implements WaarpInterfaceMonitor {
    /**
     * Internal Logger
     */
    private static WaarpLogger logger = WaarpLoggerFactory.getLogger(Monitoring.class);

    public WaarpSnmpAgent agent;

    // global informations
    public long nbNetworkConnection = 0;
    public long secondsRunning = 0;
    public long nbThread = 0;
    public long bandwidthIn = 0;
    public long bandwidthOut = 0;

    // Internal data
    private long startMonitor = System.currentTimeMillis();
    private long pastLimit = 0;
    private long currentLimit = 0;
    private long minimalDelay = 0;
    private long lastTry = 0;
    private DbSession dbSession = null;
    private final TrafficCounter trafficCounter = Configuration.configuration.getGlobalTrafficShapingHandler()
            .trafficCounter();

    // Overall status including past, future and current transfers
    private DbPreparedStatement countInfo = null;

    // Current situation of all transfers, running or not
    private DbPreparedStatement countInActiveTransfer = null;
    private DbPreparedStatement countOutActiveTransfer = null;
    private DbPreparedStatement countInTotalTransfer = null;
    private DbPreparedStatement countOutTotalTransfer = null;
    private DbPreparedStatement countInErrorTransfer = null;
    private DbPreparedStatement countOutErrorTransfer = null;
    private DbPreparedStatement countStepAllTransfer = null;
    private DbPreparedStatement countStepNotask = null;
    private DbPreparedStatement countStepPretask = null;
    private DbPreparedStatement countStepTransfer = null;
    private DbPreparedStatement countStepPosttask = null;
    private DbPreparedStatement countStepAllDone = null;
    private DbPreparedStatement countStepError = null;

    // First on Running Transfers only
    private DbPreparedStatement countAllRunningStep = null;
    private DbPreparedStatement countRunningStep = null;
    private DbPreparedStatement countInitOkStep = null;
    private DbPreparedStatement countPreProcessingOkStep = null;
    private DbPreparedStatement countTransferOkStep = null;
    private DbPreparedStatement countPostProcessingOkStep = null;
    private DbPreparedStatement countCompleteOkStep = null;

    // Error Status on all transfers
    private DbPreparedStatement countStatus = null;

    // Overall status including past, future and current transfers
    public long nbCountInfoUnknown = 0;
    public long nbCountInfoNotUpdated = 0;
    public long nbCountInfoInterrupted = 0;
    public long nbCountInfoToSubmit = 0;
    public long nbCountInfoError = 0;
    public long nbCountInfoRunning = 0;
    public long nbCountInfoDone = 0;

    public long nbInActiveTransfer = 0;
    public long nbOutActiveTransfer = 0;
    public long lastInActiveTransfer = System.currentTimeMillis();
    public long lastOutActiveTransfer = System.currentTimeMillis();
    public long nbInTotalTransfer = 0;
    public long nbOutTotalTransfer = 0;
    public long nbInErrorTransfer = 0;
    public long nbOutErrorTransfer = 0;

    // Current situation of all transfers, running or not
    public long nbCountStepAllTransfer = 0;
    public long nbCountStepNotask = 0;
    public long nbCountStepPretask = 0;
    public long nbCountStepTransfer = 0;
    public long nbCountStepPosttask = 0;
    public long nbCountStepAllDone = 0;
    public long nbCountStepError = 0;

    // First on Running Transfers only
    public long nbCountAllRunningStep = 0;
    public long nbCountRunningStep = 0;
    public long nbCountInitOkStep = 0;
    public long nbCountPreProcessingOkStep = 0;
    public long nbCountTransferOkStep = 0;
    public long nbCountPostProcessingOkStep = 0;
    public long nbCountCompleteOkStep = 0;

    // Error Status on all transfers
    public long nbCountStatusConnectionImpossible = 0;
    public long nbCountStatusServerOverloaded = 0;
    public long nbCountStatusBadAuthent = 0;
    public long nbCountStatusExternalOp = 0;
    public long nbCountStatusTransferError = 0;
    public long nbCountStatusMD5Error = 0;
    public long nbCountStatusDisconnection = 0;
    public long nbCountStatusFinalOp = 0;
    public long nbCountStatusUnimplemented = 0;
    public long nbCountStatusInternal = 0;
    public long nbCountStatusWarning = 0;
    public long nbCountStatusQueryAlreadyFinished = 0;
    public long nbCountStatusQueryStillRunning = 0;
    public long nbCountStatusNotKnownHost = 0;
    public long nbCountStatusQueryRemotelyUnknown = 0;
    public long nbCountStatusCommandNotFound = 0;
    public long nbCountStatusPassThroughMode = 0;
    public long nbCountStatusRemoteShutdown = 0;
    public long nbCountStatusShutdown = 0;
    public long nbCountStatusRemoteError = 0;
    public long nbCountStatusStopped = 0;
    public long nbCountStatusCanceled = 0;
    public long nbCountStatusFileNotFound = 0;
    public long nbCountStatusUnknown = 0;

    /**
     * @param pastLimit
     * @param minimalDelay
     * @param session
     */
    public Monitoring(long pastLimit, long minimalDelay, DbSession session) {
        this.pastLimit = pastLimit;
        this.minimalDelay = minimalDelay;
        if (session != null) {
            dbSession = session;
        } else {
            if (DbConstant.admin.isActive) {
                try {
                    dbSession = new DbSession(DbConstant.admin, false);
                } catch (WaarpDatabaseNoConnectionException e) {
                    dbSession = DbConstant.admin.session;
                }
            } else {
                dbSession = DbConstant.admin.session;
            }
        }
        this.initialize();
    }

    /**
     * Initialize the Db Requests after constructor or after use of releaseResources
     */
    public void initialize() {
        if (dbSession == null || dbSession.isDisActive) {
            logger.warn("Cannot Initialize monitoring");
            return;
        }
        try {
            logger.debug("Initialize monitoring");
            // Overall status including past, future and current transfers
            countInfo = DbTaskRunner.getCountInfoPrepareStatement(dbSession);
            // Count of Active/All In/Out transfers
            countInActiveTransfer = DbTaskRunner.getCountInOutRunningPrepareStatement(dbSession, true, true);
            countOutActiveTransfer = DbTaskRunner.getCountInOutRunningPrepareStatement(dbSession, false, true);
            countInTotalTransfer = DbTaskRunner.getCountInOutRunningPrepareStatement(dbSession, true, false);
            countOutTotalTransfer = DbTaskRunner.getCountInOutRunningPrepareStatement(dbSession, false, false);

            countInErrorTransfer = DbTaskRunner.getCountInOutErrorPrepareStatement(dbSession, true);
            countOutErrorTransfer = DbTaskRunner.getCountInOutErrorPrepareStatement(dbSession, false);

            // Current situation of all transfers, running or not
            countStepAllTransfer = DbTaskRunner.getCountStepPrepareStatement(dbSession, null);
            countStepNotask = DbTaskRunner.getCountStepPrepareStatement(dbSession, TASKSTEP.NOTASK);
            countStepPretask = DbTaskRunner.getCountStepPrepareStatement(dbSession, TASKSTEP.PRETASK);
            countStepTransfer = DbTaskRunner.getCountStepPrepareStatement(dbSession, TASKSTEP.TRANSFERTASK);
            countStepPosttask = DbTaskRunner.getCountStepPrepareStatement(dbSession, TASKSTEP.POSTTASK);
            countStepAllDone = DbTaskRunner.getCountStepPrepareStatement(dbSession, TASKSTEP.ALLDONETASK);
            countStepError = DbTaskRunner.getCountStepPrepareStatement(dbSession, TASKSTEP.ERRORTASK);

            // First on Running Transfers only
            countAllRunningStep = DbTaskRunner.getCountStatusRunningPrepareStatement(dbSession, null);
            countRunningStep = DbTaskRunner.getCountStatusRunningPrepareStatement(dbSession, ErrorCode.Running);
            countInitOkStep = DbTaskRunner.getCountStatusRunningPrepareStatement(dbSession, ErrorCode.InitOk);
            countPreProcessingOkStep = DbTaskRunner.getCountStatusRunningPrepareStatement(dbSession,
                    ErrorCode.PreProcessingOk);
            countTransferOkStep = DbTaskRunner.getCountStatusRunningPrepareStatement(dbSession,
                    ErrorCode.TransferOk);
            countPostProcessingOkStep = DbTaskRunner.getCountStatusRunningPrepareStatement(dbSession,
                    ErrorCode.PostProcessingOk);
            countCompleteOkStep = DbTaskRunner.getCountStatusRunningPrepareStatement(dbSession,
                    ErrorCode.CompleteOk);

            // Error Status on all transfers
            countStatus = DbTaskRunner.getCountStatusPrepareStatement(dbSession);
        } catch (WaarpDatabaseNoConnectionException e) {
        } catch (WaarpDatabaseSqlException e) {
        }
    }

    /**
     * Release all Db Requests
     */
    public void releaseResources() {
        if (dbSession == null || dbSession.isDisActive) {
            return;
        }
        try {
            logger.debug("Release monitoring");
            // Overall status including past, future and current transfers
            countInfo.realClose();

            countInActiveTransfer.realClose();
            countOutActiveTransfer.realClose();
            countInTotalTransfer.realClose();
            countOutTotalTransfer.realClose();
            countInErrorTransfer.realClose();
            countOutErrorTransfer.realClose();

            // Current situation of all transfers, running or not
            countStepAllTransfer.realClose();
            countStepNotask.realClose();
            countStepPretask.realClose();
            countStepTransfer.realClose();
            countStepPosttask.realClose();
            countStepAllDone.realClose();
            countStepError.realClose();

            // First on Running Transfers only
            countAllRunningStep.realClose();
            countRunningStep.realClose();
            countInitOkStep.realClose();
            countPreProcessingOkStep.realClose();
            countTransferOkStep.realClose();
            countPostProcessingOkStep.realClose();
            countCompleteOkStep.realClose();

            // Error Status on all transfers
            countStatus.realClose();
        } catch (Exception e) {
        }
        if (!dbSession.equals(DbConstant.admin.session)) {
            dbSession.forceDisconnect();
            dbSession = null;
        }
    }

    /**
     * 
     * @return the last Time in ms of the execution
     */
    public long lastRunTimeMs() {
        return lastTry;
    }

    /**
     * Default execution of testing with default pastLimit
     */
    public void run() {
        this.run(-1, false);
    }

    /**
     * 
     * @param nbSecond
     *            as specific PastLimit
     */
    public void run(long nbSecond) {
        this.run(nbSecond, false);
    }

    /**
     * Default execution of testing with default pastLimit
     * 
     * @param detail
     *            as to get detailed information
     */
    public void run(boolean detail) {
        this.run(-1, detail);
    }

    /**
     * 
     * @return False if too early, else return True
     */
    private boolean reCompute() {
        long limitDate = System.currentTimeMillis();
        if (limitDate < lastTry + minimalDelay) {
            // too early
            return false;
        }
        lastTry = limitDate;
        return true;
    }

    /**
     * 
     * @param nbSecond
     *            as specific PastLimit
     * @param detail
     *            as to get detailed information
     */
    public void run(long nbSecond, boolean detail) {
        synchronized (trafficCounter) {
            long limitDate = System.currentTimeMillis();
            long nbMs = pastLimit;
            if (nbSecond <= 0) {
                nbMs = pastLimit;
            } else {
                nbMs = nbSecond * 1000;
            }
            if (dbSession != null && dbSession.isDisActive) {
                dbSession.checkConnectionNoException();
            }
            if (dbSession == null || dbSession.isDisActive) {
                nbNetworkConnection = Configuration.configuration.getHttpChannelGroup().size()
                        + Configuration.configuration.getServerChannelGroup().size();
                bandwidthIn = trafficCounter.lastReadThroughput() >> 7;// B/s -> Kb/s
                bandwidthOut = trafficCounter.lastWriteThroughput() >> 7;
                nbThread = Thread.activeCount();
                secondsRunning = (limitDate - startMonitor) / 1000;

                if (!reCompute()) {
                    // too early
                    return;
                }
                limitDate -= nbMs;
                currentLimit = limitDate;
                // Update value
                // Overall status including past, future and current transfers
                nbCountInfoToSubmit = CommanderNoDb.todoList.size();
                if (Configuration.configuration.getInternalRunner() != null) {
                    nbCountInfoRunning = Configuration.configuration.getInternalRunner().nbInternalRunner();
                } else {
                    nbCountInfoRunning = Configuration.configuration.getServerChannelGroup().size();
                }
                // Current situation of all transfers, running or not
                nbCountAllRunningStep = nbCountInfoRunning;
            } else {
                nbNetworkConnection = DbAdmin.getNbConnection();
                bandwidthIn = trafficCounter.lastReadThroughput() >> 7;// B/s -> Kb/s
                bandwidthOut = trafficCounter.lastWriteThroughput() >> 7;
                nbThread = Thread.activeCount();
                secondsRunning = (limitDate - startMonitor) / 1000;

                if (!reCompute()) {
                    // too early
                    return;
                }
                limitDate -= nbMs;
                currentLimit = limitDate;
                // Update value
                try {
                    // Overall status including past, future and current transfers
                    nbCountInfoUnknown = DbTaskRunner.getResultCountPrepareStatement(countInfo, UpdatedInfo.UNKNOWN,
                            limitDate);
                    nbCountInfoNotUpdated = DbTaskRunner.getResultCountPrepareStatement(countInfo,
                            UpdatedInfo.NOTUPDATED, limitDate);
                    nbCountInfoInterrupted = DbTaskRunner.getResultCountPrepareStatement(countInfo,
                            UpdatedInfo.INTERRUPTED, limitDate);
                    nbCountInfoToSubmit = DbTaskRunner.getResultCountPrepareStatement(countInfo,
                            UpdatedInfo.TOSUBMIT, limitDate);
                    nbCountInfoError = DbTaskRunner.getResultCountPrepareStatement(countInfo, UpdatedInfo.INERROR,
                            limitDate);
                    nbCountInfoRunning = DbTaskRunner.getResultCountPrepareStatement(countInfo, UpdatedInfo.RUNNING,
                            limitDate);
                    nbCountInfoDone = DbTaskRunner.getResultCountPrepareStatement(countInfo, UpdatedInfo.DONE,
                            limitDate);

                    // Current situation of all transfers, running or not
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countInActiveTransfer, limitDate);
                    nbInActiveTransfer = DbTaskRunner.getResultCountPrepareStatement(countInActiveTransfer);
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countOutActiveTransfer, limitDate);
                    nbOutActiveTransfer = DbTaskRunner.getResultCountPrepareStatement(countOutActiveTransfer);
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countInTotalTransfer, limitDate);
                    nbInTotalTransfer = DbTaskRunner.getResultCountPrepareStatement(countInTotalTransfer);
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countOutTotalTransfer, limitDate);
                    nbOutTotalTransfer = DbTaskRunner.getResultCountPrepareStatement(countOutTotalTransfer);

                    DbTaskRunner.finishSelectOrCountPrepareStatement(countOutErrorTransfer, limitDate);
                    nbOutErrorTransfer = DbTaskRunner.getResultCountPrepareStatement(countOutErrorTransfer);
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countInErrorTransfer, limitDate);
                    nbInErrorTransfer = DbTaskRunner.getResultCountPrepareStatement(countInErrorTransfer);

                    DbTaskRunner.finishSelectOrCountPrepareStatement(countStepAllTransfer, limitDate);
                    nbCountStepAllTransfer = DbTaskRunner.getResultCountPrepareStatement(countStepAllTransfer);
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countStepNotask, limitDate);
                    nbCountStepNotask = DbTaskRunner.getResultCountPrepareStatement(countStepNotask);
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countStepPretask, limitDate);
                    nbCountStepPretask = DbTaskRunner.getResultCountPrepareStatement(countStepPretask);
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countStepTransfer, limitDate);
                    nbCountStepTransfer = DbTaskRunner.getResultCountPrepareStatement(countStepTransfer);
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countStepPosttask, limitDate);
                    nbCountStepPosttask = DbTaskRunner.getResultCountPrepareStatement(countStepPosttask);
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countStepAllDone, limitDate);
                    nbCountStepAllDone = DbTaskRunner.getResultCountPrepareStatement(countStepAllDone);
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countStepError, limitDate);
                    nbCountStepError = DbTaskRunner.getResultCountPrepareStatement(countStepError);

                    DbTaskRunner.finishSelectOrCountPrepareStatement(countAllRunningStep, limitDate);
                    nbCountAllRunningStep = DbTaskRunner.getResultCountPrepareStatement(countAllRunningStep);

                    if (detail) {
                        // First on Running Transfers only
                        DbTaskRunner.finishSelectOrCountPrepareStatement(countRunningStep, limitDate);
                        nbCountRunningStep = DbTaskRunner.getResultCountPrepareStatement(countRunningStep);
                        DbTaskRunner.finishSelectOrCountPrepareStatement(countInitOkStep, limitDate);
                        nbCountInitOkStep = DbTaskRunner.getResultCountPrepareStatement(countInitOkStep);
                        DbTaskRunner.finishSelectOrCountPrepareStatement(countPreProcessingOkStep, limitDate);
                        nbCountPreProcessingOkStep = DbTaskRunner
                                .getResultCountPrepareStatement(countPreProcessingOkStep);
                        DbTaskRunner.finishSelectOrCountPrepareStatement(countTransferOkStep, limitDate);
                        nbCountTransferOkStep = DbTaskRunner.getResultCountPrepareStatement(countTransferOkStep);
                        DbTaskRunner.finishSelectOrCountPrepareStatement(countPostProcessingOkStep, limitDate);
                        nbCountPostProcessingOkStep = DbTaskRunner
                                .getResultCountPrepareStatement(countPostProcessingOkStep);
                        DbTaskRunner.finishSelectOrCountPrepareStatement(countCompleteOkStep, limitDate);
                        nbCountCompleteOkStep = DbTaskRunner.getResultCountPrepareStatement(countCompleteOkStep);

                        // Error Status on all transfers
                        nbCountStatusConnectionImpossible = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.ConnectionImpossible, limitDate);
                        nbCountStatusServerOverloaded = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.ServerOverloaded, limitDate);
                        nbCountStatusBadAuthent = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.BadAuthent, limitDate);
                        nbCountStatusExternalOp = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.ExternalOp, limitDate);
                        nbCountStatusTransferError = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.TransferError, limitDate);
                        nbCountStatusMD5Error = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.MD5Error, limitDate);
                        nbCountStatusDisconnection = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.Disconnection, limitDate);
                        nbCountStatusFinalOp = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.FinalOp, limitDate);
                        nbCountStatusUnimplemented = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.Unimplemented, limitDate);
                        nbCountStatusInternal = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.Internal, limitDate);
                        nbCountStatusWarning = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.Warning, limitDate);
                        nbCountStatusQueryAlreadyFinished = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.QueryAlreadyFinished, limitDate);
                        nbCountStatusQueryStillRunning = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.QueryStillRunning, limitDate);
                        nbCountStatusNotKnownHost = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.NotKnownHost, limitDate);
                        nbCountStatusQueryRemotelyUnknown = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.QueryRemotelyUnknown, limitDate);
                        nbCountStatusCommandNotFound = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.CommandNotFound, limitDate);
                        nbCountStatusPassThroughMode = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.PassThroughMode, limitDate);
                        nbCountStatusRemoteShutdown = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.RemoteShutdown, limitDate);
                        nbCountStatusShutdown = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.Shutdown, limitDate);
                        nbCountStatusRemoteError = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.RemoteError, limitDate);
                        nbCountStatusStopped = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.StoppedTransfer, limitDate);
                        nbCountStatusCanceled = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.CanceledTransfer, limitDate);
                        nbCountStatusFileNotFound = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.FileNotFound, limitDate);
                        nbCountStatusUnknown = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                                ErrorCode.Unknown, limitDate);
                    }
                } catch (WaarpDatabaseNoConnectionException e) {
                } catch (WaarpDatabaseSqlException e) {
                }
            }
        }
    }

    /**
     * @param detail
     * @return The XML representation of the current status
     */
    public String exportXml(boolean detail) {
        StringBuilder builder = new StringBuilder("<STATUS>")
                // Global Informations
                .append("<HostID>").append(Configuration.configuration.HOST_ID).append("</HostID>").append("<Date>")
                .append(new DateTime().toString()).append("</Date>").append("<LastRun>")
                .append(new DateTime(lastTry).toString()).append("</LastRun>").append("<FromDate>")
                .append(new DateTime(currentLimit).toString()).append("</FromDate>").append("<SecondsRunning>")
                .append(secondsRunning).append("</SecondsRunning>").append("<NetworkConnections>")
                .append(nbNetworkConnection).append("</NetworkConnections>").append("<NbThreads>").append(nbThread)
                .append("</NbThreads>").append("<InBandwidth>").append(bandwidthIn).append("</InBandwidth>")
                .append("<OutBandwidth>").append(bandwidthOut).append("</OutBandwidth>")

                // Overall status including past, future and current transfers
                .append("<OVERALL>").append("<AllTransfer>").append(nbCountStepAllTransfer).append("</AllTransfer>")
                .append("<Unknown>").append(nbCountInfoUnknown).append("</Unknown>").append("<NotUpdated>")
                .append(nbCountInfoNotUpdated).append("</NotUpdated>").append("<Interrupted>")
                .append(nbCountInfoInterrupted).append("</Interrupted>").append("<ToSubmit>")
                .append(nbCountInfoToSubmit).append("</ToSubmit>").append("<Error>").append(nbCountInfoError)
                .append("</Error>").append("<Running>").append(nbCountInfoRunning).append("</Running>")
                .append("<Done>").append(nbCountInfoDone).append("</Done>").append("<InRunning>")
                .append(nbInActiveTransfer).append("</InRunning>").append("<OutRunning>")
                .append(nbOutActiveTransfer).append("</OutRunning>").append("<LastInRunning>")
                .append(new DateTime(lastInActiveTransfer).toString()).append("</LastInRunning>")
                .append("<LastOutRunning>").append(new DateTime(lastOutActiveTransfer).toString())
                .append("</LastOutRunning>").append("<InAll>").append(nbInTotalTransfer).append("</InAll>")
                .append("<OutAll>").append(nbOutTotalTransfer).append("</OutAll>").append("<InError>")
                .append(nbInErrorTransfer).append("</InError>").append("<OutError>").append(nbOutErrorTransfer)
                .append("</OutError>").append("</OVERALL>")

                // Current situation of all transfers, running or not
                .append("<STEPS>").append("<Notask>").append(nbCountStepNotask).append("</Notask>")
                .append("<Pretask>").append(nbCountStepPretask).append("</Pretask>").append("<Transfer>")
                .append(nbCountStepTransfer).append("</Transfer>").append("<Posttask>").append(nbCountStepPosttask)
                .append("</Posttask>").append("<AllDone>").append(nbCountStepAllDone).append("</AllDone>")
                .append("<Error>").append(nbCountStepError).append("</Error>").append("</STEPS>")

                // On Running Transfers only
                .append("<RUNNINGSTEPS>").append("<AllRunning>").append(nbCountAllRunningStep)
                .append("</AllRunning>");
        if (detail) {
            builder.append("<Running>").append(nbCountRunningStep).append("</Running>").append("<InitOk>")
                    .append(nbCountInitOkStep).append("</InitOk>").append("<PreProcessingOk>")
                    .append(nbCountPreProcessingOkStep).append("</PreProcessingOk>").append("<TransferOk>")
                    .append(nbCountTransferOkStep).append("</TransferOk>").append("<PostProcessingOk>")
                    .append(nbCountPostProcessingOkStep).append("</PostProcessingOk>").append("<CompleteOk>")
                    .append(nbCountCompleteOkStep).append("</CompleteOk>");
        }
        builder.append("</RUNNINGSTEPS>");

        if (detail) {
            // Error Status on all transfers
            builder.append("<ERRORTYPES>").append("<ConnectionImpossible>")
                    .append(nbCountStatusConnectionImpossible).append("</ConnectionImpossible>")
                    .append("<ServerOverloaded>").append(nbCountStatusServerOverloaded)
                    .append("</ServerOverloaded>").append("<BadAuthent>").append(nbCountStatusBadAuthent)
                    .append("</BadAuthent>").append("<ExternalOp>").append(nbCountStatusExternalOp)
                    .append("</ExternalOp>").append("<TransferError>").append(nbCountStatusTransferError)
                    .append("</TransferError>").append("<MD5Error>").append(nbCountStatusMD5Error)
                    .append("</MD5Error>").append("<Disconnection>").append(nbCountStatusDisconnection)
                    .append("</Disconnection>").append("<FinalOp>").append(nbCountStatusFinalOp)
                    .append("</FinalOp>").append("<Unimplemented>").append(nbCountStatusUnimplemented)
                    .append("</Unimplemented>").append("<Internal>").append(nbCountStatusInternal)
                    .append("</Internal>").append("<Warning>").append(nbCountStatusWarning).append("</Warning>")
                    .append("<QueryAlreadyFinished>").append(nbCountStatusQueryAlreadyFinished)
                    .append("</QueryAlreadyFinished>").append("<QueryStillRunning>")
                    .append(nbCountStatusQueryStillRunning).append("</QueryStillRunning>").append("<KnownHost>")
                    .append(nbCountStatusNotKnownHost).append("</KnownHost>").append("<RemotelyUnknown>")
                    .append(nbCountStatusQueryRemotelyUnknown).append("</RemotelyUnknown>")
                    .append("<CommandNotFound>").append(nbCountStatusCommandNotFound).append("</CommandNotFound>")
                    .append("<PassThroughMode>").append(nbCountStatusPassThroughMode).append("</PassThroughMode>")
                    .append("<RemoteShutdown>").append(nbCountStatusRemoteShutdown).append("</RemoteShutdown>")
                    .append("<Shutdown>").append(nbCountStatusShutdown).append("</Shutdown>")
                    .append("<RemoteError>").append(nbCountStatusRemoteError).append("</RemoteError>")
                    .append("<Stopped>").append(nbCountStatusStopped).append("</Stopped>").append("<Canceled>")
                    .append(nbCountStatusCanceled).append("</Canceled>").append("<FileNotFound>")
                    .append(nbCountStatusFileNotFound).append("</FileNotFound>").append("<Unknown>")
                    .append(nbCountStatusUnknown).append("</Unknown>").append("</ERRORTYPES>");
        }
        builder.append("</STATUS>");
        return builder.toString();
    }

    /**
     * @param detail
     * @return The Json representation of the current status
     */
    public String exportJson(boolean detail) {
        return JsonHandler.prettyPrint(exportAsJson(detail));
    }

    /**
     * 
     * @param detail
     * @return The Json representation of the current status
     */
    public ObjectNode exportAsJson(boolean detail) {
        ObjectNode node = JsonHandler.createObjectNode();
        node = node.putObject("STATUS");
        // Global Informations
        node.put("HostID", Configuration.configuration.HOST_ID);
        node.put("Date", new DateTime().toString());
        node.put("LastRun", new DateTime(lastTry).toString());
        node.put("FromDate", new DateTime(currentLimit).toString());
        node.put("SecondsRunning", secondsRunning);
        node.put("NetworkConnections", nbNetworkConnection);
        node.put("NbThreads", nbThread);
        node.put("InBandwidth", bandwidthIn);
        node.put("OutBandwidth", bandwidthOut);

        // Overall status including past, future and current transfers
        ObjectNode node2 = node.putObject("OVERALL");
        node2.put("AllTransfer", nbCountStepAllTransfer);
        node2.put("Unknown", nbCountInfoUnknown);
        node2.put("NotUpdated", nbCountInfoNotUpdated);
        node2.put("Interrupted", nbCountInfoInterrupted);
        node2.put("ToSubmit", nbCountInfoToSubmit);
        node2.put("Error", nbCountInfoError);
        node2.put("Running", nbCountInfoRunning);
        node2.put("Done", nbCountInfoDone);
        node2.put("InRunning", nbInActiveTransfer);
        node2.put("OutRunning", nbOutActiveTransfer);
        node2.put("LastInRunning", new DateTime(lastInActiveTransfer).toString());
        node2.put("LastOutRunning", new DateTime(lastOutActiveTransfer).toString());
        node2.put("InAll", nbInTotalTransfer);
        node2.put("OutAll", nbOutTotalTransfer);
        node2.put("InError", nbInErrorTransfer);
        node2.put("OutError", nbOutErrorTransfer);

        // Current situation of all transfers, running or not
        node2 = node.putObject("STEPS");
        node2.put("Notask", nbCountStepNotask);
        node2.put("Pretask", nbCountStepPretask);
        node2.put("Transfer", nbCountStepTransfer);
        node2.put("Posttask", nbCountStepPosttask);
        node2.put("AllDone", nbCountStepAllDone);
        node2.put("Error", nbCountStepError);

        // On Running Transfers only
        node2 = node.putObject("RUNNINGSTEPS");
        node2.put("AllRunning", nbCountAllRunningStep);
        if (detail) {
            node2.put("Running", nbCountRunningStep);
            node2.put("InitOk", nbCountInitOkStep);
            node2.put("PreProcessingOk", nbCountPreProcessingOkStep);
            node2.put("TransferOk", nbCountTransferOkStep);
            node2.put("PostProcessingOk", nbCountPostProcessingOkStep);
            node2.put("CompleteOk", nbCountCompleteOkStep);
        }

        if (detail) {
            // Error Status on all transfers
            node2 = node.putObject("ERRORTYPES");
            node2.put("ConnectionImpossible", nbCountStatusConnectionImpossible);
            node2.put("ServerOverloaded", nbCountStatusServerOverloaded);
            node2.put("BadAuthent", nbCountStatusBadAuthent);
            node2.put("ExternalOp", nbCountStatusExternalOp);
            node2.put("TransferError", nbCountStatusTransferError);
            node2.put("MD5Error", nbCountStatusMD5Error);
            node2.put("Disconnection", nbCountStatusDisconnection);
            node2.put("FinalOp", nbCountStatusFinalOp);
            node2.put("Unimplemented", nbCountStatusUnimplemented);
            node2.put("Internal", nbCountStatusInternal);
            node2.put("Warning", nbCountStatusWarning);
            node2.put("QueryAlreadyFinished", nbCountStatusQueryAlreadyFinished);
            node2.put("QueryStillRunning", nbCountStatusQueryStillRunning);
            node2.put("KnownHost", nbCountStatusNotKnownHost);
            node2.put("RemotelyUnknown", nbCountStatusQueryRemotelyUnknown);
            node2.put("CommandNotFound", nbCountStatusCommandNotFound);
            node2.put("PassThroughMode", nbCountStatusPassThroughMode);
            node2.put("RemoteShutdown", nbCountStatusRemoteShutdown);
            node2.put("Shutdown", nbCountStatusShutdown);
            node2.put("RemoteError", nbCountStatusRemoteError);
            node2.put("Stopped", nbCountStatusStopped);
            node2.put("Canceled", nbCountStatusCanceled);
            node2.put("FileNotFound", nbCountStatusFileNotFound);
            node2.put("Unknown", nbCountStatusUnknown);
        }
        return node;
    }

    public void setAgent(WaarpSnmpAgent agent) {
        this.agent = agent;
        this.lastInActiveTransfer = this.agent.getUptimeSystemTime();
        this.lastOutActiveTransfer = this.agent.getUptimeSystemTime();
    }

    /**
     * Update the value for one particular MIB entry
     * 
     * @param type
     * @param entry
     */
    public void run(int type, int entry) {
        long nbMs = Configuration.configuration.agentSnmp.getUptime() + 100;
        MibLevel level = MibLevel.values()[type];
        switch (level) {
        case globalInfo:// Global
            if (((R66PrivateMib) this.agent.mib).rowGlobal != null)
                run(nbMs, WaarpGlobalValuesIndex.values()[entry]);
            return;
        case detailedInfo:// Detailed
            if (((R66PrivateMib) this.agent.mib).rowDetailed != null)
                run(nbMs, WaarpDetailedValuesIndex.values()[entry]);
            return;
        case errorInfo:// Error
            if (((R66PrivateMib) this.agent.mib).rowError != null)
                run(nbMs, WaarpErrorValuesIndex.values()[entry]);
            return;
        case staticInfo:
            break;
        case trapInfo:
            break;
        default:
            break;
        }
    }

    /**
     * Update a value in Global MIB part
     * 
     * @param rank
     * @param value
     */
    protected void updateGlobalValue(int rank, long value) {
        ((R66PrivateMib) this.agent.mib).rowGlobal.setValue(rank, value);
    }

    /**
     * Update a value in Detailed MIB part
     * 
     * @param rank
     * @param value
     */
    protected void updateDetailedValue(int rank, long value) {
        ((R66PrivateMib) this.agent.mib).rowDetailed.setValue(rank, value);
    }

    /**
     * Update a value in Error MIB part
     * 
     * @param rank
     * @param value
     */
    protected void updateErrorValue(int rank, long value) {
        ((R66PrivateMib) this.agent.mib).rowError.setValue(rank, value);
    }

    /**
     * Update a value in Global MIB part
     * 
     * @param nbMs
     * @param entry
     */
    protected void run(long nbMs, WaarpGlobalValuesIndex entry) {
        synchronized (trafficCounter) {
            long val = 0;
            long limitDate = System.currentTimeMillis() - nbMs;
            if (dbSession == null || dbSession.isDisActive) {
                switch (entry) {
                case applUptime:
                    return;
                case applOperStatus:
                    return;
                case applLastChange:
                    return;
                case applInboundAssociations:
                    updateGlobalValue(entry.ordinal(), nbInActiveTransfer);
                    return;
                case applOutboundAssociations:
                    updateGlobalValue(entry.ordinal(), nbOutActiveTransfer);
                    return;
                case applAccumInboundAssociations:
                    updateGlobalValue(entry.ordinal(), nbInTotalTransfer);
                    return;
                case applAccumOutboundAssociations:
                    updateGlobalValue(entry.ordinal(), nbOutTotalTransfer);
                    return;
                case applLastInboundActivity:
                    val = (lastInActiveTransfer - this.agent.getUptimeSystemTime()) / 10;
                    if (val < 0)
                        val = 0;
                    updateGlobalValue(entry.ordinal(), val);
                    return;
                case applLastOutboundActivity:
                    val = (lastOutActiveTransfer - this.agent.getUptimeSystemTime()) / 10;
                    if (val < 0)
                        val = 0;
                    updateGlobalValue(entry.ordinal(), val);
                    return;
                case applRejectedInboundAssociations:
                    updateGlobalValue(entry.ordinal(), nbInErrorTransfer);
                    return;
                case applFailedOutboundAssociations:
                    updateGlobalValue(entry.ordinal(), nbOutErrorTransfer);
                    return;
                case applInboundBandwidthKBS:
                    val = trafficCounter.lastReadThroughput() >> 10;// B/s -> KB/s
                    updateGlobalValue(entry.ordinal(), val);
                    return;
                case applOutboundBandwidthKBS:
                    val = trafficCounter.lastWriteThroughput() >> 10;
                    updateGlobalValue(entry.ordinal(), val);
                    return;
                case nbInfoUnknown:
                    updateGlobalValue(entry.ordinal(), nbCountInfoUnknown);
                    return;
                case nbInfoNotUpdated:
                    updateGlobalValue(entry.ordinal(), nbCountInfoNotUpdated);
                    return;
                case nbInfoInterrupted:
                    updateGlobalValue(entry.ordinal(), nbCountInfoInterrupted);
                    return;
                case nbInfoToSubmit:
                    nbCountInfoToSubmit = CommanderNoDb.todoList.size();
                    updateGlobalValue(entry.ordinal(), nbCountInfoToSubmit);
                    return;
                case nbInfoError:
                    updateGlobalValue(entry.ordinal(), nbCountInfoError);
                    return;
                case nbInfoRunning:
                    nbCountInfoRunning = Configuration.configuration.getInternalRunner().nbInternalRunner();
                    updateGlobalValue(entry.ordinal(), nbCountInfoRunning);
                    return;
                case nbInfoDone:
                    updateGlobalValue(entry.ordinal(), nbCountInfoDone);
                    return;
                case nbStepAllTransfer:
                    updateGlobalValue(entry.ordinal(), nbCountStepAllTransfer);
                    return;
                case memoryTotal:
                    return;
                case memoryFree:
                    return;
                case memoryUsed:
                    return;
                case nbThreads:
                    nbThread = Thread.activeCount();
                    updateGlobalValue(entry.ordinal(), nbThread);
                    return;
                case nbNetworkConnection:
                    nbNetworkConnection = Configuration.configuration.getHttpChannelGroup().size()
                            + Configuration.configuration.getServerChannelGroup().size();
                    updateGlobalValue(entry.ordinal(), nbNetworkConnection);
                    return;
                }
                return;
            }
            // Global
            try {
                switch (entry) {
                case applUptime:
                    return;
                case applOperStatus:
                    return;
                case applLastChange:
                    return;
                case applInboundAssociations:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countInActiveTransfer, limitDate);
                    nbInActiveTransfer = DbTaskRunner.getResultCountPrepareStatement(countInActiveTransfer);
                    updateGlobalValue(entry.ordinal(), nbInActiveTransfer);
                    return;
                case applOutboundAssociations:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countOutActiveTransfer, limitDate);
                    nbOutActiveTransfer = DbTaskRunner.getResultCountPrepareStatement(countOutActiveTransfer);
                    updateGlobalValue(entry.ordinal(), nbOutActiveTransfer);
                    return;
                case applAccumInboundAssociations:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countInTotalTransfer, limitDate);
                    nbInTotalTransfer = DbTaskRunner.getResultCountPrepareStatement(countInTotalTransfer);
                    updateGlobalValue(entry.ordinal(), nbInTotalTransfer);
                    return;
                case applAccumOutboundAssociations:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countOutTotalTransfer, limitDate);
                    nbOutTotalTransfer = DbTaskRunner.getResultCountPrepareStatement(countOutTotalTransfer);
                    updateGlobalValue(entry.ordinal(), nbOutTotalTransfer);
                    return;
                case applLastInboundActivity:
                    val = (lastInActiveTransfer - this.agent.getUptimeSystemTime()) / 10;
                    if (val < 0)
                        val = 0;
                    updateGlobalValue(entry.ordinal(), val);
                    return;
                case applLastOutboundActivity:
                    val = (lastOutActiveTransfer - this.agent.getUptimeSystemTime()) / 10;
                    if (val < 0)
                        val = 0;
                    updateGlobalValue(entry.ordinal(), val);
                    return;
                case applRejectedInboundAssociations:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countInErrorTransfer, limitDate);
                    nbInErrorTransfer = DbTaskRunner.getResultCountPrepareStatement(countInErrorTransfer);
                    updateGlobalValue(entry.ordinal(), nbInErrorTransfer);
                    return;
                case applFailedOutboundAssociations:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countOutErrorTransfer, limitDate);
                    nbOutErrorTransfer = DbTaskRunner.getResultCountPrepareStatement(countOutErrorTransfer);
                    updateGlobalValue(entry.ordinal(), nbOutErrorTransfer);
                    return;
                case applInboundBandwidthKBS:
                    val = trafficCounter.lastReadThroughput() >> 10;// B/s -> KB/s
                    updateGlobalValue(entry.ordinal(), val);
                    return;
                case applOutboundBandwidthKBS:
                    val = trafficCounter.lastWriteThroughput() >> 10;
                    updateGlobalValue(entry.ordinal(), val);
                    return;
                case nbInfoUnknown:
                    nbCountInfoUnknown = DbTaskRunner.getResultCountPrepareStatement(countInfo, UpdatedInfo.UNKNOWN,
                            limitDate);
                    updateGlobalValue(entry.ordinal(), nbCountInfoUnknown);
                    return;
                case nbInfoNotUpdated:
                    nbCountInfoNotUpdated = DbTaskRunner.getResultCountPrepareStatement(countInfo,
                            UpdatedInfo.NOTUPDATED, limitDate);
                    updateGlobalValue(entry.ordinal(), nbCountInfoNotUpdated);
                    return;
                case nbInfoInterrupted:
                    nbCountInfoInterrupted = DbTaskRunner.getResultCountPrepareStatement(countInfo,
                            UpdatedInfo.INTERRUPTED, limitDate);
                    updateGlobalValue(entry.ordinal(), nbCountInfoInterrupted);
                    return;
                case nbInfoToSubmit:
                    nbCountInfoToSubmit = DbTaskRunner.getResultCountPrepareStatement(countInfo,
                            UpdatedInfo.TOSUBMIT, limitDate);
                    updateGlobalValue(entry.ordinal(), nbCountInfoToSubmit);
                    return;
                case nbInfoError:
                    nbCountInfoError = DbTaskRunner.getResultCountPrepareStatement(countInfo, UpdatedInfo.INERROR,
                            limitDate);
                    updateGlobalValue(entry.ordinal(), nbCountInfoError);
                    return;
                case nbInfoRunning:
                    nbCountInfoRunning = DbTaskRunner.getResultCountPrepareStatement(countInfo, UpdatedInfo.RUNNING,
                            limitDate);
                    updateGlobalValue(entry.ordinal(), nbCountInfoRunning);
                    return;
                case nbInfoDone:
                    nbCountInfoDone = DbTaskRunner.getResultCountPrepareStatement(countInfo, UpdatedInfo.DONE,
                            limitDate);
                    updateGlobalValue(entry.ordinal(), nbCountInfoDone);
                    return;
                case nbStepAllTransfer:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countStepAllTransfer, limitDate);
                    nbCountStepAllTransfer = DbTaskRunner.getResultCountPrepareStatement(countStepAllTransfer);
                    updateGlobalValue(entry.ordinal(), nbCountStepAllTransfer);
                    return;
                case memoryTotal:
                    return;
                case memoryFree:
                    return;
                case memoryUsed:
                    return;
                case nbThreads:
                    nbThread = Thread.activeCount();
                    updateGlobalValue(entry.ordinal(), nbThread);
                    return;
                case nbNetworkConnection:
                    nbNetworkConnection = DbAdmin.getNbConnection();
                    updateGlobalValue(entry.ordinal(), nbNetworkConnection);
                    return;
                }
            } catch (WaarpDatabaseNoConnectionException e) {
            } catch (WaarpDatabaseSqlException e) {
            }
        }
    }

    /**
     * Update a value in Detailed MIB part
     * 
     * @param nbMs
     * @param entry
     */
    protected void run(long nbMs, WaarpDetailedValuesIndex entry) {
        synchronized (trafficCounter) {
            long limitDate = System.currentTimeMillis() - nbMs;
            if (dbSession == null || dbSession.isDisActive) {
                switch (entry) {
                case nbStepNotask:
                    updateDetailedValue(entry.ordinal(), nbCountStepNotask);
                    return;
                case nbStepPretask:
                    updateDetailedValue(entry.ordinal(), nbCountStepPretask);
                    return;
                case nbStepTransfer:
                    updateDetailedValue(entry.ordinal(), nbCountStepTransfer);
                    return;
                case nbStepPosttask:
                    updateDetailedValue(entry.ordinal(), nbCountStepPosttask);
                    return;
                case nbStepAllDone:
                    updateDetailedValue(entry.ordinal(), nbCountStepAllDone);
                    return;
                case nbStepError:
                    updateDetailedValue(entry.ordinal(), nbCountStepError);
                    return;
                case nbAllRunningStep:
                    nbCountAllRunningStep = Configuration.configuration.getInternalRunner().nbInternalRunner();
                    updateDetailedValue(entry.ordinal(), nbCountAllRunningStep);
                    return;
                case nbRunningStep:
                    updateDetailedValue(entry.ordinal(), nbCountRunningStep);
                    return;
                case nbInitOkStep:
                    updateDetailedValue(entry.ordinal(), nbCountInitOkStep);
                    return;
                case nbPreProcessingOkStep:
                    updateDetailedValue(entry.ordinal(), nbCountPreProcessingOkStep);
                    return;
                case nbTransferOkStep:
                    updateDetailedValue(entry.ordinal(), nbCountTransferOkStep);
                    return;
                case nbPostProcessingOkStep:
                    updateDetailedValue(entry.ordinal(), nbCountPostProcessingOkStep);
                    return;
                case nbCompleteOkStep:
                    updateDetailedValue(entry.ordinal(), nbCountCompleteOkStep);
                    return;
                }
                return;
            }
            // Detailed
            try {
                switch (entry) {
                case nbStepNotask:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countStepNotask, limitDate);
                    nbCountStepNotask = DbTaskRunner.getResultCountPrepareStatement(countStepNotask);
                    updateDetailedValue(entry.ordinal(), nbCountStepNotask);
                    return;
                case nbStepPretask:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countStepPretask, limitDate);
                    nbCountStepPretask = DbTaskRunner.getResultCountPrepareStatement(countStepPretask);
                    updateDetailedValue(entry.ordinal(), nbCountStepPretask);
                    return;
                case nbStepTransfer:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countStepTransfer, limitDate);
                    nbCountStepTransfer = DbTaskRunner.getResultCountPrepareStatement(countStepTransfer);
                    updateDetailedValue(entry.ordinal(), nbCountStepTransfer);
                    return;
                case nbStepPosttask:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countStepPosttask, limitDate);
                    nbCountStepPosttask = DbTaskRunner.getResultCountPrepareStatement(countStepPosttask);
                    updateDetailedValue(entry.ordinal(), nbCountStepPosttask);
                    return;
                case nbStepAllDone:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countStepAllDone, limitDate);
                    nbCountStepAllDone = DbTaskRunner.getResultCountPrepareStatement(countStepAllDone);
                    updateDetailedValue(entry.ordinal(), nbCountStepAllDone);
                    return;
                case nbStepError:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countStepError, limitDate);
                    nbCountStepError = DbTaskRunner.getResultCountPrepareStatement(countStepError);
                    updateDetailedValue(entry.ordinal(), nbCountStepError);
                    return;
                case nbAllRunningStep:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countAllRunningStep, limitDate);
                    nbCountAllRunningStep = DbTaskRunner.getResultCountPrepareStatement(countAllRunningStep);
                    updateDetailedValue(entry.ordinal(), nbCountAllRunningStep);
                    return;
                case nbRunningStep:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countRunningStep, limitDate);
                    nbCountRunningStep = DbTaskRunner.getResultCountPrepareStatement(countRunningStep);
                    updateDetailedValue(entry.ordinal(), nbCountRunningStep);
                    return;
                case nbInitOkStep:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countInitOkStep, limitDate);
                    nbCountInitOkStep = DbTaskRunner.getResultCountPrepareStatement(countInitOkStep);
                    updateDetailedValue(entry.ordinal(), nbCountInitOkStep);
                    return;
                case nbPreProcessingOkStep:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countPreProcessingOkStep, limitDate);
                    nbCountPreProcessingOkStep = DbTaskRunner
                            .getResultCountPrepareStatement(countPreProcessingOkStep);
                    updateDetailedValue(entry.ordinal(), nbCountPreProcessingOkStep);
                    return;
                case nbTransferOkStep:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countTransferOkStep, limitDate);
                    nbCountTransferOkStep = DbTaskRunner.getResultCountPrepareStatement(countTransferOkStep);
                    updateDetailedValue(entry.ordinal(), nbCountTransferOkStep);
                    return;
                case nbPostProcessingOkStep:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countPostProcessingOkStep, limitDate);
                    nbCountPostProcessingOkStep = DbTaskRunner
                            .getResultCountPrepareStatement(countPostProcessingOkStep);
                    updateDetailedValue(entry.ordinal(), nbCountPostProcessingOkStep);
                    return;
                case nbCompleteOkStep:
                    DbTaskRunner.finishSelectOrCountPrepareStatement(countCompleteOkStep, limitDate);
                    nbCountCompleteOkStep = DbTaskRunner.getResultCountPrepareStatement(countCompleteOkStep);
                    updateDetailedValue(entry.ordinal(), nbCountCompleteOkStep);
                    return;
                }
            } catch (WaarpDatabaseNoConnectionException e) {
                logger.info("Database No Connection Error: Cannot execute Monitoring", e);
                try {
                    DbModelFactory.dbModel.validConnection(dbSession);
                } catch (WaarpDatabaseNoConnectionException e1) {
                }
            } catch (WaarpDatabaseSqlException e) {
                logger.info("Database No Connection Error: Cannot execute Monitoring", e);
                try {
                    DbModelFactory.dbModel.validConnection(dbSession);
                } catch (WaarpDatabaseNoConnectionException e1) {
                }
            }
        }
    }

    /**
     * Update a value in Error MIB part
     * 
     * @param nbMs
     * @param entry
     */
    protected void run(long nbMs, WaarpErrorValuesIndex entry) {
        synchronized (trafficCounter) {
            long limitDate = System.currentTimeMillis() - nbMs;
            if (dbSession == null || dbSession.isDisActive) {
                return;
            }
            // Error
            switch (entry) {
            case nbStatusConnectionImpossible:
                nbCountStatusConnectionImpossible = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.ConnectionImpossible, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusConnectionImpossible);
                return;
            case nbStatusServerOverloaded:
                nbCountStatusServerOverloaded = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.ServerOverloaded, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusServerOverloaded);
                return;
            case nbStatusBadAuthent:
                nbCountStatusBadAuthent = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.BadAuthent, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusBadAuthent);
                return;
            case nbStatusExternalOp:
                nbCountStatusExternalOp = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.ExternalOp, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusExternalOp);
                return;
            case nbStatusTransferError:
                nbCountStatusTransferError = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.TransferError, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusTransferError);
                return;
            case nbStatusMD5Error:
                nbCountStatusMD5Error = DbTaskRunner.getResultCountPrepareStatement(countStatus, ErrorCode.MD5Error,
                        limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusMD5Error);
                return;
            case nbStatusDisconnection:
                nbCountStatusDisconnection = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.Disconnection, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusDisconnection);
                return;
            case nbStatusFinalOp:
                nbCountStatusFinalOp = DbTaskRunner.getResultCountPrepareStatement(countStatus, ErrorCode.FinalOp,
                        limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusFinalOp);
                return;
            case nbStatusUnimplemented:
                nbCountStatusUnimplemented = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.Unimplemented, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusUnimplemented);
                return;
            case nbStatusInternal:
                nbCountStatusInternal = DbTaskRunner.getResultCountPrepareStatement(countStatus, ErrorCode.Internal,
                        limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusInternal);
                return;
            case nbStatusWarning:
                nbCountStatusWarning = DbTaskRunner.getResultCountPrepareStatement(countStatus, ErrorCode.Warning,
                        limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusWarning);
                return;
            case nbStatusQueryAlreadyFinished:
                nbCountStatusQueryAlreadyFinished = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.QueryAlreadyFinished, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusQueryAlreadyFinished);
                return;
            case nbStatusQueryStillRunning:
                nbCountStatusQueryStillRunning = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.QueryStillRunning, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusQueryStillRunning);
                return;
            case nbStatusNotKnownHost:
                nbCountStatusNotKnownHost = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.NotKnownHost, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusNotKnownHost);
                return;
            case nbStatusQueryRemotelyUnknown:
                nbCountStatusQueryRemotelyUnknown = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.QueryRemotelyUnknown, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusQueryRemotelyUnknown);
                return;
            case nbStatusCommandNotFound:
                nbCountStatusCommandNotFound = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.CommandNotFound, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusCommandNotFound);
                return;
            case nbStatusPassThroughMode:
                nbCountStatusPassThroughMode = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.PassThroughMode, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusPassThroughMode);
                return;
            case nbStatusRemoteShutdown:
                nbCountStatusRemoteShutdown = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.RemoteShutdown, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusRemoteShutdown);
                return;
            case nbStatusShutdown:
                nbCountStatusShutdown = DbTaskRunner.getResultCountPrepareStatement(countStatus, ErrorCode.Shutdown,
                        limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusShutdown);
                return;
            case nbStatusRemoteError:
                nbCountStatusRemoteError = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.RemoteError, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusRemoteError);
                return;
            case nbStatusStopped:
                nbCountStatusStopped = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.StoppedTransfer, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusStopped);
                return;
            case nbStatusCanceled:
                nbCountStatusCanceled = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.CanceledTransfer, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusCanceled);
                return;
            case nbStatusFileNotFound:
                nbCountStatusFileNotFound = DbTaskRunner.getResultCountPrepareStatement(countStatus,
                        ErrorCode.FileNotFound, limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusFileNotFound);
                return;
            case nbStatusUnknown:
                nbCountStatusUnknown = DbTaskRunner.getResultCountPrepareStatement(countStatus, ErrorCode.Unknown,
                        limitDate);
                updateErrorValue(entry.ordinal(), nbCountStatusUnknown);
                return;
            }
        }
    }
}