/* ***************************************************************************** * Copyright (C) 2000-2007, International Business Machines Corporation and * * others. All Rights Reserved. * ***************************************************************************** */ package com.ibm.rbm; import java.io.*; import javax.swing.*; import com.ibm.rbm.gui.RBManagerGUI; import java.util.*; import java.awt.*; import java.awt.event.*; /** *

This is the super class for all importer plug-in classes.

*

* In terms of general functionality of this class or its children classes, the following steps should happen in order: *

    *
  1. A Dialog is shown from which the user may select options about the import, including the file from which to import.
  2. *
  3. The 'Import' button is pressed, closing the options dialog and opening a progress bar dialog box.
  4. *
  5. The class should resolve all conflicts with locale encodings existing in the import files, but not in the active resource bundle.
  6. *
  7. The class should parse resources one at a time and use the importResource() method to insert them into the resource bundle.
  8. *
  9. The class should report when all resources have been read and the import is complete.
  10. *
*

* * @author Jared Jackson * @see com.ibm.rbm.RBManager */ public class RBImporter extends JDialog { private final static int FILE_OPTION_POPULATE = 0; // Create a new locale file populated from base file private final static int FILE_OPTION_EMPTY = 1; // Create a new empty locale file private final static int FILE_OPTION_IGNORE = 2; // Ignore all resources from this encoding private final static int FILE_OPTION_PROMPT = 3; // Prompt for each conflict private final static int RESOURCE_OPTION_OVERWRITE = 0; // Use the value from the source import file private final static int RESOURCE_OPTION_IGNORE = 1; // Ignore the import and use existing value private final static int RESOURCE_OPTION_PROMPT = 2; // Propmpt for each conflict protected static JFileChooser chooser; protected int num_conflicts; protected int num_extra_files; protected String title; protected RBManager rbm; protected RBManagerGUI gui; protected boolean pathSet = false; // Visual Components JRadioButton resourceOverwriteRadio = new JRadioButton(Resources.getTranslation("import_resource_conflict_overwrite"), false); JRadioButton resourceIgnoreRadio = new JRadioButton(Resources.getTranslation("import_resource_conflict_ignore"), false); JRadioButton resourcePromptRadio = new JRadioButton(Resources.getTranslation("import_conflict_prompt"), true); JRadioButton fileGeneratePopulateRadio = new JRadioButton(Resources.getTranslation("import_file_conflict_generate_populate"), false); JRadioButton fileGenerateEmptyRadio = new JRadioButton(Resources.getTranslation("import_file_conflict_generate_empty"), false); JRadioButton fileIgnoreRadio = new JRadioButton(Resources.getTranslation("import_file_conflict_ignore"), false); JRadioButton filePromptRadio = new JRadioButton(Resources.getTranslation("import_conflict_prompt"), true); JCheckBox markTranslatedCheck = new JCheckBox(Resources.getTranslation("import_default_translated"), true); JCheckBox createGroupsCheck = new JCheckBox(Resources.getTranslation("import_default_group_creation"), true); JComboBox groupComboBox = new JComboBox(); JLabel sourceLabel; JDialog progressBarDialog; JProgressBar progressBar; /** * Constructor * @param title The title that appears in the Dialog box * @param rbm An RBManager instance * @param gui The RBManager GUI instance associated with the RBManager instance */ public RBImporter(String title, RBManager rbm, RBManagerGUI gui) { super(new Frame(), title, true); this.title = title; this.rbm = rbm; this.gui = gui; init(); } protected void init() { chooser = new JFileChooser(); setupFileChooser(); num_conflicts = 0; num_extra_files = 0; initComponents(); setVisible(true); } protected void setupFileChooser() { // To be overwritten } protected void beginImport() throws IOException { // To be overwritten if (!pathSet) throw new IOException("Path not set yet"); } protected void chooseFile() { int result = chooser.showOpenDialog(this); if (result == JFileChooser.APPROVE_OPTION) { File f = chooser.getSelectedFile(); sourceLabel.setText(Resources.getTranslation("import_source_file",f.getAbsolutePath())); pathSet = true; } } protected File getChosenFile() { return chooser.getSelectedFile(); } /** * A super class method intended for use of nearly all subclass importers, once a resource * is found by those subclasses. This method is called in order to create the new resource * and handle the various conflict errors that may result as a part of that import. */ protected void importResource(BundleItem item, String encoding, String group_name) { Bundle bundle = null; BundleGroup group = null; BundleGroup backup_group = null; if (group_name == null) group_name = getDefaultGroup(); if (encoding == null) return; // Get the bundle to which we will be adding this resource bundle = rbm.getBundle(encoding); // Skip this import if the bundle is non-existent (Should have been resolved if wanted) if (bundle == null) return; // Find the group in the bundle, Ungrouped if non-existent Vector gv = bundle.getGroupsAsVector(); for (int i=0; i < gv.size(); i++) { BundleGroup tempg = (BundleGroup)gv.elementAt(i); if (i==0) backup_group = tempg; if (tempg.getName().equals("Ungrouped Items")) backup_group = tempg; else if (tempg.getName().equals(group_name)) { group = tempg; break; } } if (group == null) { if (getDefaultGroupCreation()) { // Create a new group by this name bundle.addBundleGroup(group_name, ""); gv = bundle.getGroupsAsVector(); for (int i=0; i < gv.size(); i++) { BundleGroup tempg = (BundleGroup)gv.elementAt(i); if (tempg.getName().equals(group_name)) { group = tempg; break; } } } else { // Use the backup_group group = backup_group; } } // If all group identification efforts fail, we fail if (group == null) return; item.setParentGroup(group); // Check for and resolve conflicts if (bundle.allItems.containsKey(item.getKey())) { resolveResource(bundle,item); RBManagerGUI.debugMsg("Resolve conflict"); } else { // Insert the resource bundle.addBundleItem(item); } } /** * This method should be called when trying to import and item whose key all ready exists within the bundle. */ protected void resolveResource(Bundle bundle, BundleItem item) { if (this.getResourceConflictOption() == RESOURCE_OPTION_IGNORE) return; else if (this.getResourceConflictOption() == RESOURCE_OPTION_OVERWRITE) { bundle.removeItem(item.getKey()); bundle.addBundleItem(item); } else if (this.getResourceConflictOption() == RESOURCE_OPTION_PROMPT) { BundleItem original = (BundleItem)bundle.allItems.get(item.getKey()); if (original == null) return; String trans = original.getTranslation(); String options[] = { Resources.getTranslation("import_resource_conflict_overwrite"), Resources.getTranslation("import_resource_conflict_ignore")}; String insert[] = {item.getKey(), (bundle.encoding.equals("") ? "(Base Class)" : bundle.encoding)}; String result = (String)JOptionPane.showInputDialog(this, Resources.getTranslation("import_resource_conflict_choose", insert) + "\n" + Resources.getTranslation("import_resource_conflict_choose_source", item.getTranslation()) + "\n" + Resources.getTranslation("import_resource_conflict_choose_target", trans), Resources.getTranslation("import_file_conflicts"), JOptionPane.QUESTION_MESSAGE, null, options, options[0]); if (result == null) return; if (result.equals(Resources.getTranslation("import_resource_conflict_overwrite"))) { bundle.removeItem(item.getKey()); bundle.addBundleItem(item); } else if (result.equals(Resources.getTranslation("import_resource_conflict_ignore"))) return; } } /** * Given a vector of strings containing locale encodings (e.g. {"en", "en_us", "de"}), attempts * to resolve those conflicts according to the preferences selected by the user. */ protected void resolveEncodings(Vector v) { for (int i=0; i < v.size(); i++) { String encoding = (String)v.elementAt(i); if (encoding == null || encoding.equals("") || rbm.hasResource(encoding)) { continue; } // We need to resolve this conflict if (this.getFileConflictOption() == FILE_OPTION_IGNORE) continue; else if (this.getFileConflictOption() == FILE_OPTION_POPULATE) { rbm.createResource(null, null, null, encoding, null, null, null, true); } else if (this.getFileConflictOption() == FILE_OPTION_EMPTY) { rbm.createResource(null, null, null, encoding, null, null, null, true); } else if (this.getFileConflictOption() == FILE_OPTION_PROMPT) { String options[] = { Resources.getTranslation("import_file_conflict_generate_populate"), Resources.getTranslation("import_file_conflict_generate_empty"), Resources.getTranslation("import_file_conflict_ignore")}; String result = (String)JOptionPane.showInputDialog(this, Resources.getTranslation("import_file_conflict_choose", encoding), Resources.getTranslation("import_file_conflicts"), JOptionPane.QUESTION_MESSAGE, null, options, options[0]); if (result == null) continue; if (result.equals(Resources.getTranslation("import_file_conflict_ignore"))) continue; else if (result.equals(Resources.getTranslation("import_file_conflict_generate_populate"))) { rbm.createResource(null, null, null, encoding, null, null, null, true); } else if (result.equals(Resources.getTranslation("import_file_conflict_generate_empty"))) { rbm.createResource(null, null, null, encoding, null, null, null, false); } } } gui.updateDisplayTree(); } // Returns an integer mask describing the user's selection for file resolving missing file locale conflicts private int getFileConflictOption() { if (fileGeneratePopulateRadio.isSelected()) return FILE_OPTION_POPULATE; if (fileGenerateEmptyRadio.isSelected()) return FILE_OPTION_EMPTY; if (fileIgnoreRadio.isSelected()) return FILE_OPTION_IGNORE; if (filePromptRadio.isSelected()) return FILE_OPTION_PROMPT; return FILE_OPTION_PROMPT; } // Returns an integer mask describing the user's selection for duplicate resource key conflicts private int getResourceConflictOption() { if (resourceOverwriteRadio.isSelected()) return RESOURCE_OPTION_OVERWRITE; if (resourceIgnoreRadio.isSelected()) return RESOURCE_OPTION_IGNORE; if (resourcePromptRadio.isSelected()) return RESOURCE_OPTION_PROMPT; return RESOURCE_OPTION_PROMPT; } // Returns the group name for use when no group name is specified protected String getDefaultGroup() { return groupComboBox.getSelectedItem().toString(); } // Returns the default translation value protected boolean getDefaultTranslated() { return markTranslatedCheck.isSelected(); } // Returns whether or not a group of name non-existent in the active bundle is created protected boolean getDefaultGroupCreation() { return createGroupsCheck.isSelected(); } protected void showProgressBar(int steps) { thisWindowClosing(); JDialog progressBarDialog = new JDialog(this, Resources.getTranslation("dialog_title_import_progress"), false); JProgressBar progressBar = new JProgressBar(0, steps); progressBar.setValue(0); progressBarDialog.getContentPane().add(progressBar); progressBarDialog.pack(); progressBarDialog.setVisible(true); } protected void incrementProgressBar() { if (progressBar == null) return; progressBar.setValue(progressBar.getValue()+1); if (progressBar.getValue() == progressBar.getMaximum()) hideProgressBar(); } protected void hideProgressBar() { if (progressBarDialog != null) progressBarDialog.setVisible(false); } /** * Initialize the visual components for selecting an import file and setting the appropriate * options */ protected void initComponents() { // Create Components JLabel titleLabel = new JLabel(title); sourceLabel = new JLabel(Resources.getTranslation("import_source_file","--")); JLabel insertGroupLabel = new JLabel(Resources.getTranslation("import_insert_group")); JButton fileChooseButton = new JButton(Resources.getTranslation("button_choose")); JButton cancelButton = new JButton(Resources.getTranslation("button_cancel")); JButton importButton = new JButton(Resources.getTranslation("button_import")); ButtonGroup resourceGroup = new ButtonGroup(); ButtonGroup fileGroup = new ButtonGroup(); JPanel topPanel = new JPanel(new BorderLayout()); JPanel midPanel = new JPanel(new BorderLayout()); JPanel botPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); JPanel topInnerPanel = new JPanel(new BorderLayout()); Box midBox = new Box(BoxLayout.Y_AXIS); JPanel resourcePanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); JPanel filePanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); JPanel defaultPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); JPanel defaultPanel2 = new JPanel(new BorderLayout()); Box resourceBox = new Box(BoxLayout.Y_AXIS); Box fileBox = new Box(BoxLayout.Y_AXIS); Box groupBox = new Box(BoxLayout.X_AXIS); // Setup title titleLabel.setFont(new Font("Serif",Font.BOLD,16)); // Setup panels midPanel.setBorder(BorderFactory.createTitledBorder(Resources.getTranslation("import_options"))); resourcePanel.setBorder(BorderFactory.createTitledBorder(Resources.getTranslation("import_resource_conflicts"))); filePanel.setBorder(BorderFactory.createTitledBorder(Resources.getTranslation("import_file_conflicts"))); defaultPanel.setBorder(BorderFactory.createTitledBorder(Resources.getTranslation("import_default_values"))); // Arrange button groups fileGroup.add(fileGeneratePopulateRadio); fileGroup.add(fileGenerateEmptyRadio); fileGroup.add(fileIgnoreRadio); fileGroup.add(filePromptRadio); resourceGroup.add(resourceOverwriteRadio); resourceGroup.add(resourceIgnoreRadio); resourceGroup.add(resourcePromptRadio); // Add action listeners cancelButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ev) { thisWindowClosing(); } }); importButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ev) { try { beginImport(); gui.updateProjectTree(); gui.updateDisplayTree(); thisWindowClosing(); } catch (IOException ioe) { ioe.printStackTrace(System.err); JOptionPane.showMessageDialog(null, Resources.getTranslation("error") + "\n" + ioe.getLocalizedMessage(), Resources.getTranslation("error"), JOptionPane.ERROR_MESSAGE); } } }); fileChooseButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ev) { chooseFile(); } }); // Setup combo box Bundle baseBundle = ((Bundle)rbm.getBundles().elementAt(0)); BundleGroup ungroupedGroup = baseBundle.getUngroupedGroup(); groupComboBox = new JComboBox(baseBundle.getGroupsAsVector()); int groupComboBoxCount = groupComboBox.getItemCount(); for (int selectedIndex = 0; selectedIndex < groupComboBoxCount; selectedIndex++) { BundleGroup bundGroup = ((BundleGroup)groupComboBox.getItemAt(selectedIndex)); if (bundGroup.getName().equals(ungroupedGroup.getName())) { // By default, use the ungrouped group. Probably named 'Ungrouped Items'. groupComboBox.setSelectedIndex(selectedIndex); break; } } // Arange components groupBox.add(Box.createHorizontalGlue()); groupBox.add(insertGroupLabel); groupBox.add(Box.createHorizontalStrut(5)); groupBox.add(groupComboBox); defaultPanel2.add(groupBox, BorderLayout.NORTH); defaultPanel2.add(markTranslatedCheck, BorderLayout.CENTER); defaultPanel2.add(createGroupsCheck, BorderLayout.SOUTH); fileBox.add(fileGeneratePopulateRadio); fileBox.add(fileGenerateEmptyRadio); fileBox.add(fileIgnoreRadio); fileBox.add(filePromptRadio); resourceBox.add(resourceOverwriteRadio); resourceBox.add(resourceIgnoreRadio); resourceBox.add(resourcePromptRadio); defaultPanel.add(defaultPanel2); filePanel.add(fileBox); resourcePanel.add(resourceBox); midBox.add(resourcePanel); midBox.add(filePanel); midBox.add(defaultPanel); midPanel.add(midBox, BorderLayout.CENTER); topInnerPanel.add(sourceLabel, BorderLayout.CENTER); topInnerPanel.add(fileChooseButton, BorderLayout.EAST); topPanel.add(titleLabel, BorderLayout.NORTH); topPanel.add(topInnerPanel, BorderLayout.CENTER); botPanel.add(cancelButton); botPanel.add(importButton); getContentPane().setLayout(new BorderLayout()); getContentPane().add(topPanel, BorderLayout.NORTH); getContentPane().add(midPanel, BorderLayout.CENTER); getContentPane().add(botPanel, BorderLayout.SOUTH); pack(); } protected void thisWindowClosing() { setVisible(false); dispose(); } }