You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2023/01/04 16:18:31 UTC
[sling-org-apache-sling-feature-cpconverter] branch master updated: SLING-11739 Index definition extraction from content packages is missing binary files data (#152)
This is an automated email from the ASF dual-hosted git repository.
rombert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-feature-cpconverter.git
The following commit(s) were added to refs/heads/master by this push:
new 68e81c3 SLING-11739 Index definition extraction from content packages is missing binary files data (#152)
68e81c3 is described below
commit 68e81c3f511298600830d37642cc467034723168
Author: Abhishek Garg <ab...@gmail.com>
AuthorDate: Wed Jan 4 21:48:25 2023 +0530
SLING-11739 Index definition extraction from content packages is missing binary files data (#152)
Co-authored-by: abhigarg <ab...@adobe.com>
---
.../index/IndexDefinitionsJsonWriter.java | 5 +-
.../handlers/IndexDefinitionsEntryHandlerTest.java | 57 +++++++++++++++++++
.../index/IndexDefinitionsJsonWriterTest.java | 3 +-
.../index_with_stopwards/META-INF/vault/filter.xml | 20 +++++++
.../META-INF/vault/nodetypes.cnd | 24 ++++++++
.../META-INF/vault/properties.xml | 34 +++++++++++
.../index_with_stopwards/jcr_root/.content.xml | 21 +++++++
.../jcr_root/_oak_index/lucene-custom/.content.xml | 65 ++++++++++++++++++++++
.../default/filters/KeywordMarker/protwords.txt | 17 ++++++
.../analyzers/default/filters/Stop/stopwords.txt | 17 ++++++
.../analyzers/default/filters/Stop/stopwords_2.txt | 17 ++++++
.../analyzers/default/filters/Synonym/synonyms.txt | 18 ++++++
12 files changed, 294 insertions(+), 4 deletions(-)
diff --git a/src/main/java/org/apache/sling/feature/cpconverter/index/IndexDefinitionsJsonWriter.java b/src/main/java/org/apache/sling/feature/cpconverter/index/IndexDefinitionsJsonWriter.java
index aefd226..a75e72c 100644
--- a/src/main/java/org/apache/sling/feature/cpconverter/index/IndexDefinitionsJsonWriter.java
+++ b/src/main/java/org/apache/sling/feature/cpconverter/index/IndexDefinitionsJsonWriter.java
@@ -131,16 +131,17 @@ public class IndexDefinitionsJsonWriter {
}
}
+ String nodePath = parentPath + "/" + nodeName; // NOSONAR - java:S1075 does not apply as this is not a filesystem path
+
// 3. write nt:data entries for nt:resource children of nt:files
// in this case, this is the nt:resource node
- Optional<byte[]> binary = indexDefinitions.getBinary(parentPath);
+ Optional<byte[]> binary = indexDefinitions.getBinary(nodePath);
if ( binary.isPresent() ) {
String blobAsString = new String(binary.get(), StandardCharsets.UTF_8);
write(json, "jcr:data", Collections.singletonList(blobAsString), BLOB_MAPPER);
};
// 4. write children
- String nodePath = parentPath + "/" + nodeName; // NOSONAR - java:S1075 does not apply as this is not a filesystem path
for ( DocViewNode2 child : indexDefinitions.getChildren(nodePath)) {
write(json, child, nodePath);
}
diff --git a/src/test/java/org/apache/sling/feature/cpconverter/handlers/IndexDefinitionsEntryHandlerTest.java b/src/test/java/org/apache/sling/feature/cpconverter/handlers/IndexDefinitionsEntryHandlerTest.java
index 8425951..48d6c18 100644
--- a/src/test/java/org/apache/sling/feature/cpconverter/handlers/IndexDefinitionsEntryHandlerTest.java
+++ b/src/test/java/org/apache/sling/feature/cpconverter/handlers/IndexDefinitionsEntryHandlerTest.java
@@ -20,6 +20,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import java.io.ByteArrayInputStream;
import java.io.IOException;
+import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -169,7 +170,63 @@ public class IndexDefinitionsEntryHandlerTest {
assertIsValidXml(tikaConfig);
}
+ @Test
+ public void handleIndexDefinitionWithStopwordsInAnalyzer() throws IOException, ConverterException, ParserConfigurationException, SAXException {
+ DefaultIndexManager manager = new DefaultIndexManager();
+
+ traverseForIndexing(manager, "index_with_stopwards");
+
+ IndexDefinitions defs = manager.getIndexes();
+ Map<String, List<DocViewNode2>> indexes = defs.getIndexes();
+
+ assertThat(indexes).as("index definitions")
+ .hasSize(1)
+ .containsKey("/oak:index");
+
+ List<DocViewNode2> rootIndexes = indexes.get("/oak:index");
+ assertThat(rootIndexes).as("root indexes")
+ .hasSize(1);
+ assertThat(rootIndexes).as("index definitions")
+ .hasSize(1)
+ .element(0)
+ .has(Conditions.localName("lucene-custom"));
+
+ DocViewNode2 luceneCustom = rootIndexes.get(0);
+ assertThat(luceneCustom).as("lucene index definition")
+ .has(Conditions.childWithLocalName("/oak:index/lucene-custom", "analyzers", defs));
+
+ List<DocViewNode2> luceneCustomChildren = defs.getChildren("/oak:index/lucene-custom");
+ assertThat(luceneCustomChildren).as("lucene index definition children")
+ .hasSize(1);
+
+ DocViewNode2 analyzersConfigNode = luceneCustomChildren.stream()
+ .filter( c -> c.getName().getLocalName().equals("analyzers") )
+ .findFirst()
+ .get();
+
+ assertThat(analyzersConfigNode).as("analyzers config node for stop words")
+ .has(Conditions.childWithLocalName("/oak:index/lucene-custom/analyzers/default/filters/Stop","stopwords.txt", defs));
+ byte[] stopwordsConfig = defs.getBinary("/oak:index/lucene-custom/analyzers/default/filters/Stop/stopwords.txt").get();
+ assertThat(stopwordsConfig).as("stopwordsConfig is ").isNotNull();
+ assertThat(new String(stopwordsConfig, StandardCharsets.UTF_8)).as("stopwordsConfig contains stopwords").contains("stopword");
+ byte[] stopwords_2_Config = defs.getBinary("/oak:index/lucene-custom/analyzers/default/filters/Stop/stopwords_2.txt").get();
+ assertThat(stopwords_2_Config).as("stopwords__2Config is ").isNotNull();
+ assertThat(new String(stopwords_2_Config, StandardCharsets.UTF_8)).as("stopwordsConfig contains stopword2 ").contains("stopword2");
+
+ assertThat(analyzersConfigNode).as("analyzers config node for prowords")
+ .has(Conditions.childWithLocalName("/oak:index/lucene-custom/analyzers/default/filters/KeywordMarker","protwords.txt", defs));
+ byte[] keywordMarkerConfig = defs.getBinary("/oak:index/lucene-custom/analyzers/default/filters/KeywordMarker/protwords.txt").get();
+ assertThat(keywordMarkerConfig).as("keywordMarkerConfig is ").isNotNull();
+ assertThat(new String(keywordMarkerConfig, StandardCharsets.UTF_8)).as("keywordMarkerConfig contains protwords ").contains("protwords");
+
+ assertThat(analyzersConfigNode).as("analyzers config node dor Synonyms")
+ .has(Conditions.childWithLocalName("/oak:index/lucene-custom/analyzers/default/filters/Synonym","synonyms.txt", defs));
+ byte[] synonymConfig = defs.getBinary("/oak:index/lucene-custom/analyzers/default/filters/Synonym/synonyms.txt").get();
+ assertThat(synonymConfig).as("synonymConfig is ").isNotNull();
+ assertThat(new String(synonymConfig, StandardCharsets.UTF_8)).as("synonymConfig contains synonyms ").contains("synonyms");
+
+ }
@Test
public void handleIndexDefinitionUnderNonRootPath() throws IOException, ConverterException {
diff --git a/src/test/java/org/apache/sling/feature/cpconverter/index/IndexDefinitionsJsonWriterTest.java b/src/test/java/org/apache/sling/feature/cpconverter/index/IndexDefinitionsJsonWriterTest.java
index f045929..903ed6e 100644
--- a/src/test/java/org/apache/sling/feature/cpconverter/index/IndexDefinitionsJsonWriterTest.java
+++ b/src/test/java/org/apache/sling/feature/cpconverter/index/IndexDefinitionsJsonWriterTest.java
@@ -177,8 +177,7 @@ public class IndexDefinitionsJsonWriterTest {
assertThat(configNode).as("config node")
.hasEntrySatisfying("jcr:resource", Conditions.isJsonObject());
- JsonObject jcrResource = configNode.getJsonObject("jcr:resource");
- JsonString binaryEntry = jcrResource.getJsonString("jcr:data");
+ JsonString binaryEntry = configNode.getJsonString("jcr:data");
assertThat(binaryEntry).as("config.xml blob")
.hasFieldOrPropertyWithValue("string", ":blobid:" + Base64.encode(configXmlFileContents));
}
diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/META-INF/vault/filter.xml b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/META-INF/vault/filter.xml
new file mode 100644
index 0000000..1da236d
--- /dev/null
+++ b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/META-INF/vault/filter.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<workspaceFilter version="1.0">
+ <filter root="/oak:index/lucene-custom"/>
+</workspaceFilter>
diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/META-INF/vault/nodetypes.cnd b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/META-INF/vault/nodetypes.cnd
new file mode 100644
index 0000000..82c6bd6
--- /dev/null
+++ b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/META-INF/vault/nodetypes.cnd
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+<'sling'='http://sling.apache.org/jcr/sling/1.0'>
+<'nt'='http://www.jcp.org/jcr/nt/1.0'>
+
+[sling:Folder] > nt:folder
+ - * (undefined)
+ - * (undefined) multiple
+ + * (nt:base) = sling:Folder version
+
diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/META-INF/vault/properties.xml b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/META-INF/vault/properties.xml
new file mode 100644
index 0000000..1032a7f
--- /dev/null
+++ b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/META-INF/vault/properties.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
+<properties>
+<comment>FileVault Package Properties</comment>
+<entry key="createdBy">admin</entry>
+<entry key="name">index_single_file</entry>
+<entry key="lastModified">2011-11-15T09:45:14.664+01:00</entry>
+<entry key="lastModifiedBy">admin</entry>
+<entry key="created">2011-11-15T09:45:14.685+01:00</entry>
+<entry key="buildCount">1</entry>
+<entry key="version"/>
+<entry key="dependencies"/>
+<entry key="packageFormatVersion">2</entry>
+<entry key="description"/>
+<entry key="lastWrapped">2011-11-15T09:45:14.664+01:00</entry>
+<entry key="group"/>
+<entry key="lastWrappedBy">admin</entry>
+</properties>
diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/.content.xml b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/.content.xml
new file mode 100644
index 0000000..741d31d
--- /dev/null
+++ b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/.content.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:rep="internal" xmlns:sling="http://sling.apache.org/jcr/sling/1.0"
+ jcr:primaryType="rep:root"
+ sling:resourceType="sling:redirect"
+ sling:target="/starter.html"/>
diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/_oak_index/lucene-custom/.content.xml b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/_oak_index/lucene-custom/.content.xml
new file mode 100644
index 0000000..02475fc
--- /dev/null
+++ b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/_oak_index/lucene-custom/.content.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<jcr:root xmlns:oak="http://jackrabbit.apache.org/oak/ns/1.0" xmlns:cq="http://www.day.com/jcr/cq/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
+ jcr:primaryType="oak:QueryIndexDefinition"
+ async="[async,nrt]"
+ compatVersion="{Long}2"
+ evaluatePathRestrictions="{Boolean}true"
+ includedPaths="[/content/indexTest/es]"
+ name="cq:Page"
+ type="lucene">
+ <analyzers jcr:primaryType="nt:unstructured">
+ <default jcr:primaryType="nt:unstructured">
+ <tokenizer
+ jcr:primaryType="nt:unstructured"
+ name="Standard"/>
+ <charFilters jcr:primaryType="nt:unstructured">
+ <Mapping
+ jcr:primaryType="nt:unstructured"
+ mapping="mapping-ISOLatin1Accent.txt">
+ <mapping-ISOLatin1Accent.txt/>
+ </Mapping>
+ <HTMLStrip jcr:primaryType="nt:unstructured"/>
+ </charFilters>
+ <filters jcr:primaryType="nt:unstructured">
+ <LowerCase jcr:primaryType="nt:unstructured"/>
+ <Synonym
+ jcr:primaryType="nt:unstructured"
+ expand="true"
+ format="solr"
+ synonyms="synonyms.txt"
+ tokenizerFactory="standard">
+ <synonyms.txt/>
+ </Synonym>
+ <Stop
+ jcr:primaryType="nt:unstructured"
+ enablePositionIncrements="true"
+ ignoreCase="true"
+ words="stopwords.txt">
+ <stopwords.txt/>
+ </Stop>
+ <SpanishLightStem jcr:primaryType="nt:unstructured"/>
+ <KeywordMarker
+ jcr:primaryType="nt:unstructured"
+ protected="protwords.txt">
+ <protwords.txt/>
+ </KeywordMarker>
+ </filters>
+ </default>
+ </analyzers>
+</jcr:root>
diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/_oak_index/lucene-custom/analyzers/default/filters/KeywordMarker/protwords.txt b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/_oak_index/lucene-custom/analyzers/default/filters/KeywordMarker/protwords.txt
new file mode 100644
index 0000000..2a5cb92
--- /dev/null
+++ b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/_oak_index/lucene-custom/analyzers/default/filters/KeywordMarker/protwords.txt
@@ -0,0 +1,17 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+ protwords
\ No newline at end of file
diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/_oak_index/lucene-custom/analyzers/default/filters/Stop/stopwords.txt b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/_oak_index/lucene-custom/analyzers/default/filters/Stop/stopwords.txt
new file mode 100644
index 0000000..9150669
--- /dev/null
+++ b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/_oak_index/lucene-custom/analyzers/default/filters/Stop/stopwords.txt
@@ -0,0 +1,17 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+stopword1
\ No newline at end of file
diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/_oak_index/lucene-custom/analyzers/default/filters/Stop/stopwords_2.txt b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/_oak_index/lucene-custom/analyzers/default/filters/Stop/stopwords_2.txt
new file mode 100644
index 0000000..3faa2f8
--- /dev/null
+++ b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/_oak_index/lucene-custom/analyzers/default/filters/Stop/stopwords_2.txt
@@ -0,0 +1,17 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+stopword2
\ No newline at end of file
diff --git a/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/_oak_index/lucene-custom/analyzers/default/filters/Synonym/synonyms.txt b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/_oak_index/lucene-custom/analyzers/default/filters/Synonym/synonyms.txt
new file mode 100644
index 0000000..8f0e62c
--- /dev/null
+++ b/src/test/resources/org/apache/sling/feature/cpconverter/handlers/index/index_with_stopwards/jcr_root/_oak_index/lucene-custom/analyzers/default/filters/Synonym/synonyms.txt
@@ -0,0 +1,18 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+# Synonym mappings can be used for spelling correction too
+tool => synonyms
\ No newline at end of file