Partner.WSDL を用いた SalesForceのSOAP連携

## 開発ライセンスのSalesForceを登録

ここで登録可能
https://developer.salesforce.com/signup

今回はセキュリティートークンで認証するため
「私の設定」⇒「私のセキュリティートークンのリセット」
リセットすると、トークンが登録アドレスに送られてくる。

![image](https://qiita-image-store.s3.amazonaws.com/0/101086/9b2c7103-d361-0409-99e1-3e6cb7977635.png)

## Partner WSDLの取得

自社に連携ツールを作るなら本来は Enterprise WSDL の方が良い。
但し、今回はより汎用的に利用できる Partner WSDL を取得する。

![image](https://qiita-image-store.s3.amazonaws.com/0/101086/ba88c80e-8a6f-b885-ab2f-ed63793634e8.png)

http://mvnrepository.com/artifact/com.force.api/force-wsc/34.0
ここから force-wsc-34.0.jar をダウンロードして

```shell-session:
$ java -classpath force-wsc-34.0.jar com.sforce.ws.tools.wsdlc partner.wsdl partner.jar

Exception in thread "main" java.lang.NoClassDefFoundError: org/stringtemplate/v4/STGroupDir
```

失敗するが単なるライブラリ不足。
http://www.stringtemplate.org/download/ST-4.0.8.jar
これを落として再度トライ。

```shell-session:
$ java -classpath force-wsc-34.0.jar;ST-4.0.8.jar com.sforce.ws.tools.wsdlc partner.wsdl partner.jar
```

今回はMavenProjectを利用するので

```shell-session:
$ mvn install:install-file -Dfile=D:\foo\lib\partner.jar -DgroupId=co.jp.infomart.force -DartifactId=partner -Dversion=34.0 -Dpackaging=jar -DgeneratePom=true
```

で、生成したpartner.jarをローカルリポジトリに入れておく。


## ログインを実装して繋ぐ

まずは、必要なライブラリ。
だいたい、こんなもんだというところで・・・

```xml:pom.xml
        <dependency>
                <groupId>com.force.api</groupId>
                <artifactId>force-wsc</artifactId>
                <version>34.2.2</version>
        </dependency>
        <dependency>
                <groupId>com.force.api</groupId>
                <artifactId>force-partner-api</artifactId>
                <version>34.0.0</version>
        </dependency>
        <dependency>
            <groupId>co.jp.infomart.force</groupId>
            <artifactId>partner</artifactId>
            <version>34.0.0</version>
        </dependency>
```

で、実装はこちら

```Java:接続テスト
/**
 * 接続テスト
 * 接続して、取引先の基本情報を取得
 */
private static void connectTestOne() {

    final String uid = "ログインID（メールアドレス）を設定";
    final String pass = "パスワードと発行したセキュリティートークンを繋げて設定";
    // ↑ パスワードが「pass」でトークンが「xyz」なら「passxyz」となる

    /**
     * 接続設定
     */
    ConnectorConfig config = new ConnectorConfig();
    config.setUsername(uid);
    config.setPassword(pass);
    config.setAuthEndpoint("https://login.salesforce.com/services/Soap/u/34.0");

    PartnerConnection connection = null;
    boolean isConnected = false;
    try {

        // 接続
        connection = com.sforce.soap.partner.Connector.newConnection(config);
        isConnected = true;
        LoginResult lr =connection.login(uid, pass);

        System.out.println("--------------------------------");
        System.out.println(lr.getUserInfo().getOrganizationName());
        System.out.println(lr.getUserInfo().getUserFullName());
        System.out.println("login success...");
        System.out.println("--------------------------------");

    } catch (ConnectionException ex) {
        Logger.getLogger(ClientTest.class.getName()).log(Level.SEVERE, null, ex);

    } finally {

        // 切断
        try {
            if( isConnected ) {
                connection.logout();
                System.out.println("--------------------------------");
                System.out.println("logout success...");
                System.out.println("--------------------------------");
            }
        } catch (ConnectionException ex) {
            Logger.getLogger(ClientTest.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

}
```

## 取引先を取得して表示

https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_objects_account.htm
これがかなり参考になる。

```Java:取引先を取得する
/**
 * 取引先一覧情報を取得
 * @param partnerConnection 
 */
public static void querySample(PartnerConnection partnerConnection) {   
    try {
        // バッチサイズを設定
        partnerConnection.setQueryOptions(250);

        // 取引先抽出のSOQLを指定して抽出
        String soqlQuery = "SELECT AccountNumber, Name, Phone, Fax, (Select c.Name From Contacts c) contactName FROM Account WHERE IsDeleted = false";
        QueryResult qr = partnerConnection.query(soqlQuery);

        boolean done = false;
        int loopCount = 0;

        // 結果を取得して表示
        while (!done) {
            System.out.println("Records in results set " + loopCount++ + " - ");
            SObject[] records = qr.getRecords();

            for (int i = 0; i < records.length; i++) {
                SObject account = records[i];
                Object accountName = account.getField("Name");
                Object accountPhone = account.getField("Phone");
                Object accountFax = account.getField("Fax");

                System.out.println("Account " + (i+1) + ": " 
                        + account.getField("AccountNumber") + ":" + (accountName != null ? accountName : "")
                        + " Phone " + (accountPhone != null ? accountPhone : "") 
                        + " Fax "   + (accountName  != null ? accountFax   : ""));

            }
            if (qr.isDone()) {
                done = true;
            } else {
                qr = partnerConnection.queryMore(qr.getQueryLocator());
            }
        }
    } catch(ConnectionException ce) {
        ce.printStackTrace();
    }
    System.out.println("\nQuery execution completed.");
}
```

で、こんな感じで取得ができる。
サンプルデータだけど。

```shell-session:出力結果
--------------------------------
株式会社むむむ
とっとこ ハム太郎
login success...
--------------------------------
Records in results set 0 - 
Account 1: CC978213:GenePoint Phone (650) 867-3450 Fax (650) 867-9895
Account 2: CD355119-A:United Oil & Gas, UK Phone +44 191 4956203 Fax +44 191 4956620
Account 3: CD355120-B:United Oil & Gas, Singapore Phone (650) 450-8810 Fax (650) 450-8820
Account 4: CD451796:Edge Communications Phone (512) 757-6000 Fax (512) 757-9000
Account 5: CD656092:Burlington Textiles Corp of America Phone (336) 222-7000 Fax (336) 222-8000
Account 6: CC213425:Pyramid Construction Inc. Phone (014) 427-4427 Fax (014) 427-4428
Account 7: CC634267:Dickenson plc Phone (785) 241-6200 Fax (785) 241-6201
Account 8: CD439877:Grand Hotels & Resorts Ltd Phone (312) 596-1000 Fax (312) 596-1500
Account 9: CC947211:Express Logistics and Transport Phone (503) 421-7800 Fax (503) 421-7801
Account 10: CD736025:University of Arizona Phone (520) 773-9050 Fax (520) 773-9060
Account 11: CD355118:United Oil & Gas Corp. Phone (212) 842-5500 Fax (212) 842-5501
Account 12: null:sForce Phone (415) 901-7000 Fax (415) 901-7002

Query execution completed.
--------------------------------
logout success...
--------------------------------
```