nicolaken 02/04/26 07:09:22
Modified: src/documentation/xdocs/userdocs index.xml
src/documentation/xdocs/userdocs/serializers
xls-serializer.xml
src/java/org/apache/cocoon/components/elementprocessor/impl/poi/hssf
HSSFElementProcessorFactory.java
src/java/org/apache/cocoon/components/elementprocessor/impl/poi/hssf/elements
Cell.java EPCell.java
src/java/org/apache/cocoon/serialization HSSFSerializer.java
Added: src/java/org/apache/cocoon/components/elementprocessor
LocaleAware.java
Log:
[PATCH] HSSF internazionalization problems with numbers Bug#: 8264
by Andy Oliver ([EMAIL PROTECTED])
Revision Changes Path
1.3 +1 -1 xml-cocoon2/src/documentation/xdocs/userdocs/index.xml
Index: index.xml
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/documentation/xdocs/userdocs/index.xml,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- index.xml 18 Apr 2002 16:18:04 -0000 1.2
+++ index.xml 26 Apr 2002 14:09:22 -0000 1.3
@@ -18,7 +18,7 @@
concepts, but a number of details as well. Read the Introduction and ensure that
you
understand concepts such as the sitemap, generators, transformers, serializers
and actions. This guide will fill in the details, such as "So how do I turn
- this query into XML date".
+ this query into XML data".
</p>
<p>
1.2 +11 -3
xml-cocoon2/src/documentation/xdocs/userdocs/serializers/xls-serializer.xml
Index: xls-serializer.xml
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/documentation/xdocs/userdocs/serializers/xls-serializer.xml,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- xls-serializer.xml 18 Apr 2002 16:21:10 -0000 1.1
+++ xls-serializer.xml 26 Apr 2002 14:09:22 -0000 1.2
@@ -30,7 +30,7 @@
and then refactor it into an XSLT page.
</p>
<p>The HSSF Serializer supports most of the
- functionalities supported by the
+ functionality supplied by the
<link href="http://jakarta.apache.org/poi/hssf">HSSF
API</link> which is part of the <link
href="http://jakarta.apache.org/poi">Jakarta POI
@@ -47,10 +47,18 @@
need a sitemap of course. Once you have that well,
you're half there. Add </p>
<source>
- <map:serializer name="xls"
src="org.apache.cocoon.serialization.HSSFSerializer"
mime-type="application/vnd.ms-excel"/>
+ <map:serializer name="xls"
src="org.apache.cocoon.serialization.HSSFSerializer"
mime-type="application/vnd.ms-excel" locale="us"/>
</source>
<p>
- to the sitemap between the map:serializers tags. Next,
+ to the sitemap between the map:serializers tags. The
locale is optional
+ and is used only to validate numbers. Please note that
numbers not in US-default
+ format may mot be compatible with Gnumeric (its less
cosmopolitan then the
+ HSSF Serializer ;-) ). Setting the locale lets you use
default number formats
+ from other locales. Set this to a two letter lowercase
country code. See
+ java.util.Locale for details.
+ </p>
+ <p>
+ Next,
set up an entry for each url or set of urls (via
matching rules) resembling this:
</p>
1.1
xml-cocoon2/src/java/org/apache/cocoon/components/elementprocessor/LocaleAware.java
Index: LocaleAware.java
===================================================================
/*
============================================================================
The Apache Software License, Version 1.1
============================================================================
Copyright (C) 1999-2002 The Apache Software Foundation. All rights reserved.
Redistribution and use in source and binary forms, with or without modifica-
tion, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. The end-user documentation included with the redistribution, if any, must
include the following acknowledgment: "This product includes software
developed by the Apache Software Foundation (http://www.apache.org/)."
Alternately, this acknowledgment may appear in the software itself, if
and wherever such third-party acknowledgments normally appear.
4. The names "Apache Cocoon" and "Apache Software Foundation" must not be
used to endorse or promote products derived from this software without
prior written permission. For written permission, please contact
[EMAIL PROTECTED]
5. Products derived from this software may not be called "Apache", nor may
"Apache" appear in their name, without prior written permission of the
Apache Software Foundation.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU-
DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This software consists of voluntary contributions made by many individuals
on behalf of the Apache Software Foundation and was originally created by
Stefano Mazzocchi <[EMAIL PROTECTED]>. For more information on the Apache
Software Foundation, please see <http://www.apache.org/>.
*/
package org.apache.cocoon.components.elementprocessor;
/**
* The LocaleAware interface is for element processors whom require the locale
* configuration string to control their behavior. For HSSF this is somewhat
* of a kludge to get past the fact the Gnumeric XML format does not allow
* numbers formatted according to different locales in the <Cell> tags.
* However, the ESQL generator for instance will generate them no other way.
*
* @author Andrew C. Oliver ([EMAIL PROTECTED])
*/
public interface LocaleAware
{
/**
* Set the locale for a given element processor.
*/
public void setLocale(String locale);
} // end public interface LocaleAware
1.2 +9 -2
xml-cocoon2/src/java/org/apache/cocoon/components/elementprocessor/impl/poi/hssf/HSSFElementProcessorFactory.java
Index: HSSFElementProcessorFactory.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/elementprocessor/impl/poi/hssf/HSSFElementProcessorFactory.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- HSSFElementProcessorFactory.java 6 Mar 2002 16:58:02 -0000 1.1
+++ HSSFElementProcessorFactory.java 26 Apr 2002 14:09:22 -0000 1.2
@@ -66,14 +66,16 @@
public class HSSFElementProcessorFactory
extends AbstractElementProcessorFactory
{
-
+ //holds the locale configuration
+ String locale;
/**
* default constructor
*/
- public HSSFElementProcessorFactory()
+ public HSSFElementProcessorFactory(String locale)
{
super();
+ this.locale=locale;
addElementProcessorProgenitor("Attribute", EPAttribute.class);
addElementProcessorProgenitor("Attributes", EPAttributes.class);
addElementProcessorProgenitor("Bottom", EPBottom.class);
@@ -174,6 +176,11 @@
try
{
rval = createNewElementProcessorInstance(( Class ) progenitor);
+
+ //every locale aware element processor is passed the locale string
+ if (rval instanceof LocaleAware) {
+ ((LocaleAware)rval).setLocale(locale);
+ }
}
catch (ClassCastException e)
{
1.2 +28 -2
xml-cocoon2/src/java/org/apache/cocoon/components/elementprocessor/impl/poi/hssf/elements/Cell.java
Index: Cell.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/elementprocessor/impl/poi/hssf/elements/Cell.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Cell.java 6 Mar 2002 16:58:02 -0000 1.1
+++ Cell.java 26 Apr 2002 14:09:22 -0000 1.2
@@ -58,6 +58,11 @@
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import java.io.IOException;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.util.Locale;
+
/**
* internal representation of a Cell
@@ -72,6 +77,7 @@
// original CellType value
private int _celltype;
+ private Locale locale;
/**
* Constructor Cell
@@ -86,6 +92,15 @@
}
/**
+ * if there is a locale that can be used for validation it is
+ * set here. Cell expects a fully constructed locale. It must
+ * be passed in before SetContent can be called.
+ */
+ void setLocale(Locale locale) {
+ this.locale = locale;
+ }
+
+ /**
* set content
*
* @param content the value of the cell, as a string
@@ -101,8 +116,16 @@
try
{
if (_celltype == CellType.CELL_TYPE_FLOAT)
- {
- _cell.setCellValue(Double.parseDouble(content));
+ { // if there is a locale set then we'll use it to
+ // parse the string form of the number... otherwise
+ // we'll use the default.
+ NumberFormat form = null;
+ if (locale == null) {
+ form = NumberFormat.getInstance();
+ } else {
+ form = NumberFormat.getInstance(locale);
+ }
+ _cell.setCellValue(form.parse(content).doubleValue());
}
else
{
@@ -113,6 +136,9 @@
{
throw new IOException("Invalid value for a numeric cell: "
+ content);
+ }
+ catch (ParseException e) {
+ throw new IOException("Invalid value for a numberic cell: " +
content);
}
}
else if (_cell.getCellType() == HSSFCell.CELL_TYPE_STRING)
1.4 +14 -1
xml-cocoon2/src/java/org/apache/cocoon/components/elementprocessor/impl/poi/hssf/elements/EPCell.java
Index: EPCell.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/elementprocessor/impl/poi/hssf/elements/EPCell.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- EPCell.java 12 Apr 2002 14:01:45 -0000 1.3
+++ EPCell.java 26 Apr 2002 14:09:22 -0000 1.4
@@ -53,12 +53,14 @@
import org.apache.cocoon.components.elementprocessor.types.Attribute;
import org.apache.cocoon.components.elementprocessor.ElementProcessor;
+import org.apache.cocoon.components.elementprocessor.LocaleAware;
import org.apache.cocoon.components.elementprocessor.types.NumericConverter;
import org.apache.cocoon.components.elementprocessor.types.NumericResult;
import org.apache.cocoon.components.elementprocessor.types.Validator;
import org.apache.poi.hssf.usermodel.HSSFCell;
import java.io.IOException;
+import java.util.Locale;
/**
* implementation of ElementProcessor to handle the "Cell" tag
@@ -69,7 +71,7 @@
*/
public class EPCell
-extends BaseElementProcessor {
+extends BaseElementProcessor implements LocaleAware {
private Cell _cell;
private NumericResult _col;
private NumericResult _row;
@@ -90,6 +92,7 @@
private static final String _rows_attribute = "Rows";
private static final String _value_type_attribute = "ValueType";
private static final String _value_format_attribute = "ValueFormat";
+ private String locale; // the locale for this EPCell
private static final Validator _cell_type_validator = new Validator() {
public IOException validate(final Number number) {
return CellType.isValid(number.intValue()) ? null
@@ -288,6 +291,11 @@
public void endProcessing() throws IOException {
String content = getContent();
+ if (content != null && locale != null) {
+ // if there is a locale then set it (otherwise the default locale
+ // will be used
+ getCell().setLocale(new Locale(locale, locale.toUpperCase()));
+ }
if (content != null && !content.trim().equals("")) {
getCell().setContent(getContent());
}
@@ -301,6 +309,11 @@
protected Cell getCell() {
return _cell;
+ }
+
+ // from LocaleAware - set the locale for a cell
+ public void setLocale(String locale) {
+ this.locale=locale;
}
1.4 +17 -2
xml-cocoon2/src/java/org/apache/cocoon/serialization/HSSFSerializer.java
Index: HSSFSerializer.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/serialization/HSSFSerializer.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- HSSFSerializer.java 25 Mar 2002 16:44:31 -0000 1.3
+++ HSSFSerializer.java 26 Apr 2002 14:09:22 -0000 1.4
@@ -52,6 +52,9 @@
import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.component.ComponentSelector;
+import org.apache.avalon.framework.configuration.Configurable;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.cocoon.components.elementprocessor.ElementProcessor;
import org.apache.cocoon.components.elementprocessor.ElementProcessorFactory;
@@ -66,10 +69,11 @@
*/
public class HSSFSerializer
- extends POIFSSerializer implements Initializable
+ extends POIFSSerializer implements Initializable, Configurable
{
private ElementProcessorFactory _element_processor_factory;
private final static String _mime_type = "vnd.ms-excel";
+ String locale;
/**
* Constructor
@@ -88,8 +92,19 @@
*/
public void initialize() throws Exception{
- _element_processor_factory = new HSSFElementProcessorFactory();
+ _element_processor_factory = new HSSFElementProcessorFactory(locale);
setupLogger(_element_processor_factory);
+ }
+
+ public void configure(Configuration conf) throws ConfigurationException {
+ Configuration[] parameters = conf.getChildren("parameter");
+ for (int i = 0; i < parameters.length; i++) {
+ String name = parameters[i].getAttribute("name");
+ if (name.trim().equals("locale")) {
+ locale = parameters[i].getAttribute("value");
+ }
+ }
+
}
/**
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]