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]