You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by jl...@apache.org on 2016/12/14 10:16:04 UTC
svn commit: r1774165 [3/4] - in /ofbiz/trunk/specialpurpose:
cmssite/src/main/java/org/apache/ofbiz/cmssite/multisite/
pricat/src/main/java/org/apache/ofbiz/htmlreport/
pricat/src/main/java/org/apache/ofbiz/htmlreport/sample/
pricat/src/main/java/org/a...
Propchange: ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/HtmlReport.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/InterfaceReport.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/InterfaceReport.java?rev=1774165&r1=1774164&r2=1774165&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/InterfaceReport.java (original)
+++ ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/InterfaceReport.java Wed Dec 14 10:16:04 2016
@@ -1,230 +1,230 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *******************************************************************************/
-package org.apache.ofbiz.htmlreport;
-
-import java.util.List;
-import java.util.Locale;
-
-/**
- * This is the interface for the report classes which are used for the output
- * during operations that run on a separate Thread in OFBiz,
- * like import, export etc.<p>
- *
- */
-public interface InterfaceReport {
-
- /** Indicates default formatting. */
- int FORMAT_DEFAULT = 0;
-
- /** Indicates error formatting. */
- int FORMAT_ERROR = 5;
-
- /** Indicates headline formatting. */
- int FORMAT_HEADLINE = 2;
-
- /** Indicates note formatting. */
- int FORMAT_NOTE = 3;
-
- /** Indicates OK formatting. */
- int FORMAT_OK = 4;
-
- /** Indicates warning formatting. */
- int FORMAT_WARNING = 1;
-
- /** Request parameter value that this report should create an "extended" output. */
- String REPORT_TYPE_EXTENDED = "extended";
-
- /** Request parameter value that this report should create a "simple" output. */
- String REPORT_TYPE_SIMPLE = "simple";
-
- /**
- * Adds an error object to the list of errors that occured during the report.<p>
- *
- * @param obj the error object
- */
- void addError(Object obj);
-
- /**
- * Adds a warning object to the list of warnings that occured during the report.<p>
- *
- * @param obj the error object
- */
- void addWarning(Object obj);
-
- /**
- * Formats the runtime formatted as "hh:mm:ss".<p>
- *
- * @return the runtime formatted as "hh:mm:ss"
- */
- String formatRuntime();
-
- /**
- * Returns a list of all errors that occured during the report.<p>
- *
- * @return an error list that occured during the report
- */
- List<Object> getErrors();
-
- /**
- * Returns the locale this report was initialized with.<p>
- *
- * @return the locale this report was initialized with
- */
- Locale getLocale();
-
- /**
- * Updates this report, this processes all new output added since
- * the last call to this method.<p>
- *
- * This is only required in case the output is written to a HTML page,
- * if the shell output is used, this will just return an empty String.<p>
- *
- * @return new elements that have been added to the report and not yet processed.
- */
- String getReportUpdate();
-
- /**
- * Returns the time this report has been running.<p>
- *
- * @return the time this report has been running
- */
- long getRuntime();
-
- /**
- * Returns a list of all warnings that occured during the report.<p>
- *
- * @return a warning list that occured during the report
- */
- List<Object> getWarnings();
-
- /**
- * Returns if the report generated an error output.<p>
- *
- * @return true if the report generated an error, otherwise false
- */
- boolean hasError();
-
- /**
- * Returns if the report generated a warning output.<p>
- *
- * @return true if the report generated a warning, otherwise false
- */
- boolean hasWarning();
-
- /**
- * Prints a localized message to the report.<p>
- *
- * @param uiLabel the String to add
- */
- void print(String uiLabel);
-
- /**
- * Prints a localized message to the report, using the indicated formatting.<p>
- *
- * Use the contants starting with <code>FORMAT</code> from this interface
- * to indicate which formatting to use.<p>
- *
- * @param uiLabel the String to add
- * @param format the formatting to use for the output
- */
- void print(String uiLabel, int format);
-
- /**
- * Adds a line break to the report.<p>
- */
- void println();
-
- /**
- * Prints a localized message to the report.<p>
- *
- * @param uiLabel the message to add
- */
- void println(String uiLabel);
-
- /**
- * Prints a localized message to the report, using the indicated formatting.<p>
- *
- * Use the contents starting with <code>FORMAT</code> from this interface
- * to indicate which formatting to use.
- *
- * @param uiLabel the message container to add
- * @param format the formatting to use for the output
- */
- void println(String uiLabel, int format);
-
- /**
- * Adds an Exception to the report, ensuring that the Exception content is
- * processed to generate a valid output esp. for HTML pages.<p>
- *
- * The exception will be stored and the output will later be processed
- * in a special way.<p>
- *
- * @param t the exception to add
- *
- */
- void println(Throwable t);
-
- /**
- * Prints a localized message followed by a parameter and dots to the report.<p>
- *
- * @param uiLabel the Message to add
- * @param param the Parameter to add
- */
- void printMessageWithParam(String uiLabel, Object param);
-
- /**
- * Convenience method to print a localized message, followed by a parameter and dots to the report.<p>
- *
- * The output follows the pattern: ( 3 / 8 ) Deleting filename.txt ...
- *
- * @param m the number of the report output
- * @param n the total number of report outputs
- * @param uiLabel the Message to add
- * @param param the Parameter to add
- *
- */
- void printMessageWithParam(int m, int n, String uiLabel, Object param);
-
- /**
- * Resets the runtime to 0 milliseconds.<p>
- */
- void resetRuntime();
-
- /**
- * Add a log file to the report.
- *
- * @param logFileName
- */
- void addLogFile(String logFileName);
-
- /**
- * Close log file if necessary.
- *
- */
- String closeLogFile();
-
- /**
- * Set log's sequence number.
- * @param sequenceNum
- */
- void setSequenceNum(long sequenceNum);
-
- long getSequenceNum();
-
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.apache.ofbiz.htmlreport;
+
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * This is the interface for the report classes which are used for the output
+ * during operations that run on a separate Thread in OFBiz,
+ * like import, export etc.<p>
+ *
+ */
+public interface InterfaceReport {
+
+ /** Indicates default formatting. */
+ int FORMAT_DEFAULT = 0;
+
+ /** Indicates error formatting. */
+ int FORMAT_ERROR = 5;
+
+ /** Indicates headline formatting. */
+ int FORMAT_HEADLINE = 2;
+
+ /** Indicates note formatting. */
+ int FORMAT_NOTE = 3;
+
+ /** Indicates OK formatting. */
+ int FORMAT_OK = 4;
+
+ /** Indicates warning formatting. */
+ int FORMAT_WARNING = 1;
+
+ /** Request parameter value that this report should create an "extended" output. */
+ String REPORT_TYPE_EXTENDED = "extended";
+
+ /** Request parameter value that this report should create a "simple" output. */
+ String REPORT_TYPE_SIMPLE = "simple";
+
+ /**
+ * Adds an error object to the list of errors that occured during the report.<p>
+ *
+ * @param obj the error object
+ */
+ void addError(Object obj);
+
+ /**
+ * Adds a warning object to the list of warnings that occured during the report.<p>
+ *
+ * @param obj the error object
+ */
+ void addWarning(Object obj);
+
+ /**
+ * Formats the runtime formatted as "hh:mm:ss".<p>
+ *
+ * @return the runtime formatted as "hh:mm:ss"
+ */
+ String formatRuntime();
+
+ /**
+ * Returns a list of all errors that occured during the report.<p>
+ *
+ * @return an error list that occured during the report
+ */
+ List<Object> getErrors();
+
+ /**
+ * Returns the locale this report was initialized with.<p>
+ *
+ * @return the locale this report was initialized with
+ */
+ Locale getLocale();
+
+ /**
+ * Updates this report, this processes all new output added since
+ * the last call to this method.<p>
+ *
+ * This is only required in case the output is written to a HTML page,
+ * if the shell output is used, this will just return an empty String.<p>
+ *
+ * @return new elements that have been added to the report and not yet processed.
+ */
+ String getReportUpdate();
+
+ /**
+ * Returns the time this report has been running.<p>
+ *
+ * @return the time this report has been running
+ */
+ long getRuntime();
+
+ /**
+ * Returns a list of all warnings that occured during the report.<p>
+ *
+ * @return a warning list that occured during the report
+ */
+ List<Object> getWarnings();
+
+ /**
+ * Returns if the report generated an error output.<p>
+ *
+ * @return true if the report generated an error, otherwise false
+ */
+ boolean hasError();
+
+ /**
+ * Returns if the report generated a warning output.<p>
+ *
+ * @return true if the report generated a warning, otherwise false
+ */
+ boolean hasWarning();
+
+ /**
+ * Prints a localized message to the report.<p>
+ *
+ * @param uiLabel the String to add
+ */
+ void print(String uiLabel);
+
+ /**
+ * Prints a localized message to the report, using the indicated formatting.<p>
+ *
+ * Use the contants starting with <code>FORMAT</code> from this interface
+ * to indicate which formatting to use.<p>
+ *
+ * @param uiLabel the String to add
+ * @param format the formatting to use for the output
+ */
+ void print(String uiLabel, int format);
+
+ /**
+ * Adds a line break to the report.<p>
+ */
+ void println();
+
+ /**
+ * Prints a localized message to the report.<p>
+ *
+ * @param uiLabel the message to add
+ */
+ void println(String uiLabel);
+
+ /**
+ * Prints a localized message to the report, using the indicated formatting.<p>
+ *
+ * Use the contents starting with <code>FORMAT</code> from this interface
+ * to indicate which formatting to use.
+ *
+ * @param uiLabel the message container to add
+ * @param format the formatting to use for the output
+ */
+ void println(String uiLabel, int format);
+
+ /**
+ * Adds an Exception to the report, ensuring that the Exception content is
+ * processed to generate a valid output esp. for HTML pages.<p>
+ *
+ * The exception will be stored and the output will later be processed
+ * in a special way.<p>
+ *
+ * @param t the exception to add
+ *
+ */
+ void println(Throwable t);
+
+ /**
+ * Prints a localized message followed by a parameter and dots to the report.<p>
+ *
+ * @param uiLabel the Message to add
+ * @param param the Parameter to add
+ */
+ void printMessageWithParam(String uiLabel, Object param);
+
+ /**
+ * Convenience method to print a localized message, followed by a parameter and dots to the report.<p>
+ *
+ * The output follows the pattern: ( 3 / 8 ) Deleting filename.txt ...
+ *
+ * @param m the number of the report output
+ * @param n the total number of report outputs
+ * @param uiLabel the Message to add
+ * @param param the Parameter to add
+ *
+ */
+ void printMessageWithParam(int m, int n, String uiLabel, Object param);
+
+ /**
+ * Resets the runtime to 0 milliseconds.<p>
+ */
+ void resetRuntime();
+
+ /**
+ * Add a log file to the report.
+ *
+ * @param logFileName
+ */
+ void addLogFile(String logFileName);
+
+ /**
+ * Close log file if necessary.
+ *
+ */
+ String closeLogFile();
+
+ /**
+ * Set log's sequence number.
+ * @param sequenceNum
+ */
+ void setSequenceNum(long sequenceNum);
+
+ long getSequenceNum();
+
}
\ No newline at end of file
Propchange: ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/InterfaceReport.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/InterfaceReportThread.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/InterfaceReportThread.java?rev=1774165&r1=1774164&r2=1774165&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/InterfaceReportThread.java (original)
+++ ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/InterfaceReportThread.java Wed Dec 14 10:16:04 2016
@@ -1,41 +1,41 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *******************************************************************************/
-package org.apache.ofbiz.htmlreport;
-
-import org.safehaus.uuid.UUID;
-
-/**
- * Identifies a class that can be used as a report thread.
- *
- */
-public interface InterfaceReportThread {
-
- /**
- * Starts the report thread.<p>
- */
- void start();
-
- /**
- * Returns the UUID of this report thread.<p>
- *
- * @return the UUID of this report thread
- */
- UUID getUUID();
-
-}
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.apache.ofbiz.htmlreport;
+
+import org.safehaus.uuid.UUID;
+
+/**
+ * Identifies a class that can be used as a report thread.
+ *
+ */
+public interface InterfaceReportThread {
+
+ /**
+ * Starts the report thread.<p>
+ */
+ void start();
+
+ /**
+ * Returns the UUID of this report thread.<p>
+ *
+ * @return the UUID of this report thread
+ */
+ UUID getUUID();
+
+}
Propchange: ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/InterfaceReportThread.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/sample/SampleHtmlReport.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/sample/SampleHtmlThread.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/util/ReportEncoder.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/util/ReportEncoder.java?rev=1774165&r1=1774164&r2=1774165&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/util/ReportEncoder.java (original)
+++ ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/util/ReportEncoder.java Wed Dec 14 10:16:04 2016
@@ -1,678 +1,678 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *******************************************************************************/
-package org.apache.ofbiz.htmlreport.util;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-import java.net.URLEncoder;
-import java.nio.CharBuffer;
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetEncoder;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * The ReportEncoder class provides static methods to decode and encode data.<p>
- *
- * The methods in this class are substitutes for <code>java.net.URLEncoder.encode()</code> and
- * <code>java.net.URLDecoder.decode()</code>.<p>
- *
- * The de- and encoding uses the same coding mechanism as JavaScript, special characters are
- * replaced with <code>%hex</code> where hex is a two digit hex number.<p>
- *
- * <b>Note:</b> On the client side (browser) instead of using corresponding <code>escape</code>
- * and <code>unescape</code> JavaScript functions, better use <code>encodeURIComponent</code> and
- * <code>decodeURIComponent</code> functions which are work properly with unicode characters.
- * These functions are supported in IE 5.5+ and NS 6+ only.<p>
- *
- */
-public final class ReportEncoder {
-
- /** Constant for the standard <code>ISO-8859-1</code> encoding. */
- public static final String ENCODING_ISO_8859_1 = "ISO-8859-1";
-
- /** Constant for the standard <code>US-ASCII</code> encoding. */
- public static final String ENCODING_US_ASCII = "US-ASCII";
-
- /**
- * Constant for the standard <code>UTF-8</code> encoding.<p>
- *
- * Default encoding for JavaScript decodeUriComponent methods is <code>UTF-8</code> by w3c standard.
- */
- public static final String ENCODING_UTF_8 = "UTF-8";
-
- /** The regex pattern to match HTML entities. */
- private static final Pattern ENTITIY_PATTERN = Pattern.compile("\\&#\\d+;");
-
- /** The prefix for HTML entities. */
- private static final String ENTITY_PREFIX = "&#";
-
- /** The replacement for HTML entity prefix in parameters. */
- private static final String ENTITY_REPLACEMENT = "$$";
-
- /** A cache for encoding name lookup. */
- private static Map<String, String> encodingCache = new HashMap<String, String>(16);
-
- /** The plus entity. */
- private static final String PLUS_ENTITY = ENTITY_PREFIX + "043;";
-
- /**
- * Constructor.<p>
- */
- private ReportEncoder() {
- // empty
- }
-
- /**
- * Adjusts the given String by making sure all characters that can be displayed
- * in the given charset are contained as chars, whereas all other non-displayable
- * characters are converted to HTML entities.<p>
- *
- * Just calls {@link #decodeHtmlEntities(String, String)} first and feeds the result
- * to {@link #encodeHtmlEntities(String, String)}. <p>
- *
- * @param input the input to adjust the HTML encoding for
- * @param encoding the charset to encode the result with\
- *
- * @return the input with the decoded/encoded HTML entities
- */
- public static String adjustHtmlEncoding(String input, String encoding) {
-
- return encodeHtmlEntities(decodeHtmlEntities(input, encoding), encoding);
- }
-
- /**
- * Changes the encoding of a byte array that represents a String.<p>
- *
- * @param input the byte array to convert
- * @param oldEncoding the current encoding of the byte array
- * @param newEncoding the new encoding of the byte array
- *
- * @return the byte array encoded in the new encoding
- */
- public static byte[] changeEncoding(byte[] input, String oldEncoding, String newEncoding) {
-
- if ((oldEncoding == null) || (newEncoding == null)) {
- return input;
- }
- if (oldEncoding.trim().equalsIgnoreCase(newEncoding.trim())) {
- return input;
- }
- byte[] result = input;
- try {
- result = (new String(input, oldEncoding)).getBytes(newEncoding);
- } catch (UnsupportedEncodingException e) {
- // return value will be input value
- }
- return result;
- }
-
- /**
- * Creates a String out of a byte array with the specified encoding, falling back
- * to the system default in case the encoding name is not valid.<p>
- *
- * Use this method as a replacement for <code>new String(byte[], encoding)</code>
- * to avoid possible encoding problems.<p>
- *
- * @param bytes the bytes to decode
- * @param encoding the encoding scheme to use for decoding the bytes
- *
- * @return the bytes decoded to a String
- */
- public static String createString(byte[] bytes, String encoding) {
-
- String enc = encoding.intern();
- if (enc != ENCODING_UTF_8) {
- enc = lookupEncoding(enc, null);
- }
- if (enc != null) {
- try {
- return new String(bytes, enc);
- } catch (UnsupportedEncodingException e) {
- // this can _never_ happen since the charset was looked up first
- }
- } else {
- enc = ENCODING_UTF_8;
- try {
- return new String(bytes, enc);
- } catch (UnsupportedEncodingException e) {
- // this can also _never_ happen since the default encoding is always valid
- }
- }
- // this code is unreachable in practice
- return null;
- }
-
- /**
- * Decodes a String using UTF-8 encoding, which is the standard for http data transmission
- * with GET ant POST requests.<p>
- *
- * @param source the String to decode
- *
- * @return String the decoded source String
- */
- public static String decode(String source) {
-
- return decode(source, ENCODING_UTF_8);
- }
-
- /**
- * This method is a substitute for <code>URLDecoder.decode()</code>.<p>
- *
- * In case you don't know what encoding to use, set the value of
- * the <code>encoding</code> parameter to <code>null</code>.
- * This method will then default to UTF-8 encoding, which is probably the right one.<p>
- *
- * @param source The string to decode
- * @param encoding The encoding to use (if null, the system default is used)
- *
- * @return The decoded source String
- */
- public static String decode(String source, String encoding) {
-
- if (source == null) {
- return null;
- }
- if (encoding != null) {
- try {
- return URLDecoder.decode(source, encoding);
- } catch (java.io.UnsupportedEncodingException e) {
- // will fallback to default
- }
- }
- // fallback to default decoding
- try {
- return URLDecoder.decode(source, ENCODING_UTF_8);
- } catch (java.io.UnsupportedEncodingException e) {
- // ignore
- }
- return source;
- }
-
- /**
- * Decodes HTML entity references like <code>&#8364;</code> that are contained in the
- * String to a regular character, but only if that character is contained in the given
- * encodings charset.<p>
- *
- * @param input the input to decode the HTML entities in
- * @param encoding the charset to decode the input for
- * @return the input with the decoded HTML entities
- *
- * @see #encodeHtmlEntities(String, String)
- */
- public static String decodeHtmlEntities(String input, String encoding) {
-
- Matcher matcher = ENTITIY_PATTERN.matcher(input);
- StringBuffer result = new StringBuffer(input.length());
- Charset charset = Charset.forName(encoding);
- CharsetEncoder encoder = charset.newEncoder();
-
- while (matcher.find()) {
- String entity = matcher.group();
- String value = entity.substring(2, entity.length() - 1);
- int c = Integer.valueOf(value).intValue();
- if (c < 128) {
- // first 128 chars are contained in almost every charset
- entity = new String(new char[] {(char)c});
- // this is intended as performance improvement since
- // the canEncode() operation appears quite CPU heavy
- } else if (encoder.canEncode((char)c)) {
- // encoder can encode this char
- entity = new String(new char[] {(char)c});
- }
- matcher.appendReplacement(result, entity);
- }
- matcher.appendTail(result);
- return result.toString();
- }
-
- /**
- * Decodes a string used as parameter in an uri in a way independent of other encodings/decodings applied before.<p>
- *
- * @param input the encoded parameter string
- *
- * @return the decoded parameter string
- *
- * @see #encodeParameter(String)
- */
- public static String decodeParameter(String input) {
-
- String result = ReportStringUtil.substitute(input, ENTITY_REPLACEMENT, ENTITY_PREFIX);
- return ReportEncoder.decodeHtmlEntities(result, ENCODING_UTF_8);
- }
-
- /**
- * Encodes a String using UTF-8 encoding, which is the standard for http data transmission
- * with GET ant POST requests.<p>
- *
- * @param source the String to encode
- *
- * @return String the encoded source String
- */
- public static String encode(String source) {
-
- return encode(source, ENCODING_UTF_8);
- }
-
- /**
- * This method is a substitute for <code>URLEncoder.encode()</code>.<p>
- *
- * In case you don't know what encoding to use, set the value of
- * the <code>encoding</code> parameter to <code>null</code>.
- * This method will then default to UTF-8 encoding, which is probably the right one.<p>
- *
- * @param source the String to encode
- * @param encoding the encoding to use (if null, the system default is used)
- *
- * @return the encoded source String
- */
- public static String encode(String source, String encoding) {
-
- if (source == null) {
- return null;
- }
- if (encoding != null) {
- try {
- return URLEncoder.encode(source, encoding);
- } catch (java.io.UnsupportedEncodingException e) {
- // will fallback to default
- }
- }
- // fallback to default encoding
- try {
- return URLEncoder.encode(source, ENCODING_UTF_8);
- } catch (java.io.UnsupportedEncodingException e) {
- // ignore
- }
- return source;
- }
-
- /**
- * Encodes all characters that are contained in the String which can not displayed
- * in the given encodings charset with HTML entity references
- * like <code>&#8364;</code>.<p>
- *
- * This is required since a Java String is
- * internally always stored as Unicode, meaning it can contain almost every character, but
- * the HTML charset used might not support all such characters.<p>
- *
- * @param input the input to encode for HTML
- * @param encoding the charset to encode the result with
- *
- * @return the input with the encoded HTML entities
- *
- * @see #decodeHtmlEntities(String, String)
- */
- public static String encodeHtmlEntities(String input, String encoding) {
-
- StringBuffer result = new StringBuffer(input.length() * 2);
- CharBuffer buffer = CharBuffer.wrap(input.toCharArray());
- Charset charset = Charset.forName(encoding);
- CharsetEncoder encoder = charset.newEncoder();
- for (int i = 0; i < buffer.length(); i++) {
- int c = buffer.get(i);
- if (c < 128) {
- // first 128 chars are contained in almost every charset
- result.append((char)c);
- // this is intended as performance improvement since
- // the canEncode() operation appears quite CPU heavy
- } else if (encoder.canEncode((char)c)) {
- // encoder can encode this char
- result.append((char)c);
- } else {
- // append HTML entity reference
- result.append(ENTITY_PREFIX);
- result.append(c);
- result.append(";");
- }
- }
- return result.toString();
- }
-
- /**
- * Encodes all characters that are contained in the String which can not displayed
- * in the given encodings charset with Java escaping like <code>\u20ac</code>.<p>
- *
- * This can be used to escape values used in Java property files.<p>
- *
- * @param input the input to encode for Java
- * @param encoding the charset to encode the result with
- *
- * @return the input with the encoded Java entities
- */
- public static String encodeJavaEntities(String input, String encoding) {
-
- StringBuffer result = new StringBuffer(input.length() * 2);
- CharBuffer buffer = CharBuffer.wrap(input.toCharArray());
- Charset charset = Charset.forName(encoding);
- CharsetEncoder encoder = charset.newEncoder();
- for (int i = 0; i < buffer.length(); i++) {
- int c = buffer.get(i);
- if (c < 128) {
- // first 128 chars are contained in almost every charset
- result.append((char)c);
- // this is intended as performance improvement since
- // the canEncode() operation appears quite CPU heavy
- } else if (encoder.canEncode((char)c)) {
- // encoder can encode this char
- result.append((char)c);
- } else {
- // append Java entity reference
- result.append("\\u");
- String hex = Integer.toHexString(c);
- int pad = 4 - hex.length();
- for (int p = 0; p < pad; p++) {
- result.append('0');
- }
- result.append(hex);
- }
- }
- return result.toString();
- }
-
- /**
- * Encodes a string used as parameter in an uri in a way independent of other encodings/decodings applied later.<p>
- *
- * Used to ensure that GET parameters are not wrecked by wrong or incompatible configuration settings.
- * In order to ensure this, the String is first encoded with html entities for any character that cannot encoded
- * in US-ASCII; additionally, the plus sign is also encoded to avoid problems with the white-space replacer.
- * Finally, the entity prefix is replaced with characters not used as delimiters in urls.<p>
- *
- * @param input the parameter string
- *
- * @return the encoded parameter string
- */
- public static String encodeParameter(String input) {
-
- String result = ReportEncoder.encodeHtmlEntities(input, ReportEncoder.ENCODING_US_ASCII);
- result = ReportStringUtil.substitute(result, "+", PLUS_ENTITY);
- return ReportStringUtil.substitute(result, ENTITY_PREFIX, ENTITY_REPLACEMENT);
- }
-
- /**
- * Encodes a String in a way that is compatible with the JavaScript escape function.
- *
- * @param source The text to be encoded
- * @param encoding the encoding type
- *
- * @return The JavaScript escaped string
- */
- public static String escape(String source, String encoding) {
-
- // the blank is encoded into "+" not "%20" when using standard encode call
- return ReportStringUtil.substitute(encode(source, encoding), "+", "%20");
- }
-
- /**
- * Escapes special characters in a HTML-String with their number-based
- * entity representation, for example & becomes &#38;.<p>
- *
- * A character <code>num</code> is replaced if<br>
- * <code>((ch != 32) && ((ch > 122) || (ch < 48) || (ch == 60) || (ch == 62)))</code><p>
- *
- * @param source the String to escape
- *
- * @return String the escaped String
- *
- * @see #escapeXml(String)
- */
- public static String escapeHtml(String source) {
-
- int terminatorIndex;
- if (source == null) {
- return null;
- }
- StringBuffer result = new StringBuffer(source.length() * 2);
- for (int i = 0; i < source.length(); i++) {
- int ch = source.charAt(i);
- // avoid escaping already escaped characters
- if (ch == 38) {
- terminatorIndex = source.indexOf(";", i);
- if (terminatorIndex > 0) {
- if (source.substring(i + 1, terminatorIndex).matches("#[0-9]+|lt|gt|amp|quote")) {
- result.append(source.substring(i, terminatorIndex + 1));
- // Skip remaining chars up to (and including) ";"
- i = terminatorIndex;
- continue;
- }
- }
- }
- if ((ch != 32) && ((ch > 122) || (ch < 48) || (ch == 60) || (ch == 62))) {
- result.append(ENTITY_PREFIX);
- result.append(ch);
- result.append(";");
- } else {
- result.append((char)ch);
- }
- }
- return new String(result);
- }
-
- /**
- * Escapes non ASCII characters in a HTML-String with their number-based
- * entity representation, for example & becomes &#38;.<p>
- *
- * A character <code>num</code> is replaced if<br>
- * <code>(ch > 255)</code><p>
- *
- * @param source the String to escape
- *
- * @return String the escaped String
- *
- * @see #escapeXml(String)
- */
- public static String escapeNonAscii(String source) {
-
- if (source == null) {
- return null;
- }
- StringBuffer result = new StringBuffer(source.length() * 2);
- for (int i = 0; i < source.length(); i++) {
- int ch = source.charAt(i);
- if (ch > 255) {
- result.append(ENTITY_PREFIX);
- result.append(ch);
- result.append(";");
- } else {
- result.append((char)ch);
- }
- }
- return new String(result);
- }
-
- /**
- * Encodes a String in a way that is compatible with the JavaScript escape function.
- * Multiple blanks are encoded _multiply _with <code>%20</code>.<p>
- *
- * @param source The text to be encoded
- * @param encoding the encoding type
- *
- * @return The JavaScript escaped string
- */
- public static String escapeWBlanks(String source, String encoding) {
-
- if (ReportStringUtil.isEmpty(source)) {
- return source;
- }
- StringBuffer ret = new StringBuffer(source.length() * 2);
-
- // URLEncode the text string
- // this produces a very similar encoding to JavaSscript encoding,
- // except the blank which is not encoded into "%20" instead of "+"
-
- String enc = encode(source, encoding);
- for (int z = 0; z < enc.length(); z++) {
- char c = enc.charAt(z);
- if (c == '+') {
- ret.append("%20");
- } else {
- ret.append(c);
- }
- }
- return ret.toString();
- }
-
- /**
- * Escapes a String so it may be printed as text content or attribute
- * value in a HTML page or an XML file.<p>
- *
- * This method replaces the following characters in a String:
- * <ul>
- * <li><b><</b> with &lt;
- * <li><b>></b> with &gt;
- * <li><b>&</b> with &amp;
- * <li><b>"</b> with &quot;
- * </ul><p>
- *
- * @param source the string to escape
- *
- * @return the escaped string
- *
- * @see #escapeHtml(String)
- */
- public static String escapeXml(String source) {
-
- return escapeXml(source, false);
- }
-
- /**
- * Escapes a String so it may be printed as text content or attribute
- * value in a HTML page or an XML file.<p>
- *
- * This method replaces the following characters in a String:
- * <ul>
- * <li><b><</b> with &lt;
- * <li><b>></b> with &gt;
- * <li><b>&</b> with &amp;
- * <li><b>"</b> with &quot;
- * </ul><p>
- *
- * @param source the string to escape
- * @param doubleEscape if <code>false</code>, all entities that already are escaped are left untouched
- *
- * @return the escaped string
- *
- * @see #escapeHtml(String)
- */
- public static String escapeXml(String source, boolean doubleEscape) {
-
- if (source == null) {
- return null;
- }
- StringBuffer result = new StringBuffer(source.length() * 2);
-
- for (int i = 0; i < source.length(); ++i) {
- char ch = source.charAt(i);
- switch (ch) {
- case '<':
- result.append("<");
- break;
- case '>':
- result.append(">");
- break;
- case '&':
- // don't escape already escaped international and special characters
- if (!doubleEscape) {
- int terminatorIndex = source.indexOf(";", i);
- if (terminatorIndex > 0) {
- if (source.substring(i + 1, terminatorIndex).matches("#[0-9]+")) {
- result.append(ch);
- break;
- }
- }
- }
- // note that to other "break" in the above "if" block
- result.append("&");
- break;
- case '"':
- result.append(""");
- break;
- default:
- result.append(ch);
- }
- }
- return new String(result);
- }
-
- /**
- * Checks if a given encoding name is actually supported, and if so
- * resolves it to it's canonical name, if not it returns the given fallback
- * value.<p>
- *
- * Charsets have a set of aliases. For example, valid aliases for "UTF-8"
- * are "UTF8", "utf-8" or "utf8". This method resolves any given valid charset name
- * to it's "canonical" form, so that simple String comparison can be used
- * when checking charset names internally later.<p>
- *
- * Please see <a href="http://www.iana.org/assignments/character-sets">http://www.iana.org/assignments/character-sets</a>
- * for a list of valid charset alias names.<p>
- *
- * @param encoding the encoding to check and resolve
- * @param fallback the fallback encoding scheme
- *
- * @return the resolved encoding name, or the fallback value
- */
- public static String lookupEncoding(String encoding, String fallback) {
-
- String result = (String) encodingCache.get(encoding);
- if (result != null) {
- return result;
- }
-
- try {
- result = Charset.forName(encoding).name();
- encodingCache.put(encoding, result);
- return result;
- } catch (Throwable t) {
- // we will use the default value as fallback
- }
-
- return fallback;
- }
-
- /**
- * Decodes a String in a way that is compatible with the JavaScript
- * unescape function.<p>
- *
- * @param source The String to be decoded
- * @param encoding the encoding type
- *
- * @return The JavaScript unescaped String
- */
- public static String unescape(String source, String encoding) {
-
- if (source == null) {
- return null;
- }
- int len = source.length();
- // to use standard decoder we need to replace '+' with "%20" (space)
- StringBuffer preparedSource = new StringBuffer(len);
- for (int i = 0; i < len; i++) {
- char c = source.charAt(i);
- if (c == '+') {
- preparedSource.append("%20");
- } else {
- preparedSource.append(c);
- }
- }
- return decode(preparedSource.toString(), encoding);
- }
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.apache.ofbiz.htmlreport.util;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetEncoder;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * The ReportEncoder class provides static methods to decode and encode data.<p>
+ *
+ * The methods in this class are substitutes for <code>java.net.URLEncoder.encode()</code> and
+ * <code>java.net.URLDecoder.decode()</code>.<p>
+ *
+ * The de- and encoding uses the same coding mechanism as JavaScript, special characters are
+ * replaced with <code>%hex</code> where hex is a two digit hex number.<p>
+ *
+ * <b>Note:</b> On the client side (browser) instead of using corresponding <code>escape</code>
+ * and <code>unescape</code> JavaScript functions, better use <code>encodeURIComponent</code> and
+ * <code>decodeURIComponent</code> functions which are work properly with unicode characters.
+ * These functions are supported in IE 5.5+ and NS 6+ only.<p>
+ *
+ */
+public final class ReportEncoder {
+
+ /** Constant for the standard <code>ISO-8859-1</code> encoding. */
+ public static final String ENCODING_ISO_8859_1 = "ISO-8859-1";
+
+ /** Constant for the standard <code>US-ASCII</code> encoding. */
+ public static final String ENCODING_US_ASCII = "US-ASCII";
+
+ /**
+ * Constant for the standard <code>UTF-8</code> encoding.<p>
+ *
+ * Default encoding for JavaScript decodeUriComponent methods is <code>UTF-8</code> by w3c standard.
+ */
+ public static final String ENCODING_UTF_8 = "UTF-8";
+
+ /** The regex pattern to match HTML entities. */
+ private static final Pattern ENTITIY_PATTERN = Pattern.compile("\\&#\\d+;");
+
+ /** The prefix for HTML entities. */
+ private static final String ENTITY_PREFIX = "&#";
+
+ /** The replacement for HTML entity prefix in parameters. */
+ private static final String ENTITY_REPLACEMENT = "$$";
+
+ /** A cache for encoding name lookup. */
+ private static Map<String, String> encodingCache = new HashMap<String, String>(16);
+
+ /** The plus entity. */
+ private static final String PLUS_ENTITY = ENTITY_PREFIX + "043;";
+
+ /**
+ * Constructor.<p>
+ */
+ private ReportEncoder() {
+ // empty
+ }
+
+ /**
+ * Adjusts the given String by making sure all characters that can be displayed
+ * in the given charset are contained as chars, whereas all other non-displayable
+ * characters are converted to HTML entities.<p>
+ *
+ * Just calls {@link #decodeHtmlEntities(String, String)} first and feeds the result
+ * to {@link #encodeHtmlEntities(String, String)}. <p>
+ *
+ * @param input the input to adjust the HTML encoding for
+ * @param encoding the charset to encode the result with\
+ *
+ * @return the input with the decoded/encoded HTML entities
+ */
+ public static String adjustHtmlEncoding(String input, String encoding) {
+
+ return encodeHtmlEntities(decodeHtmlEntities(input, encoding), encoding);
+ }
+
+ /**
+ * Changes the encoding of a byte array that represents a String.<p>
+ *
+ * @param input the byte array to convert
+ * @param oldEncoding the current encoding of the byte array
+ * @param newEncoding the new encoding of the byte array
+ *
+ * @return the byte array encoded in the new encoding
+ */
+ public static byte[] changeEncoding(byte[] input, String oldEncoding, String newEncoding) {
+
+ if ((oldEncoding == null) || (newEncoding == null)) {
+ return input;
+ }
+ if (oldEncoding.trim().equalsIgnoreCase(newEncoding.trim())) {
+ return input;
+ }
+ byte[] result = input;
+ try {
+ result = (new String(input, oldEncoding)).getBytes(newEncoding);
+ } catch (UnsupportedEncodingException e) {
+ // return value will be input value
+ }
+ return result;
+ }
+
+ /**
+ * Creates a String out of a byte array with the specified encoding, falling back
+ * to the system default in case the encoding name is not valid.<p>
+ *
+ * Use this method as a replacement for <code>new String(byte[], encoding)</code>
+ * to avoid possible encoding problems.<p>
+ *
+ * @param bytes the bytes to decode
+ * @param encoding the encoding scheme to use for decoding the bytes
+ *
+ * @return the bytes decoded to a String
+ */
+ public static String createString(byte[] bytes, String encoding) {
+
+ String enc = encoding.intern();
+ if (enc != ENCODING_UTF_8) {
+ enc = lookupEncoding(enc, null);
+ }
+ if (enc != null) {
+ try {
+ return new String(bytes, enc);
+ } catch (UnsupportedEncodingException e) {
+ // this can _never_ happen since the charset was looked up first
+ }
+ } else {
+ enc = ENCODING_UTF_8;
+ try {
+ return new String(bytes, enc);
+ } catch (UnsupportedEncodingException e) {
+ // this can also _never_ happen since the default encoding is always valid
+ }
+ }
+ // this code is unreachable in practice
+ return null;
+ }
+
+ /**
+ * Decodes a String using UTF-8 encoding, which is the standard for http data transmission
+ * with GET ant POST requests.<p>
+ *
+ * @param source the String to decode
+ *
+ * @return String the decoded source String
+ */
+ public static String decode(String source) {
+
+ return decode(source, ENCODING_UTF_8);
+ }
+
+ /**
+ * This method is a substitute for <code>URLDecoder.decode()</code>.<p>
+ *
+ * In case you don't know what encoding to use, set the value of
+ * the <code>encoding</code> parameter to <code>null</code>.
+ * This method will then default to UTF-8 encoding, which is probably the right one.<p>
+ *
+ * @param source The string to decode
+ * @param encoding The encoding to use (if null, the system default is used)
+ *
+ * @return The decoded source String
+ */
+ public static String decode(String source, String encoding) {
+
+ if (source == null) {
+ return null;
+ }
+ if (encoding != null) {
+ try {
+ return URLDecoder.decode(source, encoding);
+ } catch (java.io.UnsupportedEncodingException e) {
+ // will fallback to default
+ }
+ }
+ // fallback to default decoding
+ try {
+ return URLDecoder.decode(source, ENCODING_UTF_8);
+ } catch (java.io.UnsupportedEncodingException e) {
+ // ignore
+ }
+ return source;
+ }
+
+ /**
+ * Decodes HTML entity references like <code>&#8364;</code> that are contained in the
+ * String to a regular character, but only if that character is contained in the given
+ * encodings charset.<p>
+ *
+ * @param input the input to decode the HTML entities in
+ * @param encoding the charset to decode the input for
+ * @return the input with the decoded HTML entities
+ *
+ * @see #encodeHtmlEntities(String, String)
+ */
+ public static String decodeHtmlEntities(String input, String encoding) {
+
+ Matcher matcher = ENTITIY_PATTERN.matcher(input);
+ StringBuffer result = new StringBuffer(input.length());
+ Charset charset = Charset.forName(encoding);
+ CharsetEncoder encoder = charset.newEncoder();
+
+ while (matcher.find()) {
+ String entity = matcher.group();
+ String value = entity.substring(2, entity.length() - 1);
+ int c = Integer.valueOf(value).intValue();
+ if (c < 128) {
+ // first 128 chars are contained in almost every charset
+ entity = new String(new char[] {(char)c});
+ // this is intended as performance improvement since
+ // the canEncode() operation appears quite CPU heavy
+ } else if (encoder.canEncode((char)c)) {
+ // encoder can encode this char
+ entity = new String(new char[] {(char)c});
+ }
+ matcher.appendReplacement(result, entity);
+ }
+ matcher.appendTail(result);
+ return result.toString();
+ }
+
+ /**
+ * Decodes a string used as parameter in an uri in a way independent of other encodings/decodings applied before.<p>
+ *
+ * @param input the encoded parameter string
+ *
+ * @return the decoded parameter string
+ *
+ * @see #encodeParameter(String)
+ */
+ public static String decodeParameter(String input) {
+
+ String result = ReportStringUtil.substitute(input, ENTITY_REPLACEMENT, ENTITY_PREFIX);
+ return ReportEncoder.decodeHtmlEntities(result, ENCODING_UTF_8);
+ }
+
+ /**
+ * Encodes a String using UTF-8 encoding, which is the standard for http data transmission
+ * with GET ant POST requests.<p>
+ *
+ * @param source the String to encode
+ *
+ * @return String the encoded source String
+ */
+ public static String encode(String source) {
+
+ return encode(source, ENCODING_UTF_8);
+ }
+
+ /**
+ * This method is a substitute for <code>URLEncoder.encode()</code>.<p>
+ *
+ * In case you don't know what encoding to use, set the value of
+ * the <code>encoding</code> parameter to <code>null</code>.
+ * This method will then default to UTF-8 encoding, which is probably the right one.<p>
+ *
+ * @param source the String to encode
+ * @param encoding the encoding to use (if null, the system default is used)
+ *
+ * @return the encoded source String
+ */
+ public static String encode(String source, String encoding) {
+
+ if (source == null) {
+ return null;
+ }
+ if (encoding != null) {
+ try {
+ return URLEncoder.encode(source, encoding);
+ } catch (java.io.UnsupportedEncodingException e) {
+ // will fallback to default
+ }
+ }
+ // fallback to default encoding
+ try {
+ return URLEncoder.encode(source, ENCODING_UTF_8);
+ } catch (java.io.UnsupportedEncodingException e) {
+ // ignore
+ }
+ return source;
+ }
+
+ /**
+ * Encodes all characters that are contained in the String which can not displayed
+ * in the given encodings charset with HTML entity references
+ * like <code>&#8364;</code>.<p>
+ *
+ * This is required since a Java String is
+ * internally always stored as Unicode, meaning it can contain almost every character, but
+ * the HTML charset used might not support all such characters.<p>
+ *
+ * @param input the input to encode for HTML
+ * @param encoding the charset to encode the result with
+ *
+ * @return the input with the encoded HTML entities
+ *
+ * @see #decodeHtmlEntities(String, String)
+ */
+ public static String encodeHtmlEntities(String input, String encoding) {
+
+ StringBuffer result = new StringBuffer(input.length() * 2);
+ CharBuffer buffer = CharBuffer.wrap(input.toCharArray());
+ Charset charset = Charset.forName(encoding);
+ CharsetEncoder encoder = charset.newEncoder();
+ for (int i = 0; i < buffer.length(); i++) {
+ int c = buffer.get(i);
+ if (c < 128) {
+ // first 128 chars are contained in almost every charset
+ result.append((char)c);
+ // this is intended as performance improvement since
+ // the canEncode() operation appears quite CPU heavy
+ } else if (encoder.canEncode((char)c)) {
+ // encoder can encode this char
+ result.append((char)c);
+ } else {
+ // append HTML entity reference
+ result.append(ENTITY_PREFIX);
+ result.append(c);
+ result.append(";");
+ }
+ }
+ return result.toString();
+ }
+
+ /**
+ * Encodes all characters that are contained in the String which can not displayed
+ * in the given encodings charset with Java escaping like <code>\u20ac</code>.<p>
+ *
+ * This can be used to escape values used in Java property files.<p>
+ *
+ * @param input the input to encode for Java
+ * @param encoding the charset to encode the result with
+ *
+ * @return the input with the encoded Java entities
+ */
+ public static String encodeJavaEntities(String input, String encoding) {
+
+ StringBuffer result = new StringBuffer(input.length() * 2);
+ CharBuffer buffer = CharBuffer.wrap(input.toCharArray());
+ Charset charset = Charset.forName(encoding);
+ CharsetEncoder encoder = charset.newEncoder();
+ for (int i = 0; i < buffer.length(); i++) {
+ int c = buffer.get(i);
+ if (c < 128) {
+ // first 128 chars are contained in almost every charset
+ result.append((char)c);
+ // this is intended as performance improvement since
+ // the canEncode() operation appears quite CPU heavy
+ } else if (encoder.canEncode((char)c)) {
+ // encoder can encode this char
+ result.append((char)c);
+ } else {
+ // append Java entity reference
+ result.append("\\u");
+ String hex = Integer.toHexString(c);
+ int pad = 4 - hex.length();
+ for (int p = 0; p < pad; p++) {
+ result.append('0');
+ }
+ result.append(hex);
+ }
+ }
+ return result.toString();
+ }
+
+ /**
+ * Encodes a string used as parameter in an uri in a way independent of other encodings/decodings applied later.<p>
+ *
+ * Used to ensure that GET parameters are not wrecked by wrong or incompatible configuration settings.
+ * In order to ensure this, the String is first encoded with html entities for any character that cannot encoded
+ * in US-ASCII; additionally, the plus sign is also encoded to avoid problems with the white-space replacer.
+ * Finally, the entity prefix is replaced with characters not used as delimiters in urls.<p>
+ *
+ * @param input the parameter string
+ *
+ * @return the encoded parameter string
+ */
+ public static String encodeParameter(String input) {
+
+ String result = ReportEncoder.encodeHtmlEntities(input, ReportEncoder.ENCODING_US_ASCII);
+ result = ReportStringUtil.substitute(result, "+", PLUS_ENTITY);
+ return ReportStringUtil.substitute(result, ENTITY_PREFIX, ENTITY_REPLACEMENT);
+ }
+
+ /**
+ * Encodes a String in a way that is compatible with the JavaScript escape function.
+ *
+ * @param source The text to be encoded
+ * @param encoding the encoding type
+ *
+ * @return The JavaScript escaped string
+ */
+ public static String escape(String source, String encoding) {
+
+ // the blank is encoded into "+" not "%20" when using standard encode call
+ return ReportStringUtil.substitute(encode(source, encoding), "+", "%20");
+ }
+
+ /**
+ * Escapes special characters in a HTML-String with their number-based
+ * entity representation, for example & becomes &#38;.<p>
+ *
+ * A character <code>num</code> is replaced if<br>
+ * <code>((ch != 32) && ((ch > 122) || (ch < 48) || (ch == 60) || (ch == 62)))</code><p>
+ *
+ * @param source the String to escape
+ *
+ * @return String the escaped String
+ *
+ * @see #escapeXml(String)
+ */
+ public static String escapeHtml(String source) {
+
+ int terminatorIndex;
+ if (source == null) {
+ return null;
+ }
+ StringBuffer result = new StringBuffer(source.length() * 2);
+ for (int i = 0; i < source.length(); i++) {
+ int ch = source.charAt(i);
+ // avoid escaping already escaped characters
+ if (ch == 38) {
+ terminatorIndex = source.indexOf(";", i);
+ if (terminatorIndex > 0) {
+ if (source.substring(i + 1, terminatorIndex).matches("#[0-9]+|lt|gt|amp|quote")) {
+ result.append(source.substring(i, terminatorIndex + 1));
+ // Skip remaining chars up to (and including) ";"
+ i = terminatorIndex;
+ continue;
+ }
+ }
+ }
+ if ((ch != 32) && ((ch > 122) || (ch < 48) || (ch == 60) || (ch == 62))) {
+ result.append(ENTITY_PREFIX);
+ result.append(ch);
+ result.append(";");
+ } else {
+ result.append((char)ch);
+ }
+ }
+ return new String(result);
+ }
+
+ /**
+ * Escapes non ASCII characters in a HTML-String with their number-based
+ * entity representation, for example & becomes &#38;.<p>
+ *
+ * A character <code>num</code> is replaced if<br>
+ * <code>(ch > 255)</code><p>
+ *
+ * @param source the String to escape
+ *
+ * @return String the escaped String
+ *
+ * @see #escapeXml(String)
+ */
+ public static String escapeNonAscii(String source) {
+
+ if (source == null) {
+ return null;
+ }
+ StringBuffer result = new StringBuffer(source.length() * 2);
+ for (int i = 0; i < source.length(); i++) {
+ int ch = source.charAt(i);
+ if (ch > 255) {
+ result.append(ENTITY_PREFIX);
+ result.append(ch);
+ result.append(";");
+ } else {
+ result.append((char)ch);
+ }
+ }
+ return new String(result);
+ }
+
+ /**
+ * Encodes a String in a way that is compatible with the JavaScript escape function.
+ * Multiple blanks are encoded _multiply _with <code>%20</code>.<p>
+ *
+ * @param source The text to be encoded
+ * @param encoding the encoding type
+ *
+ * @return The JavaScript escaped string
+ */
+ public static String escapeWBlanks(String source, String encoding) {
+
+ if (ReportStringUtil.isEmpty(source)) {
+ return source;
+ }
+ StringBuffer ret = new StringBuffer(source.length() * 2);
+
+ // URLEncode the text string
+ // this produces a very similar encoding to JavaSscript encoding,
+ // except the blank which is not encoded into "%20" instead of "+"
+
+ String enc = encode(source, encoding);
+ for (int z = 0; z < enc.length(); z++) {
+ char c = enc.charAt(z);
+ if (c == '+') {
+ ret.append("%20");
+ } else {
+ ret.append(c);
+ }
+ }
+ return ret.toString();
+ }
+
+ /**
+ * Escapes a String so it may be printed as text content or attribute
+ * value in a HTML page or an XML file.<p>
+ *
+ * This method replaces the following characters in a String:
+ * <ul>
+ * <li><b><</b> with &lt;
+ * <li><b>></b> with &gt;
+ * <li><b>&</b> with &amp;
+ * <li><b>"</b> with &quot;
+ * </ul><p>
+ *
+ * @param source the string to escape
+ *
+ * @return the escaped string
+ *
+ * @see #escapeHtml(String)
+ */
+ public static String escapeXml(String source) {
+
+ return escapeXml(source, false);
+ }
+
+ /**
+ * Escapes a String so it may be printed as text content or attribute
+ * value in a HTML page or an XML file.<p>
+ *
+ * This method replaces the following characters in a String:
+ * <ul>
+ * <li><b><</b> with &lt;
+ * <li><b>></b> with &gt;
+ * <li><b>&</b> with &amp;
+ * <li><b>"</b> with &quot;
+ * </ul><p>
+ *
+ * @param source the string to escape
+ * @param doubleEscape if <code>false</code>, all entities that already are escaped are left untouched
+ *
+ * @return the escaped string
+ *
+ * @see #escapeHtml(String)
+ */
+ public static String escapeXml(String source, boolean doubleEscape) {
+
+ if (source == null) {
+ return null;
+ }
+ StringBuffer result = new StringBuffer(source.length() * 2);
+
+ for (int i = 0; i < source.length(); ++i) {
+ char ch = source.charAt(i);
+ switch (ch) {
+ case '<':
+ result.append("<");
+ break;
+ case '>':
+ result.append(">");
+ break;
+ case '&':
+ // don't escape already escaped international and special characters
+ if (!doubleEscape) {
+ int terminatorIndex = source.indexOf(";", i);
+ if (terminatorIndex > 0) {
+ if (source.substring(i + 1, terminatorIndex).matches("#[0-9]+")) {
+ result.append(ch);
+ break;
+ }
+ }
+ }
+ // note that to other "break" in the above "if" block
+ result.append("&");
+ break;
+ case '"':
+ result.append(""");
+ break;
+ default:
+ result.append(ch);
+ }
+ }
+ return new String(result);
+ }
+
+ /**
+ * Checks if a given encoding name is actually supported, and if so
+ * resolves it to it's canonical name, if not it returns the given fallback
+ * value.<p>
+ *
+ * Charsets have a set of aliases. For example, valid aliases for "UTF-8"
+ * are "UTF8", "utf-8" or "utf8". This method resolves any given valid charset name
+ * to it's "canonical" form, so that simple String comparison can be used
+ * when checking charset names internally later.<p>
+ *
+ * Please see <a href="http://www.iana.org/assignments/character-sets">http://www.iana.org/assignments/character-sets</a>
+ * for a list of valid charset alias names.<p>
+ *
+ * @param encoding the encoding to check and resolve
+ * @param fallback the fallback encoding scheme
+ *
+ * @return the resolved encoding name, or the fallback value
+ */
+ public static String lookupEncoding(String encoding, String fallback) {
+
+ String result = (String) encodingCache.get(encoding);
+ if (result != null) {
+ return result;
+ }
+
+ try {
+ result = Charset.forName(encoding).name();
+ encodingCache.put(encoding, result);
+ return result;
+ } catch (Throwable t) {
+ // we will use the default value as fallback
+ }
+
+ return fallback;
+ }
+
+ /**
+ * Decodes a String in a way that is compatible with the JavaScript
+ * unescape function.<p>
+ *
+ * @param source The String to be decoded
+ * @param encoding the encoding type
+ *
+ * @return The JavaScript unescaped String
+ */
+ public static String unescape(String source, String encoding) {
+
+ if (source == null) {
+ return null;
+ }
+ int len = source.length();
+ // to use standard decoder we need to replace '+' with "%20" (space)
+ StringBuffer preparedSource = new StringBuffer(len);
+ for (int i = 0; i < len; i++) {
+ char c = source.charAt(i);
+ if (c == '+') {
+ preparedSource.append("%20");
+ } else {
+ preparedSource.append(c);
+ }
+ }
+ return decode(preparedSource.toString(), encoding);
+ }
}
\ No newline at end of file
Propchange: ofbiz/trunk/specialpurpose/pricat/src/main/java/org/apache/ofbiz/htmlreport/util/ReportEncoder.java
------------------------------------------------------------------------------
svn:eol-style = native