All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.snmp4j.agent.mo.snmp.RowCount Maven / Gradle / Ivy

There is a newer version: 3.8.1
Show newest version
/*_############################################################################
  _## 
  _##  SNMP4J-Agent 3 - RowCount.java  
  _## 
  _##  Copyright (C) 2005-2021  Frank Fock (SNMP4J.org)
  _##  
  _##  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 org.snmp4j.agent.mo.snmp;

import org.snmp4j.agent.mo.MOTable;
import org.snmp4j.asn1.BER;
import org.snmp4j.asn1.BERInputStream;
import org.snmp4j.smi.*;

import java.io.IOException;
import java.io.OutputStream;

/**
 * The {@code RowCount} class implements a {@link Variable} that counts the rows of a table and returns the number
 * of rows as value. This class is a dynamic Variable, which means it needs to be cloned when serialized.
 * When cloned, a {@link Gauge32} instance with the row count of the source table will be created.
 *
 * @author Frank Fock
 * @since 3.2.1
 */
public class RowCount implements Variable {

    private MOTable table;

    /**
     * Creates a {@link RowCount} which returns zero always.
     */
    public RowCount() {
        this(null);
    }

    /**
     * Creates a row counting {@code Gauge32} variable for the specified {@link MOTable}.
     * @param moTable
     *    a table instance whose rows should be counted by this variable.
     */
    public RowCount(MOTable moTable) {
        this.table = moTable;
    }

    /**
     * Gets the number of rows in the associated table as unsigned long value.
     * @return
     *    the number of rows in the associated table (greater or equal to zero). Zero is returned if a {@code null}
     *    table is associated.
     */
    public long getValue() {
        return (table == null || table.getModel() == null) ? 0 : table.getModel().getRowCount();
    }

    @Override
    public int compareTo(Variable o) {
        long diff = (getValue() - ((UnsignedInteger32) o).getValue());
        if (diff < 0) {
            return -1;
        } else if (diff > 0) {
            return 1;
        }
        return 0;
    }

    /**
     * Clones this variable. Cloning can be used by the SNMP4J API to better support concurrency by creating a clone for
     * internal processing. The content of this object is independent to the content of the clone. Thus, changes to the
     * clone will have no effect to this object.
     *
     * @return a new instance of this {@code Variable} with the same value.
     */
    @Override
    public Object clone() {
        return new Gauge32(getValue());
    }

    /**
     * Gets the ASN.1 syntax identifier value of this SNMP variable.
     *
     * @return an integer value < 128 for regular SMI objects and a value >= 128 for exception values like
     * noSuchObject, noSuchInstance, and endOfMibView.
     */
    @Override
    public int getSyntax() {
        return SMIConstants.SYNTAX_GAUGE32;
    }

    /**
     * Checks whether this variable represents an exception like noSuchObject, noSuchInstance, and endOfMibView.
     *
     * @return {@code true} if the syntax of this variable is an instance of {@code Null} and its syntax equals one of
     * the following:
     * 
    *
  • {@link SMIConstants#EXCEPTION_NO_SUCH_OBJECT}
  • *
  • {@link SMIConstants#EXCEPTION_NO_SUCH_INSTANCE}
  • *
  • {@link SMIConstants#EXCEPTION_END_OF_MIB_VIEW}
  • *
*/ @Override public boolean isException() { return false; } /** * Returns an integer representation of this variable if such a representation exists. * * @return an integer value (if the native representation of this variable would be a long, then the long value will * be casted to int). * @throws UnsupportedOperationException * if an integer representation does not exists for this Variable. */ @Override public int toInt() { return (int)getValue(); } /** * Returns a long representation of this variable if such a representation exists. * * @return a long value. * @throws UnsupportedOperationException * if a long representation does not exists for this Variable. */ @Override public long toLong() { return getValue(); } /** * Gets a textual description of this Variable. * * @return a textual description like 'Integer32' as used in the Structure of Management Information (SMI) modules. * '?' is returned if the syntax is unknown. */ @Override public String getSyntaxString() { return new Gauge32().getSyntaxString(); } /** * Converts the value of this {@code Variable} to a (sub-)index value. * * @param impliedLength * specifies if the sub-index has an implied length. This parameter applies to variable length variables * only (e.g. {@link OctetString} and {@link OID}). For other variables it has no effect. * * @return an OID that represents this value as an (sub-)index. * @throws UnsupportedOperationException * if this variable cannot be used in an index. */ @Override public OID toSubIndex(boolean impliedLength) { return new Gauge32(getValue()).toSubIndex(impliedLength); } /** * Sets the value of this {@code Variable} from the supplied (sub-)index. * * @param subIndex * the sub-index OID. * @param impliedLength * specifies if the sub-index has an implied length. This parameter applies to variable length variables * only (e.g. {@link OctetString} and {@link OID}). For other variables it has no effect. * * @throws UnsupportedOperationException * if this variable cannot be used in an index. */ @Override public void fromSubIndex(OID subIndex, boolean impliedLength) { throw new UnsupportedOperationException(); } /** * Indicates whether this variable is dynamic. If a variable is dynamic, precautions have to be taken when a * Variable is serialized using BER encoding, because between determining the length with {@link #getBERLength()} * for encoding enclosing SEQUENCES and the actual encoding of the Variable itself with {@link #encodeBER} changes * to the value need to be blocked by synchronization. In order to ensure proper synchronization if a {@code * Variable} is dynamic, modifications of the variables content need to synchronize on the {@code Variable} * instance. This can be achieved for the standard SMI Variable implementations for example by *
     *    public static modifyVariable(Integer32 variable, int value)
     *      synchronize(variable) {
     *        variable.setValue(value);
     *      }
     *    }
     * 
* * @return {@code true} because the variable might change its value between two calls to {@link #getBERLength()} and * {@link #encodeBER}. */ @Override public boolean isDynamic() { return true; } /** * Returns the length of this {@code BERSerializable} object in bytes when encoded according to the Basic * Encoding Rules (BER). * * @return the BER encoded length of this variable. */ @Override public int getBERLength() { return UnsignedInteger32.getBERLengthFromValue(getValue()); } /** * Returns the length of the payload of this {@code BERSerializable} object in bytes when encoded according to * the Basic Encoding Rules (BER). * * @return the BER encoded length of this variable. */ @Override public int getBERPayloadLength() { return getBERLength(); } /** * Decodes a {@code Variable} from an {@code InputStream}. * * @param inputStream * an {@code InputStream} containing a BER encoded byte stream. * * @throws IOException * if the stream could not be decoded by using BER rules. */ @Override public void decodeBER(BERInputStream inputStream) throws java.io.IOException { throw new UnsupportedOperationException("RowCount cannot be decoded from BER"); } /** * Encodes a {@code Variable} to an {@code OutputStream}. * * @param outputStream * an {@code OutputStream}. * * @throws IOException * if an error occurs while writing to the stream. */ @Override public void encodeBER(OutputStream outputStream) throws java.io.IOException { BER.encodeUnsignedInteger(outputStream, BER.GAUGE, getValue()); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy