ProfileRetrieverImpl.java
6.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*
* Decompiled with CFR 0_118.
*
* Could not load the following classes:
* com.day.cq.wcm.webservicesupport.Configuration
* org.apache.felix.scr.annotations.Component
* org.apache.felix.scr.annotations.Reference
* org.apache.felix.scr.annotations.Service
* org.apache.sling.api.resource.Resource
* org.apache.sling.api.resource.ResourceUtil
* org.apache.sling.api.resource.ValueMap
* org.apache.sling.commons.json.JSONException
* org.apache.sling.commons.json.JSONObject
* org.slf4j.Logger
* org.slf4j.LoggerFactory
*/
package com.adobe.cq.mcm.campaign.profile.impl;
import com.adobe.cq.mcm.campaign.profile.MetaDataNode;
import com.adobe.cq.mcm.campaign.profile.Profile;
import com.adobe.cq.mcm.campaign.profile.ProfileRetriever;
import com.adobe.cq.mcm.campaign.profile.impl.ProfileImpl;
import com.day.cq.mcm.campaign.ACConnectorException;
import com.day.cq.mcm.campaign.CallResults;
import com.day.cq.mcm.campaign.CampaignConnector;
import com.day.cq.mcm.campaign.CampaignCredentials;
import com.day.cq.mcm.campaign.ConfigurationException;
import com.day.cq.wcm.webservicesupport.Configuration;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceUtil;
import org.apache.sling.api.resource.ValueMap;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Service
@Component(metatype=0)
public class ProfileRetrieverImpl
implements ProfileRetriever {
@Reference
private CampaignConnector connector;
private final Logger log;
public ProfileRetrieverImpl() {
this.log = LoggerFactory.getLogger(this.getClass());
}
private String getJSON(Resource page, String encryptedPK) throws ACConnectorException {
String json;
Resource resource = page.getChild("jcr:content");
if (resource == null) {
throw new ConfigurationException("Missing 'jcr:content' child node (path: " + page.getPath() + ").");
}
Configuration config = this.connector.getWebserviceConfig(page);
CampaignCredentials credentials = this.connector.retrieveCredentials(config);
ValueMap values = ResourceUtil.getValueMap((Resource)resource);
String mappingId = (String)values.get("acMapping", String.class);
if (mappingId == null) {
throw new ConfigurationException("Missing delivery mapping on page.");
}
HashMap<String, String> parameters = new HashMap<String, String>(4);
parameters.put("mapping", mappingId);
parameters.put("resource", mappingId);
parameters.put("encryptedPK", encryptedPK);
CallResults results = null;
try {
this.log.debug("Requesting profile from Adobe Campaign ,,,");
results = this.connector.callFunction("amcGetProfile.jssp", parameters, credentials);
json = results.bodyAsString();
this.log.debug("Retrieved successfully; JSON is: {}", (Object)json);
}
catch (IOException ioe) {
throw new ACConnectorException("Could not determine response body.", ioe);
}
finally {
if (results != null) {
results.destroy();
}
}
return json;
}
private void parseJSON(Profile profile, JSONObject jsonObj, MetaDataNode metaData) throws ACConnectorException {
try {
Iterator keys = jsonObj.keys();
while (keys.hasNext()) {
String key = (String)keys.next();
Object value = jsonObj.get(key);
if (value instanceof JSONObject) {
JSONObject objValue = (JSONObject)value;
MetaDataNode child = metaData.getChildByPath(key);
if (child != null) {
this.parseJSON(profile, objValue, child);
continue;
}
this.log.debug("Profile does not match meta data; no child '" + key + "' " + "available on path '" + metaData.getPath() + "'\n" + "profile: " + profile.toString() + "\n" + "meta data: " + metaData.toString());
continue;
}
MetaDataNode data = metaData.getChildByPath(key);
if (data != null) {
profile.setValue(data, jsonObj.get(key));
continue;
}
this.log.debug("Profile does not match meta data; no child '" + key + "' " + "available on path '" + metaData.getPath() + "'\n" + "profile: " + profile.toString() + "\n" + "meta data: " + metaData.toString());
}
}
catch (JSONException je) {
throw new ACConnectorException("Could not parse JSON", (Throwable)je);
}
}
private Profile parseJSON(String json, MetaDataNode metaData) throws ACConnectorException {
try {
ProfileImpl profile = new ProfileImpl();
JSONObject jsonObject = new JSONObject(json);
MetaDataNode child = metaData.getChildByPath("recipient");
metaData = child != null ? child : metaData;
this.parseJSON(profile, jsonObject, metaData);
return profile;
}
catch (JSONException je) {
throw new ACConnectorException("Could not parse JSON", (Throwable)je);
}
}
@Override
public Profile load(Resource page, String encryptedPK, MetaDataNode metaData) throws ACConnectorException {
String json = this.getJSON(page, encryptedPK);
return this.parseJSON(json, metaData);
}
protected void bindConnector(CampaignConnector campaignConnector) {
this.connector = campaignConnector;
}
protected void unbindConnector(CampaignConnector campaignConnector) {
if (this.connector == campaignConnector) {
this.connector = null;
}
}
}