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