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