Chamada de AEM Forms usando a API Java invoking-aem-forms-using-the-javaapi
Os exemplos e amostras neste documento são somente para AEM Forms no ambiente JEE.
O AEM Forms pode ser chamado usando a API Java do AEM Forms. Ao usar a API Java do AEM Forms, você pode usar a API de chamada ou as bibliotecas de cliente Java. As bibliotecas de cliente Java estão disponíveis para serviços como o serviço Rights Management. Essas APIs altamente tipificadas permitem desenvolver aplicativos Java que chamam o AEM Forms.
A API de Invocação são classes que estão no estado com.adobe.idp.dsc
pacote. Usando essas classes, você pode enviar uma solicitação de chamada diretamente para um serviço e lidar com uma resposta de chamada retornada. Use a API de Invocação para chamar processos de vida curta ou longa criados com o Workbench.
A maneira recomendada de chamar um serviço programaticamente é usar uma biblioteca de cliente Java que corresponda ao serviço, em vez da API de chamada. Por exemplo, para chamar o Serviço de criptografia, use a biblioteca do cliente do Serviço de criptografia. Para executar uma operação do Serviço de criptografia, chame um método que pertença ao objeto cliente do Serviço de criptografia. Você pode criptografar um documento PDF com uma senha chamando o EncryptionServiceClient
do objeto encryptPDFUsingPassword
método.
A API Java é compatível com os seguintes recursos:
- Protocolo de transporte RMI para invocação remota
- Transporte de VM para invocação local
- SOAP para invocação remota
- Autenticação diferente, como nome de usuário e senha
- Solicitações de invocação síncrona e assíncrona
Inclusão de arquivos da biblioteca Java do AEM Forms
Chamar processos de longa vida centrados no ser humano
Chamar o AEM Forms usando serviços da Web
Definindo propriedades de conexão
Passagem de dados para serviços da AEM Forms usando a API do Java
Chamar um serviço usando uma biblioteca cliente Java
Chamar um processo de vida curta usando a API de chamada
Criar uma aplicação Web Java que invoca um processo de longa vida centrado no ser humano
Inclusão de arquivos da biblioteca Java do AEM Forms including-aem-forms-java-library-files
Para chamar programaticamente um serviço AEM Forms usando a API Java, inclua os arquivos de biblioteca necessários (arquivos JAR) no classpath do projeto Java. Os arquivos JAR incluídos no classpath do aplicativo cliente dependem de vários fatores:
- O serviço AEM Forms a ser chamado. Um aplicativo cliente pode chamar um ou mais serviços.
- O modo no qual você deseja chamar um serviço AEM Forms. Você pode usar o modo EJB ou SOAP. (Consulte Definindo propriedades de conexão.)
standalone.bat -b <Server IP> -c lc_turnkey.xml
para especificar um IP de servidor para EJB- O servidor de aplicativos J2EE no qual o AEM Forms é implantado.
Arquivos JAR específicos do serviço service-specific-jar-files
A tabela a seguir lista os arquivos JAR necessários para chamar os serviços do AEM Forms.
adobe-repository-client.jar
commons-codec-1.3.jar
<diretório de instalação>/sdk/client-libs/common
<diretório de instalação>/sdk/client-libs\third-party
-
adobe-rightsmanagement-client.jar
-
namespace.jar
-
jaxb-api.jar
-
jaxb-impl.jar
-
jaxb-libs.jar
-
jaxb-xjc.jar
-
relaxngDatatype.jar
-
xsdlib.jar
Necessário para invocar o serviço Rights Management.
Se o AEM Forms for implantado no JBoss, inclua todos esses arquivos.
<diretório de instalação>/sdk/client-libs/common
diretório lib específico de JBoss
Modo de conexão e arquivos JAR da aplicação J2EE connection-mode-and-j2ee-application-jar-files
A tabela a seguir lista os arquivos JAR que dependem do modo de conexão e do servidor da aplicação J2EE no qual o AEM Forms é disponibilizado.
</thead align="left">
-
activation.jar
-
axis.jar
-
commons-codec-1.3.jar
-
commons-collections-3.1.jar
-
commons-discovery.jar
-
commons-logging.jar
-
dom3-xml-apis-2.5.0.jar
-
jaxen-1.1-beta-9.jar
-
jaxrpc.jar
-
log4j.jar
-
mail.jar
-
saaj.jar
-
wsdl4j.jar
-
xalan.jar
-
xbean.jar
- xercesImpl.jar
- commons-httpclient-3.1.jar
se o AEM Forms for implantado no JBoss Application Server, inclua esse arquivo JAR.
As classes necessárias não serão encontradas pelo carregador de classes se jboss-client.jar e os jars referenciados não forem co-localizados.
Diretório lib do cliente JBoss
Se você implantar a aplicação cliente no mesmo servidor de aplicações J2EE, não será necessário incluir esse arquivo.
Diretório de biblioteca específico do WebLogic
Se você implantar a aplicação cliente no mesmo servidor de aplicações J2EE, não será necessário incluir esse arquivo.
-
com.ibm.ws.admin.client_6.1.0.jar
-
com.ibm.ws.webservices.thinclient_6.1.0.jar
-
se o AEM Forms for implantado no WebSphere Application Server, inclua esses arquivos JAR.
-
(com.ibm.ws.webservices.thinclient_6.1.0.jar é necessário para a invocação do serviço Web).
Diretório de biblioteca específico do WebSphere ([WAS_HOME]/runtimes)
Se você disponibilizar a aplicação cliente no mesmo servidor de aplicações J2EE, não será necessário incluir esses arquivos.
Chamar cenários invoking-scenarios
A tabela a seguir especifica cenários de chamada e lista os arquivos JAR necessários para chamar o AEM Forms com êxito.
</thead align="left"> xmp-uti
-
adobe-livecycle-client.jar
-
adobe-usermanager-client.jar
- jboss-client.jar
- adobe-forms-client.jar
- commons-httpclient-3.1.jar
serviço Forms
Serviço de extensões do Acrobat Reader DC
Serviço de assinatura
-
adobe-livecycle-client.jar
-
adobe-usermanager-client.jar
- jboss-client.jar
- commons-httpclient-3.1.jar
-
adobe-forms-client.jar
-
adobe-reader-extensions-client.jar
-
adobe-signatures-client.jar
-
adobe-livecycle-client.jar
-
adobe-usermanager-client.jar
-
wlclient.jar
-
activation.jar
-
axis.jar
-
commons-codec-1.3.jar
-
commons-collections-3.1.jar
-
commons-discovery.jar
-
commons-logging.jar
-
dom3-xml-apis-2.5.0.jar
-
jai_imageio.jar
-
jaxen-1.1-beta-9.jar
-
jaxrpc.jar
-
log4j.jar
-
mail.jar
-
saaj.jar
-
wsdl4j.jar
-
xalan.jar
-
xbean.jar
-
xercesImpl.jar
-
adobe-forms-client.jar
serviço Forms
Serviço de extensões do Acrobat Reader DC
Serviço de assinatura
-
adobe-livecycle-client.jar
-
adobe-usermanager-client.jar
-
wlclient.jar
-
activation.jar
-
axis.jar
-
commons-codec-1.3.jar
-
commons-collections-3.1.jar
-
commons-discovery.jar
-
commons-logging.jar
-
dom3-xml-apis-2.5.0.jar
-
jai_imageio.jar
-
jaxen-1.1-beta-9.jar
-
jaxrpc.jar
-
log4j.jar
-
mail.jar
-
saaj.jar
-
wsdl4j.jar
-
xalan.jar
-
xbean.jar
-
xercesImpl.jar
-
adobe-forms-client.jar
-
adobe-reader-extensions-client.jar
-
adobe-signatures-client.jar
Atualizando arquivos JAR upgrading-jar-files
Se você estiver atualizando do LiveCycle para o AEM Forms, é recomendável incluir os arquivos JAR do AEM Forms no caminho de classe do projeto Java. Por exemplo, se estiver usando serviços como o serviço Rights Management, você encontrará um problema de compatibilidade se não incluir arquivos JAR do AEM Forms no caminho da classe.
Supondo que você esteja atualizando para o AEM Forms. Para usar um aplicativo Java que chama o serviço Rights Management, inclua as versões AEM Forms dos seguintes arquivos JAR:
- adobe-rightsmanagement-client.jar
- adobe-livecycle-client.jar
- adobe-usermanager-client.jar
Consulte também
Chamada de AEM Forms usando a API Java
Definindo propriedades de conexão
Passagem de dados para serviços da AEM Forms usando a API do Java
Chamar um serviço usando uma biblioteca cliente Java
Definindo propriedades de conexão setting-connection-properties
Você define propriedades de conexão para chamar o AEM Forms ao usar a API Java. Ao definir as propriedades de conexão, especifique se os serviços devem ser chamados remota ou localmente e também especifique o modo de conexão e os valores de autenticação. Os valores de autenticação serão necessários se a segurança do serviço estiver habilitada. No entanto, se a segurança do serviço estiver desativada, não será necessário especificar valores de autenticação.
O modo de conexão pode ser SOAP ou EJB. O modo EJB usa o protocolo RMI/IIOP e o desempenho do modo EJB é melhor do que o desempenho do modo SOAP. O modo SOAP é usado para eliminar uma dependência do servidor de aplicativos J2EE ou quando um firewall está localizado entre o AEM Forms e o aplicativo cliente. O modo SOAP usa o protocolo https como transporte subjacente e pode se comunicar entre limites de firewall. Se nem uma dependência do servidor de aplicações J2EE nem um firewall for um problema, é recomendável usar o modo EJB.
Para chamar um serviço AEM Forms com êxito, defina as seguintes propriedades de conexão:
-
DSC_DEFAULT_EJB_ENDPOINT: Se você estiver usando o modo de conexão EJB, este valor representa o URL do servidor da aplicação J2EE no qual o AEM Forms é disponibilizado. Para chamar o AEM Forms remotamente, especifique o nome do servidor da aplicação J2EE no qual o AEM Forms está implantado. Se sua aplicação cliente estiver localizada no mesmo servidor de aplicações J2EE, você poderá especificar
localhost
. Dependendo do servidor de aplicações J2EE em que o AEM Forms é disponibilizado, especifique um dos seguintes valores:- JBoss:
https://<ServerName>:8080 (default port)
- WebSphere:
iiop://<ServerName>:2809 (default port)
- WebLogic:
t3://<ServerName>:7001 (default port)
- JBoss:
-
DSC_DEFAULT_SOAP_ENDPOINT: Se estiver usando o modo de conexão SOAP, esse valor representará o endpoint para onde uma solicitação de chamada é enviada. Para chamar o AEM Forms remotamente, especifique o nome do servidor da aplicação J2EE no qual o AEM Forms está implantado. Se sua aplicação cliente estiver localizada no mesmo servidor de aplicações J2EE, você poderá especificar
localhost
(por exemplo,http://localhost:8080
.)- O valor da porta
8080
é aplicável se a aplicação J2EE for JBoss. Se o servidor de aplicativos J2EE for IBM® WebSphere®, use a porta9080
. Da mesma forma, se o servidor de aplicativos J2EE for WebLogic, use a porta7001
. (Esses valores são valores de porta padrão. Se você alterar o valor da porta, use o número da porta aplicável.)
- O valor da porta
-
DSC_TRANSPORT_PROTOCOL: Se estiver usando o modo de conexão EJB, especifique
ServiceClientFactoryProperties.DSC_EJB_PROTOCOL
para este valor. Se estiver usando o modo de conexão SOAP, especifiqueServiceClientFactoryProperties.DSC_SOAP_PROTOCOL
. -
DSC_SERVER_TYPE: Especifica o servidor da aplicação J2EE no qual o AEM Forms é disponibilizado. Os valores válidos são
JBoss
,WebSphere
,WebLogic
.- Se você definir essa propriedade de conexão como
WebSphere
, ojava.naming.factory.initial
o valor está definido comocom.ibm.ws.naming.util.WsnInitCtxFactory
. - Se você definir essa propriedade de conexão como
WebLogic
, ojava.naming.factory.initial
o valor está definido comoweblogic.jndi.WLInitialContextFactory
. - Da mesma forma, se você definir essa propriedade de conexão como
JBoss
, ojava.naming.factory.initial
o valor está definido comoorg.jnp.interfaces.NamingContextFactory
. - Você pode definir a variável
java.naming.factory.initial
a um valor que atenda aos requisitos se não quiser usar os valores padrão.
note note NOTE Em vez de usar uma string para definir o DSC_SERVER_TYPE
propriedade de conexão, você pode usar um membro estático da variávelServiceClientFactoryProperties
classe. Os seguintes valores podem ser usados:ServiceClientFactoryProperties.DSC_WEBSPHERE_SERVER_TYPE
,ServiceClientFactoryProperties.DSC_WEBLOGIC_SERVER_TYPE
ouServiceClientFactoryProperties.DSC_JBOSS_SERVER_TYPE
. - Se você definir essa propriedade de conexão como
-
DSC_CREDENTIAL_USERNAME: Especifica o nome de usuário dos formulários AEM. Para que um usuário chame um serviço do AEM Forms com êxito, ele precisa da função Usuário de serviços. Um usuário também pode ter outra função que inclua a permissão Chamar serviço. Caso contrário, uma exceção é lançada quando eles tentam chamar um serviço. Se a segurança do serviço estiver desabilitada, não será necessário especificar essa propriedade de conexão.
-
DSC_CREDENTIAL_PASSWORD Especifica o valor de senha correspondente. Se a segurança do serviço estiver desabilitada, não será necessário especificar essa propriedade de conexão.
-
DSC_REQUEST_TIMEOUT: O tempo limite de solicitação padrão para a solicitação SOAP é de 1200.000 milissegundos (20 minutos). Às vezes, uma solicitação pode exigir mais tempo para concluir a operação. Por exemplo, uma solicitação SOAP que recupera um grande conjunto de registros pode exigir um tempo limite mais longo. Você pode usar o
ServiceClientFactoryProperties.DSC_REQUEST_TIMEOUT
para aumentar o tempo limite da chamada de solicitação para as solicitações SOAP.observação: somente invocações baseadas em SOAP oferecem suporte à propriedade DSC_REQUEST_TIMEOUT.
Para definir propriedades de conexão, execute as seguintes tarefas:
-
Criar um
java.util.Properties
usando seu construtor. -
Para definir a variável
DSC_DEFAULT_EJB_ENDPOINT
propriedade de conexão, chame a variáveljava.util.Properties
do objetosetProperty
e passe os seguintes valores:- A variável
ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT
valor de enumeração - Um valor de string que especifica o URL do servidor da aplicação J2EE que hospeda o AEM Forms
note note NOTE Se estiver usando o modo de conexão SOAP, especifique o ServiceClientFactoryProperties.DSC_DEFAULT_SOAP_ENDPOINT
valor de enumeração em vez deServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT
valor de enumeração. - A variável
-
Para definir a variável
DSC_TRANSPORT_PROTOCOL
propriedade de conexão, chame a variáveljava.util.Properties
do objetosetProperty
e passe os seguintes valores:- A variável
ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL
valor de enumeração - A variável
ServiceClientFactoryProperties.DSC_EJB_PROTOCOL
valor de enumeração
note note NOTE Se estiver usando o modo de conexão SOAP, especifique o ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL
valor de enumeração em vez deServiceClientFactoryProperties.DSC_EJB_PROTOCOL
valor de enumeração. - A variável
-
Para definir a variável
DSC_SERVER_TYPE
propriedade de conexão, chame a variáveljava.util.Properties
do objetosetProperty
e passe os seguintes valores:-
A variável
ServiceClientFactoryProperties.DSC_SERVER_TYPE
valor de enumeração -
Um valor de string que especifica o servidor da aplicação J2EE que hospeda o AEM Forms (por exemplo, se o AEM Forms for disponibilizado no JBoss, especifique
JBoss
).- Para definir a variável
DSC_CREDENTIAL_USERNAME
propriedade de conexão, chame a variáveljava.util.Properties
do objetosetProperty
e passe os seguintes valores:
- Para definir a variável
-
A variável
ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME
valor de enumeração -
Um valor de string que especifica o nome de usuário necessário para chamar o AEM Forms
- Para definir a variável
DSC_CREDENTIAL_PASSWORD
propriedade de conexão, chame a variáveljava.util.Properties
do objetosetProperty
e passe os seguintes valores:
- Para definir a variável
-
A variável
ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD
valor de enumeração -
Um valor de string que especifica o valor de senha correspondente
-
Definindo o modo de conexão EJB para JBoss
O exemplo de código Java a seguir define propriedades de conexão para chamar o AEM Forms implantado em JBoss e usando o modo de conexão EJB.
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "https://<hostname>:8080");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DOCUMENT_HTTP_ENDPOINT,"https://<hostname>:8080");
Definindo o modo de conexão EJB para o WebLogic
O exemplo de código Java a seguir define propriedades de conexão para chamar o AEM Forms implantado no WebLogic e usando o modo de conexão EJB.
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "t3://localhost:7001");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "WebLogic");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password");
Definindo o modo de conexão EJB para o WebSphere
O exemplo de código Java a seguir define propriedades de conexão para chamar o AEM Forms implantado no WebSphere e usando o modo de conexão EJB.
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "iiop://localhost:2809");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "WebSphere");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password");
Definindo o modo de conexão SOAP
O exemplo de código Java a seguir define propriedades de conexão no modo SOAP para chamar o AEM Forms implantado no JBoss.
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_SOAP_ENDPOINT, "http://localhost:8080");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password");
Definindo propriedades de conexão quando a segurança do serviço está desabilitada
O exemplo de código Java a seguir define as propriedades de conexão necessárias para chamar o AEM Forms implantado no JBoss Application Server e quando a segurança do serviço está desativada.
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "jnp://localhost:1099");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
Definindo o modo de conexão SOAP com tempo limite de solicitação personalizado
Properties ConnectionProps = new Properties();
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_SOAP_ENDPOINT, "http://localhost:8080");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL);
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_REQUEST_TIMEOUT, "1800000"); // Request timeout limit 30 Minutes
Uso de um objeto de contexto para chamar o AEM Forms
Você pode usar um com.adobe.idp.Context
objeto para chamar um serviço AEM Forms com um usuário autenticado (o com.adobe.idp.Context
representa um usuário autenticado). Ao usar uma com.adobe.idp.Context
objeto, não é necessário definir o DSC_CREDENTIAL_USERNAME
ou DSC_CREDENTIAL_PASSWORD
propriedades. Você pode obter um com.adobe.idp.Context
ao autenticar usuários usando o AuthenticationManagerServiceClient
do objeto authenticate
método.
A variável authenticate
o método retorna um AuthResult
objeto que contém os resultados da autenticação. Você pode criar um com.adobe.idp.Context
invocando seu construtor. Em seguida, chame o com.adobe.idp.Context
do objeto initPrincipal
e transmita o AuthResult
conforme mostrado no código a seguir:
Context myCtx = new Context();
myCtx.initPrincipal(authResult);
Em vez de definir o DSC_CREDENTIAL_USERNAME
ou DSC_CREDENTIAL_PASSWORD
propriedades, você pode chamar a variável ServiceClientFactory
do objeto setContext
e transmita o com.adobe.idp.Context
objeto. Ao usar um usuário de formulários AEM para chamar um serviço, verifique se ele tem a função chamada Services User
que é necessário para chamar um serviço AEM Forms.
O código de exemplo a seguir mostra como usar um com.adobe.idp.Context
objeto nas configurações de conexão usadas para criar um EncryptionServiceClient
objeto.
//Authenticate a user and use the Context object within connection settings
// Authenticate the user
String username = "wblue";
String password = "password";
AuthResult authResult = authClient.authenticate(username, password.getBytes());
//Set a Content object that represents the authenticated user
//Use the Context object to invoke the Encryption service
Context myCtx = new Context();
myCtx.initPrincipal(authResult);
//Set connection settings
Properties connectionProps = new Properties();
connectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "jnp://<server>:1099");
connectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL, ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
connectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, ServiceClientFactoryProperties.DSC_JBOSS_SERVER_TYPE);
connectionProps.setProperty(ServiceClientFactoryProperties.DSC_DOCUMENT_HTTP_ENDPOINT,"jnp://<server>:1099");
//Create a ServiceClientFactory object
ServiceClientFactory myFactory = ServiceClientFactory.createInstance(connectionProps);
myFactory.setContext(myCtx);
//Create an EncryptionServiceClient object
EncryptionServiceClient encryptClient = new EncryptionServiceClient(myFactory);
Chamar cenários invoking_scenarios-1
Os cenários de chamada a seguir são discutidos nesta seção:
- Um aplicativo cliente em execução em sua própria máquina virtual Java (JVM) chama uma instância AEM Forms independente.
- Um aplicativo cliente em execução em sua própria JVM invoca instâncias do AEM Forms em cluster.
Aplicativo cliente que invoca uma instância autônoma do AEM Forms client-application-invoking-a-stand-alone-aem-forms-instance
O diagrama a seguir mostra uma aplicação cliente sendo executada em sua própria JVM e chamando uma instância independente do AEM Forms.
Nesse cenário, um aplicativo cliente é executado em sua própria JVM e chama os serviços da AEM Forms.
Aplicativo cliente que invoca instâncias AEM Forms clusterizadas client-application-invoking-clustered-aem-forms-instances
O diagrama a seguir mostra uma aplicação cliente sendo executada em sua própria JVM e chamando instâncias do AEM Forms em um cluster.
Esse cenário é semelhante a um aplicativo cliente que chama uma instância AEM Forms independente. No entanto, o URL do provedor é diferente. Se um aplicativo cliente quiser se conectar a um servidor de aplicativos J2EE específico, o aplicativo deverá alterar o URL para fazer referência ao servidor de aplicativos J2EE específico.
Não é recomendável fazer referência a um servidor de aplicativos J2EE específico porque a conexão entre o aplicativo cliente e o AEM Forms será encerrada se o servidor de aplicativos for interrompido. Recomenda-se que o URL do provedor faça referência a um gerenciador JNDI no nível da célula, em vez de um servidor de aplicativos J2EE específico.
Os aplicativos clientes que usam o modo de conexão SOAP podem usar a porta do balanceador de carga HTTP para o cluster. As aplicações clientes que usam o modo de conexão EJB podem se conectar à porta EJB de um servidor de aplicações J2EE específico. Esta ação lida com o Balanceamento de Carga entre nós de cluster.
WebSphere
O exemplo a seguir mostra o conteúdo de um arquivo jndi.properties usado para se conectar ao AEM Forms que é implantado no WebSphere.
java.naming.factory.initial=com.ibm.websphere.naming.
WsnInitialContextFactory
java.naming.provider.url=corbaloc::appserver1:9810,:appserver2:9810
Weblogic
O exemplo a seguir mostra o conteúdo de um arquivo jndi.properties usado para se conectar a AEM Forms que é implantado no WebLogic.
java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
java.naming.provider.url=t3://appserver1:8001, appserver2:8001
Jboss
O exemplo a seguir mostra o conteúdo de um arquivo jndi.properties usado para se conectar a AEM Forms que é implantado no JBoss.
java.naming.factory.initial= org.jnp.interfaces.NamingContextFactory
java.naming.provider.url= jnp://appserver1:1099, appserver2:1099,
appserver3:1099
Consulte também
Inclusão de arquivos biblioteca Java AEM Forms
Passar dados para serviços AEM Forms usando a API Java
Invocando um serviço usando um biblioteca do cliente Java
Passar dados para serviços AEM Forms usando a API Java passing-data-to-aem-forms-services-using-the-java-api
As operações de serviço da AEM Forms normalmente consomem ou produzem documentos PDF. Quando você chama um serviço, às vezes é necessário passar um documento PDF (ou outros tipos de documento, como dados XML) para o serviço. Da mesma forma, às vezes é necessário manipular um documento PDF que é retornado do serviço. A classe Java que permite enviar dados de e para serviços da AEM Forms é com.adobe.idp.Document
.
Os serviços da AEM Forms não aceitam um documento PDF como outros tipos de dados, como um java.io.InputStream
objeto ou uma matriz de bytes. A com.adobe.idp.Document
O objeto também pode ser usado para transmitir outros tipos de dados, como dados XML, para serviços.
A com.adobe.idp.Document
objeto é um tipo serializável Java, portanto, pode ser passado por uma chamada RMI. O lado receptor pode ser colocado (mesmo host, mesmo carregador de classe), local (mesmo host, carregador de classe diferente) ou remoto (host diferente). A transmissão do conteúdo do documento é otimizada para cada caso. Por exemplo, se o remetente e o destinatário estiverem localizados no mesmo host, o conteúdo será transmitido por um sistema de arquivos local. (Em alguns casos, os documentos podem ser transmitidos na memória.)
Dependendo do com.adobe.idp.Document
tamanho do objeto, os dados são transportados dentro do com.adobe.idp.Document
ou armazenado no sistema de arquivos do servidor. Quaisquer recursos de armazenamento temporário ocupados pela com.adobe.idp.Document
objetos são removidos automaticamente após o com.adobe.idp.Document
eliminação. (Consulte Descartando objetos de documento.)
Às vezes, é necessário saber o tipo de conteúdo de um com.adobe.idp.Document
antes de passá-lo para um serviço. Por exemplo, se uma operação exigir um tipo de conteúdo específico, como application/pdf
, é recomendável determinar o tipo de conteúdo. (Consulte Determinar o tipo de conteúdo de um documento.)
A variável com.adobe.idp.Document
O objeto tenta determinar o tipo de conteúdo usando os dados fornecidos. Se o tipo de conteúdo não puder ser recuperado dos dados fornecidos (por exemplo, quando os dados tiverem sido fornecidos como uma matriz de bytes), defina o tipo de conteúdo. Para definir o tipo de conteúdo, chame o com.adobe.idp.Document
do objeto setContentType
método. (Consulte Determinar o tipo de conteúdo de um documento)
Se os arquivos auxiliares residirem no mesmo sistema de arquivos, criar um com.adobe.idp.Document
objeto é mais rápido. Se os arquivos auxiliares residirem em sistemas de arquivos remotos, uma operação de cópia deverá ser feita, o que afeta o desempenho.
Um aplicativo pode conter ambos com.adobe.idp.Document
e org.w3c.dom.Document
tipos de dados. No entanto, certifique-se de qualificar totalmente a org.w3c.dom.Document
tipo de dados. Para obter informações sobre como converter um org.w3c.dom.Document
objeto a um com.adobe.idp.Document
objeto, consulte Início rápido (modo EJB): pré-preenchimento do Forms com layouts fluíveis usando a API Java.
com.adobe.idp.Document
, leia as informações do documento em blocos de 2048 bytes ou menos. Por exemplo, o código a seguir lê as informações do documento em blocos de 2048 bytes: // Set up the chunk size to prevent a potential memory leak
int buffSize = 2048;
// Determine the total number of bytes to read
int docLength = (int) inDoc.length();
byte [] byteDoc = new byte[docLength];
// Set up the reading position
int pos = 0;
// Loop through the document information, 2048 bytes at a time
while (docLength > 0) {
// Read the next chunk of information
int toRead = Math.min(buffSize, docLength);
int bytesRead = inDoc.read(pos, byteDoc, pos, toRead);
// Handle the exception in case data retrieval failed
if (bytesRead == -1) {
inDoc.doneReading();
inDoc.dispose();
throw new RuntimeException("Data retrieval failed!");
}
// Update the reading position and number of bytes remaining
pos += bytesRead;
docLength -= bytesRead;
}
// The document information has been successfully read
inDoc.doneReading();
inDoc.dispose();
Consulte também
Chamada de AEM Forms usando a API Java
Definindo propriedades de conexão
Criação de documentos creating-documents
Criar um com.adobe.idp.Document
antes de chamar uma operação de serviço que requer um documento PDF (ou outros tipos de documento) como um valor de entrada. A variável com.adobe.idp.Document
A classe fornece construtores que permitem criar um documento a partir dos seguintes tipos de conteúdo:
- Uma matriz de bytes
- Um existente
com.adobe.idp.Document
objeto - A
java.io.File
objeto - A
java.io.InputStream
objeto - A
java.net.URL
objeto
Criando um documento baseado em uma matriz de bytes creating-a-document-based-on-a-byte-array
O código de exemplo a seguir cria um com.adobe.idp.Document
objeto baseado em uma matriz de bytes.
Criando um objeto Document baseado em uma matriz de bytes
Document myPDFDocument = new Document(myByteArray);
Criando um documento baseado em outro documento creating-a-document-based-on-another-document
O código de exemplo a seguir cria um com.adobe.idp.Document
objeto que é baseado em outro com.adobe.idp.Document
objeto.
Criando um objeto Documento baseado em outro documento
//Create a Document object based on a byte array
InputStream is = new FileInputStream("C:\\Map.pdf");
int len = is.available();
byte [] myByteArray = new byte[len];
int i = 0;
while (i < len) {
i += is.read(myByteArray, i, len);
}
Document myPDFDocument = new Document(myByteArray);
//Create another Document object
Document anotherDocument = new Document(myPDFDocument);
Criação de um documento baseado em um arquivo creating-a-document-based-on-a-file
O código de exemplo a seguir cria um com.adobe.idp.Document
objeto baseado em um arquivo de PDF chamado map.pdf. Esse arquivo está na raiz do disco rígido C. Esse construtor tenta definir o tipo de conteúdo MIME do com.adobe.idp.Document
usando a extensão de nome de arquivo.
A variável com.adobe.idp.Document
construtor que aceita um java.io.File
O objeto também aceita um parâmetro booleano. Ao definir esse parâmetro como true
, o com.adobe.idp.Document
O objeto exclui o arquivo. Essa ação significa que não é necessário remover o arquivo após passá-lo para o com.adobe.idp.Document
construtor.
Configurar este parâmetro para false
significa que você retém a propriedade desse arquivo. Configurar este parâmetro para true
O é mais eficiente. O motivo é porque a variável com.adobe.idp.Document
pode mover o arquivo diretamente para a área gerenciada local em vez de copiá-lo (que é mais lento).
Criação de um objeto Documento baseado em um arquivo PDF
//Create a Document object based on the map.pdf source file
File mySourceMap = new File("C:\\map.pdf");
Document myPDFDocument = new Document(mySourceMap,true);
Criando um documento com base em um objeto InputStream creating-a-document-based-on-an-inputstream-object
O exemplo de código Java a seguir cria um com.adobe.idp.Document
objeto baseado em um java.io.InputStream
objeto.
Criando um documento com base em um objeto InputStream
//Create a Document object based on an InputStream object
InputStream is = new FileInputStream("C:\\Map.pdf");
Document myPDFDocument = new Document(is);
Criar um documento com base no conteúdo acessível de um URL creating-a-document-based-on-content-accessible-from-an-url
O exemplo de código Java a seguir cria um com.adobe.idp.Document
objeto baseado em um arquivo de PDF chamado map.pdf. Esse arquivo está em um aplicativo web chamado WebApp
que está sendo executado em localhost
. Esse construtor tenta definir o com.adobe.idp.Document
tipo de conteúdo MIME do objeto usando o tipo de conteúdo retornado com o protocolo de URL.
O URL fornecido para o com.adobe.idp.Document
objeto é sempre lido no lado em que o original com.adobe.idp.Document
é criado, conforme mostrado neste exemplo:
Document doc = new Document(new java.net.URL("file:c:/temp/input.pdf"));
O arquivo c:/temp/input.pdf deve estar localizado no computador cliente (não no computador do servidor). O computador cliente é onde o URL é lido e onde o com.adobe.idp.Document
objeto foi criado.
Criar um documento baseado em conteúdo acessíveis a partir de uma URL
//Create a Document object based on a java.net.URL object
URL myURL = new URL("http", "localhost", 8080,"/WebApp/map.pdf");
//Create another Document object
Document myPDFDocument = new Document(myURL);
Consulte também
Chamada de AEM Forms usando a API Java
Definindo propriedades de conexão
Manuseio de documentos retornados handling-returned-documents
Operações de serviço que retornam uma documento PDF (ou outros tipos de dados, como dados XML), à medida que um valor de saída retorna um com.adobe.idp.Document
objeto. Depois de receber um com.adobe.idp.Document
objeto, é possível converter-lo nos seguintes formatos:
- Um
java.io.File
objeto - Um
java.io.InputStream
objeto - Uma matriz de bytes
A linha de código a seguir converte um com.adobe.idp.Document
objeto a um java.io.InputStream
objeto. Suponha que myPDFDocument
representa um com.adobe.idp.Document
objeto:
java.io.InputStream resultStream = myDocument.getInputStream();
Da mesma forma, é possível copiar o conteúdo de um com.adobe.idp.Document
para um arquivo local, executando as seguintes tarefas:
- Criar um
java.io.File
objeto. - Chame o
com.adobe.idp.Document
do objetocopyToFile
e transmita ojava.io.File
objeto.
O exemplo de código a seguir copia o conteúdo de um com.adobe.idp.Document
para um arquivo chamado AnotherMap.pdf.
Copiando o conteúdo de um objeto de documento para um arquivo
File outFile = new File("C:\\AnotherMap.pdf");
myDocument.copyToFile (outFile);
Consulte também
Chamada de AEM Forms usando a API Java
Definindo propriedades de conexão
Determinar o tipo de conteúdo de um documento determining-the-content-type-of-a-document
Determine o tipo MIME de um com.adobe.idp.Document
ao invocar o com.adobe.idp.Document
do objeto getContentType
método. Esse método retorna um valor de string que especifica o tipo de conteúdo do com.adobe.idp.Document
objeto. A tabela a seguir descreve os diferentes tipos de conteúdo que o AEM Forms retorna.
application/pdf
application/vnd.adobe.xdp+xml
text/xml
application/vnd.fdf
application/vnd.adobe.xfdf
application/rdf+xml
application/octet-stream
NULL
O código de exemplo a seguir determina o tipo de conteúdo de um com.adobe.idp.Document
objeto.
Determinação do tipo de conteúdo de um objeto Documento
//Determine the content type of the Document object
String ct = myDocument.getContentType();
System.out.println("The content type of the Document object is " +ct);
Consulte também
Chamada de AEM Forms usando a API Java
Definindo propriedades de conexão
Descartando objetos de documento disposing-document-objects
Quando não precisar mais de um Document
objeto, é recomendável descartá-lo chamando seu dispose
método. Each Document
O objeto do consome um descritor de arquivo e até 75 MB de espaço RAM na plataforma do host do aplicativo. Se um Document
objeto não for descartado, o processo de coleta do Java Garage o descartará. No entanto, ao eliminá-lo mais cedo, utilizando o método dispose
você pode liberar a memória ocupada pelo Document
objeto.
Consulte também
Chamada de AEM Forms usando a API Java
Inclusão de arquivos da biblioteca Java do AEM Forms
Chamar um serviço usando uma biblioteca cliente Java
Chamar um serviço usando uma biblioteca cliente Java invoking-a-service-using-a-java-client-library
As operações de serviço do AEM Forms podem ser chamadas usando uma API altamente tipada do serviço, que é conhecida como uma biblioteca de cliente Java. A Biblioteca cliente Java é um conjunto de classes concretas que fornecem acesso aos serviços implantados no container de serviço. Você instancia um objeto Java que representa o serviço a ser chamado em vez de criar um InvocationRequest
usando a API de chamada. A API de chamada é usada para chamar processos, como processos de longa duração, criados no Workbench. (Consulte Chamar processos de longa vida centrados no ser humano.)
Para executar uma operação de serviço, chame um método que pertence ao objeto Java. Uma biblioteca cliente Java contém métodos que normalmente mapeiam de um para um com operações de serviço. Ao usar uma biblioteca cliente Java, defina as propriedades de conexão necessárias. (Consulte Definindo propriedades de conexão.)
Depois de definir as propriedades de conexão, crie uma ServiceClientFactory
objeto que é usado para instanciar um objeto Java que permite chamar um serviço. Cada serviço que tem uma biblioteca cliente Java tem um objeto cliente correspondente. Por exemplo, para chamar o serviço de Repositório, crie um ResourceRepositoryClient
usando seu construtor e transmitindo o ServiceClientFactory
objeto. A variável ServiceClientFactory
O objeto é responsável por manter as configurações de conexão necessárias para chamar os serviços da AEM Forms.
Embora a obtenção ServiceClientFactory
normalmente é rápida, algumas despesas gerais estão envolvidas quando a fábrica é usada pela primeira vez. Esse objeto é otimizado para reutilização e, portanto, quando possível, usa o mesmo ServiceClientFactory
quando estiver criando vários objetos de cliente Java. Ou seja, não crie uma ServiceClientFactory
para cada objeto da biblioteca do cliente que você criar.
Há uma configuração do Gerenciador de Usuários que controla o tempo de vida da asserção SAML que está dentro do com.adobe.idp.Context
objeto que afeta o ServiceClientFactory
objeto. Essa configuração controla toda a vida útil do contexto de autenticação em todo o AEM Forms, incluindo todas as chamadas executadas usando a API Java. Por padrão, o período em que um ServiceCleintFactory
pode ser usado é de duas horas.
writeResource
a operação é chamada. Essa operação coloca um novo recurso no repositório.Você pode invocar o serviço de repositório usando um biblioteca do cliente Java e executando as seguintes etapas:
-
Inclua arquivos JAR do cliente, como o adobe-repositório-client.jar, no caminho de classe do seu projeto Java. Para obter informações sobre a localização desses arquivos, consulte Inclusão AEM Forms arquivos de biblioteca Java.
-
Defina as propriedades de conexão necessárias para executar um serviço.
-
Criar um
ServiceClientFactory
ao invocar oServiceClientFactory
estática do objetocreateInstance
e transmitindo ojava.util.Properties
objeto que contém propriedades de conexão. -
Criar um
ResourceRepositoryClient
usando seu construtor e transmitindo oServiceClientFactory
objeto. Use oResourceRepositoryClient
objeto para invocar as operações de serviço de repositório. -
Criar um
RepositoryInfomodelFactoryBean
objeto usando seu construtor e passarnull
. Esse objeto permite criar umResource
objeto que represente o conteúdo adicionado ao repositório. -
Criar um
Resource
objeto invocando oRepositoryInfomodelFactoryBean
método donewImage
objeto e passando os seguintes valores:- Um valor de ID exclusivo ao especificar
new Id()
. - Um valor de UUID exclusivo especificando
new Lid()
. - O nome do recurso. Você pode especificar o nome do arquivo XDP.
Converter o valor de retorno em
Resource
. - Um valor de ID exclusivo ao especificar
-
Criar um
ResourceContent
ao invocar oRepositoryInfomodelFactoryBean
do objetonewImage
e conversão do valor de retorno emResourceContent
. Esse objeto representa o conteúdo adicionado ao repositório. -
Criar um
com.adobe.idp.Document
ao passar umjava.io.FileInputStream
objeto que armazena o arquivo XDP a ser adicionado ao repositório. (Consulte Criando um documento com base em um objeto InputStream.) -
Adicione o conteúdo do
com.adobe.idp.Document
objeto para oResourceContent
ao invocar oResourceContent
do objetosetDataDocument
método. Passe ocom.adobe.idp.Document
objeto. -
Defina o tipo MIME do arquivo XDP a ser adicionado ao repositório, chamando o
ResourceContent
do objetosetMimeType
método e transmissãoapplication/vnd.adobe.xdp+xml
. -
Adicione o conteúdo do
ResourceContent
objeto para oResource
ao invocar oResource
do objetosetContent
e transmitindo oResourceContent
objeto. -
Adicione uma descrição do recurso chamando o
Resource
do objetosetDescription
e transmitindo um valor de string que representa uma descrição do recurso. -
Adicione o design do formulário ao repositório invocando o
ResourceRepositoryClient
do objetowriteResource
e transmitindo os seguintes valores:- Um valor de string que especifica o caminho para a coleção de recursos que contém o novo recurso
- A variável
Resource
objeto que foi criado
Consulte também
Início rápido (modo EJB): Gravação de um recurso usando a API Java
Chamada de AEM Forms usando a API Java
Inclusão de arquivos da biblioteca Java do AEM Forms
Chamar um processo de vida curta usando a API de chamada invoking-a-short-lived-process-using-the-invocation-api
Você pode chamar um processo de curta duração usando a API de chamada Java. Ao invocar um processo de curta duração usando a API de chamada, você transmite os valores de parâmetro necessários usando uma java.util.HashMap
objeto. Para cada parâmetro passar para um serviço, chame o java.util.HashMap
do objeto put
e especifique o par nome-valor exigido pelo serviço para executar a operação especificada. Especifique o nome exato dos parâmetros que pertencem ao processo de vida curta.
A discussão aqui é sobre o uso da API de chamada para invocar o seguinte processo de vida curta do AEM Forms chamado MyApplication/EncryptDocument
.
MyApplication/EncryptDocument
usando o Workbench. (Consulte Uso do Workbench.)Quando esse processo é chamado, ele executa as seguintes ações:
- Obtém o documento de PDF não seguro passado para o processo. Esta ação baseia-se no
SetValue
operação. O parâmetro de entrada para esse processo é umdocument
variável de processo chamadainDoc
. - Criptografa o documento PDF com uma senha. Esta ação baseia-se no
PasswordEncryptPDF
operação. O documento de PDF criptografado por senha é retornado em uma variável de processo chamadaoutDoc
.
Chame o processo de curta duração MyApplication/EncryptDocument usando a API de invocação Java invoke-the-myapplication-encryptdocument-short-lived-process-using-the-java-invocation-api
Chame o MyApplication/EncryptDocument
processo de vida curta usando a API de invocação Java:
-
Inclua arquivos JAR do cliente, como adobe-livecycle-client.jar, no caminho de classe do projeto Java. (Consulte Inclusão de arquivos da biblioteca Java do AEM Forms.)
-
Criar um
ServiceClientFactory
objeto que contém propriedades de conexão. (Consulte Definindo propriedades de conexão.) -
Criar um
ServiceClient
usando seu construtor e transmitindo oServiceClientFactory
objeto. AServiceClient
object permite chamar uma operação de serviço. Ela lida com tarefas como localização, despacho e solicitações de chamada de roteamento. -
Criar um
java.util.HashMap
usando seu construtor. -
Chame o
java.util.HashMap
do objetoput
para que cada parâmetro de entrada passe para o processo de longa vida. Como a variávelMyApplication/EncryptDocument
processo de vida curta requer um parâmetro de entrada do tipoDocument
, você só precisa invocar oput
método uma vez, conforme mostrado no exemplo a seguir.code language-java //Create a Map object to store the parameter value for inDoc Map params = new HashMap(); InputStream inFile = new FileInputStream("C:\\Adobe\Loan.pdf"); Document inDoc = new Document(inFile); params.put("inDoc", inDoc);
-
Criar um
InvocationRequest
ao invocar oServiceClientFactory
do objetocreateInvocationRequest
e transmitindo os seguintes valores:- Um valor de string que especifica o nome do processo de longa duração a ser chamado. Para invocar o
MyApplication/EncryptDocument
processo, especificarMyApplication/EncryptDocument
. - Um valor de string que representa o nome da operação do processo. Normalmente, o nome de uma operação de processo de curta duração é
invoke
. - A variável
java.util.HashMap
objeto que contém os valores de parâmetro exigidos pela operação de serviço. - Um valor booliano que especifica
true
, que cria uma solicitação síncrona (esse valor é aplicável para invocar um processo de curta duração).
- Um valor de string que especifica o nome do processo de longa duração a ser chamado. Para invocar o
-
Envie a solicitação de invocação para o serviço chamando o
ServiceClient
do objetoinvoke
e transmitindo oInvocationRequest
objeto. A variávelinvoke
o método retorna umInvocationReponse
objeto.note note NOTE Um processo de longa duração pode ser chamado transmitindo o valor false
como o quarto parâmetro docreateInvocationRequest
método. Transmitindo o valorfalse
cria uma solicitação assíncrona. -
Recupere o valor de retorno do processo chamando o
InvocationReponse
do objetogetOutputParameter
e transmitindo um valor de string que especifica o nome do parâmetro de saída. Nesta situação, especifiqueoutDoc
(outDoc
é o nome do parâmetro de saída para oMyApplication/EncryptDocument
processo). Converter o valor de retorno emDocument
, conforme mostrado no exemplo a seguir.code language-java InvocationResponse response = myServiceClient.invoke(request); Document encryptDoc = (Document) response.getOutputParameter("outDoc");
-
Criar um
java.io.File
e verifique se a extensão do arquivo é .pdf. -
Chame o
com.adobe.idp.Document
do objetocopyToFile
método para copiar o conteúdo docom.adobe.idp.Document
ao arquivo. Certifique-se de usar ocom.adobe.idp.Document
objeto que foi retornado pelogetOutputParameter
método.
Consulte também
Início Rápido: Chamar um processo de vida curta usando a API de Chamada
Chamar processos de longa vida centrados no ser humano
Inclusão de arquivos da biblioteca Java do AEM Forms