Author: vgritsenko
Date: Thu Aug  9 21:35:01 2007
New Revision: 564461

URL: http://svn.apache.org/viewvc?view=rev&rev=564461
Log:
Fix bug in SymbolTable: see lookup.indexOf() line - was preventing
namespaced indexes from be selected by index manager.

Set indexer status to READY in index manager.

Remove unused test file. Add SymbolTable tests.

Added:
    
xml/xindice/trunk/java/tests/src/org/apache/xindice/xml/SymbolTableTest.java   
(with props)
Removed:
    xml/xindice/trunk/java/tests/src/org/apache/xindice/UnitTests.java
Modified:
    
xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/DocumentHandler.java
    xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/IndexManager.java
    xml/xindice/trunk/java/src/org/apache/xindice/xml/SymbolTable.java

Modified: 
xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/DocumentHandler.java
URL: 
http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/DocumentHandler.java?view=diff&rev=564461&r1=564460&r2=564461
==============================================================================
--- 
xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/DocumentHandler.java 
(original)
+++ 
xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/DocumentHandler.java 
Thu Aug  9 21:35:01 2007
@@ -185,7 +185,7 @@
             String nsURI = atts.getURI(i);
             short id;
             if (nsURI != null && nsURI.length() > 0) {
-                String attrNSID = "ns" + Integer.toString(nsURI.hashCode()) + 
":" + atts.getLocalName(i);
+                String attrNSID = 
SymbolTable.getNormalizedQName(atts.getLocalName(i), nsURI);
                 id = symbols.getSymbol(attrNSID, nsURI, true);
             } else {
                 id = symbols.getSymbol(atts.getQName(i));
@@ -234,4 +234,3 @@
         }
     }
 }
-

Modified: 
xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/IndexManager.java
URL: 
http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/IndexManager.java?view=diff&rev=564461&r1=564460&r2=564461
==============================================================================
--- 
xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/IndexManager.java 
(original)
+++ 
xml/xindice/trunk/java/src/org/apache/xindice/core/indexer/IndexManager.java 
Thu Aug  9 21:35:01 2007
@@ -266,7 +266,7 @@
                     }
                 }
             } else {
-                status.put(name, STATUS_BUSY);
+                status.put(name, STATUS_READY);
                 idx.open();
             }
             indexes.put(name, idx);
@@ -383,13 +383,19 @@
             Iterator i = indexes.values().iterator();
             while (i.hasNext()) {
                 Indexer index = (Indexer) i.next();
-                if (!status.get(index.getName()).equals(STATUS_READY) || 
!index.getIndexStyle().equals(style)) {
+                // Indexer is not ready: can not use it
+                if (!status.get(index.getName()).equals(STATUS_READY)) {
+                    continue;
+                }
+
+                // Indexer is of different style: can not use it
+                if (!index.getIndexStyle().equals(style)) {
                     continue;
                 }
 
                 // TODO: should it check patterns?
                 // there can be only one full text index for a collection
-                if (style.equals(Indexer.STYLE_FULLTEXT) && 
index.getIndexStyle().equals(style)) {
+                if (style.equals(Indexer.STYLE_FULLTEXT)) {
                     return index;
                 }
 

Modified: xml/xindice/trunk/java/src/org/apache/xindice/xml/SymbolTable.java
URL: 
http://svn.apache.org/viewvc/xml/xindice/trunk/java/src/org/apache/xindice/xml/SymbolTable.java?view=diff&rev=564461&r1=564460&r2=564461
==============================================================================
--- xml/xindice/trunk/java/src/org/apache/xindice/xml/SymbolTable.java 
(original)
+++ xml/xindice/trunk/java/src/org/apache/xindice/xml/SymbolTable.java Thu Aug  
9 21:35:01 2007
@@ -88,16 +88,12 @@
         return "ns" + namespaceURI.hashCode() + ':' + localName;
     }
 
-    private static String getLookupName(String qname, String namespaceURI) {
-        return '[' + namespaceURI + ']' + qname;
-    }
-
     public static short getNormalizedSymbol(SymbolTable symbols, String 
lookup, NamespaceMap nsMap, boolean create) {
         // Parse [<namespaceURI>]<nsPrefix>:<localName> with optional nsPrefix
         if (lookup.startsWith("[")) {
             int idx = lookup.indexOf(']');
             String nsURI = lookup.substring(1, idx);
-            int cidx = lookup.indexOf(idx + 1, ':');
+            int cidx = lookup.indexOf(':', idx + 1);
             String name = cidx != -1 ? lookup.substring(cidx + 1) : 
lookup.substring(idx + 1);
 
             return symbols.getSymbol(getNormalizedQName(name, nsURI), nsURI, 
create);
@@ -112,14 +108,15 @@
                 String name = lookup.substring(idx + 1);
                 return symbols.getSymbol(getNormalizedQName(name, nsURI), 
nsURI, create);
             }
-
-            // Attempt to lookup <nsPrefix>:<localName> when nsMap has no 
namespace URI for the prefix
-            return symbols.getSymbol(lookup, create);
         }
 
         return symbols.getSymbol(lookup, create);
     }
 
+    private static String getLookupName(String qname, String namespaceURI) {
+        return '[' + namespaceURI + ']' + qname;
+    }
+
     //
     // Instance Methods
     //
@@ -140,15 +137,32 @@
         this.lastModified = System.currentTimeMillis();
     }
 
