KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > snmp4j > agent > agentx > master > AgentXNode


1 /*_############################################################################
2   _##
3   _## SNMP4J-AgentX - AgentXNode.java
4   _##
5   _## Copyright (C) 2005-2007 Frank Fock (SNMP4J.org)
6   _##
7   _## This program is free software; you can redistribute it and/or modify
8   _## it under the terms of the GNU General Public License version 2 as
9   _## published by the Free Software Foundation.
10   _##
11   _## This program is distributed in the hope that it will be useful,
12   _## but WITHOUT ANY WARRANTY; without even the implied warranty of
13   _## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14   _## GNU General Public License for more details.
15   _##
16   _## You should have received a copy of the GNU General Public License
17   _## along with this program; if not, write to the Free Software
18   _## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19   _## MA 02110-1301 USA
20   _##
21   _##########################################################################*/

22
23 package org.snmp4j.agent.agentx.master;
24
25 import java.util.TreeSet JavaDoc;
26
27 import org.snmp4j.agent.MOScope;
28 import org.snmp4j.agent.ManagedObject;
29 import org.snmp4j.agent.agentx.AgentXRegion;
30 import org.snmp4j.agent.request.SnmpRequest;
31 import org.snmp4j.agent.request.SnmpSubRequest;
32 import org.snmp4j.agent.request.SubRequest;
33 import org.snmp4j.smi.OID;
34 import org.snmp4j.log.LogAdapter;
35 import org.snmp4j.log.LogFactory;
36 import org.snmp4j.smi.Null;
37 import org.snmp4j.PDU;
38 import org.snmp4j.agent.request.SubRequestIterator;
39
40 public class AgentXNode implements ManagedObject {
41
42   private static final LogAdapter LOGGER =
43       LogFactory.getLogger(AgentXNode.class);
44
45   private TreeSet JavaDoc registrations = new TreeSet JavaDoc();
46   private AgentXRegion region;
47
48   public AgentXNode(AgentXRegion region, AgentXRegEntry registration) {
49     this.region = new AgentXRegion(region);
50     this.registrations.add(registration);
51   }
52
53   protected AgentXNode(AgentXRegion region, TreeSet JavaDoc registrations) {
54     this.region = new AgentXRegion(region);
55     this.registrations = registrations;
56   }
57
58   public AgentXNode getClone(AgentXRegion region) {
59     return new AgentXNode(new AgentXRegion(region),
60                           (TreeSet JavaDoc)registrations.clone());
61   }
62
63   public int getRegistrationCount() {
64     return registrations.size();
65   }
66
67   public synchronized boolean shrink(OID upper) {
68     if (region.covers(upper)) {
69       if (LOGGER.isDebugEnabled()) {
70         LOGGER.debug("Shrinking node "+toString()+" to "+upper);
71       }
72       this.region.setUpperBound(upper);
73       return true;
74     }
75     return false;
76   }
77
78   public synchronized boolean expand(OID upper, boolean inclusive) {
79     /**@todo check regions*/
80     if ((!region.covers(upper)) &&
81         (region.getUpperBound().compareTo(upper) >= 0)) {
82       if (LOGGER.isDebugEnabled()) {
83         LOGGER.debug("Expanding node "+toString()+" to "+upper+
84                      ", inclusive="+inclusive);
85       }
86       this.region.setUpperBound(upper);
87       this.region.setUpperIncluded(inclusive);
88       return true;
89     }
90     return false;
91   }
92
93   public synchronized void addRegistration(AgentXRegEntry entry) {
94     registrations.add(entry);
95   }
96
97   public synchronized boolean removeRegistration(AgentXRegEntry entry) {
98     boolean removed = registrations.remove(entry);
99     if (LOGGER.isDebugEnabled()) {
100       if (removed) {
101         LOGGER.debug("Removed registration " + entry +
102                      " from AgentX node " + toString());
103       }
104       else {
105         LOGGER.debug("Removing registration failed for " + entry +
106                      " from AgentX node " + toString());
107       }
108     }
109     return removed;
110   }
111
112   public OID find(MOScope range) {
113     OID next = OID.max(range.getLowerBound(), region.getLowerBound());
114     if (region.covers(next) && (getActiveRegistration() != null)) {
115       return next;
116     }
117     return null;
118   }
119
120   public final synchronized AgentXRegEntry getActiveRegistration() {
121     AgentXRegEntry activeReg = null;
122     while (!registrations.isEmpty() && (activeReg == null)) {
123       activeReg = (AgentXRegEntry) registrations.first();
124       if (activeReg.getSession().isClosed()) {
125         registrations.remove(activeReg);
126         LOGGER.warn("Removed registration from already closed session: "+
127                     activeReg);
128         activeReg = null;
129       }
130     }
131     return activeReg;
132   }
133
134   public void get(SubRequest request) {
135     AgentXRegEntry activeReg = getActiveRegistration();
136     if (activeReg == null) {
137       request.getVariableBinding().setVariable(Null.noSuchObject);
138       request.getStatus().setPhaseComplete(true);
139       return;
140     }
141     AgentXQueue queue = activeReg.getSession().getQueue();
142     AgentXSearchRange searchRange =
143         new AgentXSearchRange(request.getScope().getLowerBound(),
144                               request.getScope().isLowerIncluded(),
145                               request.getScope().getUpperBound(),
146                               request.getScope().isUpperIncluded(),
147                               (SnmpSubRequest)request);
148     queue.add(searchRange, activeReg, false);
149     markAsProcessed(request);
150   }
151
152   public MOScope getScope() {
153     return region;
154   }
155
156   public boolean next(SubRequest request) {
157     AgentXRegEntry activeReg = getActiveRegistration();
158     if (activeReg == null) {
159       return false;
160     }
161     AgentXQueue queue = activeReg.getSession().getQueue();
162     AgentXSearchRange searchRange =
163         new AgentXSearchRange(request.getScope().getLowerBound(),
164                               request.getScope().isLowerIncluded(),
165                               region.getUpperBound(),
166                               region.isUpperIncluded(),
167                               (SnmpSubRequest)request);
168     OID upperRequestBound = request.getScope().getUpperBound();
169     if ((upperRequestBound != null) &&
170         (upperRequestBound.compareTo(region.getUpperBound()) < 0)) {
171       searchRange.setUpperBound(upperRequestBound);
172       searchRange.setUpperIncluded(request.getScope().isUpperIncluded());
173     }
174     if (searchRange.isEmpty()) {
175       return false;
176     }
177     int nonRepeaters = ((SnmpRequest)request.getRequest()).getNonRepeaters();
178     if (queue.add(searchRange, activeReg, request.getIndex() >= nonRepeaters)) {
179       if (((SnmpRequest)request.getRequest())
180           .getInitiatingEvent().getPDU().getType() == PDU.GETBULK) {
181         // need to set also repetitions to processed
182
for (SubRequestIterator it = request.repetitions(); it.hasNext(); ) {
183           SubRequest sreq = it.nextSubRequest();
184           sreq.getStatus().setProcessed(true);
185         }
186       }
187     }
188     markAsProcessed(request);
189     return true;
190   }
191
192   public void prepare(SubRequest request) {
193     addAgentXSet2Queue(request);
194     markAsProcessed(request);
195   }
196
197   public void undo(SubRequest request) {
198     addAgentXSet2Queue(request);
199     markAsProcessed(request);
200   }
201
202   public void cleanup(SubRequest request) {
203     addAgentXSet2Queue(request);
204     markAsProcessed(request);
205   }
206
207   public void commit(SubRequest request) {
208     addAgentXSet2Queue(request);
209     markAsProcessed(request);
210   }
211
212   private static void markAsProcessed(SubRequest request) {
213     request.getStatus().setProcessed(true);
214   }
215
216   private void addAgentXSet2Queue(SubRequest request) {
217     AgentXRegEntry activeReg = getActiveRegistration();
218     AgentXQueue queue = activeReg.getSession().getQueue();
219     queue.add(request.getVariableBinding(), (SnmpSubRequest)request, activeReg);
220   }
221
222   public String JavaDoc toString() {
223     return getClass().getName()+"[region="+region+
224         ",registrations="+registrations+"]";
225   }
226
227 }
228
Popular Tags