1 kumpf 1.2 //%2006////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
6 // IBM Corp.; EMC Corporation, The Open Group.
7 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
9 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
11 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
13 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
15 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
18 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
20 //
21 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
22 kumpf 1.2 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
24 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
27 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //=============================================================================
31 //
32 //%////////////////////////////////////////////////////////////////////////////
33
34 #include <cctype>
35 #include <cstdio>
36 #include <Pegasus/Common/Config.h>
37 #include <Pegasus/Common/Tracer.h>
38 #include <Pegasus/Common/MessageLoader.h>
39 #include <Pegasus/Common/AutoPtr.h>
40 #include "WsmConstants.h"
41 #include "WsmProcessor.h"
42
43 kumpf 1.2 PEGASUS_NAMESPACE_BEGIN
44
45 WsmProcessor::WsmProcessor(
46 MessageQueueService* cimOperationProcessorQueue,
47 CIMRepository* repository)
48 : MessageQueueService(PEGASUS_QUEUENAME_WSMPROCESSOR),
49 _wsmResponseEncoder(),
50 _wsmRequestDecoder(this),
51 _cimOperationProcessorQueue(cimOperationProcessorQueue),
52 _repository(repository),
53 _wsmToCimRequestMapper(repository)
54 {
55 }
56
57 WsmProcessor::~WsmProcessor()
58 {
59 }
60
61 void WsmProcessor::handleEnqueue(Message* message)
62 {
63 if (!message)
64 kumpf 1.2 {
65 return;
66 }
67
68 PEGASUS_ASSERT(dynamic_cast<CIMResponseMessage*>(message) != 0);
69 handleResponse(dynamic_cast<CIMResponseMessage*>(message));
70 }
71
72 void WsmProcessor::handleEnqueue()
73 {
74 Message* message = dequeue();
75 handleEnqueue(message);
76 }
77
78 void WsmProcessor::handleRequest(WsmRequest* wsmRequest)
79 {
80 PEG_METHOD_ENTER(TRC_WSMSERVER, "WsmProcessor::handleRequest()");
81
82 // Process requests by type. For now, only WS-Transfer operations are
83 // implemented, and they all are handled by forwarding to the CIM Server.
84
85 kumpf 1.2 AutoPtr<WsmRequest> wsmRequestDestroyer(wsmRequest);
86
87 try
88 {
89 CIMOperationRequestMessage* cimRequest =
90 _wsmToCimRequestMapper.mapToCimRequest(wsmRequest);
91
92 // Save the request until the response comes back.
93 // Note that the CIM request has its own unique message ID.
94 _requestTable.insert(cimRequest->messageId, wsmRequest);
95 wsmRequestDestroyer.release();
96
97 cimRequest->queueIds.push(getQueueId());
98 _cimOperationProcessorQueue->enqueue(cimRequest);
99 }
100 catch (WsmFault& fault)
101 {
102 sendResponse(new WsmFaultResponse(wsmRequest, fault));
103 }
104 catch (CIMException& e)
105 {
106 kumpf 1.2 sendResponse(new WsmFaultResponse(
107 wsmRequest,
108 _cimToWsmResponseMapper.mapCimExceptionToWsmFault(e)));
109 }
110 catch (Exception& e)
111 {
112 sendResponse(new WsmFaultResponse(
113 wsmRequest,
114 WsmFault(
115 WsmFault::wsman_InternalError,
116 e.getMessage(),
117 e.getContentLanguages())));
118 }
119 catch (PEGASUS_STD(exception)& e)
120 {
121 sendResponse(new WsmFaultResponse(
122 wsmRequest,
123 WsmFault(WsmFault::wsman_InternalError, e.what())));
124 }
125 catch (...)
126 {
127 kumpf 1.2 sendResponse(new WsmFaultResponse(
128 wsmRequest,
129 WsmFault(WsmFault::wsman_InternalError)));
130 }
131
132 // Note this requirement when Enumerate/Pull operations are supported:
133 // DSP0226 R6.3-5: For operations that span multiple message sequences,
134 // the wsman:Locale element is processed in the initial message only.
135 // It should be ignored in subsequent messages because the first
136 // message establishes the required locale. The service may issue a
137 // fault if the wsman:Locale is present in subsequent messages and the
138 // value is different from that used in the initiating request.
139
140 PEG_METHOD_EXIT();
141 }
142
143 void WsmProcessor::handleResponse(CIMResponseMessage* cimResponse)
144 {
145 PEG_METHOD_ENTER(TRC_WSMSERVER, "WsmProcessor::handleResponse()");
146
147 AutoPtr<CIMResponseMessage> cimResponseDestroyer(cimResponse);
148 kumpf 1.2
149 // Lookup the request this response corresponds to
150 WsmRequest* wsmRequest;
151 Boolean gotRequest =
152 _requestTable.lookup(cimResponse->messageId, wsmRequest);
153 PEGASUS_ASSERT(gotRequest);
154 AutoPtr<WsmRequest> wsmRequestDestroyer(wsmRequest);
155 _requestTable.remove(wsmRequest->messageId);
156
157 try
158 {
159 AutoPtr<WsmResponse> wsmResponse(
160 _cimToWsmResponseMapper.mapToWsmResponse(wsmRequest, cimResponse));
161
162 cimResponse->updateThreadLanguages();
163 cimResponse->queueIds.pop();
164 _wsmResponseEncoder.enqueue(wsmResponse.get());
165 }
166 catch (WsmFault& fault)
167 {
168 sendResponse(new WsmFaultResponse(wsmRequest, fault));
169 kumpf 1.2 }
170 catch (CIMException& e)
171 {
172 sendResponse(new WsmFaultResponse(
173 wsmRequest,
174 _cimToWsmResponseMapper.mapCimExceptionToWsmFault(e)));
175 }
176 catch (Exception& e)
177 {
178 sendResponse(new WsmFaultResponse(
179 wsmRequest,
180 WsmFault(
181 WsmFault::wsman_InternalError,
182 e.getMessage(),
183 e.getContentLanguages())));
184 }
185 catch (PEGASUS_STD(exception)& e)
186 {
187 sendResponse(new WsmFaultResponse(
188 wsmRequest,
189 WsmFault(WsmFault::wsman_InternalError, e.what())));
190 kumpf 1.2 }
191 catch (...)
192 {
193 sendResponse(new WsmFaultResponse(
194 wsmRequest,
195 WsmFault(WsmFault::wsman_InternalError)));
196 }
197
198 PEG_METHOD_EXIT();
199 }
200
201 void WsmProcessor::sendResponse(WsmResponse* wsmResponse)
202 {
203 PEG_METHOD_ENTER(TRC_WSMSERVER, "WsmProcessor::sendResponse()");
204
205 _wsmResponseEncoder.enqueue(wsmResponse);
206 delete wsmResponse;
207
208 PEG_METHOD_EXIT();
209 }
210
211 kumpf 1.2 Uint32 WsmProcessor::getWsmRequestDecoderQueueId()
212 {
213 return _wsmRequestDecoder.getQueueId();
214 }
215
216 PEGASUS_NAMESPACE_END
|