From 0d99557c6c81d44c7795a0f5110a2e1afef54c28 Mon Sep 17 00:00:00 2001 From: Andrea Gazzarini Date: Tue, 17 Feb 2009 11:49:58 +0000 Subject: QPID-1606 : Connect example + Connect interface Improvements git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@744967 13f79535-47bb-0310-9956-ffa450edef68 --- .../client/src/example/ConnectWithBroker.out.ok | 81 +++++++ .../management/example/AbstractQManExample.java | 6 +- .../example/ConnectWithBrokerExample.java | 240 +++++++++++++++++++++ .../java/org/apache/qpid/management/Names.java | 24 ++- .../wsdm/capabilities/QManAdapterCapability.java | 10 +- .../qpid/management/wsdm/common/QManFault.java | 2 +- .../common/UnableToConnectWithBrokerFault.java | 86 ++++++++ 7 files changed, 443 insertions(+), 6 deletions(-) create mode 100644 qpid/java/management/client/src/example/ConnectWithBroker.out.ok create mode 100644 qpid/java/management/client/src/example/org/apache/qpid/management/example/ConnectWithBrokerExample.java create mode 100644 qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/common/UnableToConnectWithBrokerFault.java (limited to 'qpid/java') diff --git a/qpid/java/management/client/src/example/ConnectWithBroker.out.ok b/qpid/java/management/client/src/example/ConnectWithBroker.out.ok new file mode 100644 index 0000000000..33af477b98 --- /dev/null +++ b/qpid/java/management/client/src/example/ConnectWithBroker.out.ok @@ -0,0 +1,81 @@ + ConnectWithBrokerExample +------------------------------------------------------------------- + +This example shows how to connect QMan with a broker using +the adapter interface. + +Type enter to proceed... + +[CLIENT TRACE] SOAP envelope contents (outgoing): + + + + http://romagazzarini:8080/qman/services/adapter + http://amqp.apache.org/qpid/management/qman/Connect + uuid:48bf9a1b-f814-7391-b5cf-d163de4ac068 + + http://www.w3.org/2005/08/addressing/role/anonymous + + + + + sofia.gazzax.com + 5672 + test + a.gazzarini + p1ssw9rd + 1 + 4 + 2000 + + + + +[CLIENT TRACE] SOAP envelope contents (incoming): + + + + http://www.w3.org/2005/08/addressing/role/anonymous + http://www.w3.org/2005/08/addressing/fault + uuid:220bfe54-d5f4-4a04-794c-0f5d99a64567 + uuid:48bf9a1b-f814-7391-b5cf-d163de4ac068 + + http://romagazzarini:8080/qman/services/adapter + + + + + + qman:QMan + + + Unable to connect with the requested broker. Underlying exception message was null + + + + 2009-02-17T10:37:08+01:00 + + + http://romagazzarini:8080/qman/services/adapter + + sofia.gazzax.com + 5672 + test + p1ssw9rd + + + + + + +-----------------------EXAMPLE FAILURE----------- +Not well-defined exception was detected while +running the example. +org.apache.muse.ws.addressing.soap.SoapFault: Unable to connect with the requested broker. Underlying exception message was null + at org.apache.muse.core.AbstractResourceClient.invoke(AbstractResourceClient.java:298) + at org.apache.muse.core.AbstractResourceClient.invoke(AbstractResourceClient.java:232) + at org.apache.muse.core.AbstractResourceClient.invoke(AbstractResourceClient.java:211) + at org.apache.qpid.management.example.ConnectWithBrokerExample.executeExample(ConnectWithBrokerExample.java:146) + at org.apache.qpid.management.example.ConnectWithBrokerExample.execute(ConnectWithBrokerExample.java:97) + at org.apache.qpid.management.example.ConnectWithBrokerExample.main(ConnectWithBrokerExample.java:201) +-------------------------------------------------------- diff --git a/qpid/java/management/client/src/example/org/apache/qpid/management/example/AbstractQManExample.java b/qpid/java/management/client/src/example/org/apache/qpid/management/example/AbstractQManExample.java index ad05548f12..ffa96635a8 100644 --- a/qpid/java/management/client/src/example/org/apache/qpid/management/example/AbstractQManExample.java +++ b/qpid/java/management/client/src/example/org/apache/qpid/management/example/AbstractQManExample.java @@ -32,7 +32,7 @@ import org.apache.muse.ws.addressing.EndpointReference; */ public abstract class AbstractQManExample { - private final static String LINE_SEPARATOR = System.getProperty("line.separator","\n"); + final static String LINE_SEPARATOR = System.getProperty("line.separator","\n"); protected final static String PREFIX = "qman"; /** @@ -104,7 +104,7 @@ public abstract class AbstractQManExample } } - private void waitForUserInput(String message) throws IOException { + protected void waitForUserInput(String message) throws IOException { System.out.println(message); System.in.read(); } @@ -118,7 +118,7 @@ public abstract class AbstractQManExample * @param port the port where QMan is running. * @throws Exception when the example fails (not at application level). */ - abstract void executeExample(String host, int port) throws Exception; + void executeExample(String host, int port) throws Exception{}; /** * Returns the endpoint reference of the adapter service. diff --git a/qpid/java/management/client/src/example/org/apache/qpid/management/example/ConnectWithBrokerExample.java b/qpid/java/management/client/src/example/org/apache/qpid/management/example/ConnectWithBrokerExample.java new file mode 100644 index 0000000000..153f0f66d5 --- /dev/null +++ b/qpid/java/management/client/src/example/org/apache/qpid/management/example/ConnectWithBrokerExample.java @@ -0,0 +1,240 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.example; + +import javax.xml.namespace.QName; + +import org.apache.muse.core.proxy.ProxyHandler; +import org.apache.muse.core.proxy.ReflectionProxyHandler; +import org.apache.muse.ws.addressing.EndpointReference; +import org.apache.muse.ws.resource.remote.WsResourceClient; + +/** + * This example shows how to connect QMan with a broker using the adapter interface. + * As you can see the interface is very simple and requests you the following parameters : + * + * + * + * @author Andrea Gazzarini + */ +public class ConnectWithBrokerExample extends AbstractQManExample +{ + + /** + * Executes the connect example. + * Although not specified explicitly, the input array MUST contains in the following order : + * + * + * + * Note that this example differs from the others (and therefore is overriding the execute() method) because + * in this case we are not using the "standard" WSRF interface but instead an additional custom + * "operation" on a WS-Resource. + * + * @param arguments the commadn line arguments. + */ + void execute(String [] arguments) + { + if (arguments.length != 10){ + printUsageAndExit("invalid command line was given."); + } + + try + { + // 1) Parses command line arguments... + String host = arguments[0]; + int port = Integer.parseInt(arguments[1]); + String qpidHost = arguments[2]; + int qpidPort = Integer.parseInt(arguments[3]); + String virtualHost = arguments[4]; + String username = arguments[5]; + String password = arguments[6]; + int initPoolCapacity = Integer.parseInt(arguments[7]); + int maxPoolCapacity = Integer.parseInt(arguments[8]); + long maxWaitTimeout = Long.parseLong(arguments[9]); + + printOutExampleDescription(); + + waitForUserInput("Type enter to proceed..."); + + executeExample( + host, + port, + qpidHost, + qpidPort, + virtualHost, + username, + password, + initPoolCapacity, + maxPoolCapacity, + maxWaitTimeout); + + } catch(NumberFormatException exception) + { + printUsageAndExit("Unable to run the example. Please ensure that all numeric values are correctly supplied."); + } catch(Exception exception) + { + System.out.println("-----------------------EXAMPLE FAILURE-----------"); + System.out.println("Not well-defined exception was detected while"); + System.out.println("running the example."); + exception.printStackTrace(System.out); + System.out.println("--------------------------------------------------------"); + } + } + + /** + * Connects QMan with a broker. + * + *@param host the hostname where QMan is running; + *@param port the port number where QMan is running; + *@param qpidHost the host name where QPid is running; + *@param qpidPort the port number where Qpid is running; + *@param virtualHost the virtual host name; + *@param username the username that will be used for estabilshing connection. + *@param password the password that will be used for estabilshing connection. + *@param initPoolCapacity the initial size of broker connection pool. + *@param maxPoolCapacity the max allowed size of broker connection pool. + *@param maxWaitTimeout the max wait timeout for retrieving connections. + * + * @throws Exception when the example fails (not at application level). + */ + void executeExample(String host, int port, String qpidHost, int qpidPort, String virtualHost, String username, String password, int initPoolCapacity, int maxPoolCapacity, long maxWaitTimeout) throws Exception + { + // 1) Creates an endpoint reference of the adapter service... + EndpointReference adapterEndpointReference = getAdapterEndpointReference(host, port); + WsResourceClient adapterClient = new WsResourceClient(adapterEndpointReference); + adapterClient.setTrace(true); + + // 2) Creates the Adapter service client... + adapterClient.invoke( + getProxyHandler(), + new Object[]{ + qpidHost, + qpidPort, + username, + password, + virtualHost, + initPoolCapacity, + maxPoolCapacity, + maxWaitTimeout}); + } + + /** + * Prints out a description of this example. + */ + void printOutExampleDescription() + { + System.out.println(" "+getClass().getSimpleName()+" "); + System.out.println("-------------------------------------------------------------------"); + System.out.println(); + System.out.println("This example shows how to connect QMan with a broker using"); + System.out.println("the adapter interface."); + System.out.println(); + } + + /** + * A proxy handler is a module needed in order to make a capability + * service invocation. + * It contains logic to serialize and deserialize request, response, input and + * output parameters during a web service invocation. + * + * @return a proxy handler. + */ + private ProxyHandler getProxyHandler() + { + ProxyHandler handler = new ReflectionProxyHandler(); + handler.setAction("http://amqp.apache.org/qpid/management/qman/Connect"); + handler.setRequestName(new QName("http://amqp.apache.org/qpid/management/qman", "Connect", PREFIX)); + handler.setRequestParameterNames(new QName[]{ + new QName("http://amqp.apache.org/qpid/management/qman", "host", PREFIX), + new QName("http://amqp.apache.org/qpid/management/qman", "port", PREFIX), + new QName("http://amqp.apache.org/qpid/management/qman", "username", PREFIX), + new QName("http://amqp.apache.org/qpid/management/qman", "password", PREFIX), + new QName("http://amqp.apache.org/qpid/management/qman", "virtualHost", PREFIX), + new QName("http://amqp.apache.org/qpid/management/qman", "initialPoolCapacity", PREFIX), + new QName("http://amqp.apache.org/qpid/management/qman", "maxPoolCapacity", PREFIX), + new QName("http://amqp.apache.org/qpid/management/qman", "maxWaitTimeout", PREFIX)}); + handler.setResponseName(new QName("http://amqp.apache.org/qpid/management/qman", "ConnectResponse", PREFIX)); + handler.setReturnType(null); + return handler; + } + + public static void main(String[] arguments) + { + new ConnectWithBrokerExample().execute(arguments); + } + + static void printUsageAndExit(String reason) + { + StringBuilder builder = new StringBuilder(); + builder.append("WARNING! Unable to run this sample : ") + .append(reason) + .append(LINE_SEPARATOR) + .append("-------------------------------------------------------------") + .append(LINE_SEPARATOR) + .append("Expected command line args for this sample are :") + .append(LINE_SEPARATOR) + .append(LINE_SEPARATOR) + .append("1) host : ip or host name where QMan is running.") + .append(LINE_SEPARATOR) + .append("2) port : port number where QMan is running.") + .append(LINE_SEPARATOR) + .append("3) qpid host : port number where Qpid is running.") + .append(LINE_SEPARATOR) + .append("4) qpid port : port number where Qpid is running.") + .append(LINE_SEPARATOR) + .append("5) virtual host : virtual host name.") + .append(LINE_SEPARATOR) + .append("6) username : port number where QMan is running.") + .append(LINE_SEPARATOR) + .append("7) password : port number where QMan is running.") + .append(LINE_SEPARATOR) + .append("8) initial pool capacity : port number where QMan is running.") + .append(LINE_SEPARATOR) + .append("9) max pool capacity : port number where QMan is running.") + .append(LINE_SEPARATOR) + .append("10) max wait timeout : port number where QMan is running.") + .append(LINE_SEPARATOR) + + .append("------------------------------------------------------------"); + System.out.println(builder); + System.exit(1); + } +} \ No newline at end of file diff --git a/qpid/java/management/client/src/main/java/org/apache/qpid/management/Names.java b/qpid/java/management/client/src/main/java/org/apache/qpid/management/Names.java index 351195db0b..808cafb6a7 100644 --- a/qpid/java/management/client/src/main/java/org/apache/qpid/management/Names.java +++ b/qpid/java/management/client/src/main/java/org/apache/qpid/management/Names.java @@ -170,11 +170,31 @@ public abstract class Names "EventsLifeCycleTopic", Names.PREFIX); + public final static QName HOST_QNAME = new QName( + Names.NAMESPACE_URI, + "host", + Names.PREFIX); + + public final static QName PORT_QNAME = new QName( + Names.NAMESPACE_URI, + "port", + Names.PREFIX); + + public final static QName USERNAME_QNAME= new QName( + Names.NAMESPACE_URI, + "username", + Names.PREFIX); + + public final static QName VIRTUAL_HOST_QNAME= new QName( + Names.NAMESPACE_URI, + "virtualHost", + Names.PREFIX); + public final static QName UNKNOWN_OBJECT_TYPE_LIFECYLE_TOPIC_NAME= new QName( Names.NAMESPACE_URI, "UnclassifiedLifeCycleTopic", Names.PREFIX); - + public final static String NAME_ATTRIBUTE = "name"; public final static String MODIFIABILITY = "modifiability"; @@ -191,4 +211,6 @@ public abstract class Names public final static String ADAPTER_HOST_PROPERTY_NAME = "qman.host"; public final static String ADAPTER_PORT_PROPERTY_NAME = "qman.port"; + + } \ No newline at end of file diff --git a/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/QManAdapterCapability.java b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/QManAdapterCapability.java index 980eb9c1b5..414f37a746 100644 --- a/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/QManAdapterCapability.java +++ b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/QManAdapterCapability.java @@ -53,6 +53,7 @@ import org.apache.qpid.management.Names; import org.apache.qpid.management.configuration.Configuration; import org.apache.qpid.management.jmx.EntityLifecycleNotification; import org.apache.qpid.management.wsdm.common.ThreadSessionManager; +import org.apache.qpid.management.wsdm.common.UnableToConnectWithBrokerFault; import org.apache.qpid.management.wsdm.muse.engine.WSDMAdapterEnvironment; import org.apache.qpid.management.wsdm.muse.serializer.ByteArraySerializer; import org.apache.qpid.management.wsdm.notifications.LifeCycleEvent; @@ -347,7 +348,14 @@ public class QManAdapterCapability extends AbstractCapability long.class.getName()}); } catch(Exception exception) { - throw new SoapFault(exception); + LOGGER.error(Messages.QMAN_100017_UNABLE_TO_CONNECT,host,port); + throw new UnableToConnectWithBrokerFault( + getResource().getEndpointReference(), + host, + port, + username, + virtualHost, + exception.getMessage()); } } diff --git a/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/common/QManFault.java b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/common/QManFault.java index 9c78dfa0bb..0a52c2ba65 100644 --- a/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/common/QManFault.java +++ b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/common/QManFault.java @@ -35,7 +35,7 @@ public class QManFault extends BaseFault private static final long serialVersionUID = 5977379710882983474L; private final static QName SERVICE = new QName( Names.NAMESPACE_URI, - "Service", + "QMan", Names.PREFIX); private final static QName EXCEPTION_QNAME = new QName( diff --git a/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/common/UnableToConnectWithBrokerFault.java b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/common/UnableToConnectWithBrokerFault.java new file mode 100644 index 0000000000..55365b4051 --- /dev/null +++ b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/common/UnableToConnectWithBrokerFault.java @@ -0,0 +1,86 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ +package org.apache.qpid.management.wsdm.common; + +import javax.xml.namespace.QName; + +import org.apache.muse.util.xml.XmlUtils; +import org.apache.muse.ws.addressing.EndpointReference; +import org.apache.qpid.management.Names; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +/** + * This is the exception encapsulating the fault that will be thrown in case of + * broker connection failure. + * + * @author Andrea Gazzarini + */ +public class UnableToConnectWithBrokerFault extends QManFault +{ + private static final long serialVersionUID = 5977379710882983474L; + + private String _host; + private int _port; + private String _username; + private String _virtualHostName; + + /** + * Builds a new exception with the given endpoint reference and connection data. + * + * @param host the requested qpid host. + * @param port the requested qpid port. + * @param username the username used for estabilishing connection. + * @param virtualHostName the name of the target virtual host.. + */ + public UnableToConnectWithBrokerFault( + EndpointReference endpointReference, + String host, + int port, + String username, + String virtualHostName, + String message) + { + super( + endpointReference, + new QName( + Names.NAMESPACE_URI, + "UnableToConnectFault", + Names.PREFIX), + String.format("Unable to connect with the requested broker. Underlying exception message was %s",message)); + this._host = host; + this._port = port; + this._username = username; + this._virtualHostName = virtualHostName; + } + + @Override + public Element getDetail() + { + Element detail = super.getDetail(); + Document owner = detail.getOwnerDocument(); + detail.appendChild(XmlUtils.createElement(owner, Names.HOST_QNAME,_host)); + detail.appendChild(XmlUtils.createElement(owner, Names.PORT_QNAME,_port)); + detail.appendChild(XmlUtils.createElement(owner, Names.USERNAME_QNAME,_username)); + detail.appendChild(XmlUtils.createElement(owner, Names.VIRTUAL_HOST_QNAME,_virtualHostName)); + return detail; + } +} \ No newline at end of file -- cgit v1.2.1