1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 package org.ogf.graap.wsag.client.remote;
36
37 import javax.xml.namespace.QName;
38
39 import org.apache.log4j.Logger;
40 import org.apache.muse.util.xml.XmlUtils;
41 import org.apache.muse.ws.addressing.WsaConstants;
42 import org.apache.muse.ws.addressing.soap.SoapFault;
43 import org.apache.xmlbeans.XmlException;
44 import org.apache.xmlbeans.XmlObject;
45 import org.apache.xmlbeans.XmlOptions;
46 import org.apache.xmlbeans.XmlString;
47 import org.ogf.graap.wsag.api.AgreementOffer;
48 import org.ogf.graap.wsag.api.WsagConstants;
49 import org.ogf.graap.wsag.api.client.AgreementClient;
50 import org.ogf.graap.wsag.api.client.AgreementFactoryService;
51 import org.ogf.graap.wsag.api.client.NegotiationClient;
52 import org.ogf.graap.wsag.api.client.WsClient;
53 import org.ogf.graap.wsag.api.exceptions.AgreementFactoryException;
54 import org.ogf.graap.wsag.api.exceptions.NegotiationFactoryException;
55 import org.ogf.graap.wsag.api.exceptions.ResourceUnavailableException;
56 import org.ogf.graap.wsag.api.exceptions.ResourceUnknownException;
57 import org.ogf.graap.wsag.api.security.ISecurityProperties;
58 import org.ogf.schemas.graap.wsAgreement.AgreementFactoryPropertiesType;
59 import org.ogf.schemas.graap.wsAgreement.AgreementTemplateType;
60 import org.ogf.schemas.graap.wsAgreement.AgreementType;
61 import org.ogf.schemas.graap.wsAgreement.ContinuingFaultDocument;
62 import org.ogf.schemas.graap.wsAgreement.CreateAgreementInputType;
63 import org.ogf.schemas.graap.wsAgreement.CreateAgreementResponseDocument;
64 import org.ogf.schemas.graap.wsAgreement.CreatePendingAgreementInputType;
65 import org.ogf.schemas.graap.wsAgreement.CreatePendingAgreementResponseDocument;
66 import org.ogf.schemas.graap.wsAgreement.NoncriticalExtensionType;
67 import org.ogf.schemas.graap.wsAgreement.negotiation.NegotiationContextType;
68 import org.ogf.schemas.graap.wsAgreement.negotiation.protocol.InitiateNegotiationInputDocument;
69 import org.ogf.schemas.graap.wsAgreement.negotiation.protocol.InitiateNegotiationInputType;
70 import org.ogf.schemas.graap.wsAgreement.negotiation.protocol.InitiateNegotiationOutputDocument;
71 import org.w3.x2005.x08.addressing.EndpointReferenceType;
72 import org.w3c.dom.Element;
73
74
75
76
77
78
79
80
81 public class RemoteAgreementFactoryServiceImpl extends WsrfResourceClient
82 implements AgreementFactoryService
83 {
84
85 private static final Logger LOG = Logger.getLogger( RemoteAgreementFactoryServiceImpl.class );
86
87
88
89
90
91
92
93
94
95
96 public RemoteAgreementFactoryServiceImpl( EndpointReferenceType epr,
97 ISecurityProperties securityProperties )
98 {
99 super( epr, securityProperties );
100 }
101
102
103
104
105 public WsClient getWebServiceClient()
106 {
107 return this;
108 }
109
110
111
112
113 public AgreementClient createAgreement( AgreementOffer offer )
114 throws AgreementFactoryException, ResourceUnavailableException, ResourceUnknownException
115 {
116 try
117 {
118 CreateAgreementInputType request = CreateAgreementInputType.Factory.newInstance();
119
120 if ( offer.getInitiatorEPR() != null )
121 {
122 request.setInitiatorAgreementEPR( offer.getInitiatorEPR() );
123 }
124
125 AgreementType agreement = request.addNewAgreementOffer();
126 agreement.setName( offer.getName() );
127 agreement.setContext( offer.getContext() );
128 agreement.setTerms( offer.getTerms() );
129
130 Element inputType =
131 XmlUtils.createElement( WsagConstants.WSAG_CREATE_AGREEMENT_INPUT_QNAME, request.getDomNode() );
132 Element body = XmlUtils.createElement( WsagConstants.WSAG_CREATE_AGREEMENT_QNAME );
133 body.appendChild( body.getOwnerDocument().importNode( inputType, true ) );
134 Element response = invoke( WsagConstants.WSAG_CREATE_AGREEMENT_ACTION, body );
135
136 CreateAgreementResponseDocument respDoc =
137 CreateAgreementResponseDocument.Factory.parse( response );
138
139 AgreementClient createdAgreement =
140 new RemoteAgreementClientImpl( respDoc.getCreateAgreementResponse().getCreatedAgreementEPR(),
141 getSecurityProperties().clone() );
142
143 return createdAgreement;
144 }
145 catch ( SoapFault e )
146 {
147 handleCreateAgreementFault( e );
148 throw new ResourceUnavailableException( e );
149 }
150 catch ( XmlException e )
151 {
152 throw new ResourceUnavailableException( e );
153 }
154 catch ( Exception e )
155 {
156 throw new ResourceUnavailableException( e );
157 }
158 }
159
160
161
162
163 public AgreementClient createPendingAgreement( AgreementOffer offer )
164 throws AgreementFactoryException, ResourceUnknownException, ResourceUnavailableException
165 {
166 return createPendingAgreement( offer, null );
167 }
168
169
170
171
172 public AgreementClient createPendingAgreement( AgreementOffer offer, EndpointReferenceType acceptanceEPR )
173 throws AgreementFactoryException, ResourceUnknownException, ResourceUnavailableException
174 {
175 try
176 {
177 CreatePendingAgreementInputType request = CreatePendingAgreementInputType.Factory.newInstance();
178
179 if ( offer.getInitiatorEPR() != null )
180 {
181 request.setInitiatorAgreementEPR( offer.getInitiatorEPR() );
182 }
183
184 if ( acceptanceEPR != null )
185 {
186 request.setAgreementAcceptanceEPR( acceptanceEPR );
187 }
188
189 AgreementType agreement = request.addNewAgreementOffer();
190 agreement.setName( offer.getName() );
191 agreement.setContext( offer.getContext() );
192 agreement.setTerms( offer.getTerms() );
193
194 Element inputType =
195 XmlUtils.createElement( WsagConstants.WSAG_CREATE_PENDING_AGREEMENT_INPUT_QNAME,
196 request.getDomNode() );
197 Element body = XmlUtils.createElement( WsagConstants.WSAG_CREATE_PENDING_AGREEMENT_QNAME );
198 body.appendChild( body.getOwnerDocument().importNode( inputType, true ) );
199 Element response = invoke( WsagConstants.WSAG_CREATE_PENDING_AGREEMENT_ACTION, body );
200
201 CreatePendingAgreementResponseDocument respDoc =
202 CreatePendingAgreementResponseDocument.Factory.parse( response );
203
204 AgreementClient createdAgreement =
205 new RemoteAgreementClientImpl( respDoc.getCreatePendingAgreementResponse()
206 .getCreatedAgreementEPR(),
207 getSecurityProperties().clone() );
208
209 return createdAgreement;
210 }
211 catch ( SoapFault e )
212 {
213
214
215
216 handleCreateAgreementFault( e );
217 throw new ResourceUnavailableException( e );
218 }
219 catch ( XmlException e )
220 {
221 throw new ResourceUnavailableException( e );
222 }
223 catch ( Exception e )
224 {
225 throw new ResourceUnavailableException( e );
226 }
227 }
228
229
230
231
232 public NegotiationClient initiateNegotiation( NegotiationContextType context )
233 throws NegotiationFactoryException, ResourceUnknownException, ResourceUnavailableException
234 {
235 return initiateNegotiation( context, WsrfResourceClient.ANONYMOUS_EPR );
236 }
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257 public NegotiationClient initiateNegotiation( NegotiationContextType context,
258 EndpointReferenceType initiatorEPR )
259 throws NegotiationFactoryException, ResourceUnknownException, ResourceUnavailableException
260 {
261
262 try
263 {
264
265 InitiateNegotiationInputDocument requestDoc =
266 InitiateNegotiationInputDocument.Factory.newInstance();
267
268 InitiateNegotiationInputType request = requestDoc.addNewInitiateNegotiationInput();
269
270 request.setNegotiationContext( context );
271 request.setNoncriticalExtensionArray( new NoncriticalExtensionType[0] );
272 request.setInitiatorNegotiationEPR( initiatorEPR );
273
274 Element body = XmlUtils.createElement( WsagConstants.WSAG_INITIATE_NEGOTIATION_QNAME );
275 Element inputType =
276 XmlUtils.createElement( WsagConstants.WSAG_INITIATE_NEGOTIATION_INPUT_QNAME,
277 request.getDomNode() );
278 body.appendChild( body.getOwnerDocument().importNode( inputType, true ) );
279 Element response = invoke( WsagConstants.WSAG_INITIATE_NEGOTIATION_ACTION, body );
280
281 InitiateNegotiationOutputDocument responseDoc =
282 InitiateNegotiationOutputDocument.Factory.parse( response );
283
284 NegotiationClient createdNegotiation =
285 new RemoteNegotiationClientImpl( responseDoc.getInitiateNegotiationOutput()
286 .getCreatedNegotiationEPR(),
287 getSecurityProperties().clone() );
288
289 return createdNegotiation;
290
291 }
292 catch ( SoapFault e )
293 {
294
295 LOG.error( e.getMessage() );
296
297 Element detail = e.getDetail();
298
299 try
300 {
301
302 XmlObject ex = XmlObject.Factory.parse( detail );
303 if ( ex instanceof ContinuingFaultDocument )
304 {
305 ContinuingFaultDocument result = (ContinuingFaultDocument) ex;
306 throw new NegotiationFactoryException( result.getContinuingFault().xmlText() );
307 }
308 if ( e.getSubCode()
309 .equals( new QName( WsaConstants.NAMESPACE_URI, "DestinationUnreachable" ) ) )
310 {
311 throw new NegotiationFactoryException( new ResourceUnknownException( e.getReason() ) );
312 }
313
314 throw new ResourceUnavailableException( e );
315 }
316 catch ( XmlException e1 )
317 {
318 throw new ResourceUnavailableException( e );
319 }
320 }
321 catch ( XmlException e )
322 {
323 throw new ResourceUnavailableException( e );
324 }
325 catch ( Exception e )
326 {
327 throw new ResourceUnavailableException( e );
328 }
329 }
330
331
332
333
334 public AgreementTemplateType[] getTemplates()
335 throws ResourceUnavailableException, ResourceUnknownException
336 {
337 try
338 {
339 Element body =
340 XmlUtils.createElement( WsagConstants.WSRF_GET_RESOURCE_PROPERTY_QNAME, WsagConstants.PREFIX
341 + ":" + "Template" );
342 body.setAttribute( WsagConstants.WSAG_PREFIX_DECLARATION, WsagConstants.NAMESPACE_URI );
343
344 Element response = invoke( WsagConstants.WSRF_GET_RESOURCE_PROPERTY_ACTION, body );
345
346 AgreementTemplateType[] result = null;
347 AgreementFactoryPropertiesType props =
348 AgreementFactoryPropertiesType.Factory.parse( response,
349 new XmlOptions().setLoadReplaceDocumentElement( null ) );
350 result =
351 ( props.getTemplateArray() == null ) ? new AgreementTemplateType[0]
352 : props.getTemplateArray();
353
354 return result;
355 }
356 catch ( SoapFault e )
357 {
358 handleSoapFault( e );
359 throw new ResourceUnavailableException( e );
360 }
361 catch ( XmlException e )
362 {
363 throw new ResourceUnavailableException( e );
364 }
365 }
366
367
368
369
370 public String getResourceId() throws ResourceUnknownException, ResourceUnavailableException
371 {
372 try
373 {
374
375 Element body =
376 XmlUtils.createElement( WsagConstants.WSRF_GET_RESOURCE_PROPERTY_QNAME,
377 WsagConstants.WSDM_MUWS_PREFIX + ":" + "ResourceId" );
378 body.setAttribute( WsagConstants.WSDM_MUWS_PREFIX_DECLARATION,
379 WsagConstants.WSDM_MUWS_NAMESPACE_URI );
380
381 Element response = invoke( WsagConstants.WSRF_GET_RESOURCE_PROPERTY_ACTION, body );
382
383 String result = XmlString.Factory.parse( response ).getStringValue();
384 result = ( result == null ) ? "" : result.trim();
385
386 return result;
387
388 }
389 catch ( SoapFault e )
390 {
391 throw new ResourceUnavailableException( e );
392 }
393 catch ( XmlException e )
394 {
395 throw new ResourceUnavailableException( e );
396 }
397 }
398
399 private void handleSoapFault( SoapFault e ) throws ResourceUnavailableException, ResourceUnknownException
400 {
401 LOG.error( e.getMessage() );
402
403
404
405
406
407 if ( e.getSubCode().equals( new QName( WsaConstants.NAMESPACE_URI, "DestinationUnreachable" ) ) )
408 {
409 throw new ResourceUnknownException( e.getReason() );
410 }
411
412 throw new ResourceUnavailableException( e );
413 }
414
415 private void handleCreateAgreementFault( SoapFault e )
416 throws AgreementFactoryException, ResourceUnavailableException
417 {
418 LOG.error( e.getMessage() );
419
420 Element detail = e.getDetail();
421
422 try
423 {
424
425 XmlObject ex = XmlObject.Factory.parse( detail );
426 if ( ex instanceof ContinuingFaultDocument )
427 {
428 ContinuingFaultDocument result = (ContinuingFaultDocument) ex;
429 AgreementFactoryException afx =
430 new AgreementFactoryException( e.getMessage(), result.getContinuingFault() );
431
432 Throwable cause = afx.getCause();
433
434 while ( cause != null )
435 {
436 LOG.error( cause.getMessage() );
437 cause = cause.getCause();
438 }
439
440 throw afx;
441 }
442
443 if ( e.getSubCode().equals( new QName( WsaConstants.NAMESPACE_URI, "DestinationUnreachable" ) ) )
444 {
445 throw new AgreementFactoryException( new ResourceUnknownException( e.getReason() ) );
446 }
447
448 throw new ResourceUnavailableException( e );
449
450 }
451 catch ( XmlException e1 )
452 {
453 throw new ResourceUnavailableException( e );
454 }
455 }
456
457 }