version 1.14, 2010/12/10 19:39:51
|
version 1.15, 2012/07/30 11:18:27
|
|
|
#include <Pegasus/Common/MessageLoader.h> | #include <Pegasus/Common/MessageLoader.h> |
#include <Pegasus/Common/AutoPtr.h> | #include <Pegasus/Common/AutoPtr.h> |
#include <Pegasus/Common/SharedPtr.h> | #include <Pegasus/Common/SharedPtr.h> |
|
#include <Pegasus/IndicationService/IndicationConstants.h> |
| |
#include "WsmConstants.h" | #include "WsmConstants.h" |
#include "WsmReader.h" | #include "WsmReader.h" |
|
|
WsmReader wsmReader(content); | WsmReader wsmReader(content); |
XmlEntry entry; | XmlEntry entry; |
AutoPtr<WsmRequest> request; | AutoPtr<WsmRequest> request; |
|
AutoPtr<WsmRequest> createFilterRequest; |
|
AutoPtr<WsmRequest> createSubRequest; |
|
AutoPtr<WsmRequest> deleteFilterRequest; |
|
AutoPtr<WsmRequest> deleteHandlerRequest; |
|
// Whether to include the filter request while processing |
|
// Subscribe and Unsubscribe requests. |
|
Boolean includeFilter=true; |
String wsaMessageId; | String wsaMessageId; |
|
String wsaAction; |
// Process <?xml ... > | // Process <?xml ... > |
try | try |
{ | { |
|
|
wsmReader.expectStartTag( | wsmReader.expectStartTag( |
entry, WsmNamespaces::SOAP_ENVELOPE, "Envelope"); | entry, WsmNamespaces::SOAP_ENVELOPE, "Envelope"); |
| |
String wsaAction; |
|
String wsaFrom; | String wsaFrom; |
String wsaReplyTo; | String wsaReplyTo; |
String wsaFaultTo; | String wsaFaultTo; |
WsmEndpointReference epr; |
|
Uint32 wsmMaxEnvelopeSize = 0; | Uint32 wsmMaxEnvelopeSize = 0; |
AcceptLanguageList wsmLocale; | AcceptLanguageList wsmLocale; |
Boolean wsmRequestEpr = false; | Boolean wsmRequestEpr = false; |
|
String wseIdentifier; |
|
WsmEndpointReference epr; |
Boolean wsmRequestItemCount = false; | Boolean wsmRequestItemCount = false; |
| |
try | try |
|
|
wsmMaxEnvelopeSize, | wsmMaxEnvelopeSize, |
wsmLocale, | wsmLocale, |
wsmRequestEpr, | wsmRequestEpr, |
wsmRequestItemCount); |
wsmRequestItemCount, |
|
wseIdentifier); |
} | } |
catch (XmlException&) | catch (XmlException&) |
{ | { |
|
|
className, | className, |
methodName)); | methodName)); |
} | } |
|
else if(wsaAction == WSM_ACTION_WSMAN_SUBSCRIBE) |
|
{ |
|
request.reset(_decodeWSSubscriptionRequest( |
|
wsmReader, |
|
wsaMessageId, |
|
epr, |
|
createFilterRequest, |
|
createSubRequest, |
|
includeFilter)); |
|
} |
|
else if(wsaAction == WSM_ACTION_WSMAN_UNSUBSCRIBE) |
|
{ |
|
request.reset(_decodeWSUnsubscribeRequest( |
|
wsmReader, |
|
wsaMessageId, |
|
epr, |
|
wseIdentifier, |
|
includeFilter, |
|
deleteFilterRequest, |
|
deleteHandlerRequest)); |
|
} |
|
else if(wsaAction == WSM_ACTION_SUBSCRIBE_RENEW) |
|
{ |
|
throw WsmFault( |
|
WsmFault::wse_UnableToRenew, |
|
MessageLoaderParms( |
|
"WsmServer.WsmRequestDecoder.UNABLE_TO_RENEW", |
|
"The subscription could not be renewed.")); |
|
} |
else | else |
{ | { |
throw WsmFault( | throw WsmFault( |
|
|
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
return; | return; |
} | } |
|
if(wsaAction == WSM_ACTION_WSMAN_SUBSCRIBE) |
|
{ |
|
// If a filter has to be created during subscription, |
|
// add the filter request. |
|
if(includeFilter) |
|
{ |
|
createFilterRequest.get()->copyRequestProperties(request); |
|
_wsmProcessor->addReqToSubContext(createFilterRequest.release(), |
|
true); |
|
} |
|
createSubRequest.get()->copyRequestProperties(request); |
|
_wsmProcessor->addReqToSubContext(request.get(), true); |
|
_wsmProcessor->addReqToSubContext(createSubRequest.release(), true); |
|
} |
|
else if(wsaAction == WSM_ACTION_WSMAN_UNSUBSCRIBE) |
|
{ |
|
// If the filter has to be deleted during unsubscribe, |
|
// add the filter request. |
|
if(includeFilter) |
|
{ |
|
deleteFilterRequest.get()->copyRequestProperties(request); |
|
_wsmProcessor->addReqToSubContext(deleteFilterRequest.release(), |
|
false); |
|
} |
|
deleteHandlerRequest.get()->copyRequestProperties(request); |
|
_wsmProcessor->addReqToSubContext(deleteHandlerRequest.release(), |
|
false); |
|
} |
_wsmProcessor->handleRequest(request.release()); | _wsmProcessor->handleRequest(request.release()); |
| |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
|
|
return new WsInvokeRequest(messageId, epr, className, methodName, instance); | return new WsInvokeRequest(messageId, epr, className, methodName, instance); |
} | } |
| |
|
WsmRequest* WsmRequestDecoder::_decodeWSUnsubscribeRequest( |
|
WsmReader& wsmReader, |
|
const String& messageId, |
|
WsmEndpointReference& epr, |
|
const String& identifier, |
|
Boolean & includeFilter, |
|
AutoPtr<WsmRequest> &deleteFilterRequest, |
|
AutoPtr<WsmRequest> &deleteHandlerRequest) |
|
{ |
|
PEG_METHOD_ENTER(TRC_WSMSERVER, |
|
"WsmRequestDecoder::_decodeWSUnsubscribeRequest()"); |
|
_checkRequiredHeader("wse:Identifier", identifier.size()); |
|
XmlEntry entry; |
|
wsmReader.expectStartOrEmptyTag( |
|
entry, WsmNamespaces::SOAP_ENVELOPE, "Body"); |
|
if (entry.type != XmlEntry::EMPTY_TAG) |
|
{ |
|
wsmReader.expectStartOrEmptyTag( |
|
entry, WsmNamespaces::WS_EVENTING, "Unsubscribe"); |
|
wsmReader.expectEndTag(WsmNamespaces::SOAP_ENVELOPE, "Body"); |
|
} |
|
|
|
WsmEndpointReference filterEPR; |
|
String filterName; |
|
// If existing filter is used in Subscription, do not delete the filter |
|
if(_wsmProcessor->isSubCreatedWithExistingFilter(identifier, filterName)) |
|
{ |
|
getFilterOrHandlerEPR(filterEPR, |
|
epr.address, |
|
filterName, |
|
PEGASUS_CLASSNAME_INDFILTER.getString()); |
|
includeFilter = false; |
|
} |
|
else |
|
{ |
|
getFilterOrHandlerEPR(filterEPR, |
|
epr.address, |
|
identifier, |
|
PEGASUS_CLASSNAME_INDFILTER.getString()); |
|
} |
|
|
|
WsmEndpointReference handlerEPR; |
|
getFilterOrHandlerEPR(handlerEPR, |
|
epr.address, |
|
identifier, PEGASUS_CLASSNAME_INDHANDLER_WSMAN.getString()); |
|
|
|
WsmEndpointReference subscriptionEPR; |
|
subscriptionEPR.address = epr.address; |
|
subscriptionEPR.resourceUri = String(WSM_RESOURCEURI_CIMSCHEMAV2) + |
|
"/" + PEGASUS_CLASSNAME_INDSUBSCRIPTION.getString(); |
|
subscriptionEPR.selectorSet->selectors.append(WsmSelector |
|
(PEGASUS_WS_CIMNAMESPACE, |
|
PEGASUS_NAMESPACENAME_INTEROP.getString())); |
|
subscriptionEPR.selectorSet->selectors.append(WsmSelector |
|
(PEGASUS_PROPERTYNAME_FILTER.getString(), filterEPR)); |
|
subscriptionEPR.selectorSet->selectors.append(WsmSelector |
|
(PEGASUS_PROPERTYNAME_HANDLER.getString(), handlerEPR)); |
|
// DSP0227:R10.6-4 :If a service created CIM indication-related instances |
|
// as described in 10.5, then the service shall delete those instances |
|
// when the subscription is canceled for any reason. |
|
if(includeFilter) |
|
{ |
|
deleteFilterRequest.reset(new WxfSubDeleteRequest( messageId, |
|
filterEPR, |
|
PEGASUS_CLASSNAME_INDFILTER.getString())); |
|
} |
|
deleteHandlerRequest.reset(new WxfSubDeleteRequest( messageId, |
|
handlerEPR, |
|
PEGASUS_CLASSNAME_INDHANDLER_WSMAN.getString())); |
|
PEG_METHOD_EXIT(); |
|
return new WxfSubDeleteRequest(messageId, |
|
subscriptionEPR, |
|
PEGASUS_CLASSNAME_INDSUBSCRIPTION.getString()); |
|
} |
|
|
|
WsmRequest* WsmRequestDecoder::_decodeWSSubscriptionRequest( |
|
WsmReader& wsmReader, |
|
const String& messageId, |
|
WsmEndpointReference& epr, |
|
AutoPtr<WsmRequest> &createFilterRequest, |
|
AutoPtr<WsmRequest> &createSubRequest, |
|
Boolean &includeFilter) |
|
{ |
|
PEG_METHOD_ENTER(TRC_WSMSERVER, |
|
"WsmRequestDecoder::_decodeWSSubscriptionRequest()"); |
|
_checkRequiredHeader("wsman:ResourceURI", epr.resourceUri.size()); |
|
|
|
String filterName; |
|
String deliveryMode; |
|
String notifyTo; |
|
String subExpiration; |
|
XmlEntry entry; |
|
WsmFilter wsmFilter; |
|
// Remove the "uuid:" from messageId |
|
String msgId = messageId.subString(PEGASUS_WS_UUID_LENGTH); |
|
|
|
wsmReader.expectStartOrEmptyTag( |
|
entry, WsmNamespaces::SOAP_ENVELOPE, "Body"); |
|
if (entry.type != XmlEntry::EMPTY_TAG) |
|
{ |
|
wsmReader.decodeSubscribeBody( |
|
deliveryMode, |
|
notifyTo, |
|
subExpiration, |
|
wsmFilter); |
|
wsmReader.expectEndTag(WsmNamespaces::SOAP_ENVELOPE, "Body"); |
|
} |
|
|
|
// DSP0227: 10.2.1.1 - Subscribing to CIM server. |
|
// Resource URI is all classes |
|
if( epr.resourceUri == WSM_RESOURCEURI_ALLCLASSES ) |
|
{ |
|
if(!wsmFilter.WQLFilter.query.size()) |
|
{ |
|
MessageLoaderParms parms( |
|
"WsmServer.WsmRequestDecoder.INVALID_MESSAGE ", |
|
"The request message has unknown or invalid content" |
|
" and cannot be processed. "); |
|
throw WsmFault( WsmFault::wse_InvalidMessage, parms); |
|
} |
|
} |
|
//DSP0227: 10.2.1.3 Subscribing to an existing filter |
|
//Resource URI specifies existing filter |
|
else if ( epr.resourceUri == WSM_RESOURCEURI_INDICATION_FILTER) |
|
{ |
|
// DSP0227:R10.2.2-2 - If a service supports filtering using an |
|
// existing filter expression, the service message shall return the |
|
// wsman:InvalidParameter fault if the wse:Subscribe request includes |
|
// a filter expression |
|
if(wsmFilter.WQLFilter.query.size()) |
|
{ |
|
throw WsmFault( |
|
WsmFault::wsman_InvalidParameter, |
|
MessageLoaderParms( |
|
"WsmServer.WsmRequestDecoder.INVALID_PARAMETER ", |
|
"An operation parameter is not valid.")); |
|
} |
|
else |
|
{ |
|
for (Uint32 i = 0; i < epr.selectorSet->selectors.size(); i++) |
|
{ |
|
if(String::equalNoCase(epr.selectorSet->selectors[i].name, |
|
"Name")) |
|
{ |
|
filterName = epr.selectorSet->selectors[i].value; |
|
includeFilter = false; |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
//DSP0227: 10.2.1.2 Subscribing to an indication class |
|
else |
|
{ |
|
CIMName className = WsmToCimRequestMapper:: |
|
convertResourceUriToClassName(epr.resourceUri); |
|
if(wsmFilter.filterDialect == WsmFilter::NONE) |
|
{ |
|
//If no filter query is specified, form a filter query. |
|
wsmFilter.filterDialect = WsmFilter::WQL; |
|
String query("SELECT * FROM "); |
|
query.append(className.getString()); |
|
wsmFilter.WQLFilter.query = query; |
|
try |
|
{ |
|
wsmFilter.WQLFilter.selectStatement.reset( |
|
new WQLSelectStatement); |
|
WQLParser::parse(wsmFilter.WQLFilter.query, |
|
*wsmFilter.WQLFilter.selectStatement.get()); |
|
} |
|
catch (ParseError& e) |
|
{ |
|
MessageLoaderParms parms( |
|
"WsmServer.WsmRequestDecoder." |
|
"INVALID_FILTER_QUERY_EXPRESSION", |
|
"Invalid filter query expression: \"$0\".", |
|
entry.text); |
|
throw WsmFault(WsmFault::wsen_CannotProcessFilter, parms); |
|
} |
|
wsmFilter.WQLFilter.queryLanguage = "WQL"; |
|
} |
|
else if(wsmFilter.filterDialect == WsmFilter::WQL) |
|
{ |
|
// DSP0227 - R8.1-9 : If class name in resource URI does not |
|
// match the class name in the filter query, then throw |
|
// wse:EventSourceUnableToProcess fault. |
|
WQLSelectStatement *st = wsmFilter.WQLFilter.selectStatement.get(); |
|
if(className.getString() != st->getClassName().getString()) |
|
{ |
|
throw WsmFault( |
|
WsmFault::wse_EventSourceUnableToProcess, |
|
MessageLoaderParms( |
|
"WsmServer.WsmRequestDecoder.UNABLE_TO_PROCESS ", |
|
"The event source cannot process the subscription.")); |
|
} |
|
} |
|
} |
|
WsmEndpointReference filterEPR; |
|
const String creClassName(PEGASUS_PROPERTYNAME_CREATIONCLASSNAME. |
|
getString()); |
|
const String propertyName(PEGASUS_PROPERTYNAME_NAME.getString()); |
|
WsmValue sysNameValue(System::getFullyQualifiedHostName()); |
|
WsmProperty sysNameProp("SystemName", sysNameValue); |
|
WsmValue sysCreClassNameValue(System::getSystemCreationClassName ()); |
|
WsmProperty sysCreClassNameProp( |
|
"SystemCreationClassName", |
|
sysCreClassNameValue); |
|
|
|
//Creating filterInstance and forming createInstace request for filter. |
|
if ( includeFilter == true) |
|
{ |
|
WsmInstance filterInstance; |
|
filterInstance.setClassName(PEGASUS_CLASSNAME_INDFILTER.getString()); |
|
|
|
filterInstance.addProperty(sysCreClassNameProp); |
|
filterInstance.addProperty(sysNameProp); |
|
|
|
WsmValue filCreClassNameValue(PEGASUS_CLASSNAME_INDFILTER.getString()); |
|
WsmProperty filCreClassNameProp(creClassName, filCreClassNameValue); |
|
filterInstance.addProperty(filCreClassNameProp); |
|
|
|
WsmValue filNameValue(msgId); |
|
WsmProperty filNameProp(propertyName, filNameValue); |
|
filterInstance.addProperty(filNameProp); |
|
filterName = msgId; |
|
|
|
WsmValue queryValue(wsmFilter.WQLFilter.query); |
|
WsmProperty queryProp(PEGASUS_PROPERTYNAME_QUERY.getString(), |
|
queryValue); |
|
filterInstance.addProperty(queryProp); |
|
|
|
WsmValue queryLangValue(wsmFilter.WQLFilter.queryLanguage); |
|
WsmProperty queryLangProp(PEGASUS_PROPERTYNAME_QUERYLANGUAGE. |
|
getString(), |
|
queryLangValue); |
|
filterInstance.addProperty(queryLangProp); |
|
|
|
WsmValue srcNamespaceValue(( const char *)epr.getNamespace(). |
|
getCString() ); |
|
WsmProperty srcNamespaceProp("SourceNamespaces", srcNamespaceValue); |
|
filterInstance.addProperty(srcNamespaceProp); |
|
getFilterOrHandlerEPR(filterEPR, |
|
epr.address, |
|
filterName, |
|
PEGASUS_CLASSNAME_INDFILTER.getString()); |
|
createFilterRequest.reset(new WxfSubCreateRequest(messageId, |
|
filterEPR, |
|
filterInstance)); |
|
} |
|
else |
|
{ |
|
getFilterOrHandlerEPR(filterEPR, |
|
epr.address, |
|
filterName, |
|
PEGASUS_CLASSNAME_INDFILTER.getString()); |
|
} |
|
|
|
//Creating Handler Instance. |
|
WsmInstance handlerInstance; |
|
handlerInstance.setClassName(PEGASUS_CLASSNAME_INDHANDLER_WSMAN. |
|
getString()); |
|
handlerInstance.addProperty(sysCreClassNameProp); |
|
handlerInstance.addProperty(sysNameProp); |
|
WsmValue hanCreClassNameValue(PEGASUS_CLASSNAME_INDHANDLER_WSMAN. |
|
getString()); |
|
WsmProperty hanCreClassNameProp(creClassName, hanCreClassNameValue); |
|
handlerInstance.addProperty(hanCreClassNameProp); |
|
|
|
WsmValue handlerNameValue(msgId); |
|
WsmProperty handlerNameProp(propertyName,handlerNameValue); |
|
handlerInstance.addProperty(handlerNameProp); |
|
|
|
WsmValue deliveryModeValue(deliveryMode); |
|
WsmProperty deliveryModeProp( |
|
PEGASUS_PROPERTYNAME_WSM_DELIVERY_MODE.getString(), |
|
deliveryModeValue); |
|
handlerInstance.addProperty(deliveryModeProp); |
|
|
|
WsmValue destValue(notifyTo); |
|
WsmProperty destProp(PEGASUS_PROPERTYNAME_LSTNRDST_DESTINATION.getString(), |
|
destValue); |
|
handlerInstance.addProperty(destProp); |
|
|
|
WsmEndpointReference handlerEPR; |
|
getFilterOrHandlerEPR(handlerEPR, |
|
epr.address, |
|
msgId, |
|
PEGASUS_CLASSNAME_INDHANDLER_WSMAN.getString()); |
|
|
|
//Creating Subscription Instance. |
|
WsmInstance subscriptionInstance; |
|
subscriptionInstance.setClassName( |
|
PEGASUS_CLASSNAME_INDSUBSCRIPTION.getString()); |
|
|
|
WsmValue subCreClassNameValue( |
|
PEGASUS_CLASSNAME_INDSUBSCRIPTION.getString()); |
|
WsmProperty subCreClassNameProp(creClassName, subCreClassNameValue); |
|
|
|
WsmValue subInfoVal(msgId); |
|
WsmProperty subscriptionInfo(_PROPERTY_SUBSCRIPTION_INFO.getString(), |
|
subInfoVal); |
|
subscriptionInstance.addProperty(subscriptionInfo); |
|
|
|
WsmValue subFilterValue(filterEPR); |
|
WsmProperty subFilterProp(PEGASUS_PROPERTYNAME_FILTER.getString(), |
|
subFilterValue); |
|
subscriptionInstance.addProperty(subFilterProp); |
|
|
|
WsmValue subHandlerValue(handlerEPR); |
|
WsmProperty subHandlerProp(PEGASUS_PROPERTYNAME_HANDLER.getString(), |
|
subHandlerValue); |
|
subscriptionInstance.addProperty(subHandlerProp); |
|
|
|
if(subExpiration.size()) |
|
{ |
|
WsmValue subDurationval(subExpiration); |
|
WsmProperty subDurationProp(PEGASUS_WS_SUB_DURATION, |
|
subDurationval); |
|
subscriptionInstance.addProperty(subDurationProp); |
|
} |
|
|
|
WsmEndpointReference subscriptionEPR; |
|
subscriptionEPR.address = epr.address; |
|
subscriptionEPR.resourceUri = String(WSM_RESOURCEURI_CIMSCHEMAV2) + |
|
"/" + PEGASUS_CLASSNAME_INDSUBSCRIPTION.getString(); |
|
subscriptionEPR.selectorSet->selectors.append(WsmSelector |
|
(PEGASUS_WS_CIMNAMESPACE, |
|
PEGASUS_NAMESPACENAME_INTEROP.getString())); |
|
createSubRequest.reset(new WxfSubCreateRequest(messageId, |
|
subscriptionEPR, |
|
subscriptionInstance)); |
|
PEG_METHOD_EXIT(); |
|
return(new WxfSubCreateRequest(messageId, |
|
handlerEPR, |
|
handlerInstance)); |
|
} |
|
|
|
void WsmRequestDecoder::getFilterOrHandlerEPR( |
|
WsmEndpointReference& instanceEPR, |
|
const String address, |
|
const String name, |
|
const String className) |
|
{ |
|
instanceEPR.address = address; |
|
instanceEPR.resourceUri = String(WSM_RESOURCEURI_CIMSCHEMAV2) |
|
+ "/" + className; |
|
instanceEPR.selectorSet->selectors.append(WsmSelector |
|
(PEGASUS_WS_CIMNAMESPACE, |
|
PEGASUS_NAMESPACENAME_INTEROP.getString())); |
|
instanceEPR.selectorSet->selectors.append(WsmSelector( |
|
"SystemCreationClassName", |
|
System::getSystemCreationClassName())); |
|
instanceEPR.selectorSet->selectors.append(WsmSelector( |
|
"SystemName", |
|
System::getFullyQualifiedHostName())); |
|
instanceEPR.selectorSet->selectors.append(WsmSelector( |
|
PEGASUS_PROPERTYNAME_CREATIONCLASSNAME.getString(), |
|
className)); |
|
instanceEPR.selectorSet->selectors.append(WsmSelector( |
|
PEGASUS_PROPERTYNAME_NAME.getString(), |
|
name)); |
|
} |
|
|
bool WsmRequestDecoder::_isIdentifyRequest(WsmReader& wsmReader) | bool WsmRequestDecoder::_isIdentifyRequest(WsmReader& wsmReader) |
{ | { |
// Parse the <s:Body> element. Here is an example: | // Parse the <s:Body> element. Here is an example: |