[集成]{class="badge positive"}
使用ACS配置文件预填自适应表单 prefilling-adaptive-form-using-acs-profile
[AEM Forms 6.5]{class="badge informative"}
在本部分中,我们使用从ACS获取的用户档案信息预填自适应表单。 AEM Forms具有这项预填自适应表单的强大功能。
若要了解有关预填自适应表单的更多信息,请阅读此教程。
要通过从ACS获取数据预填充自适应表单,我们假设ACS中存在与登录AEM用户具有相同电子邮件的用户档案。 例如,如果登录AEM的人员的电子邮件ID为csimms@adobe.com,我们希望在ACS中找到其电子邮件为csimms@adobe.com的配置文件。
使用REST API从ACS获取配置文件信息时,需要执行以下步骤
- 生成 JWT
- 用JWT交换访问令牌
- 对ACS进行REST调用并通过电子邮件获取配置文件
- 使用配置文件信息构建XML文档
- 返回AEM Forms使用的XML文档的InputStream
将预填充服务与自适应表单关联
以下是从ACS获取和返回配置文件信息的代码。
在第68行,我们获取AEM用户的电子邮件ID。 通过对Adobe Campaign Standard进行REST调用来获取用户档案详细信息。 根据所获取的配置文件详细信息,XML文档的构建方式可为AEM Forms所理解。 返回此文档的输入流供AEM Forms使用。
package aemforms.campaign.core;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.jcr.Session;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.apache.jackrabbit.api.JackrabbitSession;
import org.apache.jackrabbit.api.security.user.Authorizable;
import org.apache.jackrabbit.api.security.user.UserManager;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.adobe.forms.common.service.DataXMLOptions;
import com.adobe.forms.common.service.DataXMLProvider;
import com.adobe.forms.common.service.FormsException;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import formsandcampaign.demo.CampaignConfigurationService;
@Component
public class PrefillAdaptiveFormWithCampaignProfile implements DataXMLProvider {
private static final Logger log = LoggerFactory.getLogger(PrefillAdaptiveFormWithCampaignProfile.class);
private static final String SERVER_FQDN = "mc.adobe.io";
private static final String ENDPOINT = "/campaign/profileAndServices/profile/byEmail?email=";
@Reference
CampaignService jwtService;
@Reference
CampaignConfigurationService campaignConfig;
Session session = null;
public JsonObject getProfileDetails()
{
String jwtToken = null;
String email = null;
log.debug("$$$$ in getProfile Details");
try
{
jwtToken = jwtService.getAccessToken();
UserManager um = ((JackrabbitSession) session).getUserManager();
Authorizable loggedinUser = um.getAuthorizable(session.getUserID());
email = loggedinUser.getProperty("profile/email")[0].getString();
log.debug("####Got email..." + email);
}
catch (Exception e)
{
log.error("Unable to generate JWT!\n", e);
}
String tenant = campaignConfig.getTenant();
String apikey = campaignConfig.getApiKey();
String path = "/" + tenant + ENDPOINT + email;
HttpHost server = new HttpHost(SERVER_FQDN, 443, "https");
HttpGet getReq = new HttpGet(path);
getReq.addHeader("Cache-Control", "no-cache");
getReq.addHeader("Content-Type", "application/json");
getReq.addHeader("X-Api-Key", apikey);
getReq.addHeader("Authorization", "Bearer " + jwtToken);
HttpClient httpClient = HttpClientBuilder.create().build();
try
{
HttpResponse result = httpClient.execute(server, getReq);
String responseJson = EntityUtils.toString(result.getEntity());
log.debug("The response Json" + responseJson);
JsonObject responseJsonProfiles = new JsonParser().parse(responseJson).getAsJsonObject();
log.debug("The json array is " + responseJsonProfiles.toString());
return responseJsonProfiles.get("content").getAsJsonArray().get(0).getAsJsonObject();
}
catch (ClientProtocolException e)
{
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public InputStream getDataXMLForDataRef(DataXMLOptions dataXmlOptions) throws FormsException {
// TODO Auto-generated method stub
log.debug("Geting xml");
InputStream xmlDataStream = null;
Resource aemFormContainer = dataXmlOptions.getFormResource();
ResourceResolver resolver = aemFormContainer.getResourceResolver();
session = resolver.adaptTo(Session.class);
JsonObject profile = getProfileDetails();
log.debug("####profile last name ####" + profile.get("lastName").getAsString());
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("data");
doc.appendChild(rootElement);
Element firstNameElement = doc.createElement("fname");
firstNameElement.setTextContent(profile.get("firstName").getAsString());
log.debug("created firstNameElement " + profile.get("firstName").getAsString());
Element lastNameElement = doc.createElement("lname");
Element jobTitleElement = doc.createElement("jobTitle");
jobTitleElement.setTextContent(profile.get("salutation").getAsString());
Element cityElement = doc.createElement("city");
cityElement.setTextContent(profile.get("location").getAsJsonObject().get("city").getAsString());
log.debug("created cityElement " + profile.get("location").getAsJsonObject().get("city").getAsString());
Element countryElement = doc.createElement("country");
countryElement.setTextContent(profile.get("location").getAsJsonObject().get("countryCode").getAsString());
Element streetElement = doc.createElement("street");
streetElement.setTextContent(profile.get("location").getAsJsonObject().get("address1").getAsString());
Element postalCodeElement = doc.createElement("postalCode");
postalCodeElement.setTextContent(profile.get("location").getAsJsonObject().get("zipCode").getAsString());
Element genderElement = doc.createElement("gender");
genderElement.setTextContent(profile.get("gender").getAsString());
lastNameElement.setTextContent(profile.get("lastName").getAsString());
Element emailElement = doc.createElement("email");
emailElement.setTextContent(profile.get("email").getAsString());
rootElement.appendChild(firstNameElement);
rootElement.appendChild(lastNameElement);
rootElement.appendChild(emailElement);
rootElement.appendChild(streetElement);
rootElement.appendChild(countryElement);
rootElement.appendChild(cityElement);
rootElement.appendChild(jobTitleElement);
rootElement.appendChild(postalCodeElement);
rootElement.appendChild(genderElement);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
DOMSource source = new DOMSource(doc);
StreamResult outputTarget = new StreamResult(outputStream);
TransformerFactory.newInstance().newTransformer().transform(source, outputTarget);
xmlDataStream = new ByteArrayInputStream(outputStream.toByteArray());
return xmlDataStream;
}
catch (ParserConfigurationException e)
{
e.printStackTrace();
}catch (TransformerConfigurationException e)
{
e.printStackTrace();
}
catch (TransformerException e)
{
e.printStackTrace();
} catch (TransformerFactoryConfigurationError e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
public String getServiceDescription() {
return "Custom Aem Form Pre Fill Service using campaign";
}
@Override
public String getServiceName() {
// TODO Auto-generated method stub
return "Pre Fill Forms Using Campaign Profile";
}
}
要在您的系统上使其正常工作,请按照以下说明操作:
- 请确保您已按照此处所述的步骤进行操作
- 使用包管理器将自适应表单示例导入AEM
- 确保您使用其电子邮件ID由Adobe Campaign中的配置文件共享的用户登录AEM。 例如,如果AEM用户的电子邮件ID是johndoe@adobe.com ,则您需要在ACS中拥有其电子邮件是johndoe@adobe.com的配置文件。
- 预览表单。
8de24117-1378-413c-a581-01e660b7163e