bradford    2002/06/09 12:49:03

  Modified:    java/src/org/apache/xindice/core/filer BTree.java
                        BTreeFiler.java FSFiler.java HashFiler.java
                        MemFiler.java Paged.java
               java/src/org/apache/xindice/core/fulltext
                        FullTextIndexer.java
               java/src/org/apache/xindice/core/indexer NameIndexer.java
                        ValueIndexer.java
  Log:
  Some modifications to support better concurrent access and multiple file
  descriptors accessing the same filer.  This is groundwork for a true
  transaction system.
  
  Revision  Changes    Path
  1.5       +127 -100  
xml-xindice/java/src/org/apache/xindice/core/filer/BTree.java
  
  Index: BTree.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/filer/BTree.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- BTree.java        23 Feb 2002 02:33:41 -0000      1.4
  +++ BTree.java        9 Jun 2002 19:49:02 -0000       1.5
  @@ -56,14 +56,12 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    *
  - * $Id: BTree.java,v 1.4 2002/02/23 02:33:41 kstaken Exp $
  + * $Id: BTree.java,v 1.5 2002/06/09 19:49:02 bradford Exp $
    */
   
   import org.apache.xindice.core.*;
   import org.apache.xindice.core.data.*;
   import org.apache.xindice.core.indexer.*;
  -import org.apache.xindice.core.indexer.helpers.*;
  -import org.apache.xindice.util.*;
   
   import java.io.*;
   import java.util.*;
  @@ -100,11 +98,11 @@
      protected static final byte STREAM = 3;
   
      private Map cache = new WeakHashMap();
  -   
  +
      private BTreeFileHeader fileHeader;
      private BTreeRootInfo rootInfo;
      private BTreeNode rootNode;
  -   
  +
      public BTree() {
         super();
         fileHeader = (BTreeFileHeader)getFileHeader();
  @@ -139,12 +137,11 @@
               rootNode.setValues(new Value[0]);
               rootNode.setPointers(new long[0]);
               rootNode.write();
  -            flush();
               close();
               return true;
            }
            catch ( Exception e ) {
  -org.apache.xindice.Debug.printStackTrace(e);
  +            org.apache.xindice.Debug.printStackTrace(e);
            }
         }
         return false;
  @@ -178,7 +175,7 @@
      public long addValue(BTreeRootInfo root, Value value, long pointer) 
