1 7 8 package com.jaspersoft.jasperserver.irplugin.wsclient; 9 10 import java.io.ByteArrayInputStream ; 11 import java.io.ByteArrayOutputStream ; 12 import java.io.File ; 13 import java.io.FileOutputStream ; 14 import java.io.InputStream ; 15 import java.io.OutputStream ; 16 import java.io.StringReader ; 17 import java.io.StringWriter ; 18 import java.net.MalformedURLException ; 19 import java.net.URL ; 20 import java.util.ArrayList ; 21 import java.util.HashMap ; 22 import java.util.Iterator ; 23 import java.util.List ; 24 import java.util.Map ; 25 26 import javax.activation.DataHandler ; 27 import javax.xml.namespace.QName ; 28 29 import net.sf.jasperreports.engine.JasperPrint; 30 import net.sf.jasperreports.engine.util.JRLoader; 31 32 import org.apache.axiom.om.OMAbstractFactory; 33 import org.apache.axiom.om.OMElement; 34 import org.apache.axiom.om.OMNamespace; 35 import org.apache.axiom.om.OMText; 36 import org.apache.axiom.soap.SOAP12Constants; 37 import org.apache.axiom.soap.SOAPEnvelope; 38 import org.apache.axiom.soap.SOAPFactory; 39 import org.apache.axis2.AxisFault; 40 import org.apache.axis2.Constants; 41 import org.apache.axis2.addressing.EndpointReference; 42 import org.apache.axis2.client.OperationClient; 43 import org.apache.axis2.client.Options; 44 import org.apache.axis2.client.ServiceClient; 45 import org.apache.axis2.context.ConfigurationContext; 46 import org.apache.axis2.context.ConfigurationContextFactory; 47 import org.apache.axis2.context.MessageContext; 48 import org.apache.axis2.transport.http.HTTPConstants; 49 import org.apache.axis2.wsdl.WSDLConstants; 50 import org.apache.commons.httpclient.HttpClient; 51 import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; 52 import org.apache.commons.httpclient.UsernamePasswordCredentials; 53 import org.apache.commons.httpclient.auth.AuthScope; 54 import org.exolab.castor.xml.Marshaller; 55 import org.exolab.castor.xml.Unmarshaller; 56 57 import com.jaspersoft.jasperserver.api.metadata.xml.domain.impl.Argument; 58 import com.jaspersoft.jasperserver.api.metadata.xml.domain.impl.ListItem; 59 import com.jaspersoft.jasperserver.api.metadata.xml.domain.impl.OperationResult; 60 import com.jaspersoft.jasperserver.api.metadata.xml.domain.impl.Request; 61 import com.jaspersoft.jasperserver.api.metadata.xml.domain.impl.ResourceDescriptor; 62 import com.jaspersoft.jasperserver.irplugin.BinaryFileDataSource; 63 import com.jaspersoft.jasperserver.irplugin.JServer; 64 65 69 public class WSClient { 70 71 private JServer server = null; 72 73 private EndpointReference targetEPR = null; 75 private ServiceClient serviceClient; 76 77 public WSClient(JServer server) throws Exception { 78 this.server = server; 79 80 URL url; 81 try { 82 url = new URL (server.getUrl()); 83 } catch (MalformedURLException e1) { 84 throw new Exception (e1); 85 } 86 87 targetEPR = new EndpointReference(url.toString()); 88 serviceClient = null; 89 } 90 91 92 95 public java.util.List listDatasources() throws Exception { 96 97 Request req = new Request(); 98 99 req.setOperationName( Request.OPERATION_LIST); 100 req.setResourceDescriptor( null ); 101 102 req.getArguments().add(new Argument(Argument.LIST_DATASOURCES, Argument.VALUE_TRUE)); 103 104 StringWriter xmlStringWriter = new StringWriter (); 105 Marshaller.marshal(req, xmlStringWriter); 106 107 return list( xmlStringWriter.toString()); 108 } 109 110 113 public java.util.List list(ResourceDescriptor descriptor) throws Exception  114 { 115 Request req = new Request(); 116 117 req.setOperationName( Request.OPERATION_LIST); 118 req.setResourceDescriptor( descriptor); 119 120 StringWriter xmlStringWriter = new StringWriter (); 121 Marshaller.marshal(req, xmlStringWriter); 122 123 return list(xmlStringWriter.toString()); 124 } 125 126 129 public String getVersion() throws Exception  130 { 131 Request req = new Request(); 132 133 req.setOperationName( Request.OPERATION_LIST); 134 req.setResourceDescriptor( null ); 135 136 StringWriter xmlRequest = new StringWriter (); 137 Marshaller.marshal(req, xmlRequest); 138 139 OperationClient opClient = null; 140 MessageContext requestMessageContext = null; 141 142 try { 143 String opStr = "list"; 144 145 requestMessageContext = new MessageContext(); 146 java.util.SortedMap sm = new java.util.TreeMap (); 147 sm.put("request", xmlRequest.toString()); 148 requestMessageContext.setEnvelope(getRequestEnvelope(opStr, sm)); 149 150 opClient = getServiceClient().createClient(ServiceClient.ANON_OUT_IN_OP); 151 opClient.addMessageContext(requestMessageContext); 152 opClient.setOptions(getServiceClient().getOptions()); 153 154 opClient.execute(true); 155 156 SOAPEnvelope result = opClient.getMessageContext( 157 WSDLConstants.MESSAGE_LABEL_IN_VALUE).getEnvelope(); 158 159 OMElement resultOM = result.getBody().getFirstChildWithName(new QName ("result")); 160 StringReader xmlStringReader = new StringReader (resultOM.getText()); 162 OperationResult or = (OperationResult)Unmarshaller.unmarshal(OperationResult.class, xmlStringReader); 163 164 return or.getVersion(); 165 166 } catch (Exception ex) { 167 ex.printStackTrace(); 168 throw ex; 169 } finally { 170 if (opClient != null) { 171 if (requestMessageContext != null) { 172 opClient.complete(requestMessageContext); 173 } 174 opClient.reset(); 175 } 176 } 177 } 178 179 180 183 public java.util.List list(String xmlRequest) throws Exception { 184 OperationClient opClient = null; 185 MessageContext requestMessageContext = null; 186 187 try { 188 String opStr = "list"; 189 190 requestMessageContext = new MessageContext(); 191 java.util.SortedMap sm = new java.util.TreeMap (); 192 sm.put("request", xmlRequest); 193 requestMessageContext.setEnvelope(getRequestEnvelope(opStr, sm)); 194 195 opClient = getServiceClient().createClient(ServiceClient.ANON_OUT_IN_OP); 196 opClient.addMessageContext(requestMessageContext); 197 opClient.setOptions(getServiceClient().getOptions()); 198 199 opClient.execute(true); 200 201 SOAPEnvelope result = opClient.getMessageContext( 202 WSDLConstants.MESSAGE_LABEL_IN_VALUE).getEnvelope(); 203 204 OMElement resultOM = result.getBody().getFirstChildWithName(new QName ("result")); 205 StringReader xmlStringReader = new StringReader (resultOM.getText()); 207 OperationResult or = (OperationResult)Unmarshaller.unmarshal(OperationResult.class, xmlStringReader); 208 209 if (or.getReturnCode() != 0) throw new Exception ( or.getReturnCode() + " - " + or.getMessage() ); 210 211 return or.getResourceDescriptors(); 212 213 } catch (Exception ex) { 214 ex.printStackTrace(); 215 throw ex; 216 } finally { 217 if (opClient != null) { 218 if (requestMessageContext != null) { 219 opClient.complete(requestMessageContext); 220 } 221 opClient.reset(); 222 } 223 } 224 } 225 226 227 public void delete(ResourceDescriptor descriptor) throws Exception  228 { 229 delete(descriptor, null); 230 } 231 236 public void delete(ResourceDescriptor descriptor, String reportUnitUri) throws Exception { 237 OperationClient opClient = null; 238 MessageContext requestMessageContext = null; 239 try { 240 String opStr = "delete"; 241 242 Request req = new Request(); 243 244 req.setOperationName("delete"); 245 req.setResourceDescriptor( descriptor ); 246 247 req.getArguments().add(new Argument(Argument.MODIFY_REPORTUNIT, reportUnitUri )); 248 249 requestMessageContext = new MessageContext(); 250 java.util.SortedMap sm = new java.util.TreeMap (); 251 252 StringWriter xmlStringWriter = new StringWriter (); 253 Marshaller.marshal(req, xmlStringWriter); 254 255 sm.put("request", xmlStringWriter.toString()); 256 requestMessageContext.setEnvelope(getRequestEnvelope(opStr, sm)); 257 258 opClient = getServiceClient().createClient(ServiceClient.ANON_OUT_IN_OP); 259 opClient.addMessageContext(requestMessageContext); 260 opClient.setOptions(getServiceClient().getOptions()); 261 262 opClient.execute(true); 263 264 SOAPEnvelope result = opClient.getMessageContext( 265 WSDLConstants.MESSAGE_LABEL_IN_VALUE).getEnvelope(); 266 267 OMElement resultOM = result.getBody().getFirstChildWithName(new QName ("result")); 268 StringReader xmlStringReader = new StringReader (resultOM.getText()); 270 OperationResult or = (OperationResult)Unmarshaller.unmarshal(OperationResult.class, xmlStringReader); 271 272 if (or.getReturnCode() != 0) throw new Exception ( or.getReturnCode() + " - " + or.getMessage() ); 273 274 } catch (Exception ex) { 275 ex.printStackTrace(); 276 throw ex; 277 } finally { 278 if (opClient != null) { 279 if (requestMessageContext != null) { 280 opClient.complete(requestMessageContext); 281 } 282 opClient.reset(); 283 } 284 } 285 } 286 287 294 public ResourceDescriptor get(ResourceDescriptor descriptor, File outputFile) throws Exception  295 { 296 return get(descriptor, outputFile, null); 297 } 298 305 public ResourceDescriptor get(ResourceDescriptor descriptor, File outputFile, java.util.List args) throws Exception  306 { 307 OperationClient opClient = null; 308 MessageContext requestMessageContext = null; 309 try { 310 String opStr = "get"; 311 312 Request req = new Request(); 313 314 req.setOperationName("get"); 315 req.setResourceDescriptor( descriptor ); 316 317 if (args != null) 318 { 319 for (int i=0; i<args.size(); ++i) 320 { 321 Argument arg = (Argument)args.get(i); 322 req.getArguments().add(arg); 323 } 324 } 325 326 if (outputFile == null) 327 { 328 req.getArguments().add("NO_ATTACHMENT"); 329 } 330 331 requestMessageContext = new MessageContext(); 332 java.util.SortedMap sm = new java.util.TreeMap (); 333 334 StringWriter xmlStringWriter = new StringWriter (); 335 Marshaller.marshal(req, xmlStringWriter); 336 337 sm.put("request", xmlStringWriter.toString()); 338 requestMessageContext.setEnvelope(getRequestEnvelope(opStr, sm)); 339 340 opClient = getServiceClient().createClient(ServiceClient.ANON_OUT_IN_OP); 341 opClient.addMessageContext(requestMessageContext); 342 343 Options options = new Options(getServiceClient().getOptions()); 344 options.setSoapVersionURI(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI); 345 options.setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE); 347 options.setTransportInProtocol(Constants.TRANSPORT_HTTP); 348 349 opClient.setOptions(options); 350 351 opClient.execute(true); 352 353 SOAPEnvelope result = opClient.getMessageContext( 354 WSDLConstants.MESSAGE_LABEL_IN_VALUE).getEnvelope(); 355 356 OMElement resultOM = result.getBody().getFirstChildWithName(new QName ("result")); 357 358 StringReader xmlStringReader = new StringReader (resultOM.getText()); 360 OperationResult or = (OperationResult)Unmarshaller.unmarshal(OperationResult.class, xmlStringReader); 361 362 if (or.getReturnCode() != 0) throw new Exception ( or.getReturnCode() + " - " + or.getMessage() ); 363 364 OMElement attachmentElement = resultOM.getFirstChildWithName(new QName ("attachment")); 365 366 367 if (attachmentElement != null && outputFile != null) 368 { 369 OMText binaryNode = (OMText)attachmentElement.getFirstOMChild(); 370 DataHandler actualDH; 371 actualDH = (DataHandler )binaryNode.getDataHandler(); 372 373 byte[] buffer = new byte[1024]; 375 InputStream is = actualDH.getInputStream(); 376 OutputStream os = new FileOutputStream (outputFile); 377 int bCount = 0; 378 while ( (bCount = is.read(buffer)) > 0) 379 { 380 os.write( buffer, 0, bCount); 381 } 382 is.close(); 383 os.close(); 384 } 385 else if (outputFile != null) 386 { 387 throw new Exception ("attachment nullo!" + attachmentElement); 388 } 389 390 return (ResourceDescriptor)or.getResourceDescriptors().get(0); 391 392 } catch (Exception ex) { 393 ex.printStackTrace(); 394 throw ex; 395 } finally { 396 if (opClient != null) { 397 if (requestMessageContext != null) { 398 opClient.complete(requestMessageContext); 399 } 400 opClient.reset(); 401 } 402 } 403 404 } 405 406 public JasperPrint runReport(ResourceDescriptor descriptor, java.util.Map parameters) throws Exception { 407 List args = new ArrayList (1); 408 args.add(new Argument(Argument.RUN_OUTPUT_FORMAT, Argument.RUN_OUTPUT_FORMAT_JRPRINT)); 409 Map attachments = runReport(descriptor, parameters, args); 410 411 FileContent content = null; 412 if (attachments != null && !attachments.isEmpty()) { 413 content = (FileContent) attachments.get("jasperPrint"); 414 } 415 416 if (content == null) { 417 throw new Exception ("No JasperPrint"); 418 } 419 420 InputStream is = new ByteArrayInputStream (content.getData()); 421 422 JasperPrint print = (JasperPrint) JRLoader.loadObject(is); 423 return print; 424 } 425 426 451 public Map runReport(ResourceDescriptor descriptor, java.util.Map parameters, List args) throws Exception  452 { 453 OperationClient opClient = null; 454 MessageContext requestMessageContext = null; 455 try { 456 String opStr = "runReport"; 457 458 Request req = new Request(); 459 460 req.setOperationName("runReport"); 461 ResourceDescriptor newRUDescriptor = new ResourceDescriptor(); 462 newRUDescriptor.setUriString(descriptor.getUriString() ); 463 for (Iterator i= parameters.keySet().iterator(); i.hasNext() ;) 464 { 465 String key = ""+i.next(); 466 newRUDescriptor.getChildren().add( new ListItem(key+"",parameters.get( key ))); 467 } 468 469 req.setResourceDescriptor( newRUDescriptor ); 470 req.getArguments().addAll(args); 471 472 requestMessageContext = new MessageContext(); 473 java.util.SortedMap sm = new java.util.TreeMap (); 474 475 StringWriter xmlStringWriter = new StringWriter (); 476 Marshaller.marshal(req, xmlStringWriter); 477 478 sm.put("request", xmlStringWriter.toString()); 479 requestMessageContext.setEnvelope(getRequestEnvelope(opStr, sm)); 480 481 opClient = getServiceClient().createClient(ServiceClient.ANON_OUT_IN_OP); 482 opClient.addMessageContext(requestMessageContext); 483 484 Options options = new Options(getServiceClient().getOptions()); 485 options.setSoapVersionURI(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI); 486 options.setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE); 488 options.setTransportInProtocol(Constants.TRANSPORT_HTTP); 489 490 opClient.setOptions(options); 491 492 opClient.execute(true); 493 494 SOAPEnvelope result = opClient.getMessageContext( 495 WSDLConstants.MESSAGE_LABEL_IN_VALUE).getEnvelope(); 496 497 OMElement resultOM = result.getBody().getFirstChildWithName(new QName ("result")); 498 499 StringReader xmlStringReader = new StringReader (resultOM.getText()); 501 OperationResult or = (OperationResult)Unmarshaller.unmarshal(OperationResult.class, xmlStringReader); 502 503 if (or.getReturnCode() != 0) throw new Exception ( or.getReturnCode() + " - " + or.getMessage() ); 504 505 Map results = new HashMap (); 506 507 for (Iterator it = resultOM.getChildElements(); it.hasNext(); ) { 508 OMElement attachmentElement = (OMElement) it.next(); 510 511 if (attachmentElement != null) 512 { 513 OMText binaryNode = (OMText) attachmentElement.getFirstOMChild(); 514 515 String name = attachmentElement.getQName().getLocalPart(); 516 517 DataHandler actualDH = (DataHandler ) binaryNode.getDataHandler(); 518 519 InputStream is = actualDH.getInputStream(); 520 ByteArrayOutputStream bos = new ByteArrayOutputStream (); 521 522 byte[] data = new byte[1000]; 523 int bytesRead; 524 525 while ((bytesRead = is.read(data)) != -1) { 526 bos.write(data, 0, bytesRead); 527 } 528 529 data = bos.toByteArray(); 530 531 String contentType = actualDH.getContentType(); 532 533 FileContent content = new FileContent(); 534 content.setData(data); 535 content.setMimeType(contentType); 536 content.setName(name); 537 538 results.put(name, content); 539 540 } 541 else 542 { 543 throw new Exception ("attachment nullo!" + attachmentElement); 544 } 545 } 546 return results; 547 } catch (Exception ex) { 548 ex.printStackTrace(); 549 throw ex; 550 } finally { 551 if (opClient != null) { 552 if (requestMessageContext != null) { 553 opClient.complete(requestMessageContext); 554 } 555 opClient.reset(); 556 } 557 } 558 559 } 560 561 562 566 public ResourceDescriptor addOrModifyResource(ResourceDescriptor descriptor, File inputFile) throws Exception  567 { 568 return modifyReportUnitResource(null, descriptor, inputFile); 569 } 570 571 public static SOAPEnvelope getRequestEnvelope(String operationName, java.util.SortedMap params) { 572 return getRequestEnvelope(operationName, params, null); 573 } 574 575 public static SOAPEnvelope getRequestEnvelope(String operationName, java.util.SortedMap params, File attachment) { 576 SOAPFactory fac = OMAbstractFactory.getSOAP11Factory(); 577 SOAPEnvelope envelope = fac.getDefaultEnvelope(); 578 OMNamespace namespace = fac.createOMNamespace( 579 "http://jasperserver/test/namespace1", "ns1"); 580 581 OMElement o_params = fac.createOMElement(operationName, namespace); 582 583 Iterator iterator = params.keySet().iterator(); 584 while (iterator.hasNext()) { 585 586 String pName = ""+iterator.next(); 587 OMElement param1OM = fac.createOMElement(pName, namespace); 588 Object o = params.get(pName); 589 if ((o!=null)) 590 { 591 param1OM.setText( o.toString() ); 592 } 593 594 597 599 o_params.addChild(param1OM); 600 } 601 if (attachment != null && attachment.exists()) 602 { 603 BinaryFileDataSource fds = new BinaryFileDataSource(attachment); 604 DataHandler expectedDH = new DataHandler ( fds ); 605 606 OMText textData = fac.createOMText(expectedDH, true); 607 OMElement dataElement = fac.createOMElement("attachment",namespace); 608 textData.setOptimize(true); 609 dataElement.addChild(textData); 610 o_params.addChild(dataElement); 611 } 612 envelope.getBody().setFirstChild(o_params); 613 return envelope; 614 } 615 616 617 public void setTargetEPR(String targetEPR) { 618 this.targetEPR = new EndpointReference(targetEPR); 619 620 } 621 622 public JServer getServer() { 623 return server; 624 } 625 626 public void setServer(JServer server) { 627 this.server = server; 628 } 629 630 public String getUsername() { 631 return getServer().getUsername(); 632 } 633 634 public String getPassword() { 635 return getServer().getPassword(); 636 } 637 638 public ServiceClient getServiceClient() throws AxisFault { 639 if (serviceClient == null) 640 { 641 ConfigurationContext context; 642 context = ConfigurationContextFactory.createConfigurationContextFromFileSystem(null, null); 643 644 HttpClient httpClient = new HttpClient(new MultiThreadedHttpConnectionManager()); 645 httpClient.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(getUsername(), getPassword())); 646 httpClient.getParams().setAuthenticationPreemptive(true); 647 context.setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient); 648 649 serviceClient = new ServiceClient(context, null); 650 651 serviceClient.getOptions().setManageSession(true); 653 serviceClient.getOptions().setTo(targetEPR); 654 serviceClient.getOptions().setProperty(HTTPConstants.REUSE_HTTP_CLIENT, new Boolean (true)); 655 } 656 return serviceClient; 657 } 658 659 public void setServiceClient(ServiceClient serviceClient) { 660 this.serviceClient = serviceClient; 661 } 662 663 public EndpointReference getTargetEPR() { 664 return targetEPR; 665 } 666 667 public void setTargetEPR(EndpointReference targetEPR) { 668 this.targetEPR = targetEPR; 669 } 670 671 public ResourceDescriptor modifyReportUnitResource(String reportUnitUri, ResourceDescriptor descriptor, File inputFile) throws Exception  672 { 673 OperationClient opClient = null; 674 MessageContext requestMessageContext = null; 675 try { 676 String opStr = "put"; 677 678 Request req = new Request(); 679 680 req.setOperationName("put"); 681 req.getArguments().add(new Argument(Argument.MODIFY_REPORTUNIT, reportUnitUri )); 682 683 if (inputFile != null) 684 { 685 descriptor.setHasData(true); 686 } 687 688 req.setResourceDescriptor( descriptor ); 689 690 requestMessageContext = new MessageContext(); 691 java.util.SortedMap sm = new java.util.TreeMap (); 692 693 StringWriter xmlStringWriter = new StringWriter (); 694 Marshaller.marshal(req, xmlStringWriter); 695 696 sm.put("request", xmlStringWriter.toString()); 697 698 requestMessageContext.setEnvelope(getRequestEnvelope(opStr, sm, inputFile)); 699 700 opClient = getServiceClient().createClient(ServiceClient.ANON_OUT_IN_OP); 701 opClient.addMessageContext(requestMessageContext); 702 703 Options options = new Options(getServiceClient().getOptions()); 704 options.setSoapVersionURI(SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI); 705 options.setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE); 707 options.setTransportInProtocol(Constants.TRANSPORT_HTTP); 708 709 opClient.setOptions(options); 710 711 opClient.execute(true); 712 713 SOAPEnvelope result = opClient.getMessageContext( 714 WSDLConstants.MESSAGE_LABEL_IN_VALUE).getEnvelope(); 715 716 OMElement resultOM = result.getBody().getFirstChildWithName(new QName ("result")); 717 718 StringReader xmlStringReader = new StringReader (resultOM.getText()); 720 OperationResult or = (OperationResult)Unmarshaller.unmarshal(OperationResult.class, xmlStringReader); 721 722 if (or.getReturnCode() != 0) throw new Exception ( or.getReturnCode() + " - " + or.getMessage() ); 723 724 return (ResourceDescriptor)or.getResourceDescriptors().get(0); 725 726 } catch (Exception ex) { 727 ex.printStackTrace(); 728 throw ex; 729 } finally { 730 if (opClient != null) { 731 if (requestMessageContext != null) { 732 opClient.complete(requestMessageContext); 733 } 734 opClient.reset(); 735 } 736 } 737 738 } 739 } | Popular Tags |