test_class.file: csv-res-filter/src/test/java/com/ibm/g11n/pipeline/resfilter/csv/TestMultiBundleCSVFilter.java
test_class.identifier: TestMultiBundleCSVFilter
test_case.body: @Test
      public void testMerge() {
          String[] baseLines = {
                  "module,key,value",
                  "Japanese Foods,ramen,Ramen",
                  "Italian Foods,minestrone,Minestrone",
                  "Japanese Foods,sushi,Sushi",
                  "Italian Foods,pizza,Pizza",
                  "Italian Foods,spaghetti,Spaghetti"
          };
  
          TestResourceStringData[] testDataJapanese = {
                  new TestResourceStringData("sushi", "寿司", 1),
                  new TestResourceStringData("ramen", "ラーメン", 2),
                  new TestResourceStringData("tempura", "天ぷら", 3)
          };
          TestResourceStringData[] testDataItalian = {
                  new TestResourceStringData("spaghetti", "スパゲッティ", 1),
                  new TestResourceStringData("pizza", "ピザ", 2)
          };
  
          String[] expectedLines = {
                  "module,key,value",
                  "Japanese Foods,ramen,ラーメン",
                  "Italian Foods,minestrone,Minestrone",
                  "Japanese Foods,sushi,寿司",
                  "Italian Foods,pizza,ピザ",
                  "Italian Foods,spaghetti,スパゲッティ"
          };
  
          Map<String, LanguageBundle> testDataMap = new LinkedHashMap<>();
          testDataMap.put("Japanese Foods", TestUtils.createLanguageBundle(testDataJapanese));
          testDataMap.put("Italian Foods", TestUtils.createLanguageBundle(testDataItalian));
  
          MultiBundleResourceFilter filter = ResourceFilterFactory.getMultiBundleResourceFilter(MultiBundleCSVFilter.ID);
          try (InputStream baseStream = TestUtils.creteInputStream(baseLines);
                  ByteArrayOutputStream outStream = new ByteArrayOutputStream()) {
              filter.merge(baseStream, outStream, testDataMap, new FilterOptions(Locale.JAPANESE));
              TestUtils.compareLines(expectedLines, outStream.toByteArray());
          } catch (IOException e) {
              fail(e.getMessage());
          } catch (ResourceFilterException e) {
              fail(e.getMessage());
          }
      }
test_case.class_method_signature: TestMultiBundleCSVFilter.testMerge()
test_case.full_signature: @Test public void testMerge()
test_case.identifier: testMerge
test_case.invocations: put createLanguageBundle put createLanguageBundle getMultiBundleResourceFilter creteInputStream merge compareLines toByteArray fail getMessage fail getMessage
test_case.modifiers: @Test public
test_case.parameters: ()
test_case.return: void
test_case.signature: void testMerge()
focal_class.declarator: ID = "CSV-MULTI"
focal_class.modifier: public static final
focal_class.original_string: public static final String ID = "CSV-MULTI";
focal_class.type: String
focal_class.var_name: ID
focal_class.declarator: TYPE = Type.MULTI
focal_class.modifier: public static final
focal_class.original_string: public static final Type TYPE = Type.MULTI;
focal_class.type: Type
focal_class.var_name: TYPE
focal_class.file: csv-res-filter/src/main/java/com/ibm/g11n/pipeline/resfilter/csv/MultiBundleCSVFilter.java
focal_class.identifier: MultiBundleCSVFilter
focal_class.class_method_signature: MultiBundleCSVFilter.parse(InputStream inStream, FilterOptions options)
focal_class.full_signature: @Override public Map<String, LanguageBundle> parse(InputStream inStream, FilterOptions options)
focal_class.identifier: parse
focal_class.modifiers: @Override public
focal_class.parameters: (InputStream inStream, FilterOptions options)
focal_class.return: Map<String, LanguageBundle>
focal_class.signature: Map<String, LanguageBundle> parse(InputStream inStream, FilterOptions options)
focal_class.class_method_signature: MultiBundleCSVFilter.write(OutputStream outStream, Map<String, LanguageBundle> languageBundles, FilterOptions options)
focal_class.full_signature: @Override public void write(OutputStream outStream, Map<String, LanguageBundle> languageBundles, FilterOptions options)
focal_class.identifier: write
focal_class.modifiers: @Override public
focal_class.parameters: (OutputStream outStream, Map<String, LanguageBundle> languageBundles, FilterOptions options)
focal_class.return: void
focal_class.signature: void write(OutputStream outStream, Map<String, LanguageBundle> languageBundles, FilterOptions options)
focal_class.class_method_signature: MultiBundleCSVFilter.merge(InputStream baseStream, OutputStream outStream, Map<String, LanguageBundle> languageBundles,
              FilterOptions options)
