Package org.gudy.azureus2.core3.internat

Source Code of org.gudy.azureus2.core3.internat.LocaleUtil

/**
* Copyright (C) 2004, 2005, 2006 Aelitis SAS, All rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details ( see the LICENSE file ).
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*
* AELITIS, SAS au capital de 46,603.30 euros,
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*/

package org.gudy.azureus2.core3.internat;

import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.*;

import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.util.*;

public class
LocaleUtil
{
 
  private static final String systemEncoding = System.getProperty("file.encoding");
 
  private static final String[] manual_charset = {
  systemEncoding,  // must be first entry due to code below that gets the system decoder
  "Big5","EUC-JP","EUC-KR","GB18030","GB2312","GBK","ISO-2022-JP","ISO-2022-KR",
  "Shift_JIS","KOI8-R",
  "TIS-620"// added for bug #1008848
  Constants.DEFAULT_ENCODING,"windows-1251",Constants.BYTE_ENCODING
  };
 
  // the general ones *must* also be members of the above manual ones
   
  protected static final String[] generalCharsets = {
  Constants.BYTE_ENCODING, Constants.DEFAULT_ENCODING, systemEncoding
  };
 
   private static LocaleUtil singleton = new LocaleUtil();
 
   public static LocaleUtil
   getSingleton()
   {
     return( singleton );
   }
  
   private LocaleUtilDecoder[]   all_decoders;
   private LocaleUtilDecoder[]  general_decoders;
   private LocaleUtilDecoder  system_decoder;
   private LocaleUtilDecoder  fallback_decoder;
    
 
 
  private
  LocaleUtil()
  {
  List  decoders     = new ArrayList();
    List  decoder_names  = new ArrayList();
   
  for (int i = 0; i < manual_charset.length; i++) {
     try {
     String  name = manual_charset[i];
    
     CharsetDecoder decoder = Charset.forName(name).newDecoder();
    
     if ( decoder != null ){
      
       LocaleUtilDecoder  lu_decoder =  new LocaleUtilDecoderReal(decoders.size(),decoder);
      
       decoder_names.add( lu_decoder.getName());
     
       if ( i == 0 ){
        
         system_decoder = lu_decoder;
       }
      
       decoders.add( lu_decoder );
      
     }else if ( i == 0 ){
      
       Debug.out( "System decoder failed to be found!!!!" );
     }
    
     }catch (Exception ignore) {
     }
   }

  general_decoders = new LocaleUtilDecoder[generalCharsets.length];
 
  for (int i=0;i<general_decoders.length;i++){
   
    int  gi = decoder_names.indexOf( generalCharsets[i]);
   
    if ( gi != -1 ){
   
      general_decoders[i] = (LocaleUtilDecoder)decoders.get(gi);
    }
  }

  boolean show_all = COConfigurationManager.getBooleanParameter("File.Decoder.ShowAll" );

  if ( show_all ){
   
    Map m = Charset.availableCharsets();
     
    Iterator it = m.keySet().iterator();
 
    while(it.hasNext()){
       
      String  charset_name = (String)it.next();
       
      if ( !decoder_names.contains( charset_name)){
       
        try {
          CharsetDecoder decoder = Charset.forName(charset_name).newDecoder();
        
          if ( decoder != null ){
           
            LocaleUtilDecoder  lu_decoder = new LocaleUtilDecoderReal(decoders.size(),decoder);
         
            decoders.add( lu_decoder);
         
            decoder_names.add( lu_decoder.getName());
          }
        
        } catch (Exception ignore) {
        }
      }
    }
  }
   
  fallback_decoder = new LocaleUtilDecoderFallback(decoders.size());
 
  decoders.add( fallback_decoder );

  all_decoders  = new LocaleUtilDecoder[ decoders.size()];
 
  decoders.toArray( all_decoders);
  }
 
  public String
  getSystemEncoding()
  {
    return( systemEncoding );
  }
 
  public LocaleUtilDecoder[]
  getDecoders()
  {
    return( all_decoders );
  }
    public LocaleUtilDecoder[]
  getGeneralDecoders()
  {
       return( general_decoders );
  }
   
  public LocaleUtilDecoder getFallBackDecoder() {
    return fallback_decoder;
  }
 
  public LocaleUtilDecoder
  getSystemDecoder()
  {
    return( system_decoder );
  }
 
  /**
   * Determine which locales are candidates for handling the supplied type of
   * string
   *
   * @param array String in an byte array
   * @return list of candidates.  Valid candidates have getDecoder() non-null
   */
  protected LocaleUtilDecoderCandidate[]
  getCandidates(
  byte[] array )
  {
  LocaleUtilDecoderCandidate[] candidates = new LocaleUtilDecoderCandidate[all_decoders.length];
   
  boolean show_less_likely_conversions = COConfigurationManager.getBooleanParameter("File.Decoder.ShowLax" );

  for (int i = 0; i < all_decoders.length; i++){
     
    candidates[i] = new LocaleUtilDecoderCandidate(i);
     
    try{
      LocaleUtilDecoder decoder = all_decoders[i];
               
      String str = decoder.tryDecode( array, show_less_likely_conversions );

      if ( str != null ){
       
        candidates[i].setDetails( decoder, str );
      }
    } catch (Exception ignore) {
       
    }
  }
   
  /*
  System.out.println( "getCandidates: = " + candidates.length );
 
  for (int i=0;i<candidates.length;i++){
   
    LocaleUtilDecoderCandidate  cand = candidates[i];
   
    if ( cand != null ){
   
      String  value = cand.getValue();
     
      if ( value != null ){
     
        System.out.println( cand.getDecoder().getName() + "/" + (value==null?-1:value.length()) + "/" + value );
      }
    } 
  }
  */
 
  return candidates;
  }
   
  /**
   * Determine which decoders are candidates for handling the supplied type of
   * string
   *
   * @param array String in a byte array
   * @return list of possibly valid decoders.  LocaleUtilDecoder
   */
  protected List
  getCandidateDecoders(
    byte[]    array )
  {
    LocaleUtilDecoderCandidate[]   candidates = getCandidates( array );
   
    List  decoders = new ArrayList();
   
    for (int i=0;i<candidates.length;i++){
   
      LocaleUtilDecoder  d = candidates[i].getDecoder();
     
      if (d != null)
        decoders.add(d);
    }
   
    return decoders;
  }
 
  /**
   *
   * @param array
   * @return List of LocaleUtilDecoderCandidate
   */
  protected List getCandidatesAsList(byte[] array) {
    LocaleUtilDecoderCandidate[] candidates = getCandidates(array);

    List candidatesList = new ArrayList();

    for (int i = 0; i < candidates.length; i++) {
      if (candidates[i].getDecoder() != null)
        candidatesList.add(candidates[i]);
    }

    return candidatesList;
  }
 
}
TOP

Related Classes of org.gudy.azureus2.core3.internat.LocaleUtil

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.