www.pudn.com > 33_online_store.rar > IndexBuilder.java



package index;

import java.util.*;
import java.io.*;
import DebugLog;

public class IndexBuilder
{
	public static DebugLog log;
	
	static
	{
	    log = DebugLog.getSharedLog();
	}
	
	/**
	 * Method to index a directory
	 */
	protected static void buildIndexForDir(File dir
										,Vector files
										,Hashtable entries)
	{
		String[] list;
		File curFile;
		int i,max;
		
		list = dir.list();
		
		log.log("Indexing Directory: "+dir);
		
		max = list.length;
		
		for(i=0;i')
				{
					inTag = false;
				}
				else if((Character.isWhitespace((char)cur)
							||(cur == '.')
							||(cur == ',')
							||(cur == '[')
							||(cur == ']')
							||(cur == '{')
							||(cur == '}')
							||(cur == '(')
							||(cur == ')')
							||(cur == '=')
							||(cur == ';')
							||(cur == ':')
							||(cur == '=')
							||(cur == '-')
							||(cur == '/')
							||(cur == '\\'))
							&& !inTag)
				{
					if(curWord.length()>0)
					{
						curString = curWord.toString().toLowerCase();
						curWord.setLength(0);
						
						if(!SkipTable.skip(curString))
						{
    						entryForWord = (Vector) entries.get(curString);
						
    						if(entryForWord == null)
    						{
    							entryForWord = new Vector();
							
    							entries.put(curString,entryForWord);
    						}
						
    						newEntry = new IndexEntry();
    						newEntry.file = fileInd;
    						newEntry.occurences = 1;
					
    						if(!entryForWord.contains(newEntry))
    						{
    							entryForWord.addElement(newEntry);
    						}
    						else
    						{
    						    int oldInd =
    						        entryForWord.indexOf(newEntry);
    						    IndexEntry oldEnt = (IndexEntry)
    						        entryForWord.elementAt(oldInd);
    						    
    						    oldEnt.occurences++;
    						}
					    }
					}
				}
				else if(!inTag)
				{
					//Don't add the separator
					//or quotes
					if(cur == '|')
					{
						curWord.append('-');
					}
					else if((cur != '\"')
							&&(cur != '\''))
					{
						curWord.append((char)cur);
					}
				}
			}
			
			if(curWord.length()>0)
			{
				curString = curWord.toString().toLowerCase();
				curWord.setLength(0);
				
				if(!SkipTable.skip(curString))
				{
    				entryForWord = (Vector) entries.get(curString);
				
    				if(entryForWord == null)
    				{
    					entryForWord = new Vector();
					
    					entries.put(curString,entryForWord);
    				}
				
    				newEntry = new IndexEntry();
    				newEntry.file = fileInd;
    				newEntry.occurences = 1;
		
    				if(!entryForWord.contains(newEntry))
    				{
    					entryForWord.addElement(newEntry);
    				}
    				else
    				{
    				    int oldInd =
    				        entryForWord.indexOf(newEntry);
    				    IndexEntry oldEnt = (IndexEntry)
    				        entryForWord.elementAt(oldInd);
				    
    				    oldEnt.occurences++;
    				}
				}
			}
		
			bufIn.close();
			fileIn.close();
		}
		catch(Exception exp)
		{
			//skip this file
		}
	}
	
	/**
	 * Private method write the index file
	 */
	protected static void writeIndex(File dir
										,Vector files
										,Hashtable entries)
	{
		FileWriter fileOut;
		BufferedWriter bufOut;
		PrintWriter printOut;
		File curFile;
		int i,max;
		Enumeration words;
		String curWord;
		Vector entryForWord;
		IndexEntry curEntry;
		File file;
		String dirPath,fullPath,relPath;
		int len;
		
		try
		{
			file = new File(dir,HTMLIndex.INDEX_FILE_NAME);
			fileOut = new FileWriter(file);
			bufOut = new BufferedWriter(fileOut);
			printOut = new PrintWriter(bufOut);
		
		    dirPath = dir.getAbsolutePath();
		    len = dirPath.length();
		    
		    if(File.separatorChar != dirPath.charAt(len-1)) len++;
		    
			//Print files in order
			//Use relative paths incase dir moves
			
			max = files.size();
			
			for(i=0;irefTime)
				{
				    retVal = true;
				}
			}
			
			if(retVal == true) break;
		}
		
		return retVal;
	}
	
	/**
	 * Builds an index file for a directory
	 */
	public static void buildIndex(File dir)
	{
        if((dir == null)||!dir.isDirectory()) return;
    
		Vector files = new Vector();
		Hashtable entries = new Hashtable();
		
		try
		{
		    buildIndexForDir(dir,files,entries);
		
	    	log.log("Writing Index");
		    writeIndex(dir,files,entries);
		}
		catch(Exception exp)
		{
		    if(log != null) log.log(exp);
		}
	}
	
	public static boolean indexNeedsRebuilding(File dir)
	{
	    File file;
	    long refTime;
	    boolean retVal = true;
	    
	    try
	    {
		    file = new File(dir,HTMLIndex.INDEX_FILE_NAME);
		    refTime = file.lastModified();
		    
		    retVal = checkRebuildForDir(dir,refTime);
	    }
	    catch(Exception exp)
	    {
	        retVal = true;
	    }
	    
	    return retVal;
	}
}