FR [ 1873511 ] Allow jasper reports in customization.jar
This commit is contained in:
parent
811584d0ad
commit
7de98ee67f
|
@ -1,5 +1,4 @@
|
||||||
/*
|
/*
|
||||||
* Class .
|
|
||||||
*/
|
*/
|
||||||
package org.compiere.report;
|
package org.compiere.report;
|
||||||
|
|
||||||
|
@ -10,6 +9,7 @@ import java.io.FileOutputStream;
|
||||||
import java.io.FilenameFilter;
|
import java.io.FilenameFilter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
|
@ -443,6 +443,11 @@ public class ReportStarter implements ProcessCall, ClientProcess {
|
||||||
{
|
{
|
||||||
subreports = getAttachmentSubreports(reportPath);
|
subreports = getAttachmentSubreports(reportPath);
|
||||||
}
|
}
|
||||||
|
else if (reportPath.startsWith("resource:"))
|
||||||
|
{
|
||||||
|
subreports = getResourceSubreports(jasperName + "Subreport", reportPath, fileExtension);
|
||||||
|
}
|
||||||
|
// TODO: Implement file:/ lookup for subreports
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Locate subreports from local/remote filesystem
|
// Locate subreports from local/remote filesystem
|
||||||
|
@ -468,6 +473,9 @@ public class ReportStarter implements ProcessCall, ClientProcess {
|
||||||
File resFile = null;
|
File resFile = null;
|
||||||
if (reportPath.startsWith("attachment:") && attachment != null) {
|
if (reportPath.startsWith("attachment:") && attachment != null) {
|
||||||
resFile = getAttachmentResourceFile(jasperName, currLang);
|
resFile = getAttachmentResourceFile(jasperName, currLang);
|
||||||
|
} else if (reportPath.startsWith("resource:")) {
|
||||||
|
resFile = getResourcesForResourceFile(jasperName, currLang);
|
||||||
|
// TODO: Implement file:/ for resources
|
||||||
} else {
|
} else {
|
||||||
File[] resources = reportDir.listFiles( new FileFilter( jasperName, reportDir, ".properties"));
|
File[] resources = reportDir.listFiles( new FileFilter( jasperName, reportDir, ".properties"));
|
||||||
// try baseName + "_" + language
|
// try baseName + "_" + language
|
||||||
|
@ -557,6 +565,22 @@ public class ReportStarter implements ProcessCall, ClientProcess {
|
||||||
return resFile;
|
return resFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get .property resource file from resources
|
||||||
|
* @param jasperName
|
||||||
|
* @param currLang
|
||||||
|
* @return File
|
||||||
|
*/
|
||||||
|
private File getResourcesForResourceFile(String jasperName, Language currLang) {
|
||||||
|
File resFile = null;
|
||||||
|
try {
|
||||||
|
resFile = getFileAsResource(jasperName+currLang.getLocale().getLanguage()+".properties");
|
||||||
|
} catch (Exception e) {
|
||||||
|
// ignore exception - file couldn't exist
|
||||||
|
}
|
||||||
|
return resFile;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get subreports from attachment. Assume all other jasper attachment is subreport.
|
* Get subreports from attachment. Assume all other jasper attachment is subreport.
|
||||||
* @param reportPath
|
* @param reportPath
|
||||||
|
@ -580,6 +604,39 @@ public class ReportStarter implements ProcessCall, ClientProcess {
|
||||||
return subreportsTemp;
|
return subreportsTemp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search for additional subreports deployed as resources
|
||||||
|
* @param reportName The original reportname
|
||||||
|
* @param reportPath The full path to the parent report
|
||||||
|
* @param fileExtension The file extension of the parent report
|
||||||
|
* @return An Array of File objects referencing to the downloaded subreports
|
||||||
|
*/
|
||||||
|
private File[] getResourceSubreports(String reportName, String reportPath, String fileExtension)
|
||||||
|
{
|
||||||
|
ArrayList<File> subreports = new ArrayList<File>();
|
||||||
|
String remoteDir = reportPath.substring(0, reportPath.lastIndexOf("/"));
|
||||||
|
|
||||||
|
// Currently check hardcoded for max. 10 subreports
|
||||||
|
for(int i=1; i<10; i++)
|
||||||
|
{
|
||||||
|
// Check if subreport number i exists
|
||||||
|
File subreport = null;
|
||||||
|
try {
|
||||||
|
subreport = getFileAsResource(remoteDir + "/" + reportName + i + fileExtension);
|
||||||
|
} catch (Exception e) {
|
||||||
|
// just ignore it
|
||||||
|
}
|
||||||
|
if(subreport == null) // Subreport doesn't exist, abort further approaches
|
||||||
|
break;
|
||||||
|
|
||||||
|
subreports.add(subreport);
|
||||||
|
}
|
||||||
|
|
||||||
|
File[] subreportsTemp = new File[0];
|
||||||
|
subreportsTemp = subreports.toArray(subreportsTemp);
|
||||||
|
return subreportsTemp;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author alinv
|
* @author alinv
|
||||||
* @param reportPath
|
* @param reportPath
|
||||||
|
@ -620,6 +677,13 @@ public class ReportStarter implements ProcessCall, ClientProcess {
|
||||||
log.warning(e.getLocalizedMessage());
|
log.warning(e.getLocalizedMessage());
|
||||||
reportFile = null;
|
reportFile = null;
|
||||||
}
|
}
|
||||||
|
} else if (reportPath.startsWith("resource:")) {
|
||||||
|
try {
|
||||||
|
reportFile = getFileAsResource(reportPath);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.warning(e.getLocalizedMessage());
|
||||||
|
reportFile = null;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
reportFile = new File(REPORT_HOME, reportPath);
|
reportFile = new File(REPORT_HOME, reportPath);
|
||||||
}
|
}
|
||||||
|
@ -629,6 +693,36 @@ public class ReportStarter implements ProcessCall, ClientProcess {
|
||||||
return reportFile;
|
return reportFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param reportPath
|
||||||
|
* @return
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
private File getFileAsResource(String reportPath) throws Exception {
|
||||||
|
File reportFile;
|
||||||
|
String name = reportPath.substring("resource:".length()).trim();
|
||||||
|
String localName = name.replace('/', '_');
|
||||||
|
log.info("reportPath = " + reportPath);
|
||||||
|
log.info("getting resource from = " + getClass().getClassLoader().getResource(name));
|
||||||
|
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(name);
|
||||||
|
String localFile = System.getProperty("java.io.tmpdir") + System.getProperty("file.separator") + localName;
|
||||||
|
log.info("localFile = " + localFile);
|
||||||
|
reportFile = new File(localFile);
|
||||||
|
|
||||||
|
OutputStream out = null;
|
||||||
|
out = new FileOutputStream(reportFile);
|
||||||
|
if (out != null){
|
||||||
|
byte buf[]=new byte[1024];
|
||||||
|
int len;
|
||||||
|
while((len=inputStream.read(buf))>0)
|
||||||
|
out.write(buf,0,len);
|
||||||
|
out.close();
|
||||||
|
inputStream.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
return reportFile;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Download db attachment
|
* Download db attachment
|
||||||
* @param reportPath must of syntax attachment:filename
|
* @param reportPath must of syntax attachment:filename
|
||||||
|
|
Loading…
Reference in New Issue