Return-Path: X-Original-To: apmail-clerezza-commits-archive@www.apache.org Delivered-To: apmail-clerezza-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 8CB8710BF6 for ; Fri, 25 Oct 2013 18:11:22 +0000 (UTC) Received: (qmail 84030 invoked by uid 500); 25 Oct 2013 18:11:20 -0000 Delivered-To: apmail-clerezza-commits-archive@clerezza.apache.org Received: (qmail 83958 invoked by uid 500); 25 Oct 2013 18:11:16 -0000 Mailing-List: contact commits-help@clerezza.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@clerezza.apache.org Delivered-To: mailing list commits@clerezza.apache.org Received: (qmail 83944 invoked by uid 99); 25 Oct 2013 18:11:15 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 25 Oct 2013 18:11:15 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 25 Oct 2013 18:11:13 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id D40B923889FD; Fri, 25 Oct 2013 18:10:52 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1535802 - in /clerezza/trunk/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris: GraphIndexer.java IndexDefinitionManager.java Date: Fri, 25 Oct 2013 18:10:52 -0000 To: commits@clerezza.apache.org From: reto@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20131025181052.D40B923889FD@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: reto Date: Fri Oct 25 18:10:52 2013 New Revision: 1535802 URL: http://svn.apache.org/r1535802 Log: CLEREZZA-831: added missing locks Modified: clerezza/trunk/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GraphIndexer.java clerezza/trunk/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/IndexDefinitionManager.java Modified: clerezza/trunk/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GraphIndexer.java URL: http://svn.apache.org/viewvc/clerezza/trunk/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GraphIndexer.java?rev=1535802&r1=1535801&r2=1535802&view=diff ============================================================================== --- clerezza/trunk/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GraphIndexer.java (original) +++ clerezza/trunk/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GraphIndexer.java Fri Oct 25 18:10:52 2013 @@ -38,6 +38,7 @@ import org.apache.clerezza.rdf.core.Reso import org.apache.clerezza.rdf.core.Triple; import org.apache.clerezza.rdf.core.TripleCollection; import org.apache.clerezza.rdf.core.UriRef; +import org.apache.clerezza.rdf.core.access.LockableMGraph; import org.apache.clerezza.rdf.core.event.FilterTriple; import org.apache.clerezza.rdf.core.event.GraphEvent; import org.apache.clerezza.rdf.core.event.GraphListener; @@ -66,35 +67,35 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * Creates an index of RDF resources and provides an interface to - * search for indexed resources. + * Creates an index of RDF resources and provides an interface to search for + * indexed resources. * * @author reto, tio, daniel */ public class GraphIndexer extends ResourceFinder { - + /** * Default value for {@code maxhits}. */ public static final int DEFAULT_MAXHITS = 100000; - + private final Logger logger = LoggerFactory.getLogger(getClass()); - + /** * Prefix for stored Lucene fields. */ static final String SORT_PREFIX = "_STORED_"; - + /** * Field name for the resource field in Lucene. */ static final String URI_FIELD_NAME = "resource-uri"; - + /** * Handler for asynchronous indexing. */ ReindexThread reindexer; - + private TripleCollection definitionGraph; private TripleCollection baseGraph; private int maxHits; @@ -108,23 +109,24 @@ public class GraphIndexer extends Resour private Map sortCache = new HashMap(); private Timer timer = new Timer(); private final OptimizationTask optimizationTask = new OptimizationTask(); - + /** * Allows to schedule optimizations using a Timer. - * + * * NOTE: not for public access as this functionality is likely to be moved * into a stand-alone service. */ private class OptimizationTask extends TimerTask { + @Override public void run() { optimizeIndex(); } } - + /** - * When resources are (re)-indexed, - * this thread updates the Lucene index asynchronously. + * When resources are (re)-indexed, this thread updates the Lucene index + * asynchronously. */ class ReindexThread extends Thread { @@ -133,34 +135,32 @@ public class GraphIndexer extends Resour private final String name; private final Set resourcesToProcess; private final Lock lock = new ReentrantLock(true); - private final java.util.concurrent.locks.Condition indexResources = - lock.newCondition(); + private final java.util.concurrent.locks.Condition indexResources + = lock.newCondition(); private long counter; private boolean stop; private boolean resourcesClean; /** - * Constructs a new thread with specified name and indexing threshold. - * Setting the name may be useful for distinguishing logging output when + * Constructs a new thread with specified name and indexing threshold. + * Setting the name may be useful for distinguishing logging output when * multiple instances of GraphIndexer are running. - * - * {@code stableThreshold} specifies a waiting period before the - * indexing starts. The timer is restarted if more resources are added - * within {@code stableThreshold} nanoseconds. A high value means the - * thread will wait a long time before indexing resources added using - * {@link addResource(Resource resource)}. A short value means new - * resources are added to the index quickly. Configure this value such - * that when adding many new resources in a short time these are + * + * {@code stableThreshold} specifies a waiting period before the + * indexing starts. The timer is restarted if more resources are added + * within {@code stableThreshold} nanoseconds. A high value means the + * thread will wait a long time before indexing resources added using + * {@link addResource(Resource resource)}. A short value means new + * resources are added to the index quickly. Configure this value such + * that when adding many new resources in a short time these are * gathered and indexed at once. - * - * @param name the thread name (used in logging output). - * @param stableThreshold - * If no new resource has been added for {@code stableThreshold} - * nanoseconds and there are cached unindexed resources, then - * indexing starts. - * @param resourceCacheCapacity - * How many resources will be cached maximally before indexing. - * A negative number means infinite. + * + * @param name the thread name (used in logging output). + * @param stableThreshold If no new resource has been added for + * {@code stableThreshold} nanoseconds and there are cached unindexed + * resources, then indexing starts. + * @param resourceCacheCapacity How many resources will be cached + * maximally before indexing. A negative number means infinite. */ ReindexThread(String name, long stableThreshold, long resourceCacheCapacity) { this.resourceCacheCapacity = resourceCacheCapacity; @@ -169,34 +169,31 @@ public class GraphIndexer extends Resour this.resourcesToProcess = new HashSet(); this.resourcesClean = true; } - + /** * Constructs a new thread with specified indexing threshold. - * - * @code stableThreshold} specifies a waiting period before the - * indexing starts. The timer is restarted if more resources are added - * within {@code stableThreshold} nanoseconds. A high value means the - * thread will wait a long time before indexing resources added using - * {@link addResource(Resource resource)}. A short value means new - * resources are added to the index quickly. Configure this value such - * that when adding many new resources in a short time these are + * + * @code stableThreshold} specifies a waiting period before the indexing + * starts. The timer is restarted if more resources are added within + * {@code stableThreshold} nanoseconds. A high value means the thread + * will wait a long time before indexing resources added using + * {@link addResource(Resource resource)}. A short value means new + * resources are added to the index quickly. Configure this value such + * that when adding many new resources in a short time these are * gathered and indexed at once. - * - * @param stableThreshold - * If no new resource has been added for {@code stableThreshold} - * nanoseconds and there are cached unindexed resources, then - * indexing starts. - * @param resourceCacheCapacity - * How many resources will be cached maximally before indexing. - * A negative number means infinite. + * + * @param stableThreshold If no new resource has been added for + * {@code stableThreshold} nanoseconds and there are cached unindexed + * resources, then indexing starts. + * @param resourceCacheCapacity How many resources will be cached + * maximally before indexing. A negative number means infinite. */ ReindexThread(long stableThreshold, long resourceCacheCapacity) { this(null, stableThreshold, resourceCacheCapacity); } - /** - * Request the termination of this thread. The thread will finish its + * Request the termination of this thread. The thread will finish its * current operations before it terminates. */ void stopThread() { @@ -211,7 +208,7 @@ public class GraphIndexer extends Resour @Override public void run() { - if(name == null) { + if (name == null) { setName("CRIS Reindex Thread[" + getId() + "]"); } else { setName(name); @@ -248,12 +245,12 @@ public class GraphIndexer extends Resour } logger.info("{} stopped.", getName()); } - + private void waitUntilStable() throws InterruptedException { while (!resourcesClean) { resourcesClean = true; indexResources.awaitNanos(stableThreshold); - if(resourceCacheCapacity >= 0 && ++counter > resourceCacheCapacity) { + if (resourceCacheCapacity >= 0 && ++counter > resourceCacheCapacity) { break; } } @@ -267,7 +264,7 @@ public class GraphIndexer extends Resour /** * Add a new resource for indexing. - * + * * @param resource the resource. */ public void addResource(Resource resource) { @@ -284,36 +281,32 @@ public class GraphIndexer extends Resour /** * Creates a new index. - * - * The {@code GraphIndexer} looks for specifications of what properties on + * + * The {@code GraphIndexer} looks for specifications of what properties on * what resources to index in the {@code definitionGraph}. - * + * * The {@code baseGraph} specifies the graph on which the index is built. - * - *

