embulk-output-salesforce 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +21 -0
- data/build.gradle +1 -1
- data/src/main/java/org/embulk/output/SalesforceOutputPlugin.java +44 -5
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b0d15f227f70f2cf1136aa8c4228366381f953c5
|
4
|
+
data.tar.gz: 865df205e83934d43b93ad717412059e701236b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0c85452ec9d4749e668f85d07d02bae621efa3891fa945e25594600da4f6e2b9086ae18c39db9d4e2a8a33ce2ac9f6fa9852903154bd251b2a7eeb162168cbc7
|
7
|
+
data.tar.gz: abe53b74e7629da47408fafa034bfe6552b4229faedc7982988b790475608f218929103cb0eaa48f98f67925ef74e08ca5fd29a6e78ef35600939828da5bfa88
|
data/README.md
CHANGED
@@ -22,8 +22,29 @@ Embulk output plugin to load into Salesforce.com.
|
|
22
22
|
- **version**: API version (string, default: "34.0")
|
23
23
|
|
24
24
|
## Example
|
25
|
+
The column names must be salesforce API field name.
|
25
26
|
|
26
27
|
```yaml
|
28
|
+
in:
|
29
|
+
type: file
|
30
|
+
path_prefix: /path/to/salesforce_
|
31
|
+
parser:
|
32
|
+
charset: UTF-8
|
33
|
+
newline: CRLF
|
34
|
+
type: csv
|
35
|
+
delimiter: ','
|
36
|
+
quote: '"'
|
37
|
+
escape: ''
|
38
|
+
skip_header_lines: 1
|
39
|
+
comment_line_marker: null
|
40
|
+
allow_extra_columns: true
|
41
|
+
allow_optional_columns: false
|
42
|
+
columns:
|
43
|
+
- {name: Name, type: string}
|
44
|
+
- {name: Date__c, type: timestamp, format: '%Y-%m-%d'}
|
45
|
+
- {name: DateTime__c, type: timestamp, format: '%Y-%m-%d %H:%M:%S%Z'}
|
46
|
+
- {name: Number__c, type: double}
|
47
|
+
- {name: Reference__c, type: string}
|
27
48
|
out:
|
28
49
|
type: salesforce
|
29
50
|
username: hoge@example.com
|
data/build.gradle
CHANGED
@@ -3,10 +3,14 @@ package org.embulk.output;
|
|
3
3
|
import com.google.common.base.Optional;
|
4
4
|
import com.sforce.soap.partner.Connector;
|
5
5
|
import com.sforce.soap.partner.DeleteResult;
|
6
|
+
import com.sforce.soap.partner.DescribeSObjectResult;
|
7
|
+
import com.sforce.soap.partner.Field;
|
8
|
+
import com.sforce.soap.partner.FieldType;
|
6
9
|
import com.sforce.soap.partner.GetUserInfoResult;
|
7
10
|
import com.sforce.soap.partner.PartnerConnection;
|
8
11
|
import com.sforce.soap.partner.SaveResult;
|
9
12
|
import com.sforce.soap.partner.UpsertResult;
|
13
|
+
import com.sforce.soap.partner.fault.ApiFault;
|
10
14
|
import com.sforce.soap.partner.sobject.SObject;
|
11
15
|
import com.sforce.ws.ConnectionException;
|
12
16
|
import com.sforce.ws.ConnectorConfig;
|
@@ -17,11 +21,14 @@ import java.text.SimpleDateFormat;
|
|
17
21
|
import java.util.ArrayList;
|
18
22
|
import java.util.Calendar;
|
19
23
|
import java.util.Date;
|
24
|
+
import java.util.HashMap;
|
20
25
|
import java.util.List;
|
26
|
+
import java.util.Map;
|
21
27
|
import org.embulk.config.CommitReport;
|
22
28
|
import org.embulk.config.Config;
|
23
29
|
import org.embulk.config.ConfigDefault;
|
24
30
|
import org.embulk.config.ConfigDiff;
|
31
|
+
import org.embulk.config.ConfigException;
|
25
32
|
import org.embulk.config.ConfigSource;
|
26
33
|
import org.embulk.config.Task;
|
27
34
|
import org.embulk.config.TaskSource;
|
@@ -45,7 +52,8 @@ public class SalesforceOutputPlugin
|
|
45
52
|
{
|
46
53
|
protected static Logger logger;
|
47
54
|
private static PartnerConnection client = null;
|
48
|
-
|
55
|
+
private static Map<String, String> externalIdToObjectNameMap = null;
|
56
|
+
|
49
57
|
public interface PluginTask
|
50
58
|
extends Task
|
51
59
|
{
|
@@ -112,6 +120,13 @@ public class SalesforceOutputPlugin
|
|
112
120
|
client = Connector.newConnection(connectorConfig);
|
113
121
|
GetUserInfoResult userInfo = client.getUserInfo();
|
114
122
|
logger.info("login successful with {}", userInfo.getUserName());
|
123
|
+
externalIdToObjectNameMap = new HashMap<>();
|
124
|
+
DescribeSObjectResult describeResult = client.describeSObject(task.getSObject());
|
125
|
+
for (Field field : describeResult.getFields()) {
|
126
|
+
if (field.getType() == FieldType.reference) {
|
127
|
+
externalIdToObjectNameMap.put(field.getRelationshipName(), field.getReferenceTo()[0]);
|
128
|
+
}
|
129
|
+
}
|
115
130
|
}
|
116
131
|
} catch(ConnectionException ex) {
|
117
132
|
logger.error("Login error. Please check your credentials.");
|
@@ -193,7 +208,7 @@ public class SalesforceOutputPlugin
|
|
193
208
|
pageReader.getSchema().visitColumns(new ColumnVisitor() {
|
194
209
|
@Override
|
195
210
|
public void doubleColumn(Column column) {
|
196
|
-
|
211
|
+
columnWithReferenceCheck(column.getName(), pageReader.getDouble(column));
|
197
212
|
}
|
198
213
|
@Override
|
199
214
|
public void timestampColumn(Column column) {
|
@@ -207,17 +222,37 @@ public class SalesforceOutputPlugin
|
|
207
222
|
}
|
208
223
|
@Override
|
209
224
|
public void stringColumn(Column column) {
|
210
|
-
|
225
|
+
columnWithReferenceCheck(column.getName(), pageReader.getString(column));
|
211
226
|
}
|
212
227
|
@Override
|
213
228
|
public void longColumn(Column column) {
|
214
|
-
|
229
|
+
columnWithReferenceCheck(column.getName(), pageReader.getLong(column));
|
215
230
|
}
|
216
231
|
@Override
|
217
232
|
public void booleanColumn(Column column) {
|
218
233
|
record.addField(column.getName(), pageReader.getBoolean(column));
|
219
234
|
}
|
220
|
-
|
235
|
+
|
236
|
+
private void columnWithReferenceCheck(String name, Object value) {
|
237
|
+
if (name.indexOf('.') > 0) {
|
238
|
+
String[] tokens = name.split("\\.");
|
239
|
+
String referencesFieldName = tokens[0];
|
240
|
+
String externalIdFieldName = tokens[1];
|
241
|
+
|
242
|
+
SObject sObjRef = new SObject();
|
243
|
+
String refFieldApiName = referencesFieldName.replaceAll("__R", "__r");
|
244
|
+
if (externalIdToObjectNameMap.containsKey(refFieldApiName)) {
|
245
|
+
sObjRef.setType(externalIdToObjectNameMap.get(refFieldApiName));
|
246
|
+
} else {
|
247
|
+
throw new ConfigException("Invalid Relationship Name '" + refFieldApiName + "'");
|
248
|
+
}
|
249
|
+
sObjRef.addField(externalIdFieldName, value);
|
250
|
+
record.addField(referencesFieldName, sObjRef);
|
251
|
+
} else {
|
252
|
+
record.addField(name, value);
|
253
|
+
}
|
254
|
+
}
|
255
|
+
|
221
256
|
});
|
222
257
|
this.records.add(record);
|
223
258
|
|
@@ -231,6 +266,10 @@ public class SalesforceOutputPlugin
|
|
231
266
|
this.action(this.records);
|
232
267
|
logger.info("Number of processed records: {}", this.numOfSuccess + this.numOfError);
|
233
268
|
}
|
269
|
+
} catch (ConfigException ex) {
|
270
|
+
logger.error("Configuration Error: {}", ex.getMessage());
|
271
|
+
} catch (ApiFault ex) {
|
272
|
+
logger.error("API Error: {}", ex.getExceptionMessage());
|
234
273
|
} catch (ConnectionException ex) {
|
235
274
|
logger.error("Connection Error: {}", ex.getMessage());
|
236
275
|
} catch (IOException ex) {
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embulk-output-salesforce
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Makoto Tajitsu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -58,7 +58,7 @@ files:
|
|
58
58
|
- lib/partner.jar
|
59
59
|
- src/main/java/org/embulk/output/SalesforceOutputPlugin.java
|
60
60
|
- src/test/java/org/embulk/output/TestSalesforceOutputPlugin.java
|
61
|
-
- classpath/embulk-output-salesforce-0.1.
|
61
|
+
- classpath/embulk-output-salesforce-0.1.2.jar
|
62
62
|
- classpath/force-wsc-34.0.jar
|
63
63
|
- classpath/partner.jar
|
64
64
|
- classpath/super-csv-2.3.1.jar
|