Google App Engine for Javaからセールスフォースにアクセスしてみよう

September 15, 2011 Appirio

セールスフォースでは、外部アプリケーションから呼び出し可能なAPIとして「Web Services API」、「REST API」などを提供しています。

今回は「Web Services API」を使ってGoogle App Engine for Java(以下GAE)からセールスフォースにログインして、オブジェクトのラベルを一覧するアプリケーションを作成してみたいと思います。

1.事前準備

開発をはじめる前に、セールスフォースのアカウント登録やGAEへのアプリケーション登録が必要です。以下の手順に沿って進めてみてください。

1.1
以下のサイトでセールスフォースのDeveloper Editionのアカウントを作成します。既にアカウントをお持ちの方はそのアカウントを使っていただいても結構です。

https://www.developerforce.com/events/regular/registration.php?lang=ja

アカウントを作成したらセールスフォースへログインして「セキュリティトークン」を発行しておいてください。

1.2
GAEへのアプリケーションの登録、およびをEclipseへGAEのプラグインをインストールしてください。
詳細な手順については、以下のサイトを参考にしてください。

http://code.google.com/intl/ja/appengine/docs/whatisgoogleappengine.html

これで事前準備は完了です。

 

2.GAEプロジェクトをセットアップする

それでは、まずGAEアプリケーションを開発するためにEclipseへプロジェクトを作成しましょう。

2.1
Eclipseの新規プロジェクト作成ウィザードで「Google - Web Application Project」を選択し新規プロジェクトを作成します。なお今回のサンプルでは必要ないので、「Generate GWT project sample code」と「Use Google Web Toolkit」のチェックは外してプロジェクトを作成してください。

2.2
作成したプロジェクトのプロパティにある [Google] - [App Engine] の「Application ID」へ先の手順で作成したアプリケーションのIDを設定してください。

2.3
プロジェクトのコンテキストメニューから [Google] - [Deploy to App Engine] を選択してGAEへプロジェクトをデプロイします。

2.4
デプロイが正常に完了したら、以下のアドレスにアクセスしてみてください。

http://<YOUR APPLICATION ID>.appspot.com/

以下のようなデフォルトのindexページが表示されるはずです。

これでGAEアプリケーションを開発する準備が整いました!

3.WSDLからStubを作成する

つづいて、Web Services APIを使った開発を行うための環境を構築します。

3.1
セールスフォースへログインして「設定」画面のサイドメニューから[開発]-[API]を選択表示します。
ここには、様々なWSDLがありますが、今回は「パートナーWSDLの作成」リンクから「partner.wsdl」をダウンロードしてください。
ダウンロードしたファイルは、先に作成したEclipseプロジェクトのルートディレクトリに保存します。

3.2
以下のサイトから「wsc-22.jar」、「wsc-gae.jar」をダウンロードしてください。

http://code.google.com/p/sfdc-wsc/downloads/list

ダウンロードしたファイルは、先に作成したEclipseプロジェクトのwar/WEB-INF/libに保存します。

TIPS
JavaでWeb ServiceといえばApache Axis2がありますが、私の試した限りではGAEの制限にひっかかりうまく動きませんでした。
GAEには以下のサイトにあるように標準のJREで提供されている機能であっても利用できないものがあります。まぁ、PaaS系サービスではよくあることですね。

http://code.google.com/intl/ja/appengine/docs/java/jrewhitelist.html

3.3
WSCを使ってStubコードを生成します。
ターミナルを起動してプロジェクトのルートディレクトリに移動し、以下のコマンドを実行してください。

>java -classpath war/WEB-INF/lib/wsc-22.jar com.sforce.ws.tools.wsdlc partner.wsdl war/WEB-INF/lib/sfdc.jar

正常に完了するとwar/WEB-INF/libに「sfdc.jar」というファイルが作成されます。
これでセールスフォースのWeb Services APIを利用できる状態になりました。

4.アプリケーションを作成する

それでは早速アプリケーションを作成してきましょう!

4.1
まずデフォルトで生成されていた「index.html」を以下のように変更しましょう。

 

&lt;!doctype html&gt;
&lt;html lang="ja"&gt; 
  &lt;head&gt;
    &lt;meta charset="utf-8"&gt;
    &lt;title&gt;sfdc demo&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;メニュー&lt;/h1&gt;
    &lt;hr/&gt;
    &lt;ul&gt;
      &lt;li&gt;
        &lt;a href="/getObjectList"&gt;オブジェクト一覧を表示&lt;/a&gt;
    &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/body&gt;
&lt;/html&gt;

 

4.2
index.htmlの「オブジェクト一覧を表示」をクリックした際に呼び出すサーブレットを実装しましょう。

 

package com.appirio.myblogdemo;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sforce.soap.partner.Connector;
import com.sforce.soap.partner.DescribeGlobalResult;
import com.sforce.soap.partner.DescribeGlobalSObjectResult;
import com.sforce.soap.partner.PartnerConnection;
import com.sforce.ws.ConnectorConfig;
import com.sforce.ws.transport.GaeHttpTransport;