Notes: - * + * *

- * This is an expensive operation and it is advisable to call + * Notes: + * + *

+ * This is an expensive operation and it is advisable to call * {@link #closeLuceneIndex()} when this instance is no longer needed. *

* The GraphIndexer must have write-access to the index directory specified. *

- * - * @param definitionGraph - * where index definitions are stored - * @param baseGraph - * where the resources to index are stored - * @param indexDirectory - * The directory where the index is stored. - * @param createNewIndex - * Whether to create a new index or reuse an existing one. - * The constructor does not check if there is a valid exiting index. - * The user is responsible for setting this value correctly. - * @param maxHits - * How many results the indexer returns. All entries in the index are - * searched, but only @code{maxHits} resources are resolved and - * returned in the result. - * + * + * @param definitionGraph where index definitions are stored + * @param baseGraph where the resources to index are stored + * @param indexDirectory The directory where the index is stored. + * @param createNewIndex Whether to create a new index or reuse an existing + * one. The constructor does not check if there is a valid exiting index. + * The user is responsible for setting this value correctly. + * @param maxHits How many results the indexer returns. All entries in the + * index are searched, but only @code{maxHits} resources are resolved and + * returned in the result. + * * @see IndexDefinitionManager */ public GraphIndexer(TripleCollection definitionGraph, @@ -361,7 +354,7 @@ public class GraphIndexer extends Resour logger.debug("Predicate: " + predicate); for (VirtualProperty vProperty : vProperties) { logger.debug("Subject: " + " " + triple.getSubject()); - followInversePaths(triple.getSubject(), + followInversePaths(triple.getSubject(), vProperty.pathToIndexedResource(predicate), indexedResources); } @@ -392,24 +385,24 @@ public class GraphIndexer extends Resour } }; - baseGraph.addGraphListener(indexedPropertyChangeListener, + baseGraph.addGraphListener(indexedPropertyChangeListener, new FilterTriple(null, null, null) { - @Override - public boolean match(Triple triple) { - UriRef predicate = triple.getPredicate(); - //check indirectly involved properties - Set vProperties = property2IncludingVProperty.get(predicate); - if (vProperties != null) { - for (VirtualProperty vProperty : vProperties) { - if (property2TypeMap.containsKey(vProperty)) { - return true; + @Override + public boolean match(Triple triple) { + UriRef predicate = triple.getPredicate(); + //check indirectly involved properties + Set vProperties = property2IncludingVProperty.get(predicate); + if (vProperties != null) { + for (VirtualProperty vProperty : vProperties) { + if (property2TypeMap.containsKey(vProperty)) { + return true; + } + } } + return false; } - } - return false; - } - }); + }); reindexer.start(); @@ -417,70 +410,66 @@ public class GraphIndexer extends Resour reCreateIndex(); } } - + /** * Creates a new index with default {@code maxHits}. - * - * The {@code GraphIndexer} looks for specifications of what properties on + * + * The {@code GraphIndexer} looks for specifications of what properties on * what resources to index in the {@code definitionGraph}. - * + * * The {@code baseGraph} specifies the graph on which the index is built. - * - *

Notes: - * + * + *

+ * Notes: + * *

- * This is an expensive operation and it is advisable to call + * This is an expensive operation and it is advisable to call * {@link #closeLuceneIndex()} when this instance is no longer needed. *

* The GraphIndexer must have write-access to the index directory specified. *

- * - * @param definitionGraph - * where index definitions are stored - * @param baseGraph - * where the resources to index are stored - * @param indexDirectory - * The directory where the index is stored. - * @param createNewIndex - * Whether to create a new index or reuse an existing one. - * The constructor does not check if there is a valid exiting index. - * The user is responsible for setting this value correctly. + * + * @param definitionGraph where index definitions are stored + * @param baseGraph where the resources to index are stored + * @param indexDirectory The directory where the index is stored. + * @param createNewIndex Whether to create a new index or reuse an existing + * one. The constructor does not check if there is a valid exiting index. + * The user is responsible for setting this value correctly. */ public GraphIndexer(TripleCollection definitionGraph, TripleCollection baseGraph, Directory indexDirectory, boolean createNewIndex) { - this(definitionGraph, baseGraph, indexDirectory, createNewIndex, + this(definitionGraph, baseGraph, indexDirectory, createNewIndex, DEFAULT_MAXHITS); } /** * Creates a new in-memory index with default {@code maxHits}. - * - * The {@code GraphIndexer} looks for specifications of what properties on + * + * The {@code GraphIndexer} looks for specifications of what properties on * what resources to index in the {@code definitionGraph}. - * + * * The {@code baseGraph} specifies the graph on which the index is built. - * - *

Notes: - * + * + *

+ * Notes: + * *

- * This is an expensive operation and it is advisable to call + * This is an expensive operation and it is advisable to call * {@link #closeLuceneIndex()} when this instance is no longer needed. *

* The GraphIndexer must have write-access to the index directory specified. *

- * - * @param definitionGraph - * where index definitions are stored - * @param baseGraph - * where the resources to index are stored + * + * @param definitionGraph where index definitions are stored + * @param baseGraph where the resources to index are stored */ public GraphIndexer(TripleCollection definitionGraph, TripleCollection baseGraph) { this(definitionGraph, baseGraph, new RAMDirectory(), true); } /** - * Releases resources held by GraphIndexer. After the call to this method, + * Releases resources held by GraphIndexer. After the call to this method, * this GraphIndexer instance must not be used anymore. */ public void closeLuceneIndex() { @@ -491,10 +480,10 @@ public class GraphIndexer extends Resour this.luceneTools.closeIndexWriter(); this.sortCache.clear(); } - + /** * Returns the Analyzer used by this GraphIndexer instance. - * + * * @return the Analyzer */ public Analyzer getAnalyzer() { @@ -503,26 +492,26 @@ public class GraphIndexer extends Resour /** * Returns the graph that this GraphIndexer builds an index on. - * - * @return The graph containing the indexed resources. + * + * @return The graph containing the indexed resources. */ public TripleCollection getBaseGraph() { return baseGraph; } - + /** * Returns the graph where the index definitions are stored. - * + * * @return The graph with the index definitions. */ public TripleCollection getDefinitionGraph() { return definitionGraph; } - + /** * How many results a search on the index returns maximally. - * - * @return the maximum number of results. + * + * @return the maximum number of results. */ public int getMaxHits() { return maxHits; @@ -530,8 +519,8 @@ public class GraphIndexer extends Resour /** * Set how many results a search on the index returns maximally. - * - * @param maxHits the maximum number of results. + * + * @param maxHits the maximum number of results. */ public void setMaxHits(int maxHits) { this.maxHits = maxHits; @@ -541,23 +530,22 @@ public class GraphIndexer extends Resour public void optimizeIndex() { luceneTools.optimizeIndex(); } - + /** * Schedule optimizations for repeated executions. - * - * @param delay - * The delay before the first execution in milliseconds. - * @param period - * Time between successive executions (execution rate) in milliseconds. + * + * @param delay The delay before the first execution in milliseconds. + * @param period Time between successive executions (execution rate) in + * milliseconds. */ public void scheduleIndexOptimizations(long delay, long period) { - if(timer != null) { + if (timer != null) { timer.cancel(); } timer = new Timer(); timer.scheduleAtFixedRate(optimizationTask, delay, period); } - + /** * Cancel scheduled optimizations. This call does not have any effect on * optimizations that are being executed while the method is called. @@ -565,7 +553,7 @@ public class GraphIndexer extends Resour public void terminateIndexOptimizationSchedule() { timer.cancel(); timer = null; - } + } @Override public void reCreateIndex() { @@ -575,10 +563,10 @@ public class GraphIndexer extends Resour for (UriRef indexedType : type2IndexedProperties.keySet()) { //lock necessary? - Lock lock = new GraphNode(indexedType, this.baseGraph).readLock(); + Lock lock = new GraphNode(indexedType, this.baseGraph).readLock(); lock.lock(); try { - Iterator iter = this.baseGraph.filter(null, RDF.type, indexedType); + Iterator iter = this.baseGraph.filter(null, RDF.type, indexedType); while (iter.hasNext()) { instances.add(iter.next().getSubject()); } @@ -600,65 +588,61 @@ public class GraphIndexer extends Resour } @Override - public List findResources(List conditions, - SortSpecification sortSpecification, + public List findResources(List conditions, + SortSpecification sortSpecification, FacetCollector... facetCollectors) throws ParseException { - return findResources(conditions, sortSpecification, + return findResources(conditions, sortSpecification, Arrays.asList(facetCollectors), 0, maxHits + 1); } - + /** - * Find resources using conditions and collect facets and specify a sort order. - * + * Find resources using conditions and collect facets and specify a sort + * order. + * * This method allows to specify the indices of the query results to return * (e.g. for pagination). - * - * @param conditions - * a list of conditions to construct a query from. - * @param facetCollectors - * Facet collectors to apply to the query result. - * Can be {@link Collections#EMPTY_LIST}, if not used. - * @param sortSpecification - * Specifies the sort order. Can be null, if not used. - * @param from - * return results starting from this index (inclusive). - * @param to - * return results until this index (exclusive). - * @return - * a list of resources that match the query. - * + * + * @param conditions a list of conditions to construct a query from. + * @param facetCollectors Facet collectors to apply to the query result. Can + * be {@link Collections#EMPTY_LIST}, if not used. + * @param sortSpecification Specifies the sort order. Can be null, if not + * used. + * @param from return results starting from this index (inclusive). + * @param to return results until this index (exclusive). + * @return a list of resources that match the query. + * * @throws ParseException when the resulting query is illegal. */ - public List findResources(List conditions, - SortSpecification sortSpecification, + public List findResources(List conditions, + SortSpecification sortSpecification, List facetCollectors, int from, int to) throws ParseException { - if(from < 0) { + if (from < 0) { from = 0; } - - if(to < from) { + + if (to < from) { to = from + 1; } - - if(facetCollectors == null) { + + if (facetCollectors == null) { facetCollectors = Collections.EMPTY_LIST; } - + BooleanQuery booleanQuery = new BooleanQuery(); for (Condition c : conditions) { booleanQuery.add(c.query(), BooleanClause.Occur.MUST); } - + IndexSearcher searcher = luceneTools.getIndexSearcher(); ScoreDoc[] hits = null; try { - if(sortSpecification != null) { - SortFieldArrayWrapper fieldKey = - new SortFieldArrayWrapper(sortSpecification.getSortFields()); + if (sortSpecification != null) { + SortFieldArrayWrapper fieldKey + = new SortFieldArrayWrapper(sortSpecification.getSortFields()); Sort sort = sortCache.get(fieldKey); - if(sort == null) { + if (sort == null) { sort = new Sort(sortSpecification.getSortFields()); sortCache.put(fieldKey, sort); } @@ -687,14 +671,14 @@ public class GraphIndexer extends Resour logger.error("CRIS Error: ", ex); } } - - for(FacetCollector facetCollector : facetCollectors) { + + for (FacetCollector facetCollector : facetCollectors) { facetCollector.postProcess(); } - + return result; } - + @Override public void finalize() throws Throwable { @@ -702,11 +686,11 @@ public class GraphIndexer extends Resour closeLuceneIndex(); } - + /** * Schedule an update or creation of an index for a resource. - * - * @param resource the resource to index. + * + * @param resource the resource to index. */ protected void scheduleForReindex(Resource resource) { logger.debug("Scheduling for reindex: " + resource); @@ -717,56 +701,64 @@ public class GraphIndexer extends Resour * Read the index definitions and initialize the GraphIndexer with them. */ protected void processDefinitions() { - - Iterator indexDefinitionResources = - this.definitionGraph.filter(null, RDF.type, CRIS.IndexDefinition); - - Map> type2IndexedPropertiesTuples = - new HashMap>(); - - while (indexDefinitionResources.hasNext()) { - GraphNode node = new GraphNode(indexDefinitionResources.next().getSubject(), - this.definitionGraph); - Iterator types = node.getObjectNodes(CRIS.indexedType); - while (types.hasNext()) { - UriRef tUri = (UriRef) types.next().getNode(); - Iterator properties = node.getObjectNodes(CRIS.indexedProperty); - Set props = new HashSet(); - while (properties.hasNext()) { - VirtualProperty vProp = asVirtualProperty(properties.next(), null); - if (property2TypeMap.containsKey(vProp)) { - property2TypeMap.get(vProp).add(tUri); - } else { - Set set = new HashSet(); - set.add(tUri); - property2TypeMap.put(vProp, set); - } - - for (UriRef baseProperty : vProp.baseProperties) { - if (property2IncludingVProperty.containsKey(baseProperty)) { - property2IncludingVProperty.get(baseProperty).add(vProp); + Lock l; + if (definitionGraph instanceof LockableMGraph) { + l = ((LockableMGraph) definitionGraph).getLock().readLock(); + } else { + l = new ReentrantLock(); + } + Map> type2IndexedPropertiesTuples + = new HashMap>(); + l.lock(); + try { + Iterator indexDefinitionResources + = this.definitionGraph.filter(null, RDF.type, CRIS.IndexDefinition); + while (indexDefinitionResources.hasNext()) { + GraphNode node = new GraphNode(indexDefinitionResources.next().getSubject(), + this.definitionGraph); + Iterator types = node.getObjectNodes(CRIS.indexedType); + while (types.hasNext()) { + UriRef tUri = (UriRef) types.next().getNode(); + Iterator properties = node.getObjectNodes(CRIS.indexedProperty); + Set props = new HashSet(); + while (properties.hasNext()) { + VirtualProperty vProp = asVirtualProperty(properties.next(), null); + if (property2TypeMap.containsKey(vProp)) { + property2TypeMap.get(vProp).add(tUri); } else { - Set set = new HashSet(); - set.add(vProp); - property2IncludingVProperty.put(baseProperty, set); + Set set = new HashSet(); + set.add(tUri); + property2TypeMap.put(vProp, set); } + + for (UriRef baseProperty : vProp.baseProperties) { + if (property2IncludingVProperty.containsKey(baseProperty)) { + property2IncludingVProperty.get(baseProperty).add(vProp); + } else { + Set set = new HashSet(); + set.add(vProp); + property2IncludingVProperty.put(baseProperty, set); + } + } + props.add(vProp); + } - props.add(vProp); + type2IndexedPropertiesTuples.put(tUri, props); } - type2IndexedPropertiesTuples.put(tUri, props); - } + } finally { + l.unlock(); } type2IndexedProperties = new HashMap(type2IndexedPropertiesTuples); } - + /** * Index a resource. - * - * @param resource the resource to index. - * @param writer the index writer. + * + * @param resource the resource to index. + * @param writer the index writer. */ protected void indexResource(Resource resource, IndexWriter writer) { if (resource instanceof UriRef) { @@ -779,7 +771,7 @@ public class GraphIndexer extends Resour indexAnonymousResource(resource); } } - + private NonLiteral getResource(Document d) { return new UriRef(d.get(URI_FIELD_NAME)); } @@ -814,12 +806,12 @@ public class GraphIndexer extends Resour r.hasProperty(RDF.type, CRIS.FacetProperty)); } else { if (r.hasProperty(RDF.type, CRIS.PathVirtualProperty)) { - return new PathVirtualProperty(getUriPropertyList(r), + return new PathVirtualProperty(getUriPropertyList(r), r.hasProperty(RDF.type, CRIS.FacetProperty)); } else { if ((r.getNode()) instanceof UriRef) { return new PropertyHolder((UriRef) r.getNode(), - r.hasProperty(RDF.type, CRIS.FacetProperty)); + r.hasProperty(RDF.type, CRIS.FacetProperty)); } else { throw new RuntimeException(r + " is not of a knows VirtualProperty type and its not a UriRef (it's a " + (r.getNode()).getClass() + ")"); } @@ -854,16 +846,16 @@ public class GraphIndexer extends Resour } throw new RuntimeException("There is no propertyList on this definition."); } - + private void collectFacets(List facetCollectors, Document d) { - if(facetCollectors.size() > 0) { - for(FacetCollector facetCollector : facetCollectors) { - Map> facetMap = - facetCollector.getFacetMap(); - for(VirtualProperty property : facetMap.keySet()) { + if (facetCollectors.size() > 0) { + for (FacetCollector facetCollector : facetCollectors) { + Map> facetMap + = facetCollector.getFacetMap(); + for (VirtualProperty property : facetMap.keySet()) { String[] values = d.getValues(SORT_PREFIX + property.getStringKey()); - if(values != null) { - for(String value : values) { + if (values != null) { + for (String value : values) { facetCollector.addFacetValue(property, value); } } @@ -934,7 +926,7 @@ public class GraphIndexer extends Resour private void indexAnonymousResource(Resource resource) { logger.warn("Currently only indexing named resources is supported"); /*val doc = resourceToDocument(resource) - doc.add(new Field(URI_FIELD_NAME, getIdentifier(resource), Field.Store.YES, Field.Index.ANALYZED)) - writer.addDocument(doc)*/ + doc.add(new Field(URI_FIELD_NAME, getIdentifier(resource), Field.Store.YES, Field.Index.ANALYZED)) + writer.addDocument(doc)*/ } } Modified: clerezza/trunk/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/IndexDefinitionManager.java URL: http://svn.apache.org/viewvc/clerezza/trunk/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/IndexDefinitionManager.java?rev=1535802&r1=1535801&r2=1535802&view=diff ============================================================================== --- clerezza/trunk/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/IndexDefinitionManager.java (original) +++ clerezza/trunk/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/IndexDefinitionManager.java Fri Oct 25 18:10:52 2013 @@ -19,8 +19,10 @@ package org.apache.clerezza.rdf.cris; import java.util.ArrayList; +import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Set; import org.apache.clerezza.rdf.core.BNode; import org.apache.clerezza.rdf.core.MGraph; import org.apache.clerezza.rdf.core.NonLiteral; @@ -31,6 +33,8 @@ import org.apache.clerezza.rdf.cris.onto import org.apache.clerezza.rdf.ontologies.RDF; import org.apache.clerezza.rdf.utils.GraphNode; import org.apache.clerezza.rdf.utils.RdfList; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Creates the definitions that specify which literals of a resource are @@ -40,7 +44,9 @@ import org.apache.clerezza.rdf.utils.Rdf */ public class IndexDefinitionManager { - private MGraph definitionGraph; + private static final Logger log = LoggerFactory.getLogger(IndexDefinitionManager.class); + + private final MGraph definitionGraph; /** * Creates a new IndexDefinitionManager. @@ -89,11 +95,15 @@ public class IndexDefinitionManager { public void addDefinitionVirtual(UriRef rdfType, List properties) { deleteDefinition(rdfType); GraphNode node = new GraphNode(new BNode(), definitionGraph); - node.addProperty(RDF.type, CRIS.IndexDefinition); - node.addProperty(CRIS.indexedType, rdfType); - - for (VirtualProperty p : properties) { - node.addProperty(CRIS.indexedProperty, asResource(p)); + node.writeLock().lock(); + try { + node.addProperty(RDF.type, CRIS.IndexDefinition); + node.addProperty(CRIS.indexedType, rdfType); + for (VirtualProperty p : properties) { + node.addProperty(CRIS.indexedProperty, asResource(p)); + } + } finally { + node.writeLock().unlock(); } } @@ -104,11 +114,20 @@ public class IndexDefinitionManager { */ public void deleteDefinition(UriRef rdfType) { GraphNode node = new GraphNode(rdfType, definitionGraph); - node.writeLock().lock(); - try { + Set toDelete = new HashSet(); + node.readLock().lock(); + try { Iterator iter = node.getSubjectNodes(CRIS.indexedType); while (iter.hasNext()) { - iter.next().deleteNodeContext(); + toDelete.add(iter.next()); + } + } finally { + node.readLock().unlock(); + } + node.writeLock().lock(); + try { + for (GraphNode graphNode : toDelete) { + graphNode.deleteNodeContext(); } } finally { node.writeLock().unlock();