複数のリージョンの使用
クライアント・コードから、SOAP 要求の中でオプションの SOAP ヘッダー・エレメント Router を送信すれば、複数のリージョンを使用することが可能です。ヘッダー内に Router エレメントがある場合、Process Engine Web Service は要求の接続ポイントとしてその指定されている値を使用します。 Router エレメントがない場合、デフォルトの接続ポイント (PEWSConnectionPoint) が使用されます。
完全修飾接続ポイントの URL では、Router エレメントの形式は次のとおりです。
connection_point_name
次に例を示します。

<Router xmlns="http://www.filenet.com/ns/fnpe/2004/06/ws/schema">connectionPoint2</Router>

単純接続ポイント URL を使用する場合は、接続ポイント名だけを指定できます。
例
IBM® WebSphere® Studio および Microsoft .NET Framework の例を以下に示します。 他のツールキットの有用な情報については、JAX-RPC に対応している他のツールキットを参照してください。
WebSphere Studio
カスタム SOAP ヘッダーを作成するには、JAX-RPC ハンドラー (javax.xml.rpc.handler.*) を拡張したハンドラー・クラスをインストールする必要があります。有効な例を以下に示します。
import javax.xml.namespace.QName;
import javax.xml.rpc.JAXRPCException;
import javax.xml.rpc.handler.soap.SOAPMessageContext;
import javax.xml.rpc.handler.*;
import javax.xml.rpc.soap.SOAPFaultException;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPHeader;
import java.util.Map;
public class ClientHandler extends GenericHandler{
public static final QName AUTH_HEADER = new QName("http://schemas.xmlsoap.org/ws/2002/12/secext", "Security");
public static final QName USERNAME_TOKEN = new QName("http://schemas.xmlsoap.org/ws/2002/12/secext", "UsernameToken");
public static final QName USER_NAME = new QName("http://schemas.xmlsoap.org/ws/2002/12/secext", "Username");
public static final QName PASSWORD = new QName("http://schemas.xmlsoap.org/ws/2002/12/secext", "Password");
public static final QName ROUTER = new QName("http://www.filenet.com/ns/fnpe/2004/06/ws/schema", "Router");
public static final String USER_NAME_KEY = "user";
public static final String PASSWORD_KEY = "password";
public static final String ROUTER_KEY = "router";
private String userName = null;
private String password = null;
private String router = null;
QName qn[] = null;
public void init(HandlerInfo info)
{
qn = info.getHeaders();
java.util.Map m = info.getHandlerConfig();
userName = (String)m.get("user");
password = (String)m.get("password");
router = (String)m.get("router");
}
public QName[] getHeaders()
{
return qn;
}
public boolean handleRequest(MessageContext context)
{
try {
// test if userName and password exist
System.out.println("Name is " + userName);
System.out.println("Password is "+password);
System.out.println("Router is "+router);
if(userName == null || password == null) {
throw new JAXRPCException("username or password null");
}
SOAPMessageContext messageContext = (SOAPMessageContext) context;
// 認証用の SOAP ヘッダーを取得
SOAPHeader header = messageContext.getMessage().getSOAPPart().getEnvelope().getHeader();
SOAPEnvelope se = messageContext.getMessage().getSOAPPart().getEnvelope();
// 認証ヘッダーを追加
Name name = se.createName(AUTH_HEADER.getLocalPart(), null, AUTH_HEADER.getNamespaceURI());
SOAPHeaderElement element = header.addHeaderElement(name);
SOAPElement usernameTokenElement = element.addChildElement(USERNAME_TOKEN.getLocalPart(), "", USERNAME_TOKEN.getNamespaceURI());
SOAPElement userNameElement = usernameTokenElement.addChildElement(USER_NAME.getLocalPart(), "", USER_NAME.getNamespaceURI());
userNameElement.addTextNode(userName);
SOAPElement passwordElement = usernameTokenElement.addChildElement(PASSWORD.getLocalPart(), "", PASSWORD.getNamespaceURI());
passwordElement.addTextNode(password);
// gets the SOAP header for router
if (router!=null && router.length()>0) {
SOAPHeader router_header = messageContext.getMessage().getSOAPPart().getEnvelope().getHeader();
SOAPEnvelope router_se = messageContext.getMessage().getSOAPPart().getEnvelope();
// adds the router header
Name router_name = router_se.createName(ROUTER.getLocalPart(), null, ROUTER.getNamespaceURI());
SOAPHeaderElement router_he = router_header.addHeaderElement(router_name);
// adds the router information
SOAPElement router_element = router_he.addChildElement(ROUTER.getLocalPart(), "", ROUTER.getNamespaceURI());
router_he.addTextNode(router);
} // if (router!=null && router.length>0)
} catch (Exception e) {
throw new JAXRPCException(e);
}
return true;
}
public boolean handleResponse(MessageContext context)
{
try {
// test if userName and password exist
System.out.println("Name is " + userName);
System.out.println("Password is "+password);
System.out.println("Router is "+router);
if(userName == null || password == null) {
throw new JAXRPCException("username or password null");
}
SOAPMessageContext messageContext = (SOAPMessageContext) context;
// gets the SOAP header
SOAPHeader header = messageContext.getMessage().getSOAPPart().getEnvelope().getHeader();
SOAPEnvelope se = messageContext.getMessage().getSOAPPart().getEnvelope();
// 認証ヘッダーを追加
Name name = se.createName(AUTH_HEADER.getLocalPart(), null, AUTH_HEADER.getNamespaceURI());
SOAPHeaderElement element = header.addHeaderElement(name);
SOAPElement usernameTokenElement = element.addChildElement(USERNAME_TOKEN.getLocalPart(), "", USERNAME_TOKEN.getNamespaceURI());
SOAPElement userNameElement = usernameTokenElement.addChildElement(USER_NAME.getLocalPart(), "", USER_NAME.getNamespaceURI());
userNameElement.addTextNode(userName);
SOAPElement passwordElement = usernameTokenElement.addChildElement(PASSWORD.getLocalPart(), "", PASSWORD.getNamespaceURI());
passwordElement.addTextNode(password);
// gets the SOAP header for router
if (router!=null && router.length()>0) {
SOAPHeader router_header = messageContext.getMessage().getSOAPPart().getEnvelope().getHeader();
SOAPEnvelope router_se = messageContext.getMessage().getSOAPPart().getEnvelope();
// adds the router header
Name router_name = router_se.createName(ROUTER.getLocalPart(), null, ROUTER.getNamespaceURI());
SOAPHeaderElement router_he = router_header.addHeaderElement(router_name);
// adds the router information
SOAPElement router_element = router_he.addChildElement(ROUTER.getLocalPart(), "", ROUTER.getNamespaceURI());
router_he.addTextNode(router);
} // if (router!=null && router.length>0)
} catch (Exception e) {
throw new JAXRPCException(e);
}
return true;
}
}
.NET
カスタム SOAP ヘッダーを作成するには、カスタム出力フィルターを使用して、発信メッセージの SOAP ヘッダーに Router エレメントを挿入します。以下のコーディング例は、SoapOutputFilter を拡張する C# クラスを示しています。
using System;
using System.Xml;
using Microsoft.Web.Services2;
using Microsoft.Web.Services2.Configuration;
namespace PE_C_Sharp_solution
{
public class PEHeaderFilter : SoapOutputFilter
{
public PEHeaderFilter()
{
}
public override void ProcessMessage(SoapEnvelope envelope)
{
if (envelope == null) throw new ArgumentNullException("envelope");
string router = (string)envelope.Context["router"];
if (router!=null)
{
XmlElement soapHeader = envelope.CreateHeader();
XmlElement routerHeader = envelope.CreateElement("Router", "http://www.filenet.com/ns/fnpe/2004/06/ws/schema");
routerHeader.InnerText =router;
soapHeader.AppendChild(routerHeader);
}
}
public static void InstallPEHeaderFilter()
{
SoapOutputFilterCollection outputFilters =
WebServicesConfiguration.FilterConfiguration.OutputFilters;
outputFilters.Add(new PEHeaderFilter());
}
}
}
ProcessMessage メソッドは、SOAP コンテキストからルーター情報を取得して、SOAP ヘッダーを作成します。InstallPEHeaderFilter メソッドは、アプリケーションがそのフィルターをインストールするための手段になります。このメソッドは、以下の例に示すように、プログラム開始時に 1 回呼び出されます。
static void Main()
{
PEHeaderFilter.InstallPEHeaderFilter ();
Application.Run(new Form1());
}
Web サービス・メソッドを呼び出す前に、ユーザー名とパスワードの設定に加えて、RequestSoapContext メソッドで次のように router 値を初期化します。
peWS.ProcessEngineServiceWse peSession = new peWS.ProcessEngineServiceWse();
UsernameToken tok = new UsernameToken(peUsername, pePassword, PasswordOption.SendPlainText);
peSession.RequestSoapContext.Security.Tokens.Add(tok);
peSession.RequestSoapContext["router"]=peRouter;
JAX-RPC に対応している他のツールキット
WebSphere Studio 以外の Web サービス・ツールキットを使用している場合は、Java™ API for XML-based Remote Procedure Call (JAX-RPC) ハンドラー (javax.xml.rpc.handler.*) を拡張したハンドラー・クラスもインストールする必要があります。そのハンドラーをインストールするための手順は、ツールキット固有であり、ここでは取り上げませんが、handleRequest メソッドの実装はすべてのツールキットで共通です。ルーター名は、ツールキット固有の SOAP メッセージ・コンテキスト・パラメーターのプロパティーとして渡します。