public class GetObjectListServlet extends HttpServlet {

	private static final long serialVersionUID = -722132993577622970L;
	
	private Logger logger = Logger.getLogger(GetObjectListServlet.class.getName());
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		RequestDispatcher rd = req.getRequestDispatcher("ObjectList.jsp");
		req.setAttribute("objects", getObjectList());
		rd.forward(req, res);
	}
	
	/**
	 * Web Services APIを使ってオブジェクトのラベル一覧を返却する
	 * @return オブジェクトラベルの一覧
	 */
	private List&lt;String&gt; getObjectList() {
		List&lt;String&gt; objectList = new ArrayList&lt;String&gt;();
		try {
			//セールスフォースのユーザ名、パスワード、セキュリティトークンを指定して下さい!
			String userName = "xxxxx";
			String password = "xxxxx";
			String securityToken = "xxxxx";
			
			ConnectorConfig config = new ConnectorConfig();
			config.setUsername(userName);
			config.setPassword(password+securityToken);
			//デフォルトのトランスポート設定を使った場合、java.net.Proxyが利用されGAEの制限に引っかかるので
			//GAE用のトランスポートを使うように設定します。
			config.setTransport(GaeHttpTransport.class);
			
			//上記接続設定に従いセールスフォースへのコネクションを生成します
			PartnerConnection conn = Connector.newConnection(config);
			
			//セールスフォース組織に存在するオブジェクトのラベルを取得してリストに追加します
			DescribeGlobalResult dgr = conn.describeGlobal();
			for (DescribeGlobalSObjectResult dgsor : dgr.getSobjects()) {
				objectList.add(dgsor.getName());
			}
		}
		catch (Exception e) {
			logger.warning(e.getMessage());
		}
		return objectList;
	}
}

 

4.3
取得したオブジェクト名のリストを表示するjspを実装しましょう。作成したjspファイルはwarの直下に配置します。

 

&lt;%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %&gt;
&lt;%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&gt;
&lt;!doctype html&gt;
&lt;html lang="ja"&gt; 
&lt;head&gt;
  &lt;meta charset="utf-8"&gt;
  &lt;title&gt;object list&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1&gt;オブジェクト一覧&lt;/h1&gt;
  &lt;hr/&gt;
  &lt;ul&gt;
    &lt;c:forEach items="${objects}" var="obj"&gt;
      &lt;li&gt;${obj}&lt;/li&gt;
    &lt;/c:forEach&gt;
  &lt;/ul&gt;
&lt;/body&gt;
&lt;/html&gt;

 

4.4
war/WEB-INF/web.xmlに作成したサーブレット「GetObjectListServlet」の設定を追加します。

 

&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"&gt;
	&lt;servlet&gt;
		&lt;servlet-name&gt;GetObjectListServlet&lt;/servlet-name&gt;
		&lt;servlet-class&gt;com.appirio.myblogdemo.GetObjectListServlet&lt;/servlet-class&gt;
	&lt;/servlet&gt;
	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;GetObjectListServlet&lt;/servlet-name&gt;
		&lt;url-pattern&gt;/getObjectList&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;
	&lt;welcome-file-list&gt;
		&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;
	&lt;/welcome-file-list&gt;
&lt;/web-app&gt;

 

4.5
プロジェクトのコンテキストメニューから[Google]-[Deploy to App Engine]を選択してGAEへプロジェクトを再度GAEへデプロイします。

これでアプリケーションは完成です!
では、再度GAEへプロジェクトをデプロイしてみましょう。

正しくデプロイされていれば、

http://<YOUR APPLICATION ID>.appspot.com/

へアクセスすると以下のようなメニューが表示されるはずです。

「オブジェクト一覧を表示」をクリックすると以下のようにセールスフォースがデフォルトでもっているオブジェクトのラベルがリストされるはずです。

どうだったでしょうか?簡単でしたか?今回は、describeGlobalメソッドしか使っていませんが、他にも沢山のメソッドがありますので以下のAPIリファレンスを参考に色々試してみてはいかがでしょうか?

http://www.salesforce.com/us/developer/docs/api/

 

Posted by Oi Jun (Appirio Japan)

 

 

 

戻る
RubyによるDatabase.com上のデータ操作方法
RubyによるDatabase.com上のデータ操作方法

salesforce.com社により提供されているDatabase.comは、Force.com のデータベース機能単体をAPIを通じて外部から利用できるようにしたサービスです。この記事では、Rubyで書かれたウェ...

次へ
Java がサポートされたクラウド環境 Heroku で Play!Scala を試す
Java がサポートされたクラウド環境 Heroku で Play!Scala を試す

先日Herokuで「Heroku for Java」の発表がされました。http://blog.heroku.com/archives/2011/8/25/java/ Herokuはスケールアウト可能なクラウド上の...

アピリオまでお気軽にお問合せください

ご質問はこちら