JP2011049657A - プログラム生成方法及びプログラム - Google Patents
プログラム生成方法及びプログラム Download PDFInfo
- Publication number
- JP2011049657A JP2011049657A JP2009194406A JP2009194406A JP2011049657A JP 2011049657 A JP2011049657 A JP 2011049657A JP 2009194406 A JP2009194406 A JP 2009194406A JP 2009194406 A JP2009194406 A JP 2009194406A JP 2011049657 A JP2011049657 A JP 2011049657A
- Authority
- JP
- Japan
- Prior art keywords
- soap
- program
- call
- code
- api
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Telephonic Communication Services (AREA)
Abstract
【課題】テレコムネットワークのSIP呼制御機能を、SOAPプロトコルを用いてアクセスするWebアプリケーションを容易に作成するための、プログラム生成方法及びプログラムを提供する。
【解決手段】SOAPプロトコルを用いてSIP呼制御機能を利用するためのプログラムを生成するプログラム生成方法であって、SOAPヘッダ生成部が、予め決められている認識情報を入力したコードをもとに、SOAPヘッダに当該認識情報を格納するプログラムを生成するSOAPヘッダ生成ステップ(F2)と、SOAPオペレーション生成部が、予め決められている実行する動作に関する情報を入力したコードをもとに、当該動作に応じたAPIのSOAPオペレーションの呼び出しを行うプログラムを生成するSOAPオペレーション生成ステップ(F5)と、を含むことを特徴とするプログラム生成方法。
【選択図】図3
【解決手段】SOAPプロトコルを用いてSIP呼制御機能を利用するためのプログラムを生成するプログラム生成方法であって、SOAPヘッダ生成部が、予め決められている認識情報を入力したコードをもとに、SOAPヘッダに当該認識情報を格納するプログラムを生成するSOAPヘッダ生成ステップ(F2)と、SOAPオペレーション生成部が、予め決められている実行する動作に関する情報を入力したコードをもとに、当該動作に応じたAPIのSOAPオペレーションの呼び出しを行うプログラムを生成するSOAPオペレーション生成ステップ(F5)と、を含むことを特徴とするプログラム生成方法。
【選択図】図3
Description
本発明は、プログラム生成方法及びプログラムに関する。
テレコムネットワークのSIP(Session Initiation Protocol)の呼制御機能を、Webから利用することを可能にするプラットフォームとしては、SDP(Service Delivery Platform)がある。
また、このWeb(アプリケーション)が、SOAP(Simple Object Access Protocol)を用いて、前記SDPにアクセスし、前記呼制御機能を利用する標準API(Application Programming Interface)としては、Parlay Xがある(非特許文献1参照)。そして、このParlay Xを用いたゲートウェイの開発が進められている(特許文献1〜3参照)。
また、このWeb(アプリケーション)が、SOAP(Simple Object Access Protocol)を用いて、前記SDPにアクセスし、前記呼制御機能を利用する標準API(Application Programming Interface)としては、Parlay Xがある(非特許文献1参照)。そして、このParlay Xを用いたゲートウェイの開発が進められている(特許文献1〜3参照)。
さらに、SDPにアクセスするためには、SDPにアクセスするための認証を行うプログラムを、Webアプリケーションに組み込む必要がある。SOAPでの認証は、WS−Securityが用いられる(非特許文献2参照)。
このParlay X等を用いることによって、テレコムネットワークのSIPの呼制御機能を利用する、Webアプリケーションを作成することができる。
このParlay X等を用いることによって、テレコムネットワークのSIPの呼制御機能を利用する、Webアプリケーションを作成することができる。
OSA-Parlay X 3.0、ETSI OSA Parlay X、Parlay X 3.0 Specifications、[online]、[平成21年7月28日検索]、インターネット<URL:http://portal.etsi.org/docbox/TISPAN/Open/OSA/ParlayX30.html>
OASIS、OASIS Web Service Security (WSS) TC、Technical Work Produced by the Committee、OASIS Standard、[online]、[平成21年7月28日検索]、インターネット<URL:http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wss>
Parlay XのAPIは、呼の生成や切り替え、音声再生、DTMF(Dial Tone Multi Frequency)操作、課金情報アクセス等の、多くの機能を有しているが、Parlay Xを用いて、Webアプリケーションを作成する際には、開発者にとって2つの問題に直面することになる。
第1の問題としては、開発者が、テレコムネットワーク特有の「呼」の概念を理解しておく必要がある点である。具体的に、例えば、Parlay Xを用いて、Webサーバ側から2者通話発信(3rd party call)を行うアプリケーションを作成するためには、SOAPを用いて、makeCallSesssion APIを実行して呼を生成し、続けて第一の通話者をこの呼に参加させるaddCallParticipant APIを実行し、更に続けて第二の通話者をこの呼に参加させるaddCallParticipant APIを実行しなければならない。このようにParlay X APIは、電話網、テレコムネットワークの知識を前提とした呼のモデルから成っており、一般の開発者、特にWeb技術者にとっては馴染みが薄く、理解しがたいものとなっている。
第2の問題としては、Parlay XのAPI(上記第1の問題で述べた3つのAPI)を実行するためのSOAPリクエストメッセージの中のSOAPヘッダ部には、SDPへの認証を行うためのログイン名・パスワードを加えておく必要がある点である。認証には、WS−Securityが用いられる。一般にSOAPプログラミングにおいて、SOAPボディを操作する実装は常に必要であり、その実装方法は多くの開発者・プログラマ・Web技術者が知るところであるが、SOAPヘッダを操作する実装を行う必要性が生じるケースは少なく、ヘッダの操作実装方法を知る開発者・プログラマは少ない。
そこで、本発明は、テレコムネットワークのSIP呼制御機能を、SOAPプロトコルを用いてアクセスするWebアプリケーションを容易に作成するための、プログラム生成方法及びプログラムを提供することを課題とする。
前記課題を解決するための手段として、請求項1に係るプログラム生成方法は、SOAPプロトコルを用いてSIP呼制御機能を利用するためのプログラムを生成するプログラム生成方法であって、SOAPヘッダ生成部が、予め決められている認識情報を入力したコードをもとに、SOAPヘッダに当該認識情報を格納するプログラムを生成するSOAPヘッダ生成ステップと、SOAPオペレーション生成部が、予め決められている実行する動作に関する情報を入力したコードをもとに、当該動作に応じたAPIのSOAPオペレーションの呼び出しを行うプログラムを生成するSOAPオペレーション生成ステップと、を含むことを特徴とする。
このSOAPヘッダ生成ステップによれば、SOAPヘッダ生成部が、予め決められている認識情報を入力したコードをもとに、SOAPヘッダに当該認識情報を格納するプログラムを生成する。このプログラムにより、必要な認証情報が、SOAPヘッダに格納される。よって、プログラム開発者は、SOAPヘッダの操作に関するコードを実装する必要がなくなる。
また、このSOAPオペレーション生成ステップによれば、SOAPオペレーション生成部が、予め決められている実行する動作に関する情報を入力したコードをもとに、当該動作に応じたAPIのSOAPオペレーションの呼び出しを行うプログラムを生成する。このプログラムにより、APIのSOAPオペレーションの呼び出しを行う(実行する動作に応じたAPIを呼び出すこと)ができる。よって、プログラマは、呼の概念等を詳細に理解していなくても、SIP呼制御機能を、SOAPプロトコルを用いてアクセスするWebアプリケーションを容易に作成することができる。
また、請求項2に係るプログラム生成方法は、前記予め決められている実行する動作に関する情報を入力したコードは、データベースに格納されているコードであることを特徴とする。
このような構成によれば、予め決められている実行する動作に関する情報を入力したコードが、データベースに格納されているコードであることによって、SOAPオペレーション生成部がもとにするコードがデータベースに格納されていることから、プログラムを容易に作成することができる。
このような構成によれば、予め決められている実行する動作に関する情報を入力したコードが、データベースに格納されているコードであることによって、SOAPオペレーション生成部がもとにするコードがデータベースに格納されていることから、プログラムを容易に作成することができる。
また、請求項3に係るプログラム生成方法は、前記予め決められている実行する動作に関する情報を入力したコードは、SOAPリクエストに対するSOAPレスポンスと、呼の状態の変化とを同期させるコードであることを特徴とする。
このような構成によれば、予め決められている実行する動作に関する情報を入力したコードが、SOAPリクエストに対するSOAPレスポンスと、呼の状態の変化とを同期させるコードであることによって、SOAPオペレーション生成部により生成されるプログラムが、SOAPリクエストに対するSOAPレスポンスと、呼の状態の変化とを同期させる機能を有することから、開発者が、レスポンスを受け取ったことが、呼制御側の処理完了を意味すると勘違いすることを防止することができる。
このような構成によれば、予め決められている実行する動作に関する情報を入力したコードが、SOAPリクエストに対するSOAPレスポンスと、呼の状態の変化とを同期させるコードであることによって、SOAPオペレーション生成部により生成されるプログラムが、SOAPリクエストに対するSOAPレスポンスと、呼の状態の変化とを同期させる機能を有することから、開発者が、レスポンスを受け取ったことが、呼制御側の処理完了を意味すると勘違いすることを防止することができる。
また、請求項4に係るプログラムは、請求項1ないし請求項3のいずれか1項に記載のプログラム生成方法を、コンピュータに実行させるためのプログラムである。
請求項1ないし請求項3のいずれか1項に記載のプログラム生成方法を、プログラムで実現している。
請求項1ないし請求項3のいずれか1項に記載のプログラム生成方法を、プログラムで実現している。
本発明によれば、テレコムネットワークのSIP呼制御機能を、SOAPプロトコルを用いてアクセスするWebアプリケーションを容易に作成するための、プログラム生成方法及びプログラムを提供することができる。
本発明の一実施形態について、図面を参照して説明する。
図1は、本発明を用いるシステムの全体構成図である。
図1中のSDP(ネットワークサービスプラットフォームとも呼ばれる)には、Parlay Xのゲートウェイとして、SIP機能をSOAPに変換する役割を担う変換手段(OLAPP)と、WS−Securityによる認証を担う実行制御とが含まれている。
テレコムネットワークには、SIPサーバとメディアサーバとが含まれ、SIPサーバには、SIP端末が繋がっている。
SOAPプロトコルを用いてSDPの機能を利用するWebアプリケーションには、SDK(Software Development Kit)が含まれている。また、Webアプリケーションは、任意のネットワークを介して、SDPに接続している。SDKは、このWebアプリケーションが動作するマシン(コンピュータ)にインストールされることで利用される。
このコンピュータには、CPU(Central Processing Unit)と、メモリ(コンパイラ等が記憶されている)と、ネットワークインターフェイス等とが含まれている。
図1中のSDP(ネットワークサービスプラットフォームとも呼ばれる)には、Parlay Xのゲートウェイとして、SIP機能をSOAPに変換する役割を担う変換手段(OLAPP)と、WS−Securityによる認証を担う実行制御とが含まれている。
テレコムネットワークには、SIPサーバとメディアサーバとが含まれ、SIPサーバには、SIP端末が繋がっている。
SOAPプロトコルを用いてSDPの機能を利用するWebアプリケーションには、SDK(Software Development Kit)が含まれている。また、Webアプリケーションは、任意のネットワークを介して、SDPに接続している。SDKは、このWebアプリケーションが動作するマシン(コンピュータ)にインストールされることで利用される。
このコンピュータには、CPU(Central Processing Unit)と、メモリ(コンパイラ等が記憶されている)と、ネットワークインターフェイス等とが含まれている。
図2は、SDKのソフトウェア構成を示す図である。
SDKは、プログラミングスキルやテレコムの知識の乏しいエンドユーザ向けに、Parlay Xの概念を引きずらず、代表的なサービスをパッケージとして提供するHigh−libraryと、多少のプログラミングスキルやテレコムの知識を有するユーザ向けに、Parlay X並みに細かく柔軟なテレコム機能の制御を可能にするLow−libraryとから成る。
SDKは、プログラミングスキルやテレコムの知識の乏しいエンドユーザ向けに、Parlay Xの概念を引きずらず、代表的なサービスをパッケージとして提供するHigh−libraryと、多少のプログラミングスキルやテレコムの知識を有するユーザ向けに、Parlay X並みに細かく柔軟なテレコム機能の制御を可能にするLow−libraryとから成る。
このLow−libraryは、プログラム開発者に対して、Low−library APIを提供する。Low−libraryは、(1)プログラマが書いたコードを元に、WS−Securityの認証情報を、SOAPヘッダに挿入(格納)するプログラムを生成するSOAPヘッダ生成部1と、(2)プログラマが書いたコードを元に、かつ、(1)で生成されたオブジェクトを参照して、Parlay X APIのSOAPオペレーションの呼び出しを行うプログラムを生成するSOAPオペレーション生成部2とから成る。
プログラマが本libraryを用いてコードを記述して、そのコードが(コンパイラによって)コンパイルされる際に、Low−libraryの機能部(SOAPヘッダ生成部1及びSOAPオペレーション生成部2)が該当するプログラムを自動生成する。そのプログラムが実行されると、図1のWebアプリケーションとParlay X API(SDP)との間で、SOAPメッセージの送受信が行われる。
Low−libraryの動作(基本オブジェクトの生成)について、図3及び図4を参照して説明する。
まず、Entryオブジェクト(エントリ)は、アプリケーションからSDPのサービスを使用するための入り口となるもので、プログラマは、SDPのサービスを使用するためのユーザ名(ID)とパスワード(予め決められている認証情報)を引数として、初めにエントリを生成するよう以下の記述を行う(図3のF1、図4の(1)〜(2))。
<予め決められている認識情報を入力したコード>
Entry entry = new Entry(“USERID”, “PASSWORD”);
まず、Entryオブジェクト(エントリ)は、アプリケーションからSDPのサービスを使用するための入り口となるもので、プログラマは、SDPのサービスを使用するためのユーザ名(ID)とパスワード(予め決められている認証情報)を引数として、初めにエントリを生成するよう以下の記述を行う(図3のF1、図4の(1)〜(2))。
<予め決められている認識情報を入力したコード>
Entry entry = new Entry(“USERID”, “PASSWORD”);
このコードがコンパイルされるとき、SOAPヘッダ生成部1は、以下のSOAPヘッダ作成プログラムを生成する(図3のF2)。このとき、SOAPヘッダ生成部1は、上記Entryクラスの引数を、X2・X3に代入している。
すなわち、このSOAPヘッダ生成部1は、SOAPヘッダに当該認識情報を格納するために予め作成しておいたテンプレートデータ(プログラム)内の予め決まっている場所(位置)に、必要な(認証)情報を代入するようになっている。
すなわち、このSOAPヘッダ生成部1は、SOAPヘッダに当該認識情報を格納するために予め作成しておいたテンプレートデータ(プログラム)内の予め決まっている場所(位置)に、必要な(認証)情報を代入するようになっている。
<SOAPヘッダに認識情報を格納するプログラム>
//ハンドラリゾルバ
public class NwspfHandlerResolver implements・・・(X1)
HandlerResolver{
//リクエスタハンドラをチェーンに追加
public List<Handler> getHandlerChain(PortInfo arg0){
List<Handler> handlerChain = new LinkedList<Handler>();
handlerChain.add(new MyRequestorHandler());
return handlerChain;
}
}
//リクエスタハンドラ
public class MyRequestorHandler implements
SOAPHandler<SOAPMessageContext> {
private static final String XSD =
"http://docs.oasis-open.org/wss/2004/01/
oasis-200401-wss-wssecurity-secext-1.0.xsd";
//ハンドラメソッド
public boolean handleMessage(SOAPMessageContext
context) {
SOAPMessage message = context.getMessage();
try {
SOAPHeader header = message.getSOAPHeader();
if (header == null) {
SOAPEnvelope envelope = message.getSOAPPart().
getEnvelope();
header = envelope.addHeader();
SOAPFactory soapFactory = SOAPFactory.newInstance();
Name eN_Security = soapFactory.createName("Security",
"wsse", XSD);
SOAPHeaderElement hE_Security = header.
addHeaderElement(eN_Security);
Name eN_UsernameToken = soapFactory.createName(
"UsernameToken", "wsse", XSD);
SOAPElement e_UsernameToken = hE_Security.
addChildElement(eN_UsernameToken);
//ユーザ名のXML要素を設定
Name eN_Username = soapFactory.createName("Username",
"wsse", XSD);
SOAPElement e_Username = e_UsernameToken.
addChildElement(eN_Username);
e_Username.setTextContent(”USERID“);・・・(X2)
//ユーザ名のXML要素を設定
Name eN_Password = soapFactory.createName("Password",
"wsse", XSD);
SOAPElement e_ Password = e_ Password Token.
addChildElement(eN_ Password);
e_Username.setTextContent(“PASSWORD“);・・・(X3)
}
} catch (SOAPException se) {
throw new WebServiceException(se);
}
}
}
//ハンドラリゾルバ
public class NwspfHandlerResolver implements・・・(X1)
HandlerResolver{
//リクエスタハンドラをチェーンに追加
public List<Handler> getHandlerChain(PortInfo arg0){
List<Handler> handlerChain = new LinkedList<Handler>();
handlerChain.add(new MyRequestorHandler());
return handlerChain;
}
}
//リクエスタハンドラ
public class MyRequestorHandler implements
SOAPHandler<SOAPMessageContext> {
private static final String XSD =
"http://docs.oasis-open.org/wss/2004/01/
oasis-200401-wss-wssecurity-secext-1.0.xsd";
//ハンドラメソッド
public boolean handleMessage(SOAPMessageContext
context) {
SOAPMessage message = context.getMessage();
try {
SOAPHeader header = message.getSOAPHeader();
if (header == null) {
SOAPEnvelope envelope = message.getSOAPPart().
getEnvelope();
header = envelope.addHeader();
SOAPFactory soapFactory = SOAPFactory.newInstance();
Name eN_Security = soapFactory.createName("Security",
"wsse", XSD);
SOAPHeaderElement hE_Security = header.
addHeaderElement(eN_Security);
Name eN_UsernameToken = soapFactory.createName(
"UsernameToken", "wsse", XSD);
SOAPElement e_UsernameToken = hE_Security.
addChildElement(eN_UsernameToken);
//ユーザ名のXML要素を設定
Name eN_Username = soapFactory.createName("Username",
"wsse", XSD);
SOAPElement e_Username = e_UsernameToken.
addChildElement(eN_Username);
e_Username.setTextContent(”USERID“);・・・(X2)
//ユーザ名のXML要素を設定
Name eN_Password = soapFactory.createName("Password",
"wsse", XSD);
SOAPElement e_ Password = e_ Password Token.
addChildElement(eN_ Password);
e_Username.setTextContent(“PASSWORD“);・・・(X3)
}
} catch (SOAPException se) {
throw new WebServiceException(se);
}
}
}
このプログラムにより、WS−Securityの認証情報が、SOAPヘッダに格納される。よって、プログラム開発者は、SOAPヘッダの操作に関するコードを実装する必要がない。つまり、プログラマは、別途、ヘッダに関する操作を行わなくてもよい。
次に、プログラマは、エントリから、createCallメソッドを用いて、Callオブジェクトを生成するコードを、以下のように記述する(図3のF3、図4の(2)〜(3))。
Call call = entry.createCall();・・・(A0)
Call call = entry.createCall();・・・(A0)
また、話者を表すParticipantオブジェクトを生成するコードを、以下のように記述する。
Participant ua1 = new Participant("sip:ua1@ntt");
Participant ua2 = new Participant("sip:ua2@ntt");
Participant ua1 = new Participant("sip:ua1@ntt");
Participant ua2 = new Participant("sip:ua2@ntt");
そして、プログラマは、Callに対して、addParticipantメソッドを呼び出し、そこにCallParticipantを複数参加させ、その参加者同士で会話(実行する動作)をすることを以下のように(予め決められている実行する動作に関する情報を)記述する(図3のF4、図4の(3)〜(5))。
<予め決められている実行する動作に関する情報を入力したコード>
call.addParticipant(ua1);・・・(A1)
call.addParticipant(ua2);・・・(A2)
<予め決められている実行する動作に関する情報を入力したコード>
call.addParticipant(ua1);・・・(A1)
call.addParticipant(ua2);・・・(A2)
このコードがコンパイルされるとき、SOAPオペレーション生成部2は、以下のプログラムを生成する(図3のF5)。このとき、SOAPオペレーション生成部2は、SOAPヘッダ生成部1が生成したクラス(X1)をA101に、A1・A2で指定されたua1・ua2(話者オブジェクト)をA102・A103にそれぞれ代入している。また、変数CALLER_NAME、CHARGINFINFORMATION、MEDIAINFO、CHANGEMEDIANOTALLOWEDには、予めSOAPオペレーション生成部2において設定されている値が代入される。
すなわち、このSOAPオペレーション生成部2は、実行する動作(本実施形態では、会話)に応じたAPIのSOAPオペレーションの呼び出しを行うために予め作成しておいたテンプレートデータ内の予め決まっている場所(位置)に、必要な情報(値)を代入するようになっている。
すなわち、このSOAPオペレーション生成部2は、実行する動作(本実施形態では、会話)に応じたAPIのSOAPオペレーションの呼び出しを行うために予め作成しておいたテンプレートデータ内の予め決まっている場所(位置)に、必要な情報(値)を代入するようになっている。
<動作に応じたAPIのSOAPオペレーションの呼び出しを行うプログラム>
//3rd party callサービスを生成
org.csapi.wsdl.parlayx.third_party_call.v3_4.service
ThirdPartyCallService service = new org.csapi.wsdl.parlayx.
third_party_call.v3_4.service.ThirdPartyCallService();
//サービスにSOAPハンドラリゾルバを設定
service.setHandlerResolver(new NwspfHandlerResolver ());・・・(A101)
//サービスからエンドポイントのポートを取得
org.csapi.wsdl.parlayx.third_party_call.v3_4.service.
ThirdPartyCall port = service.getThirdPartyCall();
//オペレーションの引数を作成
List<String> callParticipants = new ArrayList<String>();
callParticipants.add(ua1); ・・・(A102)
callParticipants.add(ua2); ・・・(A103)
String callingParticipantName = CALLER_NAME;
org.csapi.schema.parlayx.common.v3_1.ChargingInformation
charging = CHARGINFINFORMATION;
List<org.csapi.schema.parlayx.common.v3_1.MediaInfo>
mediaInfo = MEDIAINFO;
boolean changeMediaNotAllowed = CHANGEMEDIANOTALLOWED;
//Parlay X APIのmakeCallオペレーションを呼出
callSessionId = port.makeCallSession(callParticipants, callingParticipantName, charging, mediaInfo, changeMediaNotAllowed); ・・・(A104)
//3rd party callサービスを生成
org.csapi.wsdl.parlayx.third_party_call.v3_4.service
ThirdPartyCallService service = new org.csapi.wsdl.parlayx.
third_party_call.v3_4.service.ThirdPartyCallService();
//サービスにSOAPハンドラリゾルバを設定
service.setHandlerResolver(new NwspfHandlerResolver ());・・・(A101)
//サービスからエンドポイントのポートを取得
org.csapi.wsdl.parlayx.third_party_call.v3_4.service.
ThirdPartyCall port = service.getThirdPartyCall();
//オペレーションの引数を作成
List<String> callParticipants = new ArrayList<String>();
callParticipants.add(ua1); ・・・(A102)
callParticipants.add(ua2); ・・・(A103)
String callingParticipantName = CALLER_NAME;
org.csapi.schema.parlayx.common.v3_1.ChargingInformation
charging = CHARGINFINFORMATION;
List<org.csapi.schema.parlayx.common.v3_1.MediaInfo>
mediaInfo = MEDIAINFO;
boolean changeMediaNotAllowed = CHANGEMEDIANOTALLOWED;
//Parlay X APIのmakeCallオペレーションを呼出
callSessionId = port.makeCallSession(callParticipants, callingParticipantName, charging, mediaInfo, changeMediaNotAllowed); ・・・(A104)
このプログラムにより、Parlay X APIのSOAPオペレーションの呼び出しを行う(実行する動作に応じたAPIを呼び出すこと)ができる。よって、プログラマは、Parlay Xの詳細な(プログラム作成に関する)パラメータを気にすることなく、プログラムを作成することができる。つまり、テレコムネットワークのSIP呼制御機能を、SOAPプロトコルを用いてアクセスするWebアプリケーションを容易に作成することができる。
上記生成されたプログラムが実行されると、OLAPPのParlay XのAPIのmakeCall APIが呼び出され、話者の間でのセッションが確立する。このとき、makeCallリクエストのSOAPヘッダには、上述したSOAPヘッダ作成プログラムにより、認証情報が格納されており、SDPにログインすることができる。
次に、話者1に対して、例えば、”http://hello.wav”という音声メッセージを再生(実行する動作)するためには、再生を行いたいCallオブジェクトに対して、createPlayerメソッドを呼び出し、Playerオブジェクトを生成する。コードを、プログラマは以下のように記述する(図5参照)。
//再生するメッセージ
Message message = new AudioMessage("http://hello.wav");・・・(B1)
//Playerオブジェクトを生成
Player player = call.getPlayerMaker().createPlayer();
//UA1の端末へメッセージを再生
player.play(message, ua1);・・・(B2)
Message message = new AudioMessage("http://hello.wav");・・・(B1)
//Playerオブジェクトを生成
Player player = call.getPlayerMaker().createPlayer();
//UA1の端末へメッセージを再生
player.play(message, ua1);・・・(B2)
このコードがコンパイルされるとき、SOAPオペレーション生成部2は、以下のプログラムを生成する。このとき、SOAPオペレーション生成部2は、SOAPヘッダ生成部1が生成したクラスをB101に、B2で指定されたua1をB102に、B1で指定されたhttp://hello.wavをB103に代入している。また、B104のcallSessionIDの値には、A104の戻り値であるcallSessionIdを自動的に代入している。
//音声再生サービスを生成
org.csapi.wsdl.parlayx.audio_call.play_media.v3_2.
service.AudioCallPlayMediaService service = new
org.csapi.wsdl.parlayx.audio_call.play_media.v3_2.
service.AudioCallPlayMediaService();
//サービスにSOAPハンドラリゾルバを設定
service.setHandlerResolver(new NwspfHandlerResolver)・・・(B101)
//サービスからエンドポイントのポートを取得
org.csapi.wsdl.parlayx.audio_call.play_media.v3_2.service.
AudioCallPlayMedia port = service.getAudioCallPlayMedia();
//オペレーションの引数を作成
List<String> callParticipants = new ArrayList<String>();
callParticipants.add(ua1); ・・・(B102)
String audioUrl = "http://hello.wav";・・・(B103)
org.csapi.schema.parlayx.common.v3_1.ChargingInformation
charging = CHARGINGINFORMATION;
//playAudioMessageオペレーション呼出
port.playAudioMessage(callSessionID, callParticipants, audioUrl, charging); ・・・(B104)
org.csapi.wsdl.parlayx.audio_call.play_media.v3_2.
service.AudioCallPlayMediaService service = new
org.csapi.wsdl.parlayx.audio_call.play_media.v3_2.
service.AudioCallPlayMediaService();
//サービスにSOAPハンドラリゾルバを設定
service.setHandlerResolver(new NwspfHandlerResolver)・・・(B101)
//サービスからエンドポイントのポートを取得
org.csapi.wsdl.parlayx.audio_call.play_media.v3_2.service.
AudioCallPlayMedia port = service.getAudioCallPlayMedia();
//オペレーションの引数を作成
List<String> callParticipants = new ArrayList<String>();
callParticipants.add(ua1); ・・・(B102)
String audioUrl = "http://hello.wav";・・・(B103)
org.csapi.schema.parlayx.common.v3_1.ChargingInformation
charging = CHARGINGINFORMATION;
//playAudioMessageオペレーション呼出
port.playAudioMessage(callSessionID, callParticipants, audioUrl, charging); ・・・(B104)
なお、SOAPオペレーション生成部2は、上記B1のように、Messageオブジェクトの型が音声ファイル(Audio Message)であれば、Parlay X APIのplayAudioMessage APIを呼び出すプログラムを生成するが、Messageオブジェクトの型がテキストファイルであれば、OLAPPのParlay X APIのplayTextMessage APIを呼び出すプログラムを生成する。また、Messageオブジェクトの型が動画ファイルであれば、OLAPPのParlay X APIのplayVideoMessage APIを呼び出すプログラムを生成する。
その他、話者に対して、ボタン操作を要求する、音声を録音する等、端末とのやりとり(実行する動作、Interaction)を行うためには、プログラマは、具体的に、例えば、下記コードを記述する(図6参照)。
//Interactionの結果をイベントで通知してもらうようにする
call.getNotifiers().startAll();
//ボタン操作の収集情報作成
Interaction digitInteraction = new DigitInteraction(1, 1, true);・・・(C1)
//Interactionを開始する
Message textMsg = new TextMessage("よろしければ1を押して下さい。");・・(C2)
Interactor interactor = call.getInteractorMaker().createInteractor();
interactor.start(digitInteraction, textMsg);
call.getNotifiers().startAll();
//ボタン操作の収集情報作成
Interaction digitInteraction = new DigitInteraction(1, 1, true);・・・(C1)
//Interactionを開始する
Message textMsg = new TextMessage("よろしければ1を押して下さい。");・・(C2)
Interactor interactor = call.getInteractorMaker().createInteractor();
interactor.start(digitInteraction, textMsg);
このコードがコンパイルされるとき、SOAPオペレーション生成部2は、以下のプログラムを生成する。このとき、SOAPオペレーション生成部2は、SOAPヘッダ生成部1が生成したクラスを、C101に代入している。また、SOAPオペレーション生成部2は、C102にはSOAPオペレーション生成部2が生成した任意の値を、C103とC104には予めSOAPオペレーション生成部2において設定されている値を、C105にはC2を、C106にはC1でプログラマが指定した引数の値をそれぞれ代入し、C51には、B104でも用いられたA104の戻り値であるcallSessionIdを自動的に代入している。
org.csapi.wsdl.parlayx.call_notification.notification_manager.v3_1.service.CallNotificationManagerService service = new org.csapi.wsdl.parlayx.call_notification.notification_manager.v3_1.service.CallNotificationManagerService();
service.setHandlerResolver(new NwspfHandlerResolver());・・・(C101)
org.csapi.wsdl.parlayx.call_notification.notification_manager.v3_1.service.CallNotificationManager port = service.getCallNotificationManager();
org.csapi.schema.parlayx.common.v3_1.SimpleReference reference = new org.csapi.schema.parlayx.common.v3_1.SimpleReference();
reference.setCorrelator("correlatorID1");・・・(C102)
reference.setEndpoint("http://192.168.1.1:8080/proxy/soap/Transfer?nttss:sid=olapp_call_notification03");・・・(C103)
reference.setInterfaceName("AA");・・・(C104)
java.lang.String callSessionIdentifier = callSessionId;・・・(C51)
port.startPlayAndCollectNotification(reference, callSessionIdentifier);
org.csapi.wsdl.parlayx.audio_call.capture_media.v3_1.service.AudioCallCaptureMediaService service = new org.csapi.wsdl.parlayx.audio_call.capture_media.v3_1.service.AudioCallCaptureMediaService();
service.setHandlerResolver(new NwspfHandlerResolver());・・・(C101)
org.csapi.wsdl.parlayx.audio_call.capture_media.v3_1.service.AudioCallCaptureMedia port = service.getAudioCallCaptureMedia();
// TODO initialize WS operation arguments here
java.lang.String callSessionIdentifier = callSessionId;
java.lang.String callParticipant = null;
org.csapi.schema.parlayx.audio_call.v3_2.PlayConfig playingConfiguration = new org.csapi.schema.parlayx.audio_call.v3_2.PlayConfig();
org.csapi.schema.parlayx.audio_call.v3_2.DigitConfig digitConfiguration = new org.csapi.schema.parlayx.audio_call.v3_2.DigitConfig();
playingConfiguration.setMessageFormat(AnnouncementFormat.TEXT_TO_SPEECH);
playingConfiguration.setTextString("よろしければ1を押して下さい。");・・・(C105)
playingConfiguration.setInterruptMedia(false); ・・・(C106)
digitConfiguration.setMaxDigits(1); ・・・(C106)
digitConfiguration.setMinDigits(1); ・・・(C106)
digitConfiguration.setInterruptMedia(false); ・・・(C106)
service.setHandlerResolver(new NwspfHandlerResolver());・・・(C101)
org.csapi.wsdl.parlayx.call_notification.notification_manager.v3_1.service.CallNotificationManager port = service.getCallNotificationManager();
org.csapi.schema.parlayx.common.v3_1.SimpleReference reference = new org.csapi.schema.parlayx.common.v3_1.SimpleReference();
reference.setCorrelator("correlatorID1");・・・(C102)
reference.setEndpoint("http://192.168.1.1:8080/proxy/soap/Transfer?nttss:sid=olapp_call_notification03");・・・(C103)
reference.setInterfaceName("AA");・・・(C104)
java.lang.String callSessionIdentifier = callSessionId;・・・(C51)
port.startPlayAndCollectNotification(reference, callSessionIdentifier);
org.csapi.wsdl.parlayx.audio_call.capture_media.v3_1.service.AudioCallCaptureMediaService service = new org.csapi.wsdl.parlayx.audio_call.capture_media.v3_1.service.AudioCallCaptureMediaService();
service.setHandlerResolver(new NwspfHandlerResolver());・・・(C101)
org.csapi.wsdl.parlayx.audio_call.capture_media.v3_1.service.AudioCallCaptureMedia port = service.getAudioCallCaptureMedia();
// TODO initialize WS operation arguments here
java.lang.String callSessionIdentifier = callSessionId;
java.lang.String callParticipant = null;
org.csapi.schema.parlayx.audio_call.v3_2.PlayConfig playingConfiguration = new org.csapi.schema.parlayx.audio_call.v3_2.PlayConfig();
org.csapi.schema.parlayx.audio_call.v3_2.DigitConfig digitConfiguration = new org.csapi.schema.parlayx.audio_call.v3_2.DigitConfig();
playingConfiguration.setMessageFormat(AnnouncementFormat.TEXT_TO_SPEECH);
playingConfiguration.setTextString("よろしければ1を押して下さい。");・・・(C105)
playingConfiguration.setInterruptMedia(false); ・・・(C106)
digitConfiguration.setMaxDigits(1); ・・・(C106)
digitConfiguration.setMinDigits(1); ・・・(C106)
digitConfiguration.setInterruptMedia(false); ・・・(C106)
また、プログラマは、コールバック用関数notifyPlayAndCollectEventに関するコードを以下のように記述する。
public void notifyPlayAndCollectEvent(String correlator, String callParticipant, String mediaInteraction) {
Call call = NotifierHelper.getIdFromCorrelator(correlator);・・・(C201)
・・・
}
public void notifyPlayAndCollectEvent(String correlator, String callParticipant, String mediaInteraction) {
Call call = NotifierHelper.getIdFromCorrelator(correlator);・・・(C201)
・・・
}
このコードがコンパイルされるとき、SOAPオペレーション生成部2は、指定されたC201を解釈し、A0のCallオブジェクトのインスタンスを取得する。
まとめとして、Low−libraryのモデルを図7に示す。
まとめとして、Low−libraryのモデルを図7に示す。
このようなプログラムの生成方法及びプログラムを用いることによって、電話網、テレコムネットワークの知識、呼の概念、Parlay X APIモデルの習得等を必要とすることなく、テレコムの機能と連携するWebアプリケーションを開発することができ、アプリケーション開発の難易度が大きく低減される。
また、SOAPヘッダを操作する実装を作成する必要がなくなり、アプリケーションを開発する開発者の負担が軽減し、プログラムの生産性が向上する。
また、SOAPヘッダを操作する実装を作成する必要がなくなり、アプリケーションを開発する開発者の負担が軽減し、プログラムの生産性が向上する。
High−libraryについて、図8及び図9を参照して説明する。
まず、プログラマは、EntryオブジェクトからUserオブジェクトを生成する(図8の(1)、(2))。
User su1 = entry.createUser("sip:050xxx@example.net");
User su2 = entry.createUser("sip:050yyy@example.net");
まず、プログラマは、EntryオブジェクトからUserオブジェクトを生成する(図8の(1)、(2))。
User su1 = entry.createUser("sip:050xxx@example.net");
User su2 = entry.createUser("sip:050yyy@example.net");
次に、su1とsu2の間の通話を確立するために、プログラマは、
su1.connect(su2);
と記述する(図8の(3))。
su1.connect(su2);
と記述する(図8の(3))。
このプログラムがコンパイルされるとき、コード生成部3(図2参照)は、このconnectが呼び出されたことを検知して、OLAPPのParlay XのmakeCallSession API、addCallParticipant ("sip:050xxx@example.net") API、addCallParticipant ("sip:050yyy@example.net") APIを実行するプログラムを生成する。
また、su1とsu2の間の通話を切断させるときは、プログラマは、
su1.disconnect();
またはsu2.disconnect();
と記述する(図8の(4))。
su1.disconnect();
またはsu2.disconnect();
と記述する(図8の(4))。
この場合、コード生成部3は、このdisconnectが呼び出されたことを検知して、OLAPPのParlay XのdeleteCallParticipant ("sip:050xxx@example.net") APIまたはdeleteCallParticipant ("sip:050yyy@example.net") APIを実行するプログラムを生成する。
また、例えば、企業のサポート窓口等で、初めに電話に出たオペレータが、他の専門の担当者等へ電話を転送するようなとき等、通話中の相手を切り替えるときは、次のように記述する(図9参照)。
1 // 2者を呼び出して通話を開始させる
2 su1.connect(su2);
3
4 // 転送先のユーザを作成
5 SurumeUser su3 = entry.createUser("sip:050zzz@example.net");
6
7 // su2との通話を終了してsu3に転送する
8 su1.switchto(su3);
1 // 2者を呼び出して通話を開始させる
2 su1.connect(su2);
3
4 // 転送先のユーザを作成
5 SurumeUser su3 = entry.createUser("sip:050zzz@example.net");
6
7 // su2との通話を終了してsu3に転送する
8 su1.switchto(su3);
このプログラムがコンパイルされるとき、コード生成部3は、switchtoが呼び出されたことを検知して、OLAPPのParlay XのdeleteCallParticipant ("sip:050 yyy @example.net") API、addCallParticipant ("sip:050xxx@example.net") APIを実行するプログラムを生成する。
また、ユーザの端末に、メッセージを再生させるときは、次のように記述する。
1 // 2者を呼び出して通話を開始させる
2 su1.connect(su2);
3
4 // ・・・何らかの処理
5
6 // su1に文章を読み上げた音声を流す
7 su1.playText("もう寝る時間");
8
9 // su2にAudioファイルを再生する
10 su2.play("http://hogehoge.com/file/byebye.wav");
11
12 // su2に動画ファイルを再生する
13 su2.play("http://hogehoge.com/file/sleep.mov");
1 // 2者を呼び出して通話を開始させる
2 su1.connect(su2);
3
4 // ・・・何らかの処理
5
6 // su1に文章を読み上げた音声を流す
7 su1.playText("もう寝る時間");
8
9 // su2にAudioファイルを再生する
10 su2.play("http://hogehoge.com/file/byebye.wav");
11
12 // su2に動画ファイルを再生する
13 su2.play("http://hogehoge.com/file/sleep.mov");
このプログラムがコンパイルされるとき、コード生成部3は、playTextを検知すると、文字を読み上げた音声がsu1の端末に向けて再生される(6行目)。この際、コード生成部3は、playTextが呼び出されたことを検知して、OLAPPのParlay XのplayTextMessage APIを実行するプログラムを生成する。
また、Userオブジェクトへのplayメソッドを記述すると、音声ファイルや動画ファイルがsu1の端末に向けて再生される(9行目、12行目)。この際、コード生成部3は、playが呼び出されたことを検知して、OLAPPのParlay XのplayAudioMessage APIまたはplayVideoMessage APIを実行するプログラムを生成する。
このように、High−libraryを用いることによって、テレコムに馴染みのない開発者であっても、テレコム機能を利用するアプリケーションを容易に作成することができる。
なお、SDKは、Low−library及びHigh−libraryの他に、Interaction−library及び/またはSync−libraryを更に含む構成としてもよい(図2参照)。
Interaction−libraryについて、図10を参照して説明する。
プログラム実行時に、プログラム内で生成されたCallオブジェクトの情報(インスタンス)が、Interaction−libraryのデータベース部4(図2参照)に保管(格納)されるようになっている(図10の(1))。
上述したLow−libraryを用いて、Interactionを開始することで、OLAPPのParlay XのnotifyPlayAndCollectEvent APIとstartPlayAndCollectNotification APIとが実行される(図10の(2))。
そして、SIP端末側でボタン操作等が完了すると、OLAPPのParlay X APIにて規定されたnotifyPlayAndCollectEventメッセージが、SOAPにより、Webアプリケーション側に送信(通知)されてくる。Java(登録商標)言語では、notifyPlayAndCollectEventメッセージを受け取るプログラムは、notifyPlayAndCollectEventクラス内に記述される。
この中で、notifyPlayAndCollectEventメッセージの引数に含まれるCorrelator値から、CallのID(CallSessionId)を取得して(図10の(3))、これをキーに、前記データベース部4からCallオブジェクトを取得することで、通知を受けた後の動作をプログラム上に記述することができる(図10の(4))。
プログラム実行時に、プログラム内で生成されたCallオブジェクトの情報(インスタンス)が、Interaction−libraryのデータベース部4(図2参照)に保管(格納)されるようになっている(図10の(1))。
上述したLow−libraryを用いて、Interactionを開始することで、OLAPPのParlay XのnotifyPlayAndCollectEvent APIとstartPlayAndCollectNotification APIとが実行される(図10の(2))。
そして、SIP端末側でボタン操作等が完了すると、OLAPPのParlay X APIにて規定されたnotifyPlayAndCollectEventメッセージが、SOAPにより、Webアプリケーション側に送信(通知)されてくる。Java(登録商標)言語では、notifyPlayAndCollectEventメッセージを受け取るプログラムは、notifyPlayAndCollectEventクラス内に記述される。
この中で、notifyPlayAndCollectEventメッセージの引数に含まれるCorrelator値から、CallのID(CallSessionId)を取得して(図10の(3))、これをキーに、前記データベース部4からCallオブジェクトを取得することで、通知を受けた後の動作をプログラム上に記述することができる(図10の(4))。
このように、Interaction−libraryのデータベース部4を用いることによって、プログラマが入力するコードについて、データベース部4に格納されているプログラムが記述されるようになっており、プログラムを容易に作成することができる。
次に、Sync−libraryについて、図11を参照して説明する。
このSync−libraryは、OLAPPにおける呼状態との自動同期機能部5を有する(図2参照)。つまり、SOAPリクエストに対するレスポンスと、SIP端末の呼の状態の変化とを同期させる機能を有している。
このSync−libraryは、OLAPPにおける呼状態との自動同期機能部5を有する(図2参照)。つまり、SOAPリクエストに対するレスポンスと、SIP端末の呼の状態の変化とを同期させる機能を有している。
OLAPP(Parlay X)は、SOAP APIからのリクエストメッセージを受信すると、SIPの呼制御(SIP INVITEの送信等)を開始するが、このとき、OLAPPは、SIP呼制御が成功したかどうかに関わらず、SOAPリクエストメッセージに対するレスポンスを返す。これは、例えば、SIP INVITEの場合、端末が電話を取るまで何秒かかるか分からないため、SIP呼制御側の処理完了を待ってから、SOAPリクエストメッセージに対するレスポンスを返すと、SOAPリクエストとSOAPレスポンスとの間の時間が長くなり、SOAPリクエストの送信元で、タイムアウトが発生する可能性があるためである。しかし、開発者によっては、SOAPレスポンスを受け取ったことが、呼制御側の処理完了を意味すると勘違いすることも多い。
そのため、図11のように、プログラム上でCallオブジェクト(図11ではSynchronizedCallというオブジェクトを別途定義している)を生成し、これに対してaddParticipantを呼び出し、上記した方法でプログラムを生成し、そのプログラムが実行されるとき、自動同期機能部5は、OLAPPのaddCallParticipant APIを呼び出すが、OLAPPのaddCallParticipantのレスポンスを受けた直後にプログラムに処理を戻すのではなく、OLAPPのgetCallInformation APIをポーリングして呼び出し、呼の状態が変化したかどうかを確認して、変化したときにプログラムに処理を戻す(図11の(A))。
同様に、音声等を再生するplayメソッドを記述し、上記した方法でプログラムを生成し、そのプログラムが実行されるとき、自動同期機能部5は、OLAPPのplayAudioMessage APIを呼び出すが、OLAPPのplayAudioMessageのレスポンスを受けた直後にプログラムに処理を戻すのではなく、OLAPPのgetMessageStatus APIをポーリングして呼び出し、呼の状態が変化したかどうかを確認して、変化したときにプログラムに処理を戻す。
このようにSOAPリクエストに対するレスポンスを、OLAPPが管理しているSIP呼状態の変化と同期させる(方法は、getMessageStatus等のOLAPPの状態取得APIを呼び出す)ことで、開発者が、SOAPレスポンスを受け取ったことが、呼制御側の処理完了を意味すると勘違いすることを防止することができる。
1 SOAPヘッダ生成部
2 SOAPオペレーション生成部
3 コード生成部
4 データベース部
5 自動同期機能部
2 SOAPオペレーション生成部
3 コード生成部
4 データベース部
5 自動同期機能部
Claims (4)
- SOAPプロトコルを用いてSIP呼制御機能を利用するためのプログラムを生成するプログラム生成方法であって、
SOAPヘッダ生成部が、予め決められている認識情報を入力したコードをもとに、SOAPヘッダに当該認識情報を格納するプログラムを生成するSOAPヘッダ生成ステップと、
SOAPオペレーション生成部が、予め決められている実行する動作に関する情報を入力したコードをもとに、当該動作に応じたAPIのSOAPオペレーションの呼び出しを行うプログラムを生成するSOAPオペレーション生成ステップと、
を含むことを特徴とするプログラム生成方法。 - 前記予め決められている実行する動作に関する情報を入力したコードは、データベースに格納されているコードであることを特徴とする請求項1に記載のプログラム生成方法。
- 前記予め決められている実行する動作に関する情報を入力したコードは、SOAPリクエストに対するSOAPレスポンスと、呼の状態の変化とを同期させるコードであることを特徴とする請求項1または請求項2に記載のプログラム生成方法。
- 請求項1ないし請求項3のいずれか1項に記載のプログラム生成方法を、コンピュータに実行させるためのプログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2009194406A JP2011049657A (ja) | 2009-08-25 | 2009-08-25 | プログラム生成方法及びプログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2009194406A JP2011049657A (ja) | 2009-08-25 | 2009-08-25 | プログラム生成方法及びプログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2011049657A true JP2011049657A (ja) | 2011-03-10 |
Family
ID=43835591
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2009194406A Pending JP2011049657A (ja) | 2009-08-25 | 2009-08-25 | プログラム生成方法及びプログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2011049657A (ja) |
-
2009
- 2009-08-25 JP JP2009194406A patent/JP2011049657A/ja active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7865607B2 (en) | Servlet model for media rich applications | |
JP5120851B2 (ja) | ウェブ・ベース統合通信システム及び方法、及びウェブ通信マネージャ | |
US7356409B2 (en) | Manipulating a telephony media stream | |
KR101265808B1 (ko) | 분산 스피치 서비스 | |
EP1886467B1 (en) | Generating and transforming call control elements, dialog elements, and session initiation protocol messages for telephony service applications | |
JP5060018B2 (ja) | 一対多のデータ投影のシステムおよび方法 | |
US9241012B2 (en) | System and method for telephony and communication services with message-based API | |
CN101969469B (zh) | 电信能力开放中的回调处理方法及装置 | |
EP1808004B1 (en) | Providing a service framework at an endpoint | |
US20090287740A1 (en) | Method for enabling on-demand communication services | |
US8612932B2 (en) | Unified framework and method for call control and media control | |
JP2006222815A (ja) | 電話発信要求装置、通信装置、通信システム、及びプログラム | |
JP2007158737A (ja) | 接続制御装置及び方法並びにプログラム | |
Kolberg et al. | Feature interaction in a federated communications-enabled collaboration platform | |
US8165277B2 (en) | Distributed service creation environment for intelligent endpoints | |
JP2011049657A (ja) | プログラム生成方法及びプログラム | |
Jouve et al. | A SIP-based programming framework for advanced telephony applications | |
Davies et al. | Evaluating two approaches for browser-based real-time multimedia communication | |
US8874759B2 (en) | Method and apparatus for programming session initiation protocol back-to-back user agents | |
Wu et al. | Feature interactions between internet services and telecommunication services | |
Lima et al. | A co-browsing system with conference support | |
Chan | Methods for designing Internet telephony services with fewer feature interactions | |
Daehne | Skype Me! From Single User to Small Enterprise and Beyond | |
Maes | A call control driven MVC programming model for mixing Web and call or multimedia applications | |
Brandt et al. | Limitations of the usability and functionality of the JSR-281 IMS API from a Java ME developer's perspective |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
RD02 | Notification of acceptance of power of attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7422 Effective date: 20110822 |