001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements. See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership. The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the  "License");
007     * you may not use this file except in compliance with the License.
008     * You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    /*
019     * $Id: NodeSortRecordFactory.java 468651 2006-10-28 07:04:25Z minchau $
020     */
021    
022    package org.apache.xalan.xsltc.dom;
023    
024    import org.apache.xalan.xsltc.DOM;
025    import org.apache.xalan.xsltc.Translet;
026    import org.apache.xalan.xsltc.TransletException;
027    import org.apache.xalan.xsltc.runtime.AbstractTranslet;
028    import org.apache.xml.utils.LocaleUtility;
029    import java.util.Locale;
030    import java.text.Collator;
031    
032    public class NodeSortRecordFactory {
033    
034        private static int DESCENDING = "descending".length();
035        private static int NUMBER     = "number".length();
036    
037        private final DOM      _dom;
038        private final String   _className;
039        private Class _class;
040        private SortSettings _sortSettings;
041    
042        /**
043         *
044         */
045        protected Collator _collator;
046    
047        /**
048         * Creates a NodeSortRecord producing object. The DOM specifies which tree
049         * to get the nodes to sort from, the class name specifies what auxillary
050         * class to use to sort the nodes (this class is generated by the Sort
051         * class), and the translet parameter is needed for methods called by
052         * this object.
053         *
054         * @deprecated This constructor is no longer used in generated code.  It
055         *             exists only for backwards compatibility.
056         */
057         public NodeSortRecordFactory(DOM dom, String className, Translet translet,
058                     String order[], String type[])
059             throws TransletException
060         {
061             this(dom, className, translet, order, type, null, null);
062         }
063    
064        /**
065         * Creates a NodeSortRecord producing object. The DOM specifies which tree
066         * to get the nodes to sort from, the class name specifies what auxillary
067         * class to use to sort the nodes (this class is generated by the Sort
068         * class), and the translet parameter is needed for methods called by
069         * this object.
070         */
071         public NodeSortRecordFactory(DOM dom, String className, Translet translet,
072                     String order[], String type[], String lang[],
073                     String caseOrder[])
074             throws TransletException
075         {
076             try {
077                 _dom = dom;
078                 _className = className;
079                 // This should return a Class definition if using TrAX
080                 _class = translet.getAuxiliaryClass(className);
081                 // This code is only run when the native API is used
082                 if (_class == null) {
083                     _class = ObjectFactory.findProviderClass(
084                          className, ObjectFactory.findClassLoader(), true);
085                 } 
086    
087                 int levels = order.length;
088                 int[] iOrder = new int[levels];
089                 int[] iType = new int[levels];
090                 for (int i = 0; i < levels; i++) {
091                      if (order[i].length() == DESCENDING) {
092                          iOrder[i] = NodeSortRecord.COMPARE_DESCENDING;
093                      }
094                      if (type[i].length() == NUMBER) {
095                          iType[i] = NodeSortRecord.COMPARE_NUMERIC;
096                      }
097                 }
098    
099                 // Old NodeSortRecordFactory constructor had no lang or case_order
100                 // arguments.  Provide default values in that case for binary
101                 // compatibility.
102                 String[] emptyStringArray = null;
103                 if (lang == null || caseOrder == null) {
104                     int numSortKeys = order.length;
105                     emptyStringArray = new String[numSortKeys];
106    
107                     // Set up array of zero-length strings as default values
108                     // of lang and case_order
109                     for (int i = 0; i < numSortKeys; i++) {
110                         emptyStringArray[i] = "";
111                     }
112                 }
113    
114                 if (lang == null) {
115                     lang = emptyStringArray;
116                 }
117                 if (caseOrder == null) {
118                     caseOrder = emptyStringArray;
119                 }
120    
121                 final int length = lang.length;
122                 Locale[] locales = new Locale[length];
123                 Collator[] collators = new Collator[length];
124                 for (int i = 0; i< length; i++){
125                     locales[i] = LocaleUtility.langToLocale(lang[i]);
126                     collators[i] = Collator.getInstance(locales[i]);
127                 }
128    
129                 _sortSettings = new SortSettings((AbstractTranslet) translet,
130                                                  iOrder, iType, locales, collators,
131                                                  caseOrder);
132            } catch (ClassNotFoundException e) {
133                throw new TransletException(e);
134            }
135        }
136        
137        
138    
139        /**
140         * Create an instance of a sub-class of NodeSortRecord. The name of this
141         * sub-class is passed to us in the constructor.
142         */
143        public NodeSortRecord makeNodeSortRecord(int node, int last)
144            throws ExceptionInInitializerError,
145                   LinkageError,
146                   IllegalAccessException,
147                   InstantiationException,
148                   SecurityException,
149                   TransletException {
150    
151            final NodeSortRecord sortRecord =
152                (NodeSortRecord)_class.newInstance();
153            sortRecord.initialize(node, last, _dom, _sortSettings);
154            return sortRecord;
155        }
156    
157        public String getClassName() {
158            return _className;
159        }
160        
161       private final void setLang(final String lang[]){
162            
163        }
164    }