1 22 23 package org.snmp4j.agent.agentx.master; 24 25 import org.snmp4j.agent.agentx.AgentXGetNextPDU; 26 import org.snmp4j.agent.request.SnmpRequest; 27 import java.util.LinkedList ; 28 import org.snmp4j.smi.OID; 29 import org.snmp4j.agent.MOScope; 30 import java.util.Collection ; 31 import org.snmp4j.PDU; 32 import org.snmp4j.agent.agentx.AgentXGetBulkPDU; 33 import java.util.List ; 34 import org.snmp4j.agent.agentx.AgentXGetPDU; 35 import org.snmp4j.agent.agentx.AgentXPDU; 36 import org.snmp4j.log.LogFactory; 37 import org.snmp4j.log.LogAdapter; 38 import org.snmp4j.agent.request.SubRequestIterator; 39 import org.snmp4j.agent.request.SubRequestIteratorSupport; 40 import org.snmp4j.agent.request.SubRequest; 41 42 public class AgentXPendingGet extends AbstractAgentXPending { 43 44 private static final LogAdapter logger = 45 LogFactory.getLogger(AgentXPendingGet.class); 46 47 private AgentXPDU agentXRequestPDU; 48 private List searchRanges = new LinkedList (); 49 50 private short nonRepeater = 0; 51 52 public AgentXPendingGet(AgentXRegEntry registration, 53 SnmpRequest request, 54 AgentXSearchRange searchRange) { 55 super(registration, request); 56 this.searchRanges.add(searchRange); 57 } 58 59 public synchronized void addSearchRange(AgentXSearchRange searchRange) { 60 this.searchRanges.add(searchRange); 61 } 62 63 public void setNonRepeater(short nonRepeater) { 64 this.nonRepeater = nonRepeater; 65 } 66 67 public synchronized void incNonRepeater() { 68 nonRepeater++; 69 } 70 71 public AgentXPDU getAgentXPDU() { 72 if (agentXRequestPDU == null) { 73 createRequestPDU(); 74 } 75 return agentXRequestPDU; 76 } 77 78 public Collection getSearchRanges() { 79 return searchRanges; 80 } 81 82 public short getNonRepeater() { 83 return nonRepeater; 84 } 85 86 89 private void createRequestPDU() { 90 SnmpRequest request = (SnmpRequest) 91 ((AgentXSearchRange) searchRanges.get(0)) 92 .getReferenceSubRequest().getRequest(); 93 PDU requestPDU = request.getInitiatingEvent().getPDU(); 94 switch (requestPDU.getType()) { 95 case PDU.GETBULK: { 96 short maxRep = getMaxRepetitions(request, requestPDU); 97 agentXRequestPDU = 98 new AgentXGetBulkPDU(request.getContext(), 99 maxRep, nonRepeater, 100 (MOScope[]) searchRanges.toArray( 101 new MOScope[searchRanges.size()])); 102 break; 103 } 104 case PDU.GET: { 105 OID[] oids = new OID[searchRanges.size()]; 106 for (int i = 0; i < oids.length; i++) { 107 AgentXSearchRange sr = (AgentXSearchRange) searchRanges.get(i); 108 oids[i] = sr.getLowerBound(); 109 } 110 agentXRequestPDU = new AgentXGetPDU(request.getContext(), oids); 111 break; 112 } 113 case PDU.GETNEXT: { 114 agentXRequestPDU = 115 new AgentXGetNextPDU(request.getContext(), 116 (MOScope[]) searchRanges.toArray( 117 new MOScope[searchRanges.size()])); 118 break; 119 } 120 default: { 121 logger.error("Failed to create AgentX PDU for PDU type " + 122 requestPDU.getType()); 123 } 124 } 125 } 126 127 private static short getMaxRepetitions(SnmpRequest request, PDU requestPDU) { 128 int maxRep = 129 requestPDU.getMaxRepetitions() - request.getCompleteRepetitions(); 130 maxRep = Math.max(0, maxRep); 131 maxRep = 132 Math.min(maxRep, AgentXMasterAgent.getMaxGetBulkRepetitions()); 133 return (short) maxRep; 134 } 135 136 public AgentXMasterSession getSession() { 137 return registration.getSession(); 138 } 139 140 public SubRequestIterator getReferences() { 141 return new GetSubRequestIterator(); 142 } 143 144 public String toString() { 145 return getClass().getName()+"["+super.toStringMembers()+",searchRanges="+ 146 searchRanges+"]"; 147 } 148 149 class GetSubRequestIterator extends SubRequestIteratorSupport { 150 151 protected GetSubRequestIterator() { 152 super(searchRanges.iterator()); 153 } 154 155 protected SubRequest mapToSubRequest(Object element) { 156 return ((AgentXSearchRange)element).getReferenceSubRequest(); 157 } 158 } 159 } 160 | Popular Tags |