| Interstage Application Server SOAPサービス ユーザーズガイド |
目次
索引
![]()
|
| 第4章 Messaging方式のアプリケーションの実装 | > 4.1 受信アプリケーションの作成 |
添付ファイルは、SOAPメッセージに付加できる添付データです。Oneway方式、RequestResponse方式のいずれの受信アプリケーションも、添付ファイルを使用できます。
以下にサンプルプログラムSampleMsgSV3useAttachment.javaの例を用いて処理を説明します。

import javax.xml.soap.*;
import javax.xml.messaging.*;
import java.util.*;
import java.io.*;
import java.awt.Image;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
public class SampleMsgSV3useAttachment implements ReqRespListener //**(1)**
{
public SampleMsgSV3useAttachment () { }
public SOAPMessage onMessage( SOAPMessage message )
{
// Windowsの場合
String basePath = "C:\\temp\\";
// Solaris OE, Linuxの場合
String basePath = "/tmp/";
Hashtable _attachments = new Hashtable();
try{
//**(2)**
Iterator _i = message.getAttachments();
int _num = 0;
while(_i.hasNext()){
StringBuffer _name = new StringBuffer();
AttachmentPart _at = (AttachmentPart)_i.next();
Object _content = _at.getContent();
String _contentType = _at.getContentType();
if ( _contentType == null ) {
return makeFault( "Server.Internal",
"attachment has no content type." );
}
_contentType = _contentType.toLowerCase();
_name.append("attachment").append(_num++);
//**(3)**
if( _content instanceof String ){
String _data = (String)_content;
_name.append(".txt");
FileOutputStream atFile =
new FileOutputStream(basePath+_name);
atFile.write(_data.getBytes("UTF-8"));
atFile.close();
_attachments.put( new String(basePath+_name),
_at.getContentType());
}
//**(4)**
else if ( _contentType.startsWith( "text/xml" )
|| _contentType.startsWith( "application/xml" ) ) {
StreamSource _source = ( StreamSource ) _at.getContent();
_name.append(".xml");
FileOutputStream atFile =
new FileOutputStream(basePath+_name);
InputStream _is = _source.getInputStream();
byte[] _ba = new byte[_is.available()];
_is.read(_ba);
atFile.write(_ba);
atFile.close();
_attachments.put( new String(basePath+_name),
_at.getContentType());
}
//**(5)**
else if ( _contentType.startsWith( "image/jpeg" ) ) {
Image _image = (Image)_content;
_name.append(".jpeg");
FileOutputStream atFile =
new FileOutputStream(basePath+_name);
DataHandler _imageHandler = _at.getDataHandler();
_imageHandler.writeTo( atFile );
atFile.close();
_attachments.put( new String(basePath+_name),
_at.getContentType());
}
else{
return makeFault( "Server.Internal",
"unexpected attachment type.");
}
}//while
//**(6)**
MessageFactory mf = MessageFactory.newInstance();
SOAPMessage resp = mf.createMessage();
SOAPEnvelope env = resp.getSOAPPart().getEnvelope();
SOAPBody body = env.getBody();
SOAPBodyElement elm = body.addBodyElement(
env.createName( "ResponseBody", "m", "urn:Sample1" ));
elm.addChildElement( env.createName("Response")).addTextNode("response string...");
//**(7)**
Enumeration _e = _attachments.keys();
while(_e.hasMoreElements()) {
String _path = (String)_e.nextElement();
String _mime = (String)_attachments.get(_path);
FileDataSource _fds = new FileDataSource(_path);
AttachmentPart _ap = resp.createAttachmentPart(
new DataHandler(_fds));
_ap.setContentType(_mime);
resp.addAttachmentPart(_ap);
}
resp.saveChanges();
return resp;
} catch( Exception e ) {
e.printStackTrace();
return makeFault( "Server.Internal", e.toString());
}
}
public SOAPMessage makeFault(String faultCode,String faultString )
{
try{
MessageFactory mf = MessageFactory.newInstance();
SOAPMessage resp = mf.createMessage();
SOAPEnvelope env = resp.getSOAPPart().getEnvelope();
SOAPBody body = env.getBody();
SOAPFault fault = body.addFault();
fault.setFaultCode(faultCode);
fault.setFaultString(faultString);
resp.saveChanges();
return resp;
} catch( Exception e ) {
e.printStackTrace();
return null;
}
}
} |
添付ファイルの処理を行わない受信アプリケーションと同様に、OnewayListenerインタフェース(Oneway方式の場合)またはReqRespListenerインタフェース(RequestResponse方式の場合)を実装します。−(1)
Oneway方式では、受信したSOAPメッセージの添付ファイルを処理できます。RequestResponse方式では、受信したSOAPメッセージの添付ファイルを処理できるほか、添付ファイルを付加したSOAPメッセージを返信できます。
受信したSOAPメッセージを表すSOAPMessageオブジェクトから添付ファイルを取り出します。−(2)
getAttachmentsメソッドにより取り出した添付ファイルはjava.util.Iteratorオブジェクトにまとめて表されます。添付ファイルがない場合はnullが返されます。
Iteratorとして返される添付ファイルの要素はjavax.xml.soap.AttachmentPartオブジェクトとして保持されています。アプリケーションではAttachmentPart.getContentメソッドで実際の添付ファイルを取得します。
受信した添付ファイルのMIMEタイプがtext/plainである場合、AttachmentPart.getContentメソッドで取得した添付ファイルオブジェクトはjava.lang.Stringオブジェクトとして表されます。−(3)
サンプルでは添付ファイルをテキストファイルへ出力しています。
受信した添付ファイルのMIMEタイプがtext/xmlまたはapplication/xmlである場合、AttachmentPart.getContentメソッドで取得した添付ファイルオブジェクトはjavax.xml.transform.Source(このサンプルではjavax.xml.transform.stream.StreamSource)インスタンスとして表されます。−(4)
サンプルでは添付ファイルをXMLファイルへ出力しています。
受信した添付ファイルは、MIMEタイプに関わらずAttachmentPart.getDataHandlerメソッドによって、javax.activation.DataHandlerオブジェクトとして取得できます。javax.activation.DataHandlerは、Java Activation Framework(JAF)のAPIクラスです。APIを使用してストリームデータなどを取得できます。APIについては付属のJavaDOCを参照してください。−(5)
サンプルでは添付ファイルをストリームとしてファイルへ出力しています。
受信した添付ファイルのMIMEタイプが"image/gif"または"image/jpeg"である場合は、AttachmentPart.getContentメソッドで取得すると、添付ファイルオブジェクトはjava.awt.Imageインスタンスとして表されます。
送信元に返信するSOAPメッセージをSOAPMessageオブジェクトとして作成します。−(6)
送信元に返信するSOAPメッセージを表すMessageオブジェクトにSAAJ-APIを使用して添付ファイルを設定します。1つのSOAPメッセージには任意の数の添付ファイルを設定できます。それぞれの添付ファイルはjavax.xml.soap.AttachmentPartオブジェクトとして表され、SOAPMessage.createAttachmentPartメソッドで生成できます。
生成されたAttachmentPartオブジェクトはSOAPMessage.addAttachmentPartメソッドによりSOAPMessageオブジェクトに設定されます。サンプルでは送信元から送られてきた添付ファイルを返信SOAPMessageオブジェクトに設定しています。−(7)
目次
索引
![]()
|