blob: ca07a7012d676e6eeaa63a75b28d93808df7d23d [file] [log] [blame]
/*
*****************************************************************************
* Copyright (C) 2000-2007, International Business Machines Corporation and *
* others. All Rights Reserved. *
*****************************************************************************
*/
package com.ibm.rbm;
import java.util.*;
import java.io.*;
import javax.swing.UIManager;
import javax.swing.JOptionPane;
import com.ibm.rbm.gui.RBManagerGUI;
/**
* A utility class to aid in the process of updating the Natural Language Support of Tempus Fugit.
* This class scans the directory containing NLS files and checks the various languages found there
* for completeness, duplication of entry, and status of translation. The class can be instantiated
* through a constructor, or it can be run from the command line. For additional information on the
* command line results, see the <CODE>main</CODE> method.
*
* @author Jared Jackson
* @see com.ibm.rbm.RBManager
*/
public class RBManager {
// *** DATA ***
private Vector allBundleKeys; // A Vector of Strings with all defined NLS properties
private Vector bundles; // A Vector of NLSbundles, one for each language
private String currentUser; // The name of the person currently using the editor
private String baseClass; // The name of the base class of the active resource bundle
private File currentDirectory;
// *** CONSTRUCTORS ***
// The default constructor is not publicly available
private RBManager() {
try {
// Look and Feel check
try {
String laf = Preferences.getPreference("lookandfeel");
if (!laf.equals("")) UIManager.setLookAndFeel(laf);
} catch (Exception e) {
// Ignored
}
Resources.initBundle();
RBManagerGUI guiFrame = new RBManagerGUI();
if (!Preferences.getPreference("username").equals(""))
guiFrame.setUser(Preferences.getPreference("username"));
if (!Preferences.getPreference("locale").equals("")) {
String localeStr = Preferences.getPreference("locale");
String language = Resources.getLanguage(localeStr);
String country = Resources.getCountry(localeStr);
String variant = Resources.getVariant(localeStr);
if (language == null || language.equals("") || language.length() > 3) language = "en";
if (country == null) country = new String();
if (variant == null) Resources.setLocale(new Locale(language, country));
else Resources.setLocale(new Locale(language, country, variant));
}
Resources.initBundle();
guiFrame.initComponents();
guiFrame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* This constructor creates an entirely blank RBManager and base Bundle. Only the base class name is defined.
* All other properties need to be defined.
*/
public RBManager(String baseClassName) {
allBundleKeys = new Vector();
bundles = new Vector();
currentUser = "Unknown";
baseClass = baseClassName;
currentDirectory = new File("");
Bundle mainBundle = new Bundle("");
// Create a default group
mainBundle.addBundleGroup("Ungrouped Items", "These are resource items that have not been assigned a group");
bundles.addElement(mainBundle);
}
/**
* This is the standard constructor for RBManager. It is constructed from the root of a resource bundle.
* In the current implementation, each file is parsed separately starting with the base class file (root).
* In this implementation, the lookup keys are represented to the user as they appear in the files. The
* translation values however are translated according to the basic rules defined in java.util.Properties.
* Thus in the key, the user may see '\"' when in the value it would have been converted to '"'. This
* translation is reversed when saving the resource bundle.
* @param mainFile The base class file of the resource bundle to be read
*/
public RBManager(File mainFile) throws FileNotFoundException, IOException {
init();
currentDirectory = new File(mainFile.getParent());
String[] encodings;
// Initiailize the readers to the main NLS file
FileReader fr = new FileReader(mainFile);
BufferedReader br = new BufferedReader(fr);
// Load the java readable values from the main NLS file;
Properties p = new Properties();
p.load(new FileInputStream(mainFile));
// Count the number of language files and set up the encoding and dictionary data
int numLanguages = 1;
String NLSbaseClass = null;
String NLSpostfix = null;
if (mainFile.getName().indexOf(".") >= 0) {
NLSbaseClass = mainFile.getName().substring(0,mainFile.getName().indexOf("."));
NLSpostfix = ".properties";
} else {
NLSbaseClass = mainFile.getName();
NLSpostfix = "";
}
baseClass = NLSbaseClass;
String filePrefix = mainFile.getName().substring(0,mainFile.getName().lastIndexOf("."));
String filePostfix = mainFile.getName().substring(mainFile.getName().lastIndexOf("."),mainFile.getName().length());
File resDir = currentDirectory;
if (resDir != null && resDir.isDirectory()) {
String[] temp = resDir.list();
numLanguages = 0;
// Count the number of language files
for (int i = 0; i < temp.length; i++) {
if (temp[i].startsWith(NLSbaseClass) && (temp[i].endsWith(NLSpostfix)
|| temp[i].endsWith(NLSpostfix.toUpperCase()) || NLSpostfix.equals(""))) {
// Starts with the base class name and ends in proper suffix (above)
// Base name is followed by . or _ (below)
RBManagerGUI.debugMsg("Character is: " + temp[i].charAt(NLSbaseClass.length()));
if (temp[i].charAt(NLSbaseClass.length()) == '.' || temp[i].charAt(NLSbaseClass.length()) == '_')
numLanguages++;
}
}
// Initialize the bundles and encodings
encodings = new String[numLanguages];
int count = 1;
for (int i = 0; i < temp.length; i++) {
if (temp[i].equals(mainFile.getName())) {
encodings[0] = "";
} else if (temp[i].startsWith(NLSbaseClass) && (temp[i].endsWith(NLSpostfix)
|| temp[i].endsWith(NLSpostfix.toUpperCase()) || NLSpostfix.equals(""))) {
if (temp[i].charAt(NLSbaseClass.length()) == '.' || temp[i].charAt(NLSbaseClass.length()) == '_') {
encodings[count] = new String(temp[i].substring(filePrefix.length()+1,temp[i].indexOf(filePostfix))); count++;
}
}
}
} else {
// Initialize the bundles and encodings in case the directory information is not available
// In this case, only the main NLS file will be handled
encodings = new String[numLanguages];
encodings[0] = new String("");
} // end the count and initialization
// Read in the entries from the main file
String line;
// Set the dictionary for the main file
Bundle dict = new Bundle(encodings[0]);
bundles.addElement(dict);
// Set up the first group in case there are NLS items which were not assigned to a group
BundleGroup group = new BundleGroup(dict, "Ungrouped Items");
group.setComment("NLS Items which were not initially assigned to a group");
dict.addBundleGroup(group);
BundleItem item = new BundleItem(group,null,null);
int count = 0;
while ((line = br.readLine()) != null) {
// Test to make sure this is a file that was generated by RBManager
if (!line.trim().equals("")) count++;
if (count == 1 && !line.startsWith("# @file")) {
// Not generated by RBManager
JOptionPane.showMessageDialog(null,
Resources.getTranslation("error_not_rbmanager_format") + "\n" + Resources.getTranslation("error_suggest_import_properties"),
Resources.getTranslation("dialog_title_error_not_rbmanager_format"), JOptionPane.ERROR_MESSAGE);
throw new FileNotFoundException("Improper format for file: " + mainFile.getName());
}
String commentLine = null;
// Grab text following the # sign
if (line.indexOf("#") >= 0) {
commentLine = line.substring(line.indexOf("#")+1,line.length());
line = line.substring(0,line.indexOf("#"));
}
if (commentLine != null && commentLine.trim().length() > 0) {
// Process any information made available in comment '@' information
Hashtable descriptors = getDescriptors(null,commentLine);
if (descriptors != null) {
Object o;
// File tags
o = descriptors.get("file"); if (o != null) dict.name = ((String) o);
o = descriptors.get("fileComment"); if (o != null) dict.comment = ((String) o);
o = descriptors.get("fileLanguage"); if (o != null) dict.language = ((String) o);
o = descriptors.get("fileCountry"); if (o != null) dict.country = ((String) o);
o = descriptors.get("fileVariant"); if (o != null) dict.variant = ((String) o);
o = descriptors.get("fileManager"); if (o != null) dict.manager = ((String) o);
// Group tags
o = descriptors.get("group");
if (o != null) {
group = new BundleGroup(dict, (String)o);
item.setParentGroup(group);
dict.addBundleGroup(group);
}
o = descriptors.get("groupComment"); if (o != null) group.setComment((String) o);
// Item tags
o = descriptors.get("comment"); if (o != null) item.setComment((String) o);
o = descriptors.get("translated"); if (o != null) item.setTranslated(((String) o).equalsIgnoreCase("true"));
o = descriptors.get("creator"); if (o != null) item.setCreator((String) o);
o = descriptors.get("modifier"); if (o != null) item.setModifier((String) o);
o = descriptors.get("created"); if (o != null) item.setCreatedDate((String) o);
o = descriptors.get("modified"); if (o != null) item.setModifiedDate((String) o);
// Lookup tags (e.g. {_#_} _description_)
Enumeration keys = descriptors.keys();
while (keys.hasMoreElements()) {
String tag = (String)keys.nextElement();
if (tag.startsWith("{")) {
if (tag.indexOf("}") < 0) continue;
String lookup = tag.substring(1,tag.indexOf("}"));
item.getLookups().put(lookup, descriptors.get(tag));
}
}
}
} // end check of comment line
if (line.trim().length() < 1) continue;
// Grab the name and value (translation) from the line
int breakpoint = 0;
boolean started = false;
char array[] = line.toCharArray();
for (int i=0; i < array.length; i++) {
if (!started && array[i] != ' ' && array[i] != '\t') started = true;
if (started && (array[i] == '=' || array[i] == ':' || array[i] == ' ' || array[i] == '\t')) {
breakpoint = i;
break;
}
}
String key = String.valueOf(array,0,breakpoint);
item.setKey(key);
String translation = p.getProperty(key);
if (translation == null || translation.equals(""))
item.setTranslation(line.substring(line.indexOf("=")+1,line.length()).trim());
else item.setTranslation(translation);
dict.addBundleItem(item);
item = new BundleItem(group,null,null);
} // end while - main NLS file
// Now that we have parsed the entire main language file, populate the allNLSKey set with the dictionary keys
allBundleKeys = new Vector();
Enumeration keys = ((Bundle)bundles.elementAt(0)).allItems.keys();
while (keys.hasMoreElements()) {
allBundleKeys.addElement(keys.nextElement());
}
// Now go through all of the other languages
for (int i = 1; i < encodings.length; i++) {
if (encodings[i].equals("kr")) continue; // I can't handle double byte character sets yet
// Try to obtain the new file
File tempFile = new File(resDir, NLSbaseClass + "_" + encodings[i] + NLSpostfix);
fr = new FileReader(tempFile);
br = new BufferedReader(fr);
// Try to obtain the java readable properties for the file
p = new Properties();
p.load(new FileInputStream(tempFile));
// Set the dictionary for the main file
dict = new Bundle(encodings[i]);
bundles.addElement(dict);
// Set up the first group in case there are NLS items which were not assigned to a group
group = new BundleGroup(dict, "Ungrouped Items");
dict.addBundleGroup(group);
group.setComment("NLS Items which were not initially assigned to a group");
item = new BundleItem(group,null,null);
// Create the rest of the groups
while ((line = br.readLine()) != null) {
String commentLine = null;
// Grab the text following the # sign
if (line.indexOf("#") >= 0) {
commentLine = line.substring(line.indexOf("#")+1,line.length());
line = line.substring(0,line.indexOf("#"));
}
if (commentLine != null && commentLine.trim().length() > 0) {
// Process any information made available in comment '@' information
Hashtable descriptors = getDescriptors(null,commentLine);
if (descriptors != null) {
Object o;
// File tags
o = descriptors.get("file"); if (o != null) dict.name = ((String) o);
o = descriptors.get("fileComment"); if (o != null) dict.comment = ((String) o);
o = descriptors.get("fileLanguage"); if (o != null) dict.language = ((String) o);
o = descriptors.get("fileCountry"); if (o != null) dict.country = ((String) o);
o = descriptors.get("fileVariant"); if (o != null) dict.variant = ((String) o);
o = descriptors.get("fileManager"); if (o != null) dict.manager = ((String) o);
// Group tags
o = descriptors.get("group");
if (o != null) {
group = new BundleGroup(dict, (String)o);
item.setParentGroup(group);
dict.addBundleGroup(group);
}
o = descriptors.get("groupComment"); if (o != null) group.setComment((String) o);
// Item tags
o = descriptors.get("comment"); if (o != null) item.setComment((String) o);
o = descriptors.get("translated"); if (o != null) item.setTranslated(((String) o).equalsIgnoreCase("true"));
o = descriptors.get("creator"); if (o != null) item.setCreator((String) o);
o = descriptors.get("modifier"); if (o != null) item.setModifier((String) o);
o = descriptors.get("created"); if (o != null) item.setCreatedDate((String) o);
o = descriptors.get("modified"); if (o != null) item.setModifiedDate((String) o);
// Lookup tags (e.g. {_#_} _description_)
Enumeration descKeys = descriptors.keys();
while (descKeys.hasMoreElements()) {
String tag = (String)descKeys.nextElement();
if (tag.startsWith("{")) {
if (tag.indexOf("}") < 0) continue;
String lookup = tag.substring(1,tag.indexOf("}"));
item.getLookups().put(lookup, descriptors.get(tag));
}
}
}
} // end check of comment line
if (line.trim().length() < 1) continue;
// Grab the name and value (translation) from the line
int breakpoint = 0;
boolean started = false;
char array[] = line.toCharArray();
for (int j=0; j < array.length; j++) {
if (!started && array[j] != ' ' && array[j] != '\t') started = true;
if (started && (array[j] == '=' || array[j] == ':' || array[j] == ' ' || array[j] == '\t')) {
breakpoint = j;
break;
}
}
String key = String.valueOf(array,0,breakpoint);
item.setKey(key);
String translation = p.getProperty(key);
if (translation == null || translation.equals(""))
item.setTranslation(line.substring(line.indexOf("=")+1,line.length()).trim());
else item.setTranslation(translation);
dict.addBundleItem(item);
item = new BundleItem(group,null,null);
} // end while - next line
} // end for looop through languages
// Add this opened file to our recent files
Preferences.addRecentFilePreference(mainFile.getName(), mainFile.getAbsolutePath());
} // end RBManager()
// *** METHODS ***
/**
* Main
*/
public static void main(String args[]) {
// Make sure the user specified a path
if (args.length < 1) {
new RBManager();
return;
}
} // main
public String toString() { return baseClass; }
/**
* Write the contents of the file to the output stream
*/
public void writeToFile() throws IOException {
for (int i = 0; i < bundles.size(); i++) {
Bundle bundle = (Bundle)bundles.elementAt(i);
File outputFile = new File(currentDirectory, baseClass +
((bundle.encoding == null || bundle.encoding.equals("")) ? "" : "_" + bundle.encoding) +
".properties");
FileWriter fw = new FileWriter(outputFile);
bundle.writeContents(fw);
fw.flush();
fw.close();
}
// In case this is a newly created bundle or the location has changed recently, update the recent files, preference
Preferences.addRecentFilePreference(baseClass + ".properties", currentDirectory.getAbsolutePath() + File.separator +
baseClass + ".properties");
}
/**
* Calling this method removes a resource from the resource bundle. This method does not permanently
* erase the file containing the resources at this encoding, however any changes or saves that take
* place once this file has been removed will not be reflected in this hidden file. To restore the resource,
* the bundle will have to be recreated. (This last point may change)
*/
public void hideResource(String encoding) {
for (int i=0; i < bundles.size(); i++) {
Bundle bundle = (Bundle)bundles.elementAt(i);
if (bundle.encoding.equals(encoding)) {
bundles.removeElement(bundle);
break;
}
}
}
/**
* Erases permanently one of the resource files. Be careful about calling this method there is nothing you can do
* once a file is erased.
*/
public void eraseFile(String encoding) throws IOException {
for (int i = 0; i < bundles.size(); i++) {
Bundle bundle = (Bundle)bundles.elementAt(i);
if (!(bundle.encoding.equals(encoding))) continue;
File outputFile = new File(currentDirectory, baseClass +
((bundle.encoding == null || bundle.encoding.equals("")) ? "" : "_" + bundle.encoding) +
".properties");
boolean success = outputFile.delete();
if (!success) throw new IOException(Resources.getTranslation("error_deletion_not_possible"));
hideResource(encoding);
break;
}
}
/**
* Writes only one of the resource files to the file system. This file is specified by the encoding parameter
*/
public void writeToFile(String encoding) throws IOException {
for (int i = 0; i < bundles.size(); i++) {
Bundle bundle = (Bundle)bundles.elementAt(i);
if (bundle.encoding.equals(encoding) || (i==0 && encoding.equals(""))) {
File outputFile = new File(currentDirectory, baseClass +
((bundle.encoding == null || bundle.encoding.equals("")) ? "" : "_" + bundle.encoding) +
".properties");
FileWriter fw = new FileWriter(outputFile);
bundle.writeContents(fw);
fw.flush();
fw.close();
break;
}
}
// In case this is a newly created bundle or the location has changed recently, update the recent files, preference
Preferences.addRecentFilePreference(baseClass + ".properties", currentDirectory.getAbsolutePath() + File.separator +
baseClass + ".properties");
}
/**
* Given a BundleItem and some properties to change for that item, this method first checks to make sure the passed
* item is valid and if it is, the properties of that item are changed to reflect those passed in as parameters to this
* method.
* @return true if the BundleItem was valid and updateable, false if otherwise (in this case no changes were made).
*/
public boolean editItem(BundleItem item, String name, String value, String groupName, String comment, Hashtable lookups) {
if (name == null || name.equals("") || groupName == null || groupName.equals("") || item == null) return false;
String oldName = item.getKey();
String oldComment = item.getComment();
String oldValue = item.getTranslation();
//String oldGroupName = item.getParentGroup().getName();
// Loop through the bundles
for (int i = 0; i < bundles.size(); i++) {
Bundle bundle = (Bundle)bundles.elementAt(i);
BundleItem oldItem = (BundleItem)bundle.allItems.get(oldName);
if (oldItem == null) break;
if (!oldName.equals(name)) {
// A new key
oldItem.setKey(name);
bundle.allItems.remove(oldItem);
bundle.allItems.put(oldItem.getKey(), oldItem);
}
if (oldItem.getComment() == null || oldItem.getComment().equals(oldComment)) oldItem.setComment(comment);
if (oldItem.getTranslation().equals(oldValue)) oldItem.setTranslation(value);
oldItem.setLookups(lookups);
if (!oldItem.getParentGroup().getName().equals(groupName)) {
// A new group
oldItem.getParentGroup().removeBundleItem(oldItem.getKey());
BundleGroup bg = bundle.getBundleGroup(groupName);
if (bg == null) bg = bundle.getUngroupedGroup();
oldItem.setParentGroup(bg);
bg.addBundleItem(oldItem);
}
}
return true;
}
/**
* Attempts to create a new item in each of the language files. The method first checks the base Resource Bundle
* to make sure that the item name does not all ready exist. If it does exist the item is not created.
* @param name The unique key of the item
* @param value The translation of the item for the base class
* @param groupName The group name, should all ready exist in the base class
* @param comment An optional comment to be added to the item, can be <CODE>null</CODE>
* @return An error response. If the creation was successful <CODE>true</CODE> is returned, if there was an error <CODE>false</CODE> is returned.
*/
public boolean createItem(String name, String value, String groupName, String comment, Hashtable lookups) {
if (name == null || name.equals("") || groupName == null || groupName.equals("")) return false;
Bundle mainBundle = (Bundle)bundles.firstElement();
BundleGroup mainGroup = null;
if (mainBundle.allItems.containsKey(name)) return false;
for (int i=0; i < mainBundle.getGroupCount(); i++) {
BundleGroup bg = mainBundle.getBundleGroup(i);
if (bg.getName().equals(groupName)) {mainGroup = bg; break;}
}
if (mainGroup == null) return false;
// Add to the base class
BundleItem mainItem = new BundleItem(mainGroup, name, value);
mainItem.setTranslated(true);
mainItem.setCreator(currentUser);
mainItem.setModifier(currentUser);
mainItem.setComment(comment);
mainBundle.allItems.put(name, mainItem);
mainGroup.addBundleItem(mainItem);
if (lookups != null) mainItem.setLookups(lookups);
// Add to the rest of the bundles
for (int i=1; i < bundles.size(); i++) {
Bundle bundle = (Bundle)bundles.elementAt(i);
// Find the group
BundleGroup group = null;
for (int j=0; j < bundle.getGroupCount(); j++) {
BundleGroup bg = bundle.getBundleGroup(j);
if (bg.getName().equals(groupName)) {group = bg; break;}
}
if (group == null) {
group = new BundleGroup(bundle, groupName);
bundle.addBundleGroup(group);
}
BundleItem item = new BundleItem(group, name, value);
item.setCreator(currentUser);
item.setModifier(currentUser);
item.setComment(comment);
if (lookups != null) item.setLookups(lookups);
bundle.allItems.put(name, item);
bundle.addUntranslatedItem(item);
group.addBundleItem(item);
}
return true;
}
/**
* Attempts to create a new group in each of the language files. The method first checks the base Resource Bundle
* to make sure that the group name does not all ready exist. If it does exist the group is not created.
* @param groupName The unique group name to be created
* @param groupComment An optional comment to be added to the group, can be <CODE>null</CODE>
* @return An error response. If the creation was successful <CODE>true</CODE> is returned, if there was an error <CODE>false</CODE> is returned.
*/
public boolean createGroup(String groupName, String groupComment) {
if (groupName == null || groupName.equals(""))
return false;
// Check to see if the group exists
Bundle mainBundle = (Bundle)bundles.firstElement();
if (mainBundle.hasGroup(groupName))
return false;
// Create the group
for (int i=0; i < bundles.size(); i++) {
Bundle bundle = (Bundle)bundles.elementAt(i);
BundleGroup bg = new BundleGroup(bundle, groupName);
if (groupComment != null)
bg.setComment(groupComment);
bundle.addBundleGroup(bg);
}
return true;
}
/**
* Removes a group and all of the items within that group from the various
* Resource Bundles known to the system. This method removes the group from
* the protected vector of groups, then removes all items in that group from
* the protected vector of untranslated items, and the protected hashtable of
* all items.
*/
public void deleteGroup(String groupName) {
if (groupName == null) return;
// Loop through all of the bundles;
for (int i=0; i < bundles.size(); i++) {
Bundle bundle = (Bundle)bundles.elementAt(i);
bundle.removeGroup(groupName);
}
}
/**
* Remove resource items of the given name from each of the resource bundles that the system
* knows about. This works by first removing the item from the protected vector of translated
* items, if it is there, and then removing it from the the hashtable of all items, and then
* removing it from its respective group.
*/
public void deleteItem(String itemName) {
if (itemName == null) return;
// Loop through all of the bundles;
for (int i=0; i < bundles.size(); i++) {
// Loop through untranslated items
Bundle bundle = (Bundle)bundles.elementAt(i);
bundle.removeUntranslatedItem(itemName);
// Loop through all Items
Enumeration items = bundle.allItems.elements();
while(items.hasMoreElements()) {
BundleItem item = (BundleItem)items.nextElement();
if (item.getKey().equals(itemName)) {
bundle.allItems.remove(item);
item.getParentGroup().removeBundleItem(item.getKey());
}
}
}
}
/**
* Looks through the resources contained in the bundle for a resource of the given encoding. Note that this
* search is case sensitive.
* @return True if the encoding exists as one of the resource files, false otherwise
*/
public boolean hasResource(String encoding) {
// Check to see if the encoding exists
for (int i=0; i < bundles.size(); i++) {
Bundle b = (Bundle)bundles.elementAt(i);
if (b.encoding.equals(encoding)) return true;
}
return false;
}
/**
* Attempts to create a new resource file with the given encoding. The method first checks the base Resource Bundle
* to make sure that encoding does not all ready exist. If it does exist the resource file is not created.
* @param title An optional, quick title for the file, can be <CODE>null</CODE>
* @param comment An optional comment to be added to the resource, can be <CODE>null</CODE>
* @param manager The name of the person responsible for this resource, can be <CODE>null</CODE>
* @param encoding The proper encoding for the resource. Must be of form 'language', 'language_country', or 'language_country_variant'
* @param language A more formal name for the language (e.g. 'English', 'Deutsch', etc.), can be <CODE>null</CODE>
* @param country A more formal name for the country described by the resource, can be <CODE>null</CODE>
* @param variant A more formal name for the variant described by the resource, can be <CODE>null</CODE>
* @param copyValues An indication of wether or not to populate the resource with the items in the base class
* @return An error response. If the creation was successful <CODE>true</CODE> is returned, if there was an error <CODE>false</CODE> is returned.
*/
public boolean createResource(String title, String comment, String manager, String encoding,
String language, String country, String variant, boolean copyValues) {
if (encoding == null || encoding.equals("") || encoding.startsWith("_")) return false;
// Check to see if the encoding exists
if (hasResource(encoding)) return false;
// Create the resource
Bundle bundle = new Bundle(encoding);
bundle.name = title;
bundle.comment = comment;
bundle.manager = manager;
bundle.language = language;
bundle.country = country;
bundle.variant = variant;
// Create a default group
bundle.addBundleGroup("Ungrouped Items", "These are resource items that have not been assigned a group");
if (copyValues) {
Bundle mainBundle = (Bundle)bundles.firstElement();
for (int i=0; i < mainBundle.getGroupCount(); i++) {
BundleGroup mainGroup = mainBundle.getBundleGroup(i);
BundleGroup bg = new BundleGroup(bundle,mainGroup.getName());
bg.setComment(mainGroup.getComment());
bundle.addBundleGroup(bg);
for (int j=0; j < mainGroup.getItemCount(); j++) {
BundleItem mainItem = mainGroup.getBundleItem(j);
BundleItem item = new BundleItem(bg, mainItem.getKey(), mainItem.getTranslation());
item.setComment(mainItem.getComment());
item.setCreator(mainItem.getCreator());
item.setModifier(mainItem.getModifier());
item.setLookups(new Hashtable());
// TODO: This should be done in the Bundle class
Enumeration keys = mainItem.getLookups().keys();
while (keys.hasMoreElements()) {
String name = (String)keys.nextElement();
String value = (String)mainItem.getLookups().get(name);
item.getLookups().put(new String(name), new String(value));
}
bg.addBundleItem(item);
bundle.addUntranslatedItem(item);
}
}
}
bundles.addElement(bundle);
return true;
}
/**
* Returns the number of duplicate NLS entries
*/
public int getNumberDuplicates() {
return ((Bundle)bundles.firstElement()).duplicates.size();
}
/**
* Returns a single string with a comma delimited listing of all duplicate entries found in the NLS resources
*/
public String getDuplicatesListing() {
return listStrings(getDuplicatesListingVector());
}
/**
* Returns a Vector collection of duplicate BundleItems found in the bundle
*/
public Vector getDuplicatesListingVector() {
return ((Bundle)bundles.firstElement()).duplicates;
}
/**
* A useful debugging method that lists the various BundleGroup names in a String.
*/
public String getGroupListing() {
return listStrings(getGroupListingVector());
}
/**
* Returns a vector collection of all of the BundleGroup items founds int the bundle.
*/
public Vector getGroupListingVector() {
Vector v = new Vector();
Bundle bundle = (Bundle)bundles.firstElement();
for (int i=0; i < bundle.getGroupCount(); i++) {
String name = bundle.getBundleGroup(i).getName();
v.addElement(name);
}
return v;
}
/**
* Returns the total number of languages that the system seems to support
*/
public int getNumberLanguages() {
return bundles.size();
}
/**
* Returns a single string comprised of a comma delimited listing of all languages the system seems to support
*/
public String getLanguageListing() {
return listStrings(getLanguageListingVector());
}
/**
* Returns a vector of strings comprising a list of all languages in the system
*/
public Vector getLanguageListingVector() {
Vector v = new Vector();
for (int i = 0; i < bundles.size(); i++) {
Bundle dict = (Bundle)bundles.elementAt(i);
String dictStr = new String();
if (dict.language != null) dictStr += dict.language;
if (dict.country != null) dictStr += " " + dict.country;
if (dict.variant != null) dictStr += " " + dict.variant;
if (dictStr.trim().equals("")) dictStr = (dict.encoding.trim().equals("") ? "Base Resource Bundle" : dict.encoding);
v.addElement(dictStr);
}
return v;
}
/**
* Returns the number of translations contained across all language files
*/
public int getNumberTotalTranslations() {
return allBundleKeys.size();
}
/**
* Returns the number of BundleGroups in the bundle.
*/
public int getNumberGroups() {
return ((Bundle)bundles.firstElement()).getGroupCount();
}
/**
* Returns the name of the user currently using the editor
*/
public String getUser() {
return currentUser;
}
/**
* Sets the name of the user currently using the editor
*/
public void setUser(String user) {
currentUser = user;
}
/**
* Sets the name of the base class associated with this resource bundle
*/
public void setBaseClass(String baseClassName) {
baseClass = baseClassName;
}
/**
* Sets the directory in the file system in which this resource bundle is to be
* saved and retrieved.
*/
public void setFileDirectory(File directory) {
if (directory.isDirectory()) currentDirectory = directory;
}
/**
* Returns the base class name if known, or "Unknown Base Class" otherwise.
*/
public String toSring() {
return (baseClass == null ? "Unknown Base Class" : baseClass);
}
/**
* Returns the base class name or null if it does not exist.
*/
public String getBaseClass() {
return baseClass;
}
/**
* A Vector of NLSbundles, one for each language
*/
public Vector getBundles() {
return bundles;
}
/**
* Return a bundle from a locale
* @return The requested resource bundle
*/
public Bundle getBundle(String locale) {
Bundle bundle = null;
if (hasResource(locale)) {
for (int i = 0; i < bundles.size(); i++) {
Bundle tempb = (Bundle)bundles.elementAt(i);
if (tempb.encoding.equals(locale)) {
bundle = tempb;
break;
}
}
}
return bundle;
}
/**
* Returns the name of the file that is the base class file for the resource bundle.
*/
public File getBaseFile() {
return new File(currentDirectory,baseClass + ".properties");
}
// Return a single comma delimited string made from a vector of strings
private String listStrings(Vector v) {
String retStr = new String();
for (int i = 0; i < v.size(); i++) {
Object o = v.elementAt(i);
if (!(o instanceof String)) continue;
String s = (String)o;
if (i > 0) retStr += ", ";
retStr += s;
}
return retStr;
}
// Init - called before ant construction
private void init() {
allBundleKeys = new Vector();
bundles = new Vector();
currentUser = "Unknown";
}
// Return a hashtable of the tags in a comment line (i.e. the text after each '@' character) and their values
private Hashtable getDescriptors(Hashtable result, String line) {
// Recursion terminating condition
if (line == null || line.length() <= 0 || line.indexOf("@") < 0) return result;
// Otherwise generate what information we can and recurse
if (result == null) result = new Hashtable();
// Strip off any information before and including a '@'
line = line.substring(line.indexOf("@")+1, line.length());
// There should be a space after the '@_tag_' and the value of this property
if (line.indexOf(" ") < 0) return result; // This shouldn't happen if things are formatted right
// Add the text after the '@' character up to the first whitespace (has to be a space, not tab or other whitespace)
String name = line.substring(0,line.indexOf(" ")).trim();
// Now strip off the tag name
line = line.substring(line.indexOf(" "), line.length());
// If there is another '@' character we take the value up until that character
if (line.indexOf("@") >= 0) {
result.put(name,line.substring(0,line.indexOf("@")).trim());
}
// Otherwise we take the rest of the characters in the line
else {
result.put(name,line.trim());
return result;
}
// Recurse
return getDescriptors(result, line.substring(line.indexOf("@"), line.length()));
}
// Checks an array of strings to see if it contains a particular string
/* private static boolean arrayContains(String[] array, String match) {
for (int i = 0; i < array.length; i++) {
if (array[i].equals(match)) return true;
}
return false;
}*/
// Prints the usage of the program when called from main
/* private static void printUsage() {
String usage = new String();
usage += "Usage:\n\njava com.ibm.almaden.TempusFugit.Tools.RBManager fileName ((-r | -d) encoding?)?";
usage += "\n\n fileName -> The file (and path?) representing the main NLS resource\n\t\t(i.e. TempusFugit.resources)\n";
usage += " encoding -> Returns results for only the language encoding specified\n";
usage += " flag -r -> Gives only a status report on the state of the translations\n";
System.out.println(usage);
}*/
}