1 3 11 package com.sun.enterprise.jbi.serviceengine.util.soap; 12 13 import java.io.ByteArrayInputStream ; 14 import java.io.ByteArrayOutputStream ; 15 import java.io.IOException ; 16 import java.io.OutputStreamWriter ; 17 import java.io.StringWriter ; 18 import java.io.Writer ; 19 20 import java.util.Iterator ; 21 import java.util.logging.Level ; 22 import java.util.logging.Logger ; 23 24 import javax.jbi.messaging.Fault; 25 import javax.jbi.messaging.NormalizedMessage; 26 27 import javax.xml.soap.MessageFactory ; 28 import javax.xml.soap.SOAPException ; 29 import javax.xml.soap.SOAPMessage ; 30 import javax.xml.soap.SOAPHeader ; 31 import javax.xml.soap.AttachmentPart ; 32 import javax.xml.transform.Result ; 33 import javax.xml.transform.Source ; 34 import javax.xml.transform.Transformer ; 35 import javax.xml.transform.TransformerFactory ; 36 import javax.xml.transform.dom.DOMSource ; 37 import javax.xml.transform.stream.StreamResult ; 38 import javax.xml.transform.stream.StreamSource ; 39 40 import javax.activation.DataHandler ; 41 42 import java.util.logging.Logger ; 43 44 50 public class MessageDenormalizerImpl implements MessageDenormalizer 51 { 52 55 private static final String PAYLOAD_NAMESPACE_PREFIX = "jbisb0"; 56 57 60 private static final String SOAP_NAMESPACE_PREFIX = "soap"; 61 62 65 private static final String XML_SCHEMA_INSTANCE_NAMESPACE_PREFIX = "xsi"; 66 67 70 private MessageFactory mMessageFactory; 71 72 75 private Logger mLogger; 76 77 80 private StringTranslator mStringTranslator; 81 82 85 private Transformer mTransformer; 86 87 90 public MessageDenormalizerImpl() 91 { 92 try 93 { 94 mLogger = Logger.getLogger(this.getClass().getPackage().getName()); 95 mStringTranslator = new StringTranslator(this.getClass().getPackage().getName(), this.getClass().getClassLoader()); 96 mMessageFactory = MessageFactory.newInstance(); 97 98 TransformerFactory transformerFactory = TransformerFactory.newInstance(); 99 mTransformer = transformerFactory.newTransformer(); 100 mTransformer.setOutputProperty("method", "xml"); 101 mTransformer.setOutputProperty("omit-xml-declaration", "yes"); 102 } 103 catch (Exception exception) 104 { 105 mLogger.severe( mStringTranslator.getString("SBC_MESSAGE_FACTORY_CREATION_FAILURE") ); 108 mLogger.severe( mStringTranslator.getString("SBC_ERROR_DETAILS", exception.toString()) ); 109 mMessageFactory = null; 110 mTransformer = null; 111 } 112 } 113 114 128 public SOAPWrapper denormalizeMessage( 129 NormalizedMessage normalizedMessage, Operation operation, boolean isResponse) 130 { 131 SOAPWrapper wrapper = null; 132 Writer writer = null; 133 mLogger.fine( mStringTranslator.getString("SBC_DENORMALIZE_JBI_MESSAGE") ); 134 135 try 136 { 137 ByteArrayOutputStream bufferedStream = new ByteArrayOutputStream (); 139 writer = new OutputStreamWriter (bufferedStream, "UTF-8"); 140 141 writeEnvelopeHeader(writer); 142 143 if ( normalizedMessage != null) 144 { 145 writeHeader(normalizedMessage, writer); 147 } 148 149 writeBody(normalizedMessage, operation, isResponse, writer); 151 writeEnvelopeFooter(writer); 152 writer.flush(); 153 154 SOAPMessage soapMessage = createSOAPMessage(bufferedStream); 156 157 denormalizeAttachments ( soapMessage, normalizedMessage); 159 wrapper = new SOAPWrapper(soapMessage); 161 162 if (normalizedMessage instanceof Fault) 163 { 164 wrapper.setStatus(SOAPConstants.JBI_FAULT); 165 } 166 else 167 { 168 wrapper.setStatus(SOAPConstants.JBI_SUCCESS); 169 } 170 } 171 catch (RuntimeException runtimeException) 172 { 173 mLogger.severe( mStringTranslator.getString("SBC_DENORMALIZE_JBI_MESSAGE_FAILURE_RT_EXP") ); 174 wrapper = denormalizeMessage(runtimeException); 176 } 177 catch (Exception exception) 178 { 179 mLogger.warning( mStringTranslator.getString("SBC_DENORMALIZE_JBI_MESSAGE_FAILURE_EXP") ); 180 mLogger.warning( mStringTranslator.getString("SBC_ERROR_DETAILS", exception.toString()) ); 181 mLogger.warning( mStringTranslator.getString("SBC_CREATE_SOAP_FAULT") ); 182 183 wrapper = denormalizeMessage(exception); 185 } 186 finally 187 { 188 closeWriter(writer); 189 } 190 191 mLogger.fine( mStringTranslator.getString("SBC_SUCCESS_DENORMALIZE_JBI_MESSAGE") ); 192 193 return wrapper; 194 } 195 196 204 public SOAPWrapper denormalizeMessage(Exception exception) 205 { 206 return denormalizeMessage(exception, SOAPConstants.SERVER_FAULT_CODE); 207 } 208 209 218 public SOAPWrapper denormalizeMessage(Exception exception, String faultCode) 219 { 220 SOAPWrapper wrapper = null; 221 Writer writer = null; 222 223 mLogger.fine( mStringTranslator.getString("SBC_DENORMALIZE_EXCEPTION") ); 224 225 try 226 { 227 ByteArrayOutputStream bufferedStream = new ByteArrayOutputStream (); 229 writer = new OutputStreamWriter (bufferedStream, "UTF-8"); 230 231 if (exception == null) 232 { 233 mLogger.warning( mStringTranslator.getString("SBC_NULL_OBJECT_DENORMALIZATION") ); 234 } 235 236 writeEnvelopeHeader(writer); 237 writer.write("<" + SOAP_NAMESPACE_PREFIX + ":Body>"); 238 writeFault(exception, faultCode, writer); 239 writer.write("</" + SOAP_NAMESPACE_PREFIX + ":Body>"); 240 writeEnvelopeFooter(writer); 241 writer.flush(); 242 243 SOAPMessage soapMessage = createSOAPMessage(bufferedStream); 245 246 wrapper = new SOAPWrapper(soapMessage); 248 wrapper.setStatus(SOAPConstants.JBI_ERROR); 249 } 250 catch (RuntimeException runtimeException) 251 { 252 mLogger.severe( mStringTranslator.getString( "SBC_SOAP_FAULT_GENERATION_FAILURE_RT_EXP") ); 253 } 254 catch (Exception denormalizationException) 255 { 256 mLogger.severe( mStringTranslator.getString("SBC_SOAP_FAULT_GENERATION_FAILURE") ); 258 } 259 finally 260 { 261 closeWriter(writer); 262 } 263 264 mLogger.fine( mStringTranslator.getString("SBC_SUCCESS_DENORMALIZE_EXCEPTION") ); 265 266 return wrapper; 267 } 268 269 281 protected void writeBody( 282 NormalizedMessage normalizedMessage, Operation operation, boolean isResponse, 283 Writer writer) throws Exception 284 { 285 StringWriter stringWriter = null; 286 287 try 288 { 289 boolean isEmptyResponse = isResponse && ( normalizedMessage == null ); 290 writeBodyHeader(operation, writer, isEmptyResponse); 292 if ( normalizedMessage != null) 293 { 294 stringWriter = new StringWriter (); 295 Result result = new StreamResult (stringWriter); 296 mTransformer.transform(normalizedMessage.getContent(), result); 297 writer.write(stringWriter.toString()); 298 } 299 writeBodyFooter(operation, writer, isEmptyResponse); 300 writer.flush(); 301 } 302 finally 303 { 304 closeWriter(stringWriter); 305 } 306 } 307 308 319 protected void writeHeader(NormalizedMessage normalizedMessage, Writer writer) 320 throws Exception 321 { 322 SOAPHeader soapHeader = 324 (SOAPHeader ) normalizedMessage.getProperty( 325 SOAPConstants.HEADER_PROPERTY_NAME ); 326 StringWriter stringWriter = null; 327 328 if ( soapHeader != null) 329 { 330 try 331 { 332 stringWriter = new StringWriter (); 333 334 Source source = new DOMSource ( soapHeader ); 335 Result result = new StreamResult (stringWriter); 336 mTransformer.transform(source, result); 337 338 writer.write("<" + SOAP_NAMESPACE_PREFIX + ":Header>"); 340 writer.write(stringWriter.toString()); 341 writer.write("</" + SOAP_NAMESPACE_PREFIX + ":Header>"); 342 writer.flush(); 343 } 344 finally 345 { 346 closeWriter(stringWriter); 347 } 348 } 349 else 350 { 351 mLogger.fine( mStringTranslator.getString("SBC_NO_HEADER") ); 352 } 353 } 354 355 365 protected void writeBodyHeader( 366 Operation operation, Writer writer, boolean isEmptyResponse) 367 throws Exception 368 { 369 writer.write("<" + SOAP_NAMESPACE_PREFIX + ":Body>"); 370 371 if ( isEmptyResponse) 372 { 373 writer.write("<" + PAYLOAD_NAMESPACE_PREFIX + ":"); 374 writer.write(operation.getName() + "Response"); 375 writer.write(" xmlns:" + PAYLOAD_NAMESPACE_PREFIX + "=\""); 376 writer.write(operation.getOutputNamespace() + "\""); 377 writer.write(">"); 378 } 379 380 writer.flush(); 381 } 382 383 393 protected void writeBodyFooter( 394 Operation operation, Writer writer, boolean isEmptyResponse) 395 throws Exception 396 { 397 398 if ( isEmptyResponse ) 399 { 400 writer.write("</" + PAYLOAD_NAMESPACE_PREFIX + ":"); 401 writer.write(operation.getName() + "Response>"); 402 } 403 writer.write("</" + SOAP_NAMESPACE_PREFIX + ":Body>"); 404 writer.flush(); 405 } 406 407 418 protected SOAPMessage createSOAPMessage(ByteArrayOutputStream byteStream) 419 throws SOAPException , IOException 420 { 421 if (mLogger.isLoggable(Level.FINEST)) 422 { 423 mLogger.finest( mStringTranslator.getString("SBC_DEONRMALIZED_MESSAGE_DETAILS", byteStream.toString()) ); 424 } 425 426 SOAPMessage soapMessage = mMessageFactory.createMessage(); 428 429 byte[] data = byteStream.toByteArray(); 431 ByteArrayInputStream soapInputStream = new ByteArrayInputStream (data); 432 StreamSource streamSource = new StreamSource (soapInputStream); 433 soapMessage.getSOAPPart().setContent(streamSource); 434 soapInputStream.close(); 435 436 return soapMessage; 437 } 438 439 445 protected void closeWriter(Writer writer) 446 { 447 if (writer != null) 448 { 449 try 450 { 451 writer.close(); 452 } 453 catch (Exception ioException) 454 { 455 mLogger.warning( mStringTranslator.getString("SBC_CLOSE_OUTPUT_STREAM") ); 457 mLogger.warning( mStringTranslator.getString("SBC_ERROR_DETAILS", ioException.toString()) ); 458 } 459 } 460 } 461 462 470 protected void writeEnvelopeHeader(Writer writer) throws IOException 471 { 472 writer.write( 474 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<" + SOAP_NAMESPACE_PREFIX + 475 ":Envelope xmlns:" + SOAP_NAMESPACE_PREFIX + 476 "=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:" + 477 XML_SCHEMA_INSTANCE_NAMESPACE_PREFIX + 478 "=\"http://www.w3.org/2001/XMLSchema-instance\">"); 479 writer.flush(); 480 } 481 482 490 protected void writeEnvelopeFooter(Writer writer) throws IOException 491 { 492 writer.write("</" + SOAP_NAMESPACE_PREFIX + ":Envelope>"); 493 writer.flush(); 494 } 495 496 506 protected void writeFault(Exception exception, String faultCode, Writer writer) 507 throws IOException 508 { 509 writer.write( 510 "<" + SOAP_NAMESPACE_PREFIX + ":Fault><faultcode>" + SOAP_NAMESPACE_PREFIX + 511 ":" + faultCode + "</faultcode>"); 512 513 if (exception != null) 514 { 515 writer.write("<faultstring>" + 516 sanitizeMessage(exception.getMessage()) + "</faultstring>"); 517 } 518 519 writer.write("</" + SOAP_NAMESPACE_PREFIX + ":Fault>"); 520 writer.flush(); 521 } 522 523 531 public SOAPWrapper denormalizeFaultMessage(Fault faultMessage) 532 { 533 return denormalizeFaultMessage(faultMessage, SOAPConstants.SERVER_FAULT_CODE); 534 } 535 536 544 public SOAPWrapper denormalizeFaultMessage(Fault faultMessage, String faultCode) 545 { 546 SOAPWrapper wrapper = null; 547 Writer writer = null; 548 549 mLogger.fine( mStringTranslator.getString("SBC_DENORMALIZE_FAULT_MESSAGE") ); 550 551 try 552 { 553 ByteArrayOutputStream bufferedStream = new ByteArrayOutputStream (); 555 String messageFaultCode = (String ) faultMessage.getProperty( 556 SOAPConstants.FAULT_CODE_PROPERTY_NAME); 557 String faultString = (String ) faultMessage.getProperty( 558 SOAPConstants.FAULT_STRING_PROPERTY_NAME); 559 560 if ( messageFaultCode != null ) 561 { 562 faultCode = messageFaultCode; 564 } 565 566 if ( faultString == null ) 567 { 568 faultString = mStringTranslator.getString("SBC_DEFAULT_FAULT_STRING"); 569 } 570 writer = new OutputStreamWriter (bufferedStream, "UTF-8"); 571 writeEnvelopeHeader(writer); 572 writer.write("<" + SOAP_NAMESPACE_PREFIX + ":Body>"); 573 writer.write( 574 "<" + SOAP_NAMESPACE_PREFIX + ":Fault " + 575 XML_SCHEMA_INSTANCE_NAMESPACE_PREFIX + ":type=\"" + 576 SOAP_NAMESPACE_PREFIX + ":Fault\"" + "><faultcode>" + 577 SOAP_NAMESPACE_PREFIX + ":" + faultCode + "</faultcode>"); 578 writer.write("<faultstring>" + faultString + "</faultstring>"); 579 writeFaultDetail(faultMessage, writer); 580 writer.write("</" + SOAP_NAMESPACE_PREFIX + ":Fault>"); 581 writer.write("</" + SOAP_NAMESPACE_PREFIX + ":Body>"); 582 writeEnvelopeFooter(writer); 583 writer.flush(); 584 585 SOAPMessage soapMessage = createSOAPMessage(bufferedStream); 587 588 wrapper = new SOAPWrapper(soapMessage); 590 wrapper.setStatus(SOAPConstants.JBI_FAULT); 591 } 592 catch (RuntimeException runtimeException) 593 { 594 mLogger.severe( mStringTranslator.getString( "SBC_SOAP_FAULT_GENERATION_FAILURE_RT_EXP") ); 595 } 596 catch (Exception exception) 597 { 598 mLogger.severe( mStringTranslator.getString("SBC_SOAP_FAULT_GENERATION_FAILURE") ); 600 } 601 finally 602 { 603 closeWriter(writer); 604 } 605 606 mLogger.fine( mStringTranslator.getString("SBC_SUCCESS_DENORMALIZE_FAULT") ); 607 608 return wrapper; 609 } 610 611 619 private void writeFaultDetail(Fault faultMessage, Writer writer) 620 throws Exception 621 { 622 StringWriter stringWriter = null; 623 624 try 625 { 626 stringWriter = new StringWriter (); 627 628 Result result = new StreamResult (stringWriter); 629 mTransformer.transform(faultMessage.getContent(), result); 630 631 String detailString = stringWriter.toString().trim(); 633 634 if (!detailString.equals("")) 635 { 636 writer.write("<detail>"); 637 writer.write(detailString); 638 writer.write("</detail>"); 639 writer.flush(); 640 } 641 } 642 finally 643 { 644 closeWriter(stringWriter); 645 } 646 } 647 648 655 protected String sanitizeMessage(String errorMessage) 656 { 657 StringBuffer sanitizedBuffer = new StringBuffer (); 658 659 for (int i = 0; (errorMessage != null) && (i < errorMessage.length()); i++) 660 { 661 char currentChar = errorMessage.charAt(i); 662 663 switch (currentChar) 664 { 665 case '"': 666 sanitizedBuffer.append("""); 667 668 break; 669 670 case '&': 671 sanitizedBuffer.append("&"); 672 673 break; 674 675 case '<': 676 sanitizedBuffer.append("<"); 677 678 break; 679 680 case '>': 681 sanitizedBuffer.append(">"); 682 683 break; 684 685 default: 686 sanitizedBuffer.append(currentChar); 687 } 688 } 689 690 if (errorMessage == null) 691 { 692 return "INTERNAL SERVER ERROR"; 693 } 694 else 695 { 696 return sanitizedBuffer.toString(); 697 } 698 } 699 700 707 private void denormalizeAttachments ( SOAPMessage soapMessage, 708 NormalizedMessage normalizedMessage) 709 { 710 if ( normalizedMessage != null ) 711 { 712 Iterator attachmentIter = normalizedMessage.getAttachmentNames().iterator(); 713 for (; attachmentIter.hasNext();) 714 { 715 String attachmentIdentifier = (String ) attachmentIter.next(); 716 DataHandler dataHandler = 717 normalizedMessage.getAttachment( attachmentIdentifier); 718 AttachmentPart attachment = 719 soapMessage.createAttachmentPart( dataHandler); 720 attachment.setContentId ( attachmentIdentifier); 721 attachment.setContentType ( dataHandler.getContentType()); 722 soapMessage.addAttachmentPart ( attachment ); 723 } 724 } 725 } 726 } 727 | Popular Tags |