+    public final long getLastModified() {
+        return lastModified;
+    }
+
+    //
+    // Lookup by symbol id
+    //
+
     public final SymbolInfo getSymbolInfo(short symbol) {
         return (SymbolInfo) names.get(new Short(symbol));
     }
 
-    public final SymbolInfo getSymbolInfo(String qname, String namespaceURI) {
-        String lookupName = getLookupName(qname, namespaceURI);
-        return (SymbolInfo) symbols.get(lookupName);
+    public final String getNamespaceURI(short symbol) {
+        SymbolInfo info = getSymbolInfo(symbol);
+        return info != null ? info.namespaceURI : null;
     }
-    
+
+    public final String getName(short symbol) {
+        SymbolInfo info = getSymbolInfo(symbol);
+        return info != null ? info.qname : null;
+    }
+
+    //
+    // Lookup by qname and namespace
+    //
+
     public final short getSymbol(String qname) {
         return getSymbol(qname, false);
     }
@@ -199,36 +213,28 @@
         return -1;
     }
 
-    public final String getNamespaceURI(short symbol) {
-        SymbolInfo info = getSymbolInfo(symbol);
-        return info != null ? info.namespaceURI : null;
-    }
-
-    public final String getName(short symbol) {
-        SymbolInfo info = getSymbolInfo(symbol);
-        return info != null ? info.qname : null;
-    }
-
-    public final long getLastModified() {
-        return lastModified;
-    }
+    //
+    // XMLSerializable
+    //
 
     public final Element streamToXML(Document doc) throws DOMException {
         Element root = doc.createElement(SYMBOLS);
 
         synchronized (symbols) {
-            Iterator list = symbols.values().iterator();
-            while (list.hasNext()) {
-                SymbolInfo info = (SymbolInfo) list.next();
+            Iterator i = symbols.values().iterator();
+            while (i.hasNext()) {
+                SymbolInfo info = (SymbolInfo) i.next();
+
                 Element e = doc.createElement(SYMBOL);
+                e.setAttribute(ID, Short.toString(info.symbol));
                 e.setAttribute(NAME, info.qname);
                 if (info.namespaceURI != null && info.namespaceURI.length() > 
0) {
                     e.setAttribute(NSURI, info.namespaceURI);
                 }
-                e.setAttribute(ID, Short.toString(info.symbol));
                 root.appendChild(e);
             }
         }
+        
         return root;
     }
 
@@ -248,12 +254,12 @@
                 namespaceURI = null;
             }
 
