[통합]{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에 샘플 적응형 양식 가져오기
- Adobe Campaign의 프로필에서 이메일 ID를 공유하는 사용자로 AEM에 로그인해야 합니다. 예를 들어 AEM 사용자의 이메일 ID가 johndoe@adobe.com이면 ACS에서 이메일이 johndoe@adobe.com인 프로필이 있어야 합니다.
- 양식을 미리 봅니다.
8de24117-1378-413c-a581-01e660b7163e