You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ch...@apache.org on 2015/08/17 10:20:21 UTC
svn commit: r1696208 - in /jackrabbit/oak/trunk/oak-examples/webapp/src/main:
java/org/apache/jackrabbit/j2ee/ webapp/WEB-INF/templates/
Author: chetanm
Date: Mon Aug 17 08:20:20 2015
New Revision: 1696208
URL: http://svn.apache.org/r1696208
Log:
OAK-3237 - Configure default index definition for fulltext search
Added support for creating a fulltext index definition when repository is created from scratch. The logic to configure the default index can be disabled via bootstrap config `repository.create.default.indexes`.
Added:
jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/IndexInitializer.java (with props)
Modified:
jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/BootstrapConfig.java
jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java
jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/templates/bootstrap.properties
Modified: jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/BootstrapConfig.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/BootstrapConfig.java?rev=1696208&r1=1696207&r2=1696208&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/BootstrapConfig.java (original)
+++ jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/BootstrapConfig.java Mon Aug 17 08:20:20 2015
@@ -50,6 +50,8 @@ public class BootstrapConfig extends Abs
//By default shutdown framework if there is a timeout
private boolean shutdownOnTimeout = true;
+ private boolean repositoryCreateDefaultIndexes = true;
+
private int startupTimeout = (int) TimeUnit.MINUTES.toSeconds(5); //Default 5 minute timeout
private JNDIConfig jndiConfig = new JNDIConfig(this);
@@ -124,6 +126,14 @@ public class BootstrapConfig extends Abs
this.startupTimeout = startupTimeout;
}
+ public boolean isRepositoryCreateDefaultIndexes() {
+ return repositoryCreateDefaultIndexes;
+ }
+
+ public void setRepositoryCreateDefaultIndexes(boolean repositoryCreateDefaultIndexes) {
+ this.repositoryCreateDefaultIndexes = repositoryCreateDefaultIndexes;
+ }
+
public void validate() {
valid = repositoryName != null;
jndiConfig.validate();
Added: jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/IndexInitializer.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/IndexInitializer.java?rev=1696208&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/IndexInitializer.java (added)
+++ jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/IndexInitializer.java Mon Aug 17 08:20:20 2015
@@ -0,0 +1,133 @@
+/*
+ * 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.jackrabbit.j2ee;
+
+import java.security.Principal;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.Collections;
+
+import javax.jcr.Node;
+import javax.jcr.PropertyType;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.security.auth.Subject;
+
+import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.commons.JcrUtils;
+import org.apache.jackrabbit.oak.api.AuthInfo;
+import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
+import org.apache.jackrabbit.oak.plugins.index.lucene.IndexFormatVersion;
+import org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexConstants;
+import org.apache.jackrabbit.oak.spi.security.authentication.AuthInfoImpl;
+import org.apache.jackrabbit.oak.spi.security.principal.AdminPrincipal;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static java.util.Collections.singleton;
+
+/**
+ * IndexInitializer configures the repository with required fulltext index
+ *
+ */
+public class IndexInitializer {
+ private final Logger log = LoggerFactory.getLogger(getClass());
+ private final Repository repository;
+
+ public IndexInitializer(Repository repository) {
+ this.repository = repository;
+ }
+
+ public void initialize() throws RepositoryException{
+ Session s = createAdministrativeSession();
+ try{
+ if (!s.nodeExists("/oak:index/lucene")){
+ createFullTextIndex(s);
+ }
+ s.save();
+ } finally {
+ if (s != null) {
+ s.logout();
+ }
+ }
+ }
+
+ private void createFullTextIndex(Session s) throws RepositoryException {
+ String indexPath = "/oak:index/lucene";
+ Node lucene = JcrUtils.getOrCreateByPath(indexPath, JcrConstants.NT_UNSTRUCTURED,
+ "oak:QueryIndexDefinition", s, false);
+ lucene.setProperty("async", "async");
+ lucene.setProperty(IndexConstants.TYPE_PROPERTY_NAME, "lucene");
+ lucene.setProperty(LuceneIndexConstants.EVALUATE_PATH_RESTRICTION, true);
+ lucene.setProperty(LuceneIndexConstants.INDEX_PATH, indexPath);
+ lucene.setProperty(LuceneIndexConstants.COMPAT_MODE, IndexFormatVersion.V2.getVersion());
+
+ Node indexRules = lucene.addNode(LuceneIndexConstants.INDEX_RULES, JcrConstants.NT_UNSTRUCTURED);
+ Node ntBaseRule = indexRules.addNode(JcrConstants.NT_BASE);
+
+ //Fulltext index only includes property of type String and Binary
+ ntBaseRule.setProperty(LuceneIndexConstants.INCLUDE_PROPERTY_TYPES,
+ new String[] {PropertyType.TYPENAME_BINARY, PropertyType.TYPENAME_STRING});
+
+ Node propNode = ntBaseRule.addNode(LuceneIndexConstants.PROP_NODE);
+
+ Node allPropNode = propNode.addNode("allProps");
+ allPropNode.setProperty(LuceneIndexConstants.PROP_ANALYZED, true);
+ allPropNode.setProperty(LuceneIndexConstants.PROP_NODE_SCOPE_INDEX, true);
+ allPropNode.setProperty(LuceneIndexConstants.PROP_NAME, LuceneIndexConstants.REGEX_ALL_PROPS);
+ allPropNode.setProperty(LuceneIndexConstants.PROP_IS_REGEX, true);
+ allPropNode.setProperty(LuceneIndexConstants.PROP_USE_IN_SPELLCHECK, true);
+
+ //Create aggregates for nt:file
+ Node aggNode = lucene.addNode(LuceneIndexConstants.AGGREGATES);
+
+ Node aggFile = aggNode.addNode(JcrConstants.NT_FILE);
+ aggFile.addNode("include0").setProperty(LuceneIndexConstants.AGG_PATH, JcrConstants.JCR_CONTENT);
+
+ log.info("Created fulltext index definition at {}", indexPath);
+ }
+
+ private Session createAdministrativeSession() throws RepositoryException {
+ //Admin ID here can be any string and need not match the actual admin userId
+ final String adminId = "admin";
+ Principal admin = new AdminPrincipal() {
+ @Override
+ public String getName() {
+ return adminId;
+ }
+ };
+ AuthInfo authInfo = new AuthInfoImpl(adminId, null, singleton(admin));
+ Subject subject = new Subject(true, singleton(admin), singleton(authInfo), Collections.emptySet());
+ Session adminSession;
+ try {
+ adminSession = Subject.doAsPrivileged(subject, new PrivilegedExceptionAction<Session>() {
+ @Override
+ public Session run() throws Exception {
+ return repository.login();
+ }
+ }, null);
+ } catch (PrivilegedActionException e) {
+ throw new RepositoryException("failed to retrieve admin session.", e);
+ }
+
+ return adminSession;
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/IndexInitializer.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java?rev=1696208&r1=1696207&r2=1696208&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java (original)
+++ jackrabbit/oak/trunk/oak-examples/webapp/src/main/java/org/apache/jackrabbit/j2ee/RepositoryStartupServlet.java Mon Aug 17 08:20:20 2015
@@ -435,6 +435,9 @@ public class RepositoryStartupServlet ex
try {
repository = createRepository(configJson, repHome);
+ if (getBootstrapConfig().isRepositoryCreateDefaultIndexes()){
+ new IndexInitializer(repository).initialize();
+ }
} catch (RepositoryException e) {
throw new ServletExceptionWithCause("Error while creating repository", e);
}
Modified: jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/templates/bootstrap.properties
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/templates/bootstrap.properties?rev=1696208&r1=1696207&r2=1696208&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/templates/bootstrap.properties (original)
+++ jackrabbit/oak/trunk/oak-examples/webapp/src/main/webapp/WEB-INF/templates/bootstrap.properties Mon Aug 17 08:20:20 2015
@@ -29,6 +29,10 @@ shutdown.on.timeout=false
#Default timeout for waiting for repository service is 300 sec i.e. 5 min
startup.timeout=300
+#Configure default index definition to enable fulltext search
+#while creating the repository
+repository.create.default.indexes=true
+
# RMI Settings
rmi.enabled=true
rmi.port=0