1 // NAME
2 // $RCSfile: NTPrintQBean.java,v $
3 // DESCRIPTION
4 // [given below in javadoc format]
5 // DELTA
6 // $Revision: 1.13 $
7 // CREATED
8 // $Date: 2006/01/25 18:08:55 $
9 // COPYRIGHT
10 // Westhawk Ltd
11 // TO DO
12 //
13
14 /*
15 * Copyright (C) 1998 - 2006 by Westhawk Ltd
16 *
17 * Permission to use, copy, modify, and distribute this software
18 * for any purpose and without fee is hereby granted, provided
19 * that the above copyright notices appear in all copies and that
20 * both the copyright notice and this permission notice appear in
21 * supporting documentation.
22 * This software is provided "as is" without express or implied
23 * warranty.
24 * author <a href="mailto:snmp@westhawk.co.uk">Tim Panton</a>
25 */
26
27 package uk.co.westhawk.snmp.beans;
28
29 /*-
30 * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲
31 * SNMP Java Client
32 * ჻჻჻჻჻჻
33 * Copyright 2023 MetricsHub, Westhawk
34 * ჻჻჻჻჻჻
35 * This program is free software: you can redistribute it and/or modify
36 * it under the terms of the GNU Lesser General Public License as
37 * published by the Free Software Foundation, either version 3 of the
38 * License, or (at your option) any later version.
39 *
40 * This program is distributed in the hope that it will be useful,
41 * but WITHOUT ANY WARRANTY; without even the implied warranty of
42 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
43 * GNU General Lesser Public License for more details.
44 *
45 * You should have received a copy of the GNU General Lesser Public
46 * License along with this program. If not, see
47 * <http://www.gnu.org/licenses/lgpl-3.0.html>.
48 * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱
49 */
50
51 import uk.co.westhawk.snmp.stack.*;
52 import uk.co.westhawk.snmp.pdu.*;
53 import java.awt.*;
54 import java.util.*;
55 import java.text.*;
56 import java.lang.*;
57 import java.io.*;
58 import java.beans.*;
59
60 /**
61 * <p>
62 * This bean collects the names of the print queues installed on
63 * a NT server. The NT mib is described in the
64 *
65 * <a href="http://premium.microsoft.com/msdn/library/winresource/dnwinnt/f1d/d25/s86a2.htm">LAN Manager MIB II for Windows NT Objects</a> .
66 *
67 * You will have to register to the MSDN before accessing this page.
68 * </p>
69 *
70 * <p>
71 * The properties in the parent classes should be set, before calling
72 * the action() method. Via a PropertyChangeEvent the application/applet
73 * will be notified.
74 * </p>
75 *
76 * @see SNMPBean#setHost
77 * @see SNMPBean#setPort
78 * @see SNMPBean#setCommunityName
79 * @see SNMPRunBean#setUpdateInterval
80 * @see SNMPBean#addPropertyChangeListener
81 * @see SNMPBean#action
82 * @see GetNextPdu
83 *
84 * @author <a href="mailto:snmp@westhawk.co.uk">Birgit Arkesteijn</a>
85 * @version $Revision: 1.13 $ $Date: 2006/01/25 18:08:55 $
86 *
87 */
88 public class NTPrintQBean extends SNMPRunBean implements Observer {
89 private static final String version_id = "@(#)$Id: NTPrintQBean.java,v 1.13 2006/01/25 18:08:55 birgit Exp $ Copyright Westhawk Ltd";
90
91 public final static String svPrintQName = "1.3.6.1.4.1.77.1.2.29.1.1";
92
93 private int svPrintQName_len;
94 private GetNextPdu pdu;
95 private Hashtable printHash;
96
97 private boolean isGetNextInFlight;
98 private Date lastUpdateDate = null;
99
100 /**
101 * The default constructor.
102 */
103 public NTPrintQBean() {
104 printHash = new Hashtable();
105 svPrintQName_len = svPrintQName.length();
106 }
107
108 /**
109 * The constructor that will set the host and the port no.
110 *
111 * @param h the hostname
112 * @param p the port no
113 * @see SNMPBean#setHost
114 * @see SNMPBean#setPort
115 */
116 public NTPrintQBean(String h, int p) {
117 this(h, p, null);
118 }
119
120 /**
121 * The constructor that will set the host, the port no and the local
122 * bind address.
123 *
124 * @param h the hostname
125 * @param p the port no
126 * @param b the local bind address
127 * @see SNMPBean#setHost
128 * @see SNMPBean#setPort
129 * @see SNMPBean#setBindAddress
130 *
131 * @since 4_14
132 */
133 public NTPrintQBean(String h, int p, String b) {
134 this();
135 setHost(h);
136 setPort(p);
137 setBindAddress(b);
138 }
139
140 /**
141 * Returns the date of the moment when this bean was last updated.
142 * This might be null when the first time the update was not finished.
143 *
144 * @return the last update date
145 */
146 public Date getLastUpdateDate() {
147 return lastUpdateDate;
148 }
149
150 /**
151 * Returns the indices of the NT print queues.
152 * The OID of this print queue is a concatenation of the
153 * name (svPrintQName) OID and the print queue specific index.
154 * The index should be used to get the other properties of this print queue.
155 *
156 * @see #getIndex(String)
157 * @see #svPrintQName
158 */
159 public Enumeration getIndices() {
160 return printHash.elements();
161 }
162
163 /**
164 * Returns the index of one of the print queues.
165 * The OID of this print
166 * queue is a concatenation of the name (svPrintQName) OID and the print
167 * queue specific index.
168 * The index should be used to get the other properties of this print queue.
169 *
170 * @param name The name of the print queue
171 * @return the print queue index, might be null if no print queue with such name
172 * exists
173 * @see #getIndices
174 * @see #getNames
175 */
176 public String getIndex(String name) {
177 return (String) printHash.get(name);
178 }
179
180 /**
181 * Returns the names of the NT print queues (the list
182 * of svPrintQName).
183 */
184 public Enumeration getNames() {
185 return printHash.keys();
186 }
187
188 /**
189 * Returns the number of NT print queues.
190 */
191 public synchronized int getCount() {
192 return printHash.size();
193 }
194
195 /**
196 * This method starts the action of the bean. It will initialises
197 * all variables before starting.
198 */
199 public void action() {
200 if (isHostPortReachable()) {
201 printHash.clear();
202 lastUpdateDate = new Date();
203 isGetNextInFlight = false;
204 setRunning(true);
205 }
206 }
207
208 /**
209 * Implements the running of the bean.
210 *
211 * It will send the Pdu, if the previous one is not still in flight.
212 *
213 * @see SNMPRunBean#isRunning()
214 */
215 public void run() {
216 while (context != null && isRunning()) {
217 if (isGetNextInFlight == false) {
218 // start the GetNext loop again
219 isGetNextInFlight = true;
220 pdu = new GetNextPdu(context);
221 pdu.addObserver(this);
222 pdu.addOid(svPrintQName);
223 try {
224 pdu.send();
225 } catch (PduException exc) {
226 System.out.println("PduException " + exc.getMessage());
227 } catch (IOException exc) {
228 System.out.println("IOException " + exc.getMessage());
229 }
230 }
231
232 try {
233 Thread.sleep(interval);
234 } catch (InterruptedException ix) {
235 ;
236 }
237 }
238 }
239
240 /**
241 * This method is called when the Pdu response is received. When all
242 * answers are received it will fire the property change event.
243 *
244 * The answers are stored in a hashtable, this is done because the speed
245 * can only be calculated with the previous answer.
246 *
247 * @see SNMPBean#addPropertyChangeListener
248 */
249 public void update(Observable obs, Object ov) {
250 varbind var;
251 String hashKey;
252 String oid, index, name;
253
254 pdu = (GetNextPdu) obs;
255 if (pdu.getErrorStatus() == AsnObject.SNMP_ERR_NOERROR) {
256 var = (varbind) ov;
257 oid = "";
258 if (var != null) {
259 oid = var.getOid().toString();
260 }
261 if (oid.startsWith(svPrintQName)) {
262 // index is the part of the oid AFTER the svPrintQName
263 index = oid.substring(svPrintQName_len + 1);
264
265 name = ((AsnOctets) var.getValue()).getValue();
266
267 // update the hashtable with the new answer
268 printHash.put(name, index);
269
270 // perform the GetNext on the just received answer
271 pdu = new GetNextPdu(context);
272 pdu.addObserver(this);
273 pdu.addOid(oid);
274 try {
275 pdu.send();
276 } catch (PduException exc) {
277 System.out.println("PduException " + exc.getMessage());
278 } catch (IOException exc) {
279 System.out.println("IOException " + exc.getMessage());
280 }
281 } else {
282 // the GetNext loop has ended
283 lastUpdateDate = new Date();
284 isGetNextInFlight = false;
285 firePropertyChange("resourceNames", null, null);
286 }
287 } else {
288 // the GetNext loop has ended
289 lastUpdateDate = new Date();
290 isGetNextInFlight = false;
291 firePropertyChange("resourceNames", null, null);
292 }
293 }
294
295 }