
CHANGE LOG OF SNMP4J-Agent
==========================

[2026-08-02] v3.10.1 (Requires SNMP4J v3.13.1 or later)

* SECURITY: DefaultAgentAuditPolicy now denies any modifying file operation, that is WRITE, CREATE, and
  DELETE, for the AgentPolicyProfile.FileAccess.WORKING_DIRECTORY_READONLY file access level. Before, such an
  operation was permitted for every file within the agent's working directory, because the READ operation
  check was combined with the explicitly allowed files check only, instead of with the working directory
  check as well.
* Improved: AgentConfigManager does no longer allow overwriting the auditPolicy once it has been set.

[2026-07-28] v3.10.0 (Requires SNMP4J v3.13.0 or later)

* SECURITY: SnmpTlsTmMib now enforces the rule of RFC 6353 that a row of the snmpTlstmAddrTable must not
  become active while its snmpTlstmAddrServerFingerprint is blank and its snmpTlstmAddrServerIdentity is the
  '*' wildcard (which would insecurely accept any presented server certificate) for all ways of activating a
  row. Before, such a row could be created with createAndGo(4) or be activated by setting
  snmpTlstmAddrRowStatus to active(1) alone, because the check was performed only when the fingerprint or the
  identity column was part of a SET on an already active row.
* SECURITY: The columns that RFC 6353 does not allow to be modified while their row is active(1), that is
  snmpTlstmCertToTSNFingerprint, snmpTlstmCertToTSNMapType, snmpTlstmCertToTSNData,
  snmpTlstmParamsClientFingerprint, and snmpTlstmAddrServerFingerprint, are not mutable in service anymore.
  A SET on an active row now returns an inconsistentValue error as required.
* Fixed: The snmpTlstmCertCommonName mapping type mapped a certificate to a tmSecurityName using the whole
  subject distinguished name (for example, 'CN=host,O=Example,C=DE') instead of its CommonName only. The
  CommonName is now extracted from the subject and encoded as UTF-8 as defined by RFC 6353.
* Fixed: Fingerprints of the snmpTlstmCertToTSNTable are now matched using the hash algorithm
  identified by the first octet of their SnmpTLSFingerprint value (see RFC 6353), by means of the new
  TLSTMUtil.isMatchingFingerprint(..) of SNMP4J 3.13.0. Before, the hash algorithm was derived from the
  signature algorithm of the certificate and the algorithm identifier octet was compared as if it were part
  of the hash value, so RFC 6353 conformant fingerprint values never matched.
* Fixed: snmpTlstmCertToTSNTableLastChanged, snmpTlstmParamsTableLastChanged, and
  snmpTlstmAddrTableLastChanged are now updated with the value of sysUpTime.0 whenever their table is
  modified - before they always returned 0. These objects are volatile now, because RFC 6353 requires them to
  report 0 until their table has been modified after the command responder has been started.
* Fixed: The snmpTlstmCertSpecified mapping type now fails, and thus the search continues with the next row
  of the snmpTlstmCertToTSNTable, if snmpTlstmCertToTSNData has a zero length value as required by RFC 6353.
  Before, an empty tmSecurityName was returned.
* Fixed: A rfc822Name subjectAltName without local or host part is now ignored instead of causing an
  ArrayIndexOutOfBoundsException while it is mapped to a tmSecurityName.
* Fixed: The index of the snmpTlstmCertToTSNTable is now created with the SMI syntax Unsigned32 instead of
  Integer32 and the index value 0 is rejected, because snmpTlstmCertToTSNID is defined as
  Unsigned32 (1..4294967295) by RFC 6353.
* Improved: The snmpTlstmCertSANAny mapping type now uses the first rfc822Name, dNSName, or iPAddress
  subjectAltName value that is found in the certificate as required by RFC 6353. Before, a rfc822Name was
  always preferred over a dNSName and a dNSName over an iPAddress, regardless of their order in the
  certificate.
* Improved: SnmpTlsTmMib.isClientCertificateAccepted(..) does not reject a client certificate anymore that
  does not match any fingerprint of the snmpTlstmCertToTSNTable while that table has active rows. RFC 6353
  accepts a client certificate that either matches a fingerprint of that table or that has been validated
  against an established trust anchor, thus the certification path validation of the transport mapping needs
  to get the chance to accept such a certificate. A row whose fingerprint identifies a CA certificate of the
  certification path is still taken into account by SnmpTlsTmMib.getSecurityName(..).
* Added: SnmpTlsTmMib.applyRFC6353Restrictions() applies the restrictions of RFC 6353 that cannot be derived
  from the SMI definitions of the SNMP-TLS-TM-MIB. It is called by the SnmpTlsTmMib(MOFactory) constructor
  and needs to be called by sub-classes that call createMO(MOFactory) directly.

[2026-07-15] v3.9.2 (Requires SNMP4J v3.12.2 or later)

* SECURITY: VacmMIB now selects the best matching vacmAccessTable entry by scoring each candidate
  instead of an order-dependent chained condition. Following RFC 3415 section 4.4.2, an entry with an
  exact securityModel is now preferred over one using anySecurityModel, an exact context match over a
  (shorter) prefix match, and a higher securityLevel over a lower one. This removes a latent access
  decision that depended on table iteration order.
* SECURITY: VacmMIB.getViewName(..) now also verifies that the requested context is supported before
  resolving a view (defense in depth), so callers reusing it as an entry point cannot obtain a view for
  a context that is not served by the agent. VACM.getViewName returns null for unsupported contexts.
* SECURITY: Removed full read-write access for SNMPv3 noAuthNoPriv "unsec" users from SampleAgent's
  sample configuration. Limited all auhtNoPriv users to read-only access limited to system group.
* SECURITY: Further improved SampleAgentConfig.properties VACM configuration: Removed 'unsec' noAuthNoPriv
  access from broader "viewer" views and assigned it to "minaccessgroup" (like all noPriv users).
* Added: New org.snmp4j.agent.io.prop.PropertyMOTreeBuilder builds an in-memory MIBTree from an MOInput
  formatted property configuration (e.g. SampleAgentConfig.properties), reusing PropertyMOInput for value
  parsing. Values that reference runtime instances which cannot be resolved statically (e.g. {$oid}) are
  preserved as UnresolvedReference placeholders (through the new ReferenceVariableProvider) so that the
  configured reference remains visible.
* Added: New org.snmp4j.agent.util.MIBTreeFormatter interface with a MarkdownMIBTreeFormatter implementation
  that renders a MIBTree as a compact GitHub flavored Markdown overview (collapsed OID tree, scalars with
  their SMI syntax, and conceptual tables as Markdown tables).
* Added: The SampleAgent accepts the optional "-write-init-config <file>" command line option that writes a
  human readable Markdown overview of the initial MIB configuration (using PropertyMOTreeBuilder and
  MarkdownMIBTreeFormatter) before the agent starts. Any provided "-viewer"/"-admin" pass keys are reflected
  in the overview.

[2026-06-24] v3.9.1 (Requires SNMP4J v3.12.2 or later)

* Updated: Dependency to SNMP4j to 3.12.2 to include security fix for SecretOctetString which
  could lead to secrets being leaked in logs.
* Updated: SNMP4J-CONFIG-MIB.txt to reflect the new snmp4jCfgStorageID and the changes on the
  snmp4jCfgStoragePath MIB objects.

[2026-06-23] v3.9.0 (Requires SNMP4J v3.12.1 or later)

* SECURITY CVE-2026-39006: Although the CVE-2026-39006 describes a configuration and setup issue
  when using the SampleAgent with default credentials and remote network access, the
  snmp4jCfgStoragePathValidator now does not allow to modify the configuration file (and thus create new
  configuration files) if the Snmp4jConfigMib.snmp4jCfgStoragePath is not set.
  Setting it to "." (default) will only allow to store configuration files in the current working directory.
* SECURITY: CommandProcessor.setVacm(..) and CommandProcessor.setCoexistenceProvider(..) not reject
  setting null values and replacing an already set value. This measure is for security reasons to avoid
  accidentally setting a null value or replacing an already set value.
  If any of these values (VACM or CoexistenceProvider) is set to null, any request to the agent using
  this CommandProcessor will be rejected.
* SECURITY: DefaultMOInput now installs a strict java.io.ObjectInputFilter (AgentStateDeserializationFilter) on
  the ObjectInputStream that is used to restore persistent agent state. Only the classes that are actually
  written by DefaultMOOutput (the agent IO model and the SNMP4J SMI Variable types) plus the required JDK types
  are allowed to be deserialized; all other classes as well as overly deep or large object graphs are rejected.
  New DefaultMOInput(ObjectInputStream, Collection<Class<?>>) and AgentStateDeserializationFilter constructors
  allow registering additional classes for custom Variable/Context subclasses.
