|
What this is
Other links
The source code
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2003 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.updater;
import java.util.*;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
class Localization {
private static final String FILE_SEPARATOR = System.getProperty ("file.separator"); // NOI18N
private static final String LOCALE_DIR = "lib" + FILE_SEPARATOR + "locale"; // NOI18N
private static final String BUNDLE_NAME = "org/netbeans/updater/Bundle"; // NOI18N
private static final String BUNDLE_EXT = ".properties"; // NOI18N
private static final String UPDATER_JAR = "updater"; // NOI18N
private static final String UPDATER_JAR_EXT = ".jar"; // NOI18N
private static ClassLoader brandedLoader = null;
private static String brandingToken = null;
private static HashMap bundleCache = new HashMap();
public static String getBranding() {
init();
return brandingToken;
}
public static String getBrandedString( String key ) {
init(); // When not initialized do so
// Let's try to find a bundle
for( LocaleIterator li = new LocaleIterator( Locale.getDefault() ); li.hasNext(); ) {
try {
ResourceBundle bundle = findBrandedBundle( (String)li.next() );
if ( bundle != null ) {
// So we have the bundle, now we need the string
String brandedString = bundle.getString( key );
if ( brandedString != null ) {
return brandedString; // We even found the string
}
// Continue
}
}
catch ( java.util.MissingResourceException e ) {
// No string, no problem, let's try other one
}
}
return null;
}
private static ResourceBundle findBrandedBundle( String loc ) {
ResourceBundle bundle = (ResourceBundle)bundleCache.get( loc ); // Maybe is in cache
if ( bundle != null ) {
return bundle;
}
// Was not in cache
InputStream is = brandedLoader.getResourceAsStream( BUNDLE_NAME + loc + BUNDLE_EXT );
if (is != null) {
try {
try {
Properties p = new Properties();
p.load(is);
bundle= new PBundle( p, new Locale( "" ) );
bundleCache.put( loc, bundle );
return bundle;
} finally {
is.close();
}
} catch (IOException e) {
return null;
}
}
return null;
}
public static URL getBrandedResource( String base, String ext ) {
init(); // When not initialized do so
// Let's try all the possibilities
for( LocaleIterator li = new LocaleIterator( Locale.getDefault() ); li.hasNext(); ) {
URL url = brandedLoader.getResource( base + li.next() + ext );
if ( url != null ) {
return url;
}
}
return null;
}
public static InputStream getBrandedResourceAsStream( String base, String ext ) {
init(); // When not initialized do so
// Let's try all the possibilities
for( LocaleIterator li = new LocaleIterator( Locale.getDefault() ); li.hasNext(); ) {
InputStream is = brandedLoader.getResourceAsStream( base + li.next() + ext );
if ( is != null ) {
return is;
}
}
return null;
}
// Private methods ---------------------------------------------------------
private static synchronized void init() {
if ( brandedLoader == null ) {
// Initialize the branding token
brandingToken = initBranding();
// Fallback to default class loader
brandedLoader = Localization.class.getClassLoader();
// Try to find some localized jars and store the URLS
List locJarURLs = new ArrayList();
String locDir = org.netbeans.updater.UpdateTracking.getPlatformDir().toString () + FILE_SEPARATOR +
LOCALE_DIR + FILE_SEPARATOR;
for( LocaleIterator li = new LocaleIterator( Locale.getDefault() ); li.hasNext(); ) {
File locJar = new File( locDir + UPDATER_JAR + li.next() + UPDATER_JAR_EXT );
if ( locJar.exists() ) { // File exists
try {
locJarURLs.add( locJar.toURL() ); // Convert to URL
}
catch ( MalformedURLException e ) {
// dont use and ignore
}
}
}
if ( !locJarURLs.isEmpty() ) { // we've found some localization jars
// Make an array of URLs
URL urls[] = new URL[ locJarURLs.size() ];
locJarURLs.toArray( urls );
// Create the new classLoader
brandedLoader = new URLClassLoader( urls, brandedLoader );
}
}
}
/** Returns current branding
*/
private static String initBranding() {
BufferedReader in = null;
String s = null;
try {
File brandf = new File (org.netbeans.updater.UpdateTracking.getPlatformDir(),
"lib" + FILE_SEPARATOR + "branding"); // NOI18N
in = new BufferedReader(new FileReader(brandf));
if (in.ready()) {
s = in.readLine();
}
}
catch (IOException e) {
}
finally {
if (in != null) try { in.close(); } catch (IOException e) { /* ignore */ };
}
return s;
}
/**
* =============================================================================
* N O T I C E
* -----------------------------------------------------------------------------
* This class was copyied from NbBundle. The reason is that the updater must not
* use any NetBeans class in order to be able to update them.
* -----------------------------------------------------------------------------
*
* This class (enumeration) gives all localized sufixes using nextElement
* method. It goes through given Locale and continues through Locale.getDefault()
* Example 1:
* Locale.getDefault().toString() -> "_en_US"
* you call new LocaleIterator(new Locale("cs", "CZ"));
* ==> You will gets: "_cs_CZ", "_cs", "", "_en_US", "_en"
*
* Example 2:
* Locale.getDefault().toString() -> "_cs_CZ"
* you call new LocaleIterator(new Locale("cs", "CZ"));
* ==> You will gets: "_cs_CZ", "_cs", ""
*
* If there is a branding token in effect, you will get it too as an extra
* prefix, taking precedence, e.g. for the token "f4jce":
*
* "_f4jce_cs_CZ", "_f4jce_cs", "_f4jce", "_f4jce_en_US", "_f4jce_en", "_cs_CZ", "_cs", "", "_en_US", "_en"
*
* Branding tokens with underscores are broken apart naturally: so e.g.
* branding "f4j_ce" looks first for "f4j_ce" branding, then "f4j" branding, then none.
*/
private static class LocaleIterator extends Object implements Iterator {
/** this flag means, if default locale is in progress */
private boolean defaultInProgress = false;
/** this flag means, if empty sufix was exported yet */
private boolean empty = false;
/** current locale, and initial locale */
private Locale locale, initLocale;
/** current sufix which will be returned in next calling nextElement */
private String current;
/** the branding string in use */
private String branding;
/** Creates new LocaleIterator for given locale.
* @param locale given Locale
*/
public LocaleIterator (Locale locale) {
this.locale = this.initLocale = locale;
if (locale.equals(Locale.getDefault())) {
defaultInProgress = true;
}
current = '_' + locale.toString();
if (brandingToken == null)
branding = null;
else
branding = "_" + brandingToken; // NOI18N
//System.err.println("Constructed: " + this);
}
/** @return next sufix.
* @exception NoSuchElementException if there is no more locale sufix.
*/
public Object next () throws NoSuchElementException {
if (current == null)
throw new NoSuchElementException();
final String ret;
if (branding == null) {
ret = current;
} else {
ret = branding + current;
}
int lastUnderbar = current.lastIndexOf('_');
if (lastUnderbar == 0) {
if (empty)
reset ();
else {
current = ""; // NOI18N
empty = true;
}
}
else {
if (lastUnderbar == -1) {
if (defaultInProgress)
reset ();
else {
// [PENDING] stuff with trying the default locale
// after the real one does not actually seem to work...
locale = Locale.getDefault();
current = '_' + locale.toString();
defaultInProgress = true;
}
}
else {
current = current.substring(0, lastUnderbar);
}
}
//System.err.println("Returning: `" + ret + "' from: " + this);
return ret;
}
/** Finish a series.
* If there was a branding prefix, restart without that prefix
* (or with a shorter prefix); else finish.
*/
private void reset () {
if (branding != null) {
current = '_' + initLocale.toString ();
int idx = branding.lastIndexOf ('_');
if (idx == 0)
branding = null;
else
branding = branding.substring (0, idx);
empty = false;
} else {
current = null;
}
}
/** Tests if there is any sufix.*/
public boolean hasNext () {
return (current != null);
}
public void remove () throws UnsupportedOperationException {
throw new UnsupportedOperationException ();
}
} // end of LocaleIterator
/**
* =============================================================================
* N O T I C E
* -----------------------------------------------------------------------------
* YASC - Yet Another Stolen Class
* -----------------------------------------------------------------------------
* A resource bundle based on .properties files (or any map).
*/
private static final class PBundle extends ResourceBundle {
private final Map m; // Map
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.