1 /*
2  * Portions of this file Copyright 1999-2005 University of Chicago
3  * Portions of this file Copyright 1999-2005 The University of Southern California.
4  *
5  * This file or a portion of this file is licensed under the
6  * terms of the Globus Toolkit Public License, found at
7  * http://www.globus.org/toolkit/download/license.html.
8  * If you redistribute this file, with or without
9  * modifications, you must include this notice in the file.
10  */
11
12 #include "globus_soap_message.h"
13 #include "globus_wsrf_resource.h"
14 #include "globus_service_engine.h"
15 #include "globus_operation_provider.h"
16 #include "globus_service_registry.h"
17 #include "globus_wsrf_core_tools.h"
18 #include "version.h"
19
20 #include "wsrp_GetMultipleResourcePropertiesType.h"
21 #include "wsrp_GetMultipleResourcePropertiesResponseType.h"
22
23 #define WSRP_GET_MULTIPLE_RESOURCE_PROPERTIES 1
24 #include "wsrp_i_faults.h"
25
26 GlobusExtensionDeclareModule(globus_ws_resource_properties);
27
28 /**
29  * @page wsrp_GetMultipleResourceProperties_provider GetMultipleResourceProperties Provider
30  *
31  * <h2>Provider Usage Overview</h2>
32  * This operation provider implements the GetMultipleResourceProperties
33 portType defined in
34  * http://docs.oasis-open.org/wsrf/2004/06/wsrf-WS-ResourceProperties-1.2-draft-01.wsdl .
35  * This portType consists of the @a GetMultipleResourceProperties operation and
36  * related faults.
37  *
38  * The WSRF service engine will automatically register this provider to handle
39  * the GetMultipleResourceProperties operation for services which use the port
40  * type.
41  */
42
43 /* Prototypes */
44 static
45 globus_result_t
46 wsrp_GetMultipleResourceProperties_init_provider(
47     globus_service_engine_t             engine,
48     globus_soap_message_handle_t        handle,
49     wsrp_GetMultipleResourcePropertiesType *
50                                         input);
51
52 static
53 globus_result_t
54 wsrp_GetMultipleResourceProperties_provider(
55     globus_service_engine_t             engine,
56     globus_soap_message_handle_t        handle,
57     globus_service_descriptor_t *       service,
58     wsrp_GetMultipleResourcePropertiesType *
59                                         input,
60     wsrp_GetMultipleResourcePropertiesResponseType * 
61                                         output,
62     char **                             fault_name,
63     void **                             fault);
64
65 static
66 int
67 wsrp_GetMultipleResourceProperties_activate(void);
68
69 static
70 int
71 wsrp_GetMultipleResourceProperties_deactivate(void);
72
73 /* Local Variables */
74 static xsd_QName wsrp_GetMultipleResourceProperties_qname =
75 {
76     "http://www.globus.org/docs.oasis-open.org/wsrf/2004/06/wsrf-WS-ResourceProperties-1.2-draft-01.wsdl",
77     "GetMultipleResourceProperties"
78 };
79
80 static
81 globus_operation_provider_descriptor_t
82 wsrp_GetMultipleResourceProperties_descriptor =
83 {
84     &wsrp_GetMultipleResourceProperties_qname,
85     "GetMultipleResourceProperties",
86     (void *)wsrp_GetMultipleResourceProperties_init_provider,
87     (void *)wsrp_GetMultipleResourceProperties_provider
88 };
89
90 GlobusExtensionDefineModule(globus_ws_resource_properties) =
91 {
92     "wsrp_GetMultipleResourceProperties",
93     wsrp_GetMultipleResourceProperties_activate,
94     wsrp_GetMultipleResourceProperties_deactivate,
95     NULL,
96     NULL,
97     &local_version
98 };
99
100 /* Implementation */
101 static
102 globus_result_t
103 wsrp_GetMultipleResourceProperties_init_provider(
104     globus_service_engine_t             engine,
105     globus_soap_message_handle_t        handle,
106     wsrp_GetMultipleResourcePropertiesType *
107                                         input)
108 1785 {
109 1785     return GLOBUS_SUCCESS;
110 }
111 /* wsrp_GetMultipleResourceProperties_init_provider() */
112
113 static
114 globus_result_t
115 wsrp_GetMultipleResourceProperties_provider(
116     globus_service_engine_t             engine,
117     globus_soap_message_handle_t        handle,
118     globus_service_descriptor_t *       service,
119     wsrp_GetMultipleResourcePropertiesType *
120                                         input,
121     wsrp_GetMultipleResourcePropertiesResponseType * 
122                                         output,
123     char **                             fault_name,
124     void **                             fault)
125 1785 {
126 1785     globus_resource_t                   resource;
127 1785     void *                              property;
128 1785     xsd_any *                           value;
129 1785     globus_xsd_type_info_t              info;
130 1785     globus_result_t                     result;
131 1785     int                                 i, j;
132 1785     xsd_any *                           prop_any = NULL;
133
134 1785     result = globus_wsrf_core_get_resource(
135         handle,
136         service,
137         &resource);
138
139 1785     if (result != GLOBUS_SUCCESS || resource == NULL)
140     {
141 0         result = wsrp_l_ResourceUnknownFaultType_create(
142                 fault_name,
143                 (wsrp_ResourceUnknownFaultType **) fault);
144
145 0         goto out;
146     }
147
148 495089     for (i = 0; i < input->ResourceProperty.length; i++)
149     {
150 493304         globus_object_t *               error;
151
152 493304         result = globus_resource_get_property(
153                 resource,
154                 &input->ResourceProperty.elements[i],
155                 &property,
156                 &info);
157
158 493304         if (result != GLOBUS_SUCCESS)
159         {
160 0             error = globus_error_get(result);
161
162 0             if (globus_error_match(error,
163                         GLOBUS_WSRF_RESOURCE_MODULE,
164                         GLOBUS_WSRF_RESOURCE_ERROR_TYPE_UNKNOWN_PROPERTY))
165             {
166 0                 result = wsrp_l_InvalidResourcePropertyQNameFaultType_create(
167                         fault_name,
168                         (wsrp_InvalidResourcePropertyQNameFaultType **) fault);
169             }
170             else
171             {
172 0                 result = wsrp_l_ResourceUnknownFaultType_create(
173                         fault_name,
174                         (wsrp_ResourceUnknownFaultType **) fault);
175
176             }
177 0             globus_object_free(error);
178
179 0             goto free_array_out;
180         }
181
182 493304         if (info == &xsd_any_info)
183         {
184 10             prop_any = property;
185         }
186         
187 493304         if ((prop_any != NULL &&
188              prop_any->any_info != NULL &&
189              prop_any->value != NULL) || 
190             (prop_any == NULL && property != NULL))
191         {
192 493296             value = xsd_any_array_push(&output->any);
193 493296             if (value == NULL)
194             {
195 0                 result = globus_error_put(GLOBUS_ERROR_NO_INFO);
196
197 0                 goto free_array_out;
198             }
199 493296             value->any_info = info;
200 493296             result = xsd_QName_copy(&value->element,
201                     &input->ResourceProperty.elements[i]);
202 493296             if (result != GLOBUS_SUCCESS)
203             {
204 0                 goto free_array_out;
205             }
206
207 493296             result = info->copy(&value->value, property);
208 493296             if (result != GLOBUS_SUCCESS)
209             {
210 0                 goto free_array_out;
211             }
212         }
213     }
214 1785     globus_resource_finish(resource);
215
216 1785     return GLOBUS_SUCCESS;
217
218 free_array_out:
219 0     for (j = i-1; j >=0; j--)
220     {
221 0         info = output->any.elements[j].any_info;
222 0         info->destroy(output->any.elements[j].value);
223     }
224 0     free(output->any.elements);
225 0     output->any.length = 0;
226 0     output->any.elements = NULL;
227
228 0     globus_resource_finish(resource);
229 out:
230 0     return result;
231 }
232 /* wsrp_GetMultipleResourceProperties_provider() */
233
234 static
235 int
236 wsrp_GetMultipleResourceProperties_activate(void)
237 28 {
238 28     int                                 res = 0;
239 28     GlobusFuncName(wsrp_GetMultipleResourceProperties_activate);
240     
241 28     res = globus_extension_registry_add(
242         GLOBUS_OPERATION_PROVIDER_REGISTRY,
243         &wsrp_GetMultipleResourceProperties_qname,
244         GlobusExtensionMyModule(globus_ws_resource_properties),
245         &wsrp_GetMultipleResourceProperties_descriptor);
246
247
248 28     return res;
249 }
250 /* wsrp_GetMultipleResourceProperties_activate() */
251
252 static
253 int
254 wsrp_GetMultipleResourceProperties_deactivate(void)
255 0 {
256 0     GlobusFuncName(wsrp_GetMultipleResourceProperties_deactivate);
257
258 0     globus_extension_registry_remove(
259         GLOBUS_OPERATION_PROVIDER_REGISTRY,
260         &wsrp_GetMultipleResourceProperties_qname);
261
262 0     return 0;
263 }