Index: src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingConfigurationImpl.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingConfigurationImpl.java (revision 898409) +++ src/main/java/org/apache/jackrabbit/core/query/lucene/IndexingConfigurationImpl.java (working copy) @@ -33,6 +33,7 @@ import org.apache.jackrabbit.core.HierarchyManagerImpl; import org.apache.jackrabbit.core.id.PropertyId; import org.apache.jackrabbit.core.nodetype.NodeTypeRegistry; +import org.apache.jackrabbit.core.nodetype.NodeTypeRegistryListener; import org.apache.jackrabbit.core.nodetype.xml.AdditionalNamespaceResolver; import org.apache.jackrabbit.core.query.QueryHandlerContext; import org.apache.jackrabbit.core.state.ChildNodeEntry; @@ -67,7 +68,8 @@ * IndexingConfigurationImpl implements a concrete indexing * configuration. */ -public class IndexingConfigurationImpl implements IndexingConfiguration { +public class IndexingConfigurationImpl + implements IndexingConfiguration, NodeTypeRegistryListener { /** * The logger instance for this class @@ -80,6 +82,11 @@ private static final PathFactory PATH_FACTORY = PathFactoryImpl.getInstance(); /** + * The indexing configuration. + */ + private Element configuration; + + /** * A namespace resolver for parsing QNames in the configuration. */ private NameResolver resolver; @@ -95,6 +102,11 @@ private HierarchyManager hmgr; /** + * The node type registry. + */ + private NodeTypeRegistry ntReg; + + /** * The {@link IndexingRule}s inside this configuration. */ private Map> configElements = new HashMap>(); @@ -112,35 +124,23 @@ /** * {@inheritDoc} */ - public void init(Element config, QueryHandlerContext context, NamespaceMappings nsMappings) throws Exception { + public void init(Element config, + QueryHandlerContext context, + NamespaceMappings nsMappings) throws Exception { + configuration = config; ism = context.getItemStateManager(); hmgr = new HierarchyManagerImpl(context.getRootId(), ism); - NamespaceResolver nsResolver = new AdditionalNamespaceResolver(getNamespaces(config)); resolver = new ParsingNameResolver(NameFactoryImpl.getInstance(), nsResolver); + ntReg = context.getNodeTypeRegistry(); + ntReg.addListener(this); - NodeTypeRegistry ntReg = context.getNodeTypeRegistry(); - Name[] ntNames = ntReg.getRegisteredNodeTypes(); + refreshIndexRules(); List idxAggregates = new ArrayList(); NodeList indexingConfigs = config.getChildNodes(); for (int i = 0; i < indexingConfigs.getLength(); i++) { Node configNode = indexingConfigs.item(i); - if (configNode.getNodeName().equals("index-rule")) { - IndexingRule element = new IndexingRule(configNode); - // register under node type and all its sub types - log.debug("Found rule '{}' for NodeType '{}'", element, element.getNodeTypeName()); - for (Name ntName : ntNames) { - if (ntReg.getEffectiveNodeType(ntName).includesNodeType(element.getNodeTypeName())) { - List perNtConfig = configElements.get(ntName); - if (perNtConfig == null) { - perNtConfig = new ArrayList(); - configElements.put(ntName, perNtConfig); - } - log.debug("Registering it for name '{}'", ntName); - perNtConfig.add(new IndexingRule(element, ntName)); - } - } - } else if (configNode.getNodeName().equals("aggregate")) { + if (configNode.getNodeName().equals("aggregate")) { idxAggregates.add(new AggregateRuleImpl( configNode, resolver, ism, hmgr)); } else if (configNode.getNodeName().equals("analyzers")) { @@ -307,9 +307,61 @@ } return null; } + + //--------------------------< NodeTypeRegistryListener >-------------------- + + public void nodeTypeRegistered(Name ntName) { + try { + refreshIndexRules(); + } catch (Exception e) { + log.warn("Unable to refresh index rules", e); + } + } + + public void nodeTypeReRegistered(Name ntName) { + // not interested + } + + public void nodeTypeUnregistered(Name ntName) { + // not interested + } + //---------------------------------< internal >----------------------------- /** + * Refreshes the index rules in {@link #configElements} based on the current + * node types available in the node type registry. + * + * @throws Exception if an error occurs while refreshing the rules. + */ + private void refreshIndexRules() throws Exception { + Map> nt2rules = new HashMap>(); + Name[] ntNames = ntReg.getRegisteredNodeTypes(); + NodeList indexingConfigs = configuration.getChildNodes(); + for (int i = 0; i < indexingConfigs.getLength(); i++) { + Node configNode = indexingConfigs.item(i); + if (configNode.getNodeName().equals("index-rule")) { + IndexingRule element = new IndexingRule(configNode); + // register under node type and all its sub types + log.debug("Found rule '{}' for NodeType '{}'", element, element.getNodeTypeName()); + for (Name ntName : ntNames) { + if (ntReg.getEffectiveNodeType(ntName).includesNodeType(element.getNodeTypeName())) { + List perNtConfig = nt2rules.get(ntName); + if (perNtConfig == null) { + perNtConfig = new ArrayList(); + nt2rules.put(ntName, perNtConfig); + } + log.debug("Registering it for name '{}'", ntName); + perNtConfig.add(new IndexingRule(element, ntName)); + } + } + } + } + configElements = nt2rules; + } + + + /** * Returns the first indexing rule that applies to the given node * state. * Index: src/test/java/org/apache/jackrabbit/core/query/lucene/IndexingConfigurationImplTest.java =================================================================== --- src/test/java/org/apache/jackrabbit/core/query/lucene/IndexingConfigurationImplTest.java (revision 898409) +++ src/test/java/org/apache/jackrabbit/core/query/lucene/IndexingConfigurationImplTest.java (working copy) @@ -20,6 +20,8 @@ import java.io.InputStream; import javax.jcr.Node; +import javax.jcr.nodetype.NodeTypeManager; +import javax.jcr.nodetype.NodeTypeTemplate; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -70,6 +72,30 @@ assertFalse(config.isIndexed(nState, FOO)); } + public void testAddNodeTypeToRegistry() throws Exception { + IndexingConfiguration config = createConfig("config4"); + // add node type + NodeTypeManager ntMgr = superuser.getWorkspace().getNodeTypeManager(); + String baseName = "indexingTextNodeType"; + int i = 0; + String nt; + do { + nt = baseName + "_" + i++; + } while (ntMgr.hasNodeType(nt)); + // register node type + NodeTypeTemplate ntTemplate = ntMgr.createNodeTypeTemplate(); + ntTemplate.setName(nt); + ntTemplate.setDeclaredSuperTypeNames(new String[]{ntUnstructured}); + ntMgr.registerNodeType(ntTemplate, false); + // create node + Node n = testRootNode.addNode(nodeName2, nt); + superuser.save(); + // get state + NodeState state = (NodeState) getSearchIndex().getContext().getItemStateManager().getItemState( + new NodeId(n.getIdentifier())); + assertTrue(config.isIndexed(state, FOO)); + assertFalse(config.isIncludedInNodeScopeIndex(state, FOO)); + } //----------------------------< internal >---------------------------------- Index: src/test/resources/org/apache/jackrabbit/core/query/lucene/indexing_config4.xml =================================================================== --- src/test/resources/org/apache/jackrabbit/core/query/lucene/indexing_config4.xml (revision 0) +++ src/test/resources/org/apache/jackrabbit/core/query/lucene/indexing_config4.xml (revision 0) @@ -0,0 +1,27 @@ + + + + + + + foo + .*:.* + + + \ No newline at end of file Property changes on: src\test\resources\org\apache\jackrabbit\core\query\lucene\indexing_config4.xml ___________________________________________________________________ Added: svn:eol-style + native