1 22 23 package org.snmp4j.agent.agentx.master; 24 25 import java.util.TreeSet ; 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 registrations = new TreeSet (); 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 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 )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 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 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 toString() { 223 return getClass().getName()+"[region="+region+ 224 ",registrations="+registrations+"]"; 225 } 226 227 } 228 | Popular Tags |