1 /* 2 ***************************************************************************** 3 * Copyright (C) 2000-2007, International Business Machines Corporation and * 4 * others. All Rights Reserved. * 5 ***************************************************************************** 6 */ 7 package com.ibm.rbm; 8 9 import java.io.*; 10 import java.util.*; 11 12 import javax.xml.parsers.*; 13 14 import org.w3c.dom.*; 15 import org.xml.sax.*; 16 17 import com.ibm.rbm.gui.RBManagerGUI; 18 19 20 /** 21 * This is the super class for all importer plug-in classes. This class defines the methods 22 * and functionality common to all importers. This includes setting up the options dialog and 23 * displaying it to the user, performing the actual insertions into the resource bundle manager, 24 * and managing any import conflicts. 25 * 26 * @author Jared Jackson 27 * @see com.ibm.rbm.RBManager 28 */ 29 public class RBTMXImporter extends RBImporter { 30 31 Document tmx_xml = null; 32 33 /** 34 * Basic constructor for the TMX importer from the parent RBManager data and a Dialog title. 35 */ 36 RBTMXImporter(String title, RBManager rbm, RBManagerGUI gui)37 public RBTMXImporter(String title, RBManager rbm, RBManagerGUI gui) { 38 super(title, rbm, gui); 39 } 40 setupFileChooser()41 protected void setupFileChooser() { 42 chooser.setFileFilter(new javax.swing.filechooser.FileFilter(){ 43 public boolean accept(File f) { 44 if (f.isDirectory()) return true; 45 if (f.getName().endsWith(".tmx")) return true; 46 return false; 47 } 48 49 public String getDescription() { 50 return Resources.getTranslation("import_TMX_file_description"); 51 } 52 }); 53 } 54 beginImport()55 protected void beginImport() throws IOException { 56 super.beginImport(); 57 File tmx_file = getChosenFile(); 58 59 try { 60 FileInputStream fis = new FileInputStream(tmx_file); 61 InputSource is = new InputSource(fis); 62 DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 63 tmx_xml = builder.parse(is); 64 fis.close(); 65 } catch (Exception e) { 66 e.printStackTrace(System.err); 67 throw new IOException(e.getMessage()); 68 } 69 if (tmx_xml == null) 70 return; 71 72 importDoc(); 73 } 74 importDoc()75 private void importDoc() { 76 if (tmx_xml == null) 77 return; 78 Element root = tmx_xml.getDocumentElement(); 79 Node node = root.getFirstChild(); 80 while (node != null && (node.getNodeType() != Node.ELEMENT_NODE || !(node.getNodeName().equalsIgnoreCase("header")))) { 81 node = node.getNextSibling(); 82 } 83 //ElementImpl header = (ElementImpl)node; 84 node = root.getFirstChild(); 85 while (node != null && (node.getNodeType() != Node.ELEMENT_NODE || !(node.getNodeName().equalsIgnoreCase("body")))) { 86 node = node.getNextSibling(); 87 } 88 Element body = (Element)node; 89 resolveEncodings(getEncodingsVector(body)); 90 91 // Now do the actual import resource by resource 92 NodeList tu_list = body.getElementsByTagName("tu"); 93 for (int i=0; i < tu_list.getLength(); i++) { 94 Element tu_elem = (Element)tu_list.item(i); 95 // Get the key value 96 String name = tu_elem.getAttribute("tuid"); 97 if (name == null || name.length() < 1) 98 continue; 99 // Get the group if it exists 100 String group = null; 101 NodeList prop_list = tu_elem.getElementsByTagName("prop"); 102 for (int j=0; j < prop_list.getLength(); j++) { 103 Element prop_elem = (Element)prop_list.item(j); 104 String type = prop_elem.getAttribute("type"); 105 if (type != null && type.equals("x-Group")) { 106 prop_elem.normalize(); 107 NodeList text_list = prop_elem.getChildNodes(); 108 if (text_list.getLength() < 1) 109 continue; 110 Text text_elem = (Text)text_list.item(0); 111 group = text_elem.getNodeValue(); 112 } 113 } 114 if (group == null || group.length() < 1) group = getDefaultGroup(); 115 116 NodeList tuv_list = tu_elem.getElementsByTagName("tuv"); 117 // For each tuv element 118 for (int j=0; j < tuv_list.getLength(); j++) { 119 Element tuv_elem = (Element)tuv_list.item(j); 120 String encoding = tuv_elem.getAttribute("lang"); 121 // Get the current encoding 122 if (encoding == null) continue; 123 char array[] = encoding.toCharArray(); 124 for (int k=0; k < array.length; k++) { 125 if (array[k] == '-') 126 array[k] = '_'; 127 } 128 encoding = String.valueOf(array); 129 // Get the translation value 130 NodeList seg_list = tuv_elem.getElementsByTagName("seg"); 131 if (seg_list.getLength() < 1) 132 continue; 133 Element seg_elem = (Element)seg_list.item(0); 134 seg_elem.normalize(); 135 NodeList text_list = seg_elem.getChildNodes(); 136 if (text_list.getLength() < 1) 137 continue; 138 Text text_elem = (Text)text_list.item(0); 139 String value = text_elem.getNodeValue(); 140 if (value == null || value.length() < 1) 141 continue; 142 // Create the bundle item 143 BundleItem item = new BundleItem(null, name, value); 144 // Get creation, modification values 145 item.setCreatedDate(tuv_elem.getAttribute("creationdate")); 146 item.setModifiedDate(tuv_elem.getAttribute("changedate")); 147 if (tuv_elem.getAttribute("changeid") != null) 148 item.setModifier(tuv_elem.getAttribute("changeid")); 149 if (tuv_elem.getAttribute("creationid") != null) 150 item.setCreator(tuv_elem.getAttribute("creationid")); 151 // Get properties specified 152 prop_list = tuv_elem.getElementsByTagName("prop"); 153 Hashtable lookups = null; 154 for (int k=0; k < prop_list.getLength(); k++) { 155 Element prop_elem = (Element)prop_list.item(k); 156 String type = prop_elem.getAttribute("type"); 157 if (type != null && type.equals("x-Comment")) { 158 // Get the comment 159 prop_elem.normalize(); 160 text_list = prop_elem.getChildNodes(); 161 if (text_list.getLength() < 1) continue; 162 text_elem = (Text)text_list.item(0); 163 String comment = text_elem.getNodeValue(); 164 if (comment != null && comment.length() > 0) 165 item.setComment(comment); 166 } else if (type != null && type.equals("x-Translated")) { 167 // Get the translated flag value 168 prop_elem.normalize(); 169 text_list = prop_elem.getChildNodes(); 170 if (text_list.getLength() < 1) continue; 171 text_elem = (Text)text_list.item(0); 172 if (text_elem.getNodeValue() != null) { 173 if (text_elem.getNodeValue().equalsIgnoreCase("true")) 174 item.setTranslated(true); 175 else if (text_elem.getNodeValue().equalsIgnoreCase("false")) 176 item.setTranslated(false); 177 else 178 item.setTranslated(getDefaultTranslated()); 179 } 180 else 181 item.setTranslated(getDefaultTranslated()); 182 } else if (type != null && type.equals("x-Lookup")) { 183 // Get a lookup value 184 prop_elem.normalize(); 185 text_list = prop_elem.getChildNodes(); 186 if (text_list.getLength() < 1) 187 continue; 188 text_elem = (Text)text_list.item(0); 189 if (text_elem.getNodeValue() != null) { 190 String text = text_elem.getNodeValue(); 191 if (text.indexOf("=") > 0) { 192 try { 193 if (lookups == null) lookups = new Hashtable(); 194 String lkey = text.substring(0,text.indexOf("=")); 195 String lvalue = text.substring(text.indexOf("=")+1,text.length()); 196 lookups.put(lkey, lvalue); 197 } catch (Exception ex) { /* String out of bounds - Ignore and go on */ } 198 } 199 } 200 else 201 item.setTranslated(getDefaultTranslated()); 202 } 203 } 204 if (lookups != null) item.setLookups(lookups); 205 importResource(item, encoding, group); 206 } 207 } 208 } 209 getEncodingsVector(Element body)210 private Vector getEncodingsVector(Element body) { 211 String empty = ""; 212 if (body == null) 213 return null; 214 Hashtable hash = new Hashtable(); 215 NodeList tu_list = body.getElementsByTagName("tu"); 216 for (int i=0; i < tu_list.getLength(); i++) { 217 Element tu_elem = (Element)tu_list.item(i); 218 NodeList tuv_list = tu_elem.getElementsByTagName("tuv"); 219 for (int j=0; j < tuv_list.getLength(); j++) { 220 Element tuv_elem = (Element)tuv_list.item(j); 221 String encoding = tuv_elem.getAttribute("lang"); 222 if (encoding == null) 223 continue; 224 char array[] = encoding.toCharArray(); 225 for (int k=0; k < array.length; k++) { 226 if (array[k] == '-') 227 array[k] = '_'; 228 } 229 encoding = String.valueOf(array); 230 if (!(hash.containsKey(encoding))) 231 hash.put(encoding,empty); 232 } 233 } 234 Vector v = new Vector(); 235 Enumeration keys = hash.keys(); 236 while (keys.hasMoreElements()) { 237 v.addElement(keys.nextElement()); 238 } 239 return v; 240 } 241 }