diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/beans/AdditionalURIsToIndex.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/beans/AdditionalURIsToIndex.java deleted file mode 100644 index ce99b4628..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/beans/AdditionalURIsToIndex.java +++ /dev/null @@ -1,15 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.webapp.search.beans; - -import java.util.List; - -import com.hp.hpl.jena.rdf.model.Statement; - -/** - * Interface to use with IndexBuilder to find more URIs to index given a changed statement. - * The stmt may have been added or removed from the model. - */ -public interface AdditionalURIsToIndex { - List findAdditionalURIsToIndex(Statement stmt); -} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/beans/StatementToURIsToUpdate.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/beans/StatementToURIsToUpdate.java new file mode 100644 index 000000000..8360f6639 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/beans/StatementToURIsToUpdate.java @@ -0,0 +1,25 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.search.beans; + +import java.util.List; + +import com.hp.hpl.jena.rdf.model.Statement; + +/** + * Interface to use with IndexBuilder to find more URIs to index given a changed statement. + * The statement may have been added or removed from the model. + */ +public interface StatementToURIsToUpdate { + + /** + * For the domain that is the responsibility of the given implementation, + * calculate the URIs that need to be updated in the search index. + * The URIs in the list will be updated by the IndexBuilder, which will + * handle URIs of new individuals, URIs of individuals that have changes, + * and URIs of individuals that have been removed from the model. + * + * @return List of URIs. + */ + List findAdditionalURIsToIndex(Statement stmt); +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForClassGroupChanges.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForClassGroupChanges.java index 1f3aaac19..cd6618bd1 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForClassGroupChanges.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForClassGroupChanges.java @@ -15,7 +15,7 @@ import com.hp.hpl.jena.shared.Lock; import com.hp.hpl.jena.vocabulary.RDF; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; -import edu.cornell.mannlib.vitro.webapp.search.beans.AdditionalURIsToIndex; +import edu.cornell.mannlib.vitro.webapp.search.beans.StatementToURIsToUpdate; /** * If a class changes classgroups, then all members of that class @@ -29,7 +29,7 @@ import edu.cornell.mannlib.vitro.webapp.search.beans.AdditionalURIsToIndex; * changes, all members of the class core:Summer need to be update so they get the new classgroup values. */ public class AdditionalURIsForClassGroupChanges implements - AdditionalURIsToIndex { + StatementToURIsToUpdate { private OntModel model; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForContextNodes.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForContextNodes.java index 41588b0e0..e544b732a 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForContextNodes.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForContextNodes.java @@ -25,9 +25,9 @@ import com.hp.hpl.jena.rdf.model.ResourceFactory; import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.shared.Lock; -import edu.cornell.mannlib.vitro.webapp.search.beans.AdditionalURIsToIndex; +import edu.cornell.mannlib.vitro.webapp.search.beans.StatementToURIsToUpdate; -public class AdditionalURIsForContextNodes implements AdditionalURIsToIndex { +public class AdditionalURIsForContextNodes implements StatementToURIsToUpdate { private OntModel model; private static final List multiValuedQueriesForAgent = new ArrayList(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForDataProperties.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForDataProperties.java new file mode 100644 index 000000000..ef08177b1 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForDataProperties.java @@ -0,0 +1,22 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.search.indexing; + +import java.util.Collections; +import java.util.List; + +import com.hp.hpl.jena.rdf.model.Statement; + +import edu.cornell.mannlib.vitro.webapp.search.beans.StatementToURIsToUpdate; + +public class AdditionalURIsForDataProperties implements StatementToURIsToUpdate{ + + @Override + public List findAdditionalURIsToIndex(Statement stmt) { + if( stmt != null && stmt.getObject().isLiteral() && stmt.getSubject().getURI() != null ) + return Collections.singletonList( stmt.getSubject().getURI() ); + else + return Collections.emptyList(); + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForObjectProperties.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForObjectProperties.java index 4d14dafbc..95d702768 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForObjectProperties.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForObjectProperties.java @@ -26,7 +26,7 @@ import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.shared.Lock; import com.hp.hpl.jena.vocabulary.RDFS; -import edu.cornell.mannlib.vitro.webapp.search.beans.AdditionalURIsToIndex; +import edu.cornell.mannlib.vitro.webapp.search.beans.StatementToURIsToUpdate; /** * For a given statement, return the URIs that may need to be updated in @@ -35,7 +35,7 @@ import edu.cornell.mannlib.vitro.webapp.search.beans.AdditionalURIsToIndex; * * Context nodes are not handled here. They are taken care of in AdditionalURIsForContextNodex. */ -public class AdditionalURIsForObjectProperties implements AdditionalURIsToIndex { +public class AdditionalURIsForObjectProperties implements StatementToURIsToUpdate { protected static final Log log = LogFactory.getLog(AdditionalURIsForObjectProperties.class); protected Model model; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/IndexBuilder.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/IndexBuilder.java index 19e5312b6..dc87776cb 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/IndexBuilder.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/IndexBuilder.java @@ -7,8 +7,8 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; -import java.util.Set; import javax.servlet.ServletContext; @@ -16,11 +16,13 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.hp.hpl.jena.query.QueryParseException; +import com.hp.hpl.jena.rdf.model.Statement; import edu.cornell.mannlib.vitro.webapp.beans.Individual; +import edu.cornell.mannlib.vitro.webapp.dao.IndividualDao; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; -import edu.cornell.mannlib.vitro.webapp.search.beans.AdditionalURIsToIndex; import edu.cornell.mannlib.vitro.webapp.search.beans.IndexerIface; +import edu.cornell.mannlib.vitro.webapp.search.beans.StatementToURIsToUpdate; /** @@ -31,42 +33,78 @@ import edu.cornell.mannlib.vitro.webapp.search.beans.IndexerIface; * * See the class SearchReindexingListener for an example of how a model change * listener can use an IndexBuilder to keep the full text index in sncy with - * updates to a model. It calls IndexBuilder.addToChangedUris(). - * - * @author bdc34 - * + * updates to a model. It calls IndexBuilder.addToChangedUris(). */ public class IndexBuilder extends Thread { private WebappDaoFactory wdf; - private final IndexerIface indexer; - private final ServletContext context; + private final IndexerIface indexer; + + /** Statements that have changed in the model. The SearchReindexingListener + * and other similar objects will use methods on IndexBuilder to add statements + * to this queue. This should only be accessed from blocks synchronized on + * the changedStmtQueue object. + */ + protected List changedStmtQueue; - /* changedUris should only be accessed from synchronized blocks */ - private HashSet changedUris = null; + /** This is the list of URIs that need to be updated in the search + * index. The IndexBuilder thread will process Statements in changedStmtQueue + * to create this set of URIs. + * This should only be accessed by the IndexBuilder thread. */ + private HashSet urisRequiringUpdate; - private List updatedInds = null; - private List deletedInds = null; + /** This is a list of objects that will compute what URIs need to be + * updated in the search index when a statement changes. */ + protected List stmtToURIsToIndexFunctions; - private boolean reindexRequested = false; + /** + * updatedUris will only be accessed from the IndexBuilder thread + * so it doesn't need to be synchronized. + */ + private List updatedUris = null; + /** + * deletedUris will only be accessed from the IndexBuilder thread + * so it doesn't need to be synchronized. + */ + private List deletedUris = null; + + /** + * Indicates that a full index re-build has been requested. + */ + private boolean reindexRequested = false; + + /** Indicates that a stop of the indexing objects has been requested. */ protected boolean stopRequested = false; + + /** Length of pause between a model change an the start of indexing. */ protected long reindexInterval = 1000 * 60 /* msec */ ; + /** Number of threads to use during indexing. */ protected int numberOfThreads = 10; - public static final boolean UPDATE_DOCS = false; - public static final boolean NEW_DOCS = true; + public static final int MAX_REINDEX_THREADS= 10; + public static final int MAX_UPDATE_THREADS= 10; + public static final int MAX_THREADS = Math.max( MAX_UPDATE_THREADS, MAX_REINDEX_THREADS); + + //public static final boolean UPDATE_DOCS = false; + //public static final boolean NEW_DOCS = true; private static final Log log = LogFactory.getLog(IndexBuilder.class); - public IndexBuilder( - ServletContext context, - IndexerIface indexer, - WebappDaoFactory wdf ){ + public IndexBuilder(IndexerIface indexer, + WebappDaoFactory wdf, + List stmtToURIsToIndexFunctions ){ super("IndexBuilder"); + this.indexer = indexer; - this.wdf = wdf; - this.context = context; - this.changedUris = new HashSet(); + this.wdf = wdf; + + if( stmtToURIsToIndexFunctions != null ) + this.stmtToURIsToIndexFunctions = stmtToURIsToIndexFunctions; + else + this.stmtToURIsToIndexFunctions = Collections.emptyList(); + + this.changedStmtQueue = new LinkedList(); + this.urisRequiringUpdate = new HashSet(); this.start(); } @@ -75,21 +113,32 @@ public class IndexBuilder extends Thread { this( null, null, null); } - public void setWdf(WebappDaoFactory wdf){ - this.wdf = wdf; - } - - public boolean isIndexing(){ - return indexer.isIndexing(); - } - + /** + * Use this method to add URIs that need to be indexed. Should be + * able to add to changedStmtQueue while indexing is in process. + * + * If you have a statement that has been added or removed from the + * RDF model and you would like it to take effect in the search + * index this is the method you should use. Follow the adding of + * your changes with a call to doUpdateIndex(). + */ + public void addToChanged(Statement stmt){ + synchronized(changedStmtQueue){ + changedStmtQueue.add(stmt); + } + } + + /** + * This method will cause the IndexBuilder to completely rebuild + * the index. + */ public synchronized void doIndexRebuild() { - //set flag for full index rebuild - this.reindexRequested = true; - //wake up - this.notifyAll(); + //set flag for full index rebuild + this.reindexRequested = true; + //wake up + this.notifyAll(); } - + /** * This will re-index Individuals that changed because of modtime or because they * were added with addChangedUris(). @@ -98,30 +147,11 @@ public class IndexBuilder extends Thread { //wake up thread and it will attempt to index anything in changedUris this.notifyAll(); } - - /** - * Use this method to add URIs that need to be indexed. - */ - public synchronized void addToChangedUris(String uri){ - changedUris.add(uri); - } - - /** - * Use this method to add URIs that need to be indexed. - */ - public synchronized void addToChangedUris(Collection uris){ - changedUris.addAll(uris); - } - - public synchronized boolean isReindexRequested() { - return reindexRequested; - } - - public synchronized boolean isThereWorkToDo(){ - return isReindexRequested() || ! changedUris.isEmpty() ; - } - - + + public boolean isIndexing(){ + return indexer.isIndexing(); + } + /** * This is called when the system shuts down. */ @@ -135,11 +165,11 @@ public class IndexBuilder extends Thread { public void run() { while(! stopRequested ){ try{ - if( !stopRequested && isReindexRequested() ){ + if( !stopRequested && reindexRequested ){ log.debug("full re-index requested"); indexRebuild(); }else if( !stopRequested && isThereWorkToDo() ){ - Thread.sleep(250); //wait a bit to let a bit more work to come into the queue + Thread.sleep(500); //wait a bit to let a bit more work to come into the queue log.debug("work found for IndexBuilder, starting update"); updatedIndex(); }else if( !stopRequested && ! isThereWorkToDo() ){ @@ -163,30 +193,47 @@ public class IndexBuilder extends Thread { /* ******************** non-public methods ************************* */ - private synchronized Collection getAndEmptyChangedUris(){ - Collection out = changedUris; - changedUris = new HashSet(); - return out; + private synchronized Collection getAndEmptyChangedStatements(){ + List localChangedStmt = null; + synchronized( changedStmtQueue ){ + localChangedStmt = new ArrayList(changedStmtQueue.size()); + localChangedStmt.addAll( changedStmtQueue ); + changedStmtQueue.clear(); + } + + Collection urisToUpdate = new HashSet(); + for( Statement stmt : localChangedStmt){ + if( stmt == null ) + continue; + for( StatementToURIsToUpdate stu : stmtToURIsToIndexFunctions ){ + urisToUpdate.addAll( stu.findAdditionalURIsToIndex(stmt) ); + } + } + + return urisToUpdate; } /** - * Sets updatedUris and deletedUris lists. + * Sets updatedUris and deletedUris lists from the changedStmtQueue. + * updatedUris and deletedUris will only be accessed from the IndexBuilder thread + * so they don't need to be synchronized. */ private void makeAddAndDeleteLists( Collection uris){ - + IndividualDao indDao = wdf.getIndividualDao(); + /* clear updateInds and deletedUris. This is the only method that should set these. */ - this.updatedInds = new ArrayList(); - this.deletedInds = new ArrayList(); - + this.updatedUris = new LinkedList(); + this.deletedUris = new LinkedList(); + for( String uri: uris){ if( uri != null ){ try{ - Individual ind = wdf.getIndividualDao().getIndividualByURI(uri); + Individual ind = indDao.getIndividualByURI(uri); if( ind != null) - this.updatedInds.add(uri); + this.updatedUris.add(uri); else{ log.debug("found delete in changed uris"); - this.deletedInds.add(uri); + this.deletedUris.add(uri); } } catch(QueryParseException ex){ log.error("could not get Individual "+ uri,ex); @@ -201,12 +248,13 @@ public class IndexBuilder extends Thread { protected void indexRebuild() { log.info("Rebuild of search index is starting."); - // clear out changed uris since we are doing a full index rebuild - getAndEmptyChangedUris(); + // clear out changed URIs since we are doing a full index rebuild + getAndEmptyChangedStatements(); log.debug("Getting all URIs in the model"); Iterator uris = wdf.getIndividualDao().getAllOfThisTypeIterator(); + this.numberOfThreads = MAX_REINDEX_THREADS; doBuild(uris, Collections.emptyList() ); if( log != null ) //log might be null if system is shutting down. @@ -214,13 +262,16 @@ public class IndexBuilder extends Thread { } protected void updatedIndex() { - log.debug("Starting updateIndex()"); - //long since = indexer.getModified() - 60000; - //List updatedUris = wdf.getIndividualDao().getUpdatedSinceIterator(since); + log.debug("Starting updateIndex()"); - makeAddAndDeleteLists( getAndEmptyChangedUris() ); + makeAddAndDeleteLists( getAndEmptyChangedStatements() ); + + this.numberOfThreads = Math.max( MAX_UPDATE_THREADS, updatedUris.size() / 20); + doBuild( updatedUris.iterator(), deletedUris ); + + this.updatedUris = null; + this.deletedUris = null; - doBuild( updatedInds.iterator(), deletedInds ); log.debug("Ending updateIndex()"); } @@ -239,9 +290,8 @@ public class IndexBuilder extends Thread { * checking if an object is on the index is slow. */ private void doBuild(Iterator updates, Collection deletes ){ - boolean aborted = false; - boolean newDocs = reindexRequested; - boolean forceNewIndex = reindexRequested; + boolean aborted = false; + boolean updateRequested = ! reindexRequested; try { if( reindexRequested ) @@ -250,9 +300,8 @@ public class IndexBuilder extends Thread { indexer.startIndexing(); reindexRequested = false; - if( ! forceNewIndex ){ - //if this is not a full reindex, deleted indivdiuals - //need to be removed from the index + if( updateRequested ){ + //if this is not a full reindex, deleted indivdiuals need to be removed from the index for(String deleteMe : deletes ){ try{ indexer.removeFromIndex(deleteMe); @@ -263,7 +312,7 @@ public class IndexBuilder extends Thread { } } - indexUriList(updates, newDocs); + indexUriList(updates); } catch (AbortIndexing abort){ if( log != null) log.debug("aborting the indexing because thread stop was requested"); @@ -284,9 +333,12 @@ public class IndexBuilder extends Thread { * Use the back end indexer to index each object that the Iterator returns. * @throws AbortIndexing */ - private void indexUriList(Iterator updateUris , boolean newDocs) throws AbortIndexing{ + private void indexUriList(Iterator updateUris ) throws AbortIndexing{ //make a copy of numberOfThreads so the local copy is safe during this method. int numberOfThreads = this.numberOfThreads; + if( numberOfThreads > MAX_THREADS ) + numberOfThreads = MAX_THREADS; + IndexWorkerThread.setStartTime(System.currentTimeMillis()); //make lists of work URIs for workers @@ -367,10 +419,15 @@ public class IndexBuilder extends Thread { work.get( counter % workers ).add( uris.next() ); counter ++; } - log.info("Number of individuals to be indexed : " + counter); + log.debug("Number of individuals to be indexed : " + counter); return work; } + protected boolean isThereWorkToDo(){ + synchronized( changedStmtQueue ){ + return reindexRequested || ! changedStmtQueue.isEmpty() ; + } + } private class AbortIndexing extends Exception { // Just a vanilla exception diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/SearchReindexingListener.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/SearchReindexingListener.java index 3774dae58..af181bf60 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/SearchReindexingListener.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/indexing/SearchReindexingListener.java @@ -2,7 +2,6 @@ package edu.cornell.mannlib.vitro.webapp.search.indexing; -import java.util.Collections; import java.util.List; import org.apache.commons.logging.Log; @@ -16,24 +15,18 @@ import com.hp.hpl.jena.rdf.model.StmtIterator; import com.hp.hpl.jena.shared.Lock; import edu.cornell.mannlib.vitro.webapp.dao.jena.event.EditEvent; -import edu.cornell.mannlib.vitro.webapp.search.beans.AdditionalURIsToIndex; /** * This class is thread safe. Notice that doAsyncIndexBuild() is frequently * called because the inference system does not seem to send notifyEvents. */ public class SearchReindexingListener implements ModelChangedListener { - private IndexBuilder indexBuilder; - private List additionalUriFinders; + private IndexBuilder indexBuilder; - public SearchReindexingListener(IndexBuilder indexBuilder, List addUrisList ) { + public SearchReindexingListener(IndexBuilder indexBuilder ) { if(indexBuilder == null ) throw new IllegalArgumentException("Constructor parameter indexBuilder must not be null"); - this.indexBuilder = indexBuilder; - if( addUrisList != null ) - this.additionalUriFinders = addUrisList; - else - this.additionalUriFinders = Collections.emptyList(); + this.indexBuilder = indexBuilder; } private synchronized void addChange(Statement stmt){ @@ -56,19 +49,8 @@ public class SearchReindexingListener implements ModelChangedListener { } log.debug("changed statement: sub='" + sub + "' pred='" + pred +"' obj='" + obj + "'"); } - - if( stmt.getSubject().isURIResource() ){ - indexBuilder.addToChangedUris(stmt.getSubject().getURI()); - log.debug("subject: " + stmt.getSubject().getURI()); - } - if( stmt.getObject().isURIResource() ){ - indexBuilder.addToChangedUris(((Resource) stmt.getObject()).getURI()); - } - - for( AdditionalURIsToIndex au : additionalUriFinders ){ - indexBuilder.addToChangedUris( au.findAdditionalURIsToIndex(stmt) ); - } + indexBuilder.addToChanged(stmt); } private void requestAsyncIndexUpdate(){ diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/solr/SolrSetup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/solr/SolrSetup.java index c1bfe6453..8ef90058b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/search/solr/SolrSetup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/search/solr/SolrSetup.java @@ -19,7 +19,6 @@ import org.apache.solr.client.solrj.impl.XMLResponseParser; import com.hp.hpl.jena.ontology.OntModel; import com.hp.hpl.jena.query.Dataset; import com.hp.hpl.jena.query.DatasetFactory; -import com.hp.hpl.jena.tdb.base.file.FileBase; import edu.cornell.mannlib.vitro.webapp.config.ConfigurationProperties; import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary; @@ -29,13 +28,12 @@ import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilterUtils; import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters; import edu.cornell.mannlib.vitro.webapp.dao.jena.JenaBaseDao; import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelContext; -import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactoryJena; -import edu.cornell.mannlib.vitro.webapp.search.IndexConstants; -import edu.cornell.mannlib.vitro.webapp.search.beans.AdditionalURIsToIndex; import edu.cornell.mannlib.vitro.webapp.search.beans.FileBasedProhibitedFromSearch; import edu.cornell.mannlib.vitro.webapp.search.beans.IndividualProhibitedFromSearchImpl; import edu.cornell.mannlib.vitro.webapp.search.beans.ProhibitedFromSearch; +import edu.cornell.mannlib.vitro.webapp.search.beans.StatementToURIsToUpdate; import edu.cornell.mannlib.vitro.webapp.search.indexing.AdditionalURIsForContextNodes; +import edu.cornell.mannlib.vitro.webapp.search.indexing.AdditionalURIsForDataProperties; import edu.cornell.mannlib.vitro.webapp.search.indexing.AdditionalURIsForObjectProperties; import edu.cornell.mannlib.vitro.webapp.search.indexing.IndexBuilder; import edu.cornell.mannlib.vitro.webapp.search.indexing.SearchReindexingListener; @@ -107,19 +105,20 @@ public class SolrSetup implements javax.servlet.ServletContextListener{ WebappDaoFactory wadf = (WebappDaoFactory) context.getAttribute("webappDaoFactory"); VitroFilters vf = VitroFilterUtils.getPublicFilter(context); wadf = new WebappDaoFactoryFiltering(wadf, vf); - - IndexBuilder builder = new IndexBuilder(context, solrIndexer, wadf ); - // to the servlet context so we can access it later in the webapp. - context.setAttribute(IndexBuilder.class.getName(), builder); - //make objects that will find additional URIs for context nodes etc - List uriFinders = new ArrayList(); + //make objects that will find additional URIs for context nodes etc + List uriFinders = new ArrayList(); + uriFinders.add( new AdditionalURIsForDataProperties() ); uriFinders.add( new AdditionalURIsForObjectProperties(jenaOntModel) ); uriFinders.add( new AdditionalURIsForContextNodes(jenaOntModel) ); + IndexBuilder builder = new IndexBuilder( solrIndexer, wadf, uriFinders ); + // to the servlet context so we can access it later in the webapp. + context.setAttribute(IndexBuilder.class.getName(), builder); + // set up listeners so search index builder is notified of changes to model ServletContext ctx = sce.getServletContext(); - SearchReindexingListener srl = new SearchReindexingListener(builder, uriFinders); + SearchReindexingListener srl = new SearchReindexingListener( builder ); ModelContext.registerListenerForChanges(ctx, srl); log.info("Setup of Solr index completed."); diff --git a/webapp/test/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForClassGroupChangesTest.java b/webapp/test/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForClassGroupChangesTest.java index 965b615ec..dbd7156f0 100644 --- a/webapp/test/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForClassGroupChangesTest.java +++ b/webapp/test/edu/cornell/mannlib/vitro/webapp/search/indexing/AdditionalURIsForClassGroupChangesTest.java @@ -20,7 +20,7 @@ import com.hp.hpl.jena.vocabulary.OWL; import com.hp.hpl.jena.vocabulary.RDFS; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; -import edu.cornell.mannlib.vitro.webapp.search.beans.AdditionalURIsToIndex; +import edu.cornell.mannlib.vitro.webapp.search.beans.StatementToURIsToUpdate; /** * @author bdc34 @@ -43,7 +43,7 @@ public class AdditionalURIsForClassGroupChangesTest { OntModel model = ModelFactory.createOntologyModel(); model.read( new StringReader(n3ForPresentationClass), null, "N3"); - AdditionalURIsToIndex uriFinder = new AdditionalURIsForClassGroupChanges( model ); + StatementToURIsToUpdate uriFinder = new AdditionalURIsForClassGroupChanges( model ); List uris = uriFinder.findAdditionalURIsToIndex( ResourceFactory.createStatement( ResourceFactory.createResource("http://vivoweb.org/ontology/core#Presentation"),