-            Short id = new Short(elem.getAttribute(ID));
-            if (id.shortValue() > maxSymbol) {
-                maxSymbol = id.shortValue();
+            short id = Short.parseShort(elem.getAttribute(ID));
+            if (id > maxSymbol) {
+                maxSymbol = id;
             }
 
-            SymbolInfo info = new SymbolInfo(qname, namespaceURI, 
id.shortValue());
+            SymbolInfo info = new SymbolInfo(qname, namespaceURI, id);
             if (namespaceURI != null) {
                 String lookupName = getLookupName(qname, namespaceURI);
                 symbols.put(lookupName, info);
@@ -261,7 +267,7 @@
                 symbols.put(qname, info);
             }
 
-            names.put(id, info);
+            names.put(new Short(id), info);
         }
     }
 }

Added: 
xml/xindice/trunk/java/tests/src/org/apache/xindice/xml/SymbolTableTest.java
URL: 
http://svn.apache.org/viewvc/xml/xindice/trunk/java/tests/src/org/apache/xindice/xml/SymbolTableTest.java?view=auto&rev=564461
==============================================================================
--- 
xml/xindice/trunk/java/tests/src/org/apache/xindice/xml/SymbolTableTest.java 
(added)
+++ 
xml/xindice/trunk/java/tests/src/org/apache/xindice/xml/SymbolTableTest.java 
Thu Aug  9 21:35:01 2007
@@ -0,0 +1,144 @@
+/*
+ * 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.
+ *
+ * $Id$
+ */
+
+package org.apache.xindice.xml;
+
+import org.apache.xindice.xml.dom.DOMParser;
+
+import junit.framework.TestCase;
+
+/**
+ * @version $Revision$, $Date$
+ */
+public class SymbolTableTest extends TestCase {
+
+    private static final String SYMBOLS =
+            "<symbols>" +
+            "  <symbol id='1' name='simple'/>" +
+            "  <symbol id='2' nsuri='http://www.w3.org/1999/xhtml' 
name='spaced'/>" +
+            "  <symbol id='3' nsuri='http://www.w3.org/1999/xhtml' 
name='a:spaced'/>" +
+            "  <symbol id='4' nsuri='http://www.w3.org/1999/xhtml' 
name='b:spaced'/>" +
+            "</symbols>";
+
+    private SymbolTable symbols;
+
+
+    protected void setUp() throws Exception {
+        symbols = new 
SymbolTable(DOMParser.toDocument(SYMBOLS).getDocumentElement());
+    }
+
+
+    public void testMissingSymbol() {
+        assertNull(symbols.getSymbolInfo((short) 123));
+
+        assertEquals(-1, symbols.getSymbol("missing"));
+        assertEquals(-1, symbols.getSymbol("missing", false));
+        assertEquals(-1, symbols.getSymbol("missing", "urn:namespace:uri"));
+        assertEquals(-1, symbols.getSymbol("missing", "urn:namespace:uri", 
false));
+
+        assertFalse(symbols.isDirty());
+    }
+
+    public void testSimpleSymbol() {
+        SymbolTable.SymbolInfo si = symbols.getSymbolInfo((short) 1);
+        assertNull(si.getNamespaceURI());
+        assertEquals("simple", si.getQName());
+        assertEquals(1,        si.getSymbolID());
+
+        assertEquals(1,        symbols.getSymbol("simple"));
+
+        assertFalse(symbols.isDirty());
+    }
+
+    public void testNamespacedSymbol() {
+        SymbolTable.SymbolInfo si;
+
+        si = symbols.getSymbolInfo((short) 2);
+        assertEquals("http://www.w3.org/1999/xhtml";, si.getNamespaceURI());
+        assertEquals("spaced",                       si.getQName());
+        assertEquals(2,                              si.getSymbolID());
+
+        si = symbols.getSymbolInfo((short) 3);
+        assertEquals("http://www.w3.org/1999/xhtml";, si.getNamespaceURI());
+        assertEquals("a:spaced",                     si.getQName());
+        assertEquals(3,                              si.getSymbolID());
+
+        si = symbols.getSymbolInfo((short) 4);
+        assertEquals("http://www.w3.org/1999/xhtml";, si.getNamespaceURI());
+        assertEquals("b:spaced",                     si.getQName());
+        assertEquals(4,                              si.getSymbolID());
+
+        assertEquals(2,                              
symbols.getSymbol("spaced",   "http://www.w3.org/1999/xhtml";));
+        assertEquals(3,                              
symbols.getSymbol("a:spaced", "http://www.w3.org/1999/xhtml";));
+        assertEquals(4,                              
symbols.getSymbol("b:spaced", "http://www.w3.org/1999/xhtml";));
+
+        assertEquals(-1,                             
symbols.getSymbol("spaced"));
+        assertEquals(-1,                             
symbols.getSymbol("a:spaced"));
+        assertEquals(-1,                             
symbols.getSymbol("x:spaced", "http://www.w3.org/1999/xhtml";));
+
+        assertFalse(symbols.isDirty());
+    }
+
+    public void testAddSymbol() {
+        assertEquals(-1, symbols.getSymbol("missing"));
+        assertTrue(symbols.getSymbol("missing", true) != -1);
+        assertTrue(symbols.isDirty());
+
+        short s = symbols.getSymbol("missing");
+        assertTrue(s != -1);
+
+        SymbolTable.SymbolInfo si = symbols.getSymbolInfo(s);
+        assertEquals("missing", si.getQName());
+        assertNull(si.getNamespaceURI());
+        assertEquals(s, si.getSymbolID());
+    }
+
+    public void testAddNamespacedSymbol() {
+        assertEquals(-1, symbols.getSymbol("missing", "urn:unknown"));
+        assertTrue(symbols.getSymbol("missing", "urn:unknown", true) != -1);
+        assertTrue(symbols.isDirty());
+
+        short s = symbols.getSymbol("missing", "urn:unknown");
+        assertTrue(s != -1);
+
+        SymbolTable.SymbolInfo si = symbols.getSymbolInfo(s);
+        assertEquals("missing", si.getQName());
+        assertEquals("urn:unknown", si.getNamespaceURI());
+        assertEquals(s, si.getSymbolID());
+    }
+
+    public void testGetNormalizedSymbol() {
+        assertEquals(1, SymbolTable.getNormalizedSymbol(symbols, "simple", 
null, false));
+
+        assertEquals(-1, SymbolTable.getNormalizedSymbol(symbols, 
"[http://www.w3.org/1999/xhtml]spaced";, null, false));
+        assertEquals(-1, SymbolTable.getNormalizedSymbol(symbols, 
"[http://www.w3.org/1999/xhtml]a:spaced";, null, false));
+        assertEquals(-1, SymbolTable.getNormalizedSymbol(symbols, 
"[http://www.w3.org/1999/xhtml]b:spaced";, null, false));
+
+        short s = SymbolTable.getNormalizedSymbol(symbols, 
"[http://www.w3.org/1999/xhtml]spaced";, null, true);
+
+        assertEquals(s, SymbolTable.getNormalizedSymbol(symbols, 
"[http://www.w3.org/1999/xhtml]spaced";, null, false));
+        assertEquals(s, SymbolTable.getNormalizedSymbol(symbols, 
"[http://www.w3.org/1999/xhtml]a:spaced";, null, false));
+        assertEquals(s, SymbolTable.getNormalizedSymbol(symbols, 
"[http://www.w3.org/1999/xhtml]b:spaced";, null, false));
+        assertEquals(s, SymbolTable.getNormalizedSymbol(symbols, 
"[http://www.w3.org/1999/xhtml]x:spaced";, null, false));
+
+        NamespaceMap m = new NamespaceMap();
+        m.setNamespace("z", "http://www.w3.org/1999/xhtml";);
+        assertEquals(s, SymbolTable.getNormalizedSymbol(symbols, "z:spaced", 
m, false));
+    }
+}

Propchange: 
xml/xindice/trunk/java/tests/src/org/apache/xindice/xml/SymbolTableTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
xml/xindice/trunk/java/tests/src/org/apache/xindice/xml/SymbolTableTest.java
------------------------------------------------------------------------------
    svn:keywords = Id Revision Author Date


Reply via email to