Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * SonarQube, open source software quality management tool.
   * Copyright (C) 2008-2013 SonarSource
   * mailto:contact AT sonarsource DOT com
   *
   * SonarQube is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 3 of the License, or (at your option) any later version.
  *
  * SonarQube is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public License
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 package org.sonar.test.i18n;
 
 
 import java.io.File;
 import java.util.Map;
 
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.notNullValue;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.fail;
 
 public class BundleSynchronizedMatcher extends BaseMatcher<String> {
 
   public static final String L10N_PATH = "/org/sonar/l10n/";
 
   private String bundleName;
   private SortedMap<StringStringmissingKeys;
 
   public boolean matches(Object arg0) {
     if (!(arg0 instanceof String)) {
       return false;
     }
      = (Stringarg0;
 
     // Find the bundle that needs to be verified
     InputStream bundleInputStream = getBundleFileInputStream();
 
     // Find the default bundle which the provided one should be compared to
     InputStream defaultBundleInputStream = getDefaultBundleFileInputStream();
 
     // and now let's compare!
     try {
       // search for missing keys
        = retrieveMissingTranslations(bundleInputStreamdefaultBundleInputStream);
 
       // and now for additional keys
       bundleInputStream = getBundleFileInputStream();
       defaultBundleInputStream = getDefaultBundleFileInputStream();
        = retrieveMissingTranslations(defaultBundleInputStreambundleInputStream);
 
       // And fail only if there are missing keys
       return .isEmpty();
     } catch (IOException e) {
       fail("An error occured while reading the bundles: " + e.getMessage());
       return false;
     } finally {
       IOUtils.closeQuietly(bundleInputStream);
       IOUtils.closeQuietly(defaultBundleInputStream);
     }
   }
 
   public void describeTo(Description description) {
     // report file
     File dumpFile = new File("target/l10n/" +  + ".report.txt");
 
     // prepare message
     StringBuilder details = prepareDetailsMessage(dumpFile);
     description.appendText(details.toString());
 
     // print report in target directory
     printReport(dumpFiledetails.toString());
   }
 
   private StringBuilder prepareDetailsMessage(File dumpFile) {
     StringBuilder details = new StringBuilder("\n=======================\n'");
     details.append();
     details.append("' is not up-to-date.");
     print("\n\n Missing translations are:"details);
     print("\n\nThe following translations do not exist in the reference bundle:"details);
    details.append("\n\nSee report file located at: ");
    details.append(dumpFile.getAbsolutePath());
    details.append("\n=======================");
    return details;
  }
  private void print(String titleSortedMap<StringStringtranslationsStringBuilder to) {
    if (!translations.isEmpty()) {
      to.append(title);
      for (Map.Entry<StringStringentry : translations.entrySet()) {
        to.append("\n").append(entry.getKey()).append("=").append(entry.getValue());
      }
    }
  }
  private void printReport(File dumpFileString details) {
    if (dumpFile.exists()) {
      dumpFile.delete();
    }
    dumpFile.getParentFile().mkdirs();
    FileWriter writer = null;
    try {
      writer = new FileWriter(dumpFile);
      writer.write(details);
    } catch (IOException e) {
      throw new IllegalStateException("Unable to write the report to 'target/l10n/" +  + ".report.txt'"e);
    } finally {
      IOUtils.closeQuietly(writer);
    }
  }
  protected static SortedMap<StringStringretrieveMissingTranslations(InputStream bundleInputStream referenceBundlethrows IOException {
    SortedMap<StringStringmissingKeys = Maps.newTreeMap();
    Properties bundleProps = loadProperties(bundle);
    Properties referenceProperties = loadProperties(referenceBundle);
    for (Map.Entry<ObjectObjectentry : referenceProperties.entrySet()) {
      String key = (Stringentry.getKey();
      if (!bundleProps.containsKey(key)) {
        missingKeys.put(key, (Stringentry.getValue());
      }
    }
    return missingKeys;
  }
  protected static Properties loadProperties(InputStream inputStreamthrows IOException {
    Properties props = new Properties();
    props.load(inputStream);
    return props;
  }
  protected static InputStream getBundleFileInputStream(String bundleName) {
    InputStream bundle = BundleSynchronizedMatcher.class.getResourceAsStream( + bundleName);
    assertThat("File '" + bundleName + "' does not exist in '/org/sonar/l10n/'."bundlenotNullValue());
    return bundle;
  }
  protected static InputStream getDefaultBundleFileInputStream(String bundleName) {
    String defaultBundleName = extractDefaultBundleName(bundleName);
    InputStream bundle = BundleSynchronizedMatcher.class.getResourceAsStream( + defaultBundleName);
    assertThat("Default bundle '" + defaultBundleName + "' could not be found: add a dependency to the corresponding plugin in your POM."bundlenotNullValue());
    return bundle;
  }
  protected static String extractDefaultBundleName(String bundleName) {
    int firstUnderScoreIndex = bundleName.indexOf('_');
    assertThat("The bundle '" + bundleName + "' is a default bundle (without locale), so it can't be compared."firstUnderScoreIndex > 0,
        is(true));
    return bundleName.substring(0, firstUnderScoreIndex) + ".properties";
  }
New to GrepCode? Check out our FAQ X