focal_class.full_signature: @Override public void merge(InputStream baseStream, OutputStream outStream, Map<String, LanguageBundle> languageBundles,
              FilterOptions options)
focal_class.identifier: merge
focal_class.modifiers: @Override public
focal_class.parameters: (InputStream baseStream, OutputStream outStream, Map<String, LanguageBundle> languageBundles,
              FilterOptions options)
focal_class.return: void
focal_class.signature: void merge(InputStream baseStream, OutputStream outStream, Map<String, LanguageBundle> languageBundles,
              FilterOptions options)
focal_class.superclass: extends MultiBundleResourceFilter
focal_method.body: @Override
      public void merge(InputStream baseStream, OutputStream outStream, Map<String, LanguageBundle> languageBundles,
              FilterOptions options) throws IOException, ResourceFilterException {
          // create key-value map for each bundle
          Map<String, Map<String, String>> kvMaps = new HashMap<String, Map<String, String>>();
          for (Entry<String, LanguageBundle> bundleEntry: languageBundles.entrySet()) {
              LanguageBundle languageBundle = bundleEntry.getValue();
              Map<String, String> kvMap = new HashMap<String, String>();
              for (ResourceString resString : languageBundle.getResourceStrings()) {
                  kvMap.put(resString.getKey(), resString.getValue());
              }
              kvMaps.put(bundleEntry.getKey(), kvMap);
          }
  
          CSVParser parser = CSVParser.parse(baseStream, StandardCharsets.UTF_8,
                  CSVFormat.RFC4180.withHeader("module", "key", "value").withSkipHeaderRecord(true));
          BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outStream, StandardCharsets.UTF_8));
          CSVPrinter printer = CSVFormat.RFC4180.withHeader("module", "key", "value").print(writer);
          for (CSVRecord record : parser) {
              String module = record.get(0);
              String key = record.get(1);
              String value = record.get(2);
              Map<String, String> moduleKVMap = kvMaps.get(module);
              if (moduleKVMap != null) {
                  String trValue = moduleKVMap.get(key);
                  if (trValue != null) {
                      value = trValue;
                  }
              }
              printer.printRecord(module, key, value);
          }
          printer.flush();
      }
focal_method.class_method_signature: MultiBundleCSVFilter.merge(InputStream baseStream, OutputStream outStream, Map<String, LanguageBundle> languageBundles,
              FilterOptions options)
focal_method.full_signature: @Override public void merge(InputStream baseStream, OutputStream outStream, Map<String, LanguageBundle> languageBundles,
              FilterOptions options)
focal_method.identifier: merge
focal_method.invocations: entrySet getValue getResourceStrings put getKey getValue put getKey parse withSkipHeaderRecord withHeader print withHeader get get get get get printRecord flush
focal_method.modifiers: @Override public
focal_method.parameters: (InputStream baseStream, OutputStream outStream, Map<String, LanguageBundle> languageBundles,
              FilterOptions options)
focal_method.return: void
focal_method.signature: void merge(InputStream baseStream, OutputStream outStream, Map<String, LanguageBundle> languageBundles,
              FilterOptions options)