Jeden z projektov, na ktorom pracujem, používa BIRT Report integrovaný do JBoss servera. V rámci projektu JBoss-Reports bola spravená implementácia BIRT enginu ako service. Tento projekt už nie je aktuálny, no poslúžil mi ako návod na vytvorenie vlastnej integrácie linka. V našom príklade si ukážeme, ako integrovať BIRT report do JBoss 6 servera. Použijeme verziu 2.6.2 BIRT reportu. Najskôr si musíte stiahnuť BIRT runtime z tejto adresy linka a rozpakovať do adresára. Ďalej v článku sa budem odkazovať na tento adresár ako na adresár BIRT_RUNTIME_DIR.
BIRT_RUNTIME_DIR
+—about_files
+—ReportEngine
¦ +—configuration –> default/birt/configuration
¦ +—lib –> default/lib/
¦ +—plugins –> default/birt/plugins
¦ +—samples
+—WebViewerExample
Z priečinku BIRT_RUNTIME_DIR/lib nakopírujte všetky knižnice do priečinka /default/lib. Taktiež v priečinku …/default/ vytvorte adresár s názvom birt. Tento adresár bude domovský adresár BIRT report systému. Teraz skopírujte adresár BIRT_RUNTIME_DIR/plugins a BIRT_RUNTIME_DIR/configuration do novo vytvoreného pričienka birt.
Report systém vytvorí po spustení adresár workspace v priečinku …/default/birt. V ňom nájdete aj log report systému. To je všetko, čo potrebujete nastaviť a skopírovať z BIRT reportu. Nezabudnite skopírovať váš JDBC ovládač do …/default/lib adresára a tiež do … /default/birt/plugins/org.eclipse.birt.report.data.oda.jdbc_2.6.2.r262_v20110127/drivers priečinku.
jboss-6.0.0.Final
+—bin
+—client
+—common
+—docs
+—lib
+—server
+—all
+—default
¦ +—birt // BIRT runtime directory
¦ ¦ +—configuration
¦ ¦ +—plugins
¦ ¦ ¦ +—org.apache.derby.core_10.5.1.1_v20100129
¦ ¦ ¦ +—org.eclipse.birt.report.data.oda.jdbc_2.6.2.r262_v20110127
¦ ¦ ¦ ¦ +—drivers // BIRT JDBC driver directory
¦ ¦ ¦ +—org.eclipse.birt.report.data.oda.sampledb_2.6.2.r262_v20110127
¦ ¦ ¦ +—org.eclipse.birt.report.engine.fonts_2.6.2.r262_v20110127
¦ ¦ ¦ +—org.eclipse.core.runtime.compatibility.registry_3.3.0.v20100520
¦ ¦ ¦ +—org.w3c.sac_1.3.0.v20100915
¦ ¦ +—workspace
¦ +—conf
¦ +—data
¦ +—deploy
¦ +—deployers
¦ +—lib // BIRT API libraries
¦ +—log
¦ +—reports // Reports directory
¦ +—tmp
¦ +—work
+—jbossweb-standalone
+—minimal
+—standard
Teraz sa môžete pustiť do tvorby MBeanu, ktorý predstavuje Birt Report Service. V rámci JBoss servera je MBean singleton service a je plne kontrolovaný serverom. MBean sa dá vytvoriť niekoľkými spôsobmi, napríklad JBoss anotáciou @Management. V Birt Report Service triede musíte implementovať metódy start a stop (linka) z MBean rozhrania. V metóde start budete spúštať BIRT report systém. Na to, aby ste správne naštartovali report systém, musíte definovať jeho domovský priečinok. Na to využijete ServerConfigImplMBean.
@Override
public void start() throws Exception {
LOGGER.info(“Start the report service – start.”);MBeanServer server = MBeanServerLocator.locate();
ServerConfigImplMBean<?> serverConfig = (ServerConfigImplMBean<?>) MBeanProxyExt.create(ServerConfigImplMBean.class, ServerConfigImplMBean.OBJECT_NAME, server);String birtRuntimeDir = serverConfig.getServerHomeLocation().getPath() + “/birt/”;
LOGGER.info(“Birt runtime directory: ” + birtRuntimeDir);reportsHomeDirectory = serverConfig.getServerHomeLocation().getPath() + “/reports/”;
LOGGER.info(“Birt reports directory: ” + reportsHomeDirectory);if (engine == null) {
LOGGER.info(“Create BIRT engine – start.”);
System.setProperty(“RUN_UNDER_ECLIPSE”, “false”);
EngineConfig engineConfig = new EngineConfig();
engineConfig.setEngineHome(birtRuntimeDir);
engineConfig.setResourcePath(reportsHomeDirectory);engineConfig.getAppContext().put(EngineConstants.APPCONTEXT_CLASSLOADER_KEY, BirtReportService.class.getClassLoader());
try {
Platform.startup(engineConfig);
} catch (BirtException ex) {
LOGGER.error(“Error by starting the BIRT platform.”, ex);
}IReportEngineFactory factory = (IReportEngineFactory) Platform.createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
engine = factory.createReportEngine(engineConfig);
engine.changeLogLevel(Level.FINE);LOGGER.info(“Create BIRT engine – end.”);
}LOGGER.info(“Start the report service – start.”);
}
V metóde stop musíte vypnúť BIRT report systém.
@Override
public void stop() throws Exception {
LOGGER.info(“Stop the BIRT service – start.”);if (engine != null) {
LOGGER.info(“Destroy BIRT engine.”);
engine.destroy();
}LOGGER.info(“Stop the BIRT service – end.”);
}
Hlavička nášho servisu bude obsahovať nasledovné dve anotácie: @Service and @Management.
@Service(name = “BirtReportService”)
@Management(BirtReportServiceMBean.class)
public class BirtReportService implements BirtReportServiceMBean {
Pokiaľ teraz spustíte server s nasadeným projektom, ktorý obsahuje náš report servis, v logu uvidíte nasledovné riadky:
17:41:57,940 INFO [com.ajkaandrej.jboss.report.impl.BirtReportService] Start the report service – start.
17:41:57,948 INFO [com.ajkaandrej.jboss.report.impl.BirtReportService] Birt runtime directory: /D:/jboss-6.0.0.Final/server/default//birt/
17:41:57,948 INFO [com.ajkaandrej.jboss.report.impl.BirtReportService] Birt reports directory: /D:/jboss-6.0.0.Final/server/default//reports/
17:41:57,949 INFO [com.ajkaandrej.jboss.report.impl.BirtReportService] Create BIRT engine – start.
17:42:00,140 INFO [com.ajkaandrej.jboss.report.impl.BirtReportService] Create BIRT engine – end.
17:42:00,141 INFO [com.ajkaandrej.jboss.report.impl.BirtReportService] Start the report service – start.
Server pri spustení naštartuje náš servis, ktorý naštartuje Birt report servis. V rámci servisu môžete implementovať aj viac metód na kontrolu report servisu. Napríklad metódu na reštart, či metódu na rekonfiguráciu report servisu. Všetky metódy report servisu môžete ovládať cez jmx-consolu servera.
Dalším krokom je spraviť servis viditelný pre EJB servis. Preto musíte definovať ďalšie rozhranie s metódou generatedReport. V tomto príklade nepotrebujete špeciálnu bezpečnostnú doménu, stačí použiť anotáciu @PermitAll. Taktiež nepotrebujete transakciu. Po týchto zmenách bude deklarácia report servisu vyzerať nasledovne:
@Service(name = “BirtReportService”)
@Local(ReportService.class)
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
@Management(BirtReportServiceMBean.class)
@PermitAll
public class BirtReportService implements BirtReportServiceMBean, ReportService {
Vstupné parametre pre metódu generatedReport budú meno, jazyk, formát a dynamické parametre pre report.
@Override
public byte[] createReport(String reportName, Map<String, Object> parameters, String outputFormat, Locale locale) throws Exception {LOGGER.info(“Create the report – start.”);
byte[] result = null;
String reportPath = reportsHomeDirectory + reportName + “.rptdesign”;
if (reportPath == null || reportPath.isEmpty()) {
throw new Exception(“The report path is null or empty.”);
} else {
File reportFile = new File(reportPath);
if (!reportFile.exists()) {
throw new Exception(“Report file not found! Report: ” + reportPath);
}
}try {
// Open the report design
LOGGER.info(“Report: ” + reportPath);IReportRunnable design = engine.openReportDesign(reportPath);
LOGGER.info(“Create report options.”);
// Options
ByteArrayOutputStream stream = new ByteArrayOutputStream();
HTMLRenderOption options = new HTMLRenderOption();
options.setImageDirectory(“/image/”);
options.setOutputStream(stream);
options.setOutputFormat(outputFormat);LOGGER.info(“Create report render task.”);
// Create task to run and render the report
IRunAndRenderTask task = engine.createRunAndRenderTask(design);
task.setLocale(locale);
task.setRenderOption(options);
task.setParameterValues(parameters);LOGGER.info(“Run report task.”);
task.run();
task.close();LOGGER.info(“The report output size: ” + stream.size());
result = stream.toByteArray();} catch (Exception ex) {
throw new Exception(“Generated report failed”, ex);
}LOGGER.info(“Create the report – end.”);
return result;
}
Metóda pomocou vstupných parametrov pre report servis vygeneruje dokument. Tento dokument môžete uložiť do dočasného adresára a poslať používateľovi adresu na report dokument. Naša metóda vracia priamo tento dokument ako výstupný parameter. Na riadku 22 musíte nastaviť absolútnu cestu k reportu. To je všetko, čo musíte spraviť v BIRT report servise. A ako môžete zavolať náš servis z EJB metódy? Veľmi jednoducho:
@EJB
private ReportService reportService;public byte[] callReport() throws Exception {
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put(“parameter1″, “Value1″);
parameters.put(“parameter2″, 14343);byte[] result = null;
try {
result = reportService.createReport(“report1″, parameters, “pdf”, Locale.ENGLISH);
} catch (Exception ex) {
throw ex;
}
return result;
}
Závislosti projektu sú nasledovné knižnice.
[INFO] — maven-dependency-plugin:2.1:tree (default-cli) @ birtservice —
[INFO] com.ajkaandrej.jboss.birt:birtservice:ejb:1.0-SNAPSHOT
[INFO] +- org.slf4j:slf4j-api:jar:1.6.1:provided
[INFO] +- javax:javaee-api:jar:6.0:provided
[INFO] +- org.jboss.ejb3:jboss-ejb3-ext-api:jar:1.1.1:provided
[INFO] +- org.jboss.jbossas:jboss-as-system-jmx:jar:client:6.0.0.Final:provided
[INFO] +- org.eclipse.birt:coreapi:jar:2.6.2:provided
[INFO] +- org.eclipse.birt:engineapi:jar:2.6.2:provided
[INFO] +- org.eclipse.birt:modelapi:jar:2.6.2:provided
[INFO] – com.ibm.icu:icu4j:jar:4.0.1:provided
Pre skompilovanie projektu potrebujete BIRT API knižnice. Ja som nenašiel žiadne verejné repository, kde by boli BIRT API knižnice verzie 2.6.2. Pre skompilovanie môžete použiť knižnice verzie 2.3.2, ktoré sú vo verejnom JBoss repository: link. Alebo si manuálne nainštalujte knižnice do svojho lokálneho repository. Nasledovným spôsobom:
mvn install:install-file -Dfile=coreapi.jar -DgroupId=org.eclipse.birt -DartifactId=coreapi -Dversion=2.6.2 -Dpackaging=jar
mvn install:install-file -Dfile=engineapi.jar -DgroupId=org.eclipse.birt -DartifactId=engineapi -Dversion=2.6.2 -Dpackaging=jar
mvn install:install-file -Dfile=modelapi.jar -DgroupId=org.eclipse.birt -DartifactId=modelapi -Dversion=2.6.2 -Dpackaging=jar