blob: fdc8d63748ff3b0dda3cfacb1d6fdf9c79188649 [file] [log] [blame]
/*
*****************************************************************************
* Copyright (C) 2000-2007, International Business Machines Corporation and *
* others. All Rights Reserved. *
*****************************************************************************
*/
package com.ibm.rbm;
import java.io.*;
import java.util.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import com.ibm.rbm.gui.RBManagerGUI;
/**
* This is the super class for all importer plug-in classes. This class defines the methods
* and functionality common to all importers. This includes setting up the options dialog and
* displaying it to the user, performing the actual insertions into the resource bundle manager,
* and managing any import conflicts.
*
* @author Jared Jackson
* @see com.ibm.rbm.RBManager
*/
public class RBTMXImporter extends RBImporter {
Document tmx_xml = null;
/**
* Basic constructor for the TMX importer from the parent RBManager data and a Dialog title.
*/
public RBTMXImporter(String title, RBManager rbm, RBManagerGUI gui) {
super(title, rbm, gui);
}
protected void setupFileChooser() {
chooser.setFileFilter(new javax.swing.filechooser.FileFilter(){
public boolean accept(File f) {
if (f.isDirectory()) return true;
if (f.getName().endsWith(".tmx")) return true;
return false;
}
public String getDescription() {
return Resources.getTranslation("import_TMX_file_description");
}
});
}
protected void beginImport() throws IOException {
super.beginImport();
File tmx_file = getChosenFile();
try {
FileInputStream fis = new FileInputStream(tmx_file);
InputSource is = new InputSource(fis);
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
tmx_xml = builder.parse(is);
fis.close();
} catch (Exception e) {
e.printStackTrace(System.err);
throw new IOException(e.getMessage());
}
if (tmx_xml == null)
return;
importDoc();
}
private void importDoc() {
if (tmx_xml == null)
return;
Element root = tmx_xml.getDocumentElement();
Node node = root.getFirstChild();
while (node != null && (node.getNodeType() != Node.ELEMENT_NODE || !(node.getNodeName().equalsIgnoreCase("header")))) {
node = node.getNextSibling();
}
//ElementImpl header = (ElementImpl)node;
node = root.getFirstChild();
while (node != null && (node.getNodeType() != Node.ELEMENT_NODE || !(node.getNodeName().equalsIgnoreCase("body")))) {
node = node.getNextSibling();
}
Element body = (Element)node;
resolveEncodings(getEncodingsVector(body));
// Now do the actual import resource by resource
NodeList tu_list = body.getElementsByTagName("tu");
for (int i=0; i < tu_list.getLength(); i++) {
Element tu_elem = (Element)tu_list.item(i);
// Get the key value
String name = tu_elem.getAttribute("tuid");
if (name == null || name.length() < 1)
continue;
// Get the group if it exists
String group = null;
NodeList prop_list = tu_elem.getElementsByTagName("prop");
for (int j=0; j < prop_list.getLength(); j++) {
Element prop_elem = (Element)prop_list.item(j);
String type = prop_elem.getAttribute("type");
if (type != null && type.equals("x-Group")) {
prop_elem.normalize();
NodeList text_list = prop_elem.getChildNodes();
if (text_list.getLength() < 1)
continue;
Text text_elem = (Text)text_list.item(0);
group = text_elem.getNodeValue();
}
}
if (group == null || group.length() < 1) group = getDefaultGroup();
NodeList tuv_list = tu_elem.getElementsByTagName("tuv");
// For each tuv element
for (int j=0; j < tuv_list.getLength(); j++) {
Element tuv_elem = (Element)tuv_list.item(j);
String encoding = tuv_elem.getAttribute("lang");
// Get the current encoding
if (encoding == null) continue;
char array[] = encoding.toCharArray();
for (int k=0; k < array.length; k++) {
if (array[k] == '-')
array[k] = '_';
}
encoding = String.valueOf(array);
// Get the translation value
NodeList seg_list = tuv_elem.getElementsByTagName("seg");
if (seg_list.getLength() < 1)
continue;
Element seg_elem = (Element)seg_list.item(0);
seg_elem.normalize();
NodeList text_list = seg_elem.getChildNodes();
if (text_list.getLength() < 1)
continue;
Text text_elem = (Text)text_list.item(0);
String value = text_elem.getNodeValue();
if (value == null || value.length() < 1)
continue;
// Create the bundle item
BundleItem item = new BundleItem(null, name, value);
// Get creation, modification values
item.setCreatedDate(tuv_elem.getAttribute("creationdate"));
item.setModifiedDate(tuv_elem.getAttribute("changedate"));
if (tuv_elem.getAttribute("changeid") != null)
item.setModifier(tuv_elem.getAttribute("changeid"));
if (tuv_elem.getAttribute("creationid") != null)
item.setCreator(tuv_elem.getAttribute("creationid"));
// Get properties specified
prop_list = tuv_elem.getElementsByTagName("prop");
Hashtable lookups = null;
for (int k=0; k < prop_list.getLength(); k++) {
Element prop_elem = (Element)prop_list.item(k);
String type = prop_elem.getAttribute("type");
if (type != null && type.equals("x-Comment")) {
// Get the comment
prop_elem.normalize();
text_list = prop_elem.getChildNodes();
if (text_list.getLength() < 1) continue;
text_elem = (Text)text_list.item(0);
String comment = text_elem.getNodeValue();
if (comment != null && comment.length() > 0)
item.setComment(comment);
} else if (type != null && type.equals("x-Translated")) {
// Get the translated flag value
prop_elem.normalize();
text_list = prop_elem.getChildNodes();
if (text_list.getLength() < 1) continue;
text_elem = (Text)text_list.item(0);
if (text_elem.getNodeValue() != null) {
if (text_elem.getNodeValue().equalsIgnoreCase("true"))
item.setTranslated(true);
else if (text_elem.getNodeValue().equalsIgnoreCase("false"))
item.setTranslated(false);
else
item.setTranslated(getDefaultTranslated());
}
else
item.setTranslated(getDefaultTranslated());
} else if (type != null && type.equals("x-Lookup")) {
// Get a lookup value
prop_elem.normalize();
text_list = prop_elem.getChildNodes();
if (text_list.getLength() < 1)
continue;
text_elem = (Text)text_list.item(0);
if (text_elem.getNodeValue() != null) {
String text = text_elem.getNodeValue();
if (text.indexOf("=") > 0) {
try {
if (lookups == null) lookups = new Hashtable();
String lkey = text.substring(0,text.indexOf("="));
String lvalue = text.substring(text.indexOf("=")+1,text.length());
lookups.put(lkey, lvalue);
} catch (Exception ex) { /* String out of bounds - Ignore and go on */ }
}
}
else
item.setTranslated(getDefaultTranslated());
}
}
if (lookups != null) item.setLookups(lookups);
importResource(item, encoding, group);
}
}
}
private Vector getEncodingsVector(Element body) {
String empty = "";
if (body == null)
return null;
Hashtable hash = new Hashtable();
NodeList tu_list = body.getElementsByTagName("tu");
for (int i=0; i < tu_list.getLength(); i++) {
Element tu_elem = (Element)tu_list.item(i);
NodeList tuv_list = tu_elem.getElementsByTagName("tuv");
for (int j=0; j < tuv_list.getLength(); j++) {
Element tuv_elem = (Element)tuv_list.item(j);
String encoding = tuv_elem.getAttribute("lang");
if (encoding == null)
continue;
char array[] = encoding.toCharArray();
for (int k=0; k < array.length; k++) {
if (array[k] == '-')
array[k] = '_';
}
encoding = String.valueOf(array);
if (!(hash.containsKey(encoding)))
hash.put(encoding,empty);
}
}
Vector v = new Vector();
Enumeration keys = hash.keys();
while (keys.hasMoreElements()) {
v.addElement(keys.nextElement());
}
return v;
}
}