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 ;
18
21
import java .util .ArrayList ;
19
22
import java .util .Calendar ;
20
23
import java .util .Date ;
24
+ import java .util .HashMap ;
21
25
import java .util .List ;
26
+ import java .util .Map ;
22
27
import org .embulk .config .CommitReport ;
23
28
import org .embulk .config .Config ;
24
29
import org .embulk .config .ConfigDefault ;
25
30
import org .embulk .config .ConfigDiff ;
31
+ import org .embulk .config .ConfigException ;
26
32
import org .embulk .config .ConfigSource ;
27
33
import org .embulk .config .Task ;
28
34
import org .embulk .config .TaskSource ;
@@ -46,7 +52,8 @@ public class SalesforceOutputPlugin
46
52
{
47
53
protected static Logger logger ;
48
54
private static PartnerConnection client = null ;
49
-
55
+ private static Map <String , String > externalIdToObjectNameMap = null ;
56
+
50
57
public interface PluginTask
51
58
extends Task
52
59
{
@@ -113,6 +120,13 @@ public ConfigDiff transaction(ConfigSource config,
113
120
client = Connector .newConnection (connectorConfig );
114
121
GetUserInfoResult userInfo = client .getUserInfo ();
115
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
+ }
116
130
}
117
131
} catch (ConnectionException ex ) {
118
132
logger .error ("Login error. Please check your credentials." );
@@ -226,7 +240,12 @@ private void columnWithReferenceCheck(String name, Object value) {
226
240
String externalIdFieldName = tokens [1 ];
227
241
228
242
SObject sObjRef = new SObject ();
229
- sObjRef .setType (referencesFieldName .replaceAll ("__(r|R)" , "__c" ));
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
+ }
230
249
sObjRef .addField (externalIdFieldName , value );
231
250
record .addField (referencesFieldName , sObjRef );
232
251
} else {
@@ -247,6 +266,8 @@ private void columnWithReferenceCheck(String name, Object value) {
247
266
this .action (this .records );
248
267
logger .info ("Number of processed records: {}" , this .numOfSuccess + this .numOfError );
249
268
}
269
+ } catch (ConfigException ex ) {
270
+ logger .error ("Configuration Error: {}" , ex .getMessage ());
250
271
} catch (ApiFault ex ) {
251
272
logger .error ("API Error: {}" , ex .getExceptionMessage ());
252
273
} catch (ConnectionException ex ) {
0 commit comments