* SECURITY: Hardened the SampleAgentConfig.properties VACM configuration: SNMPv1 and SNMPv2c access via the
  "public" community is now read-only and limited to the "system" subtree (1.3.6.1.2.1.1), i.e. it cannot read
  other objects and cannot SET any object. The "viewer" role (USM authNoPriv user "SHA") is limited to read-only
  access of selected SNMP*-MIB subtrees (1.3.6.1.6.3.18, .10, .13, .14, .12 and 1.3.6.1.2.1.74).
* Added: PropertyMOInput now supports random OctetString values: "{r[:length]}name" generates a printable and
  "{R[:length]}name" a full 8-bit random OctetString. Generated random values are named and reused for later
  references with the same name. Named values can be predefined before deserialization through
  PropertyMOInput.setRandomValue(name, value) (with getRandomValue/getRandomValues accessors), e.g. to inject
  externally provided secrets into the configuration.
* Added: The SampleAgent accepts the optional "-viewer <passkey>" and "-admin <passkey>" command line options
  and injects them as the named "viewer" and "admin" secrets into the PropertyMOInput configuration. If a pass
  key is not provided, a random one is generated and logged.
* Added: New agent audit framework in the org.snmp4j.agent.audit package. The AgentAuditPolicy interface (with
  the DefaultAgentAuditPolicy implementation driven by an AgentPolicyProfile) audits managed object access
  (MOServerLookupListener), network transport access (SNMP4J TransportAuditListener) and file system access
  (new FileAuditListener/FileAuditEvent). The configurable AgentAuditLevel (OFF, LOG, WARN, RESTRICT) controls
  whether audited operations are only logged, logged as warnings on policy violations, or additionally denied
  where enforcement is possible (transport and file access; managed object access remains enforced by VACM).
  The audit policy is wired into AgentConfigManager (new constructor and get/setAuditPolicy accessors), the
  persistence providers, and the new AgentEngineBootsCounterFile, and the SampleAgent demonstrates auditing of
  its state configuration.
* Added: AgentConfigManager.getMessageDispatcher() accessor.
* Fixed: Snmp4jConfigMib now rejects duplicate snmp4jCfgStoragePath usage so that configuration files must be
  unique.
* Fixed: snmp4jCfgStorageOperation validation on row creation could fail due to a race condition based on a
  shared value reference when the value was provided directly together with an operation.
* Improved: MOServerLookupEvent.toString() output.
* Updated: Implemented the new WorkerTask.shutdown() and WorkerTask.join(long) methods (required by SNMP4J
  v3.12.0) for the CommandProcessor command tasks and the NotificationTask.
* Updated: snmp4j dependency to v3.12.1 and maven-jar-plugin to v3.5.0.


[2025-11-24] v3.8.3 (Requires SNMP4J v3.9.6 or later)

* Fixed: commitFail on SET request on nlmConfigLogFilterName because of IndexOutOfBoundException.
* Improved: Performance of StaticMOGroup.findOID(MOScope) for large number of ManagedObjects.
* Updated: Maven plugin dependencies.

[2025-01-05] v3.8.2 (Requires SNMP4J v3.9.0 or later)

* Fixed: AgentConfigManager.shutdown() could log a NullPointerException if persistenceProvider is null.
* Fixed: NullPointerException in CommandResponder.sendResponse with maxRepetitions is set to 0 in GETBULK and
  non-repeaters are >0 but less total length of the GETBULK PDU variable bindings.
* Updated: Maven plugin dependencies.

[2024-04-27] v3.8.1 (Requires SNMP4J v3.8.2 or later)

* Fixed: As of RFC3413 §3.2 (5) if the snmpUnknownContexts.0 counter is incremented the corresponding request PDU
  must be responded with a report PDU.
* Added: Missing constructors for exported objects have been added.

[2024-04-23] v3.8.0 (Requires SNMP4J v3.8.1 or later)

* SECURITY: VACM access rights limiting access within multi OID ManagedObjects like DefaultMOTable did not work
  properly for GETNEXT and GETBULK requests because accessible objects could have been ignored if non-accessible
  objects needed to be skipped by the NEXT operation before reaching the accessible object. If an accessible object,
  was found first on a sub-request non-included or excluded objects of an effective VACM view could have been disclosed
  if the view excludes access to certain objects within the scope of a ManagedObject, i.e., DefaultMOTable,
  StaticMOGroup, and MOSubtreeProxy.
  This has been fixed by adding the ManagedObject.find(MOQuery query, Function<OID, Boolean> filter) and
  ManagedObject.next(SR request, Function<OID, Boolean> filter) methods which filter out any OIDs that are not included
  in the VACM view.
  The CommandProcessor uses both methods as part of GETNEXT/GETBULK processing instead of calling ManagedObject.find
  (which is still called indirectly) and ManagedObject.next(SR request) which is not used anymore (now deprecated).
* Fixed: Option CommandProcessor.setLockNonNextRequestsSortedByVbOid flag to enable reordering of locking
  SNMP sub-requests based on their OID did not work correctly if same OID was given more than once within same PDU.
* Fixed: Implemented snmpUnknownContexts.0 Counter and corresponding checks in CommandProcessor.isContextNotSupported().
* Improved: Info logging in NotificationOriginatorImpl.notify when INFORM response has not been received.

[2024-04-11] v3.7.2 (Requires SNMP4J v3.8.0 or later)

* Added: Added MOPersistentProvider.close() method.

[2024-04-05] v3.7.1 (Requires SNMP4J v3.8.0 or later)

* Fixed: Regression in 3.7.0 CommandProcessor.GetHandler NullPointer exception on
  GET requests with noSuchObject exceptions.
* Fixed: OID returned in RESPONSE PDU for a GET request was wrong if such an instance
  does not exist or such an object does not exists (noSuchInstance and noSuchObject
  exception). According to RFC 3416 §4.2.1, the returned OID must be the OID of the
  corresponding variable binding from the request. Instead, the OID of the scalar was
  returned managing the accessed OID region.

[2024-04-02] v3.7.0 (Requires SNMP4J v3.8.0 or later)

* Fixed: SnmpNotificationMIB.passesFilter(OID notificationID, VariableBinding[] vbs,
  List<DefaultMOMutableRow2PC> profiles) did return false (i.e., "do not send notification") when
  no matching filter was found for a matching profile. According to RFC 3413 §6 this behavior is
  wrong and notification should be sent instead.
* Fixed: Deadlock in DefaultMOServer.lock(..) if timeoutMillis are set to 0.
* Fixed: Race condition in NotificationOriginatorImpl.notify(..) if notificationEventID is being modified by another
  thread before notifications are actually sent out.
* Fixed: nlmLogTable: NotificationLogMib.NlmConfigGlobalEntryLimit.commit() tried update limits using profileName that
  is not available by this object. This update is now executed by NlmConfigLogEntryRow.commit(..).
* Fixed: VacmMIB.VacmContextTableModel.tailIterator() did not return objects in correct order for all cases
  because it used the wrong comparator for its binarySearch operation.
* Fixed: snmpTargetAddrTMask did not validate length of mask to match length of the corresponding
  snmpTargetAddrTAddress.
* Fixed: MOPropertyInput threw NullPointerException on loading DefaultMOTable data from a config properties file
  when table data was defined for a supported context.
* Fixed: Implemented snmpUnknownContexts.0 Counter and corresponding checks in CommandProcessor.isContextNotSupported().
* Changed: Snmp4JLogMib's textual convention LogLevel now allows to set notSpecified(0) too.
* Improved: MOMutableColum.validate now takes 3rd parameter to be able to identify the cell instance to be validated.
  which is sometime necessary to verify a value against other values in a MIB.
* Improved: Multi-threading support by copying notificationID before processing notifications.
* Improved: NotificationOriginator uses common sysUpTime by default for the same notification sent to different
  targets.
* Improved: coldStart notification is sent asynchronously.
* Improved: Logging if a VB OID of a notification payload is not granted access and therefore notification is not sent.
* Improved: Unlock of ManagedObjects now uses notifyAll() instead notify() to avoid temporary deadlocks across 3 or more
  ManagedObjects and SET requests.
* Improved: GET, GETNEXT, and GETBULK requests can now be included in a lock strategy for locking too. GET requests
  and SET requests are first locked (if necessary by lock strategy) and then processed if are locks have been acquired.
  For GETNEXT and GETBULK locks are acquired by sub-request step-by-step. The search operation for NEXT-type requests
  can require several locks per sub-requests. Locking all managed objects before processing the requests, would be not
  efficient for these request types.
