[Integrazione]{class="badge positive"}
Precompilazione di un modulo adattivo tramite il profilo ACS prefilling-adaptive-form-using-acs-profile
[AEM Forms 6.5]{class="badge informative"}
In questa parte, precompiliamo il Modulo adattivo con le informazioni del profilo recuperate da ACS. AEM Forms dispone di questa potente funzionalità per la precompilazione dei moduli adattivi.
Per ulteriori informazioni sulla precompilazione dei moduli adattivi, consulta questa esercitazione.
Per precompilare il modulo adattivo recuperando i dati da ACS, supponiamo che vi sia un profilo in ACS che ha la stessa e-mail dell’utente AEM connesso. Ad esempio, se l’ID e-mail della persona che ha effettuato l’accesso a AEM è csimms@adobe.com, prevediamo di trovare un profilo in ACS la cui e-mail è csimms@adobe.com.
Per recuperare le informazioni del profilo da ACS utilizzando l’API REST sono necessari i seguenti passaggi
- Genera JWT
- Scambia il codice JWT con un token di accesso
- Effettuare una chiamata REST ad ACS e recuperare il profilo tramite e-mail
- Crea documento XML con le informazioni del profilo
- Restituisci InputStream del documento XML utilizzato da AEM Forms
Associazione del servizio di precompilazione al modulo adattivo
Di seguito è riportato il codice per recuperare e restituire le informazioni sul profilo da ACS.
Alla riga 68 recuperiamo l’ID e-mail dell’utente AEM. I dettagli del profilo vengono recuperati effettuando una chiamata REST ad Adobe Campaign Standard. Dai dettagli del profilo recuperato, il documento XML viene costruito in modo da essere compreso da AEM Forms. Il flusso di input di questo documento viene restituito per l'utilizzo da 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";
}
}
Per eseguire questa operazione sul sistema, attenersi alle seguenti istruzioni:
- Assicurarsi di aver seguito i passaggi descritti qui
- Importare un modulo adattivo di esempio in AEM utilizzando il gestore di pacchetti
- Assicurati di accedere all’AEM con un utente il cui ID e-mail è condiviso da un profilo in Adobe Campaign. Ad esempio, se l’ID e-mail dell’utente AEM è johndoe@adobe.com, è necessario disporre di un profilo in ACS la cui e-mail è johndoe@adobe.com.
- Anteprima modulo.
Passaggi successivi
Creare un profilo Adobe Campaign utilizzando il modello dati del modulo