WaarpMOFactory.java

/*
 * This file is part of Waarp Project (named also Waarp or GG).
 *
 *  Copyright (c) 2019, Waarp SAS, 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.snmp;

import org.snmp4j.agent.MOAccess;
import org.snmp4j.agent.mo.MOAccessImpl;
import org.snmp4j.smi.Counter32;
import org.snmp4j.smi.Counter64;
import org.snmp4j.smi.Gauge32;
import org.snmp4j.smi.Integer32;
import org.snmp4j.smi.IpAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.Opaque;
import org.snmp4j.smi.SMIConstants;
import org.snmp4j.smi.TimeTicks;
import org.snmp4j.smi.Variable;
import org.waarp.snmp.interf.WaarpInterfaceVariableFactory;
import org.waarp.snmp.utils.WaarpDefaultVariableFactory;
import org.waarp.snmp.utils.WaarpMORow;
import org.waarp.snmp.utils.WaarpMOScalar;

/**
 * This class creates and returns ManagedObjects
 */
public final class WaarpMOFactory {
  /**
   * To be setup to default Factory to be used or kept as null for default one
   */
  private static WaarpInterfaceVariableFactory factory;

  /**
   * Default one
   */
  private static final WaarpInterfaceVariableFactory defaultFactory =
      new WaarpDefaultVariableFactory();

  private WaarpMOFactory() {
  }

  /**
   * @param oid
   * @param value
   * @param type
   *
   * @return an MOScalar according to the argument
   */
  public static WaarpMOScalar createReadOnly(final OID oid, final Object value,
                                             final int type,
                                             final WaarpMORow row,
                                             final int mibLevel,
                                             final int entry) {
    return new WaarpMOScalar(oid, MOAccessImpl.ACCESS_READ_ONLY,
                             getVariable(oid, value, type, mibLevel, entry),
                             row);
  }

  /**
   * @param oid
   * @param value
   * @param type
   * @param access
   *
   * @return an MOScalar according to the argument
   */
  public static WaarpMOScalar create(final OID oid, final Object value,
                                     final int type, final MOAccess access,
                                     final WaarpMORow row, final int mibLevel,
                                     final int entry) {
    return new WaarpMOScalar(oid, access,
                             getVariable(oid, value, type, mibLevel, entry),
                             row);
  }

  /**
   * Create a Variable using the arguments
   *
   * @param oid
   * @param value
   * @param type
   * @param mibLevel
   * @param entry
   *
   * @return a Variable using the arguments
   */
  public static Variable getVariable(final OID oid, final Object value,
                                     final int type, final int mibLevel,
                                     final int entry) {
    final Variable var;
    final WaarpInterfaceVariableFactory vf;
    if (getFactory() == null) {
      vf = defaultFactory;
    } else {
      vf = getFactory();
    }
    var = vf.getVariable(oid, type, mibLevel, entry);
    if (value != null) {
      switch (type) {
        case SMIConstants.SYNTAX_INTEGER:
          // case SMIConstants.SYNTAX_INTEGER32:
          ((Integer32) var).setValue((Integer) value);
          break;
        case SMIConstants.SYNTAX_OCTET_STRING:
          // case SMIConstants.SYNTAX_BITS:
          ((OctetString) var).setValue(value.toString());
          break;
        case SMIConstants.SYNTAX_NULL:
          break;
        case SMIConstants.SYNTAX_OBJECT_IDENTIFIER:
          ((OID) var).setValue(value.toString());
          break;
        case SMIConstants.SYNTAX_IPADDRESS:
          ((IpAddress) var).setValue(value.toString());
          break;
        case SMIConstants.SYNTAX_COUNTER32:
          ((Counter32) var).setValue((Long) value);
          break;
        case SMIConstants.SYNTAX_GAUGE32:
          // case SMIConstants.SYNTAX_UNSIGNED_INTEGER32:
          ((Gauge32) var).setValue((Long) value);
          break;
        case SMIConstants.SYNTAX_TIMETICKS:
          if (value instanceof TimeTicks) {
            ((TimeTicks) var).setValue(value.toString());
          } else {
            ((TimeTicks) var).setValue((Long) value);
          }
          break;
        case SMIConstants.SYNTAX_OPAQUE:
          ((Opaque) var).setValue((byte[]) value);
          break;
        case SMIConstants.SYNTAX_COUNTER64:
          ((Counter64) var).setValue((Long) value);
          break;
        default:
          throw new IllegalArgumentException(
              "Unmanaged Type: " + value.getClass());
      }
    }
    return var;
  }

  /**
   * Set a Variable value
   *
   * @param var
   * @param value
   * @param type
   */
  public static void setVariable(final Variable var, final Object value,
                                 final int type) {
    if (value != null) {
      switch (type) {
        case SMIConstants.SYNTAX_INTEGER:
          // case SMIConstants.SYNTAX_INTEGER32:
          ((Integer32) var).setValue((Integer) value);
          break;
        case SMIConstants.SYNTAX_OCTET_STRING:
          // case SMIConstants.SYNTAX_BITS:
          ((OctetString) var).setValue(value.toString());
          break;
        case SMIConstants.SYNTAX_NULL:
          break;
        case SMIConstants.SYNTAX_OBJECT_IDENTIFIER:
          ((OID) var).setValue(value.toString());
          break;
        case SMIConstants.SYNTAX_IPADDRESS:
          ((IpAddress) var).setValue(value.toString());
          break;
        case SMIConstants.SYNTAX_COUNTER32:
          ((Counter32) var).setValue((Long) value);
          break;
        case SMIConstants.SYNTAX_GAUGE32:
          // case SMIConstants.SYNTAX_UNSIGNED_INTEGER32:
          ((Gauge32) var).setValue((Long) value);
          break;
        case SMIConstants.SYNTAX_TIMETICKS:
          if (value instanceof TimeTicks) {
            ((TimeTicks) var).setValue(value.toString());
          } else {
            ((TimeTicks) var).setValue((Long) value);
          }
          break;
        case SMIConstants.SYNTAX_OPAQUE:
          ((Opaque) var).setValue((byte[]) value);
          break;
        case SMIConstants.SYNTAX_COUNTER64:
          ((Counter64) var).setValue((Long) value);
          break;
        default:
          throw new IllegalArgumentException(
              "Unmanaged Type: " + value.getClass());
      }
    }
  }

  /**
   * @return the factory
   */
  public static WaarpInterfaceVariableFactory getFactory() {
    return factory;
  }

  /**
   * @param factory the factory to set
   */
  public static void setFactory(final WaarpInterfaceVariableFactory factory) {
    WaarpMOFactory.factory = factory;
  }
}