IBM Connections は社内ソーシャルネットワークを提供する IBM Lotus の製品です。プロフィール、アクティビティ、ブログ、ブックマーク、ファイル、コミュニティなどさまざまなソーシャルネットワークの機能を持っています。
IBM Connections の機能は Web ブラウザクライアントから利用できますが、アプリケーションと連携するための API も提供しています IBM Connections API を利用することで、外部のアプリケーションか IBM Connections のソーシャルネットワークに情報を発信したり、あるいは IBM Connections にある情報や資料を参照することも可能です。
この記事では、XPages アプリケーションから IBM Connections API を利用する方法を紹介します。IBM Connections のプロフィールにはメッセージを投稿したり返答して会話ができるメッセージボードの機能があります。この記事では XPages アプリケーションからメッセージボードにメッセージを投稿するサンプルプログラムを紹介します。
IBM Connections は、外部からのアプリケーションと連携するための API を REST として提供しています。そのため API を利用するアプリケーションでは連携する言語に限定されること無く自由なプログラミングが可能です。この REST API を呼び出す際にデータの表現として IBM Connections では Atom を使用しています。
IBM Connections API のマニュアルは以下の Web ページから開くことができます。IBM Connections のバージョンごとにマニュアルが用意されており、3.0 までは Information Center で、3.0.1 では Wiki として提供されています。本書では IBM Connections 3.0.1 で動作確認しており、記載されている情報も IBM Connections 3.0.1 Wiki の内容にもとづいています。
基本的な考え方は、各サービスのサービスドキュメントを取得する REST API があり、それによって取得できたサービスドキュメントの情報から個別の機能を呼び出すための REST の URI がわかります。その URI を利用して情報の登録や取得といった実際の処理を行うこととなります。
この記事ではプロフィールサービスを使って、自分のメッセージボードにメッセージを投稿するサンプルを紹介します。その API の処理手順は以下になります。
1. プロフィールサービスのサービスドキュメントを取得する URI で REST API を呼び出す。
2. 取得できたプロフィールのサービスドキュメントから、メッセージボードにメッセージを投稿する URI を探す。
3. メッセージボードにメッセージを投稿する URI で REST API を呼び出して、メッセージを投稿する。
プロフィールサービスのサービスドキュメントを取得する URI で REST API を呼び出してプロフィールのサービス文書を取得します。取得するための REST の URI は以下のマニュアルに記載されています。
この文書の Table 1. Atom API request details にサービスドキュメントを取得する URI が指定されています。ユーザー名が指定されなければ自分自身のサービスドキュメントが取得できるので、この表の最初の行の値である 「/atom/profileService.do」 をサービスのパスとして使います。ホスト名を加えた URI は以下のような形式になります。
サービスドキュメントで見つけたメッセージ投稿用の REST API を呼び出して、URI でメッセージを投稿します。ここでも FireFox poster を使用します。
コンテンツタイプは 「application/atom+xml」とし、投稿する atom データは以下のメッセージコンテキストの説明に従って作成します。
単純な REST の呼出であれば JavaScript で行うこともでき、取り扱うデータが JSON であれば JavaScript での処理も問題ありません。しかし今回の IBM Connections の REST API では取り扱うデータが Atom のため少々複雑になります。またセキュア HTTP 接続を使用するため JavaScript での処理は簡単ではありません。そのため IBM Connections のクライアントとなる XPages 側も Java で実装することとします。
この記事のサンプルでは、HTTP クライアントのライブラリとして apache HttpClient を使用します。またやり取りする Atom データの操作には Apache Abdera を使用します。Apache Abdera は
からダウンロードできます。apache HttpClient は別にダウンロードすることも可能ですが、Apache Abdera にも含まれているのでそれをその利用することとします。
ダウンロードした Abderaのモジュールを適当なフォルダに展開します。展開したフォルダ内の module フォルダに Abderaのライブラリがあります。lib フォルダには Abderaで使用する Apache commons のライブラリがあり、HttpClient も底に含まれます。
以下に Java による IBM Connections API の REST による呼出と、レスポンスの Atom データの解析の様子を示します。本記事でサンプルとして紹介している Java プログラムは以下の4つのファイルからなります。完全なソースコードは本記事の最後に掲載しています。
IBM Connections の REST API の呼び出しは HTTP で行います。これは普通の HTTP クライアントの作成と同じで、Socket や HttpURLConneciton クラスを使ったりして実装することができます。今回は認証やセキュア HTTP でのアクセスも簡単にできる Apache commons の HttpClient を使用しています。以下のコードは、IBM Connections へのアクセスで最初にサービスドキュメントを取得する部分を抜粋しました。
getHttpClientInstance() メソッドで HttpClient クラスを生成して認証情報を設定しています。REST でアクセスする URL は getUrl4ServiceDocument() で取得していますが、今回はプロフィールサービスのサービスドキュメント取得の URI である
この URI に対して HTTP GET を送信し、返ってきたレスポンスを parseServiceDocument() メソッドで処理しています。
/**
* @return HttpClient instance
*/
protected HttpClient getHttpClientInstance() {
if (null == client) {
// Create an instance of HttpClient.
client = new HttpClient();
// create credential and scope, and set it
Credentials defaultcreds1 = new UsernamePasswordCredentials(username, password);
AuthScope scope1 = new AuthScope(server, 443);
client.getState().setCredentials(scope1, defaultcreds1);
}
return client;
}
/**
* @throws Exception
*/
public void getServiceDocument() throws Exception {
HttpClient client = getHttpClientInstance();
String url = getUrl4ServiceDocument();
// Create a GET method instance.
GetMethod method = new GetMethod(url);
// Provide custom retry handler is necessary
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler(3, false));
try {
// Execute the method.
int statusCode = client.executeMethod(method);
if (statusCode != HttpStatus.SC_OK) {
System.err.println("Method failed: " + method.getStatusLine());
}
// Read the response body.
byte[] responseBody = method.getResponseBody();
// Deal with the response atom data
InputStream in = new ByteArrayInputStream(responseBody);
parseServiceDocument(in, url);
} catch (HttpException e) {
System.err.println("Fatal protocol violation: " + e.getMessage());
e.printStackTrace();
} catch (IOException e) {
System.err.println("Fatal transport error: " + e.getMessage());
e.printStackTrace();
} finally {
// Release the connection.
method.releaseConnection();
}
}
サービスドキュメントの取得の API を呼び出して返ってきたデータは parseServiceDocument() メソッドで処理されます。このメソッド内では Abdera のライブラリを使用して Atom のデータの解析を行います。ここで紹介しているサンプルでは、Atom のデータから
タグ) のデータを調べて、rel 属性をキーにして href 属性の値をテーブルに保存しています。この値は Java プログラムの後半でメッセージの投稿をする際に使用されます。
public void parseServiceDocument(InputStream in, String url) {
String href;
String rel;
serviceLinktable = new HashMap<String, String>();
Abdera abdera = getAbdraInstance();
Parser parser = abdera.getParser();
Document<Element> doc = parser.parse(in, url);
Element root = doc.getRoot();
// get namespaces
Map<String, String> namespaces = root.getNamespaces();
String def_ns = (String) namespaces.get("");
String atom_ns = (String) namespaces.get("atom");
String snx_ns = (String) namespaces.get("snx");
QName workspace_qn = new QName(def_ns, "workspace");
QName link_qn = new QName(atom_ns, "link");
// get <workspace> node
Element workspace_elm = root.getFirstChild(workspace_qn);
if (null != workspace_elm) {
// get <atom:link> node
Element link_elm = workspace_elm.getFirstChild(link_qn);
while (null != link_elm) {
href = link_elm.getAttributeValue("href");
rel = link_elm.getAttributeValue("rel");
System.out.println("rel = " + rel + ", href = " + href);
serviceLinktable.put(rel, href);
link_elm = link_elm.getNextSibling(link_qn);
}
}
}
Java アプリケーションのテスト実行
作成した Java クラステストのために単体のプログラムとして実行します。先にダウンロードした Apache Abdera モジュールの modules と lib フォルダの下のファイルをクラスパスに指定してコンパイルし実行します。リンク先に提供されているサンプルコードでは、実行時には IBM Connections のホスト名、ユーザー名、パスワード、そして投稿するメッセージをパラメータとして指定します。
正しく実行されると、指定したメッセージが IBM Connections のメッセージボードで確認できます。
Notes アプリケーションへの取り込みと XPage からの利用
作成した Java プログラムを XPages アプリケーションから利用できるようにします。そのためには Java のソースをNotes アプリケーションの NSF ファイルの中に取り込む必要があります。また、今回は Abdera や HttpClient などのライブラリを使用するので、そのための設定を Domino サーバーで行う必要があります。そして、簡単な XPages アプリケーションからこの Java プログラムを呼んで、IBM Connections のメッセージボードにメッセージを投稿できるようにします。
Java プログラムのインポート
Notes アプリケーションに Java を取り込むには、通常の Domino Designer の環境ではなく、Java 開発ができるような構成に変更します。新規の Notes アプリケーションを作成して、Java プログラムをインポートする手順を解説します。
まず、新規の Notes アプリケーションを Domino サーバーに作成します。テンプレートは使用せず 「ブランク」 で作成します。作成した Notes アプリケーションを Domino Designer で開きます。
Domino Designer 8.5 は Eclipse IDE をベースとしていますが、Notes アプリケーション開発用の構成(Domino Designer パースペクティブ)になっています。この構成では Java ファイルの操作ができないので、メニューから 「ウィンドウ」 → 「パースペクティブを開く」 → 「Java」 を選択して、Java 開発用の構成(Java パースペクティブ)に変更します。
Java パースペクティブが開かれたら、Java プログラムファイルを置くフォルダーを作成します。作成した Notes アプリケーションの NSF ファイルがプロジェクトとして表示されているので、そのプロジェクトを選択してメニューから 「ファイル」 → 「新規」 → 「ソース・フォルダ」を選択して、新規にソース・フォルダを作成します。フォルダの名前は何でも良いですがここでは 「src」 としています。さらに作成したフォルダを選択してメニューから 「ファイル」 → 「新規」 → 「パッケージ」 を選択して適当な Java パッケージを作成します。ここでは mycompany.connections.sample パッケージとします。先ほど作成した Java プログラムをこのパッケージにドラッグ&ドロップします。
この時点では Java プログラムで参照指定 Abdera や HttpClient のライブラリが参照できないのでエラーになっています。そこで NSF ファイルのプロジェクトを選択して、メニューから 「ファイル」 → 「プロパティー」 を選択してプロパティーダイアログボックスを表示します。プロパティダイアログボックスの左側で 「Java のビルド・パス」 を選択し、右側で 「ライブラリー」 タブを開き、「外部 JAR の追加」 ボタンをクリックして先ほど展開した Abdera のモジュールの modules フォルダと lib フォルダの中の jar ファイルをすべて選択して登録します。
ここで、Domino サーバーで操作する XPages アプリケーションで使うのに、ローカルのライブラリを登録して問題がないのかと疑問をもたれるかもしれません。ここで登録したライブラリは Java プログラムのコンパイルのためだけに使用します。Domino サーバーで使用するライブラリはあとでまた定義します。
「OK」 を押してダイアログを閉じると、Java プログラムのエラーが全て解決されます。これで Java プログラムの登録は終わりです。
メニューから 「ウィンドウ」 → 「パースペクティブを開く」 → 「Domino Designer」 を選択して、Domino Designer パースペクティブに戻します。
Domino サーバーでの設定
Xpages アプリケーションから呼び出す Java プログラムで jar ライブラリを使用するためには、Domino サーバーでその jar ファイルへのアクセスができるように設定する必要があります。
一番簡単な方法は、Domino サーバーの以下のフォルダに jar ファイルをコピーすることです( xps 以下のフォルダがないときには作成します)。
<Domino プログラムフォルダ>\xsp\shared\lib
先ほど展開した Abdera のモジュールの modules フォルダと lib フォルダの中の jar ファイルをすべて、このフォルダーにコピーします。Domino サーバーで動作する JVM が自動的にこのフォルダの jar ファイルを参照します。
これ以外の方法としては Domino サーバーの notes.ini ファイルでJavaUserClasses または JavaUserClassesExt 変数を設定することで個別に参照する jar ファイルを指定することもできますが、その方法についてはここでは省略します。
これで Abdera と HttpClient のライブラリが参照できるようになりましたが、このままでは Java プログラムの実行時に java.security.AccessControlException が発生してしまいます。そのために Domino で動作するセキュリティ・ポリシーの設定を変更します。以下のファイルを編集して、getClassLoader を許可する設定を最後に追加します。
<Domino プログラムフォルダ>\jvm\lib\security\java.policy
追加する内容
grant {
permission java.lang.RuntimePermission "getClassLoader";
}
これについての詳細は IBM Support & Downloads > Security exceptions are encountered when developing Java agents に記載されています。
これらの設定を行ったら、Domino サーバーの HTTP タスクを再起動してください。
スクリプトライブラリの作成
先ほど登録した Java プログラムを、スクリプトライブラリから参照します。
新規に 「サーバー JavaScript」 タイプのスクリプトライブラリを作成します。名前はここでは ConnectionsLib とします。このスクリプトライブラリで以下のような関数を定義します。ここでは先ほど作成した mycompany.connections.sample パッケージの ProfilesServiceClient Java クラスで getInstanceJS() メソッドを呼んでいます。このメソッドは ProfilesServiceClient クラスを作成して返すので client 変数に格納します。そしてこのクラスの postMessageJS() を呼んでメッセージの投稿をしています。
function postMessage(server, username, password, message) {
var value;
var client = mycompany.connections.sample.ProfilesServiceClient.getInstanceJS(server, username, password);
if (null != client) {
return client.postMessageJS(message);
} else {
return "failed to post message.";
}
}
XPage の作成と、メッセージの投稿処理の実装
作成したスクリプトライブラリを呼び出してメッセージの投稿を行う XPage を作成します。
ここでは新規に message_poster XPage を作成し、以下のような4つの入力フィールドを作成しました。
|
|
|
|
|
データの 「デフォルト値」 に 「greenhouse.lotus.com」 を指定
|
|
|
|
|
|
|
|
|
|
|
|
|
またボタンをひとつ配置して、onClick イベントの 「サーバー」 の 「スクリプトエディタ」 に以下の JavaScript を記述します。
// メッセージの投稿
var server = getComponent("inputServer").value;
var username = getComponent("inputUsername").value;
var password = getComponent("inputPassword").value;
var message = getComponent("inputMessage").value;
var ret = postMessage(server, username, password, message);
// 結果の表示
getComponent("outputResult").value = ret;
これで XPage アプリケーションが完成しました。Web ブラウザからプレビューして動作を確認します。
あらかじ Lotus Greenhouse で登録済みのユーザー名とパスワードを設定し、メッセージを記入して 「投稿」 ボタンを押すと、Lotus Greenhouse の IBM Connections でメッセージボードにメッセージが投稿されます。
Java プログラムのコード
この記事で紹介した Java プログラムの全体のコードを以下に掲載します。
IResponseHandler.java
package mycompany.connections.sample;
import java.io.InputStream;
public interface IResponseHandler {
public void processResponse(InputStream in, String url);
}
IServiceClient.java
package mycompany.connections.sample;
public interface IServiceClient {
enum ServiceTypes {
SERVICETYPE_FILES,
SERVICETYPE_PROFILES,
}
}
ServiceClientAbstract.java
package mycompany.connections.sample;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.abdera.Abdera;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
public abstract class ServiceClientAbstract implements IServiceClient {
/*
* type of client service
*/
private ServiceTypes serviceType;
/*
* access info for IBM Connections services
*/
private String server;
private String username;
private String password;
/*
* Creating a new instance of the Abdera object can be time consuming
* so it is recommended that only a single instance be creating per application.
* The Abdera object and it's direct children (Parser, Factory, XPath, etc) are
* threadsafe and can be stored statically.
*
* See https://cwiki.apache.org/confluence/display/ABDERA/Creating+and+Consuming+Atom+Documents
*/
private static Abdera abdera = null;
/*
* HttpClient instance
*/
private HttpClient client = null;
/**
* Constructor
*
* @param serviceType
*/
public ServiceClientAbstract(ServiceTypes serviceType) {
this.serviceType = serviceType;
}
/**
* Abdera instance generator
*
* @return
*/
protected static synchronized Abdera getAbdraInstance() {
if (abdera == null) {
abdera = new Abdera();
}
return abdera;
}
/**
* HttpClient instance generator
*
* @return
*/
protected HttpClient getHttpClientInstance() {
if (null == client) {
// Create an instance of HttpClient.
client = new HttpClient();
// create credential and scope, and set it
Credentials defaultcreds1 = new UsernamePasswordCredentials(username, password);
AuthScope scope1 = new AuthScope(server, 443);
client.getState().setCredentials(scope1, defaultcreds1);
}
return client;
}
/**
* Connections service type getter
*
* @return IServiceClient.ServiceType
*/
protected ServiceTypes getServiceType() {
return this.serviceType;
}
/**
* returns URI for retrieving the service document for each service
*
* @return
* @throws Exception
*/
protected String getUrl4ServiceDocument() throws Exception {
String url = null;
if (0 == this.serviceType.compareTo(ServiceTypes.SERVICETYPE_FILES)) {
url = "https://" + server + "/files/basic/api/introspection";
} else if (0 == serviceType.compareTo(ServiceTypes.SERVICETYPE_PROFILES)) {
url = "https://" + server + "/profiles/atom/profileService.do";
} else {
throw new Exception("Unkown service type");
}
return url;
}
/**
* initialize this client for the specific service.
* initialization include retrieving the service document
*
* @param server
* @param username
* @param password
* @throws Exception
*/
public void initialize(String server, String username, String password) throws Exception {
this.server = server;
this.username = username;
this.password = password;
getServiceDocument();
}
/**
* service document getter, it should be call at first
*
* @throws Exception
*/
public void getServiceDocument() throws Exception {
String url = getUrl4ServiceDocument();
requestGet(url, new IResponseHandler() {
public void processResponse(InputStream in, String url) {
// Deal with the service document atom data
parseServiceDocument(in, url);
}});
}
/**
* abstract function for parsing the service document
*
* @param in
* @param url
*/
public abstract void parseServiceDocument(InputStream in, String url);
/**
* HTTP GET requester
*
* @param url
* @param responseHandler
* @throws Exception
*/
public void requestGet(String url, IResponseHandler responseHandler) throws Exception {
// parameter check
if ((null == url) || (0 == url.length())) {
throw new Exception("Invalid URL, url = " + url);
}
HttpClient client = getHttpClientInstance();
// Create a GET method instance.
GetMethod method = new GetMethod(url);
// Provide custom retry handler is necessary
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler(3, false));
try {
// Execute the method.
int statusCode = client.executeMethod(method);
if (statusCode != HttpStatus.SC_OK) {
System.err.println("Method failed: " + method.getStatusLine());
}
// Read the response body.
byte[] responseBody = method.getResponseBody();
// Deal with the response atom data
InputStream in = new ByteArrayInputStream(responseBody);
// handle response
responseHandler.processResponse(in, url);
} catch (HttpException e) {
System.err.println("Fatal protocol violation: " + e.getMessage());
e.printStackTrace();
} catch (IOException e) {
System.err.println("Fatal transport error: " + e.getMessage());
e.printStackTrace();
} finally {
// Release the connection.
method.releaseConnection();
}
}
/**
* HTTP POST requester
*
* @param url
* @param inputStream
* @param responseHandler
* @throws Exception
*/
public void requestPost(String url, InputStream inputStream, IResponseHandler responseHandler) throws Exception {
// parameter check
if ((null == url) || (0 == url.length())) {
throw new Exception("Invalid URL, url = " + url);
}
HttpClient client = getHttpClientInstance();
// Create a POST method instance.
PostMethod method = new PostMethod(url);
method.setRequestHeader("Content-Type", "application/atom+xml");
try {
// set parameters
method.addParameter("username", username);
method.addParameter("passwd", password);
// set request body
InputStreamRequestEntity isre = new InputStreamRequestEntity(inputStream);
method.setRequestEntity(isre);
int statusCode = client.executeMethod(method);
System.out.println(method.getStatusLine());
if (statusCode != HttpStatus.SC_OK) {
System.err.println("Method failed: " + method.getStatusLine());
}
// get response
byte[] responseBody = method.getResponseBody();
// Deal with the response atom data
InputStream in = new ByteArrayInputStream(responseBody);
// handle response
responseHandler.processResponse(in, url);
} catch (HttpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// Release the connection.
method.releaseConnection();
}
}
}
ProfilesServiceClient.java
package mycompany.connections.sample;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import javax.xml.namespace.QName;
import org.apache.abdera.Abdera;
import org.apache.abdera.model.Category;
import org.apache.abdera.model.Content;
import org.apache.abdera.model.Document;
import org.apache.abdera.model.Element;
import org.apache.abdera.model.Entry;
import org.apache.abdera.parser.Parser;
import com.ibm.jvm.util.ByteArrayOutputStream;
public class ProfilesServiceClient extends ServiceClientAbstract {
/*
* table to store the request URLs from the service document
*/
private HashMap<String, String> serviceLinktable;
/*
* Link rel for adding a message to a message board in the service document
*/
private String theboard_rel = "http://www.ibm.com/xmlns/prod/sn/mv/theboard";
public ProfilesServiceClient() {
super(ServiceTypes.SERVICETYPE_PROFILES);
}
/* (non-Javadoc)
* @see com.ibm.yamato.lotus.connections.sample.ServiceClientAbstract#parseServiceDocument(java.io.InputStream, java.lang.String)
*/
public void parseServiceDocument(InputStream in, String url) {
String href;
String rel;
serviceLinktable = new HashMap<String, String>();
Abdera abdera = getAbdraInstance();
Parser parser = abdera.getParser();
Document<Element> doc = parser.parse(in, url);
Element root = doc.getRoot();
// get namespaces
Map<String, String> namespaces = root.getNamespaces();
String def_ns = (String) namespaces.get("");
String atom_ns = (String) namespaces.get("atom");
String snx_ns = (String) namespaces.get("snx");
QName workspace_qn = new QName(def_ns, "workspace");
QName link_qn = new QName(atom_ns, "link");
// get <workspace> node
Element workspace_elm = root.getFirstChild(workspace_qn);
if (null != workspace_elm) {
// get <atom:link> node
Element link_elm = workspace_elm.getFirstChild(link_qn);
while (null != link_elm) {
href = link_elm.getAttributeValue("href");
rel = link_elm.getAttributeValue("rel");
System.out.println("rel = " + rel + ", href = " + href);
serviceLinktable.put(rel, href);
link_elm = link_elm.getNextSibling(link_qn);
}
}
}
/**
* post new message into my message board
*
* @param message
* @throws Exception
*/
private void postMessage(String message) throws Exception {
if (null == serviceLinktable) {
throw new Exception("Service client is not initialized.");
}
String url = (String) serviceLinktable.get(theboard_rel);
this.requestPost(url, generateAddMessageRequestBody(message), new IResponseHandler() {
public void processResponse(InputStream in, String url) {
printRawServiceDocument(in, url);
}});
}
/**
* generate POST request body for adding new message
*
* @param message
* @return InputStream
* @throws IOException
*/
private InputStream generateAddMessageRequestBody(String message) throws IOException {
Abdera abdera = new Abdera();
// add entry as root
Entry entry = abdera.newEntry();
// add categories
Category category1 = abdera.getFactory().newCategory(entry);
category1.setScheme("http://www.ibm.com/xmlns/prod/sn/type");
category1.setTerm("entry");
Category category2 = abdera.getFactory().newCategory(entry);
category2.setScheme("http://www.ibm.com/xmlns/prod/sn/message-type");
category2.setTerm("simpleEntry");
// add content with message text
Content content = abdera.getFactory().newContent(Content.Type.TEXT, entry);
content.setValue(message);
System.out.println("entry.getContent() = " + entry.getContent());
// get Atom data to OutputStream and convert it to InputStream
ByteArrayOutputStream output = new ByteArrayOutputStream();
entry.writeTo(output);
ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
return input;
}
/**
* debug purpose function to print out the raw data
*
* @param in
* @param url
*/
private void printRawServiceDocument(InputStream in, String url) {
int ch;
try {
InputStreamReader isr = new InputStreamReader(in, "UTF-8");
while ((ch = isr.read()) != -1) {
System.out.print(Character.toChars(ch));
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* constructor for Domino server-side JavaScript
*
* @param server
* @param username
* @param password
* @return
*/
public static ProfilesServiceClient getInstanceJS(String server, String username, String password) {
ProfilesServiceClient client;
try {
client = new ProfilesServiceClient();
client.initialize(server, username, password);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return client;
}
/**
* message poster for Domino server-side JavaScript
*
* @param message
* @return
*/
public String postMessageJS(String message) {
try {
this.postMessage(message);
} catch (Exception e) {
e.printStackTrace();
return e.getMessage();
}
return "message has been posted.";
}
/**
* on-time call function to post a message for Domino server-side JavaScript
*
* @param server
* @param username
* @param password
* @param message
* @return
*/
public static String postMessageOnTimeJS(String server, String username, String password, String message) {
ProfilesServiceClient client = getInstanceJS(server, username, password);
if (null != client) {
return client.postMessageJS(message);
} else {
return "failed to initialize the client.";
}
}
/**
* main routine for testing purpose
*
* @param args specify host, username and password for IBM Connection
*/
public static void main(String[] args) {
// check input params
if (4 > args.length) {
String className = ProfilesServiceClient.class.getSimpleName();
System.out.println("Usage: " + className + " [host] [username] [password] [message]");
System.out.println("Example: " + className + " greenhouse.lotus.com user@company.com password \"Hello World !\"");
System.exit(0);
}
// get host, username and password
String my_server = args[0];
String my_username = args[1];
String my_password = args[2];
String my_message = args[3];
String ret = ProfilesServiceClient.postMessageOnTimeJS(my_server, my_username, my_password, my_message);
System.out.println(ret);
}
}