blob: 1e5c0f25bd28347ee130b6f44f288b043887b2f4 [file] [log] [blame]
/*
* 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.
*/
package org.apache.sling.feature.cpconverter.index;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.entry;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.jcr.NamespaceRegistry;
import javax.jcr.PropertyType;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonString;
import javax.json.JsonValue;
import javax.json.stream.JsonParser;
import org.apache.jackrabbit.spi.NameFactory;
import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl;
import org.apache.jackrabbit.util.Base64;
import org.apache.jackrabbit.vault.util.DocViewNode2;
import org.apache.jackrabbit.vault.util.DocViewProperty2;
import org.assertj.core.api.Condition;
import org.junit.Before;
import org.junit.Test;
public class IndexDefinitionsJsonWriterTest {
// copied from oak-spi-core/NamespaceConstants to not add a dependency on Oak
private static final String PREFIX_OAK = "oak";
private static final String NAMESPACE_OAK = "http://jackrabbit.apache.org/oak/ns/1.0";
private NameFactory nameFactory;
private IndexDefinitions definitions;
@Before
public void setUp() {
nameFactory = NameFactoryImpl.getInstance();
definitions = new IndexDefinitions();
definitions.registerPrefixMapping(NamespaceRegistry.PREFIX_NT, NamespaceRegistry.NAMESPACE_NT);
definitions.registerPrefixMapping(NamespaceRegistry.PREFIX_JCR, NamespaceRegistry.NAMESPACE_JCR);
definitions.registerPrefixMapping(PREFIX_OAK, NAMESPACE_OAK);
}
@Test
public void emptyInput() throws IOException {
JsonObject root = generateAndParse(definitions);
assertThat(root).as("index definitions").isEmpty();
}
@Test
public void propertyIndexDefinition() throws IOException {
Collection<DocViewProperty2> fooProps = new ArrayList<>();
fooProps.add(new DocViewProperty2(nameFactory.create("{}type"), "property"));
fooProps.add(new DocViewProperty2(nameFactory.create(NamespaceRegistry.NAMESPACE_JCR, "primaryType"), PREFIX_OAK+":QueryIndexDefinition"));
fooProps.add(new DocViewProperty2(nameFactory.create("{}reindex"), Boolean.FALSE.toString(), PropertyType.BOOLEAN));
fooProps.add(new DocViewProperty2(nameFactory.create("{}reindexCount"), "1", PropertyType.LONG));
definitions.addNode("/oak:index", new DocViewNode2(nameFactory.create("{}foo"), fooProps));
Collection<DocViewProperty2> barProps = new ArrayList<>();
barProps.add(new DocViewProperty2(nameFactory.create("{}type"), "property"));
barProps.add(new DocViewProperty2(nameFactory.create(NamespaceRegistry.NAMESPACE_JCR, "primaryType"), PREFIX_OAK+":QueryIndexDefinition"));
barProps.add(new DocViewProperty2(nameFactory.create("{}reindex"), Boolean.TRUE.toString(), PropertyType.BOOLEAN));
barProps.add(new DocViewProperty2(nameFactory.create("{}reindexCount"), "25", PropertyType.LONG));
definitions.addNode("/oak:index", new DocViewNode2(nameFactory.create("{}bar"), barProps));
JsonObject root = generateAndParse(definitions);
assertThat(root).as("indexDefinitions")
.hasSize(2)
.hasEntrySatisfying("/oak:index/foo", Conditions.isJsonObject())
.hasEntrySatisfying("/oak:index/bar", Conditions.isJsonObject());
JsonObject fooIndex = root.getJsonObject("/oak:index/foo");
assertThat(fooIndex).as("foo index")
.hasSize(4)
.contains(entry("type", Json.createValue("str:property")))
.contains(entry("jcr:primaryType", Json.createValue("nam:oak:QueryIndexDefinition")))
.contains(entry("reindex", JsonObject.FALSE))
.contains(entry("reindexCount", Json.createValue(1)));
}
@Test
public void luceneIndexDefinitionWithTikaConfig() throws IOException {
String configXmlFileContents = "<properties/>";
// lucene index
Collection<DocViewProperty2> luceneProps = new ArrayList<>();
luceneProps.add(new DocViewProperty2(nameFactory.create("{}type"), "lucene"));
luceneProps.add(new DocViewProperty2(nameFactory.create(NamespaceRegistry.NAMESPACE_JCR, "primaryType"), PREFIX_OAK+":QueryIndexDefinition"));
luceneProps.add(new DocViewProperty2(nameFactory.create("{}reindex"), Boolean.FALSE.toString(), PropertyType.BOOLEAN));
luceneProps.add(new DocViewProperty2(nameFactory.create("{}reindexCount"), "1", PropertyType.LONG));
luceneProps.add(new DocViewProperty2(nameFactory.create("{}includePropertyTypes"), Arrays.asList("String", "Binary"), PropertyType.STRING));
definitions.addNode("/oak:index", new DocViewNode2(nameFactory.create("{}lucene"), luceneProps));
// index rules node
List<DocViewProperty2> indexRulesProps = Collections.singletonList(new DocViewProperty2(nameFactory.create(NamespaceRegistry.NAMESPACE_JCR, "primaryType"), "nt:unstructured"));
definitions.addNode("/oak:index/lucene", new DocViewNode2(nameFactory.create("{}indexRules"), indexRulesProps));
// tika node
List<DocViewProperty2> tikaProps = Collections.singletonList(new DocViewProperty2(nameFactory.create(NamespaceRegistry.NAMESPACE_JCR, "primaryType"), "nt:unstructured"));
definitions.addNode("/oak:index/lucene", new DocViewNode2(nameFactory.create("{}tika"), tikaProps));
// tika config.xml node
List<DocViewProperty2> configXmlProps = Collections.singletonList(new DocViewProperty2(nameFactory.create(NamespaceRegistry.NAMESPACE_JCR, "primaryType"), "nt:file"));
definitions.addNode("/oak:index/lucene/tika", new DocViewNode2(nameFactory.create("{}config.xml"), configXmlProps));
definitions.registerBinary("/oak:index/lucene/tika/config.xml", new ByteArrayInputStream(configXmlFileContents.getBytes(StandardCharsets.UTF_8)));
// tika config.xml jcr:content node
List<DocViewProperty2> jcrContentProps = Collections.singletonList(new DocViewProperty2(nameFactory.create(NamespaceRegistry.NAMESPACE_JCR, "primaryType"), "nt:resource"));
definitions.addNode("/oak:index/lucene/tika/config.xml", new DocViewNode2(nameFactory.create(NamespaceRegistry.NAMESPACE_JCR, "resource"), jcrContentProps));
JsonObject root = generateAndParse(definitions);
System.out.println(root);
assertThat(root).as("root index")
.hasEntrySatisfying("/oak:index/lucene", Conditions.isJsonObject());
JsonObject lucene = root.getJsonObject("/oak:index/lucene");
assertThat(lucene).as("lucene index")
.hasEntrySatisfying("tika", Conditions.isJsonObject());
JsonObject tika = lucene.getJsonObject("tika");
assertThat(tika).as("tika node index")
.hasEntrySatisfying("config.xml", Conditions.isJsonObject());
JsonObject configNode = tika.getJsonObject("config.xml");
assertThat(configNode).as("config node")
.hasEntrySatisfying("jcr:resource", Conditions.isJsonObject());
JsonObject jcrResource = configNode.getJsonObject("jcr:resource");
JsonString binaryEntry = jcrResource.getJsonString("jcr:data");
assertThat(binaryEntry).as("config.xml blob")
.hasFieldOrPropertyWithValue("string", ":blobid:" + Base64.encode(configXmlFileContents));
}
private JsonObject generateAndParse(IndexDefinitions definitions) throws IOException {
IndexDefinitionsJsonWriter writer = new IndexDefinitionsJsonWriter(definitions);
ByteArrayOutputStream out = new ByteArrayOutputStream();
writer.writeAsJson(out);
JsonParser parser = Json.createParser(new ByteArrayInputStream(out.toByteArray()));
JsonObject root = parser.getObject();
return root;
}
static class Conditions {
public static Condition<JsonValue> isJsonObject() {
return new Condition<JsonValue>("Is a " + JsonObject.class.getSimpleName()) {
@Override
public boolean matches(JsonValue value) {
return value instanceof JsonObject;
}
};
}
}
}