| /* |
| * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code 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 |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package com.sun.jmx.snmp.agent; |
| |
| |
| |
| // java imports |
| // |
| import java.io.Serializable; |
| import java.util.Date; |
| import java.util.Vector; |
| import java.util.Enumeration; |
| import java.util.List; |
| import java.util.ArrayList; |
| |
| // jmx imports |
| // |
| import javax.management.Notification; |
| import javax.management.ObjectName; |
| import javax.management.NotificationFilter; |
| import javax.management.NotificationListener; |
| import javax.management.NotificationBroadcaster; |
| import javax.management.MBeanNotificationInfo; |
| import javax.management.ListenerNotFoundException; |
| import com.sun.jmx.snmp.SnmpOid; |
| import com.sun.jmx.snmp.SnmpValue; |
| import com.sun.jmx.snmp.SnmpVarBind; |
| import com.sun.jmx.snmp.SnmpStatusException; |
| |
| /** |
| * This class is an abstraction for an SNMP table. |
| * It is the base class for implementing SNMP tables in the |
| * MBean world. |
| * |
| * <p> |
| * Its responsibility is to synchronize the MBean view of the table |
| * (Table of entries) with the MIB view (array of OID indexes). Each |
| * object of this class will be bound to the Metadata object which |
| * manages the same SNMP Table within the MIB. |
| * </p> |
| * |
| * <p> |
| * For each table defined in a MIB, mibgen will generate a specific |
| * class called Table<i>TableName</i> that will subclass this class, and |
| * a corresponding <i>TableName</i>Meta class extending SnmpMibTable |
| * and corresponding to the MIB view of the same table. |
| * </p> |
| * |
| * <p> |
| * Objects of this class are instantiated by MBeans representing |
| * the SNMP Group to which the table belong. |
| * </p> |
| * |
| * <p><b>This API is a Sun Microsystems internal API and is subject |
| * to change without notice.</b></p> |
| * @see com.sun.jmx.snmp.agent.SnmpTableEntryFactory |
| * @see com.sun.jmx.snmp.agent.SnmpMibTable |
| * |
| */ |
| public abstract class SnmpTableSupport implements SnmpTableEntryFactory, |
| // NPCTE fix for bugId 4499265, esc 0, MR 04 sept 2001 |
| // SnmpTableCallbackHandler { |
| SnmpTableCallbackHandler, Serializable { |
| // end of NPCTE fix for bugId 4499265 |
| |
| //----------------------------------------------------------------- |
| // |
| // Protected Variables |
| // |
| //----------------------------------------------------------------- |
| |
| /** |
| * The list of entries |
| **/ |
| protected List<Object> entries; |
| |
| /** |
| * The associated metadata object |
| **/ |
| protected SnmpMibTable meta; |
| |
| /** |
| * The MIB to which this table belongs |
| **/ |
| protected SnmpMib theMib; |
| |
| //----------------------------------------------------------------- |
| // |
| // Private Variables |
| // |
| //----------------------------------------------------------------- |
| |
| /** |
| * This variable is initialized while binding this object to its |
| * corresponding meta object. |
| **/ |
| private boolean registrationRequired = false; |
| |
| |
| |
| //----------------------------------------------------------------- |
| // |
| // Constructor |
| // |
| //----------------------------------------------------------------- |
| |
| /** |
| * Initializes the table. |
| * The steps are these: |
| * <ul><li> allocate an array for storing entry object,</li> |
| * <li> retrieve the corresponding metadata object |
| * from the MIB, |
| * <li> bind this object to the corresponding metadata object |
| * from the MIB.</li> |
| * </ul> |
| * |
| * @param mib The MIB to which this table belong. |
| * |
| **/ |
| protected SnmpTableSupport(SnmpMib mib) { |
| theMib = mib; |
| meta = getRegisteredTableMeta(mib); |
| bindWithTableMeta(); |
| entries = allocateTable(); |
| } |
| |
| |
| //----------------------------------------------------------------- |
| // |
| // Implementation of the SnmpTableEntryFactory interface |
| // |
| //----------------------------------------------------------------- |
| |
| /** |
| * Creates a new entry in the table. |
| * |
| * This factory method is generated by mibgen and used internally. |
| * It is part of the |
| * {@link com.sun.jmx.snmp.agent.SnmpTableEntryFactory} interface. |
| * You may subclass this method to implement any specific behaviour |
| * your application requires. |
| * |
| * @exception SnmpStatusException if the entry cannot be created. |
| **/ |
| public abstract void createNewEntry(SnmpMibSubRequest request, |
| SnmpOid rowOid, int depth, |
| SnmpMibTable meta) |
| throws SnmpStatusException; |
| |
| |
| //----------------------------------------------------------------- |
| // |
| // Public methods |
| // |
| //----------------------------------------------------------------- |
| |
| /** |
| * Returns the entry located at the given position in the table. |
| * |
| * @return The entry located at the given position, <code>null</code> |
| * if no entry can be found at this position. |
| **/ |
| // XXXX xxxx zzz ZZZZ => public? or protected? |
| public Object getEntry(int pos) { |
| if (entries == null) return null; |
| return entries.get(pos); |
| } |
| |
| /** |
| * Returns the number of entries registered in the table. |
| * |
| * @return The number of entries registered in the table. |
| **/ |
| public int getSize() { |
| return meta.getSize(); |
| } |
| |
| /** |
| * This method lets you dynamically switch the creation policy. |
| * |
| * <CODE>setCreationEnabled()</CODE> will switch the policy of |
| * remote entry creation via SET operations, by calling |
| * <code>setCreationEnabled()</code> on the metadata object |
| * associated with this table. |
| * <BR> By default remote entry creation via SET operation is disabled. |
| * |
| * @param remoteCreationFlag Tells whether remote entry creation must |
| * be enabled or disabled. |
| * <li> |
| * <CODE>setCreationEnabled(true)</CODE> will enable remote entry |
| * creation via SET operations.</li> |
| * <li> |
| * <CODE>setCreationEnabled(false)</CODE> will disable remote entry |
| * creation via SET operations.</li> |
| * <p> By default remote entry creation via SET operation is disabled. |
| * </p> |
| * |
| * @see com.sun.jmx.snmp.agent.SnmpMibTable |
| * |
| **/ |
| public void setCreationEnabled(boolean remoteCreationFlag) { |
| meta.setCreationEnabled(remoteCreationFlag); |
| } |
| |
| /** |
| * Tells whether a new entry should be created when a SET operation |
| * is received for an entry that does not exist yet. |
| * This method calls <code>isCreationEnabled()</code> on the metadata |
| * object associated with this table. |
| * |
| * @return true if a new entry must be created, false otherwise.<br> |
| * [default: returns <CODE>false</CODE>] |
| * |
| * @see com.sun.jmx.snmp.agent.SnmpMibTable |
| **/ |
| public boolean isCreationEnabled() { |
| return meta.isCreationEnabled(); |
| } |
| |
| /** |
| * Tells whether the metadata object to which this table is linked |
| * requires entries to be registered. In this case passing an |
| * ObjectName when registering entries will be mandatory. |
| * |
| * @return <code>true</code> if the associated metadata requires entries |
| * to be registered (mibgen generated generic metadata). |
| **/ |
| public boolean isRegistrationRequired() { |
| return registrationRequired; |
| } |
| |
| /** |
| * Builds an entry SnmpIndex from its row OID. |
| * |
| * This method is generated by mibgen and used internally. |
| * |
| * @param rowOid The SnmpOid object identifying a table entry. |
| * |
| * @return The SnmpIndex of the entry identified by <code>rowOid</code>. |
| * |
| * @exception SnmpStatusException if the index cannot be built from the |
| * given OID. |
| **/ |
| public SnmpIndex buildSnmpIndex(SnmpOid rowOid) |
| throws SnmpStatusException { |
| return buildSnmpIndex(rowOid.longValue(false), 0); |
| } |
| |
| /** |
| * Builds an SnmpOid from an SnmpIndex object. |
| * |
| * This method is generated by mibgen and used internally. |
| * |
| * @param index An SnmpIndex object identifying a table entry. |
| * |
| * @return The SnmpOid form of the given entry index. |
| * |
| * @exception SnmpStatusException if the given index is not valid. |
| **/ |
| public abstract SnmpOid buildOidFromIndex(SnmpIndex index) |
| throws SnmpStatusException; |
| |
| /** |
| * Builds the default ObjectName of an entry from the SnmpIndex |
| * identifying this entry. No access is made on the entry itself. |
| * |
| * This method is generated by mibgen and used internally. |
| * You can subclass this method if you want to change the default |
| * ObjectName policy. This is only meaningfull when entries |
| * are registered MBeans. |
| * |
| * @param index The SnmpIndex identifying the entry from which we |
| * want to build the default ObjectName. |
| * |
| * @return The default ObjectName for the entry identified by |
| * the given index. |
| * |
| * @exception SnmpStatusException if the given index is not valid. |
| **/ |
| public abstract ObjectName buildNameFromIndex(SnmpIndex index) |
| throws SnmpStatusException; |
| |
| |
| //----------------------------------------------------------------- |
| // |
| // Implementation of the SnmpTableEntryFactory interface |
| // |
| //----------------------------------------------------------------- |
| |
| /** |
| * This callback is called by the associated metadata object |
| * when a new table entry has been registered in the |
| * table metadata. |
| * |
| * This method will update the <code>entries</code> list. |
| * |
| * @param pos The position at which the new entry was inserted |
| * in the table. |
| * @param row The row OID of the new entry |
| * @param name The ObjectName of the new entry (as specified by the |
| * factory) |
| * @param entry The new entry (as returned by the factory) |
| * @param meta The table metadata object. |
| * |
| **/ |
| public void addEntryCb(int pos, SnmpOid row, ObjectName name, |
| Object entry, SnmpMibTable meta) |
| throws SnmpStatusException { |
| try { |
| if (entries != null) entries.add(pos,entry); |
| } catch (Exception e) { |
| throw new SnmpStatusException(SnmpStatusException.noSuchName); |
| } |
| } |
| |
| /** |
| * This callback is called by the associated metadata object |
| * when a new table entry has been removed from the |
| * table metadata. |
| * |
| * This method will update the <code>entries</code> list. |
| * |
| * @param pos The position from which the entry was deleted |
| * @param row The row OID of the deleted entry |
| * @param name The ObjectName of the deleted entry (may be null if |
| * ObjectName's were not required) |
| * @param entry The deleted entry (may be null if only ObjectName's |
| * were required) |
| * @param meta The table metadata object. |
| * |
| **/ |
| public void removeEntryCb(int pos, SnmpOid row, ObjectName name, |
| Object entry, SnmpMibTable meta) |
| throws SnmpStatusException { |
| try { |
| if (entries != null) entries.remove(pos); |
| } catch (Exception e) { |
| } |
| } |
| |
| |
| |
| /** |
| * Enables to add an SNMP entry listener to this |
| * <CODE>SnmpMibTable</CODE>. |
| * |
| * @param listener The listener object which will handle the |
| * notifications emitted by the registered MBean. |
| * |
| * @param filter The filter object. If filter is null, no filtering |
| * will be performed before handling notifications. |
| * |
| * @param handback The context to be sent to the listener when a |
| * notification is emitted. |
| * |
| * @exception IllegalArgumentException Listener parameter is null. |
| */ |
| public void |
| addNotificationListener(NotificationListener listener, |
| NotificationFilter filter, Object handback) { |
| meta.addNotificationListener(listener,filter,handback); |
| } |
| |
| /** |
| * Enables to remove an SNMP entry listener from this |
| * <CODE>SnmpMibTable</CODE>. |
| * |
| * @param listener The listener object which will handle the |
| * notifications emitted by the registered MBean. |
| * This method will remove all the information related to this |
| * listener. |
| * |
| * @exception ListenerNotFoundException The listener is not registered |
| * in the MBean. |
| */ |
| public synchronized void |
| removeNotificationListener(NotificationListener listener) |
| throws ListenerNotFoundException { |
| meta.removeNotificationListener(listener); |
| } |
| |
| /** |
| * Returns a <CODE>NotificationInfo</CODE> object containing the |
| * notification class and the notification type sent by the |
| * <CODE>SnmpMibTable</CODE>. |
| */ |
| public MBeanNotificationInfo[] getNotificationInfo() { |
| return meta.getNotificationInfo(); |
| } |
| |
| //----------------------------------------------------------------- |
| // |
| // Protected Abstract methods |
| // |
| //----------------------------------------------------------------- |
| |
| /** |
| * Builds an SnmpIndex object from the index part of an OID. |
| * |
| * This method is generated by mibgen and used internally. |
| * |
| * @param oid The OID from which to build the index, represented |
| * as an array of long. |
| * @param start The position where to start from in the OID array. |
| * |
| * @return The SnmpOid form of the given entry index. |
| * |
| * @exception SnmpStatusException if the given index is not valid. |
| **/ |
| protected abstract SnmpIndex buildSnmpIndex(long oid[], int start ) |
| throws SnmpStatusException; |
| |
| /** |
| * Returns the metadata object associated with this table. |
| * |
| * This method is generated by mibgen and used internally. |
| * |
| * @param mib The SnmpMib object holding the Metadata corresponding |
| * to this table. |
| * |
| * @return The metadata object associated with this table. |
| * Returns <code>null</code> if this implementation of the |
| * MIB doesn't support this table. |
| **/ |
| protected abstract SnmpMibTable getRegisteredTableMeta(SnmpMib mib); |
| |
| |
| //----------------------------------------------------------------- |
| // |
| // Protected methods |
| // |
| //----------------------------------------------------------------- |
| |
| /** |
| * Allocates an ArrayList for storing table entries. |
| * |
| * This method is called within the constructor at object creation. |
| * Any object implementing the {@link java.util.List} interface can |
| * be used. |
| * |
| * @return A new list in which to store entries. If <code>null</code> |
| * is returned then no entry will be stored in the list |
| * and getEntry() will always return null. |
| **/ |
| protected List<Object> allocateTable() { |
| return new ArrayList<Object>(); |
| } |
| |
| /** |
| * Add an entry in this table. |
| * |
| * This method registers an entry in the table and perform |
| * synchronization with the associated table metadata object. |
| * |
| * This method assumes that the given entry will not be registered, |
| * or will be registered with its default ObjectName built from the |
| * associated SnmpIndex. |
| * <p> |
| * If the entry is going to be registered, then |
| * {@link com.sun.jmx.snmp.agent.SnmpTableSupport#addEntry(SnmpIndex, ObjectName, Object)} should be preferred. |
| * <br> This function is mainly provided for backward compatibility. |
| * |
| * @param index The SnmpIndex built from the given entry. |
| * @param entry The entry that should be added in the table. |
| * |
| * @exception SnmpStatusException if the entry cannot be registered with |
| * the given index. |
| **/ |
| protected void addEntry(SnmpIndex index, Object entry) |
| throws SnmpStatusException { |
| SnmpOid oid = buildOidFromIndex(index); |
| ObjectName name = null; |
| if (isRegistrationRequired()) { |
| name = buildNameFromIndex(index); |
| } |
| meta.addEntry(oid,name,entry); |
| } |
| |
| /** |
| * Add an entry in this table. |
| * |
| * This method registers an entry in the table and performs |
| * synchronization with the associated table metadata object. |
| * |
| * @param index The SnmpIndex built from the given entry. |
| * @param name The ObjectName with which this entry will be registered. |
| * @param entry The entry that should be added in the table. |
| * |
| * @exception SnmpStatusException if the entry cannot be registered with |
| * the given index. |
| **/ |
| protected void addEntry(SnmpIndex index, ObjectName name, Object entry) |
| throws SnmpStatusException { |
| SnmpOid oid = buildOidFromIndex(index); |
| meta.addEntry(oid,name,entry); |
| } |
| |
| /** |
| * Remove an entry from this table. |
| * |
| * This method unregisters an entry from the table and performs |
| * synchronization with the associated table metadata object. |
| * |
| * @param index The SnmpIndex identifying the entry. |
| * @param entry The entry that should be removed in the table. This |
| * parameter is optional and can be omitted if it doesn't |
| * need to be passed along to the |
| * <code>removeEntryCb()</code> callback defined in the |
| * {@link com.sun.jmx.snmp.agent.SnmpTableCallbackHandler} |
| * interface. |
| * |
| * @exception SnmpStatusException if the entry cannot be unregistered. |
| **/ |
| protected void removeEntry(SnmpIndex index, Object entry) |
| throws SnmpStatusException { |
| SnmpOid oid = buildOidFromIndex(index); |
| meta.removeEntry(oid,entry); |
| } |
| |
| // protected void removeEntry(ObjectName name, Object entry) |
| // throws SnmpStatusException { |
| // meta.removeEntry(name,entry); |
| // } |
| |
| /** |
| * Returns the entries in the table. |
| * |
| * @return An Object[] array containing the entries registered in the |
| * table. |
| **/ |
| protected Object[] getBasicEntries() { |
| if (entries == null) return null; |
| Object[] array= new Object[entries.size()]; |
| entries.toArray(array); |
| return array; |
| } |
| |
| /** |
| * Binds this table with its associated metadata, registering itself |
| * as an SnmpTableEntryFactory. |
| **/ |
| protected void bindWithTableMeta() { |
| if (meta == null) return; |
| registrationRequired = meta.isRegistrationRequired(); |
| meta.registerEntryFactory(this); |
| } |
| |
| } |