* Improved: LookupListener.useCompleted(SubRequest) is now called too for GET, GETNEXT, and GETBULK requests.
* Improved: Even if exceptions are thrown while MangedObjects are locked by request processing, these ManagedObjects
  are properly unlocked when request is finished.
* Added: Support for "configurable-only" SerializableManagedObjects. By setting setVolatile(true) and
  setConfigurable(false), the behaviour before <3.7.0 can be restored. If setConfigurable(true) (default)
  and isVolatile(true) objects can be configured using MOInput (for example from a properties file) but not
  persistently saved or restored. Although DefaultMOTable and MOScalar objects are configurable by default,
  MOScalar is not configurable if its value has the syntax Counter32, Counter64, or TimeTicks.
* Added: Option CommandProcessor.setLockNonNextRequestsSortedByVbOid flag to enable/disable reordering of locking
  SNMP subrequests based on their OID to implement a hierarchy based deadlock prevention for processing SET and
  GET requests.
  This reordering is disabled by default. If enabled the sub-requests of SET and GET requests will be locked in the
  lexicographic order of the VB OIDs. This eliminates any likelihood of deadlocks caused by intersecting PDU requests
  (at least with the default LockStrategy that locks for SET requests only).
* Added: Option DefaultMOServer.setDeadlockPreventionEnabled (disabled by default) to enable super-thread based
  deadlock prevention. Enabling this option reduces overall performance if deadlocks are prevented by OID hierarchy
  based lock access (see SnmpRequest.USE_VBS_REORDERING_ON_SET_TO_PREVENT_DEADLOCKS for SNMP requests) anyway.
* Added: Unit tests for SNMP4J's TableUtils with sparse table with null columns and fewer rows than columns and
  single max columns and repetitions per PDU.
* Added: AgentConfigManager.getCommandProcessor()
* Added: VACM.hasContext(OctetString contextName) with default implementation which returns true (which provides
  full backward compatibility).
* Added: MOServer.unlockNow(..) which unlocks a ManagedObject for a specified owner regardless of any recursive locks.
* Added: MOServer.waitForUnlockedState(long timeoutMillis) and AgentConfigManager.waitUntilPendingModificationsDone()
  to support a clean shutdown of a SNMP agent by waiting for write access operations to complete on managed objects
  before saving agent state to persistent storage.

[2024-01-25] v3.6.8 (Requires SNMP4J v3.7.8 or later)

* Fixed: AgentConfigManager.getAgentNotificationOriginator() did not return the multi-threaded NotificationOriginator
  implemented by CommandProcessor. Instead, it returned the same NotificationOriginator as used by the
  AgentConfigManager.
* Fixed: SnapshotAgent.registerManagedObjects() does not register any objects from snapshot file if there are objects
  registered starting with “1.1.” *and* “1.0.”.
* Improved: SnapshotAgent now uses AgentConfigManager instead of deprecated BaseAgent.
* Updated: Copyright header for all source files.

[2023-08-07] v3.6.7 (Requires SNMP4J v3.7.7 or later)

* Fixed [AS-41]: NullPointerException in UsmMIB.usmUserChange when USM.removeAllUsers is being called.

[2023-03-21] v3.6.6 (Requires SNMP4J v3.7.7 or later)

* Improved: DefaultMOServer.iterator(..) is now synchronized to avoid ConcurrentModificationException
  when calling the method while the registration of managed objects is modified concurrently.

[2022-11-11] v3.6.5 (Requires SNMP4J v3.7.4 or later)

* SECURITY [AS-38]: Command processing of GETBULK PDUs with large max-repetition values could
  lead to DoS/OutOfMemory when used in conjunction with a Snmp4J-AgentX master agent.
  Now repetition sub-requests are limited to the maximum theoretical possible variable bindings
  fitting into the maximum sized response PDU - according the maximum outbound message size.

[2022-10-14] v3.6.4 (Requires SNMP4J v3.7.3 or later)

* Fixed: Possible NullPointerExceptions in SnmpTargetMIB.getTarget(..) if SnmpTlsTmMib is present but does not
  provide a matching target. This fixes a regression caused by [AS-36].

[2022-10-08] v3.6.3 (Requires SNMP4J v3.7.3 or later)

* Fixed: Java 9 API compatibility by adding maven.compiler.release option the maven-compiler-plugin.

[2022-10-07] v3.6.2 (Requires SNMP4J v3.7.2 or later)

* Fixed [AS-36]: TLSTM Notifications: Despite configuring authPriv SecurityLevel notifications
  are always sent with noAuthNoPriv.

[2022-09-30] v3.6.1 (Requires SNMP4J v3.7.1 or later)

* Added: Unix domain address handling support.
* Fixed: Context specific MIB instance loading from properties files in PropertyMOInput.
* Fixed: TDomainAddressFactory.getTransportDomain(Address address) to be able to return
  TlsAddress if Address is TlsAddress.

[2022-06-14] v3.6.0 (Requires SNMP4J v3.7.0 or later)

* Improved: MOScalar.setValue(..) now fires MOChangeEvent.afterMOChange too. That allows
  SNMP4J-Agent-DB to store scalar value modifications done programmatically like it was
  already the case for DefaultMOTable rows of SNMP4J-Agent before version 3.6.0.

[2022-05-16] v3.5.6 (Requires SNMP4J v3.7.0 or later)

* Updated: Dependency to SNMP4J 3.7.0.

[2021-12-31] v3.5.5 (Requires SNMP4J v3.6.4 or later)

* Improved [AS-28]: Added getter and setter for modifying AgentConfigManager configuration factory and
  persistence provider.

[2021-12-15] v3.5.4 (Requires SNMP4J v3.6.4 or later)

* Fixed [AS-26]: Added missing constructor and setter for modifying PropertyMOInput's import mode.

[2021-12-04] v3.5.3 (Requires SNMP4J v3.6.3 or later)

* Fixed [AS-24]: Made sure that authPassword and privPassword hidden columns are null if user is localised.
  This fixes a regression caused by SFJ-222 that generated wrong keys if users were initially loaded
  from properties file and localisation key was given.
* Improved: Suppressed redundant usmUserChange event processing on USM entries created by UsmMIB itself.
* Changed: Re-enabled secret logging in SampleAgent by default.

[2021-11-23] v3.5.2 (Requires SNMP4J v3.6.2 or later)

* Fixed: Typo in MOQuery.subtractScope(MOScope scope) method name (if used in instrumentation code this
  change will cause changes in that code, i.e. there is no binary compatibility then).
* Improved: JavaDoc.

[2021-11-15] v3.5.1 (Requires SNMP4J v3.6.1 or later)

