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 */
21package org.apache.xalan.transformer;
22
23import java.text.Collator;
24import java.util.Locale;
25
26import org.apache.xalan.res.XSLTErrorResources;
27import org.apache.xpath.XPath;
28
29/**
30 * Data structure for use by the NodeSorter class.
31 * @xsl.usage internal
32 */
33class 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   */
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