Revision: 7152
http://languagetool.svn.sourceforge.net/languagetool/?rev=7152&view=rev
Author: dnaber
Date: 2012-06-02 00:47:45 +0000 (Sat, 02 Jun 2012)
Log Message:
-----------
start refactoring of index searcher (work in progress)
Modified Paths:
--------------
trunk/JLanguageTool/src/dev/org/languagetool/dev/index/Indexer.java
trunk/JLanguageTool/src/dev/org/languagetool/dev/index/PatternRuleNotFoundException.java
trunk/JLanguageTool/src/dev/org/languagetool/dev/index/PatternRuleQueryBuilder.java
trunk/JLanguageTool/src/dev/org/languagetool/dev/index/Searcher.java
trunk/JLanguageTool/src/dev/org/languagetool/dev/index/UnsupportedPatternRuleException.java
trunk/JLanguageTool/src/test/org/languagetool/dev/index/IndexerSearcherTest.java
trunk/JLanguageTool/src/test/org/languagetool/dev/index/PatternRuleQueryBuilderTest.java
Modified: trunk/JLanguageTool/src/dev/org/languagetool/dev/index/Indexer.java
===================================================================
--- trunk/JLanguageTool/src/dev/org/languagetool/dev/index/Indexer.java
2012-06-02 00:36:52 UTC (rev 7151)
+++ trunk/JLanguageTool/src/dev/org/languagetool/dev/index/Indexer.java
2012-06-02 00:47:45 UTC (rev 7152)
@@ -96,10 +96,13 @@
run(br, new Indexer(dir, language), isSentence);
}
- public static void run(BufferedReader reader, Indexer indexer, boolean
isSentence)
- throws IOException {
- indexer.index(reader, isSentence, -1);
- indexer.close();
+ public static void run(BufferedReader reader, Indexer indexer, boolean
isSentence) throws IOException {
+ try {
+ indexer.index(reader, isSentence, -1);
+ } finally {
+ // TODO: let caller close indexer
+ indexer.close();
+ }
}
public void index(String content, boolean isSentence, int docCount) throws
IOException {
Modified:
trunk/JLanguageTool/src/dev/org/languagetool/dev/index/PatternRuleNotFoundException.java
===================================================================
---
trunk/JLanguageTool/src/dev/org/languagetool/dev/index/PatternRuleNotFoundException.java
2012-06-02 00:36:52 UTC (rev 7151)
+++
trunk/JLanguageTool/src/dev/org/languagetool/dev/index/PatternRuleNotFoundException.java
2012-06-02 00:47:45 UTC (rev 7152)
@@ -18,13 +18,14 @@
*/
package org.languagetool.dev.index;
+import java.io.File;
import java.io.IOException;
public class PatternRuleNotFoundException extends IOException {
private static final long serialVersionUID = -220557881967037175L;
- public PatternRuleNotFoundException(String ruleId) {
- super("Can not find pattern rule '" + ruleId + "'");
+ public PatternRuleNotFoundException(String ruleId, File ruleFile) {
+ super("Could not find pattern rule '" + ruleId + "' in rule file " +
ruleFile);
}
}
Modified:
trunk/JLanguageTool/src/dev/org/languagetool/dev/index/PatternRuleQueryBuilder.java
===================================================================
---
trunk/JLanguageTool/src/dev/org/languagetool/dev/index/PatternRuleQueryBuilder.java
2012-06-02 00:36:52 UTC (rev 7151)
+++
trunk/JLanguageTool/src/dev/org/languagetool/dev/index/PatternRuleQueryBuilder.java
2012-06-02 00:47:45 UTC (rev 7152)
@@ -41,13 +41,21 @@
private static final int MAX_SKIP = 1000;
- public Query buildQuery(PatternRule rule, boolean checkUnsupportedRule)
+ public Query buildQuery(PatternRule rule)
throws UnsupportedPatternRuleException {
- return next(rule.getElements().iterator(), checkUnsupportedRule);
+ return next(rule.getElements().iterator(), true);
}
+ public Query buildPossiblyRelaxedQuery(PatternRule rule) {
+ try {
+ return next(rule.getElements().iterator(), false);
+ } catch (UnsupportedPatternRuleException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
// create the next SpanQuery from the top Element in the Iterator.
- private SpanQuery next(Iterator<Element> it, boolean checkUnsupportedRule)
+ private SpanQuery next(Iterator<Element> it, boolean
throwExceptionOnUnsupportedRule)
throws UnsupportedPatternRuleException {
// no more Element
@@ -70,7 +78,7 @@
patternElement.isPOStagRegularExpression());
} catch (UnsupportedPatternRuleException e) {
- if (checkUnsupportedRule) {
+ if (throwExceptionOnUnsupportedRule) {
throw e;
} else {
// create an empty token for the unsupported token, so that it can
match any term with any
@@ -101,7 +109,7 @@
}
// recursion invoke
- final SpanQuery next = next(it, checkUnsupportedRule);
+ final SpanQuery next = next(it, throwExceptionOnUnsupportedRule);
if (next != null) {
list.add(next);
Modified: trunk/JLanguageTool/src/dev/org/languagetool/dev/index/Searcher.java
===================================================================
--- trunk/JLanguageTool/src/dev/org/languagetool/dev/index/Searcher.java
2012-06-02 00:36:52 UTC (rev 7151)
+++ trunk/JLanguageTool/src/dev/org/languagetool/dev/index/Searcher.java
2012-06-02 00:47:45 UTC (rev 7152)
@@ -27,6 +27,7 @@
import org.languagetool.JLanguageTool;
import org.languagetool.Language;
+import org.languagetool.rules.Rule;
import org.languagetool.rules.RuleMatch;
import org.apache.lucene.document.Document;
import org.apache.lucene.search.IndexSearcher;
@@ -46,32 +47,90 @@
*/
public class Searcher {
- private static final int MAX_HITS = 1000;
+ private static final int DEFAULT_MAX_HITS = 1000;
- public TopDocs run(PatternRule rule, IndexSearcher searcher, boolean
checkUnsupportedRule)
- throws IOException {
+ private int maxHits = DEFAULT_MAX_HITS;
+
+ public Searcher() {
+ }
+
+ public int getMaxHits() {
+ return maxHits;
+ }
+
+ public void setMaxHits(int maxHits) {
+ this.maxHits = maxHits;
+ }
+
+ public List<RuleMatch> findRuleMatchesOnIndex(PatternRule rule, Language
language, File indexDir) throws IOException {
+ final IndexSearcher indexSearcher = new
IndexSearcher(FSDirectory.open(indexDir));
+ try {
+ return findRuleMatchesOnIndex(rule, language, indexSearcher);
+ } finally {
+ indexSearcher.close();
+ }
+ }
+
+ public List<RuleMatch> findRuleMatchesOnIndex(PatternRule rule, Language
language, IndexSearcher indexSearcher) throws IOException {
+ final List<RuleMatch> matches = new ArrayList<RuleMatch>();
+ final Query query = createQuery(rule);
+ final TopDocs topDocs = indexSearcher.search(query, maxHits);
+ final JLanguageTool languageTool = getLanguageToolWithOneRule(language,
rule);
+ for (ScoreDoc match : topDocs.scoreDocs) {
+ final Document doc = indexSearcher.doc(match.doc);
+ final String sentence = doc.get(PatternRuleQueryBuilder.FIELD_NAME);
+ final List<RuleMatch> ruleMatches = languageTool.check(sentence);
+ matches.addAll(ruleMatches);
+ }
+ return matches;
+ }
+
+ private Query createQuery(PatternRule rule) {
final PatternRuleQueryBuilder patternRuleQueryBuilder = new
PatternRuleQueryBuilder();
- final Query query = patternRuleQueryBuilder.buildQuery(rule,
checkUnsupportedRule);
- //System.out.println("QUERY: " + query);
- return searcher.search(query, MAX_HITS);
+ Query query;
+ try {
+ query = patternRuleQueryBuilder.buildQuery(rule);
+ } catch (UnsupportedPatternRuleException e) {
+ query = patternRuleQueryBuilder.buildPossiblyRelaxedQuery(rule);
+ }
+ return query;
}
- public List<TopDocs> run(String ruleId, File xmlRuleFile, IndexSearcher
searcher,
- boolean checkUnsupportedRule) throws IOException {
- final List<TopDocs> topDocsList = new ArrayList<TopDocs>();
+ public TopDocs run(PatternRule rule, IndexSearcher searcher, boolean
throwExceptionOnUnsupportedRule)
+ throws IOException, UnsupportedPatternRuleException {
+ final PatternRuleQueryBuilder patternRuleQueryBuilder = new
PatternRuleQueryBuilder();
+ final Query query;
+ if (throwExceptionOnUnsupportedRule) {
+ query = patternRuleQueryBuilder.buildQuery(rule);
+ } else {
+ query = patternRuleQueryBuilder.buildPossiblyRelaxedQuery(rule);
+ }
+ return searcher.search(query, maxHits);
+ }
+
+ public TopDocs run(String ruleId, File xmlRuleFile, IndexSearcher searcher,
boolean checkUnsupportedRule) throws IOException,
UnsupportedPatternRuleException {
+ final PatternRule rule = getRuleById(ruleId, xmlRuleFile);
+ final TopDocs topDocs = run(rule, searcher, checkUnsupportedRule);
+ return topDocs;
+ }
+
+ private PatternRule getRuleById(String ruleId, File xmlRuleFile) throws
IOException {
final List<PatternRule> rules = loadRules(xmlRuleFile);
- boolean foundRule = false;
for (PatternRule rule : rules) {
if (rule.getId().equals(ruleId)) {
- final TopDocs topDocs = run(rule, searcher, checkUnsupportedRule);
- topDocsList.add(topDocs);
- foundRule = true;
+ return rule;
}
}
- if (!foundRule) {
- throw new PatternRuleNotFoundException(ruleId);
+ throw new PatternRuleNotFoundException(ruleId, xmlRuleFile);
+ }
+
+ private JLanguageTool getLanguageToolWithOneRule(Language lang, PatternRule
patternRule) throws IOException {
+ final JLanguageTool langTool = new JLanguageTool(lang);
+ for (Rule rule : langTool.getAllActiveRules()) {
+ langTool.disableRule(rule.getId());
}
- return topDocsList;
+ langTool.addRule(patternRule);
+ return langTool;
}
private List<PatternRule> loadRules(File xmlRuleFile) throws IOException {
@@ -83,9 +142,9 @@
xmlRulesStream.close();
}
}
-
+
private void run(String ruleId, File xmlRuleFile, File indexDir)
- throws IOException {
+ throws IOException, UnsupportedPatternRuleException {
if (!xmlRuleFile.exists() || !xmlRuleFile.canRead()) {
System.out.println("Rule XML file '" + xmlRuleFile.getAbsolutePath()
+ "' does not exist or is not readable, please check the path");
@@ -94,17 +153,13 @@
final IndexSearcher searcher = new
IndexSearcher(FSDirectory.open(indexDir));
try {
- final List<TopDocs> matchesList = run(ruleId, xmlRuleFile, searcher,
true);
- for (TopDocs matches : matchesList) {
- printResult(matches, searcher, null);
- }
+ final TopDocs topDocs = run(ruleId, xmlRuleFile, searcher, true);
+ printResult(topDocs, searcher, null);
} catch (UnsupportedPatternRuleException e) {
System.out.println(e.getMessage() + " Will run checking on potential
matches (this can be slow):");
- final List<TopDocs> potentialMatchesList = run(ruleId, xmlRuleFile,
searcher, false);
+ final TopDocs topDocs = run(ruleId, xmlRuleFile, searcher, false);
final JLanguageTool languageTool = getLanguageToolWithOneRule(ruleId,
xmlRuleFile);
- for (TopDocs potentialMatches : potentialMatchesList) {
- printResult(potentialMatches, searcher, languageTool);
- }
+ printResult(topDocs, searcher, languageTool);
}
searcher.close();
}
@@ -130,7 +185,7 @@
System.out.println("Search results: " + docs.totalHits);
}
- for (int i = 0; i < Math.min(docs.totalHits, MAX_HITS);) {
+ for (int i = 0; i < Math.min(docs.totalHits, maxHits);) {
final Document doc = searcher.doc(hits[i++].doc);
final String sentence = doc.get(PatternRuleQueryBuilder.FIELD_NAME);
if (languageTool != null) {
@@ -142,8 +197,8 @@
System.out.println(i + ": " + sentence);
}
}
- if (docs.totalHits > MAX_HITS) {
- System.out.println("NOTE: matches skipped due to maximum hit limit of "
+ MAX_HITS);
+ if (docs.totalHits > maxHits) {
+ System.out.println("NOTE: matches skipped due to maximum hit limit of "
+ maxHits);
}
}
@@ -152,7 +207,7 @@
System.err.println("Usage: Searcher <ruleId> <ruleXML> <indexDir>");
System.err.println("\truleId Id of the rule to search");
System.err.println("\truleXML path to a rule file, e.g. en/grammar.xml");
- System.err.println("\tindexDir path to a directory storing the index");
+ System.err.println("\tindexDir path to a directory containing the
index");
System.exit(1);
}
}
Modified:
trunk/JLanguageTool/src/dev/org/languagetool/dev/index/UnsupportedPatternRuleException.java
===================================================================
---
trunk/JLanguageTool/src/dev/org/languagetool/dev/index/UnsupportedPatternRuleException.java
2012-06-02 00:36:52 UTC (rev 7151)
+++
trunk/JLanguageTool/src/dev/org/languagetool/dev/index/UnsupportedPatternRuleException.java
2012-06-02 00:47:45 UTC (rev 7152)
@@ -18,10 +18,8 @@
*/
package org.languagetool.dev.index;
-import java.io.IOException;
+public class UnsupportedPatternRuleException extends Exception {
-public class UnsupportedPatternRuleException extends IOException {
-
private static final long serialVersionUID = -2346750825068970240L;
public UnsupportedPatternRuleException(String message) {
Modified:
trunk/JLanguageTool/src/test/org/languagetool/dev/index/IndexerSearcherTest.java
===================================================================
---
trunk/JLanguageTool/src/test/org/languagetool/dev/index/IndexerSearcherTest.java
2012-06-02 00:36:52 UTC (rev 7151)
+++
trunk/JLanguageTool/src/test/org/languagetool/dev/index/IndexerSearcherTest.java
2012-06-02 00:47:45 UTC (rev 7152)
@@ -18,60 +18,59 @@
*/
package org.languagetool.dev.index;
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.util.LuceneTestCase;
-
import org.languagetool.Language;
+import org.languagetool.rules.RuleMatch;
+import org.languagetool.rules.patterns.Element;
+import org.languagetool.rules.patterns.PatternRule;
+import java.io.File;
+import java.util.Arrays;
+import java.util.List;
+
public class IndexerSearcherTest extends LuceneTestCase {
+
private IndexSearcher searcher;
-
private Directory directory;
@Override
public void setUp() throws Exception {
super.setUp();
directory = newDirectory();
-
}
@Override
public void tearDown() throws Exception {
- searcher.close();
+ if (searcher != null) {
+ searcher.close();
+ }
directory.close();
super.tearDown();
}
public void testIndexerSearcher() throws Exception {
// Note that the second sentence ends with "lid" instead of "lids" (the
inflated one)
- String content = "How to move back and fourth from linux to xmb? Calcium
deposits on eye lid.";
+ final String content = "How to move back and fourth from linux to xmb?
Calcium deposits on eye lid.";
Indexer.run(content, directory, Language.ENGLISH, false);
searcher = new IndexSearcher(directory);
- Searcher errorSearcher = new Searcher();
- File ruleFile = new File("src/rules/en/grammar.xml");
- List<TopDocs> topDocs = errorSearcher.run("BACK_AND_FOURTH", ruleFile,
searcher, true);
- assertEquals(1, topDocs.size());
- assertEquals(1, topDocs.get(0).totalHits);
-
+ final Searcher errorSearcher = new Searcher();
+ final File ruleFile = new File("src/rules/en/grammar.xml");
+ TopDocs topDocs = errorSearcher.run("BACK_AND_FOURTH", ruleFile, searcher,
true);
+ assertEquals(1, topDocs.totalHits);
+
topDocs = errorSearcher.run("BACK_AND_FOURTH", ruleFile, searcher, false);
- assertEquals(1, topDocs.size());
- assertEquals(1, topDocs.get(0).totalHits);
+ assertEquals(1, topDocs.totalHits);
topDocs = errorSearcher.run("ALL_OVER_THE_WORD", ruleFile, searcher, true);
- assertEquals(1, topDocs.size());
- assertEquals(0, topDocs.get(0).totalHits);
+ assertEquals(0, topDocs.totalHits);
topDocs = errorSearcher.run("ALL_OVER_THE_WORD", ruleFile, searcher,
false);
- assertEquals(1, topDocs.size());
- assertEquals(0, topDocs.get(0).totalHits);
+ assertEquals(0, topDocs.totalHits);
try {
errorSearcher.run("Invalid Rule Id", ruleFile, searcher, true);
@@ -86,21 +85,41 @@
try {
errorSearcher.run("EYE_BROW", ruleFile, searcher, true);
fail("Exception should be thrown for unsupported PatternRule");
- } catch (IOException e) {
- assertTrue(e instanceof UnsupportedPatternRuleException);
- topDocs = errorSearcher.run("EYE_BROW", ruleFile, searcher, false);
- assertEquals(1, topDocs.size());
- assertEquals(1, topDocs.get(0).totalHits);
- }
+ } catch (UnsupportedPatternRuleException expected) {}
+ topDocs = errorSearcher.run("EYE_BROW", ruleFile, searcher, false);
+ assertEquals(1, topDocs.totalHits);
+
+
try {
errorSearcher.run("ALL_FOR_NOT", ruleFile, searcher, true);
fail("Exception should be thrown for unsupported PatternRule");
} catch (UnsupportedPatternRuleException expected) {
topDocs = errorSearcher
.run("ALL_FOR_NOT", ruleFile, searcher, false);
- assertEquals(1, topDocs.size());
- assertEquals(0, topDocs.get(0).totalHits);
+ assertEquals(0, topDocs.totalHits);
}
}
+
+ public void testIndexerSearcher2() throws Exception {
+ final String content = "How to move back and fourth from linux to xmb?";
+
+ Indexer.run(content, directory, Language.ENGLISH, false);
+
+ final Searcher errorSearcher = new Searcher();
+ final List<Element> elements = Arrays.asList(
+ new Element("move", false, false, false),
+ new Element("back", false, false, false)
+ );
+ final PatternRule rule1 = new PatternRule("RULE1", Language.ENGLISH,
elements, "desc", "msg", "shortMsg");
+ final IndexSearcher indexSearcher = new IndexSearcher(directory);
+ try {
+ final List<RuleMatch> matches =
errorSearcher.findRuleMatchesOnIndex(rule1, Language.ENGLISH, indexSearcher);
+ assertEquals(1, matches.size());
+ assertEquals("RULE1", matches.get(0).getRule().getId());
+ } finally {
+ indexSearcher.close();
+ }
+ }
+
}
Modified:
trunk/JLanguageTool/src/test/org/languagetool/dev/index/PatternRuleQueryBuilderTest.java
===================================================================
---
trunk/JLanguageTool/src/test/org/languagetool/dev/index/PatternRuleQueryBuilderTest.java
2012-06-02 00:36:52 UTC (rev 7151)
+++
trunk/JLanguageTool/src/test/org/languagetool/dev/index/PatternRuleQueryBuilderTest.java
2012-06-02 00:47:45 UTC (rev 7152)
@@ -89,8 +89,8 @@
final List<PatternRule> rules = ruleLoader.getRules(input, "test.xml");
final PatternRuleQueryBuilder patternRuleQueryBuilder = new
PatternRuleQueryBuilder();
- final Query query1 = patternRuleQueryBuilder.buildQuery(rules.get(0),
true);
- final Query query2 = patternRuleQueryBuilder.buildQuery(rules.get(0),
false);
+ final Query query1 = patternRuleQueryBuilder.buildQuery(rules.get(0));
+ final Query query2 =
patternRuleQueryBuilder.buildPossiblyRelaxedQuery(rules.get(0));
assertEquals(query1, query2);
assertEquals(1, searcher.search(query1, null, 1000).totalHits);
assertEquals(1, searcher.search(query2, null, 1000).totalHits);
@@ -125,16 +125,16 @@
final List<PatternRule> rules = ruleLoader.getRules(input, "test.xml");
final PatternRuleQueryBuilder patternRuleQueryBuilder = new
PatternRuleQueryBuilder();
- Query query = patternRuleQueryBuilder.buildQuery(rules.get(0), true);
+ Query query = patternRuleQueryBuilder.buildQuery(rules.get(0));
assertEquals(1, searcher.search(query, null, 1000).totalHits);
- query = patternRuleQueryBuilder.buildQuery(rules.get(1), true);
+ query = patternRuleQueryBuilder.buildQuery(rules.get(1));
assertEquals(0, searcher.search(query, null, 1000).totalHits);
- query = patternRuleQueryBuilder.buildQuery(rules.get(2), true);
+ query = patternRuleQueryBuilder.buildQuery(rules.get(2));
assertEquals(1, searcher.search(query, null, 1000).totalHits);
- query = patternRuleQueryBuilder.buildQuery(rules.get(3), true);
+ query = patternRuleQueryBuilder.buildQuery(rules.get(3));
assertEquals(1, searcher.search(query, null, 1000).totalHits);
}
@@ -153,15 +153,12 @@
final PatternRuleQueryBuilder patternRuleQueryBuilder = new
PatternRuleQueryBuilder();
List<PatternRule> rules = ruleLoader.getRules(input, "test.xml");
try {
- patternRuleQueryBuilder.buildQuery(rules.get(0), true);
+ patternRuleQueryBuilder.buildQuery(rules.get(0));
fail("Exception should be thrown for unsupported PatternRule");
} catch (UnsupportedPatternRuleException expected) {}
- try {
- patternRuleQueryBuilder.buildQuery(rules.get(0), false);
- } catch (UnsupportedPatternRuleException e) {
- fail("Exception should not be thrown, if not checkUnsupportedRule");
- }
+ patternRuleQueryBuilder.buildPossiblyRelaxedQuery(rules.get(0));
+
sb = new StringBuilder();
sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?> <rules lang=\"en\">
<category name=\"Test\"> <rule id=\"TEST_RULE\" name=\"test\"> <pattern>");
@@ -172,49 +169,11 @@
rules = ruleLoader.getRules(input, "test.xml");
try {
- patternRuleQueryBuilder.buildQuery(rules.get(0), true);
+ patternRuleQueryBuilder.buildQuery(rules.get(0));
fail("Exception should be thrown for unsupported PatternRule");
} catch (UnsupportedPatternRuleException expected) {}
- try {
- patternRuleQueryBuilder.buildQuery(rules.get(0), false);
- } catch (UnsupportedPatternRuleException e) {
- fail("Exception should not be thrown, if not checkUnsupportedRule");
- }
-
+ patternRuleQueryBuilder.buildPossiblyRelaxedQuery(rules.get(0));
}
- /*
- * public void testAllPatternRules() throws IOException {
- * System.out.println("\nStatistics information for supported rule ratio of
each language:"); int
- * successAll = 0; int failAll = 0; HashMap<String, Integer> messagesAll =
new HashMap<String,
- * Integer>();
- *
- * for (Language language : Language.LANGUAGES) { final PatternRuleLoader
ruleLoader = new
- * PatternRuleLoader(); final String name = "/" + language.getShortName() +
"/grammar.xml"; final
- * List<PatternRule> rules =
ruleLoader.getRules(JLanguageTool.getDataBroker()
- * .getFromRulesDirAsStream(name), name); int success = 0; int fail = 0;
HashMap<String, Integer>
- * messages = new HashMap<String, Integer>();
- *
- * for (PatternRule rule : rules) {
- *
- * try { PatternRuleQueryBuilder.buildQuery((PatternRule) rule, true);
success++; } catch
- * (UnsupportedPatternRuleException e) { if (messages.get(e.getMessage()) ==
null) {
- * messages.put(e.getMessage(), 0); } messages.put(e.getMessage(),
messages.get(e.getMessage()) +
- * 1);
- *
- * fail++; }
- *
- * } System.out.println("\t" + language.getName() + " ratio: " + (float)
success / (success +
- * fail) + " (failure:" + fail + ")"); for (Entry<String, Integer> entry :
messages.entrySet()) {
- * System.out.println("\t\t" + entry.getKey() + ": " + entry.getValue()); }
- *
- * successAll += success; failAll += fail; } System.out.println("All
languages ratio: " + (float)
- * successAll / (successAll + failAll) + " (failure:" + failAll + ")");
- *
- * for (Entry<String, Integer> entry : messagesAll.entrySet()) {
System.out.println("\t" +
- * entry.getKey() + ": " + entry.getValue()); }
- *
- * }
- */
}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and
threat landscape has changed and how IT managers can respond. Discussions
will include endpoint security, mobile security and the latest in malware
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Languagetool-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/languagetool-cvs