* Fixed [AS-23]: USM persistent data using SNMP4J-Agent-DB was not correctly restored for authNoPriv and authPriv
  users that have been changed using UsmKeyChange method via SNMP (authPriv was only affected if only a single
  key (auth or priv) was changed.
* Fixed [SFJ-244]: Removed secret information (keys and passwords) from any log output. To reactivate output
  use SNMP4JSettings.setSecretLoggingEnabled(true).
* Improved: JavaDoc.

[2021-05-26] v3.5.0 (Requires SNMP4J v3.5.1 or later)

* Fixed [SFJ-241]: SNMP4J-Agent RowStatus returns wrongValue instead inconsistentValue when new status
  transition is not allowed.
* Improved [SFJ-240]: Moved org.snmp4j.agent.cfg package supporting engine ID and boots counter
  persistence from SNMP4J-Agent to SNMP4J org.snmp4j.cfg in order to simplify the same for SNMP command
  generators too.
* Added support for multiple agents per Java process in AgentConfigManager and SampleAgent.
* Added SFJ-201: Allow ordering of ManagedObjects for store/restore by priorities using
  SNMP4J-CONFIG-MIB snmp4jCfgStorageSeqTable.
* Changed: Made SnmpTargetAddrExtEntryRow public.

[2020-11-13] v3.3.6 (Requires SNMP4J v3.4.4 or later)

* Fixed SFJ-233: SNMP4J-Agent's SnmpFrameworkMIB needs USM defined to support localEngineID object
  although this is independently defined.
* Fixed SFJ-222: Error after changing/using a USM user and then trying to reset all user's passwords/keys
  by loading them from persistent storage again (user key is not reset)
* Enhanced SNMP4J-CONFIG-MIB to support resetting configuration to factory default.
* Updated dependencies to SNMP4J and maven plugins.

[2020-09-21] v3.3.5 (Requires SNMP4J v3.4.3 or later)

* Updated dependencies to SNMP4J and maven plugins.

[2020-05-25] v3.3.4 (Requires SNMP4J v3.4.1 or later)

* Fixed [SFJ-228]: Added missing DH kickstart with PBKDF2 key derivation from DH shared key (z) to
  USM auth/priv keys.
* Removed: DHGroups class which has been moved to package org.snmp4j.security.dh of SNMP4J 3.4.1.
* Fixed [SFJ-227]: SNMP4J-Agent RowStatus.commit(..) does not release lock if change set is empty.

[2020-04-27] v3.3.3 (Requires SNMP4J v3.4.0 or later)

* Fixed [SFJ-226]: usmDHUserPrivKeyChange produces wrong priv key length if authentication protocol uses different
  key length than privacy protocol.
* Fixed: Typo in DisplayString.MIN_SIZE
* Fixed: JavaDoc typos.
* Fixed: Added missing counter listener for snmpv2MIB in AgentConfigManager.

[2020-03-16] v3.3.2 (Requires SNMP4J v3.4.0 or later)

* Fixed [SFJ-222]: USM user with modified authentication or privacy passphrase cannot be used after reload from
  persistent storage using DefaultMOPersistenceProvider (SNMP4J-Agent-DB persistence worked correctly though).

[2020-03-12] v3.3.1 (Requires SNMP4J v3.4.0 or later)

* Fixed [SFJ-222]: Error after changing/using a USM user and then trying to reset all user's passwords by loading
  them from persistent storage again.
* Improved: DefaultMOTable.removeRow returns removed row even if row change listener deletes the row as side effect.
* Added: DefaultMOTableRow.getColumnValue to get a columns value by type (instead by index).
* Added: StorageType.getStorageType method to access the storage type value of a row efficiently.

[2020-03-05] v3.3.0 (Requires SNMP4J v3.4.0 or later)

* Fixed [SFJ-196]: UsmUser incorrectly removed from USM when restoring agent state after version upgrade from 2.x to
  3.x. An affected agent will show a DEBUG log sequence while restoring
  agent state as follows:
    Updated row...
    Adding user...
    Removed user with secName=...
    Loaded row DefaultMOMutableRow2PC...
  A well behaving agent should log this sequence instead:
    Updated row...
    Adding user...
* Added [SFJ-217]: Add EngineIdProvider support to EngineBootsCounterFile.
* Fixed [SFJ-219]: DateAndTime columnar object's validate method hides super class moValidateListener mechanism.
* Fixed [SFJ-220]: Deleting a row using RowStatus destroy(6) with StorageType permanent(4) is not rejected.

[2019-11-11] v3.2.3 (Requires SNMP4J v3.3.3 or later)

* SECURITY: Fixed SnmpTlsTmMib.isClientCertificateAccepted which did not use the client public key
  fingerprint correctly to match the locally configured fingerprint.
* Fixed: TLS configuration for SampleAgent did not contain a fingerprint to TLSPRIV mapping for DTLS test
  communication.
* Added: SubRequest is now available from MOChangeEvent if the change event is triggered by a (SNMP) request.

[2019-08-13] v3.2.2 (Requires SNMP4J v3.3.1 or later)

* Fixed [SFJ-207]: SNMP4J-Agent NotificationOriginatorImpl does not use snmpTlsAddrTable when sending
  TLS notifications.
* Fixed: SnmpTargetMib.getTarget, SnmpTargetMib.SnmpTargetAddrEntryRow.getTarget and .getTlsTmTarget methods returned
  target definitions for inactive rows. Now only active rows will be used to determined target definitions.

[2019-06-24] v3.2.1 (Requires SNMP4J v3.2.0 or later)

* Fixed [SFJ-202]: CertifiedTarget for SNMPv3 TLS notifications not handled in NotificationOriginatorImpl.
  This includes fixes to the TlsTmMib regarding (D)TLS target resolving as well as fixes to the SNMP4J
  MessageDispatcher and TransportMappings in order to be able to use a "client mode" transport mapping
  with a different source port than the "server" mode TLS transport mapping that acts as command responder.
* Added: TLSv1.3 support for SampleAgent command line parsing and added TLS notification target default
  configuration.

[2019-04-18] v3.2.0 (Requires SNMP4J v3.1.0 or later)

* Added [SFJ-200]: Added RandomAccessObject.isVolatile(OID) to check if a sub-instance (i.e., table row)
  is volatile or not. This is needed for filtering volatile rows by SNMP4J-Agent-DB when persistently
  storing rows of a table.
* Fixed: Possible NullPointerException in RowStatus.commit if the new value does not differ to the existing
  RowStatus.
* Fixed: StaticMOGroup and MOSubtreeProxy now implement the mandatory new GenericManagedObject interface too.

[2019-04-16] v3.1.1 (Requires SNMP4J v3.1.0 or later)

* Fixed: MOServer instances could have been added to the CommandProcessor twice. Causing additional processing time
  at end of MIB (view).
* Changed: CommandProcessor addMOServer and removeMOServer now return boolean true on success and the first
  now logs a warning if the same MOServer is added twice and will not add it again.
* Improved: Moved adding MOServer instances to CommandProcessor from its constructor to the
  AgentConfigManager.initialize method.

[2019-03-13] v3.1.0 (Requires SNMP4J v3.1.0 or later)

* Fixed [SFJ-188]: MOTableSizeLimit checkLimits returns false, although a table contains less rows than "limit".
  (Regression in 3.0.0).
* Improved: Generics usage and added GenericManagedObject interface that marks ManagedObject instances that can
  be used with any type of org.snmp4j.agent.request.SubRequest, thus with any type of agent
  (regular, master, and sub-agent).
* Added: ManagedObject now takes a type parameter SR for SubRequest.
* Improved: Code readability for MOServerLookupEvent by removing unnecessary type parameters.
* Fixed: Java 9 module info: made snmp4j requirement transitive.
* Removed SSH mib file.
* Fixed: Repo URLs.

[2018-10-15] v3.0.3 (Requires SNMP4J v3.0.3 or later)

* Fixed possible NullPointerException in MOTableIndex.
* Fixed generic type of AgentStateListeners in AgentConfigManager.

[2018-10-07] v3.0.2 (Requires SNMP4J v3.0.1 or later)

* Fixed [SFJ-178]: Default implementation of
  MOFactory.createSubIndex(OID oid, int smiSyntax, int minLength, int maxLength) does not create sub-index
  with OID.
* Added: MOServer.registerNew to register ManagedObjects without exception handling for duplicate registrations.
* Fixed: Removed dependency to class AgentConfigManager from AgentState interface.

[2018-09-28] v3.0.1 (Requires SNMP4J v3.0.1 or later)

* Fixed [SFJ-176]: SNMP4J-Agent does not restore SnmpCommunityMib content properly when using SNMP4J-Agent-DB.

[2018-09-24] v3.0.0 (Requires SNMP4J v3.0.1 or later)

* Added [SFJ-114]:Implemented DTLS support according to RFC6353 by DTLSTM.
* Added [SFJ-175]: Support for Java 9 modules.
* Added [SFJ-152]: Diffie Hellman key exchange support for SNMP4J-Agent (and SNMP4J).
* Improved: MOServerLookupListener and -Event object now cover all lookup types
  DefaultMOServer executes allowing users to use their callbacks to process get and set
  requests without changing the default MO object implementations.
* Improved: MOTableRelation processing if existing rows are updated in the base table.
* Added: MOTableRowEvent.EXISTS event type which can be used to process table row events
  of rows in a base table that already exist when the MOTableRowListener is being added.
* Added: MOFactoryAdapter to facilitate MOFactory extension/adaptation.
* Added: DefaultMOTable.getDependentTableRow(OID dependentTableID, OID index)
* Added: DefaultMOTable.getRowPreview(Request request, OID index)
* Improved [SFJ-158]: ArrayIndexOutOfBoundsException in org.snmp4j.smi.OID.setValue(OID.java:330)
  when a property configuration has an invalid index definition and that row is being accessed
  by a SNMP query. Now such a row will no longer be loaded into the table and a warning log
  about that will be issued.
* Fixed [SFJ-166]: Rows with security model 1 and 2 (SNMPv1 and SNMPv2c) cannot be added through
  SNMP to vacmAccessEntry.
* Improved [SFJ-140]: MOFactory implementation complexity reduced by using default method implementations.
* Fixed [SFJ-145]: Set operation deleting two rows fails if one row exists and the other not.
* Changed: Removed bz2 format from distribution. Relaxed MOScalar import check.
* Added: EngineIdProvider.
* Improved: Added toString() to MOChangeEvent, MOTableIndex, MOTableSubIndex.
  Avoid NPE in NotificationLogMib.checkAccess.
* Fixed: Added counter support for USM in snmpv2MIB in BaseAgent. Added getSnmpEnableAuthenTraps in SNMPv2MIB.
* Added: Added unit test for SNMP4J TableUtils class that uses an AgentConfigManager to simulate a SNMP agent.
* Changed: Fixed SNMP4J-CONFIG-MIB primary persistence provider detection.
  Moved getVariable method from SampleAgent to AgentConfigManager.
* Added: RandomAccessManagedObject for MOScalar and DefaultMOTable.
* Fixed [SFJ-167]: User password change also changes unmodified columns of usmUserTable.
* Fixed: Removed generics warnings about MOMutableTableModel.getRowFactory and setRowFactory methods.
* Changed: Removed log4j dependencies.
* Improved: Added toString() to MOChangeEvent, MOTableIndex, MOTableSubIndex.
  Removed possible NPE in NotificationLogMib.checkAccess.
* Changed: Updated copyright headers.
* Improved: JavaDoc style for Java 9/10 javadoc compilers.
* Added: BasicVacmConfigurator to simplify VACM modifications.
* Improved: A lot of code refactorings to improve code quality.

[2018-02-21] v2.6.3 (Requires SNMP4J v2.5.8 or later)

* Fixed [SFJ-167]: User password change also changes unmodified columns of usmUserTable.

[2017-12-14] v2.6.2 (Requires SNMP4J v2.5.8 or later)

* Fixed [SFJ-157]: MOTableIndex.getIndexOID did not return the correct index OID for sub-index values
  that can have variable length (like OctetString) but have a definition with fixed length. For such
  index values, a length sub-identifier prefix was incorrectly generated.
  This method is not used within the SNMP4J-Agent framework but could have been used by API users,
  of course.

[2017-10-02] v2.6.1 (Requires SNMP4J v2.5.8 or later)

* Fixed [SFJ-151]: USM users created programmatically or by loading from a properties file were not
  saved persistently in Agent.cfg file since SNMP4J 2.3.2 (regression caused by SFJ-99 fix).
  This bug affects all tables with hidden columnas, i.e. columns for which no corresponding MOColumn
  exists in the MOTable object.
* Improved: SampleAgent uses shutdown hook to commit configuration data to persistent storage.

[2017-06-22] v2.6.0 (Requires SNMP4J v2.5.3 or later)

* Improved [SFJ-139]: SNMP4J-Agent DefaultMOTable and MOColumn do not allow SubRequest based
  GETNEXT/GETBULK processing.
* Fixed [SFJ-138]: SNMP-MPD-MIB implementation is missing from SNMP4J-Agent.

[2016-06-09] v2.5.3 (Requires SNMP4J v2.5.0 or later)

* Fixed [SFJ-129]: Timeout occurs when sending a GETBULK with non-repeaters
  but zero max-repetitions and on-zero number of repetition sub-request OIDs
  (e.g. 3 VBs and max-repetitions 0 and 2 non-repeaters).

[2016-06-09] v2.5.2 (Requires SNMP4J v2.5.0 or later)

* Fixed [SFJ-129]: AgentXMaster GET BULK processing fails with general variable binding
  error when running a GETBULK request on a sequence of registered scalars/single object nodes
  that is as long (or longer) than max repetitions of the request and non-repeaters is greater than
  one (SnmpRequest.java). The computation of the repetitions vb start index was
  incorrect when a request is reprocessed (which happens with AgentX and single instance (scalar)
  registrations quite often).

[2016-05-23] v2.5.1 (Requires SNMP4J v2.5.0 or later)

* Fixed [SFJ-127]: NPE in MOSubtreeProxy (contextName and contextEngineID not used by constructor for
  DefaultPDUFactory).

[2016-05-06] v2.5.0 (Requires SNMP4J v2.5.0 or later)

* Added [SFJ-120]: Maven Central deployment support (refactored pom.xml).
* Added: MOAccessImpl.asString() and .toString().
* Fixed [SFJ-122]: DateAndTime.makeCalendar does not return correct time (millis) for non default
  timezones.
* Fixed [SFJ-123]: GET request on a MOScalar with null value causes a NullPointerException
  and GETNEXT on such a MOScalar with null value returned noSuchObject instead of skipping
  the scalar object.
* Improved: Added Getter/Setter for MOSubTreeProxy undoEnabled.
* Changed: Dependency to SNMP4J updated to 2.5.0.

[2016-02-25] v2.4.2 (Requires SNMP4J v2.4.3 or later)

* Fixed: Unnecessary call to ManagedObject.toString() during INFO level logging output of the
  DefaultMOServer.register method.
* Added: Address caching (60min maximum by default) to the SnmpTargetMIB$SnmpTargetAddrEntryRow
  for higher performance with supporting DNS based target addresses.
* Added: DNS based transport address support to the TDomainAddressFactoryImpl.

[2015-12-30] v2.4.1 (Requires SNMP4J v2.4.1 or later)

* Added: Support for SHA-2 authentication protocols.
  Added SHA256AES128 and SHA512AES256 USM users to SampleAgent configuration.
* Added: RequestStatus.toString() method.
* Improved: Made SysUpTimeImpl serializable. Made MOScalar subclasses serializable.
* Added: Sparse table demo to Snmp4jDemoAgent and the corresponding SNMP4J-DEMO-MIB.
* Improved: Remove redundant code from SampleAgent and TestAgent belonging to the
  EngineBootsCounterFile.

[2015-07-18] v2.4.0 (Requires SNMP4J v2.3.4 or later)

* Fixed [SFJ-108]: GETBULK with too fewer OIDs than specified non-repeaters and max-repetitions > 0
  causes agent worker thread to stop with an IndexOutOfBoundsException.
* Improved [SFJ-105]: Add option to SNMP4J-Agent that blocks any request processing on selected
  ManagedObjects. This has been realized by adding the MOLockStrategy class to MOServer and extended
  the MOServer.lookup by a second variant that locks looked-up managed objects based on the provided
  strategy.
* Fixed: Moved resources to standard maven folder layout compatible resource folder.
* Fixed [SFJ-109]: SnmpCommunityMIB.removeSnmpCommuntiyEntry does not remove coexistenceInfo.
* Added: MOMutableTableModel.getRowFactory() method in order to provide symmetry of row factory access
  (needed also by SFJ-109).

[2015-05-26] v2.3.3 (Requires SNMP4J v2.3.3 or later)

* Fixed [SFJ-104]: Infinite loop in AgentXNode.next(SubRequest request) causes worker
  thread to use max CPU kernel when a GETBULK PDU is processed that has no repeaters.

[2015-03-24] v2.3.2 (Requires SNMP4J v2.3.3 or later)

* Fixed [SFJ-99]: Security Issue: The SnmpCommunityMib.getCoexistenceInfo(..) returns outdated
  coexistence info when the snmpCommunityName of a row in the snmpCommunityTable has been updated
  via SNMP or by the setCommunityName(..) setter of that row.
  This may cause the agent accept community names which have been already disabled or changed.
* Improved: Changed source code folder structure to standard Maven layout.

[2014-12-15] v2.3.1 (Requires SNMP4J v2.3.2 or later)

* Added: Missing methods for easy SnmpCommunityMIB configuration.
* Added: Missing methods for easy SnmpNotificationMIB configuration.
* Fixed: PropertyMOInput with empty data configuration but non-empty contexts.
* Added: Getter/setter for USM and VACM to AgentConfigManager.

[2014-10-16] v2.3.0 (Requires SNMP4J v2.3.1 or later)

* Added: MOFactory.getSysUpTime.
* Fixed: Shutdown of non-used transport mappings with the AgentConfigManager.
* Fixed: Fixed DefaultMOServer.getManagedObject did not return table objects and had
  imperfect performance.
* Fixed NPE in MOScalar.next.
* Improved: Defined SimpleOIDTextFormat as default for PropertyMOInput.
* Added: RowFactory to SNMPv2MIB SysOREntry.
* Fixed: Cast in line 630 to include row class parameter:
  MOMutableTableModel<R> mmodel = (MOMutableTableModel<R>)model;
* Fixed [SFJ-94]: Fixed DefaultMOServer.unregister method for provided context.

[2014-05-26] v2.2.2 (Requires SNMP4J v2.3.0 or later)

* Fixed [SFJ-93]: Regression (from v2.2.0) in UsmMIB.usmUserChange processing
  UsmUserEvent.USER_CHANGED (because of missing break statement)
  causes crash if UsmUserEvent.USER_REMOVED.

[2014-05-16] v2.2.1 (Requires SNMP4J v2.3.0 or later)

* Fixed [SFJ-92]: DateAndTime.makeDateAndTime creates incorrect timezone information
  in the timezone field of the create OctetString if time zone offset is negative.

[2014-05-12] v2.2 (Requires SNMP4J v2.3.0 or later)

* Added: UsmUserEvent.USER_CHANGED firing.
* Improved: Introduced MOTableModel.isEmpty() to improve performance for virtual table
  models.
* Improved: Generics support (removed unchecked warnings and introduced missing
  template parameters).

[2014-02-11] v2.1.1 (Requires SNMP4J v2.2.5 or later)

* Fixed [SFJ-86]: Serious bug in TemporaryList where the timeout value is
  treated as nanoseconds although specified as milliseconds. This bug may
  cause an agent to drop requests before they are answered if it takes long
  to answer the request and concurrently other requests are processed.
  This is a regression in all SNMP4J-Agent versions since 2.0 and until 2.1.0.
* Updated SNMP4J to version 2.2.5.


[2014-01-07] v2.1.0 (Requires SNMP4J v2.2.3 or later)

* Improved: MOScalar value type usage.
* Improved: Generified VacmMIB.
* Fixed: NPE in NotificationOriginatorImpl.
* Added: New AES privacy user test code in TestAgent (SNMP4J 2.2.3).
* Fixed: [SFJ-74] Regression which caused SNMPv3 notifications are not sent
  when there is no community mapping for the used securityName.
* Fixed: [SFJ-74]: Made notificationOriginatorImpl robust against missing
  securityName to community name mappings.
* Fixed: VacmMIB did not allow to create entries via SNMP with securityModels 0, 1 and 2.
* Changed: MOServer.unregister to return the removed ManagedObject.
* Fixed: BaseAgent to use snmpCommunityMIB when creating NotificationOriginator.
* Fixed: Added missing maven-plugin versions in pom.xml.

[2013-07-02] v2.0.8 (Requires SNMP4J v2.2.2 or later)

* Fixed [SFJ-74] NPE in SnmpCommunityMib.getCommunity.
* Fixed: Typo in SNMP4JSettings.isForwardRuntimeException(). 

[2013-01-28] v2.0.7 (Requires SNMP4J v2.1.0 or later)

* Fixed: [SFJ-68] NullPointerException in NotificationOriginatorImpl.notify
  if target address exists but matching target params row not.
* Fixed: [SFJ-61] Incorrect type in NlmLogVariableValueType for octetString
  and ipAddress.
* Improved: Snapshot sample agent can now load snapshots even if parts of
  the snapshot overlaps with the OIDs registered for the sample agent natively.

[2012-04-03] v2.0.6 (Requires SNMP4J v2.1.0 or later)

* Fixed: [SFJ-59] Multiple "addRow" events when multiple columns are committed
  by DefaultMOTable.
* Fixed: [SFJ-56] StaticMOGroup.get which caused IllegalArgumentException while
  returning a request on a non-existing OID.
* Added: SNMP4J-DEMO-MIB.txt.

[2011-11-24] v2.0.5 (Requires SNMP4J v2.0.3 or later)

* Fixed [SFJ-55]: IndexOutOfBoundsException while sending notifications through
  NotificationOriginatorImpl.
* Improved template support for predefined MOScalar subclasses.

[2011-09-09] v2.0.4 (Requires SNMP4J v2.0.2 or later)

Fixed [SFJ-50]: SysUpTimeImpl returns 1.000.000 times to high value
(regression in SNMP4J-AGENT 2.0.0).
Improved [SFJ-49]: TTLSTM and DefaultTcoTransportMapping on AIX did
caught in an endless loop because select() there returns a spurious
read indication while write data is pending in fact.

[2011-09-08] v2.0.3 (Requires SNMP4J v2.0.0 or later)

Fixed [SFJ-48]: Inconsistent register/unregister behavior of MODefaultServer when
using zero length OctetString as context for register and unregister operation.
This was a regression in version 2.0.0. Fixed also unregister operation in
Snmp4jProxyMib of MOSubtreeProxy instances (incorrect context info was used).

[2011-09-01] v2.0.2 (Requires SNMP4J v2.0.0 or later)

* Fixed: [SFJ-47] Registration lookup in DefaultMOServer in some cases returned wrong
  results for MOScalar and possibly also when using several contexts.

[2011-08-22] v2.0.1 (Requires SNMP4J v2.0.0 or later)

* Fixed: [SFJ-44] NullPointerException in master agent when starting
  agent.

[2011-08-22] v2.0.0 (Requires SNMP4J v2.0.0)

* Changed: Migrated code to use Java 1.6 Generics and System.nanoTime()
  where appropriate.
* Added: Support of RFC 5343 (context engine ID discovery),
  RFC 5590 (Transport Subsystem for the SNMP),
  RFC 5591 (Transport Security Model for the SNMP - TSM),
  RFC 5953 (Transport Layer Security (TLS) Transport Model for the SNMP - TLSTM)
* Added [SFJ-42]: MOSubTreeProxy to forward requests within a subtree
  to another agent based on a simple runtime changeable configuration
  (see SNMP4J-PROXY-MIB).
* Fixed: [SFJ-33] Race condition in TcpTransportMapping.fireTransportStateChanged.
* Added: MOQueryWithSource.java.
* Fixed: A couple of minor bug and performance fixes.

[2010-10-25] v1.4.2 (Requires SNMP4J v1.11.2)

* Updated: SNMP4J 1.11.2.
* Fixed: [SFJ-31] NotificationLogMib implementation logs
  sent notification messages not fired notification events.
  Now the NotificationLogMib.setLogMode can be used to
  switch between both modes (also at runtime by the new
  snmp4jNotificationLogMode MIB object).

[2010-06-09] v1.4.1 (Requires SNMP4J v1.11.1)

* Updated: SNMP4J 1.11.1.
* Added: JavaDoc for DefaultMOTable constructor.

[2010-02-20] v1.4 (Requires SNMP4J v1.11)

* Added: MOServer.getRegisteredContexts.
* Fixed: DuplicateRegistrationException was incorrectly
  thrown by DefaultMOServer.register if a ManagedObject
  had been registered for all contexts before another
  ManagedObject is registered for a specific context
  but the same scope (OID).
* Added: AgentConfigManager.getState().
* Added: MOFilter to support filtering of ManagedObjects
  for certain types or attributes.
* Fixed: SET request on an object that does not exist and
  could not ever be created returns now noCreation error
  status instead notWritable.
* Fixed: DateAndTime.makeCalendar did not support 8 byte
  DateAndTime strings.
* Fixed: Added missing usm.addUsmUserListener to
  AgentConfigManager.
* Improved: Thread safety of transaction IDs.
* Fixed: Incomplete persistence data for
  AgentConfigManager.
* Fixed: MOTableSizeLimit checkLimits caused endless loop.
  Changed property name to conform property camel case.
* Added Table size limits to sample agent.
* Added: NOTIFICATION-LOG-MIB implementation.
* Improved: RowStatusEvent now contains also Request
  information.

[2009-10-22] v1.3.2 (Requires SNMP4J v1.10.2)

* Fixed: Snmp4jLogMib NullPointerException when loading
  config from persistent storage without a logger defined.
* Fixed: [SFJ-17] Counter64 instances in tables or other
  multi instance ManagedObjects where not properly skipped
  for SNMPv1.
* Fixed: Snmp4jHeartbeatMib did not allow to create
  heartbeat without start time set.
* Added: MutableMOColumn.setMandatory(boolean) to allow
  non-mandatory read-create columns without default
  value.

[2009-07-30] v1.3.1 (Requires SNMP4J v1.10.1)

* Fixed: UsmMIB did not forward row creation event to USM
  for noAuthNoPriv users, which caused inconsistent state
  when configuring noAuthNoPriv users with the
  property configuration.
* Improved: SampleAgent and TestAgent use async inform
  processing now.
* Fixed: [SFJ-7] CoexistenceInfoProvider does not allow
  multiple communities for different targets. Changed
  CoexistenceInfo getCoexistenceInfo(OctetString) to
  CoexistenceInfo[] getCoexistenceInfo(OctetString).
* Fixed: [SFJ-9] GETBULK request with non-repeaters 0
  and max-repetitions 0 timed out.
* Fixed: GETBULK response which does fit into response
  PDU does no longer create an genErr.
* Improved: Authentication failure traps are no longer
  sent on usmNotInTimeWindow and usmUnknownEngineID
  reports.

[2009-04-30] v1.3 (Requires SNMP4J v1.10)

* Changed: Additional method createInitialValue for
  TextualConvention interface.
* Added: MOServer.lock(..,long timeoutMillis).
  Use the CommandProcessor.setInternalRequestTimeout(..)
  to modify the default 5min timeout for internal
  request processing.
* Changed: MOServer.lock(..) returns now a
  boolean to indicate if the lock has been
  acquired successfully or not.
  CommandProcessor now checks the return value
  and returns an genErr on a SET request, if
  a lock cannot be acquired.
* Fixed: NPE when changing keys for authNoPriv
  user in UsmMIB.
* Fixed: AgentConfigManager did not initialize
  VACM correctly when agent was restarted.
* Changed: SampleAgent does no longer restart
  itself after 30 seconds.
* Improved: Wrapped Object.wait() calls in loops as
  suggested/needed by Java 1.6.

[2008-12-15] v1.2.2 (Requires SNMP4J v1.9.3d)

* Fixed: Possible NPE in CommandProcessor
  when trying to send a report as response to
  a report which caused a silent proxy drop.
* Fixed: Log handlers of JavaLogFactory where
  not properly listed in snmp4jLogLoggerTable.
* Added: DefaultMOTableModel.dump(..) to dump
  the content of a table model to a stream in
  a textual representation.

[2008-08-29] v1.2.1d (Requires SNMP4J v1.9.3c)

* Updated: SNMP4J to 1.9.3c

[2008-08-19] v1.2.1c (Requires SNMP4J v1.9.3b)

* Fixed: Creation of noAuthNoPriv users using
  SNMP operations could have caused a commitFailed
  error.
* Fixed: Deletion of a notReady usmUser failed
  with a commitFailed error caused by a NPE.

[2008-08-11] v1.2.1b (Requires SNMP4J v1.9.3b)

* Updated: SNMP4J to 1.9.3b

[2008-07-22] v1.2.1a (Requires SNMP4J v1.9.3a)

* Updated: SNMP4J to 1.9.3a

[2008-07-21] v1.2.1 (Requires SNMP4J v1.9.3)

* Fixed: TDomainAdressFactoryImpl.getAddress
  did return wrong port number for ports >
  255.
* Fixed: VACM did not return correct view
  when similar group entries with different
  security levels where used.

[2008-06-30] v1.2d (Requires SNMP4J v1.9.2)

* Updated: SNMP4J to 1.9.2a.

[2008-06-11] v1.2c (Requires SNMP4J v1.9.2)

* Updated: SNMP4J to 1.9.2.

[2008-06-02] v1.2b (Requires SNMP4J v1.9.1g)

* Fixed: BaseAgent did not update its run state
  correctly.

[2008-05-27] v1.2a (Requires SNMP4J v1.9.1g)

* Updated: SNMP4J to 1.9.1g.

[2008-05-19] v1.2 (Requires SNMP4J v1.9.1f)

* Fixed: SNMPv2MIB.unregister did not unregister
  sysORLastChange.
* Added: SNMPv1 community to SampleAgent config.
* Fixed: Notification filtering by profiles.
* Fixed: BaseAgent and SampleAgent stop/restart.
* Improved: Removed unnecessary anonymous class
  definitions.
* Fixed: Sending of authenticationFailure trap
  for BaseAgent and AgentConfigManager.

[2008-04-22] v1.2 RC1 (Requires SNMP4J v1.9.1e)

* Fixed: Stackoverflow in UsmMIB.
* Added: RegisteredManagedObject interface.
* Added: VersionInfo in org.snmp4j.agent.version.
* Improved: Made constants of built-in MIB modules public.
* Added: AgentConfigManager run state and stages.
* Improved: SampleAgent with SNMP4J-DEMO-MIB implementation.

[2008-03-18] v1.2 beta (Requires SNMP4J v1.9.1)

* Fixed: Direct usage of table model for row creation and
  removal has been replaced by calling the corresponding
  table methods for better object orientation.
* Fixed: MOScalar did return noSuchObject on a GET request
  on the scalar without instance identifier instead
  noSuchInstance.
* Added: UpdateStrategy and UpdatableManagedObject have
  been added to allow centralized controlled updating
  of dynamic managed objects (like DefaultMOTable)
* Improved: Design of org.snmp4j.agent.io components.
* Added: AgentConfigManager for IoC agent configuration
  which replaces BaseAgent. The latter is deprecated now.
* Changed: MOServer interface.
* Added: BITS support for Enumerated[Scalar] classes.
* Added: USM user table persistency support.
* Changed: Made MOScalar.getAccess() public.
* Improved: TextAndIncr event generation.
* Changed: Access to public for MOScalar.getAccess()
* Added: Session update for AgentConfigurator.

[2007-07-25] v1.1.4 (Requires SNMP4J v1.8.2)

* Fixed: Serialization of non-default context objects.
* Fixed: Proxy forwarding from SNMPv2c/v3 to v1.
* Fixed: The SNMPv1 error status noSuchName was returned
  for SNMPv2c/SNMPv3 for SET requests on not existing
  of not in view objects. Instead noAccess (not in view)
  or notWritable (not existing object) is returned.

[2007-05-31] v1.1.3 (Requires SNMP4J v1.8.2)

* Fixed: VacmMIB.vacmContextTable was not volatile.
* Fixed: DefaultMOTable.removeAll() threw exception
  when called with a MOTableModel.
* Fixed: VacmMIB.vacmContextTable.firstIndex().
* Fixed: BaseAgent boot counter file error message.
* Fixed: GET or SET requests on OIDs within the
  subtree of a MOScalar (wihtout the .0) now returns
  noSuchInstance and noCreation respectively
  (instead noSuchObject and noSuchName).
* Fixed: CommandResponder sent non-conforming report
  PDUs (not PDU instead ScopedPDU).
* Fixed: DefaultMOTable returned noSuchInstance on
  GET request on non-existing column (now noSuchObject
  is returned).
* Fixed: ProxyForwarderImpl did not forward SNMPv1/v2c
  traps if community name did not match securityName
  mapped by SNMP-COMMUNITY-MIB.
* Fixed: badValue error status was returned for SNMPv2c
  and SNMPv3 instead of wrongValue.

[2007-05-04] v1.1.2 (Requires SNMP4J v1.8.2)

* Fixed: GET or SET requests on OIDs within the
  subtree of a MOScalar now returns noSuchInstance
  and noCreation respectively (instead noSuchObject
  and noSuchName).
* Fixed: SNMPv1 traps send by NotificationOriginatorImpl
  did not correctly set generic trap id field to 6 for
  specific traps.
* Fixed: Removed sendColdStartNotification() from
  BaseAgent.finishInit to allow SNMPv3 cold start
  events.
* Added: sendColdStartNotification() to TestAgent.

[2007-04-23] v1.1.1a (Requires SNMP4J v1.8.1a)

* Fixed: Agent returned SNMPv2c error codes even for
  SNMPv1 messages.

[2007-04-02] v1.1.1 (Requires SNMP4J v1.8.1)

* Added: Support for authentication failure notifications
  in SNMPv2MIB.
* Fixed: Context engine ID and context name were not
  correctly set by ProxyForwarderImpl for notifications
  and informs forwarded to SNMPv3 targets.

[2007-03-12] v1.1 (Requires SNMP4J v1.8.1)

* Added: DeniableEventObject to get a common interface
  for SNMP events that can be canceled by reporting
  a SNMP error status in the preparation phase of a
  SNMP SET request.
* Fixed: NPE in MOMutableColumn's
  removeMOValueValidationListener method.
* Improved: DefaultMOQuery now returns also the source
  Request object on whose behalf the query is executed
  to allow MOServerLookup listener to determine whether
  an update of a ManagedObject is necessary or not.
* Added: Runtime exception rethrow on thread boundaries
  controlled by this API when SNMP4JSettings.isForward-
  RuntimeExceptions() is true.
* Changed: MOFactory to allow sub-index creation for
  AgentX sub-agents.
  ATTENTION: Direct implementations of the MOFactory
  interface have to be adapted to this change.
* Added: BaseAgent.setDefaultContext to control the
  context for which objects are registered by BaseAgent.

[2007-02-21] v1.1 RC3 (Requires SNMP4J v1.8)

* Changed: Made agentState protected in BaseAgent.
* Improved: Added MOServerListener.queryEvent
  method to properly notify query events that not
  necessarily result into a lookup of a managed
  object.
  ATTENTION: This requires that classes implementing
  the MOServerListener interface have to add this
  method.
* Improved: MOScalar can now fire MOChangeEvents
  to associated listeners.
* Added: MOQuery.isWriteAccessQuery to allow listeners
  of MOServerLookupEvents to distinguish between read
  and write access.
  ATTENTION: This requires that classes implementing
  the MOQuery interface have to add this method.

[2007-02-01] v1.1 RC2 (Requires SNMP4J v1.8)

* Fixed: If a ManagedObject had been registered
  under a non-default context only, the agent
  returned it also on queries on context "".
* Changed: BaseAgent.finishInit() will no longer
  be called from within init() to better control
  agent startup. The user (subclass) is required
  to call it manually after init(). The user
  setup code has been moved to init() at the same
  time.
* Improved: BaseAgent controls now its own state
  so that initialization errors can be easily
  detected.
* Added: BaseAgent can now be stopped by calling
  stop().
* Fixed: CommandProcessor did not use coexistence
  info provided by SnmpCommunityMib correctly.
  Now mapping a community to a different security
  name is properly supported.
* Fixed: DefaultMOContextScope.isOverlapping did
  not honour contexts.
* Fixed: Added missing serialVersionUIDs.

[2007-01-08] v1.1 RC1 (Requires SNMP4J v1.8)

* Fixed: SysUpTime threw exception after 248 days up.
* Fixed: sysOREntry was not registered by SNMPv2MIB.

* Changed: Made necessary changes for SNMP4J 1.8.
* Changed: Made member "model" of DefaultMOTableModel protected.
* Changed: MOFactory.createTableModel now takes three
  parameters! Implementors of their own MOFactory, will
  have to change the signature of their method.
* Improved: Speeded up table walk by using caching of
  recently accessed (from the same request) rows.
* Added: DefaultMOServer.getManagedObject(..) as a
  shorcut wrapper for a special "lookup" call.
* Fixed: BaseAgent did not set NotificationOriginator to
  its CommandResponder instance.
* Improved: Implemented FilteredRowIterator.remove().
* Fixed: tooBig error is now correctly returned and GETBULK
  responses are truncated if longer than maxResponsePDUSize.
* Improved: Duplicate registration check in DefaultMOServer.
* Fixed: Modifying vacmAccessTable entries with 'any' security
  model sub-index value.
* Fixed: Reporting of authorizationError state.
* Fixed: Log levels configured in snmp4jLogLoggerTable are
  now properly restored from persistent storage (StorageType
  is also no correctly handled).
* Added: Max. timeout for incoming request is now 1 min.
  by default (see requestList member initialization of
  CommandProcessor).
* Added: Counter64 skipping for SNMPv1 GETNEXT request
  processing.
* Fixed: Snmp4jLogMib persistency and log level restore.

[2006-09-30] v1.0.1 (Requires SNMP4J v1.7.6a)

* Fixed: DefaultMOTable did not check access rights
  for read (GETNEXT, GETBULK) access.
* Added: SubRequest.setErrorStatus(int).
* Fixed: RowStatus(int columnID) constructor did not
  use default maximum access right 'read-create'.
* Improved: Row creation with createAndWait(5) for
  snmpTargetAddrTable when no domain and no address
  has been specified when row is being created.
* Added: SubRequest.setUserObject(Object o) and
  SubRequest.getUserObject() to allow instrumentation
  code to associate resources with a sub-request.
* Fixed: AbstractRequest.setPhase(int) did not reset
  completion status which caused SNMP4J-AgentX
  subagent to fail commiting SET requests.

[2006-09-12] v1.0a (Requires SNMP4J v1.7.5)

* Fixed: SnmpCommunityMIB.passesFilter(..).

* Changed: Removed MOAccessImpl.setValue(..) to make
  MOAccessImpl immutable.
* Improved: Added MOFactory.createAccess to better support
  aspect oriented approaches of management instrumentation.
* Improved: Added a lot of JavaDoc for core classes.
* Fixed: ProxyForwarderImpl.multipleForward(..) did only
  forward to a single target.
* Added: org.snmp4j.agent.mo.ext package for objects that
  extend the basic functions of a SNMP agent. The first such
  implementation is the SimMOFactory to build simulation
  agents and the corresponding MIB to control them.
* Fixed: Bug in DefaultMOTable.getNextCell did return the
  second-next cell instead of the next when an index of a
  non-existant row before the target row has been specified
  in a GETNEXT/GETBULK.
* Fixed: DefaultMOTable.prepare did not check column access
  rights for create and write access.
* Fixed: Possible IllegalStateException in
  DefaultMOServer.removeLock because of concurrent object
  locking/unlocking.
* Fixed: Restoring values for table rows where the table
  definition has been extended by additional columns between
  last store action and the current restore operation caused
  exceptions when trying to access the new columns later.
* Changed: Removed MOChangeEvent.setOldValue(..) and
  setNewValue(..).
* Changed: MOTableIndex removed static methods to create sub-
  index OIDs (replaced by Variable.toSubIndex).
* Changed: MOTableModelEvent.getColumnIndex() now returns -1
  if no column has been associated with the event (was 0).
* Added: AutonomousTypeTC.
* Added: Implementation for RFC 3584 4.3.1(3) in
  ProxyForwarderImpl.

[2006-08-04] v1.0 beta-7

* Fixed: Regression bug from beta 5 in ProxyForwarderImpl where
  the response request ID was not set for response PDUs.
* Fixed: UnsupportedOperationException in ProxyForwarderImpl
  when forwarding to a SNMPv1 target.
* Added: Public methods to SnmpProxyMIB to change the proxy
  configuration programmatically.

* Fixed: SNMPv3 context info was not properly set in SNMPv3
  response to a proxy request in ProxyForwarderImpl.
* Fixed: UnsupportedOperationException in ProxyForwarderImpl
  when forwarding from a SNMPv1 target.

[2006-08-03] v1.0 beta-5

* Changed: SNMP4J-Agent beta-5 requires SNMP4J 1.7.3.
* Fixed: RowStatus did not check for mandatory columns
  when creating row with createAndGo(4).
* Fixed: SnmpTargetMIB implementation did accept
  v1 and v2c security model values.
* Added: AgenPro instrumentation example Snmp4jHeartbeatMib
  which shows how to use the generated stubs.
* Fixed: ProxyForwarderImpl did not translate PDUs between
  different SNMP version on upstream and downstream side.
  This is now implemented as defined in RFC3584 but needs
  more testing during the next weeks until 1.0 can be
  released.
* Fixed: Context engine ID was not used in
  SnmpTargetMIB.getTarget(..) which caused NullPointerException
  when proxying requests.

[2006-07-15] v1.0 beta-4

* Fixed: Bug in DefaultMOTableModel firstRow() and
  lastRow() returning always null.
* Fixed: DefaultMOTable did not set sub-request
  completed if that is successfully completed
  causing request to "hang".

[2006-05-29] v1.0 beta-3

* Fixed: Several issues in conjunction with AgentX
  master agent processing.
* Fixed: MOScalar.undo and MOScalar.commit methods
  to properly set the processed/completed status.
* Fixed: Repetition creation for GETBULK processing.
* Improved: Introduced AbstractRequest to implement
  general Request processing elements.
* Changed: BaseAgent does no longer initialize logging.

[2006-05-16] v1.0 beta-2

* Fixed: Request handling towards AgentX support.
* Changed: Made BaseAgent abstract to clearly define
  which methods need to be overwritten in a
  sub-class.
* Added: BaseAgent.addCommunities(..).
* Added: Optionally OID to MOTableSubIndex to allow
  naming sub-index values for sub-agent index
  registration and other purposes (JMX?).

[2006-04-10] v1.0 beta-1

* Added: SNMP-COMMUNITY-MIB support for coexistence.
* Added: ProxyForwarder implementation including
  SNMP-PROXY-MIB.
* Added: SNMP4J-CONFIG-MIB and SNMP4J-LOG-MIB
  implementations.
* Fixed: A couple of bugs regarding notification
  originator and filtering.
* Improved: Table relationships.
* Added: MOFatory, MOTableModelEvent, etc.
* Added: TextualConvention interface and related
  objects in org.snmp4j.agent.mo.snmp.tc.
* Improved: Value constraint handling through classes
  in org.snmp4j.agent.mo.snmp.smi.
* Added: Some more TCs like TruthValue, TimeStamp,
  etc.
* Added: IndexGenerator to create unique index values.
* And many more changes...

[2005-08-23] v1.0 alpha-2

* Fixed: CommandProcessor.removeServer(..) did actually
  add the server.
* Fixed: Exception in MOScalar when getting values.
* Fixed: Memory leak in CommandProcessor.
* Added: Temporary request list.
* Changed: The alpha-2 version requires SNMP4J 1.6.

[2005-04-26] v1.0 alpha-1

* Fixed: SNMPv1 message processing threw exception.
* Fixed: Persistence support now basically works.
* Updated: SNMP4J.jar to v1.5.

[2005-04-19] v1.0 alpha-0

* Initial release: Use at your own risk! There are many
  untested areas in the code. Most JavaDoc is missing
  and there are still a lot of TODOs for the code.
  Nevertheless, you can already build full featured
  agent with it. Persistency support is not yet working
  though.