throws IOException, BTreeException {
         return getRootNode(root).addValue(value, pointer);
      }
  -   
  +
      /**
       * removeValue removes a Value from the BTree and returns the
       * associated pointer for it.
  @@ -201,7 +198,7 @@
      public long removeValue(BTreeRootInfo root, Value value) throws 
IOException, BTreeException {
         return getRootNode(root).removeValue(value);
      }
  -   
  +
      /**
       * findValue finds a Value in the BTree and returns the associated
       * pointer for it.
  @@ -224,7 +221,7 @@
      public long findValue(BTreeRootInfo root, Value value) throws 
IOException, BTreeException {
         return getRootNode(root).findValue(value);
      }
  -   
  +
      /**
       * query performs a query against the BTree and performs callback
       * operations to report the search results.
  @@ -258,7 +255,7 @@
      protected final BTreeRootInfo createBTreeRoot(Value v) throws 
IOException, BTreeException {
         BTreeNode n = createBTreeNode(rootInfo, BTree.LEAF, null);
         n.write();
  -      
  +
         long position = n.page.getPageNum();
         addValue(v, position);
         return new BTreeRootInfo(v, position);
  @@ -275,7 +272,7 @@
      protected final BTreeRootInfo createBTreeRoot(BTreeRootInfo root, Value 
v) throws IOException, BTreeException {
         BTreeNode n = createBTreeNode(root, BTree.LEAF, null);
         n.write();
  -      
  +
         long position = n.page.getPageNum();
         addValue(v, position);
         return new BTreeRootInfo(root, v, position);
  @@ -306,7 +303,7 @@
         long position = findValue(root, v);
         return new BTreeRootInfo(root, v, position);
      }
  -   
  +
      /**
       * setRootNode resets the root for the specified root object to the
       * provided BTreeNode's page number.
  @@ -361,19 +358,27 @@
      protected final BTreeNode getRootNode() {
         return rootNode;
      }
  -   
  +
      private BTreeNode getBTreeNode(BTreeRootInfo root, long page, BTreeNode 
parent) {
         try {
  -         Long pNum = new Long(page);
  -         BTreeNode node = (BTreeNode)cache.get(pNum);
  -         if ( node == null ) {
  -            Page p = getPage(pNum);
  -            node = new BTreeNode(root, p, parent);
  -            node.read();
  +         BTreeNode node;
  +         synchronized ( this ) {
  +            Long pNum = new Long(page);
  +            node = (BTreeNode)cache.get(pNum);
  +            if ( node == null ) {
  +               Page p = getPage(pNum);
  +               node = new BTreeNode(root, p, parent);
  +            }
  +            else {
  +               node.root = root;
  +               node.parent = parent;
  +            }
            }
  -         else {
  -            node.root = root;
  -            node.parent = parent;
  +         synchronized ( node ) {
  +            if ( !node.isLoaded() ) {
  +               node.read();
  +               node.setLoaded(true);
  +            }
            }
            return node;
         }
  @@ -395,8 +400,8 @@
            return null;
         }
      }
  -   
  -   
  +
  +
      /**
       * BTreeRootInfo
       */
  @@ -417,7 +422,7 @@
            this.name = name;
            this.page = page;
         }
  -      
  +
         public BTreeRootInfo(String name, long page) {
            this.parent = rootInfo;
            this.name = new Value(name);
  @@ -429,31 +434,31 @@
            this.name = name;
            this.page = page;
         }
  -      
  +
         private BTreeRootInfo(long page) {
            parent = null;
            name = null;
            this.page = page;
         }
   
  -      public BTreeRootInfo getParent() {
  +      public synchronized BTreeRootInfo getParent() {
            return parent;
         }
  -      
  -      public Value getName() {
  +
  +      public synchronized Value getName() {
            return name;
         }
  -      
  -      public long getPage() {
  +
  +      public synchronized long getPage() {
            return page;
         }
  -      
  -      public void setPage(long page) {
  +
  +      public synchronized void setPage(long page) {
            this.page = page;
         }
      }
   
  -   
  +
      /**
       * BTreeNode
       */
  @@ -465,6 +470,7 @@
         private Value[] values;
         private long[] ptrs;
         private BTreeNode parent;
  +      private boolean loaded;
   
         public BTreeNode(BTreeRootInfo root, Page page, BTreeNode parent) {
            this.root = root;
  @@ -472,31 +478,39 @@
            this.parent = parent;
            ph = (BTreePageHeader)page.getPageHeader();
         }
  -      
  +
         public BTreeNode(BTreeRootInfo root, Page page) {
            this.root = root;
            this.page = page;
            ph = (BTreePageHeader)page.getPageHeader();
         }
   
  -      public void setValues(Value[] values) {
  +      public synchronized void setValues(Value[] values) {
            this.values = values;
            ph.setValueCount((short)values.length);
         }
   
  -      public Value[] getValues() {
  +      public synchronized Value[] getValues() {
            return values;
         }
   
  -      public void setPointers(long[] ptrs) {
  +      public synchronized void setPointers(long[] ptrs) {
            this.ptrs = ptrs;
         }
   
  -      public long[] getPointers() {
  +      public synchronized long[] getPointers() {
            return ptrs;
         }
   
  -      public void read() throws IOException {
  +      public synchronized boolean isLoaded() {
  +         return loaded;
  +      }
  +
  +      public synchronized void setLoaded(boolean loaded) {
  +         this.loaded = loaded;
  +      }
  +
  +      public synchronized void read() throws IOException {
            Value v = readValue(page);
            DataInputStream is = new DataInputStream(v.getInputStream());
   
  @@ -514,11 +528,11 @@
            ptrs = new long[ph.getPointerCount()];
            for ( int i = 0; i < ptrs.length; i++ )
               ptrs[i] = is.readLong();
  -         
  +
            cache.put(new Long(page.getPageNum()), this);
         }
   
  -      public void write() throws IOException {
  +      public synchronized void write() throws IOException {
            ByteArrayOutputStream bos = new 
ByteArrayOutputStream((int)fileHeader.getWorkSize());
            DataOutputStream os = new DataOutputStream(bos);
   
  @@ -531,20 +545,35 @@
            // Write out the pointers
            for ( int i = 0; i < ptrs.length; i++ )
               os.writeLong(ptrs[i]);
  -         
  +
            writeValue(page, new Value(bos.toByteArray()));
  -         
  +
            cache.put(new Long(page.getPageNum()), this);
         }
   
         public BTreeNode getChildNode(int idx) throws IOException {
  -         if ( ph.getStatus() == BRANCH && idx >= 0 && idx < ptrs.length )
  -            return getBTreeNode(root, ptrs[idx], this);
  +         boolean load;
  +         BTreeRootInfo loadNode;
  +         long loadPtr;
  +         synchronized ( this ) {
  +            if ( ph.getStatus() == BRANCH && idx >= 0 && idx < ptrs.length ) 
{
  +               load = true;
  +               loadNode = root;
  +               loadPtr = ptrs[idx];
  +            }
  +            else {
  +               load = false;
  +               loadNode = null;
  +               loadPtr = 0;
  +            }
  +         }
  +         if ( load )
  +            return getBTreeNode(loadNode, loadPtr, this);
            else
               return null;
         }
   
  -      public void getChildStream(int idx, Streamable stream) throws 
IOException {
  +      public synchronized void getChildStream(int idx, Streamable stream) 
throws IOException {
            if ( ph.getStatus() == LEAF && idx >= 0 && idx < ptrs.length ) {
               Value v = readValue(ptrs[idx]);
               DataInputStream dis = new DataInputStream(v.getInputStream());
  @@ -552,16 +581,16 @@
            }
         }
   
  -      public long removeValue(Value value) throws IOException, 
BTreeException {
  +      public synchronized long removeValue(Value value) throws IOException, 
BTreeException {
            int idx = Arrays.binarySearch(values, value);
            switch ( ph.getStatus() ) {
               case BRANCH:
  -               idx = idx < 0 ? -(idx+1) : idx+1;
  +               idx = idx < 0 ? -(idx + 1) : idx + 1;
                  return getChildNode(idx).removeValue(value);
   
               case LEAF:
                  if ( idx < 0 )
  -                  throw new BTreeNotFoundException("Value 
'"+value.toString()+"' doesn't exist");
  +                  throw new BTreeNotFoundException("Value '" + 
value.toString() + "' doesn't exist");
                  else {
                     long oldPtr = ptrs[idx];
   
  @@ -577,12 +606,12 @@
            }
         }
   
  -      public long addValue(Value value, long pointer) throws IOException, 
BTreeException {
  +      public synchronized long addValue(Value value, long pointer) throws 
IOException, BTreeException {
            int idx = Arrays.binarySearch(values, value);
   
            switch ( ph.getStatus() ) {
               case BRANCH:
  -               idx = idx < 0 ? -(idx+1) : idx+1;
  +               idx = idx < 0 ? -(idx + 1) : idx + 1;
                  return getChildNode(idx).addValue(value, pointer);
   
               case LEAF:
  @@ -590,19 +619,19 @@
                     // Value was found... Overwrite
                     long oldPtr = ptrs[idx];
                     ptrs[idx] = pointer;
  -                  
  +
                     setValues(values);
                     setPointers(ptrs);
  -                  
  +
                     write();
                     return oldPtr;
                  }
                  else {
                     // Value was not found
  -                  idx = -(idx+1);
  +                  idx = -(idx + 1);
   
                     // Check to see if we've exhausted the block
  -                  boolean split = ph.getDataLen()+6+value.getLength() > 
fileHeader.getWorkSize();
  +                  boolean split = ph.getDataLen() + 6 + value.getLength() > 
fileHeader.getWorkSize();
   
                     setValues(insertArrayValue(values, value, idx));
                     setPointers(insertArrayLong(ptrs, pointer, idx));
  @@ -619,15 +648,15 @@
            }
         }
   
  -      public void promoteValue(Value value, long rightPointer) throws 
IOException, BTreeException {
  +      public synchronized void promoteValue(Value value, long rightPointer) 
throws IOException, BTreeException {
            // Check to see if we've exhausted the block
  -         boolean split = ph.getDataLen()+6+value.getLength() > 
fileHeader.getWorkSize();
  +         boolean split = ph.getDataLen() + 6 + value.getLength() > 
fileHeader.getWorkSize();
   
            int idx = Arrays.binarySearch(values, value);
  -         idx = idx < 0 ? -(idx+1) : idx+1;
  +         idx = idx < 0 ? -(idx + 1) : idx + 1;
   
            setValues(insertArrayValue(values, value, idx));
  -         setPointers(insertArrayLong(ptrs, rightPointer, idx+1));
  +         setPointers(insertArrayLong(ptrs, rightPointer, idx + 1));
   
            if ( split )
               split();
  @@ -642,7 +671,7 @@
            return new Value(b);
         }
   
  -      public void split() throws IOException, BTreeException {
  +      public synchronized void split() throws IOException, BTreeException {
            Value[] leftVals;
            Value[] rightVals;
            long[] leftPtrs;
  @@ -656,13 +685,13 @@
            switch ( ph.getStatus() ) {
               case BRANCH:
                  leftVals = new Value[pivot];
  -               leftPtrs = new long[leftVals.length+1];
  -               rightVals = new Value[vc-(pivot+1)];
  -               rightPtrs = new long[rightVals.length+1];
  +               leftPtrs = new long[leftVals.length + 1];
  +               rightVals = new Value[vc - (pivot + 1)];
  +               rightPtrs = new long[rightVals.length + 1];
   
                  System.arraycopy(values, 0, leftVals, 0, leftVals.length);
                  System.arraycopy(ptrs, 0, leftPtrs, 0, leftPtrs.length);
  -               System.arraycopy(values, leftVals.length+1, rightVals, 0, 
rightVals.length);
  +               System.arraycopy(values, leftVals.length + 1, rightVals, 0, 
rightVals.length);
                  System.arraycopy(ptrs, leftPtrs.length, rightPtrs, 0, 
rightPtrs.length);
   
                  separator = values[leftVals.length];
  @@ -671,7 +700,7 @@
               case LEAF:
                  leftVals = new Value[pivot];
                  leftPtrs = new long[leftVals.length];
  -               rightVals = new Value[vc-pivot];
  +               rightVals = new Value[vc - pivot];
                  rightPtrs = new long[rightVals.length];
   
                  System.arraycopy(values, 0, leftVals, 0, leftVals.length);
  @@ -679,7 +708,7 @@
                  System.arraycopy(values, leftVals.length, rightVals, 0, 
rightVals.length);
                  System.arraycopy(ptrs, leftPtrs.length, rightPtrs, 0, 
rightPtrs.length);
   
  -               separator = getSeparator(leftVals[leftVals.length-1], 
rightVals[0]);
  +               separator = getSeparator(leftVals[leftVals.length - 1], 
rightVals[0]);
                  break;
   
               default:
  @@ -698,13 +727,13 @@
               rNode.setValues(rightVals);
               rNode.setPointers(rightPtrs);
   
  -            np.setValues(new Value[] { separator });
  -            np.setPointers(new long[] { page.getPageNum(), 
rNode.page.getPageNum()});
  +            np.setValues(new Value[]{separator});
  +            np.setPointers(new long[]{page.getPageNum(), 
rNode.page.getPageNum()});
   
               parent = np;
  -            
  +
               setRootNode(root, np);
  -            
  +
               write();
               rNode.write();
               np.write();
  @@ -722,17 +751,17 @@
   
         /////////////////////////////////////////////////////////////////
   
  -      public long findValue(Value value) throws IOException, BTreeException {
  +      public synchronized long findValue(Value value) throws IOException, 
BTreeException {
            int idx = Arrays.binarySearch(values, value);
   
            switch ( ph.getStatus() ) {
               case BRANCH:
  -               idx = idx < 0 ? -(idx+1) : idx+1;
  +               idx = idx < 0 ? -(idx + 1) : idx + 1;
                  return getChildNode(idx).findValue(value);
   
               case LEAF:
                  if ( idx < 0 )
  -                  throw new BTreeNotFoundException("Value 
'"+value.toString()+"' doesn't exist");
  +                  throw new BTreeNotFoundException("Value '" + 
value.toString() + "' doesn't exist");
                  else
                     return ptrs[idx];
   
  @@ -742,18 +771,18 @@
         }
   
         // query is a BEAST of a method
  -      public void query(IndexQuery query, BTreeCallback callback) throws 
IOException, BTreeException {
  +      public synchronized void query(IndexQuery query, BTreeCallback 
callback) throws IOException, BTreeException {
            if ( query != null && query.getOperator() != IndexQuery.ANY ) {
               Value[] qvals = query.getValues();
               int leftIdx = Arrays.binarySearch(values, qvals[0]);
  -            int rightIdx = qvals.length > 1 ? Arrays.binarySearch(values, 
qvals[qvals.length-1])
  -                                            : leftIdx;
  +            int rightIdx = qvals.length > 1 ? Arrays.binarySearch(values, 
qvals[qvals.length - 1])
  +               : leftIdx;
               int op = query.getOperator();
  -            
  +
               switch ( ph.getStatus() ) {
                  case BRANCH:
  -                  leftIdx = leftIdx < 0 ? -(leftIdx+1) : leftIdx+1;
  -                  rightIdx = rightIdx < 0 ? -(rightIdx+1) : rightIdx+1;
  +                  leftIdx = leftIdx < 0 ? -(leftIdx + 1) : leftIdx + 1;
  +                  rightIdx = rightIdx < 0 ? -(rightIdx + 1) : rightIdx + 1;
   
                     switch ( query.getOperator() ) {
                        case IndexQuery.BWX:
  @@ -818,30 +847,30 @@
                        case IndexQuery.SW:
                        case IndexQuery.IN:
                           if ( leftIdx < 0 )
  -                           leftIdx = -(leftIdx+1);
  +                           leftIdx = -(leftIdx + 1);
                           if ( rightIdx < 0 )
  -                           rightIdx = -(rightIdx+1);
  +                           rightIdx = -(rightIdx + 1);
                           for ( int i = 0; i < ptrs.length; i++ )
                              if ( i >= leftIdx && i <= rightIdx && 
query.testValue(values[i]) )
  -                             callback.indexInfo(values[i], ptrs[i]);
  +                              callback.indexInfo(values[i], ptrs[i]);
                           break;
   
                        case IndexQuery.NBWX:
                        case IndexQuery.NBW:
                        case IndexQuery.NSW:
                           if ( leftIdx < 0 )
  -                           leftIdx = -(leftIdx+1);
  +                           leftIdx = -(leftIdx + 1);
                           if ( rightIdx < 0 )
  -                           rightIdx = -(rightIdx+1);
  +                           rightIdx = -(rightIdx + 1);
                           for ( int i = 0; i < ptrs.length; i++ )
                              if ( (i <= leftIdx || i >= rightIdx) && 
query.testValue(values[i]) )
  -                             callback.indexInfo(values[i], ptrs[i]);
  +                              callback.indexInfo(values[i], ptrs[i]);
                           break;
   
                        case IndexQuery.LT:
                        case IndexQuery.LEQ:
                           if ( leftIdx < 0 )
  -                           leftIdx = -(leftIdx+1);
  +                           leftIdx = -(leftIdx + 1);
                           for ( int i = 0; i < ptrs.length; i++ )
                              if ( i <= leftIdx && query.testValue(values[i]) )
                                 callback.indexInfo(values[i], ptrs[i]);
  @@ -850,7 +879,7 @@
                        case IndexQuery.GT:
                        case IndexQuery.GEQ:
                           if ( rightIdx < 0 )
  -                           rightIdx = -(rightIdx+1);
  +                           rightIdx = -(rightIdx + 1);
                           for ( int i = 0; i < ptrs.length; i++ )
                              if ( i >= rightIdx && query.testValue(values[i]) )
                                 callback.indexInfo(values[i], ptrs[i]);
  @@ -935,24 +964,24 @@
            super(read);
         }
   
  -      public void read(RandomAccessFile raf) throws IOException {
  +      public synchronized void read(RandomAccessFile raf) throws IOException 
{
            super.read(raf);
            rootPage = raf.readLong();
         }
   
  -      public void write(RandomAccessFile raf) throws IOException {
  +      public synchronized void write(RandomAccessFile raf) throws 
IOException {
            super.write(raf);
            raf.writeLong(rootPage);
         }
   
         /** The root page of the storage tree */
  -      public final void setRootPage(long rootPage) {
  +      public synchronized final void setRootPage(long rootPage) {
            this.rootPage = rootPage;
            setDirty();
         }
   
         /** The root page of the storage tree */
  -      public final long getRootPage() {
  +      public synchronized final long getRootPage() {
            return rootPage;
         }
      }
  @@ -972,7 +1001,7 @@
            super(dis);
         }
   
  -      public void read(DataInputStream dis) throws IOException {
  +      public synchronized void read(DataInputStream dis) throws IOException {
            super.read(dis);
   
            if ( getStatus() == UNUSED )
  @@ -981,24 +1010,24 @@
            valueCount = dis.readShort();
         }
   
  -      public void write(DataOutputStream dos) throws IOException {
  +      public synchronized void write(DataOutputStream dos) throws 
IOException {
            super.write(dos);
            dos.writeShort(valueCount);
         }
   
         /** The number of values stored by this page */
  -      public final void setValueCount(short valueCount) {
  +      public synchronized final void setValueCount(short valueCount) {
            this.valueCount = valueCount;
            setDirty();
         }
   
         /** The number of values stored by this page */
  -      public final short getValueCount() {
  +      public synchronized final short getValueCount() {
            return valueCount;
         }
   
         /** The number of pointers stored by this page */
  -      public final short getPointerCount() {
  +      public synchronized final short getPointerCount() {
            if ( getStatus() == BRANCH )
               return (short)(valueCount + 1);
            else
  @@ -1006,5 +1035,3 @@
         }
      }
   }
  -
  -
  
  
  
  1.2       +35 -37    
xml-xindice/java/src/org/apache/xindice/core/filer/BTreeFiler.java
  
  Index: BTreeFiler.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/filer/BTreeFiler.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- BTreeFiler.java   6 Dec 2001 21:00:12 -0000       1.1
  +++ BTreeFiler.java   9 Jun 2002 19:49:02 -0000       1.2
  @@ -56,13 +56,13 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    *
  - * $Id: BTreeFiler.java,v 1.1 2001/12/06 21:00:12 bradford Exp $
  + * $Id: BTreeFiler.java,v 1.2 2002/06/09 19:49:02 bradford Exp $
    */
   
  -import org.apache.xindice.util.*;
  -import org.apache.xindice.core.*;
   import org.apache.xindice.core.Collection;
  +import org.apache.xindice.core.*;
   import org.apache.xindice.core.data.*;
  +import org.apache.xindice.util.*;
   
   import java.io.*;
   import java.util.*;
  @@ -95,7 +95,7 @@
      }
   
      public void setLocation(String location) {
  -      setFile(new File(collection.getCollectionRoot(), location+".tbl"));
  +      setFile(new File(collection.getCollectionRoot(), location + ".tbl"));
      }
   
      public String getName() {
  @@ -123,18 +123,18 @@
         setLocation(collection.getName());
      }
   
  -   public synchronized Record readRecord(Key key) throws DBException {
  +   public Record readRecord(Key key) throws DBException {
         checkOpened();
         try {
            long pos = findValue(key);
            Page startPage = getPage(pos);
            Value v = readValue(startPage);
            BTreeFilerPageHeader sph = 
(BTreeFilerPageHeader)startPage.getPageHeader();
  -         
  +
            HashMap meta = new HashMap(2);
            meta.put(Record.CREATED, new Long(sph.getCreated()));
            meta.put(Record.MODIFIED, new Long(sph.getModified()));
  -         
  +
            return new Record(key, v, meta);
         }
         catch ( BTreeNotFoundException b ) {
  @@ -148,7 +148,7 @@
         return null;
      }
   
  -   public synchronized boolean writeRecord(Key key, Value value) throws 
DBException {
  +   public boolean writeRecord(Key key, Value value) throws DBException {
         checkOpened();
         try {
            Page p;
  @@ -166,12 +166,12 @@
            long t = System.currentTimeMillis();
            if ( ph.getStatus() == UNUSED )
               ph.setCreated(t);
  -         
  +
            ph.setModified(t);
            ph.setStatus(RECORD);
   
            writeValue(p, value);
  -         
  +
            flush();
         }
         catch ( DBException d ) {
  @@ -183,7 +183,7 @@
         return true;
      }
   
  -   public synchronized boolean deleteRecord(Key key) throws DBException {
  +   public boolean deleteRecord(Key key) throws DBException {
         checkOpened();
         try {
            long pos = findValue(key);
  @@ -191,11 +191,11 @@
   
            removeValue(key);
            unlinkPages(p.getPageNum());
  -         
  +
            fileHeader.decRecordCount();
   
            flush();
  -         
  +
            return true;
         }
         catch ( BTreeNotFoundException b ) {
  @@ -209,21 +209,21 @@
         return false;
      }
   
  -   public synchronized long getRecordCount() throws DBException {
  +   public long getRecordCount() throws DBException {
         checkOpened();
         return fileHeader.getRecordCount();
      }
   
  -   public synchronized RecordSet getRecordSet() throws DBException {
  +   public RecordSet getRecordSet() throws DBException {
         checkOpened();
         return new BTreeFilerRecordSet();
      }
   
  -   public synchronized void flush() throws DBException {
  +   public void flush() throws DBException {
         super.flush();
      }
  -   
  -   
  +
  +
      /**
       * BTreeFilerRecordSet
       */
  @@ -242,24 +242,24 @@
            }
         }
   
  -      public boolean indexInfo(Value value, long pointer) {
  +      public synchronized boolean indexInfo(Value value, long pointer) {
            keys.add(new Key(value));
            return true;
         }
   
  -      public Key getNextKey() {
  +      public synchronized Key getNextKey() {
            return (Key)enum.next();
         }
   
  -      public Record getNextRecord() throws DBException {
  +      public synchronized Record getNextRecord() throws DBException {
            return readRecord((Key)enum.next());
         }
   
  -      public Value getNextValue() throws DBException {
  +      public synchronized Value getNextValue() throws DBException {
            return getNextRecord().getValue();
         }
   
  -      public boolean hasMoreRecords() {
  +      public synchronized boolean hasMoreRecords() {
            return enum.hasNext();
         }
      }
  @@ -309,24 +309,24 @@
            super(read);
         }
   
  -      public void read(RandomAccessFile raf) throws IOException {
  +      public synchronized void read(RandomAccessFile raf) throws IOException 
{
            super.read(raf);
            totalBytes = raf.readLong();
         }
   
  -      public void write(RandomAccessFile raf) throws IOException {
  +      public synchronized void write(RandomAccessFile raf) throws 
IOException {
            super.write(raf);
            raf.writeLong(totalBytes);
         }
   
         /** The total number of bytes in use by the file */
  -      public void setTotalBytes(long totalBytes) {
  +      public synchronized void setTotalBytes(long totalBytes) {
            this.totalBytes = totalBytes;
            setDirty();
         }
   
         /** The total number of bytes in use by the file */
  -      public long getTotalBytes() {
  +      public synchronized long getTotalBytes() {
            return totalBytes;
         }
      }
  @@ -346,7 +346,7 @@
            super(dis);
         }
   
  -      public void read(DataInputStream dis) throws IOException {
  +      public synchronized void read(DataInputStream dis) throws IOException {
            super.read(dis);
   
            if ( getStatus() == UNUSED )
  @@ -356,38 +356,36 @@
            modified = dis.readLong();
         }
   
  -      public void write(DataOutputStream dos) throws IOException {
  +      public synchronized void write(DataOutputStream dos) throws 
IOException {
            super.write(dos);
            dos.writeLong(created);
            dos.writeLong(modified);
         }
   
  -      public void setRecordLen(int recordLen) {
  -         synchronized(fileHeader) {
  -            fileHeader.setTotalBytes((fileHeader.totalBytes - 
getRecordLen()) + recordLen);
  -         }
  +      public synchronized void setRecordLen(int recordLen) {
  +         fileHeader.setTotalBytes((fileHeader.totalBytes - getRecordLen()) + 
recordLen);
            super.setRecordLen(recordLen);
         }
   
         /** UNIX-time when this record was created */
  -      public void setCreated(long created) {
  +      public synchronized void setCreated(long created) {
            this.created = created;
            setDirty();
         }
   
         /** UNIX-time when this record was created */
  -      public long getCreated() {
  +      public synchronized long getCreated() {
            return created;
         }
   
         /** UNIX-time when this record was last modified */
  -      public void setModified(long modified) {
  +      public synchronized void setModified(long modified) {
            this.modified = modified;
            setDirty();
         }
   
         /** UNIX-time when this record was last modified */
  -      public long getModified() {
  +      public synchronized long getModified() {
            return modified;
         }
      }
  
  
  
  1.2       +24 -23    
xml-xindice/java/src/org/apache/xindice/core/filer/FSFiler.java
  
  Index: FSFiler.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/filer/FSFiler.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- FSFiler.java      6 Dec 2001 21:00:12 -0000       1.1
  +++ FSFiler.java      9 Jun 2002 19:49:02 -0000       1.2
  @@ -56,13 +56,14 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    *
  - * $Id: FSFiler.java,v 1.1 2001/12/06 21:00:12 bradford Exp $
  + * $Id: FSFiler.java,v 1.2 2002/06/09 19:49:02 bradford Exp $
    */
   
  -import org.apache.xindice.core.*;
   import org.apache.xindice.core.Collection;
  +import org.apache.xindice.core.*;
   import org.apache.xindice.core.data.*;
   import org.apache.xindice.util.*;
  +
   import java.io.*;
   import java.util.*;
   
  @@ -79,7 +80,7 @@
      private LockManager locks = new LockManager(16);
   
      private Set extensions = null;
  -   
  +
      private String location;
      private Collection collection;
      private File dir;
  @@ -121,14 +122,14 @@
         if ( readOnly )
            throw new FilerException(FaultCodes.COL_COLLECTION_READ_ONLY, 
"Filer is read-only");
      }
  -   
  +
      public boolean close() {
         opened = false;
         return true;
      }
   
      public boolean open() {
  -      opened = ( dir.exists() && dir.isDirectory() );
  +      opened = (dir.exists() && dir.isDirectory());
         return opened;
      }
   
  @@ -151,24 +152,24 @@
         else
            return true;
      }
  -   
  +
      public void flush() {
      }
   
      public Record readRecord(Key key) throws DBException {
         checkOpened();
  -      
  +
         String fname = key.toString();
         if ( !isExtensionValid(fname) )
            return null;
  -      
  +
         File file = new File(dir, fname);
         try {
            locks.acquireSharedLock(file);
  -         
  +
            HashMap meta = new HashMap(1);
            meta.put(Record.MODIFIED, new Long(file.lastModified()));
  -         
  +
            byte[] valueData = cache.getFile(file);
            if ( valueData != null )
               return new Record(key, new Value(valueData), meta);
  @@ -185,11 +186,11 @@
      public boolean writeRecord(Key key, Value value) throws DBException {
         checkOpened();
         checkReadOnly();
  -            
  +
         String fname = key.toString();
         if ( !isExtensionValid(fname) )
            return false;
  -      
  +
         File file = new File(dir, fname);
         try {
            locks.acquireExclusiveLock(file);
  @@ -210,11 +211,11 @@
      public boolean deleteRecord(Key key) throws DBException {
         checkOpened();
         checkReadOnly();
  -      
  +
         String fname = key.toString();
         if ( !isExtensionValid(fname) )
            return false;
  -      
  +
         File file = new File(dir, fname);
         try {
            locks.acquireExclusiveLock(file);
  @@ -231,7 +232,7 @@
   
      public long getRecordCount() throws DBException {
         checkOpened();
  -      
  +
         File[] files = dir.listFiles(new FileFilter() {
            public boolean accept(File file) {
               return file.isFile() && isExtensionValid(file.getName());
  @@ -250,18 +251,18 @@
            int idx = fname.lastIndexOf('.');
            if ( idx == -1 )
               return false;
  -         String ext = fname.substring(idx+1);
  +         String ext = fname.substring(idx + 1);
            if ( !extensions.contains(ext) )
               return false;
         }
         return true;
      }
   
  -   
  +
      /**
       * FSRecordSet
       */
  -   
  +
      private class FSRecordSet implements RecordSet {
         public File[] files;
         public int pos = 0;
  @@ -274,20 +275,20 @@
            });
         }
   
  -      public boolean hasMoreRecords() {
  +      public synchronized boolean hasMoreRecords() {
            return pos < files.length;
         }
   
  -      public Record getNextRecord() throws DBException {
  +      public synchronized Record getNextRecord() throws DBException {
            File file = files[pos++];
            return readRecord(new Key(file.getName()));
         }
   
  -      public Value getNextValue() throws DBException {
  +      public synchronized Value getNextValue() throws DBException {
            return getNextRecord().getValue();
         }
  -      
  -      public Key getNextKey() {
  +
  +      public synchronized Key getNextKey() {
            return new Key(files[pos++].getName());
         }
      }
  
  
  
  1.2       +49 -60    
xml-xindice/java/src/org/apache/xindice/core/filer/HashFiler.java
  
  Index: HashFiler.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/filer/HashFiler.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- HashFiler.java    6 Dec 2001 21:00:12 -0000       1.1
  +++ HashFiler.java    9 Jun 2002 19:49:02 -0000       1.2
  @@ -56,11 +56,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    *
  - * $Id: HashFiler.java,v 1.1 2001/12/06 21:00:12 bradford Exp $
  + * $Id: HashFiler.java,v 1.2 2002/06/09 19:49:02 bradford Exp $
    */
   
  -import org.apache.xindice.core.*;
   import org.apache.xindice.core.Collection;
  +import org.apache.xindice.core.*;
   import org.apache.xindice.core.data.*;
   import org.apache.xindice.util.*;
   
  @@ -104,8 +104,8 @@
      }
   
      public void setLocation(String location) {
  -      setFile(new File(collection.getCollectionRoot(), location+".tbl"));
  -      btree = new BTree(new File(collection.getCollectionRoot(), 
location+".pkx"));
  +      setFile(new File(collection.getCollectionRoot(), location + ".tbl"));
  +      btree = new BTree(new File(collection.getCollectionRoot(), location + 
".pkx"));
      }
   
      public String getName() {
  @@ -145,8 +145,8 @@
            p = getPage(pageNum);
            ph = (HashPageHeader)p.getPageHeader();
            if ( ph.getStatus() == RECORD
  -           && ph.getKeyHash() == key.getHash()
  -           && p.getKey().equals(key) )
  +            && ph.getKeyHash() == key.getHash()
  +            && p.getKey().equals(key) )
               return p;
            pageNum = ph.getNextCollision();
            if ( pageNum == -1 )
  @@ -162,10 +162,10 @@
         while ( true ) {
            p = getPage(pageNum);
            ph = (HashPageHeader)p.getPageHeader();
  -         if ( ( ph.getStatus() == UNUSED || ph.getStatus() == DELETED )
  -           || ( ph.getStatus() == RECORD
  -             && ph.getKeyHash() == key.getHash()
  -             && p.getKey().equals(key) ) )
  +         if ( (ph.getStatus() == UNUSED || ph.getStatus() == DELETED)
  +            || (ph.getStatus() == RECORD
  +            && ph.getKeyHash() == key.getHash()
  +            && p.getKey().equals(key)) )
               return p;
            pageNum = ph.getNextCollision();
            if ( pageNum == -1 ) {
  @@ -177,18 +177,18 @@
         }
      }
   
  -   public synchronized Record readRecord(Key key) throws DBException {
  +   public Record readRecord(Key key) throws DBException {
         checkOpened();
         try {
            Page startPage = seekRecordPage(key);
            if ( startPage != null ) {
               Value v = readValue(startPage);
               HashPageHeader sph = (HashPageHeader)startPage.getPageHeader();
  -            
  +
               HashMap meta = new HashMap(2);
               meta.put(Record.CREATED, new Long(sph.getCreated()));
               meta.put(Record.MODIFIED, new Long(sph.getModified()));
  -            
  +
               return new Record(key, v, meta);
            }
         }
  @@ -198,12 +198,12 @@
         return null;
      }
   
  -   public synchronized boolean writeRecord(Key key, Value value) throws 
DBException {
  +   public boolean writeRecord(Key key, Value value) throws DBException {
         checkOpened();
         try {
            Page p = seekInsertionPage(key);
            HashPageHeader ph = (HashPageHeader)p.getPageHeader();
  -         
  +
            long t = System.currentTimeMillis();
            if ( ph.getStatus() == UNUSED ) {
               // This is a new Record
  @@ -211,13 +211,13 @@
               btree.addValue(key, p.getPageNum());
               ph.setCreated(t);
            }
  -         
  +
            ph.setModified(t);
            ph.setStatus(RECORD);
   
            p.setKey(key);
            writeValue(p, value);
  -         
  +
            flush();
         }
         catch ( Exception e ) {
  @@ -226,23 +226,23 @@
         return true;
      }
   
  -   public synchronized boolean deleteRecord(Key key) throws DBException {
  +   public boolean deleteRecord(Key key) throws DBException {
         checkOpened();
         try {
            int hash = key.getHash();
            long pageNum = hash % fileHeader.getPageCount();
            Page prev = null;
            Page page = null;
  -         
  +
            HashPageHeader prevHead = null;
            HashPageHeader pageHead = null;
  -         
  +
            while ( true ) {
               page = getPage(pageNum);
               pageHead = (HashPageHeader)page.getPageHeader();
               if ( pageHead.getStatus() == RECORD
  -              && pageHead.getKeyHash() == key.getHash()
  -              && page.getKey().equals(key) )
  +               && pageHead.getKeyHash() == key.getHash()
  +               && page.getKey().equals(key) )
                  break;
               pageNum = pageHead.getNextCollision();
               if ( pageNum == -1 )
  @@ -258,14 +258,14 @@
               prevHead.setNextCollision(pageHead.nextCollision);
               prev.write();
            }
  -         
  +
            btree.removeValue(key);
            unlinkPages(page);
   
            fileHeader.decRecordCount();
  -         
  +
            flush();
  -         
  +
            return true;
         }
         catch ( Exception e ) {
  @@ -274,24 +274,24 @@
         return false;
      }
   
  -   public synchronized long getRecordCount() throws DBException {
  +   public long getRecordCount() throws DBException {
         checkOpened();
         return fileHeader.getRecordCount();
      }
   
  -   public synchronized RecordSet getRecordSet() throws DBException {
  +   public RecordSet getRecordSet() throws DBException {
         checkOpened();
         return new HashFilerRecordSet();
      }
   
  -   public synchronized void flush() throws DBException {
  +   public void flush() throws DBException {
         super.flush();
      }
  -   
  +
      /**
       * HashFilerRecordSet
       */
  -   
  +
      private class HashFilerRecordSet implements RecordSet, BTreeCallback {
         private List keys = new ArrayList();
         private Iterator enum;
  @@ -306,24 +306,24 @@
            }
         }
   
  -      public boolean indexInfo(Value value, long pointer) {
  +      public synchronized boolean indexInfo(Value value, long pointer) {
            keys.add(new Key(value));
            return true;
         }
   
  -      public Key getNextKey() {
  +      public synchronized Key getNextKey() {
            return (Key)enum.next();
         }
   
  -      public Record getNextRecord() throws DBException {
  +      public synchronized Record getNextRecord() throws DBException {
            return readRecord((Key)enum.next());
         }
   
  -      public Value getNextValue() throws DBException {
  +      public synchronized Value getNextValue() throws DBException {
            return getNextRecord().getValue();
         }
   
  -      public boolean hasMoreRecords() {
  +      public synchronized boolean hasMoreRecords() {
            return enum.hasNext();
         }
      }
  @@ -373,24 +373,24 @@
            super(read);
         }
   
  -      public void read(RandomAccessFile raf) throws IOException {
  +      public synchronized void read(RandomAccessFile raf) throws IOException 
{
            super.read(raf);
            totalBytes = raf.readLong();
         }
   
  -      public void write(RandomAccessFile raf) throws IOException {
  +      public synchronized void write(RandomAccessFile raf) throws 
IOException {
            super.write(raf);
            raf.writeLong(totalBytes);
         }
   
         /** The total number of bytes in use by the file */
  -      public void setTotalBytes(long totalBytes) {
  +      public synchronized void setTotalBytes(long totalBytes) {
            this.totalBytes = totalBytes;
            setDirty();
         }
   
         /** The total number of bytes in use by the file */
  -      public long getTotalBytes() {
  +      public synchronized long getTotalBytes() {
            return totalBytes;
         }
      }
  @@ -411,7 +411,7 @@
            super(dis);
         }
   
  -      public void read(DataInputStream dis) throws IOException {
  +      public synchronized void read(DataInputStream dis) throws IOException {
            super.read(dis);
   
            if ( getStatus() == UNUSED )
  @@ -422,60 +422,49 @@
            nextCollision = dis.readLong();
         }
   
  -      public void write(DataOutputStream dos) throws IOException {
  +      public synchronized void write(DataOutputStream dos) throws 
IOException {
            super.write(dos);
            dos.writeLong(created);
            dos.writeLong(modified);
            dos.writeLong(nextCollision);
         }
   
  -      public void setRecordLen(int recordLen) {
  -         synchronized(fileHeader) {
  -            fileHeader.setTotalBytes((fileHeader.totalBytes - 
getRecordLen()) + recordLen);
  -         }
  +      public synchronized void setRecordLen(int recordLen) {
  +         fileHeader.setTotalBytes((fileHeader.totalBytes - getRecordLen()) + 
recordLen);
            super.setRecordLen(recordLen);
         }
   
         /** UNIX-time when this record was created */
  -      public void setCreated(long created) {
  +      public synchronized void setCreated(long created) {
            this.created = created;
            setDirty();
         }
   
         /** UNIX-time when this record was created */
  -      public long getCreated() {
  +      public synchronized long getCreated() {
            return created;
         }
   
         /** UNIX-time when this record was last modified */
  -      public void setModified(long modified) {
  +      public synchronized void setModified(long modified) {
            this.modified = modified;
            setDirty();
         }
   
         /** UNIX-time when this record was last modified */
  -      public long getModified() {
  +      public synchronized long getModified() {
            return modified;
         }
   
         /** The next page for a Record collision (if any) */
  -      public void setNextCollision(long nextCollision) {
  +      public synchronized void setNextCollision(long nextCollision) {
            this.nextCollision = nextCollision;
            setDirty();
         }
   
         /** The next page for a Record collision (if any) */
  -      public long getNextCollision() {
  +      public synchronized long getNextCollision() {
            return nextCollision;
         }
      }
   }
  -
  -
  -
  -
  -
  -
  -
  -
  -
  
  
  
  1.2       +18 -18    
xml-xindice/java/src/org/apache/xindice/core/filer/MemFiler.java
  
  Index: MemFiler.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/filer/MemFiler.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- MemFiler.java     6 Dec 2001 21:00:12 -0000       1.1
  +++ MemFiler.java     9 Jun 2002 19:49:02 -0000       1.2
  @@ -56,11 +56,11 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    *
  - * $Id: MemFiler.java,v 1.1 2001/12/06 21:00:12 bradford Exp $
  + * $Id: MemFiler.java,v 1.2 2002/06/09 19:49:02 bradford Exp $
    */
   
  -import org.apache.xindice.core.*;
   import org.apache.xindice.core.Collection;
  +import org.apache.xindice.core.*;
   import org.apache.xindice.core.data.*;
   import org.apache.xindice.util.*;
   
  @@ -86,11 +86,11 @@
         this.hashTable = hashTable;
         this.readOnly = readOnly;
      }
  -   
  +
      public MemFiler(Map hashTable) {
         this(hashTable, false);
      }
  -   
  +
      public void setCollection(Collection collection) {
         this.collection = collection;
      }
  @@ -108,7 +108,7 @@
         if ( readOnly )
            throw new FilerException(FaultCodes.COL_COLLECTION_READ_ONLY, 
"Filer is read-only");
      }
  -   
  +
      public boolean create() {
         hashTable.clear();
         return true;
  @@ -137,13 +137,13 @@
         opened = false;
         return !opened;
      }
  -   
  +
      public void flush() {
      }
  -   
  +
      public Record readRecord(Key key) throws DBException {
         checkOpened();
  -      return(Record)hashTable.get(key);
  +      return (Record)hashTable.get(key);
      }
   
      public boolean writeRecord(Key key, Value value) throws DBException {
  @@ -169,30 +169,30 @@
         return new MemRecordSet();
      }
   
  -   
  +
      /**
       * MemRecordSet
       */
  -   
  +
      private class MemRecordSet implements RecordSet {
         private Iterator enum = hashTable.values().iterator();
   
  -      public boolean hasMoreRecords() throws DBException {
  +      public synchronized boolean hasMoreRecords() throws DBException {
            return enum.hasNext();
         }
   
  -      public Record getNextRecord() throws DBException {
  +      public synchronized Record getNextRecord() throws DBException {
            checkOpened();
  -         return(Record)enum.next();
  +         return (Record)enum.next();
         }
   
  -      public Value getNextValue() throws DBException {
  +      public synchronized Value getNextValue() throws DBException {
            checkOpened();
  -         return((Record)enum.next()).getValue();
  +         return ((Record)enum.next()).getValue();
         }
  -      
  -      public Key getNextKey() {
  -         return((Record)enum.next()).getKey();
  +
  +      public synchronized Key getNextKey() {
  +         return ((Record)enum.next()).getKey();
         }
      }
   }
  
  
  
  1.4       +227 -134  
xml-xindice/java/src/org/apache/xindice/core/filer/Paged.java
  
  Index: Paged.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/filer/Paged.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Paged.java        23 Feb 2002 03:26:27 -0000      1.3
  +++ Paged.java        9 Jun 2002 19:49:02 -0000       1.4
  @@ -56,10 +56,9 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    *
  - * $Id: Paged.java,v 1.3 2002/02/23 03:26:27 bradford Exp $
  + * $Id: Paged.java,v 1.4 2002/06/09 19:49:02 bradford Exp $
    */
   
  -import org.apache.xindice.util.*;
   import org.apache.xindice.core.*;
   import org.apache.xindice.core.data.*;
   
  @@ -74,16 +73,18 @@
   
   public abstract class Paged {
      private static final int MAX_DIRTY_SIZE = 128;
  -   
  +   private static final int MAX_DESCRIPTORS = 16;
  +
      protected static final byte UNUSED = 0;
      protected static final byte OVERFLOW = 126;
      protected static final byte DELETED = 127;
   
      private Map pages = new WeakHashMap();
      private Map dirty = new HashMap();
  -   
  +
      private File file;
  -   private RandomAccessFile raf;
  +   private Stack descriptors = new Stack();
  +   private int descCount = 0;
      private boolean opened = false;
      private FileHeader fileHeader;
   
  @@ -114,6 +115,35 @@
         return file;
      }
   
  +   protected synchronized final RandomAccessFile getDescriptor() throws 
IOException {
  +      if ( !descriptors.empty() )
  +         return (RandomAccessFile)descriptors.pop();
  +      else {
  +         if ( descCount < MAX_DESCRIPTORS ) {
  +            descCount++;
  +            return new RandomAccessFile(file, "rw");
  +         }
  +         else {
  +            while ( true ) {
  +               try {
  +                  wait();
  +                  return (RandomAccessFile)descriptors.pop();
  +               }
  +               catch ( Exception e ) {
  +                  // Who Cares
  +               }
  +            }
  +         }
  +      }
  +   }
  +
  +   protected synchronized final void putDescriptor(RandomAccessFile raf) {
  +      if ( raf != null ) {
  +         descriptors.push(raf);
  +         notify();
  +      }
  +   }
  +
      /**
       * getPage returns the page specified by pageNum.
       *
  @@ -122,17 +152,25 @@
       * @throws IOException if an Exception occurs
       */
      protected final Page getPage(Long lp) throws IOException {
  -      Page p = (Page)dirty.get(lp); // Check if it's in the dirty stash
  -      if ( p == null )
  -         p = (Page)pages.get(lp);   // Check if it's in the volatile cache
  -      if ( p == null ) {
  -         p = new Page(lp.longValue());
  -         p.read();
  -         pages.put(lp, p);
  +      Page p;
  +      synchronized ( this ) {
  +         p = (Page)dirty.get(lp); // Check if it's in the dirty stash
  +         if ( p == null )
  +            p = (Page)pages.get(lp);   // Check if it's in the volatile cache
  +         if ( p == null ) {
  +            p = new Page(lp.longValue());
  +            pages.put(lp, p);
  +         }
  +      }
  +      synchronized ( p ) {
  +         if ( !p.isLoaded() ) {
  +            p.read();
  +            p.setLoaded(true);
  +         }
         }
         return p;
      }
  -   
  +
      /**
       * getPage returns the page specified by pageNum.
       *
  @@ -143,7 +181,7 @@
      protected final Page getPage(long pageNum) throws IOException {
         return getPage(new Long(pageNum));
      }
  -   
  +
      /**
       * readValue reads the multi-Paged Value starting at the specified
       * Page.
  @@ -251,7 +289,7 @@
            page.header.setNextPage(-1);
            page.write();
            page = nextPage != -1 ? getPage(nextPage)
  -                               : null;
  +            : null;
         }
   
         if ( page != null ) {
  @@ -303,7 +341,7 @@
         else {
            // Grow the file
            pageNum = fileHeader.totalCount;
  -         fileHeader.setTotalCount(pageNum+1);
  +         fileHeader.setTotalCount(pageNum + 1);
            p = getPage(pageNum);
         }
   
  @@ -317,7 +355,7 @@
         if ( !opened )
            throw new FilerException(FaultCodes.COL_COLLECTION_CLOSED, "Filer 
is closed");
      }
  -   
  +
      /**
       * getFileHeader returns the FileHeader
       *
  @@ -332,22 +370,28 @@
      }
   
      public boolean create() throws DBException {
  +      RandomAccessFile raf = null;
         try {
  -         raf = new RandomAccessFile(file, "rw");
  +         raf = getDescriptor();
            fileHeader.write();
            flush();
            raf.close();
            return true;
         }
         catch ( Exception e ) {
  -         throw new FilerException(FaultCodes.GEN_CRITICAL_ERROR, "Error 
creating "+file.getName());
  +         throw new FilerException(FaultCodes.GEN_CRITICAL_ERROR, "Error 
creating " + file.getName());
  +      }
  +      finally {
  +         //putDescriptor(raf);
  +         descCount = 0;
         }
      }
   
      public boolean open() throws DBException {
  +      RandomAccessFile raf = null;
         try {
            if ( exists() ) {
  -            raf = new RandomAccessFile(file, "rw");
  +            raf = getDescriptor();
               fileHeader.read();
               opened = true;
            }
  @@ -356,23 +400,34 @@
            return opened;
         }
         catch ( Exception e ) {
  -         throw new FilerException(FaultCodes.GEN_CRITICAL_ERROR, "Error 
opening "+file.getName());
  +         throw new FilerException(FaultCodes.GEN_CRITICAL_ERROR, "Error 
opening " + file.getName());
  +      }
  +      finally {
  +         putDescriptor(raf);
         }
      }
   
  -   public boolean close() throws DBException {
  +   public synchronized boolean close() throws DBException {
         try {
            if ( isOpened() ) {
               flush();
               opened = false;
  -            raf.close();
  +            while ( !descriptors.empty() ) {
  +               try {
  +                  RandomAccessFile raf = getDescriptor();
  +                  raf.close();
  +               }
  +               catch ( Exception e ) {
  +                  // TODO Hmmmm....
  +               }
  +            }
               return true;
            }
            else
               return false;
         }
         catch ( Exception e ) {
  -         throw new FilerException(FaultCodes.GEN_CRITICAL_ERROR, "Error 
closing "+file.getName());
  +         throw new FilerException(FaultCodes.GEN_CRITICAL_ERROR, "Error 
closing " + file.getName());
         }
      }
   
  @@ -389,7 +444,7 @@
               return true;
         }
         catch ( Exception e ) {
  -         throw new FilerException(FaultCodes.COL_CANNOT_DROP, "Can't drop 
"+file.getName());
  +         throw new FilerException(FaultCodes.COL_CANNOT_DROP, "Can't drop " 
+ file.getName());
         }
      }
   
  @@ -416,12 +471,12 @@
               error = true;
            }
         }
  -      
  +
         if ( error )
            throw new FilerException(FaultCodes.GEN_CRITICAL_ERROR, "Error 
performing flush!");
      }
  -   
  -   
  +
  +
      /**
       * createFileHeader must be implemented by a Paged implementation
       * in order to create an appropriate subclass instance of a FileHeader.
  @@ -471,78 +526,78 @@
      // These are a bunch of utility methods for subclasses
   
      public static Value[] insertArrayValue(Value[] vals, Value val, int idx) {
  -      Value[] newVals = new Value[vals.length+1];
  +      Value[] newVals = new Value[vals.length + 1];
         if ( idx > 0 )
            System.arraycopy(vals, 0, newVals, 0, idx);
         newVals[idx] = val;
         if ( idx < vals.length )
  -         System.arraycopy(vals, idx, newVals, idx+1, vals.length-idx);
  +         System.arraycopy(vals, idx, newVals, idx + 1, vals.length - idx);
         return newVals;
      }
   
      public static Value[] deleteArrayValue(Value[] vals, int idx) {
  -      Value[] newVals = new Value[vals.length-1];
  +      Value[] newVals = new Value[vals.length - 1];
         if ( idx > 0 )
            System.arraycopy(vals, 0, newVals, 0, idx);
  -      if ( idx < newVals.length)
  -         System.arraycopy(vals, idx+1, newVals, idx, newVals.length-idx);
  +      if ( idx < newVals.length )
  +         System.arraycopy(vals, idx + 1, newVals, idx, newVals.length - idx);
         return newVals;
      }
   
      public static long[] insertArrayLong(long[] vals, long val, int idx) {
  -      long[] newVals = new long[vals.length+1];
  +      long[] newVals = new long[vals.length + 1];
         if ( idx > 0 )
            System.arraycopy(vals, 0, newVals, 0, idx);
         newVals[idx] = val;
         if ( idx < vals.length )
  -         System.arraycopy(vals, idx, newVals, idx+1, vals.length-idx);
  +         System.arraycopy(vals, idx, newVals, idx + 1, vals.length - idx);
         return newVals;
      }
   
      public static long[] deleteArrayLong(long[] vals, int idx) {
  -      long[] newVals = new long[vals.length-1];
  +      long[] newVals = new long[vals.length - 1];
         if ( idx > 0 )
            System.arraycopy(vals, 0, newVals, 0, idx);
  -      if ( idx < newVals.length)
  -         System.arraycopy(vals, idx+1, newVals, idx, newVals.length-idx);
  +      if ( idx < newVals.length )
  +         System.arraycopy(vals, idx + 1, newVals, idx, newVals.length - idx);
         return newVals;
      }
   
      public static int[] insertArrayInt(int[] vals, int val, int idx) {
  -      int[] newVals = new int[vals.length+1];
  +      int[] newVals = new int[vals.length + 1];
         if ( idx > 0 )
            System.arraycopy(vals, 0, newVals, 0, idx);
         newVals[idx] = val;
         if ( idx < vals.length )
  -         System.arraycopy(vals, idx, newVals, idx+1, vals.length-idx);
  +         System.arraycopy(vals, idx, newVals, idx + 1, vals.length - idx);
         return newVals;
      }
   
      public static int[] deleteArrayInt(int[] vals, int idx) {
  -      int[] newVals = new int[vals.length-1];
  +      int[] newVals = new int[vals.length - 1];
         if ( idx > 0 )
            System.arraycopy(vals, 0, newVals, 0, idx);
  -      if ( idx < newVals.length)
  -         System.arraycopy(vals, idx+1, newVals, idx, newVals.length-idx);
  +      if ( idx < newVals.length )
  +         System.arraycopy(vals, idx + 1, newVals, idx, newVals.length - idx);
         return newVals;
      }
   
      public static short[] insertArrayShort(short[] vals, short val, int idx) {
  -      short[] newVals = new short[vals.length+1];
  +      short[] newVals = new short[vals.length + 1];
         if ( idx > 0 )
            System.arraycopy(vals, 0, newVals, 0, idx);
         newVals[idx] = val;
         if ( idx < vals.length )
  -         System.arraycopy(vals, idx, newVals, idx+1, vals.length-idx);
  +         System.arraycopy(vals, idx, newVals, idx + 1, vals.length - idx);
         return newVals;
      }
   
      public static short[] deleteArrayShort(short[] vals, int idx) {
  -      short[] newVals = new short[vals.length-1];
  +      short[] newVals = new short[vals.length - 1];
         if ( idx > 0 )
            System.arraycopy(vals, 0, newVals, 0, idx);
  -      if ( idx < newVals.length)
  -         System.arraycopy(vals, idx+1, newVals, idx, newVals.length-idx);
  +      if ( idx < newVals.length )
  +         System.arraycopy(vals, idx + 1, newVals, idx, newVals.length - idx);
         return newVals;
      }
   
  @@ -586,13 +641,20 @@
               read();
         }
   
  -      public final void read() throws IOException {
  -         raf.seek(0);
  -         read(raf);
  -         calculateWorkSize();
  +      public synchronized final void read() throws IOException {
  +         RandomAccessFile raf = null;
  +         try {
  +            raf = getDescriptor();
  +            raf.seek(0);
  +            read(raf);
  +            calculateWorkSize();
  +         }
  +         finally {
  +            putDescriptor(raf);
  +         }
         }
   
  -      public void read(RandomAccessFile raf) throws IOException {
  +      public synchronized void read(RandomAccessFile raf) throws IOException 
{
            headerSize = raf.readShort();
            pageSize = raf.readInt();
            pageCount = raf.readLong();
  @@ -604,16 +666,23 @@
            recordCount = raf.readLong();
         }
   
  -      public final void write() throws IOException {
  +      public synchronized final void write() throws IOException {
            if ( !dirty )
               return;
  -         
  -         raf.seek(0);
  -         write(raf);
  -         dirty = false;
  +
  +         RandomAccessFile raf = null;
  +         try {
  +            raf = getDescriptor();
  +            raf.seek(0);
  +            write(raf);
  +            dirty = false;
  +         }
  +         finally {
  +            putDescriptor(raf);
  +         }
         }
   
  -      public void write(RandomAccessFile raf) throws IOException {
  +      public synchronized void write(RandomAccessFile raf) throws 
IOException {
            raf.writeShort(headerSize);
            raf.writeInt(pageSize);
            raf.writeLong(pageCount);
  @@ -625,132 +694,132 @@
            raf.writeLong(recordCount);
         }
   
  -      public final void setDirty() {
  +      public synchronized final void setDirty() {
            dirty = true;
         }
   
  -      public final boolean isDirty() {
  +      public synchronized final boolean isDirty() {
            return dirty;
         }
   
         /** The size of the FileHeader.  Usually 1 OS Page */
  -      public final void setHeaderSize(short headerSize) {
  +      public synchronized final void setHeaderSize(short headerSize) {
            this.headerSize = headerSize;
            dirty = true;
         }
   
         /** The size of the FileHeader.  Usually 1 OS Page */
  -      public final short getHeaderSize() {
  +      public synchronized final short getHeaderSize() {
            return headerSize;
         }
   
         /** The size of a page.  Usually a multiple of a FS block */
  -      public final void setPageSize(int pageSize) {
  +      public synchronized final void setPageSize(int pageSize) {
            this.pageSize = pageSize;
            calculateWorkSize();
            dirty = true;
         }
   
         /** The size of a page.  Usually a multiple of a FS block */
  -      public final int getPageSize() {
  +      public synchronized final int getPageSize() {
            return pageSize;
         }
   
         /** The number of pages in primary storage */
  -      public final void setPageCount(long pageCount) {
  +      public synchronized final void setPageCount(long pageCount) {
            this.pageCount = pageCount;
            dirty = true;
         }
   
         /** The number of pages in primary storage */
  -      public final long getPageCount() {
  +      public synchronized final long getPageCount() {
            return pageCount;
         }
   
         /** The number of total pages in the file */
  -      public final void setTotalCount(long totalCount) {
  +      public synchronized final void setTotalCount(long totalCount) {
            this.totalCount = totalCount;
            dirty = true;
         }
   
         /** The number of total pages in the file */
  -      public final long getTotalCount() {
  +      public synchronized final long getTotalCount() {
            return totalCount;
         }
   
         /** The first free page in unused secondary space */
  -      public final void setFirstFreePage(long firstFreePage) {
  +      public synchronized final void setFirstFreePage(long firstFreePage) {
            this.firstFreePage = firstFreePage;
            dirty = true;
         }
   
         /** The first free page in unused secondary space */
  -      public final long getFirstFreePage() {
  +      public synchronized final long getFirstFreePage() {
            return firstFreePage;
         }
   
         /** The last free page in unused secondary space */
  -      public final void setLastFreePage(long lastFreePage) {
  +      public synchronized final void setLastFreePage(long lastFreePage) {
            this.lastFreePage = lastFreePage;
            dirty = true;
         }
   
         /** The last free page in unused secondary space */
  -      public final long getLastFreePage() {
  +      public synchronized final long getLastFreePage() {
            return lastFreePage;
         }
   
         /** The size of a page header. 64 is sufficient */
  -      public final void setPageHeaderSize(byte pageHeaderSize) {
  +      public synchronized final void setPageHeaderSize(byte pageHeaderSize) {
            this.pageHeaderSize = pageHeaderSize;
            calculateWorkSize();
            dirty = true;
         }
   
         /** The size of a page header. 64 is sufficient */
  -      public final byte getPageHeaderSize() {
  +      public synchronized final byte getPageHeaderSize() {
            return pageHeaderSize;
         }
   
         /** The maximum number of bytes a key can be.  256 is good */
  -      public final void setMaxKeySize(short maxKeySize) {
  +      public synchronized final void setMaxKeySize(short maxKeySize) {
            this.maxKeySize = maxKeySize;
            dirty = true;
         }
   
         /** The maximum number of bytes a key can be.  256 is good */
  -      public final short getMaxKeySize() {
  +      public synchronized final short getMaxKeySize() {
            return maxKeySize;
         }
   
         /** The number of records being managed by the file (not pages) */
  -      public final void setRecordCount(long recordCount) {
  +      public synchronized final void setRecordCount(long recordCount) {
            this.recordCount = recordCount;
            dirty = true;
         }
   
         /** Increment the number of records being managed by the file */
  -      public final void incRecordCount() {
  +      public synchronized final void incRecordCount() {
            recordCount++;
            dirty = true;
         }
   
         /** Decrement the number of records being managed by the file */
  -      public final void decRecordCount() {
  +      public synchronized final void decRecordCount() {
            recordCount--;
            dirty = true;
         }
   
         /** The number of records being managed by the file (not pages) */
  -      public final long getRecordCount() {
  +      public synchronized final long getRecordCount() {
            return recordCount;
         }
   
  -      private void calculateWorkSize() {
  +      private synchronized void calculateWorkSize() {
            workSize = pageSize - pageHeaderSize;
         }
   
  -      public final int getWorkSize() {
  +      public synchronized final int getWorkSize() {
            return workSize;
         }
      }
  @@ -775,10 +844,10 @@
            read(dis);
         }
   
  -      public void read(DataInputStream dis) throws IOException {
  +      public synchronized void read(DataInputStream dis) throws IOException {
            status = dis.readByte();
            dirty = false;
  -         
  +
            if ( status == UNUSED )
               return;
   
  @@ -789,7 +858,7 @@
            nextPage = dis.readLong();
         }
   
  -      public void write(DataOutputStream dos) throws IOException {
  +      public synchronized void write(DataOutputStream dos) throws 
IOException {
            dirty = false;
            dos.writeByte(status);
            dos.writeShort(keyLen);
  @@ -799,26 +868,26 @@
            dos.writeLong(nextPage);
         }
   
  -      public final boolean isDirty() {
  +      public synchronized final boolean isDirty() {
            return dirty;
         }
  -      
  -      public final void setDirty() {
  +
  +      public synchronized final void setDirty() {
            dirty = true;
         }
  -      
  +
         /** The status of this page (UNUSED, RECORD, DELETED, etc...) */
  -      public final void setStatus(byte status) {
  +      public synchronized final void setStatus(byte status) {
            this.status = status;
            dirty = true;
         }
   
         /** The status of this page (UNUSED, RECORD, DELETED, etc...) */
  -      public final byte getStatus() {
  +      public synchronized final byte getStatus() {
            return status;
         }
   
  -      public final void setKey(Key key) {
  +      public synchronized final void setKey(Key key) {
            // setKey WIPES OUT the Page data
            setRecordLen(0);
            dataLen = 0;
  @@ -828,57 +897,57 @@
         }
   
         /** The length of the Key */
  -      public final void setKeyLen(short keyLen) {
  +      public synchronized final void setKeyLen(short keyLen) {
            this.keyLen = keyLen;
            dirty = true;
         }
   
         /** The length of the Key */
  -      public final short getKeyLen() {
  +      public synchronized final short getKeyLen() {
            return keyLen;
         }
   
         /** The hashed value of the Key for quick comparisons */
  -      public final void setKeyHash(int keyHash) {
  +      public synchronized final void setKeyHash(int keyHash) {
            this.keyHash = keyHash;
            dirty = true;
         }
   
         /** The hashed value of the Key for quick comparisons */
  -      public final int getKeyHash() {
  +      public synchronized final int getKeyHash() {
            return keyHash;
         }
   
         /** The length of the Data */
  -      public final void setDataLen(int dataLen) {
  +      public synchronized final void setDataLen(int dataLen) {
            this.dataLen = dataLen;
            dirty = true;
         }
   
         /** The length of the Data */
  -      public final int getDataLen() {
  +      public synchronized final int getDataLen() {
            return dataLen;
         }
   
         /** The length of the Record's value */
  -      public void setRecordLen(int recordLen) {
  +      public synchronized void setRecordLen(int recordLen) {
            this.recordLen = recordLen;
            dirty = true;
         }
   
         /** The length of the Record's value */
  -      public final int getRecordLen() {
  +      public synchronized final int getRecordLen() {
            return recordLen;
         }
   
         /** The next page for this Record (if overflowed) */
  -      public final void setNextPage(long nextPage) {
  +      public synchronized final void setNextPage(long nextPage) {
            this.nextPage = nextPage;
            dirty = true;
         }
   
         /** The next page for this Record (if overflowed) */
  -      public final long getNextPage() {
  +      public synchronized final long getNextPage() {
            return nextPage;
         }
      }
  @@ -906,6 +975,8 @@
         /** The offset into the file that this page starts */
         private long offset;
   
  +      private boolean loaded;
  +
         public Page() {
         }
   
  @@ -914,24 +985,31 @@
            setPageNum(pageNum);
         }
   
  -      public void read() throws IOException {
  -         Page page = null;
  -         data = new byte[fileHeader.pageSize];
  +      public synchronized void read() throws IOException {
  +         RandomAccessFile raf = null;
  +         try {
  +            Page page = null;
  +            data = new byte[fileHeader.pageSize];
   
  -         raf.seek(offset);
  -         raf.read(data);
  -         
  -         ByteArrayInputStream bis = new ByteArrayInputStream(data);
  -         DataInputStream dis = new DataInputStream(bis);
  +            raf = getDescriptor();
  +            raf.seek(offset);
  +            raf.read(data);
   
  -         // Read in the header
  -         header.read(dis);
  +            ByteArrayInputStream bis = new ByteArrayInputStream(data);
  +            DataInputStream dis = new DataInputStream(bis);
   
  -         keyPos = fileHeader.pageHeaderSize;
  -         dataPos = keyPos + header.keyLen;
  +            // Read in the header
  +            header.read(dis);
  +
  +            keyPos = fileHeader.pageHeaderSize;
  +            dataPos = keyPos + header.keyLen;
  +         }
  +         finally {
  +            putDescriptor(raf);
  +         }
         }
   
  -      public void write() throws IOException {
  +      public synchronized void write() throws IOException {
            // Write out the header
            ByteArrayOutputStream bos = new 
ByteArrayOutputStream(fileHeader.getPageHeaderSize());
            DataOutputStream dos = new DataOutputStream(bos);
  @@ -951,48 +1029,55 @@
            }
         }
   
  -      public void flush() throws IOException {
  -         if ( offset >= raf.length() ) {
  -            // Grow the file
  -            long o = (fileHeader.headerSize + 
((fileHeader.totalCount*3)/2)*fileHeader.pageSize)+(fileHeader.pageSize-1);
  -            raf.seek(o);
  -            raf.writeByte(0);
  +      public synchronized void flush() throws IOException {
  +         RandomAccessFile raf = null;
  +         try {
  +            raf = getDescriptor();
  +            if ( offset >= raf.length() ) {
  +               // Grow the file
  +               long o = (fileHeader.headerSize + ((fileHeader.totalCount * 
3) / 2) * fileHeader.pageSize) + (fileHeader.pageSize - 1);
  +               raf.seek(o);
  +               raf.writeByte(0);
  +            }
  +            raf.seek(offset);
  +            raf.write(data);
  +         }
  +         finally {
  +            putDescriptor(raf);
            }
  -         raf.seek(offset);
  -         raf.write(data);
         }
  -      
  -      public void setPageNum(long pageNum) {
  +
  +      public synchronized void setPageNum(long pageNum) {
            this.pageNum = pageNum;
            offset = fileHeader.headerSize + (pageNum * fileHeader.pageSize);
         }
   
  -      public long getPageNum() {
  +      public synchronized long getPageNum() {
            return pageNum;
         }
   
  -      public PageHeader getPageHeader() {
  +      public synchronized PageHeader getPageHeader() {
            return header;
         }
   
  -      public void setKey(Key key) {
  +      public synchronized void setKey(Key key) {
            header.setKey(key);
            key.copyTo(data, keyPos);
         }
   
  -      public Key getKey() {
  +      public synchronized Key getKey() {
            if ( header.keyLen > 0 )
               return new Key(data, keyPos, header.keyLen);
            else
               return null;
         }
   
  -      public void streamTo(OutputStream os) throws IOException {
  +      public synchronized void streamTo(OutputStream os) throws IOException {
            if ( header.dataLen > 0 )
               os.write(data, dataPos, header.dataLen);
         }
   
  -      public void streamFrom(InputStream is) throws IOException {
  +      public synchronized void streamFrom(InputStream is) throws IOException 
{
            int avail = is.available();
            header.dataLen = fileHeader.workSize - header.keyLen;
            if ( avail < header.dataLen )
  @@ -1000,8 +1085,16 @@
            if ( header.dataLen > 0 )
               is.read(data, keyPos + header.keyLen, header.dataLen);
         }
  -      
  -      public int compareTo(Object o) {
  +
  +      public synchronized boolean isLoaded() {
  +         return loaded;
  +      }
  +
  +      public synchronized void setLoaded(boolean loaded) {
  +         this.loaded = loaded;
  +      }
  +
  +      public synchronized int compareTo(Object o) {
            return (int)(pageNum - ((Page)o).pageNum);
         }
      }
  
  
  
  1.4       +5 -5      
xml-xindice/java/src/org/apache/xindice/core/fulltext/FullTextIndexer.java
  
  Index: FullTextIndexer.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/fulltext/FullTextIndexer.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- FullTextIndexer.java      21 Apr 2002 19:44:26 -0000      1.3
  +++ FullTextIndexer.java      9 Jun 2002 19:49:03 -0000       1.4
  @@ -56,7 +56,7 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    *
  - * $Id: FullTextIndexer.java,v 1.3 2002/04/21 19:44:26 bradford Exp $
  + * $Id: FullTextIndexer.java,v 1.4 2002/06/09 19:49:03 bradford Exp $
    */
   
   import org.apache.xindice.core.*;
  @@ -248,7 +248,7 @@
         return new IndexMatch(key, pos, len, elemID, attrID);
      }
   
  -   public synchronized void remove(String value, Key key, int pos, int len, 
short elemID, short attrID) throws DBException {
  +   public void remove(String value, Key key, int pos, int len, short elemID, 
short attrID) throws DBException {
         StringTokenizer st = new StringTokenizer(value);
         while ( st.hasMoreTokens() ) {
            String s = st.nextToken();
  @@ -277,7 +277,7 @@
         }
      }
   
  -   public synchronized void add(String value, Key key, int pos, int len, 
short elemID, short attrID) throws DBException {
  +   public void add(String value, Key key, int pos, int len, short elemID, 
short attrID) throws DBException {
         StringTokenizer st = new StringTokenizer(value);
         while ( st.hasMoreTokens() ) {
            String s = st.nextToken();
  @@ -317,11 +317,11 @@
         }
      }
   
  -   public synchronized void flush() throws DBException {
  +   public void flush() throws DBException {
         super.flush();
      }
   
  -   public synchronized IndexMatch[] queryMatches(final IndexQuery query) 
throws DBException {
  +   public IndexMatch[] queryMatches(final IndexQuery query) throws 
DBException {
         // Pre-process the value-set for stop words and stemming
         Value[] vals = query.getValues();
         for ( int i = 0; i < vals.length; i++ ) {
  
  
  
  1.2       +11 -11    
xml-xindice/java/src/org/apache/xindice/core/indexer/NameIndexer.java
  
  Index: NameIndexer.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/indexer/NameIndexer.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- NameIndexer.java  6 Dec 2001 21:00:12 -0000       1.1
  +++ NameIndexer.java  9 Jun 2002 19:49:03 -0000       1.2
  @@ -56,7 +56,7 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    *
  - * $Id: NameIndexer.java,v 1.1 2001/12/06 21:00:12 bradford Exp $
  + * $Id: NameIndexer.java,v 1.2 2002/06/09 19:49:03 bradford Exp $
    */
   
   import org.apache.xindice.core.*;
  @@ -82,14 +82,14 @@
   public final class NameIndexer extends BTree implements Indexer {
      private static final IndexMatch[] EmptyMatches = new IndexMatch[0];
      private static final Value EmptyValue = new Value(new byte[0]);
  -   
  +
      private static final byte MATCHES = 20;
   
      private static final String NAME = "name";
      private static final String PATTERN = "pattern";
      private static final String PAGESIZE = "pagesize";
      private static final String MAXKEYSIZE = "maxkeysize";
  -      
  +
      private Configuration config;
      private Collection collection;
      private SymbolTable symbols;
  @@ -112,7 +112,7 @@
   
            pattern = config.getAttribute(PATTERN);
            wildcard = pattern.indexOf('*') != -1;
  -         
  +
            fileHeader.setPageSize(config.getIntAttribute(PAGESIZE, 
fileHeader.getPageSize()));
            fileHeader.setMaxKeySize(config.getShortAttribute(MAXKEYSIZE, 
fileHeader.getMaxKeySize()));
   
  @@ -153,7 +153,7 @@
         return pattern;
      }
   
  -   public synchronized void remove(String value, Key key, int pos, int len, 
short elemID, short attrID) throws DBException {
  +   public void remove(String value, Key key, int pos, int len, short elemID, 
short attrID) throws DBException {
         try {
            removeValue(key);
         }
  @@ -162,7 +162,7 @@
         }
      }
   
  -   public synchronized void add(String value, Key key, int pos, int len, 
short elemID, short attrID) throws DBException {
  +   public void add(String value, Key key, int pos, int len, short elemID, 
short attrID) throws DBException {
         try {
            addValue(key, 0);
         }
  @@ -171,14 +171,14 @@
         }
      }
   
  -   public synchronized void flush() throws DBException {
  +   public void flush() throws DBException {
         super.flush();
      }
  -   
  -   public synchronized IndexMatch[] queryMatches(final IndexQuery query) 
throws DBException {
  +
  +   public IndexMatch[] queryMatches(final IndexQuery query) throws 
DBException {
         final List results = new ArrayList();
         final IndexPattern pattern = query.getPattern();
  -      
  +
         try {
            query(query, new BTreeCallback() {
               public boolean indexInfo(Value value, long pos) {
  @@ -193,7 +193,7 @@
         catch ( Exception e ) {
            org.apache.xindice.Debug.printStackTrace(e);
         }
  -      
  +
         return (IndexMatch[])results.toArray(EmptyMatches);
      }
   }
  
  
  
  1.2       +14 -14    
xml-xindice/java/src/org/apache/xindice/core/indexer/ValueIndexer.java
  
  Index: ValueIndexer.java
  ===================================================================
  RCS file: 
/home/cvs/xml-xindice/java/src/org/apache/xindice/core/indexer/ValueIndexer.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ValueIndexer.java 6 Dec 2001 21:00:12 -0000       1.1
  +++ ValueIndexer.java 9 Jun 2002 19:49:03 -0000       1.2
  @@ -56,7 +56,7 @@
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    *
  - * $Id: ValueIndexer.java,v 1.1 2001/12/06 21:00:12 bradford Exp $
  + * $Id: ValueIndexer.java,v 1.2 2002/06/09 19:49:03 bradford Exp $
    */
   
   import org.apache.xindice.core.*;
  @@ -269,11 +269,11 @@
         try {
            int l = key.getLength();
            byte[] b = new byte[l+13];
  -         
  +
            // Write the key
            System.arraycopy(key.getData(), 0, b, 0, l);
            b[l] = 0;
  -         
  +
            // Write the pos
            b[l+1] = (byte)((pos >>> 24) & 0xFF);
            b[l+2] = (byte)((pos >>> 16) & 0xFF);
  @@ -289,7 +289,7 @@
            // Write the elemID
            b[l+9] = (byte)((elemID >>> 8)  & 0xFF);
            b[l+10] = (byte)((elemID >>> 0) & 0xFF);
  -         
  +
            // Write the attrID
            b[l+11] = (byte)((attrID >>> 8) & 0xFF);
            b[l+12] = (byte)((attrID >>> 0) & 0xFF);
  @@ -301,12 +301,12 @@
         }
         return result;
      }
  -   
  +
      private IndexMatch getIndexMatch(Value v) {
         byte[] b = v.getData();
         int l = b.length-13;
         Key key = new Key(b, 0, b.length-13);
  -      
  +
         int pos = ((b[l+1] << 24) | (b[l+2] << 16) | (b[l+3] << 8) | b[l+4]);
         int len = ((b[l+5] << 24) | (b[l+6] << 16) | (b[l+7] << 8) | b[l+8]);
         short elemID = (short)((b[l+9] << 8) | b[l+10]);
  @@ -314,8 +314,8 @@
   
         return new IndexMatch(key, pos, len, elemID, attrID);
      }
  -   
  -   public synchronized void remove(String value, Key key, int pos, int len, 
short elemID, short attrID) throws DBException {
  +
  +   public void remove(String value, Key key, int pos, int len, short elemID, 
short attrID) throws DBException {
         Value v = getTypedValue(value);
         if ( type != STRING && type != TRIMMED && v.getLength() == 0 )
            return;
  @@ -333,14 +333,14 @@
         }
      }
   
  -   public synchronized void add(String value, Key key, int pos, int len, 
short elemID, short attrID) throws DBException {
  +   public void add(String value, Key key, int pos, int len, short elemID, 
short attrID) throws DBException {
         Value v = getTypedValue(value);
         if ( type != STRING && type != TRIMMED && v.getLength() == 0 )
            return;
  -  
  +
         try {
            BTreeRootInfo root;
  -         
  +
            try {
               root = findBTreeRoot(v);
            }
  @@ -362,11 +362,11 @@
         }
      }
   
  -   public synchronized void flush() throws DBException {
  +   public void flush() throws DBException {
         super.flush();
      }
  -   
  -   public synchronized IndexMatch[] queryMatches(final IndexQuery query) 
throws DBException {
  +
  +   public IndexMatch[] queryMatches(final IndexQuery query) throws 
DBException {
         // Pre-process the value-set for typing and trimming
         if ( type != STRING ) {
            Value[] vals = query.getValues();
  
  
  

Reply via email to