Servizio OSGi
Un servizio OSGi è una classe Java o un’interfaccia di servizio, insieme a una serie di proprietà di servizio come coppie nome/valore. Le proprietà del servizio distinguono tra i diversi provider di servizi che forniscono servizi con la stessa interfaccia di servizio.
Un servizio OSGi è definito semanticamente dalla relativa interfaccia di servizio e implementato come oggetto di servizio. La funzionalità di un servizio è definita dalle interfacce implementate. In questo modo, applicazioni diverse possono implementare lo stesso servizio. Le interfacce di servizio consentono ai bundle di interagire tramite interfacce di binding, non tramite implementazioni. È necessario specificare un’interfaccia di servizio con il minor numero di dettagli di implementazione possibile.
Definire l’interfaccia
Interfaccia semplice con un metodo per unire i dati con il modello XDP.
package com.mysite.samples;
import com.adobe.aemfd.docmanager.Document;
public interface MyfirstInterface
{
public Document mergeDataWithXDPTemplate(Document xdpTemplate, Document xmlDocument);
}
Implementare l’interfaccia
Creare un nuovo pacchetto denominato com.mysite.samples.impl
per l'implementazione dell'interfaccia.
package com.mysite.samples.impl;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.adobe.aemfd.docmanager.Document;
import com.adobe.fd.output.api.OutputService;
import com.adobe.fd.output.api.OutputServiceException;
import com.mysite.samples.MyfirstInterface;
@Component(service = MyfirstInterface.class)
public class MyfirstInterfaceImpl implements MyfirstInterface {
@Reference
OutputService outputService;
private static final Logger log = LoggerFactory.getLogger(MyfirstInterfaceImpl.class);
@Override
public Document mergeDataWithXDPTemplate(Document xdpTemplate, Document xmlDocument) {
com.adobe.fd.output.api.PDFOutputOptions pdfOptions = new com.adobe.fd.output.api.PDFOutputOptions();
pdfOptions.setAcrobatVersion(com.adobe.fd.output.api.AcrobatVersion.Acrobat_11);
try {
return outputService.generatePDFOutput(xdpTemplate, xmlDocument, pdfOptions);
} catch (OutputServiceException e) {
log.error("Failed to merge data with XDP Template", e);
}
return null;
}
}
L'annotazione @Component(...)
alla riga 10 contrassegna questa classe Java come componente OSGi e la registra come servizio OSGi.
L'annotazione @Reference
fa parte dei servizi dichiarativi OSGi e viene utilizzata per inserire un riferimento di Outputservice nella variabile outputService
.
Creare e distribuire il bundle
- Apri finestra del prompt dei comandi
- Passa a
c:\aemformsbundles\mysite\core
- Esegui il comando
mvn clean install -PautoInstallBundle
- Il comando precedente genera e distribuisce automaticamente il bundle nell’istanza AEM in esecuzione su localhost:4502
Il bundle sarà disponibile anche nel seguente percorso C:\AEMFormsBundles\mysite\core\target
. Il bundle può anche essere distribuito in AEM utilizzando la console Web Felix.
Utilizzo del servizio
Ora puoi utilizzare il servizio nella pagina JSP. Il seguente snippet di codice mostra come accedere al servizio e utilizzare i metodi implementati dal servizio
MyFirstAEMFormsService myFirstAEMFormsService = sling.getService(com.mysite.samples.MyFirstAEMFormsService.class);
com.adobe.aemfd.docmanager.Document generatedDocument = myFirstAEMFormsService.mergeDataWithXDPTemplate(xdp_or_pdf_template,xmlDocument);
Il pacchetto di esempio contenente la pagina JSP può essere scaricato da qui
Il bundle completo è disponibile per il download
Testare il pacchetto
Importa e installa il pacchetto in AEM utilizzando Gestione pacchetti
Utilizza Postman per effettuare una chiamata POST e fornire i parametri di input come mostrato nella schermata seguente