001: /*
002: * Copyright (C) The MX4J Contributors.
003: * All rights reserved.
004: *
005: * This software is distributed under the terms of the MX4J License version 1.0.
006: * See the terms of the MX4J License in the documentation provided with this software.
007: */
008:
009: package mx4j.tools.remote.soap;
010:
011: import java.io.IOException;
012: import java.util.Set;
013: import javax.management.AttributeList;
014: import javax.management.AttributeNotFoundException;
015: import javax.management.InstanceAlreadyExistsException;
016: import javax.management.InstanceNotFoundException;
017: import javax.management.IntrospectionException;
018: import javax.management.InvalidAttributeValueException;
019: import javax.management.ListenerNotFoundException;
020: import javax.management.MBeanException;
021: import javax.management.MBeanInfo;
022: import javax.management.MBeanRegistrationException;
023: import javax.management.NotCompliantMBeanException;
024: import javax.management.ObjectInstance;
025: import javax.management.ObjectName;
026: import javax.management.ReflectionException;
027: import javax.management.remote.NotificationResult;
028: import javax.security.auth.Subject;
029: import javax.xml.namespace.QName;
030: import javax.xml.rpc.ParameterMode;
031: import javax.xml.rpc.ServiceException;
032:
033: import mx4j.tools.remote.http.HTTPConnection;
034: import org.apache.axis.client.Call;
035: import org.apache.axis.client.Service;
036: import org.apache.axis.encoding.XMLType;
037: import org.apache.axis.message.SOAPHeaderElement;
038:
039: /**
040: * @version $Revision: 1.3 $
041: */
042: public class SOAPClientInvoker implements HTTPConnection {
043: private static final QName qObjectName = new QName(
044: SOAPConstants.NAMESPACE_URI, "ObjectName");
045: private static final QName qObjectInstance = new QName(
046: SOAPConstants.NAMESPACE_URI, "ObjectInstance");
047: private static final QName qSubject = new QName(
048: SOAPConstants.NAMESPACE_URI, "Subject");
049:
050: private final String endpoint;
051: private final Service service;
052: private String connectionId;
053:
054: public SOAPClientInvoker(String endpoint, Service service) {
055: this .endpoint = endpoint;
056: this .service = service;
057: }
058:
059: public String connect(Object credentials) throws IOException,
060: SecurityException {
061: Call call = createCall();
062:
063: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
064: "connect"));
065: call.addParameter("credentials", XMLType.XSD_ANY,
066: ParameterMode.IN);
067: call.setReturnType(XMLType.XSD_STRING);
068: // call.addFault(new QName(SOAPConstants.NAMESPACE_URI, "SecurityException"), SecurityException.class, XMLType.XSD_ANY, true);
069:
070: connectionId = (String) call
071: .invoke(new Object[] { credentials });
072: return connectionId;
073: }
074:
075: public void close() throws IOException {
076: Call call = createCall();
077:
078: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
079: "close"));
080: call.setReturnType(XMLType.AXIS_VOID);
081:
082: call.invoke(new Object[0]);
083: }
084:
085: public String getConnectionId() throws IOException {
086: return connectionId;
087: }
088:
089: public Integer addNotificationListener(ObjectName name,
090: Object filter, Subject delegate)
091: throws InstanceNotFoundException, IOException {
092: Call call = createCall();
093:
094: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
095: "addNotificationListener"));
096: call.addParameter("observed", qObjectName, ParameterMode.IN);
097: call.addParameter("filter", XMLType.XSD_ANY, ParameterMode.IN);
098: call.addParameter("delegate", qSubject, ParameterMode.IN);
099: call.setReturnType(XMLType.XSD_INT);
100:
101: return (Integer) call.invoke(new Object[] { name, filter,
102: delegate });
103: }
104:
105: public void removeNotificationListeners(ObjectName observed,
106: Integer[] ids, Subject delegate)
107: throws InstanceNotFoundException,
108: ListenerNotFoundException, IOException {
109: Call call = createCall();
110:
111: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
112: "removeNotificationListeners"));
113: call.addParameter("observed", qObjectName, ParameterMode.IN);
114: call.addParameter("ids", XMLType.SOAP_ARRAY, ParameterMode.IN);
115: call.addParameter("delegate", qSubject, ParameterMode.IN);
116: call.setReturnType(XMLType.AXIS_VOID);
117:
118: call.invoke(new Object[] { observed, ids, delegate });
119: }
120:
121: public NotificationResult fetchNotifications(
122: long clientSequenceNumber, int maxNotifications,
123: long timeout) throws IOException {
124: Call call = createCall();
125:
126: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
127: "fetchNotifications"));
128: call.addParameter("sequence", XMLType.XSD_LONG,
129: ParameterMode.IN);
130: call.addParameter("maxNumber", XMLType.XSD_INT,
131: ParameterMode.IN);
132: call
133: .addParameter("timeout", XMLType.XSD_LONG,
134: ParameterMode.IN);
135: call.setReturnType(new QName(SOAPConstants.NAMESPACE_URI,
136: "NotificationResult"));
137:
138: NotificationResult result = (NotificationResult) call
139: .invoke(new Object[] { new Long(clientSequenceNumber),
140: new Integer(maxNotifications),
141: new Long(timeout) });
142: return result;
143: }
144:
145: public void addNotificationListener(ObjectName name,
146: ObjectName listener, Object filter, Object handback,
147: Subject delegate) throws InstanceNotFoundException,
148: IOException {
149: Call call = createCall();
150:
151: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
152: "addNotificationListener"));
153: call.addParameter("observed", qObjectName, ParameterMode.IN);
154: call.addParameter("listener", qObjectName, ParameterMode.IN);
155: call.addParameter("filter", XMLType.XSD_ANY, ParameterMode.IN);
156: call
157: .addParameter("handback", XMLType.XSD_ANY,
158: ParameterMode.IN);
159: call.addParameter("delegate", qSubject, ParameterMode.IN);
160: call.setReturnType(XMLType.AXIS_VOID);
161:
162: call.invoke(new Object[] { name, listener, filter, handback,
163: delegate });
164: }
165:
166: public void removeNotificationListener(ObjectName name,
167: ObjectName listener, Subject delegate)
168: throws InstanceNotFoundException,
169: ListenerNotFoundException, IOException {
170: Call call = createCall();
171:
172: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
173: "removeNotificationListener"));
174: call.addParameter("observed", qObjectName, ParameterMode.IN);
175: call.addParameter("listener", qObjectName, ParameterMode.IN);
176: call.addParameter("delegate", qSubject, ParameterMode.IN);
177: call.setReturnType(XMLType.AXIS_VOID);
178:
179: call.invoke(new Object[] { name, listener, delegate });
180: }
181:
182: public void removeNotificationListener(ObjectName name,
183: ObjectName listener, Object filter, Object handback,
184: Subject delegate) throws InstanceNotFoundException,
185: ListenerNotFoundException, IOException {
186: Call call = createCall();
187:
188: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
189: "removeNotificationListener"));
190: call.addParameter("observed", qObjectName, ParameterMode.IN);
191: call.addParameter("listener", qObjectName, ParameterMode.IN);
192: call.addParameter("filter", XMLType.XSD_ANY, ParameterMode.IN);
193: call
194: .addParameter("handback", XMLType.XSD_ANY,
195: ParameterMode.IN);
196: call.addParameter("delegate", qSubject, ParameterMode.IN);
197: call.setReturnType(XMLType.AXIS_VOID);
198:
199: call.invoke(new Object[] { name, listener, filter, handback,
200: delegate });
201: }
202:
203: public MBeanInfo getMBeanInfo(ObjectName objectName,
204: Subject delegate) throws InstanceNotFoundException,
205: IntrospectionException, ReflectionException, IOException {
206: Call call = createCall();
207:
208: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
209: "getMBeanInfo"));
210: call.addParameter("objectName", qObjectName, ParameterMode.IN);
211: call.addParameter("delegate", qSubject, ParameterMode.IN);
212: call.setReturnType(new QName(SOAPConstants.NAMESPACE_URI,
213: "MBeanInfo"));
214:
215: MBeanInfo info = (MBeanInfo) call.invoke(new Object[] {
216: objectName, delegate });
217: return info;
218: }
219:
220: public boolean isInstanceOf(ObjectName objectName,
221: String className, Subject delegate)
222: throws InstanceNotFoundException, IOException {
223: Call call = createCall();
224:
225: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
226: "isInstanceOf"));
227: call.addParameter("objectName", qObjectName, ParameterMode.IN);
228: call.addParameter("className", XMLType.XSD_STRING,
229: ParameterMode.IN);
230: call.addParameter("delegate", qSubject, ParameterMode.IN);
231: call.setReturnType(XMLType.XSD_BOOLEAN);
232:
233: Boolean isinstanceof = (Boolean) call.invoke(new Object[] {
234: objectName, className, delegate });
235: return isinstanceof .booleanValue();
236: }
237:
238: public String[] getDomains(Subject delegate) throws IOException {
239: Call call = createCall();
240:
241: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
242: "getDomains"));
243: call.addParameter("delegate", qSubject, ParameterMode.IN);
244: call.setReturnType(XMLType.SOAP_ARRAY);
245:
246: String[] domains = (String[]) call
247: .invoke(new Object[] { delegate });
248: return domains;
249: }
250:
251: public String getDefaultDomain(Subject delegate) throws IOException {
252: Call call = createCall();
253:
254: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
255: "getDefaultDomain"));
256: call.addParameter("delegate", qSubject, ParameterMode.IN);
257: call.setReturnType(XMLType.XSD_STRING);
258:
259: String domain = (String) call.invoke(new Object[] { delegate });
260: return domain;
261: }
262:
263: public ObjectInstance createMBean(String className,
264: ObjectName objectName, Object args, String[] parameters,
265: Subject delegate) throws ReflectionException,
266: InstanceAlreadyExistsException, MBeanRegistrationException,
267: MBeanException, NotCompliantMBeanException, IOException {
268: Call call = createCall();
269:
270: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
271: "createMBean"));
272:
273: call.addParameter("className", XMLType.XSD_STRING,
274: ParameterMode.IN);
275: call.addParameter("objectName", qObjectName, ParameterMode.IN);
276: call.addParameter("arguments", XMLType.SOAP_ARRAY,
277: ParameterMode.IN);
278: call.addParameter("signature", XMLType.SOAP_ARRAY,
279: ParameterMode.IN);
280: call.addParameter("delegate", qSubject, ParameterMode.IN);
281: call.setReturnType(qObjectInstance);
282:
283: ObjectInstance instance = (ObjectInstance) call
284: .invoke(new Object[] { className, objectName, args,
285: parameters, delegate });
286: return instance;
287: }
288:
289: public ObjectInstance createMBean(String className,
290: ObjectName objectName, ObjectName loaderName, Object args,
291: String[] parameters, Subject delegate)
292: throws ReflectionException, InstanceAlreadyExistsException,
293: MBeanRegistrationException, MBeanException,
294: NotCompliantMBeanException, InstanceNotFoundException,
295: IOException {
296: Call call = createCall();
297:
298: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
299: "createMBean"));
300:
301: call.addParameter("className", XMLType.XSD_STRING,
302: ParameterMode.IN);
303: call.addParameter("objectName", qObjectName, ParameterMode.IN);
304: call.addParameter("loaderName", qObjectName, ParameterMode.IN);
305: call.addParameter("arguments", XMLType.SOAP_ARRAY,
306: ParameterMode.IN);
307: call.addParameter("signature", XMLType.SOAP_ARRAY,
308: ParameterMode.IN);
309: call.addParameter("delegate", qSubject, ParameterMode.IN);
310: call.setReturnType(qObjectInstance);
311:
312: ObjectInstance instance = (ObjectInstance) call
313: .invoke(new Object[] { className, objectName,
314: loaderName, args, parameters, delegate });
315: return instance;
316: }
317:
318: public void unregisterMBean(ObjectName objectName, Subject delegate)
319: throws InstanceNotFoundException,
320: MBeanRegistrationException, IOException {
321: Call call = createCall();
322:
323: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
324: "unregisterMBean"));
325: call.addParameter("objectName", qObjectName, ParameterMode.IN);
326: call.addParameter("delegate", qSubject, ParameterMode.IN);
327: call.setReturnType(XMLType.AXIS_VOID);
328:
329: call.invoke(new Object[] { objectName, delegate });
330: }
331:
332: public Object getAttribute(ObjectName objectName, String attribute,
333: Subject delegate) throws MBeanException,
334: AttributeNotFoundException, InstanceNotFoundException,
335: ReflectionException, IOException {
336: Call call = createCall();
337:
338: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
339: "getAttribute"));
340: call.addParameter("objectName", qObjectName, ParameterMode.IN);
341: call.addParameter("attributeName", XMLType.XSD_STRING,
342: ParameterMode.IN);
343: call.addParameter("delegate", qSubject, ParameterMode.IN);
344: call.setReturnType(XMLType.XSD_ANY);
345:
346: Object result = call.invoke(new Object[] { objectName,
347: attribute, delegate });
348: return result;
349: }
350:
351: public void setAttribute(ObjectName objectName, Object attribute,
352: Subject delegate) throws InstanceNotFoundException,
353: AttributeNotFoundException, InvalidAttributeValueException,
354: MBeanException, ReflectionException, IOException {
355: Call call = createCall();
356:
357: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
358: "setAttribute"));
359:
360: call.addParameter("objectName", qObjectName, ParameterMode.IN);
361: call.addParameter("attribute", new QName(
362: SOAPConstants.NAMESPACE_URI, "Attribute"),
363: ParameterMode.IN);
364: call.addParameter("delegate", qSubject, ParameterMode.IN);
365: call.setReturnType(XMLType.AXIS_VOID);
366:
367: call.invoke(new Object[] { objectName, attribute, delegate });
368: }
369:
370: public AttributeList getAttributes(ObjectName objectName,
371: String[] attributes, Subject delegate)
372: throws InstanceNotFoundException, ReflectionException,
373: IOException {
374: Call call = createCall();
375:
376: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
377: "getAttributes"));
378: call.addParameter("objectName", qObjectName, ParameterMode.IN);
379: call.addParameter("attributeNames", XMLType.SOAP_ARRAY,
380: ParameterMode.IN);
381: call.addParameter("delegate", qSubject, ParameterMode.IN);
382: call.setReturnType(new QName(SOAPConstants.NAMESPACE_URI,
383: "AttributeList"));
384:
385: AttributeList list = (AttributeList) call.invoke(new Object[] {
386: objectName, attributes, delegate });
387: return list;
388: }
389:
390: public AttributeList setAttributes(ObjectName objectName,
391: Object attributes, Subject delegate)
392: throws InstanceNotFoundException, ReflectionException,
393: IOException {
394: Call call = createCall();
395:
396: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
397: "setAttributes"));
398: QName qAttributeList = new QName(SOAPConstants.NAMESPACE_URI,
399: "AttributeList");
400: call.addParameter("objectName", qObjectName, ParameterMode.IN);
401: call.addParameter("attributeList", qAttributeList,
402: ParameterMode.IN);
403: call.addParameter("delegate", qSubject, ParameterMode.IN);
404: call.setReturnType(qAttributeList);
405:
406: AttributeList list = (AttributeList) call.invoke(new Object[] {
407: objectName, attributes, delegate });
408: return list;
409: }
410:
411: public Object invoke(ObjectName objectName, String methodName,
412: Object args, String[] parameters, Subject delegate)
413: throws InstanceNotFoundException, MBeanException,
414: ReflectionException, IOException {
415: Call call = createCall();
416:
417: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
418: "invoke"));
419: call.addParameter("objectName", qObjectName, ParameterMode.IN);
420: call.addParameter("operationName", XMLType.XSD_STRING,
421: ParameterMode.IN);
422: call.addParameter("arguments", XMLType.SOAP_ARRAY,
423: ParameterMode.IN);
424: call.addParameter("signature", XMLType.SOAP_ARRAY,
425: ParameterMode.IN);
426: call.addParameter("delegate", qSubject, ParameterMode.IN);
427: call.setReturnType(XMLType.XSD_ANY);
428:
429: Object object = call.invoke(new Object[] { objectName,
430: methodName, args, parameters, delegate });
431: return object;
432: }
433:
434: public Integer getMBeanCount(Subject delegate) throws IOException {
435: Call call = createCall();
436:
437: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
438: "getMBeanCount"));
439: call.addParameter("delegate", qSubject, ParameterMode.IN);
440: call.setReturnType(XMLType.XSD_INT);
441:
442: Integer count = (Integer) call
443: .invoke(new Object[] { delegate });
444: return count;
445: }
446:
447: public boolean isRegistered(ObjectName objectName, Subject delegate)
448: throws IOException {
449: Call call = createCall();
450:
451: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
452: "isRegistered"));
453:
454: call.addParameter("objectName", qObjectName, ParameterMode.IN);
455: call.addParameter("delegate", qSubject, ParameterMode.IN);
456: call.setReturnType(XMLType.XSD_BOOLEAN);
457:
458: Boolean registered = (Boolean) call.invoke(new Object[] {
459: objectName, delegate });
460: return registered.booleanValue();
461: }
462:
463: public ObjectInstance getObjectInstance(ObjectName objectName,
464: Subject delegate) throws InstanceNotFoundException,
465: IOException {
466: Call call = createCall();
467:
468: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
469: "getObjectInstance"));
470: call.addParameter("objectName", qObjectName, ParameterMode.IN);
471: call.addParameter("delegate", qSubject, ParameterMode.IN);
472: call.setReturnType(qObjectInstance);
473:
474: ObjectInstance instance = (ObjectInstance) call
475: .invoke(new Object[] { objectName, delegate });
476: return instance;
477: }
478:
479: public Set queryMBeans(ObjectName patternName, Object filter,
480: Subject delegate) throws IOException {
481: Call call = createCall();
482:
483: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
484: "queryMBeans"));
485: call.addParameter("pattern", qObjectName, ParameterMode.IN);
486: call.addParameter("query", XMLType.XSD_ANY, ParameterMode.IN);
487: call.addParameter("delegate", qSubject, ParameterMode.IN);
488: call
489: .setReturnType(new QName(SOAPConstants.NAMESPACE_URI,
490: "Set"));
491:
492: Set set = (Set) call.invoke(new Object[] { patternName, filter,
493: delegate });
494: return set;
495: }
496:
497: public Set queryNames(ObjectName patternName, Object filter,
498: Subject delegate) throws IOException {
499: Call call = createCall();
500:
501: call.setOperationName(new QName(SOAPConstants.NAMESPACE_URI,
502: "queryNames"));
503: call.addParameter("pattern", qObjectName, ParameterMode.IN);
504: call.addParameter("query", XMLType.XSD_ANY, ParameterMode.IN);
505: call.addParameter("delegate", qSubject, ParameterMode.IN);
506: call
507: .setReturnType(new QName(SOAPConstants.NAMESPACE_URI,
508: "Set"));
509:
510: Set set = (Set) call.invoke(new Object[] { patternName, filter,
511: delegate });
512: return set;
513: }
514:
515: private Call createCall() throws IOException {
516: try {
517: Call call = (Call) service.createCall();
518:
519: call.setTargetEndpointAddress(endpoint);
520:
521: SOAPHeaderElement connectionIDHeader = new SOAPHeaderElement(
522: SOAPConstants.NAMESPACE_URI,
523: SOAPConstants.CONNECTION_ID_HEADER_NAME,
524: connectionId);
525: connectionIDHeader.setMustUnderstand(true);
526: call.addHeader(connectionIDHeader);
527:
528: return call;
529: } catch (ServiceException x) {
530: throw new IOException(x.toString());
531: }
532: }
533: }
|