embulk-output-salesforce 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|