SalesForceのDataLoaderの高度に自動化する。

## DataLoaderのバッチ実行モード

今はDataLoader自身をコマンドラインから起動させることができる。
https://help.salesforce.com/apex/HTViewHelpDoc?id=command_line_intro.htm&language=ja

Batch ModeでDataLoaderを動かすときに、DataLoader Githubにサンプルコードが約にたつ。
https://github.com/forcedotcom/dataloader/tree/master/src/test/resources/testfiles/conf

サンプルを分析してみるとBatch Modeでコマンドラインから実行する以外に、DataBaseに接続し、テーブルのデータをSalesforceへ反映したり、Salesforceのデータを取り出してDataBaseに同期化することもできる。
データベース連動については別の記事を参照
DataLoaderとDatabaseを連動する【V58】【SQLite編】
https://qiita.com/KangHyewon/items/81c3d8ba7b634e0f4c67

## DataLoaderのSpringFrameworkのXMLスキーマ設定

このDataLoaderはSpringFramework 5.xで作られているので、基本のサンプルコードのやり方以外に色々とカスタマイズすることができる。
ただし、サンプルの設定ファイルがSpring2.0のDTDで作成されているのでSpringFramework3.0以上ので増えた機能を利用することができない。

SpringFrameworkの機能を使いこなすためには、xmlの上の方をDTD形式から以下のようにXMLスキマーに書き換えてあげる必要がある。

### 変更前

database-conf.xml
process-conf.xml

```xml
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
```

### 変更後

database-conf.xml
process-conf.xml

```xml
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p" 
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/util
           http://www.springframework.org/schema/util/spring-util.xsd
           http://www.springframework.org/schema/tool
           http://www.springframework.org/schema/tool/spring-tool.xsd">
```

## SpringFrameworkのPropertiesファイルを活用する

XMLスキマー形式に変更したら、便利な機能の１つとして独自のプロパティを活用することができる

process-conf.xml
```xml
<beans...

    <!-- プロパティファイルロード -->
    <context:property-placeholder location="classpath:my.properties"/>

    <!-- util:propertiesを利用してプロパティを設定 -->
    <util:properties id="myProps">
        <prop key="exampleProperty">exampleValue</prop>
    </util:properties>

    <!-- For the absolute paths below, replace with a better mechanism, eg. config.properties param for base location -->
    <bean id="maximumBatchRowsDbProcess"
          class="com.salesforce.dataloader.process.ProcessRunner"
          scope="prototype">
        <description>maximumBatchRowsDb job gets the Account updates from database and uploads them to salesforce using 'upsert'.</description>
        <property name="name" value="maximumBatchRowsDbProcess"/>
        <property name="configOverrideMap">
            <map>
                <!-- プロパティファイルのプロパティを利用の例 -->
                <entry key="process.outputSuccess" value="${propertyFromMyProperties}/status/maximumBatchRowsDbSuccess.csv"/>
                <entry key="process.outputError" value="${propertyFromMyProperties}/status/maximumBatchRowsDbError.csv"/>
                <entry key="sfdc.debugMessagesFile" value="${propertyFromMyProperties}/status/maximumBatchRowsDbSoapTrace.log"/>
                <entry key="sfdc.externalIdField" value="Oracle_Id__c"/>
                <entry key="process.operation" value="upsert"/>
                <!-- util:propertiesのプロパティを利用の例 -->
                <entry key="process.mappingFile" value="#{myProps['exampleProperty']}/data/maximumBatchRowsDbMap.sdl"/>
                <entry key="dataAccess.name" value="queryAccount"/>
                <entry key="dataAccess.type" value="databaseRead"/>
                <entry key="dataAccess.readBatchSize" value="750"/>
                <entry key="process.initialLastRunDate" value="2005-12-01T00:00:00.000-0800"/>
            </map>
        </property>
    </bean>
</beans>
```

## Proxy環境の注意

社内でProxyを利用する場合、XMLスキマー検証時エラーが発生する場合がある。
SpringFrameworkのXMLスキマー検証をOFFにすることができればいいが、DataLoaderソースに手を出してしまうため、よろしくはない
また、config.propertiesファイルにproxyを設定しても、この設定はDataLoaderの設定であり、SpringFrameworkのXMLスキマー検証では利用できないため、同じくエラーが発生する。

以下のようにDataLoader実行時Proxyを設定することで回避できる。

util.bat

```batch
:runDataLoader
    CALL :checkJavaVersion
    java -Dhttp.proxyHost=<PROXY HOST> -Dhttp.proxyPort=<PROXY PORT> -cp "%~dp0..\*" com.salesforce.dataloader.process.DataLoaderRunner %*
    EXIT /b %ERRORLEVEL%
```