1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 /* 19 * $Id: NodeSortKey.java 468645 2006-10-28 06:57:24Z minchau $ 20 */ 21 package org.apache.xalan.transformer; 22 23 import java.text.Collator; 24 import java.util.Locale; 25 26 import org.apache.xalan.res.XSLTErrorResources; 27 import org.apache.xpath.XPath; 28 29 /** 30 * Data structure for use by the NodeSorter class. 31 * @xsl.usage internal 32 */ 33 class NodeSortKey 34 { 35 36 /** Select pattern for this sort key */ 37 XPath m_selectPat; 38 39 /** Flag indicating whether to treat thee result as a number */ 40 boolean m_treatAsNumbers; 41 42 /** Flag indicating whether to sort in descending order */ 43 boolean m_descending; 44 45 /** Flag indicating by case */ 46 boolean m_caseOrderUpper; 47 48 /** Collator instance */ 49 Collator m_col; 50 51 /** Locale we're in */ 52 Locale m_locale; 53 54 /** Prefix resolver to use */ 55 org.apache.xml.utils.PrefixResolver m_namespaceContext; 56 57 /** Transformer instance */ 58 TransformerImpl m_processor; // needed for error reporting. 59 60 /** 61 * Constructor NodeSortKey 62 * 63 * 64 * @param transformer non null transformer instance 65 * @param selectPat Select pattern for this key 66 * @param treatAsNumbers Flag indicating whether the result will be a number 67 * @param descending Flag indicating whether to sort in descending order 68 * @param langValue Lang value to use to get locale 69 * @param caseOrderUpper Flag indicating whether case is relevant 70 * @param namespaceContext Prefix resolver 71 * 72 * @throws javax.xml.transform.TransformerException 73 */ NodeSortKey( TransformerImpl transformer, XPath selectPat, boolean treatAsNumbers, boolean descending, String langValue, boolean caseOrderUpper, org.apache.xml.utils.PrefixResolver namespaceContext)74 NodeSortKey( 75 TransformerImpl transformer, XPath selectPat, boolean treatAsNumbers, 76 boolean descending, String langValue, boolean caseOrderUpper, 77 org.apache.xml.utils.PrefixResolver namespaceContext) 78 throws javax.xml.transform.TransformerException 79 { 80 81 m_processor = transformer; 82 m_namespaceContext = namespaceContext; 83 m_selectPat = selectPat; 84 m_treatAsNumbers = treatAsNumbers; 85 m_descending = descending; 86 m_caseOrderUpper = caseOrderUpper; 87 88 if (null != langValue && m_treatAsNumbers == false) 89 { 90 // See http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2851 91 // The constructor of Locale is defined as 92 // public Locale(String language, String country) 93 // with 94 // language - lowercase two-letter ISO-639 code 95 // country - uppercase two-letter ISO-3166 code 96 // a) language must be provided as a lower-case ISO-code 97 // instead of an upper-case code 98 // b) country must be provided as an ISO-code 99 // instead of a full localized country name (e.g. "France") 100 m_locale = new Locale(langValue.toLowerCase(), 101 Locale.getDefault().getCountry()); 102 103 // (old, before bug report 2851). 104 // m_locale = new Locale(langValue.toUpperCase(), 105 // Locale.getDefault().getDisplayCountry()); 106 107 if (null == m_locale) 108 { 109 110 // m_processor.warn("Could not find locale for <sort xml:lang="+langValue); 111 m_locale = Locale.getDefault(); 112 } 113 } 114 else 115 { 116 m_locale = Locale.getDefault(); 117 } 118 119 m_col = Collator.getInstance(m_locale); 120 121 if (null == m_col) 122 { 123 m_processor.getMsgMgr().warn(null, XSLTErrorResources.WG_CANNOT_FIND_COLLATOR, 124 new Object[]{ langValue }); //"Could not find Collator for <sort xml:lang="+langValue); 125 126 m_col = Collator.getInstance(); 127 } 128 } 129 } 130