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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 29d21f4cf7365b79ed58cbd012c48bf59b31d7ae
4
- data.tar.gz: 77f464e7f1dbfb7aa3d5b9cfc7b27904e3d73688
3
+ metadata.gz: b0d15f227f70f2cf1136aa8c4228366381f953c5
4
+ data.tar.gz: 865df205e83934d43b93ad717412059e701236b3
5
5
  SHA512:
6
- metadata.gz: 06b13aea4bdcc54b1e654788814db4178766b7b7e169b109095acd8ec91c7778827b75fd105fa507993498b6b113f91bb62e3c71a8d51741036e6810e3da8d10
7
- data.tar.gz: 661a287aa359c72769d9a8bf5820db0ef19b50bc3f405fcd999dc9c1f34561d7873cc41ef5f2cf56d585ce2b92aec59fd30fd0489029fbc0460eec23b3a53de7
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
@@ -12,7 +12,7 @@ configurations {
12
12
  provided
13
13
  }
14
14
 
15
- version = "0.1.1"
15
+ version = "0.1.2"
16
16
 
17
17
  dependencies {
18
18
  compile "org.embulk:embulk-core:0.6.11"
@@ -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
- record.addField(column.getName(), pageReader.getDouble(column));
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
- record.addField(column.getName(), pageReader.getString(column));
225
+ columnWithReferenceCheck(column.getName(), pageReader.getString(column));
211
226
  }
212
227
  @Override
213
228
  public void longColumn(Column column) {
214
- record.addField(column.getName(), pageReader.getLong(column));
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.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-22 00:00:00.000000000 Z
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.1.jar
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