diff --git a/migration/iD10/oracle/202203161513_IDEMPIERE-5225.sql b/migration/iD10/oracle/202203161513_IDEMPIERE-5225.sql new file mode 100644 index 0000000000..62b0e070a6 --- /dev/null +++ b/migration/iD10/oracle/202203161513_IDEMPIERE-5225.sql @@ -0,0 +1,10 @@ +-- IDEMPIERE-5225 +SELECT register_migration_script('202203161513_IDEMPIERE-5225.sql') FROM dual; + +SET SQLBLANKLINES ON +SET DEFINE OFF + +-- Mar 16, 2022, 3:13:31 PM CET +INSERT INTO AD_SysConfig (AD_SysConfig_ID,AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy,IsActive,Name,Value,Description,EntityType,ConfigurationLevel,AD_SysConfig_UU) VALUES (200197,0,0,TO_TIMESTAMP('2022-03-16 15:13:30','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2022-03-16 15:13:30','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','HTML_REPORT_MINIFY','Y','Enable/disable minification on HTML Reports','D','C','9f3e162c-653e-4f45-9b1c-8151caf0945e') +; + diff --git a/migration/iD10/postgresql/202203161513_IDEMPIERE-5225.sql b/migration/iD10/postgresql/202203161513_IDEMPIERE-5225.sql new file mode 100644 index 0000000000..14ba0b7e72 --- /dev/null +++ b/migration/iD10/postgresql/202203161513_IDEMPIERE-5225.sql @@ -0,0 +1,7 @@ +-- IDEMPIERE-5225 +SELECT register_migration_script('202203161513_IDEMPIERE-5225.sql') FROM dual; + +-- Mar 16, 2022, 3:13:31 PM CET +INSERT INTO AD_SysConfig (AD_SysConfig_ID,AD_Client_ID,AD_Org_ID,Created,Updated,CreatedBy,UpdatedBy,IsActive,Name,Value,Description,EntityType,ConfigurationLevel,AD_SysConfig_UU) VALUES (200197,0,0,TO_TIMESTAMP('2022-03-16 15:13:30','YYYY-MM-DD HH24:MI:SS'),TO_TIMESTAMP('2022-03-16 15:13:30','YYYY-MM-DD HH24:MI:SS'),100,100,'Y','HTML_REPORT_MINIFY','Y','Enable/disable minification on HTML Reports','D','C','9f3e162c-653e-4f45-9b1c-8151caf0945e') +; + diff --git a/org.adempiere.base/META-INF/MANIFEST.MF b/org.adempiere.base/META-INF/MANIFEST.MF index 7ab830a2f6..eb4864a4a2 100644 --- a/org.adempiere.base/META-INF/MANIFEST.MF +++ b/org.adempiere.base/META-INF/MANIFEST.MF @@ -7,7 +7,9 @@ Bundle-ClassPath: ., lib/bsh.jar, lib/commons-validator.jar, lib/cron4j.jar, - lib/avalon-framework-api.jar + lib/avalon-framework-api.jar, + lib/htmlcompressor.jar, + lib/yuicompressor.jar Export-Package: bsh, bsh.classpath, bsh.collection, diff --git a/org.adempiere.base/build.properties b/org.adempiere.base/build.properties index 3efca01f4c..64a18fa1a6 100644 --- a/org.adempiere.base/build.properties +++ b/org.adempiere.base/build.properties @@ -6,7 +6,9 @@ bin.includes = plugin.xml,\ lib/avalon-framework-api.jar,\ lib/bsh.jar,\ lib/commons-validator.jar,\ - lib/cron4j.jar + lib/cron4j.jar,\ + lib/htmlcompressor.jar,\ + lib/yuicompressor.jar src.includes = schema/ source.. = src/ output.. = target/classes/ diff --git a/org.adempiere.base/pom.xml b/org.adempiere.base/pom.xml index e22b69cd11..1c4c6c50e9 100644 --- a/org.adempiere.base/pom.xml +++ b/org.adempiere.base/pom.xml @@ -43,6 +43,16 @@ avalon-framework-api 4.3.1 + + com.googlecode.htmlcompressor + htmlcompressor + 1.5.2 + + + com.yahoo.platform.yui + yuicompressor + 2.4.8 + lib true diff --git a/org.adempiere.base/src/org/compiere/model/MSysConfig.java b/org.adempiere.base/src/org/compiere/model/MSysConfig.java index eb6ac7ad73..5f4fc717c9 100644 --- a/org.adempiere.base/src/org/compiere/model/MSysConfig.java +++ b/org.adempiere.base/src/org/compiere/model/MSysConfig.java @@ -101,6 +101,7 @@ public class MSysConfig extends X_AD_SysConfig public static final String FEEDBACK_EMAIL_CC = "FEEDBACK_EMAIL_CC"; public static final String FEEDBACK_EMAIL_TO = "FEEDBACK_EMAIL_TO"; public static final String GRIDTABLE_LOAD_TIMEOUT_IN_SECONDS = "GRIDTABLE_LOAD_TIMEOUT_IN_SECONDS"; + public static final String HTML_REPORT_MINIFY = "HTML_REPORT_MINIFY"; public static final String HTML_REPORT_THEME = "HTML_REPORT_THEME"; public static final String IBAN_VALIDATION = "IBAN_VALIDATION"; public static final String IDENTIFIER_SEPARATOR = "IDENTIFIER_SEPARATOR"; diff --git a/org.adempiere.base/src/org/compiere/print/ReportEngine.java b/org.adempiere.base/src/org/compiere/print/ReportEngine.java index e8d86dab3b..e71eb4a828 100644 --- a/org.adempiere.base/src/org/compiere/print/ReportEngine.java +++ b/org.adempiere.base/src/org/compiere/print/ReportEngine.java @@ -113,6 +113,8 @@ import org.compiere.util.Util; import org.eevolution.model.MDDOrder; import org.eevolution.model.X_PP_Order; +import com.googlecode.htmlcompressor.compressor.HtmlCompressor; + /** * Report Engine. * For a given PrintFormat, @@ -695,9 +697,10 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount) table.setNeedClosingTag(false); PrintWriter w = new PrintWriter(writer); XhtmlDocument doc = null; - + boolean minify = MSysConfig.getBooleanValue(MSysConfig.HTML_REPORT_MINIFY, true, Env.getAD_Client_ID(getCtx())); + if (onlyTable) - table.output(w); + w.print(compress(table.toString(), minify)); else { doc = new XhtmlDocument(); @@ -784,15 +787,15 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount) styleBuild = new StringBuilder(styleBuild.toString().replaceAll(";", "!important;")); appendInlineCss (doc, styleBuild); - - doc.output(w); - w.println("
"); + w.print(compress(doc.toString(), minify)); + + w.print("
"); String paraWrapId = null; if (parameterTable != null) { paraWrapId = cssPrefix + "-para-table-wrap"; - w.println("
"); - parameterTable.output(w); + w.print("
"); + w.print(compress(parameterTable.toString(), minify)); tr tr = new tr(); tr.setClass("tr-parameter"); @@ -825,12 +828,11 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount) tr.addElement(td); td.addElement(query.getInfoDisplayAll(r)); - tr.output(w); + w.print(compress(tr.toString(), minify)); } - - w.println(); - w.println(""); - w.println("
"); + + w.print(""); + w.print("
"); } StringBuilder tableWrapDiv = new StringBuilder(); @@ -842,8 +844,8 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount) } tableWrapDiv.append(" >"); - w.println(tableWrapDiv.toString()); - table.output(w); + w.print(compress(tableWrapDiv.toString(), minify)); + w.print(compress(table.toString(), minify)); } thead thead = new thead(); @@ -1089,19 +1091,18 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount) /* output table header */ if (row == -1){ - thead.output(w); + w.print(compress(thead.toString(), minify)); // output open of tbody - tbody.output(w); + w.print(compress(tbody.toString(), minify)); }else{ // output row by row - tr.output(w); + w.print(compress(tr.toString(), minify)); } } // for all rows - w.println(); - w.println(""); - w.println(""); + w.print(""); + w.print(""); if (suppressMap.size() > 0) { StringBuilder st = new StringBuilder(); @@ -1114,15 +1115,14 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount) st.append(" {\n\t\tdisplay:none;\n\t}"); style styleTag = new style(); styleTag.addElement(st.toString()); - styleTag.output(w); - w.println(); + w.print(compress(styleTag.toString(), minify)); } if (!onlyTable) { - w.println("
"); - w.println("
"); - w.println(""); - w.println(""); + w.print(""); + w.print(""); + w.print(""); + w.print(""); } w.flush(); w.close(); @@ -2577,4 +2577,34 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount) return Evaluator.evaluateLogic(new PrintDataEvaluatee(null, m_printData), item.getDisplayLogic()); } + public String compress(String src, boolean minify) { + + if(minify) { + HtmlCompressor compressor = new HtmlCompressor(); + compressor.setEnabled(true); + compressor.setCompressCss(true); + compressor.setCompressJavaScript(true); + compressor.setRemoveComments(true); + compressor.setRemoveMultiSpaces(true); + compressor.setRemoveIntertagSpaces(true); +// compressor.setGenerateStatistics(false); +// compressor.setRemoveQuotes(false); +// compressor.setSimpleDoctype(false); +// compressor.setRemoveScriptAttributes(false); +// compressor.setRemoveStyleAttributes(false); +// compressor.setRemoveLinkAttributes(false); +// compressor.setRemoveFormAttributes(false); +// compressor.setRemoveInputAttributes(false); +// compressor.setSimpleBooleanAttributes(false); +// compressor.setRemoveJavaScriptProtocol(false); +// compressor.setRemoveHttpProtocol(false); +// compressor.setRemoveHttpsProtocol(false); +// compressor.setPreserveLineBreaks(false); + + return compressor.compress(src); + } + else { + return src; + } + } } // ReportEngine