summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrea Gazzarini <agazzarini@apache.org>2009-01-19 06:56:14 +0000
committerAndrea Gazzarini <agazzarini@apache.org>2009-01-19 06:56:14 +0000
commitb1f26965fd674c21cbbe5d7fa121d95d43c2aa39 (patch)
tree6ce91311a434e9178c9f8cc569423741d91b699d
parent5efcf7517ae687ac860ab71fc906b19a62949162 (diff)
downloadqpid-python-b1f26965fd674c21cbbe5d7fa121d95d43c2aa39.tar.gz
QPID-1578 : WS-Resources lifecycle improved adding "destroy" feature
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@735621 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/java/management/client/src/main/java/org/apache/qpid/management/ICommand.java32
-rw-r--r--qpid/java/management/client/src/main/java/org/apache/qpid/management/Messages.java17
-rw-r--r--qpid/java/management/client/src/main/java/org/apache/qpid/management/Names.java31
-rw-r--r--qpid/java/management/client/src/main/java/org/apache/qpid/management/jmx/EntityLifecycleNotification.java4
-rw-r--r--qpid/java/management/client/src/main/java/org/apache/qpid/management/servlet/ConnectQManToBroker.java8
-rw-r--r--qpid/java/management/client/src/main/java/org/apache/qpid/management/servlet/QManLifeCycleManager.java49
-rw-r--r--qpid/java/management/client/src/main/java/org/apache/qpid/management/servlet/WSDMAdapter.java32
-rw-r--r--qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/MBeanCapability.java18
-rw-r--r--qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/MBeanCapabilityBuilder.java9
-rw-r--r--qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/QManAdapterCapability.java175
-rw-r--r--qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/WsdlBuilder.java15
-rw-r--r--qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/common/ObjectNameIdFactory.java11
-rw-r--r--qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/engine/WSDMAdapterEnvironment.java45
-rw-r--r--qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/resources/QManWsResource.java496
14 files changed, 629 insertions, 313 deletions
diff --git a/qpid/java/management/client/src/main/java/org/apache/qpid/management/ICommand.java b/qpid/java/management/client/src/main/java/org/apache/qpid/management/ICommand.java
deleted file mode 100644
index c95270688e..0000000000
--- a/qpid/java/management/client/src/main/java/org/apache/qpid/management/ICommand.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *
- * 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;
-
-/**
- * Command interface.
- */
-public interface ICommand
-{
- /**
- * Executes the action specified by this command.
- */
- public void execute() throws Exception;
-}
diff --git a/qpid/java/management/client/src/main/java/org/apache/qpid/management/Messages.java b/qpid/java/management/client/src/main/java/org/apache/qpid/management/Messages.java
index c2a102ff95..75e46afdfd 100644
--- a/qpid/java/management/client/src/main/java/org/apache/qpid/management/Messages.java
+++ b/qpid/java/management/client/src/main/java/org/apache/qpid/management/Messages.java
@@ -62,6 +62,8 @@ public interface Messages
String QMAN_000027_WSDM_ADAPTER_STARTED = "<QMAN-000027> : WS-DM Adapter ready for incoming requests.";
String QMAN_000028_TEST_MODULE_NOT_FOUND = "<QMAN-000028> : Qpid emulator not found. Test notifications are disabled.";
String QMAN_000029_DEFAULT_URI = "<QMAN-000029> : Default URI will be set to %s";
+ String QMAN_000030_RESOURCE_HAS_BEEN_CREATED = "<QMAN-000030> : New resource instance has been created and registered. Resource id is %s";
+ String QMAN_000031_RESOURCE_HAS_BEEN_REMOVED = "<QMAN-200031> : WS-Resource %s has been removed";
// DEBUG
String QMAN_200001_INCOMING_MESSAGE_HAS_BEEN_RECEIVED = "<QMAN-200001> : New incoming message has been received. Message content is %s";
@@ -105,14 +107,15 @@ public interface Messages
String QMAN_200039_DEBUG_JMX_NOTIFICATION = "<QMAN-200039> : %s";
String QMAN_200040_WS_ARTIFACTS_CACHED = "<QMAN-200040> : WS Artifacts has been stored on cache with the following id : %s";
String QMAN_200041_INCOMING_OBJECT_NAME_AND_DERIVED_KEY = "<QMAN-200041> : Incoming object name : %s, derived search key : %s";
-
-
+ String QMAN_200042_REMOVING_RESOURCE = "<QMAN-200042> : WS-Resource %s is going to be removed";
// WARNING
String QMAN_300001_MESSAGE_DISCARDED = "<QMAN-300001> : No handler has been configured for processing messages with \"%s\" as opcode. Message will be discarded.";
String QMAN_300002_UNKNOWN_SEQUENCE_NUMBER = "<QMAN-300002> : Unable to deal with incoming message because it contains a unknown sequence number (%s).";
String QMAN_300003_BROKER_ALREADY_CONNECTED = "<QMAN-300003> : Unable to enlist given broker connection data : QMan is already connected with broker %s";
String QMAN_300004_INVALID_CONFIGURATION_FILE = "<QMAN-300004> : The given configuration file (%s) is not valid (it doesn't exist or cannot be read)";
+
+ String QMAN_300005_QEMU_INITIALIZATION_FAILURE = "<QMAN-300005> : Unable to initialize QEmu module and therefore emulation won't be enabled...";
// ERROR
String QMAN_100001_BAD_MAGIC_NUMBER_FAILURE = "<QMAN-100001> : Message processing failure : incoming message contains a bad magic number (%s) and therefore will be discaded.";
@@ -138,5 +141,13 @@ public interface Messages
String QMAN_100023_BUILD_WS_ARTIFACTS_FAILURE = "<QMAN-100023> : Unable to build WS artifacts.";
String QMAN_100024_CAPABILITY_INSTANTIATION_FAILURE = "<QMAN-100024> : Unable to instantiate generated capability class for %s.";
String QMAN_100025_WSRF_FAILURE = "<QMAN-100025> : Resource manager raised an exception while creating capability for %s.";
- String QMAN_100026_SOAP_ADDRESS_REPLACEMENT_FAILURE = "<QMAN-100026> : Exception occurred while replacing the placeholder soap address with resource actual location.";
+ String QMAN_100026_SOAP_ADDRESS_REPLACEMENT_FAILURE = "<QMAN-100026> : Exception occurred while replacing the placeholder soap address with resource actual location.";
+
+ //// NEW
+ String QMAN_100027_RESOURCE_SHUTDOWN_FAILURE = "<QMAN-100027> : Shutdown failure while destroying resource %s.";
+ String QMAN_100029_MALFORMED_RESOURCE_URI_FAILURE = "<QMAN-100029> : Unable to define URI for QMan resources using \"%s\". It violates RFC 2396";
+ String QMAN_100030_JMX_CORE_STARTUP_FAILURE = "<QMAN-100030> : QMan JMX core Unexpected failure while starting up.";
+ String QMAN_100031_WS_RESOURCE_ALREADY_INITIALIZED = "<QMAN-100032> : Bad request has been received on this WS-Resource : Initialization is not possible because the resource has already been initialized.";
+ String QMAN_100032_WS_RESOURCE_NOT_YET_INITIALIZED = "<QMAN-100032> : Bad request has been received on this WS-Resource : Shutdown is not possible because the resource hasn't yet been initialized.";
+ String QMAN_100033_WS_RESOURCE_ALREADY_SHUTDOWN = "<QMAN-100033> : Bad request has been received on this WS-Resource : Shutdown is not possible because the resource has already been shutdown.";
} \ 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 89d97d9297..da533c6f59 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
@@ -45,7 +45,7 @@ public abstract class Names
public static String PACKAGE = "package";
public static String CLASS = "class";
public static String EVENT = "event";
- public static String OBJECT_ID="objectID";
+ public static String OBJECT_ID="objectId";
public static String BROKER_ID = "brokerID";
public static String DOMAIN_NAME = "Q-MAN";
@@ -61,12 +61,34 @@ public abstract class Names
public static String NOT_AVAILABLE = "N.A.";
+ public static ObjectName QPID_EMULATOR_OBJECT_NAME;
+ static
+ {
+ try
+ {
+ QPID_EMULATOR_OBJECT_NAME = new ObjectName(
+ new StringBuilder()
+ .append(DOMAIN_NAME)
+ .append(':')
+ .append("Name=Qpid,Type=Emulator")
+ .toString());
+ } catch(Exception exception)
+ {
+ throw new ExceptionInInitializerError(exception);
+ }
+ }
+
public static ObjectName QMAN_OBJECT_NAME;
static
{
try
{
- QMAN_OBJECT_NAME = new ObjectName(new StringBuilder().append(DOMAIN_NAME).append(':').append("Type=Service").toString());
+ QMAN_OBJECT_NAME = new ObjectName(
+ new StringBuilder()
+ .append(DOMAIN_NAME)
+ .append(':')
+ .append("Type=Service")
+ .toString());
} catch(Exception exception)
{
throw new ExceptionInInitializerError(exception);
@@ -75,8 +97,13 @@ public abstract class Names
// WSDM Stuff
public static String NAMESPACE_URI = "http://amqp.apache.org/qpid/management/qman";
+ public static String ADDRESSING_URI = "http://amqp.apache.org/qpid/management/qman/addressing";
+ public static String ADDRESSING_PREFIX = "qman-wsa";
+
+ public static final QName RESOURCE_ID_QNAME = new QName(ADDRESSING_URI, "ResourceId", ADDRESSING_PREFIX);
public final static String PREFIX = "qman";
public final static String QMAN_RESOURCE_NAME = "QManWsResource";
+
public final static String VALIDATE_WSRP_PARAM = "validate-wsrp-schema";
public static final String WEB_APP_CLASSES_FOLDER = "/WEB-INF/classes";
diff --git a/qpid/java/management/client/src/main/java/org/apache/qpid/management/jmx/EntityLifecycleNotification.java b/qpid/java/management/client/src/main/java/org/apache/qpid/management/jmx/EntityLifecycleNotification.java
index e387e56e2c..5a99690756 100644
--- a/qpid/java/management/client/src/main/java/org/apache/qpid/management/jmx/EntityLifecycleNotification.java
+++ b/qpid/java/management/client/src/main/java/org/apache/qpid/management/jmx/EntityLifecycleNotification.java
@@ -46,8 +46,8 @@ public class EntityLifecycleNotification extends Notification
public static final String SCHEMA_REQUESTED = "org.apache.qpid.management.lifecycle.entity.schema.requested";
public static final String MALFORMED_SCHEMA = "org.apache.qpid.management.lifecycle.error.schema";
- public static final String INSTANCE_ADDED = "org.apache.qpid.management.lifecycle.entity.instance.created";
- public static final String INSTANCE_REMOVED = "org.apache.qpid.management.lifecycle.entity.instance.removed";
+ public static final String INSTANCE_ADDED = "qman.lifecycle.entity.instance.created";
+ public static final String INSTANCE_REMOVED = "qman.lifecycle.entity.instance.removed";
private String _packageName = Names.NOT_AVAILABLE;
private String _className = Names.NOT_AVAILABLE;
diff --git a/qpid/java/management/client/src/main/java/org/apache/qpid/management/servlet/ConnectQManToBroker.java b/qpid/java/management/client/src/main/java/org/apache/qpid/management/servlet/ConnectQManToBroker.java
index 574e29de81..af037861ba 100644
--- a/qpid/java/management/client/src/main/java/org/apache/qpid/management/servlet/ConnectQManToBroker.java
+++ b/qpid/java/management/client/src/main/java/org/apache/qpid/management/servlet/ConnectQManToBroker.java
@@ -69,6 +69,14 @@ public class ConnectQManToBroker extends MiniServlet
}
}
+ /**
+ * This is a startup module only so an override of the default servlet
+ * behaviour must be done in order to prevent incoming http requests processing.
+ *
+ * @param request the http request.
+ * @param response the http response.
+ * @throws ServletException each time this method is called.
+ */
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException
{
diff --git a/qpid/java/management/client/src/main/java/org/apache/qpid/management/servlet/QManLifeCycleManager.java b/qpid/java/management/client/src/main/java/org/apache/qpid/management/servlet/QManLifeCycleManager.java
index 684221f91e..edd6804e68 100644
--- a/qpid/java/management/client/src/main/java/org/apache/qpid/management/servlet/QManLifeCycleManager.java
+++ b/qpid/java/management/client/src/main/java/org/apache/qpid/management/servlet/QManLifeCycleManager.java
@@ -24,34 +24,24 @@ import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
+import org.apache.qpid.management.Messages;
import org.apache.qpid.management.Names;
import org.apache.qpid.management.domain.services.QMan;
import org.apache.qpid.management.domain.services.StartupFailureException;
+import org.apache.qpid.transport.util.Logger;
/**
- * QMan lifecycle management.
+ * QMan JMX lifecycle manager.
+ * Provides lifecycle management of QMan JMX core including startup and shutdown.
*
* @author Andrea Gazzarini
*/
public class QManLifeCycleManager implements ServletContextListener
{
+ private final static Logger LOGGER = Logger.get(QManLifeCycleManager.class);
+
/**
- * Stops QMan.
- *
- * @param event the application context event.
- */
- public void contextDestroyed(ServletContextEvent event)
- {
- ServletContext context = event.getServletContext();
-
- QMan qman = (QMan) context.getAttribute(Names.APPLICATION_NAME);
- qman.stop();
-
- context.setAttribute(Names.APPLICATION_NAME, qman);
- }
-
- /**
- * Starts QMan.
+ * Starts QMan JMX Core.
*
* @param event the application context event.
*/
@@ -61,12 +51,29 @@ public class QManLifeCycleManager implements ServletContextListener
{
QMan qman = new QMan();
qman.start();
-
- event.getServletContext().setAttribute(Names.APPLICATION_NAME, qman);
+ event.getServletContext().setAttribute(
+ Names.APPLICATION_NAME,
+ qman);
} catch (StartupFailureException exception)
{
- // TODO : LOG ERROR.
- exception.printStackTrace();
+ LOGGER.error(
+ exception,
+ Messages.QMAN_100030_JMX_CORE_STARTUP_FAILURE);
}
}
+
+ /**
+ * Sutdown QMan JMX Core.
+ *
+ * @param event the application context event.
+ */
+ public void contextDestroyed(ServletContextEvent event)
+ {
+ ServletContext context = event.getServletContext();
+
+ QMan qman = (QMan) context.getAttribute(Names.APPLICATION_NAME);
+ qman.stop();
+
+ context.removeAttribute(Names.APPLICATION_NAME);
+ }
} \ No newline at end of file
diff --git a/qpid/java/management/client/src/main/java/org/apache/qpid/management/servlet/WSDMAdapter.java b/qpid/java/management/client/src/main/java/org/apache/qpid/management/servlet/WSDMAdapter.java
index f927ca131c..58f839bb33 100644
--- a/qpid/java/management/client/src/main/java/org/apache/qpid/management/servlet/WSDMAdapter.java
+++ b/qpid/java/management/client/src/main/java/org/apache/qpid/management/servlet/WSDMAdapter.java
@@ -51,9 +51,15 @@ public class WSDMAdapter extends HttpServlet
@Override
public void init() throws ServletException {
- _isolationLayer = new WSDMAdapterIsolationLayer(getServletContext());
+ LOGGER.debug(Messages.QMAN_000026_WSDM_ADAPTER_STARTS);
+
+
+ _isolationLayer = new WSDMAdapterIsolationLayer(getServletContext());
_isolationLayer.initialize();
- }
+
+ LOGGER.debug(Messages.QMAN_000027_WSDM_ADAPTER_STARTED);
+
+ }
/**
* Accepts http requests containing a soap envelope (request) and therefore
@@ -92,23 +98,11 @@ public class WSDMAdapter extends HttpServlet
writer.flush();
XmlDebugger.debug(soapEnvelopeRequest);
- XmlDebugger.debug(soapEnvelopeResposeAsString);
- }
- }
-
- /**
- * Stops QMan Adapter.
- */
- public void destroy()
- {
- try
- {
- _isolationLayer.shutdown();
- } catch (Exception exception)
- {
- LOGGER.error(
- exception,
- Messages.QMAN_100022_ISOLATION_LAYER_SHUTDOWN_FAILURE);
+ try {
+ XmlDebugger.debug(soapEnvelopeResposeAsString);
+ } catch(Exception exception) {
+ System.out.println("Unable to parse response.");
+ }
}
}
} \ No newline at end of file
diff --git a/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/MBeanCapability.java b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/MBeanCapability.java
index aec022d093..76edf878a0 100644
--- a/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/MBeanCapability.java
+++ b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/MBeanCapability.java
@@ -160,13 +160,12 @@ public abstract class MBeanCapability extends AbstractWsResourceCapability
*
* @param name
* @param value
- * TODO TODO TODO!!! Vedi che poi fà co 'sto metodo che è un pò una monnezza!!!
+ * TODO : Vedi che poi fà co 'sto metodo che è un pò una monnezza!!!
* @return The XML representation of the resource property value(s).
*
*/
@SuppressWarnings("unchecked")
- protected Element[] getPropertyElements(QName name, Object value)
- throws BaseFault {
+ protected Element[] getPropertyElements(QName name, Object value) throws BaseFault {
//
// in this case, we have to determine if there IS a property
// and it's null, or there is no property
@@ -226,19 +225,20 @@ public abstract class MBeanCapability extends AbstractWsResourceCapability
Serializer ser = registry.getSerializer(type);
for (int n = 0; n < length; ++n)
+ {
properties[n] = serializeValue(ser, Array.get(valuesArray, n), name);
-
+ }
return properties;
}
private Element serializeValue(Serializer ser, Object value, QName name) throws BaseFault
{
- try {
+ try
+ {
return ser.toXML(value, name);
- }
-
- catch (SoapFault error) {
- throw WsbfUtils.convertToFault(error);
+ } catch (SoapFault exception)
+ {
+ throw WsbfUtils.convertToFault(exception);
}
}
} \ No newline at end of file
diff --git a/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/MBeanCapabilityBuilder.java b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/MBeanCapabilityBuilder.java
index 3c7c2a2a42..df2a963d50 100644
--- a/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/MBeanCapabilityBuilder.java
+++ b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/MBeanCapabilityBuilder.java
@@ -101,7 +101,6 @@ public class MBeanCapabilityBuilder implements IArtifactBuilder{
}
} catch(Exception exception)
{
- System.err.println(buffer);
throw new BuilderException(exception);
}
}
@@ -133,7 +132,7 @@ public class MBeanCapabilityBuilder implements IArtifactBuilder{
public void onOperation(MBeanOperationInfo operation)
{
- // TODO
+ // TODO : operation on mbean capability
}
public Class<MBeanCapability> getCapabilityClass()
@@ -157,7 +156,6 @@ public class MBeanCapabilityBuilder implements IArtifactBuilder{
_capabilityClassDefinition.addMethod(getPropertyNames);
} catch(Exception exception)
{
- System.err.println(_properties);
throw new BuilderException(exception);
}
}
@@ -167,7 +165,10 @@ public class MBeanCapabilityBuilder implements IArtifactBuilder{
{
try
{
- _capabilityClass = _capabilityClassDefinition.toClass();
+ // Class loader and protection domain are needed for Qpid emulation.
+ _capabilityClass = _capabilityClassDefinition.toClass(
+ QManAdapterCapability.class.getClassLoader(),
+ QManAdapterCapability.class.getProtectionDomain());
} catch (Exception exception)
{
throw new BuilderException(exception);
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 5c0afa4597..7d111b8031 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
@@ -21,11 +21,12 @@
package org.apache.qpid.management.wsdm.capabilities;
import java.lang.management.ManagementFactory;
+import java.net.URI;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanServer;
import javax.management.Notification;
-import javax.management.NotificationFilterSupport;
+import javax.management.NotificationFilter;
import javax.management.NotificationListener;
import javax.management.ObjectName;
@@ -33,35 +34,51 @@ import org.apache.muse.core.AbstractCapability;
import org.apache.muse.core.Resource;
import org.apache.muse.core.ResourceManager;
import org.apache.muse.core.serializer.SerializerRegistry;
+import org.apache.muse.ws.addressing.EndpointReference;
import org.apache.muse.ws.addressing.soap.SoapFault;
import org.apache.qpid.management.Messages;
import org.apache.qpid.management.Names;
import org.apache.qpid.management.jmx.EntityLifecycleNotification;
import org.apache.qpid.management.wsdm.common.ThreadSessionManager;
+import org.apache.qpid.management.wsdm.muse.engine.WSDMAdapterEnvironment;
import org.apache.qpid.management.wsdm.muse.serializer.ByteArraySerializer;
import org.apache.qpid.transport.util.Logger;
/**
- * MBean Server capabilty interface implementor.
- * Providers all the operations of the MBeanServer interface using the platform MBeanServer.
+ * QMan Adapter capability.
+ * Basically it acts as a lifecycle manager of all ws resource that correspond to entities on JMX side.
+ *
+ * @author Andrea Gazzarini
*/
public class QManAdapterCapability extends AbstractCapability
{
- private MBeanServer _mxServer;
private final static Logger LOGGER = Logger.get(QManAdapterCapability.class);
-
+
+ private MBeanServer _mxServer;
private WsArtifactsFactory _artifactsFactory;
+ private URI _resourceURI;
+ /**
+ * This listener handles "create" mbean events and therefore provides procedure to create and initialize
+ * corresponding ws resources.
+ */
private final NotificationListener listenerForNewInstances = new NotificationListener()
{
+ /**
+ * Handles JMX "create" notification type.
+ *
+ * @param notification the entity lifecycle notification.
+ * @param data user data associated with the incoming notifiication : it is not used at the moment.
+ */
public void handleNotification(Notification notification, Object data)
{
- EntityLifecycleNotification lifecycleNotification = (EntityLifecycleNotification) notification;
- ObjectName eventSourceName = lifecycleNotification.getObjectName();
- ThreadSessionManager.getInstance().getSession().setObjectName(eventSourceName);
-
+ ObjectName eventSourceName = null;
try
- {
+ {
+ EntityLifecycleNotification lifecycleNotification = (EntityLifecycleNotification) notification;
+ eventSourceName = lifecycleNotification.getObjectName();
+ ThreadSessionManager.getInstance().getSession().setObjectName(eventSourceName);
+
LOGGER.debug(Messages.QMAN_200039_DEBUG_JMX_NOTIFICATION, notification);
ResourceManager resourceManager = getResource().getResourceManager();
@@ -72,42 +89,91 @@ public class QManAdapterCapability extends AbstractCapability
artifacts.getCapabilityClass(),
eventSourceName);
-
ThreadSessionManager.getInstance().getSession().setWsdlDocument(artifacts.getWsdl());
ThreadSessionManager.getInstance().getSession().setResourceMetadataDescriptor(artifacts.getResourceMetadataDescriptor());
-// ResourceManager resourceManager = getResource().getResourceManager();
-//
-// Resource resource = resourceManager.createResource(Names.QMAN_RESOURCE_NAME);
-// resource.setWsdlPortType(Names.QMAN_RESOURCE_PORT_TYPE_NAME);
+ resource.setWsdlPortType(Names.QMAN_RESOURCE_PORT_TYPE_NAME);
+ capability.setCapabilityURI(Names.NAMESPACE_URI+"/"+capability.getClass().getSimpleName());
resource.addCapability(capability);
resource.initialize();
resourceManager.addResource(resource.getEndpointReference(), resource);
+
+ LOGGER.info(
+ Messages.QMAN_000030_RESOURCE_HAS_BEEN_CREATED,
+ eventSourceName);
} catch (ArtifactsNotAvailableException exception)
{
- LOGGER.error(exception,Messages.QMAN_100023_BUILD_WS_ARTIFACTS_FAILURE);
+ LOGGER.error(
+ exception,
+ Messages.QMAN_100023_BUILD_WS_ARTIFACTS_FAILURE);
} catch (IllegalAccessException exception)
{
- LOGGER.error(exception,Messages.QMAN_100024_CAPABILITY_INSTANTIATION_FAILURE,eventSourceName);
+ LOGGER.error(
+ exception,
+ Messages.QMAN_100024_CAPABILITY_INSTANTIATION_FAILURE,
+ eventSourceName);
} catch (InstantiationException exception)
{
- LOGGER.error(exception,Messages.QMAN_100024_CAPABILITY_INSTANTIATION_FAILURE,eventSourceName);
+ LOGGER.error(
+ exception,
+ Messages.QMAN_100024_CAPABILITY_INSTANTIATION_FAILURE,
+ eventSourceName);
} catch (SoapFault exception)
{
- LOGGER.error(exception,Messages.QMAN_100025_WSRF_FAILURE,eventSourceName);
+ LOGGER.error(
+ exception,Messages.QMAN_100025_WSRF_FAILURE,
+ eventSourceName);
} catch (Exception exception)
{
- LOGGER.error(exception,Messages.QMAN_100025_WSRF_FAILURE,eventSourceName);
+ LOGGER.error(
+ exception,
+ Messages.QMAN_100025_WSRF_FAILURE,
+ eventSourceName);
}
-
}
};
+ /**
+ * This listener handles "remove" mbean events and therefore provides procedure to shutdown and remove
+ * corresponding ws resources.
+ */
private final NotificationListener listenerForRemovedInstances = new NotificationListener()
{
+ /**
+ * Handles JMX "remove" notification type.
+ *
+ * @param notification the entity lifecycle notification.
+ * @param data user data associated with the incoming notifiication : it is not used at the moment.
+ */
public void handleNotification(Notification notification, Object data)
{
- LOGGER.warn("TBD : Notification Listener for removed instances has not yet implemeted!");
+ EntityLifecycleNotification lifecycleNotification = (EntityLifecycleNotification) notification;
+ ObjectName eventSourceName = lifecycleNotification.getObjectName();
+
+ LOGGER.debug(Messages.QMAN_200042_REMOVING_RESOURCE, eventSourceName);
+
+ EndpointReference endpointPointReference = new EndpointReference(_resourceURI);
+ endpointPointReference.addParameter(
+ Names.RESOURCE_ID_QNAME,
+ eventSourceName.getCanonicalName());
+
+ ResourceManager resourceManager = getResource().getResourceManager();
+ try
+ {
+ Resource resource = resourceManager.getResource(endpointPointReference);
+ resource.shutdown();
+
+ LOGGER.info(
+ Messages.QMAN_000031_RESOURCE_HAS_BEEN_REMOVED,
+ eventSourceName);
+ }
+ catch(Exception exception)
+ {
+ LOGGER.error(
+ exception,
+ Messages.QMAN_100027_RESOURCE_SHUTDOWN_FAILURE,
+ eventSourceName);
+ }
}
};
@@ -120,24 +186,71 @@ public class QManAdapterCapability extends AbstractCapability
// What is the stringified name of the class? byte[].getClass().getName() is [B but is not working (ClassNotFound).
// So, at the end, this is hard-coded here!
SerializerRegistry.getInstance().registerSerializer(byte[].class, new ByteArraySerializer());
-
+ WSDMAdapterEnvironment environment = (WSDMAdapterEnvironment) getEnvironment();
+ String resourceURI = environment.getDefaultURIPrefix()+Names.QMAN_RESOURCE_NAME;
try
{
+ _resourceURI = URI.create(resourceURI);
+
_mxServer = ManagementFactory.getPlatformMBeanServer();
_artifactsFactory = new WsArtifactsFactory(getEnvironment(),_mxServer);
- NotificationFilterSupport filterForNewInstances = new NotificationFilterSupport();
- filterForNewInstances.enableType(EntityLifecycleNotification.INSTANCE_ADDED);
+ /**
+ * NotificationFilter for "create" only events.
+ */
+ NotificationFilter filterForNewInstances = new NotificationFilter(){
+
+ private static final long serialVersionUID = 1733325390964454595L;
+
+ public boolean isNotificationEnabled(Notification notification)
+ {
+ return EntityLifecycleNotification.INSTANCE_ADDED.equals(notification.getType());
+ }
+
+ };
+
+ /**
+ * NotificationFilter for "remove" only events.
+ */
+ NotificationFilter filterForRemovedInstances = new NotificationFilter(){
+
+ private static final long serialVersionUID = 1733325390964454595L;
+
+ public boolean isNotificationEnabled(Notification notification)
+ {
+ return EntityLifecycleNotification.INSTANCE_REMOVED.equals(notification.getType());
+ }
+
+ };
- NotificationFilterSupport filterForRemovedInstances = new NotificationFilterSupport();
- filterForNewInstances.enableType(EntityLifecycleNotification.INSTANCE_REMOVED);
+ _mxServer.addNotificationListener(
+ Names.QMAN_OBJECT_NAME,
+ listenerForNewInstances,
+ filterForNewInstances,
+ null);
- _mxServer.addNotificationListener(Names.QMAN_OBJECT_NAME, listenerForNewInstances, filterForNewInstances, null);
- _mxServer.addNotificationListener(Names.QMAN_OBJECT_NAME, listenerForRemovedInstances, filterForRemovedInstances, null);
+ _mxServer.addNotificationListener(
+ Names.QMAN_OBJECT_NAME,
+ listenerForRemovedInstances,
+ filterForRemovedInstances,
+ null);
try {
- _mxServer.addNotificationListener(new ObjectName("A:A=1"), listenerForNewInstances, filterForNewInstances, null);
- } catch (Exception exception) {
+ _mxServer.addNotificationListener(
+ Names.QPID_EMULATOR_OBJECT_NAME,
+ listenerForNewInstances,
+ filterForNewInstances, null);
+
+ _mxServer.addNotificationListener(
+ Names.QPID_EMULATOR_OBJECT_NAME,
+ listenerForRemovedInstances,
+ filterForRemovedInstances, null);
+
+ } catch(IllegalArgumentException exception)
+ {
+ LOGGER.info(exception,Messages.QMAN_000029_DEFAULT_URI,resourceURI);
+ }
+ catch (Exception exception) {
LOGGER.info(Messages.QMAN_000028_TEST_MODULE_NOT_FOUND);
}
diff --git a/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/WsdlBuilder.java b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/WsdlBuilder.java
index 194253bf25..85b5198493 100644
--- a/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/WsdlBuilder.java
+++ b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/capabilities/WsdlBuilder.java
@@ -155,17 +155,17 @@ class WsdlBuilder implements IArtifactBuilder {
public void onOperation(MBeanOperationInfo operation)
{
- // TODO
+ // TODO : Operations on wsdl
}
public void endAttributes()
{
- // TODO
+ // N.A.
}
public void endOperations()
{
- // TODO
+ // N.A.
}
public Document getWsdl()
@@ -184,9 +184,10 @@ class WsdlBuilder implements IArtifactBuilder {
_document = WsdlUtils.createWSDL(_environment, wsdlPath, true);
try
{
- Attr location = (Attr) XPathAPI.selectSingleNode(_document, "/wsdl:definitions/wsdl:service/wsdl:port/wsdl-soap:address/@location");
+ Attr location = (Attr) XPathAPI.selectSingleNode(
+ _document,
+ "/wsdl:definitions/wsdl:service/wsdl:port/wsdl-soap:address/@location");
- // TODO : come faccio a recuperare l'URL sul quale gira l'applicazione?
StringBuilder builder = new StringBuilder("http://")
.append(InetAddress.getLocalHost().getHostName())
.append(':')
@@ -198,7 +199,9 @@ class WsdlBuilder implements IArtifactBuilder {
location.setValue(builder.toString());
} catch(Exception exception)
{
- LOGGER.error(exception,Messages.QMAN_100026_SOAP_ADDRESS_REPLACEMENT_FAILURE);
+ LOGGER.error(
+ exception,
+ Messages.QMAN_100026_SOAP_ADDRESS_REPLACEMENT_FAILURE);
}
}
}
diff --git a/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/common/ObjectNameIdFactory.java b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/common/ObjectNameIdFactory.java
index be3bbb48d1..83c1209e42 100644
--- a/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/common/ObjectNameIdFactory.java
+++ b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/common/ObjectNameIdFactory.java
@@ -23,19 +23,26 @@ package org.apache.qpid.management.wsdm.common;
import javax.xml.namespace.QName;
import org.apache.muse.core.routing.ResourceIdFactory;
-import org.apache.muse.ws.addressing.WsaConstants;
+import org.apache.qpid.management.Names;
/**
* ResourceIdFactory implementation that is using an objectName as
* resource identifier.
+ * This is done in order to make a relationship between an MBean (which is part of the
+ * JMX core domain model) and a WS-Resource (the same entity as is represented on WS-DM adapter side).
*
* @author Andrea Gazzarini
*/
public class ObjectNameIdFactory implements ResourceIdFactory
{
+ /**
+ * Returns the name of the identifier element.
+ *
+ * @return the name of the identifier element.
+ */
public QName getIdentifierName()
{
- return WsaConstants.DEFAULT_RESOURCE_ID_QNAME;
+ return Names.RESOURCE_ID_QNAME;
}
/**
diff --git a/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/engine/WSDMAdapterEnvironment.java b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/engine/WSDMAdapterEnvironment.java
index 0c70af437e..438c1d9db9 100644
--- a/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/engine/WSDMAdapterEnvironment.java
+++ b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/engine/WSDMAdapterEnvironment.java
@@ -23,7 +23,8 @@ public class WSDMAdapterEnvironment extends AbstractEnvironment
{
private final static Logger LOGGER = Logger.get(WSDMAdapterEnvironment.class);
private final File _realDirectory;
-
+ private final ServletContext _servletContext;
+
/**
* Builds a new qman environment with the given application context.
*
@@ -31,32 +32,17 @@ public class WSDMAdapterEnvironment extends AbstractEnvironment
*/
public WSDMAdapterEnvironment(ServletContext servletContext)
{
- String realDirectoryPath = servletContext.getRealPath(Names.WEB_APP_CLASSES_FOLDER);
+ this._servletContext = servletContext;
+ String realDirectoryPath = servletContext.getRealPath(Names.WEB_APP_CLASSES_FOLDER);
_realDirectory = (realDirectoryPath != null)
? new File(realDirectoryPath)
: FileUtils.CURRENT_DIR;
-
- String host = null;
-
- try {
- host = InetAddress.getLocalHost().getHostName();
- } catch (UnknownHostException e) {
- host = "localhost";
- }
- String defaultURI = new StringBuilder()
- .append("http://")
- .append(host)
- .append(":")
- .append(System.getProperty(Names.ADAPTER_PORT))
- .append(servletContext.getContextPath())
- .append("/services/adapter")
- .toString();
+ String defaultURI = getDefaultURIPrefix()+"adapter";
+ setDefaultURI(defaultURI);
LOGGER.info(Messages.QMAN_000029_DEFAULT_URI, defaultURI);
-
- setDefaultURI(defaultURI);
}
/**
@@ -78,4 +64,23 @@ public class WSDMAdapterEnvironment extends AbstractEnvironment
{
return _realDirectory;
}
+
+ public String getDefaultURIPrefix()
+ {
+ String host = null;
+ try {
+ host = InetAddress.getLocalHost().getHostName();
+ } catch (UnknownHostException e) {
+ host = "localhost";
+ }
+
+ return new StringBuilder()
+ .append("http://")
+ .append(host)
+ .append(":")
+ .append(System.getProperty(Names.ADAPTER_PORT))
+ .append(_servletContext.getContextPath())
+ .append("/services/")
+ .toString();
+ }
} \ No newline at end of file
diff --git a/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/resources/QManWsResource.java b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/resources/QManWsResource.java
index 50b1c7cd33..c65d716fb5 100644
--- a/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/resources/QManWsResource.java
+++ b/qpid/java/management/client/src/main/java/org/apache/qpid/management/wsdm/muse/resources/QManWsResource.java
@@ -52,7 +52,6 @@ import org.apache.muse.ws.resource.properties.schema.ResourcePropertiesSchema;
import org.apache.muse.ws.resource.properties.schema.impl.SimpleResourcePropertiesSchema;
import org.apache.muse.ws.wsdl.WsdlUtils;
import org.apache.qpid.management.Messages;
-import org.apache.qpid.management.Names;
import org.apache.qpid.management.wsdm.common.ThreadSessionManager;
import org.apache.qpid.transport.util.Logger;
import org.w3c.dom.Document;
@@ -60,26 +59,215 @@ import org.w3c.dom.Element;
/**
* QMan WS resource.
- * This is the WS Resource wrapper of a QMan managed entity.
+ * We could say that this is a QMan manageable entity under the
+ * WS-DM perspective.
*
* @author Andrea Gazzarini
- * TODO :Refactoring :: use STATE Pattern!
*/
@SuppressWarnings("unchecked")
public class QManWsResource implements WsResource
{
private final static Logger LOGGER = Logger.get(QManWsResource.class);
+
+ /**
+ * Internal state of this resource.
+ *
+ * @author Andrea Gazzarini
+ */
+ interface State
+ {
+ /**
+ * Provides initialization of this resource.
+ *
+ * @throws SoapFault when the initialization fails.
+ */
+ void initialize() throws SoapFault;
+
+ /**
+ * Returns true if this resource has been initialized.
+ *
+ * @return true if this resource has been initialized.
+ */
+ boolean hasBeenInitialized();
+
+ /**
+ * Returns true if this resource has been shutdown.
+ *
+ * @return true if this resource has been shutdown.
+ */
+ boolean hasBeenShutdown();
+
+ /**
+ * Shuts down this resource.
+ *
+ * @throws SoapFault when the shutdown procedure fails.
+ */
+ void shutdown() throws SoapFault;
+ }
- // Utility class for logging.
- private final static class Log {
- static void debugElement(String message,Element element)
+ private final State _hasBeenShutdown = new State()
+ {
+ /**
+ * Return false because this resource has been shutdown so therefore
+ * initialization occurred.
+ *
+ * @return true;
+ */
+ public boolean hasBeenInitialized()
{
- if (LOGGER.isDebugEnabled())
- {
- LOGGER.debug(message, XmlUtils.toString(element));
- }
+ return true;
}
- }
+
+ /**
+ * Returns true because this state indicates that resource has been shutdown.
+ *
+ * @return true.
+ */
+ public boolean hasBeenShutdown()
+ {
+ return true;
+ }
+
+ /**
+ * Since this resource has been shutdown the initialization
+ * cannot be performed again.
+ * As conseguence of that this method throws an exception.
+ *
+ * @throws SoapFault each time this method is called.
+ */
+ public void initialize() throws SoapFault
+ {
+ LOGGER.error(Messages.QMAN_100031_WS_RESOURCE_ALREADY_INITIALIZED);
+ throw new SoapFault(Messages.QMAN_100031_WS_RESOURCE_ALREADY_INITIALIZED);
+ }
+
+ public void shutdown() throws SoapFault
+ {
+ LOGGER.error(Messages.QMAN_100033_WS_RESOURCE_ALREADY_SHUTDOWN);
+ throw new SoapFault(Messages.QMAN_100033_WS_RESOURCE_ALREADY_SHUTDOWN);
+ }
+ };
+
+ private final State _hasBeenInitialized = new State()
+ {
+ /**
+ * Returns true because this is the state where a resource is when it
+ * has been initialized.
+ *
+ * @return true.
+ */
+ public boolean hasBeenInitialized()
+ {
+ return true;
+ }
+
+ /**
+ * Returns false because this resource has been initialized but no shutdown request
+ * has been received.
+ *
+ * @return false.
+ */
+ public boolean hasBeenShutdown()
+ {
+ return false;
+ }
+
+ /**
+ * A resource in this state cannot be initialized again so if this method is called an
+ * exception is thrown.
+ *
+ * @throws SoapFault each time this method is called.
+ */
+ public void initialize() throws SoapFault
+ {
+ LOGGER.error(Messages.QMAN_100031_WS_RESOURCE_ALREADY_INITIALIZED);
+ throw new SoapFault(Messages.QMAN_100031_WS_RESOURCE_ALREADY_INITIALIZED);
+ }
+
+ /**
+ * Shuts down this resource.
+ *
+ * @throws SoapFault when the shutdown procedure fails.
+ */
+ public void shutdown() throws SoapFault
+ {
+ shutdownCapabilities();
+
+ ResourceManager manager = getResourceManager();
+
+ if (manager.getResource(_enpointReference) != null)
+ {
+ manager.removeResource(_enpointReference);
+ }
+
+ _currentState = _hasBeenShutdown;
+ }
+ };
+
+ /**
+ * The initial state of this resource.
+ * As the name suggests, it is not yet initialized.
+ */
+ private final State _notYetInitialized = new State()
+ {
+ /**
+ * Provides initialization of this resource.
+ *
+ * @throws SoapFault when the initialization fails.
+ */
+ public void initialize() throws SoapFault
+ {
+ _properties = new SimpleResourcePropertyCollection();
+ _wsdl = ThreadSessionManager.getInstance().getSession().getWsdlDocument();
+
+ ResourcePropertiesSchema schema = createPropertiesSchema(_wsdl);
+ _properties.setSchema(schema);
+
+ MetadataDescriptor metadata = createMetadataDescriptor(_wsdl);
+ _properties.setMetadata(metadata);
+
+ initializeCapabilities();
+
+ _properties.applyMetadata();
+ _properties.validateMetadata();
+
+ // Resource intialization completed : Let's make a state change.
+ _currentState = _hasBeenInitialized;
+ }
+
+ /**
+ * Shuts down this resource.
+ *
+ * @throws SoapFault when the shutdown procedure fails. */
+ public void shutdown() throws SoapFault
+ {
+ LOGGER.error(Messages.QMAN_100032_WS_RESOURCE_NOT_YET_INITIALIZED);
+ throw new SoapFault(Messages.QMAN_100032_WS_RESOURCE_NOT_YET_INITIALIZED);
+ }
+
+ /**
+ * Returns false because this state indicates that
+ * the resource has not yet been initialized.
+ *
+ * @return false;
+ */
+ public boolean hasBeenInitialized()
+ {
+ return false;
+ }
+
+ /**
+ * Returns false because the resource, when is in this state
+ * hasn't been initialized and as conseguence of that hasn't
+ * been shutdonm.
+ *
+ * @return false;
+ */
+ public boolean hasBeenShutdown()
+ {
+ return false;
+ }
+ };
private Map<String,Capability> _capabilitiesByAction = new HashMap<String, Capability>();
private Map<String, Capability> _capabilitiesByURI = new LinkedHashMap<String, Capability>();
@@ -88,14 +276,15 @@ public class QManWsResource implements WsResource
private Environment _environment;
private EndpointReference _enpointReference;
- private boolean _hasBeenInitialized;
- private boolean _hasBeenShutdown;
+ private State _currentState = _notYetInitialized;
private ResourceManager _resourceManager;
private ResourcePropertyCollection _properties;
private Map<String,String> _initParameters = Collections.EMPTY_MAP;
+ // Workaround : muse is using and hardcoded java.util.logging.Logger but we should use
+ // SLF4j so this is the original implementatation that won't never be used (on QMan classes)
private java.util.logging.Logger _logger;
private Document _wsdl;
@@ -116,7 +305,10 @@ public class QManWsResource implements WsResource
String uri = capability.getCapabilityURI();
_capabilitiesByURI.put(uri, capability);
- LOGGER.debug(Messages.QMAN_200033_CAPABILITY_CLASS_HAS_BEEN_ADDED, capability.getClass(),uri);
+ LOGGER.debug(
+ Messages.QMAN_200033_CAPABILITY_CLASS_HAS_BEEN_ADDED,
+ capability.getClass(),
+ uri);
}
/**
@@ -124,31 +316,20 @@ public class QManWsResource implements WsResource
*
* @return the capability associated with the given URI.
*/
- public final Capability getCapability(String capabilityURI)
+ public Capability getCapability(String capabilityURI)
{
return _capabilitiesByURI.get(capabilityURI);
}
- /**
- * Returns all the WS-Action URIs supported by this resource.
- *
- * @return all of the WS-A Action URIs supported by this resource.
- */
- protected Collection getCapabilityActions()
- {
- return Collections.unmodifiableSet(_capabilitiesByAction.keySet());
- }
-
- /**
- * Returns the capability associated with the given action.
- *
- * @param action the wsa:action of the requested capability.
- * @return the capability associated with the given action.
- */
- protected Capability getCapabilityForAction(String action)
- {
- return (Capability)_capabilitiesByAction.get(action);
- }
+// /**
+// * Returns all the WS-Action URIs supported by this resource.
+// *
+// * @return all of the WS-A Action URIs supported by this resource.
+// */
+// protected Collection getCapabilityActions()
+// {
+// return Collections.unmodifiableSet(_capabilitiesByAction.keySet());
+// }
/**
* Returns a collection with all registered capability URIs.
@@ -258,7 +439,7 @@ public class QManWsResource implements WsResource
*/
public final boolean hasBeenInitialized()
{
- return _hasBeenInitialized;
+ return _currentState.hasBeenInitialized();
}
/**
@@ -268,7 +449,7 @@ public class QManWsResource implements WsResource
*/
public final boolean hasBeenShutdown()
{
- return _hasBeenShutdown;
+ return _currentState.hasBeenShutdown();
}
/**
@@ -282,62 +463,6 @@ public class QManWsResource implements WsResource
}
/**
- * Creates a metadata descriptor for this resource.
- *
- * @param wsdl the WSDL document.
- * @return a metadata descriptor for this resource.
- * @throws SoapFault when it's not possible build the descriptor.
- */
- protected MetadataDescriptor createMetadataDescriptor(Document wsdl) throws SoapFault
- {
- try
- {
- Element portTypeXML = WsdlUtils.getPortType(wsdl, getWsdlPortType());
-
- String rmdName = XmlUtils.getAttribute(portTypeXML, WsrmdConstants.DESCRIPTOR_ATTR_QNAME);
- String rmdPath = XmlUtils.getAttribute(portTypeXML, WsrmdConstants.DESCRIPTOR_LOCATION_ATTR_QNAME);
-
- LOGGER.debug(Messages.QMAN_200034_RMD_NAME, rmdName);
- LOGGER.debug(Messages.QMAN_200035_RMD_PATH, rmdPath);
-
- Environment env = getEnvironment();
- String path = env.createRelativePath(getWsdlPath(), rmdPath);
- Document rmdDoc = env.getDocument(path);
-
- Element[] additionalProperties = ThreadSessionManager.getInstance().getSession().getResourceMetadataDescriptor();
- Element metadataDescriptor = WsrmdUtils.getMetadataDescriptor(rmdDoc, rmdName);
-
- for (Element element : additionalProperties)
- {
- rmdDoc.adoptNode(element);
- metadataDescriptor.appendChild(element);
-
- Log.debugElement(Messages.QMAN_200036_ADDITIONAL_RMD_PROPERTY,element);
- }
-
- return new SimpleMetadataDescriptor(metadataDescriptor);
- }
- catch(Exception exception)
- {
- LOGGER.error(exception,Messages.QMAN_100021_RMD_BUID_FAILURE,getContextPath());
- throw new SoapFault(exception);
- }
- }
-
- /**
- * Creates a WSRP document representing schema properties for this resource.
- *
- * @param wsdl the DOM document holding the resource's WSDL.
- * @return the WSRP document schema.
- */
- protected ResourcePropertiesSchema createPropertiesSchema(Document wsdl)
- {
- QName wsrpName = WsrpUtils.getPropertiesName(wsdl, getWsdlPortType());
- Element wsrpDoc = WsdlUtils.getElementDeclaration(wsdl, wsrpName);
- return new SimpleResourcePropertiesSchema(wsrpName, wsrpDoc);
- }
-
- /**
* Returns the collection containing all properties of this resource.
*
* @return the collection containing all properties of this resource.
@@ -359,55 +484,16 @@ public class QManWsResource implements WsResource
/**
* Initializes this resources.
+ * Note that the what needs to be done depends on the current state of this
+ * resource.
*
* @throws SoapFault when the initialization fails.
*/
public void initialize() throws SoapFault
{
- _properties = new SimpleResourcePropertyCollection();
- _wsdl = ThreadSessionManager.getInstance().getSession().getWsdlDocument();
-
- ResourcePropertiesSchema schema = createPropertiesSchema(_wsdl);
- _properties.setSchema(schema);
-
- MetadataDescriptor metadata = createMetadataDescriptor(_wsdl);
- _properties.setMetadata(metadata);
-
- initializeCapabilities();
-
- _hasBeenInitialized = true;
-
- _properties.applyMetadata();
-
- if (Boolean.parseBoolean(getInitializationParameter(Names.VALIDATE_WSRP_PARAM)))
- {
- _properties.validateSchema();
- }
-
- _properties.validateMetadata();
+ _currentState.initialize();
}
-
- /**
- * Initializes capabilities of this resource.
- *
- * @throws SoapFault when at least one capability fails to initialize.
- */
- public void initializeCapabilities() throws SoapFault
- {
- for (Entry<String, Capability> entry : _capabilitiesByURI.entrySet())
- {
- Capability capability = entry.getValue();
- capability.initialize();
-
- for (Object action : capability.getActions())
- {
- _capabilitiesByAction.put((String)action, capability);
- }
-
- capability.initializeCompleted();
- }
- }
-
+
/**
* Invokes the action specified in the given soap request on this resource.
*
@@ -422,7 +508,10 @@ public class QManWsResource implements WsResource
// Sanity check : is there a capability for the given action?
if (capability == null)
{
- SoapFault wsaFault = new SoapFault(String.format(Messages.ACTION_NOT_SUPPORTED, action,getContextPath()));
+ SoapFault wsaFault = new SoapFault(
+ String.format(
+ Messages.ACTION_NOT_SUPPORTED,
+ action,getContextPath()));
wsaFault.setCode(SoapConstants.SENDER_QNAME);
wsaFault.setSubCode(WsaConstants.ACTION_NOT_SUPPORTED_FAULT_QNAME);
@@ -431,7 +520,10 @@ public class QManWsResource implements WsResource
XmlUtils.setElement(detail, WsaConstants.ACTION_QNAME, action);
wsaFault.setDetail(detail);
- LOGGER.error(Messages.QMAN_100020_ACTION_NOT_SUPPORTED, action,getContextPath());
+ LOGGER.error(
+ Messages.QMAN_100020_ACTION_NOT_SUPPORTED,
+ action,
+ getContextPath());
return wsaFault.toXML();
}
@@ -545,23 +637,39 @@ public class QManWsResource implements WsResource
*/
public synchronized void shutdown() throws SoapFault
{
- if (hasBeenShutdown())
- throw new SoapFault(("ResourceAlreadyDestroyed"));
-
- if (!hasBeenInitialized())
- throw new SoapFault(("ResourceNotInitialized"));
-
- _hasBeenShutdown = true;
+ _currentState.shutdown();
+ }
- shutdownCapabilities();
-
- ResourceManager manager = getResourceManager();
-
- //
- // remove resource visibility
- //
- if (manager.getResource(_enpointReference) != null)
- manager.removeResource(_enpointReference);
+ /**
+ * Returns a string representation of this resource.
+ * Basically the resource endpoint reference (as a string) is returned.
+ *
+ * @return the resource endpoint reference (as a string) is returned.
+ */
+ public String toString()
+ {
+ return getEndpointReference().toString();
+ }
+
+ /**
+ * Initializes capabilities of this resource.
+ *
+ * @throws SoapFault when at least one capability fails to initialize.
+ */
+ private void initializeCapabilities() throws SoapFault
+ {
+ for (Entry<String, Capability> entry : _capabilitiesByURI.entrySet())
+ {
+ Capability capability = entry.getValue();
+ capability.initialize();
+
+ for (Object action : capability.getActions())
+ {
+ _capabilitiesByAction.put((String)action, capability);
+ }
+
+ capability.initializeCompleted();
+ }
}
/**
@@ -569,7 +677,7 @@ public class QManWsResource implements WsResource
*
* @throws SoapFault when at least one capability shutdown fails.
*/
- protected void shutdownCapabilities() throws SoapFault
+ private void shutdownCapabilities() throws SoapFault
{
for (Entry<String,Capability> entry : _capabilitiesByURI.entrySet())
{
@@ -577,16 +685,80 @@ public class QManWsResource implements WsResource
capabilty.prepareShutdown();
capabilty.shutdown();
}
- }
+ }
/**
- * Returns a string representation of this resource.
- * Basically the resource endpoint reference (as a string) is returned.
+ * Creates a metadata descriptor for this resource.
*
- * @return the resource endpoint reference (as a string) is returned.
+ * @param wsdl the WSDL document.
+ * @return a metadata descriptor for this resource.
+ * @throws SoapFault when it's not possible build the descriptor.
*/
- public String toString()
+ private MetadataDescriptor createMetadataDescriptor(Document wsdl) throws SoapFault
{
- return getEndpointReference().toString();
- }
+ try
+ {
+ Element portTypeXML = WsdlUtils.getPortType(wsdl, getWsdlPortType());
+
+ String rmdName = XmlUtils.getAttribute(
+ portTypeXML,
+ WsrmdConstants.DESCRIPTOR_ATTR_QNAME);
+
+ String rmdPath = XmlUtils.getAttribute(
+ portTypeXML,
+ WsrmdConstants.DESCRIPTOR_LOCATION_ATTR_QNAME);
+
+ LOGGER.debug(Messages.QMAN_200034_RMD_NAME, rmdName);
+ LOGGER.debug(Messages.QMAN_200035_RMD_PATH, rmdPath);
+
+ Environment env = getEnvironment();
+ String path = env.createRelativePath(getWsdlPath(), rmdPath);
+ Document rmdDoc = env.getDocument(path);
+
+ Element[] additionalProperties =
+ ThreadSessionManager
+ .getInstance()
+ .getSession()
+ .getResourceMetadataDescriptor();
+
+ Element metadataDescriptor = WsrmdUtils.getMetadataDescriptor(rmdDoc, rmdName);
+
+ for (Element element : additionalProperties)
+ {
+ rmdDoc.adoptNode(element);
+ metadataDescriptor.appendChild(element);
+ }
+
+ return new SimpleMetadataDescriptor(metadataDescriptor);
+ }
+ catch(Exception exception)
+ {
+ LOGGER.error(exception,Messages.QMAN_100021_RMD_BUID_FAILURE,getContextPath());
+ throw new SoapFault(exception);
+ }
+ }
+
+ /**
+ * Returns the capability associated with the given action.
+ *
+ * @param action the wsa:action of the requested capability.
+ * @return the capability associated with the given action.
+ */
+ private Capability getCapabilityForAction(String action)
+ {
+ return (Capability)_capabilitiesByAction.get(action);
+ }
+
+ /**
+ * Creates a WSRP document representing schema properties for this resource.
+ *
+ * @param wsdl the DOM document holding the resource's WSDL.
+ * @return the WSRP document schema.
+ */
+ private ResourcePropertiesSchema createPropertiesSchema(Document wsdl)
+ {
+ QName wsrpName = WsrpUtils.getPropertiesName(wsdl, getWsdlPortType());
+ Element wsrpDoc = WsdlUtils.getElementDeclaration(wsdl, wsrpName);
+ return new SimpleResourcePropertiesSchema(wsrpName, wsrpDoc);
+ }
} \ No newline at end of file