1 package org.apache.lucene.index;
2
3 import org.apache.lucene.store.*;
4
5 import java.io.IOException;
6 import java.util.Iterator;
7 import java.util.List;
8 import java.util.Vector;
9
10 public class IndexUtils
11 {
12
13
14
15
16
17
18
19 public static void truncateIndex(Directory dir) throws IOException
20 {
21 SegmentInfos segmentInfos = new SegmentInfos();
22 segmentInfos.read(dir);
23 Vector deletable = readDeleteableFiles(dir);
24 String[] indexfiles = dir.list();
25 for (Iterator it = segmentInfos.iterator(); it.hasNext();)
26 {
27 SegmentInfo si = (SegmentInfo) it.next();
28 for (int i = 0; i < indexfiles.length; ++i)
29 {
30 if (indexfiles[i].startsWith(si.name)) deletable.add(indexfiles[i]);
31 }
32 }
33 writeDeleteableFiles(dir, deletable);
34 segmentInfos.clear();
35 segmentInfos.write(dir);
36 }
37
38
39 static Vector readDeleteableFiles(Directory directory) throws IOException
40 {
41 Vector result = new Vector();
42 if (!directory.fileExists("deletable"))
43 return result;
44
45 IndexInput input = directory.openInput("deletable");
46 try
47 {
48 for (int i = input.readInt(); i > 0; i--)
49 result.addElement(input.readString());
50 }
51 finally
52 {
53 input.close();
54 }
55 return result;
56 }
57
58 private static void writeDeleteableFiles(Directory directory, List files) throws IOException
59 {
60 IndexOutput output = directory.createOutput("deleteable.new");
61 try
62 {
63 output.writeInt(files.size());
64 for (Iterator it = files.iterator(); it.hasNext();)
65 output.writeString((String) it.next());
66 }
67 finally
68 {
69 output.close();
70 }
71 directory.renameFile("deleteable.new", "deletable");
72 }
73 }