IBM FileNet P8, バージョン 5.2.1            

複数のリージョンの使用

クライアント・コードから、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 メッセージ・コンテキスト・パラメーターのプロパティーとして渡します。



最終更新日: 2015 年 10 月
ws_usage_regions.htm

© Copyright IBM Corp. 2015.