You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@roller.apache.org by gh...@apache.org on 2013/04/07 10:09:28 UTC

svn commit: r1465341 - in /roller/trunk: ./ weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/ weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/

Author: ghuber
Date: Sun Apr  7 08:09:27 2013
New Revision: 1465341

URL: http://svn.apache.org/r1465341
Log:
Upgrade to velocity 1.7 and remove tabs on source.

Modified:
    roller/trunk/pom.xml
    roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/FieldConstants.java
    roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/IndexManagerImpl.java
    roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/IndexUtil.java
    roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/IndexOperation.java
    roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/ReIndexEntryOperation.java
    roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/RebuildWebsiteIndexOperation.java
    roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/RemoveEntryOperation.java
    roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/RemoveWebsiteIndexOperation.java
    roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/SearchOperation.java

Modified: roller/trunk/pom.xml
URL: http://svn.apache.org/viewvc/roller/trunk/pom.xml?rev=1465341&r1=1465340&r2=1465341&view=diff
==============================================================================
--- roller/trunk/pom.xml (original)
+++ roller/trunk/pom.xml Sun Apr  7 08:09:27 2013
@@ -303,7 +303,7 @@
             <dependency>
                 <groupId>org.apache.velocity</groupId>
                 <artifactId>velocity</artifactId>
-                <version>1.6</version>
+                <version>1.7</version>
             </dependency>
 
             <dependency>

Modified: roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/FieldConstants.java
URL: http://svn.apache.org/viewvc/roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/FieldConstants.java?rev=1465341&r1=1465340&r2=1465341&view=diff
==============================================================================
--- roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/FieldConstants.java (original)
+++ roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/FieldConstants.java Sun Apr  7 08:09:27 2013
@@ -27,24 +27,24 @@ import org.apache.lucene.util.Version;
  */
 public final class FieldConstants {
 
-	// Set what version we are on
-	public static final Version LUCENE_VERSION = Version.LUCENE_36;
+    // Set what version we are on
+    public static final Version LUCENE_VERSION = Version.LUCENE_36;
 
-	public static final String ANCHOR = "anchor";
-	public static final String UPDATED = "updated";
-	public static final String ID = "id";
-	public static final String USERNAME = "username";
-	public static final String CATEGORY = "cat";
-	public static final String TITLE = "title";
-	public static final String PUBLISHED = "published";
-	public static final String CONTENT = "content";
-	public static final String CONTENT_STORED = "content_stored";
-	public static final String C_CONTENT = "comment";
-	public static final String C_EMAIL = "email";
-	public static final String C_NAME = "name";
-	public static final String CONSTANT = "constant";
-	public static final String CONSTANT_V = "v"; // must be lowercase, or match
-													// the transform rules of
-													// the analyzer
-	public static final String WEBSITE_HANDLE = "handle";
+    public static final String ANCHOR = "anchor";
+    public static final String UPDATED = "updated";
+    public static final String ID = "id";
+    public static final String USERNAME = "username";
+    public static final String CATEGORY = "cat";
+    public static final String TITLE = "title";
+    public static final String PUBLISHED = "published";
+    public static final String CONTENT = "content";
+    public static final String CONTENT_STORED = "content_stored";
+    public static final String C_CONTENT = "comment";
+    public static final String C_EMAIL = "email";
+    public static final String C_NAME = "name";
+    public static final String CONSTANT = "constant";
+    public static final String CONSTANT_V = "v"; // must be lowercase, or match
+                                                 // the transform rules of
+                                                 // the analyzer
+    public static final String WEBSITE_HANDLE = "handle";
 }

Modified: roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/IndexManagerImpl.java
URL: http://svn.apache.org/viewvc/roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/IndexManagerImpl.java?rev=1465341&r1=1465340&r2=1465341&view=diff
==============================================================================
--- roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/IndexManagerImpl.java (original)
+++ roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/IndexManagerImpl.java Sun Apr  7 08:09:27 2013
@@ -56,361 +56,361 @@ import org.apache.roller.weblogger.confi
  */
 @com.google.inject.Singleton
 public class IndexManagerImpl implements IndexManager {
-	// ~ Static fields/initializers
-	// =============================================
+    // ~ Static fields/initializers
+    // =============================================
 
-	private IndexReader reader;
-	private final Weblogger roller;
+    private IndexReader reader;
+    private final Weblogger roller;
 
-	static Log mLogger = LogFactory.getFactory().getInstance(
-			IndexManagerImpl.class);
+    static Log mLogger = LogFactory.getFactory().getInstance(
+            IndexManagerImpl.class);
 
-	// ~ Instance fields
-	// ========================================================
-
-	private boolean searchEnabled = true;
-
-	File indexConsistencyMarker;
-
-	private boolean useRAMIndex = false;
-
-	private RAMDirectory fRAMindex;
-
-	private String indexDir = null;
-
-	private boolean inconsistentAtStartup = false;
-
-	private ReadWriteLock rwl = new ReentrantReadWriteLock();
-
-	// ~ Constructors
-	// ===========================================================
-
-	/**
-	 * Creates a new lucene index manager. This should only be created once.
-	 * Creating the index manager more than once will definately result in
-	 * errors. The preferred way of getting an index is through the
-	 * RollerContext.
-	 * 
-	 * @param indexDir
-	 *            - the path to the index directory
-	 */
-	@com.google.inject.Inject
-	protected IndexManagerImpl(Weblogger roller) {
-		this.roller = roller;
-
-		// check config to see if the internal search is enabled
-		String enabled = WebloggerConfig.getProperty("search.enabled");
-		if ("false".equalsIgnoreCase(enabled))
-			this.searchEnabled = false;
-
-		// we also need to know what our index directory is
-		// Note: system property expansion is now handled by WebloggerConfig
-		String searchIndexDir = WebloggerConfig.getProperty("search.index.dir");
-		this.indexDir = searchIndexDir.replace('/', File.separatorChar);
-
-		// a little debugging
-		mLogger.info("search enabled: " + this.searchEnabled);
-		mLogger.info("index dir: " + this.indexDir);
-
-		String test = indexDir + File.separator + ".index-inconsistent";
-		indexConsistencyMarker = new File(test);
-	}
-
-	/**
-	 * @inheritDoc
-	 */
-	public void initialize() throws InitializationException {
-
-		// only initialize the index if search is enabled
-		if (this.searchEnabled) {
-
-			// 1. If inconsistency marker exists.
-			// Delete index
-			// 2. if we're using RAM index
-			// load ram index wrapper around index
-			//
-			if (indexConsistencyMarker.exists()) {
-				getFSDirectory(true);
-				inconsistentAtStartup = true;
-				mLogger.debug("Index inconsistent: marker exists");
-			} else {
-				try {
-					File makeIndexDir = new File(indexDir);
-					if (!makeIndexDir.exists()) {
-						makeIndexDir.mkdirs();
-						inconsistentAtStartup = true;
-						mLogger.debug("Index inconsistent: new");
-					}
-					indexConsistencyMarker.createNewFile();
-				} catch (IOException e) {
-					mLogger.error(e);
-				}
-			}
-
-			if (indexExists()) {
-				if (useRAMIndex) {
-					Directory filesystem = getFSDirectory(false);
-					try {
-						fRAMindex = new RAMDirectory(filesystem);
-					} catch (IOException e) {
-						mLogger.error("Error creating in-memory index", e);
-					}
-				}
-			} else {
-				mLogger.debug("Creating index");
-				inconsistentAtStartup = true;
-				if (useRAMIndex) {
-					fRAMindex = new RAMDirectory();
-					createIndex(fRAMindex);
-				} else {
-					createIndex(getFSDirectory(true));
-				}
-			}
-
-			if (isInconsistentAtStartup()) {
-				mLogger.info("Index was inconsistent. Rebuilding index in the background...");
-				try {
-					rebuildWebsiteIndex();
-				} catch (WebloggerException e) {
-					mLogger.error("ERROR: scheduling re-index operation");
-				}
-			} else {
-				mLogger.info("Index initialized and ready for use.");
-			}
-		}
-
-	}
-
-	// ~ Methods
-	// ================================================================
-
-	public void rebuildWebsiteIndex() throws WebloggerException {
-		scheduleIndexOperation(new RebuildWebsiteIndexOperation(roller, this,
-				null));
-	}
-
-	public void rebuildWebsiteIndex(Weblog website) throws WebloggerException {
-		scheduleIndexOperation(new RebuildWebsiteIndexOperation(roller, this,
-				website));
-	}
-
-	public void removeWebsiteIndex(Weblog website) throws WebloggerException {
-		scheduleIndexOperation(new RemoveWebsiteIndexOperation(roller, this,
-				website));
-	}
-
-	public void addEntryIndexOperation(WeblogEntry entry)
-			throws WebloggerException {
-		AddEntryOperation addEntry = new AddEntryOperation(roller, this, entry);
-		scheduleIndexOperation(addEntry);
-	}
-
-	public void addEntryReIndexOperation(WeblogEntry entry)
-			throws WebloggerException {
-		ReIndexEntryOperation reindex = new ReIndexEntryOperation(roller, this,
-				entry);
-		scheduleIndexOperation(reindex);
-	}
-
-	public void removeEntryIndexOperation(WeblogEntry entry)
-			throws WebloggerException {
-		RemoveEntryOperation removeOp = new RemoveEntryOperation(roller, this,
-				entry);
-		executeIndexOperationNow(removeOp);
-	}
-
-	public ReadWriteLock getReadWriteLock() {
-		return rwl;
-	}
-
-	public boolean isInconsistentAtStartup() {
-		return inconsistentAtStartup;
-	}
-
-	/**
-	 * This is the analyzer that will be used to tokenize comment text.
-	 * 
-	 * @return Analyzer to be used in manipulating the database.
-	 */
-	public static final Analyzer getAnalyzer() {
-		return new StandardAnalyzer(FieldConstants.LUCENE_VERSION);
-	}
-
-	private void scheduleIndexOperation(final IndexOperation op) {
-		try {
-			// only if search is enabled
-			if (this.searchEnabled) {
-				mLogger.debug("Starting scheduled index operation: "
-						+ op.getClass().getName());
-				roller.getThreadManager().executeInBackground(op);
-			}
-		} catch (InterruptedException e) {
-			mLogger.error("Error executing operation", e);
-		}
-	}
-
-	/**
-	 * @param search
-	 */
-	public void executeIndexOperationNow(final IndexOperation op) {
-		try {
-			// only if search is enabled
-			if (this.searchEnabled) {
-				mLogger.debug("Executing index operation now: "
-						+ op.getClass().getName());
-				roller.getThreadManager().executeInForeground(op);
-			}
-		} catch (InterruptedException e) {
-			mLogger.error("Error executing operation", e);
-		}
-	}
-
-	public synchronized void resetSharedReader() {
-		reader = null;
-	}
-
-	public synchronized IndexReader getSharedIndexReader() {
-		if (reader == null) {
-			try {
-				reader = IndexReader.open(getIndexDirectory());
-			} catch (IOException e) {
-			}
-		}
-		return reader;
-	}
-
-	/**
-	 * Get the directory that is used by the lucene index. This method will
-	 * return null if there is no index at the directory location. If we are
-	 * using a RAM index, the directory will be a ram directory.
-	 * 
-	 * @return Directory The directory containing the index, or null if error.
-	 */
-	public Directory getIndexDirectory() {
-		if (useRAMIndex) {
-			return fRAMindex;
-		} else {
-			return getFSDirectory(false);
-		}
-	}
-
-	private boolean indexExists() {
-		try {
-			return IndexReader.indexExists(getIndexDirectory());
-		} catch (IOException e) {
-			mLogger.error("Problem accessing index directory", e);
-		}
-		return false;
-	}
-
-	private Directory getFSDirectory(boolean delete) {
-		
-		Directory directory = null;
-
-		try {
-
-			directory = FSDirectory.open(new File(indexDir));
-
-			if (delete && directory != null) {
-				String[] files = directory.listAll(); // clear old files
-				for (int i = 0; i < files.length; i++) {
-					File file = new File(indexDir, files[i]);
-					if (!file.delete())
-						throw new IOException("couldn't delete " + files[i]);
-				}
-			}
-
-		} catch (IOException e) {
-			mLogger.error("Problem accessing index directory", e);
-		}
-
-		return directory;
-
-	}
-
-	private void createIndex(Directory dir) {
-		IndexWriter writer = null;
-
-		try {
-
-			IndexWriterConfig config = new IndexWriterConfig(
-					FieldConstants.LUCENE_VERSION, new LimitTokenCountAnalyzer(
-							IndexManagerImpl.getAnalyzer(),
-							IndexWriterConfig.DEFAULT_TERM_INDEX_INTERVAL));
-
-			writer = new IndexWriter(dir, config);
-
-		} catch (IOException e) {
-			mLogger.error("Error creating index", e);
-		} finally {
-			try {
-				if (writer != null) {
-					writer.close();
-				}
-			} catch (IOException e) {
-			}
-		}
-	}
-
-	private IndexOperation getSaveIndexOperation() {
-		return new WriteToIndexOperation(this) {
-			public void doRun() {
-				Directory dir = getIndexDirectory();
-				Directory fsdir = getFSDirectory(true);
-
-				IndexWriter writer = null;
-
-				try {
-					IndexWriterConfig config = new IndexWriterConfig(
-							FieldConstants.LUCENE_VERSION,
-							new LimitTokenCountAnalyzer(
-									IndexManagerImpl.getAnalyzer(),
-									IndexWriterConfig.DEFAULT_TERM_INDEX_INTERVAL));
-
-					writer = new IndexWriter(fsdir, config);
-
-					writer.addIndexes(new Directory[] { dir });
-
-					writer.commit();
-
-					indexConsistencyMarker.delete();
-					
-				} catch (IOException e) {
-					mLogger.error("Problem saving index to disk", e);
-
-					// Delete the directory, since there was a problem saving
-					// the RAM contents
-					getFSDirectory(true);
-				} finally {
-					try {
-						if (writer != null)
-							writer.close();
-					} catch (IOException e1) {
-						mLogger.warn("Unable to close IndexWriter.");
-					}
-				}
-
-			}
-		};
-	}
-
-	public void release() {
-		// no-op
-	}
-
-	public void shutdown() {
-		if (useRAMIndex) {
-			scheduleIndexOperation(getSaveIndexOperation());
-		} else {
-			indexConsistencyMarker.delete();
-		}
-
-		try {
-			if (reader != null)
-				reader.close();
-		} catch (IOException e) {
-			// won't happen, since it was
-		}
-	}
+    // ~ Instance fields
+    // ========================================================
+
+    private boolean searchEnabled = true;
+
+    File indexConsistencyMarker;
+
+    private boolean useRAMIndex = false;
+
+    private RAMDirectory fRAMindex;
+
+    private String indexDir = null;
+
+    private boolean inconsistentAtStartup = false;
+
+    private ReadWriteLock rwl = new ReentrantReadWriteLock();
+
+    // ~ Constructors
+    // ===========================================================
+
+    /**
+     * Creates a new lucene index manager. This should only be created once.
+     * Creating the index manager more than once will definately result in
+     * errors. The preferred way of getting an index is through the
+     * RollerContext.
+     * 
+     * @param indexDir
+     *            - the path to the index directory
+     */
+    @com.google.inject.Inject
+    protected IndexManagerImpl(Weblogger roller) {
+        this.roller = roller;
+
+        // check config to see if the internal search is enabled
+        String enabled = WebloggerConfig.getProperty("search.enabled");
+        if ("false".equalsIgnoreCase(enabled))
+            this.searchEnabled = false;
+
+        // we also need to know what our index directory is
+        // Note: system property expansion is now handled by WebloggerConfig
+        String searchIndexDir = WebloggerConfig.getProperty("search.index.dir");
+        this.indexDir = searchIndexDir.replace('/', File.separatorChar);
+
+        // a little debugging
+        mLogger.info("search enabled: " + this.searchEnabled);
+        mLogger.info("index dir: " + this.indexDir);
+
+        String test = indexDir + File.separator + ".index-inconsistent";
+        indexConsistencyMarker = new File(test);
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void initialize() throws InitializationException {
+
+        // only initialize the index if search is enabled
+        if (this.searchEnabled) {
+
+            // 1. If inconsistency marker exists.
+            // Delete index
+            // 2. if we're using RAM index
+            // load ram index wrapper around index
+            //
+            if (indexConsistencyMarker.exists()) {
+                getFSDirectory(true);
+                inconsistentAtStartup = true;
+                mLogger.debug("Index inconsistent: marker exists");
+            } else {
+                try {
+                    File makeIndexDir = new File(indexDir);
+                    if (!makeIndexDir.exists()) {
+                        makeIndexDir.mkdirs();
+                        inconsistentAtStartup = true;
+                        mLogger.debug("Index inconsistent: new");
+                    }
+                    indexConsistencyMarker.createNewFile();
+                } catch (IOException e) {
+                    mLogger.error(e);
+                }
+            }
+
+            if (indexExists()) {
+                if (useRAMIndex) {
+                    Directory filesystem = getFSDirectory(false);
+                    try {
+                        fRAMindex = new RAMDirectory(filesystem);
+                    } catch (IOException e) {
+                        mLogger.error("Error creating in-memory index", e);
+                    }
+                }
+            } else {
+                mLogger.debug("Creating index");
+                inconsistentAtStartup = true;
+                if (useRAMIndex) {
+                    fRAMindex = new RAMDirectory();
+                    createIndex(fRAMindex);
+                } else {
+                    createIndex(getFSDirectory(true));
+                }
+            }
+
+            if (isInconsistentAtStartup()) {
+                mLogger.info("Index was inconsistent. Rebuilding index in the background...");
+                try {
+                    rebuildWebsiteIndex();
+                } catch (WebloggerException e) {
+                    mLogger.error("ERROR: scheduling re-index operation");
+                }
+            } else {
+                mLogger.info("Index initialized and ready for use.");
+            }
+        }
+
+    }
+
+    // ~ Methods
+    // ================================================================
+
+    public void rebuildWebsiteIndex() throws WebloggerException {
+        scheduleIndexOperation(new RebuildWebsiteIndexOperation(roller, this,
+                null));
+    }
+
+    public void rebuildWebsiteIndex(Weblog website) throws WebloggerException {
+        scheduleIndexOperation(new RebuildWebsiteIndexOperation(roller, this,
+                website));
+    }
+
+    public void removeWebsiteIndex(Weblog website) throws WebloggerException {
+        scheduleIndexOperation(new RemoveWebsiteIndexOperation(roller, this,
+                website));
+    }
+
+    public void addEntryIndexOperation(WeblogEntry entry)
+            throws WebloggerException {
+        AddEntryOperation addEntry = new AddEntryOperation(roller, this, entry);
+        scheduleIndexOperation(addEntry);
+    }
+
+    public void addEntryReIndexOperation(WeblogEntry entry)
+            throws WebloggerException {
+        ReIndexEntryOperation reindex = new ReIndexEntryOperation(roller, this,
+                entry);
+        scheduleIndexOperation(reindex);
+    }
+
+    public void removeEntryIndexOperation(WeblogEntry entry)
+            throws WebloggerException {
+        RemoveEntryOperation removeOp = new RemoveEntryOperation(roller, this,
+                entry);
+        executeIndexOperationNow(removeOp);
+    }
+
+    public ReadWriteLock getReadWriteLock() {
+        return rwl;
+    }
+
+    public boolean isInconsistentAtStartup() {
+        return inconsistentAtStartup;
+    }
+
+    /**
+     * This is the analyzer that will be used to tokenize comment text.
+     * 
+     * @return Analyzer to be used in manipulating the database.
+     */
+    public static final Analyzer getAnalyzer() {
+        return new StandardAnalyzer(FieldConstants.LUCENE_VERSION);
+    }
+
+    private void scheduleIndexOperation(final IndexOperation op) {
+        try {
+            // only if search is enabled
+            if (this.searchEnabled) {
+                mLogger.debug("Starting scheduled index operation: "
+                        + op.getClass().getName());
+                roller.getThreadManager().executeInBackground(op);
+            }
+        } catch (InterruptedException e) {
+            mLogger.error("Error executing operation", e);
+        }
+    }
+
+    /**
+     * @param search
+     */
+    public void executeIndexOperationNow(final IndexOperation op) {
+        try {
+            // only if search is enabled
+            if (this.searchEnabled) {
+                mLogger.debug("Executing index operation now: "
+                        + op.getClass().getName());
+                roller.getThreadManager().executeInForeground(op);
+            }
+        } catch (InterruptedException e) {
+            mLogger.error("Error executing operation", e);
+        }
+    }
+
+    public synchronized void resetSharedReader() {
+        reader = null;
+    }
+
+    public synchronized IndexReader getSharedIndexReader() {
+        if (reader == null) {
+            try {
+                reader = IndexReader.open(getIndexDirectory());
+            } catch (IOException e) {
+            }
+        }
+        return reader;
+    }
+
+    /**
+     * Get the directory that is used by the lucene index. This method will
+     * return null if there is no index at the directory location. If we are
+     * using a RAM index, the directory will be a ram directory.
+     * 
+     * @return Directory The directory containing the index, or null if error.
+     */
+    public Directory getIndexDirectory() {
+        if (useRAMIndex) {
+            return fRAMindex;
+        } else {
+            return getFSDirectory(false);
+        }
+    }
+
+    private boolean indexExists() {
+        try {
+            return IndexReader.indexExists(getIndexDirectory());
+        } catch (IOException e) {
+            mLogger.error("Problem accessing index directory", e);
+        }
+        return false;
+    }
+
+    private Directory getFSDirectory(boolean delete) {
+
+        Directory directory = null;
+
+        try {
+
+            directory = FSDirectory.open(new File(indexDir));
+
+            if (delete && directory != null) {
+                String[] files = directory.listAll(); // clear old files
+                for (int i = 0; i < files.length; i++) {
+                    File file = new File(indexDir, files[i]);
+                    if (!file.delete())
+                        throw new IOException("couldn't delete " + files[i]);
+                }
+            }
+
+        } catch (IOException e) {
+            mLogger.error("Problem accessing index directory", e);
+        }
+
+        return directory;
+
+    }
+
+    private void createIndex(Directory dir) {
+        IndexWriter writer = null;
+
+        try {
+
+            IndexWriterConfig config = new IndexWriterConfig(
+                    FieldConstants.LUCENE_VERSION, new LimitTokenCountAnalyzer(
+                            IndexManagerImpl.getAnalyzer(),
+                            IndexWriterConfig.DEFAULT_TERM_INDEX_INTERVAL));
+
+            writer = new IndexWriter(dir, config);
+
+        } catch (IOException e) {
+            mLogger.error("Error creating index", e);
+        } finally {
+            try {
+                if (writer != null) {
+                    writer.close();
+                }
+            } catch (IOException e) {
+            }
+        }
+    }
+
+    private IndexOperation getSaveIndexOperation() {
+        return new WriteToIndexOperation(this) {
+            public void doRun() {
+                Directory dir = getIndexDirectory();
+                Directory fsdir = getFSDirectory(true);
+
+                IndexWriter writer = null;
+
+                try {
+                    IndexWriterConfig config = new IndexWriterConfig(
+                            FieldConstants.LUCENE_VERSION,
+                            new LimitTokenCountAnalyzer(
+                                    IndexManagerImpl.getAnalyzer(),
+                                    IndexWriterConfig.DEFAULT_TERM_INDEX_INTERVAL));
+
+                    writer = new IndexWriter(fsdir, config);
+
+                    writer.addIndexes(new Directory[] { dir });
+
+                    writer.commit();
+
+                    indexConsistencyMarker.delete();
+
+                } catch (IOException e) {
+                    mLogger.error("Problem saving index to disk", e);
+
+                    // Delete the directory, since there was a problem saving
+                    // the RAM contents
+                    getFSDirectory(true);
+                } finally {
+                    try {
+                        if (writer != null)
+                            writer.close();
+                    } catch (IOException e1) {
+                        mLogger.warn("Unable to close IndexWriter.");
+                    }
+                }
+
+            }
+        };
+    }
+
+    public void release() {
+        // no-op
+    }
+
+    public void shutdown() {
+        if (useRAMIndex) {
+            scheduleIndexOperation(getSaveIndexOperation());
+        } else {
+            indexConsistencyMarker.delete();
+        }
+
+        try {
+            if (reader != null)
+                reader.close();
+        } catch (IOException e) {
+            // won't happen, since it was
+        }
+    }
 
 }

Modified: roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/IndexUtil.java
URL: http://svn.apache.org/viewvc/roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/IndexUtil.java?rev=1465341&r1=1465340&r2=1465341&view=diff
==============================================================================
--- roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/IndexUtil.java (original)
+++ roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/IndexUtil.java Sun Apr  7 08:09:27 2013
@@ -33,45 +33,45 @@ import org.apache.lucene.index.Term;
  */
 public class IndexUtil {
 
-	/**
-	 * Create a lucene term from the first token of the input string.
-	 * 
-	 * @param field
-	 *            The lucene document field to create a term with
-	 * @param input
-	 *            The input you wish to convert into a term
-	 * 
-	 * @return Lucene search term
-	 */
-	public static final Term getTerm(String field, String input) {
-
-		if (input == null || field == null)
-			return null;
-
-		Analyzer analyer = IndexManagerImpl.getAnalyzer();
-
-		TokenStream tokens = analyer
-				.tokenStream(field, new StringReader(input));
-
-		CharTermAttribute termAtt = (CharTermAttribute) tokens
-				.addAttribute(CharTermAttribute.class);
-
-		Term term = null;
-
-		try {
-
-			tokens.reset();
-
-			if (tokens.incrementToken()) {
-				String termt = termAtt.toString();
-				term = new Term(field, termt);
-			}
-
-		} catch (IOException e) {
-			// ignored
-		}
+    /**
+     * Create a lucene term from the first token of the input string.
+     * 
+     * @param field
+     *            The lucene document field to create a term with
+     * @param input
+     *            The input you wish to convert into a term
+     * 
+     * @return Lucene search term
+     */
+    public static final Term getTerm(String field, String input) {
+
+        if (input == null || field == null)
+            return null;
+
+        Analyzer analyer = IndexManagerImpl.getAnalyzer();
+
+        TokenStream tokens = analyer
+                .tokenStream(field, new StringReader(input));
+
+        CharTermAttribute termAtt = (CharTermAttribute) tokens
+                .addAttribute(CharTermAttribute.class);
+
+        Term term = null;
+
+        try {
+
+            tokens.reset();
+
+            if (tokens.incrementToken()) {
+                String termt = termAtt.toString();
+                term = new Term(field, termt);
+            }
+
+        } catch (IOException e) {
+            // ignored
+        }
 
-		return term;
-	}
+        return term;
+    }
 
 }

Modified: roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/IndexOperation.java
URL: http://svn.apache.org/viewvc/roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/IndexOperation.java?rev=1465341&r1=1465340&r2=1465341&view=diff
==============================================================================
--- roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/IndexOperation.java (original)
+++ roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/IndexOperation.java Sun Apr  7 08:09:27 2013
@@ -48,174 +48,174 @@ import org.apache.roller.weblogger.util.
  */
 public abstract class IndexOperation implements Runnable {
 
-	private static Log mLogger = LogFactory.getFactory().getInstance(
-			IndexOperation.class);
+    private static Log mLogger = LogFactory.getFactory().getInstance(
+            IndexOperation.class);
 
-	// ~ Instance fields
-	// ========================================================
-	protected IndexManagerImpl manager;
-	private IndexWriter writer;
-
-	// ~ Constructors
-	// ===========================================================
-	public IndexOperation(IndexManagerImpl manager) {
-		this.manager = manager;
-	}
-
-	// ~ Methods
-	// ================================================================
-	protected Document getDocument(WeblogEntry data) {
-
-		// Actual comment content is indexed only if search.index.comments
-		// is true or absent from the (static) configuration properties.
-		// If false in the configuration, comments are treated as if empty.
-		boolean indexComments = WebloggerConfig.getBooleanProperty(
-				"search.index.comments", true);
-
-		String commentContent = "";
-		String commentEmail = "";
-		String commentName = "";
-		if (indexComments) {
-			List comments = data.getComments();
-			if (comments != null) {
-				StringBuilder commentEmailBld = new StringBuilder();
-				StringBuilder commentContentBld = new StringBuilder();
-				StringBuilder commentNameBld = new StringBuilder();
-				for (Iterator cItr = comments.iterator(); cItr.hasNext();) {
-					WeblogEntryComment comment = (WeblogEntryComment) cItr
-							.next();
-					if (comment.getContent() != null) {
-						commentContentBld.append(comment.getContent());
-						commentContentBld.append(",");
-					}
-					if (comment.getEmail() != null) {
-						commentEmailBld.append(comment.getEmail());
-						commentEmailBld.append(",");
-					}
-					if (comment.getName() != null) {
-						commentNameBld.append(comment.getName());
-						commentNameBld.append(",");
-					}
-				}
-				commentEmail = commentEmailBld.toString();
-				commentContent = commentContentBld.toString();
-				commentName = commentNameBld.toString();
-			}
-		}
-
-		Document doc = new Document();
-
-		// keyword
-		doc.add(new Field(FieldConstants.ID, data.getId(), Field.Store.YES,
-				Field.Index.NOT_ANALYZED));
-
-		// keyword
-		doc.add(new Field(FieldConstants.WEBSITE_HANDLE, data.getWebsite()
-				.getHandle(), Field.Store.YES, Field.Index.NOT_ANALYZED));
-
-		// unindexed
-		doc.add(new Field(FieldConstants.ANCHOR, data.getAnchor(),
-				Field.Store.YES, Field.Index.NO));
-
-		// text
-		doc.add(new Field(FieldConstants.USERNAME, data.getCreator()
-				.getUserName(), Field.Store.YES, Field.Index.ANALYZED));
-
-		// text
-		doc.add(new Field(FieldConstants.TITLE, data.getTitle(),
-				Field.Store.YES, Field.Index.ANALYZED));
-
-		// index the entry text, but don't store it - moved to end of block
-		// unstored
-		doc.add(new Field(FieldConstants.CONTENT, data.getText(),
-				Field.Store.NO, Field.Index.ANALYZED));
-
-		// store an abbreviated version of the entry text, but don't index
-		// unindexed
-		doc.add(new Field(FieldConstants.CONTENT_STORED, Utilities
-				.truncateNicely(Utilities.removeHTML(data.getText()), 240, 260,
-						"..."), Field.Store.YES, Field.Index.NO));
-
-		// keyword
-		doc.add(new Field(FieldConstants.UPDATED, data.getUpdateTime()
-				.toString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
-
-		// keyword
-		doc.add(new Field(FieldConstants.PUBLISHED, data.getPubTime()
-				.toString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
-
-		// index Comments
-		// unstored
-		doc.add(new Field(FieldConstants.C_CONTENT, commentContent,
-				Field.Store.NO, Field.Index.ANALYZED));
-		// unstored
-		doc.add(new Field(FieldConstants.C_EMAIL, commentEmail, Field.Store.NO,
-				Field.Index.ANALYZED));
-		// unstored
-		doc.add(new Field(FieldConstants.C_NAME, commentName, Field.Store.NO,
-				Field.Index.ANALYZED));
-
-		// unstored
-		doc.add(new Field(FieldConstants.CONSTANT, FieldConstants.CONSTANT_V,
-				Field.Store.NO, Field.Index.ANALYZED));
-
-		// index Category
-		WeblogCategory categorydata = data.getCategory();
-		Field category = (categorydata == null)
-		// unstored
-		? new Field(FieldConstants.CATEGORY, "", Field.Store.NO,
-				Field.Index.ANALYZED)
-		// text
-				: new Field(FieldConstants.CATEGORY, categorydata.getName(),
-						Field.Store.YES, Field.Index.ANALYZED);
-		doc.add(category);
-
-		return doc;
-	}
-
-	/**
-	 * Begin writing.
-	 *
-	 * @return the index writer
-	 */
-	protected IndexWriter beginWriting() {
-		try {
-
-			// Limit to 1000 tokens.
-			LimitTokenCountAnalyzer analyzer = new LimitTokenCountAnalyzer(
-					IndexManagerImpl.getAnalyzer(), 1000);
-
-			IndexWriterConfig config = new IndexWriterConfig(
-					FieldConstants.LUCENE_VERSION, analyzer);
-
-			writer = new IndexWriter(manager.getIndexDirectory(), config);
-
-		} catch (IOException e) {
-			mLogger.error("ERROR creating writer", e);
-		}
-
-		return writer;
-	}
-
-	/**
-	 * End writing.
-	 */
-	protected void endWriting() {
-		if (writer != null) {
-			try {
-				writer.close();
-			} catch (IOException e) {
-				mLogger.error("ERROR closing writer", e);
-			}
-		}
-	}
-
-	/**
-	 * @see java.lang.Runnable#run()
-	 */
-	public void run() {
-		doRun();
-	}
+    // ~ Instance fields
+    // ========================================================
+    protected IndexManagerImpl manager;
+    private IndexWriter writer;
+
+    // ~ Constructors
+    // ===========================================================
+    public IndexOperation(IndexManagerImpl manager) {
+        this.manager = manager;
+    }
+
+    // ~ Methods
+    // ================================================================
+    protected Document getDocument(WeblogEntry data) {
+
+        // Actual comment content is indexed only if search.index.comments
+        // is true or absent from the (static) configuration properties.
+        // If false in the configuration, comments are treated as if empty.
+        boolean indexComments = WebloggerConfig.getBooleanProperty(
+                "search.index.comments", true);
+
+        String commentContent = "";
+        String commentEmail = "";
+        String commentName = "";
+        if (indexComments) {
+            List comments = data.getComments();
+            if (comments != null) {
+                StringBuilder commentEmailBld = new StringBuilder();
+                StringBuilder commentContentBld = new StringBuilder();
+                StringBuilder commentNameBld = new StringBuilder();
+                for (Iterator cItr = comments.iterator(); cItr.hasNext();) {
+                    WeblogEntryComment comment = (WeblogEntryComment) cItr
+                            .next();
+                    if (comment.getContent() != null) {
+                        commentContentBld.append(comment.getContent());
+                        commentContentBld.append(",");
+                    }
+                    if (comment.getEmail() != null) {
+                        commentEmailBld.append(comment.getEmail());
+                        commentEmailBld.append(",");
+                    }
+                    if (comment.getName() != null) {
+                        commentNameBld.append(comment.getName());
+                        commentNameBld.append(",");
+                    }
+                }
+                commentEmail = commentEmailBld.toString();
+                commentContent = commentContentBld.toString();
+                commentName = commentNameBld.toString();
+            }
+        }
+
+        Document doc = new Document();
+
+        // keyword
+        doc.add(new Field(FieldConstants.ID, data.getId(), Field.Store.YES,
+                Field.Index.NOT_ANALYZED));
+
+        // keyword
+        doc.add(new Field(FieldConstants.WEBSITE_HANDLE, data.getWebsite()
+                .getHandle(), Field.Store.YES, Field.Index.NOT_ANALYZED));
+
+        // unindexed
+        doc.add(new Field(FieldConstants.ANCHOR, data.getAnchor(),
+                Field.Store.YES, Field.Index.NO));
+
+        // text
+        doc.add(new Field(FieldConstants.USERNAME, data.getCreator()
+                .getUserName(), Field.Store.YES, Field.Index.ANALYZED));
+
+        // text
+        doc.add(new Field(FieldConstants.TITLE, data.getTitle(),
+                Field.Store.YES, Field.Index.ANALYZED));
+
+        // index the entry text, but don't store it - moved to end of block
+        // unstored
+        doc.add(new Field(FieldConstants.CONTENT, data.getText(),
+                Field.Store.NO, Field.Index.ANALYZED));
+
+        // store an abbreviated version of the entry text, but don't index
+        // unindexed
+        doc.add(new Field(FieldConstants.CONTENT_STORED, Utilities
+                .truncateNicely(Utilities.removeHTML(data.getText()), 240, 260,
+                        "..."), Field.Store.YES, Field.Index.NO));
+
+        // keyword
+        doc.add(new Field(FieldConstants.UPDATED, data.getUpdateTime()
+                .toString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
+
+        // keyword
+        doc.add(new Field(FieldConstants.PUBLISHED, data.getPubTime()
+                .toString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
+
+        // index Comments
+        // unstored
+        doc.add(new Field(FieldConstants.C_CONTENT, commentContent,
+                Field.Store.NO, Field.Index.ANALYZED));
+        // unstored
+        doc.add(new Field(FieldConstants.C_EMAIL, commentEmail, Field.Store.NO,
+                Field.Index.ANALYZED));
+        // unstored
+        doc.add(new Field(FieldConstants.C_NAME, commentName, Field.Store.NO,
+                Field.Index.ANALYZED));
+
+        // unstored
+        doc.add(new Field(FieldConstants.CONSTANT, FieldConstants.CONSTANT_V,
+                Field.Store.NO, Field.Index.ANALYZED));
+
+        // index Category
+        WeblogCategory categorydata = data.getCategory();
+        Field category = (categorydata == null)
+        // unstored
+        ? new Field(FieldConstants.CATEGORY, "", Field.Store.NO,
+                Field.Index.ANALYZED)
+        // text
+                : new Field(FieldConstants.CATEGORY, categorydata.getName(),
+                        Field.Store.YES, Field.Index.ANALYZED);
+        doc.add(category);
+
+        return doc;
+    }
+
+    /**
+     * Begin writing.
+     * 
+     * @return the index writer
+     */
+    protected IndexWriter beginWriting() {
+        try {
+
+            // Limit to 1000 tokens.
+            LimitTokenCountAnalyzer analyzer = new LimitTokenCountAnalyzer(
+                    IndexManagerImpl.getAnalyzer(), 1000);
+
+            IndexWriterConfig config = new IndexWriterConfig(
+                    FieldConstants.LUCENE_VERSION, analyzer);
+
+            writer = new IndexWriter(manager.getIndexDirectory(), config);
+
+        } catch (IOException e) {
+            mLogger.error("ERROR creating writer", e);
+        }
+
+        return writer;
+    }
+
+    /**
+     * End writing.
+     */
+    protected void endWriting() {
+        if (writer != null) {
+            try {
+                writer.close();
+            } catch (IOException e) {
+                mLogger.error("ERROR closing writer", e);
+            }
+        }
+    }
+
+    /**
+     * @see java.lang.Runnable#run()
+     */
+    public void run() {
+        doRun();
+    }
 
-	protected abstract void doRun();
+    protected abstract void doRun();
 }

Modified: roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/ReIndexEntryOperation.java
URL: http://svn.apache.org/viewvc/roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/ReIndexEntryOperation.java?rev=1465341&r1=1465340&r2=1465341&view=diff
==============================================================================
--- roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/ReIndexEntryOperation.java (original)
+++ roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/ReIndexEntryOperation.java Sun Apr  7 08:09:27 2013
@@ -38,64 +38,64 @@ import org.apache.roller.weblogger.pojos
  */
 public class ReIndexEntryOperation extends WriteToIndexOperation {
 
-	// ~ Static fields/initializers
-	// =============================================
+    // ~ Static fields/initializers
+    // =============================================
 
-	private static Log mLogger = LogFactory.getFactory().getInstance(
-			AddEntryOperation.class);
+    private static Log mLogger = LogFactory.getFactory().getInstance(
+            AddEntryOperation.class);
 
-	// ~ Instance fields
-	// ========================================================
+    // ~ Instance fields
+    // ========================================================
 
-	private WeblogEntry data;
-	private Weblogger roller;
-
-	// ~ Constructors
-	// ===========================================================
-
-	/**
-	 * Adds a web log entry into the index.
-	 */
-	public ReIndexEntryOperation(Weblogger roller, IndexManagerImpl mgr,
-			WeblogEntry data) {
-		super(mgr);
-		this.roller = roller;
-		this.data = data;
-	}
-
-	// ~ Methods
-	// ================================================================
-
-	public void doRun() {
-
-		// since this operation can be run on a separate thread we must treat
-		// the weblog object passed in as a detached object which is proned to
-		// lazy initialization problems, so requery for the object now
-		try {
-			WeblogEntryManager wMgr = roller.getWeblogEntryManager();
-			this.data = wMgr.getWeblogEntry(this.data.getId());
-		} catch (WebloggerException ex) {
-			mLogger.error("Error getting weblogentry object", ex);
-			return;
-		}
-
-		IndexWriter writer = beginWriting();
-		try {
-			if (writer != null) {
-
-				// Delete Doc
-				Term term = new Term(FieldConstants.ID, data.getId());
-				writer.deleteDocuments(term);
-
-				// Add Doc
-				writer.addDocument(getDocument(data));
-			}
-		} catch (IOException e) {
-			mLogger.error("Problems adding/deleting doc to index", e);
-		} finally {
-			if (roller != null)
-				roller.release();
-			endWriting();
-		}
-	}
+    private WeblogEntry data;
+    private Weblogger roller;
+
+    // ~ Constructors
+    // ===========================================================
+
+    /**
+     * Adds a web log entry into the index.
+     */
+    public ReIndexEntryOperation(Weblogger roller, IndexManagerImpl mgr,
+            WeblogEntry data) {
+        super(mgr);
+        this.roller = roller;
+        this.data = data;
+    }
+
+    // ~ Methods
+    // ================================================================
+
+    public void doRun() {
+
+        // since this operation can be run on a separate thread we must treat
+        // the weblog object passed in as a detached object which is proned to
+        // lazy initialization problems, so requery for the object now
+        try {
+            WeblogEntryManager wMgr = roller.getWeblogEntryManager();
+            this.data = wMgr.getWeblogEntry(this.data.getId());
+        } catch (WebloggerException ex) {
+            mLogger.error("Error getting weblogentry object", ex);
+            return;
+        }
+
+        IndexWriter writer = beginWriting();
+        try {
+            if (writer != null) {
+
+                // Delete Doc
+                Term term = new Term(FieldConstants.ID, data.getId());
+                writer.deleteDocuments(term);
+
+                // Add Doc
+                writer.addDocument(getDocument(data));
+            }
+        } catch (IOException e) {
+            mLogger.error("Problems adding/deleting doc to index", e);
+        } finally {
+            if (roller != null)
+                roller.release();
+            endWriting();
+        }
+    }
 }

Modified: roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/RebuildWebsiteIndexOperation.java
URL: http://svn.apache.org/viewvc/roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/RebuildWebsiteIndexOperation.java?rev=1465341&r1=1465340&r2=1465341&view=diff
==============================================================================
--- roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/RebuildWebsiteIndexOperation.java (original)
+++ roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/RebuildWebsiteIndexOperation.java Sun Apr  7 08:09:27 2013
@@ -43,119 +43,119 @@ import org.apache.roller.weblogger.pojos
  */
 public class RebuildWebsiteIndexOperation extends WriteToIndexOperation {
 
-	// ~ Static fields/initializers
-	// =============================================
+    // ~ Static fields/initializers
+    // =============================================
 
-	private static Log mLogger = LogFactory.getFactory().getInstance(
-			RebuildWebsiteIndexOperation.class);
+    private static Log mLogger = LogFactory.getFactory().getInstance(
+            RebuildWebsiteIndexOperation.class);
 
-	// ~ Instance fields
-	// ========================================================
+    // ~ Instance fields
+    // ========================================================
 
-	private Weblog website;
-	private Weblogger roller;
-
-	// ~ Constructors
-	// ===========================================================
-
-	/**
-	 * Create a new operation that will recreate an index.
-	 * 
-	 * @param website
-	 *            The website to rebuild the index for, or null for all users.
-	 */
-	public RebuildWebsiteIndexOperation(Weblogger roller, IndexManagerImpl mgr,
-			Weblog website) {
-		super(mgr);
-		this.roller = roller;
-		this.website = website;
-	}
-
-	// ~ Methods
-	// ================================================================
-
-	public void doRun() {
-
-		Date start = new Date();
-
-		// since this operation can be run on a separate thread we must treat
-		// the weblog object passed in as a detached object which is proned to
-		// lazy initialization problems, so requery for the object now
-		if (this.website != null) {
-			mLogger.debug("Reindexining weblog " + website.getHandle());
-			try {
-				this.website = roller.getWeblogManager().getWeblog(
-						this.website.getId());
-			} catch (WebloggerException ex) {
-				mLogger.error("Error getting website object", ex);
-				return;
-			}
-		} else {
-			mLogger.debug("Reindexining entire site");
-		}
-
-		IndexWriter writer = beginWriting();
-
-		try {
-			if (writer != null) {
-
-				// Delete Doc
-				Term tWebsite = null;
-				if (website != null) {
-					tWebsite = IndexUtil.getTerm(FieldConstants.WEBSITE_HANDLE,
-							website.getHandle());
-				}
-				if (tWebsite != null) {
-					writer.deleteDocuments(tWebsite);
-				} else {
-					Term all = IndexUtil.getTerm(FieldConstants.CONSTANT,
-							FieldConstants.CONSTANT_V);
-					writer.deleteDocuments(all);
-				}
-
-				// Add Doc
-				WeblogEntryManager weblogManager = roller
-						.getWeblogEntryManager();
-				List entries = weblogManager.getWeblogEntries(website, // website
-						null, null, // startDate
-						null, // endDate
-						null, // catName
-						null, WeblogEntry.PUBLISHED, // status
-						null, // text
-						null, // sortby (null means pubTime)
-						null, null, 0, -1); // offset, length, locale
-
-				mLogger.debug("Entries to index: " + entries.size());
-
-				for (Iterator wbItr = entries.iterator(); wbItr.hasNext();) {
-					WeblogEntry entry = (WeblogEntry) wbItr.next();
-					writer.addDocument(getDocument(entry));
-					mLogger.debug(MessageFormat.format(
-							"Indexed entry {0}: {1}",
-							new Object[] { entry.getPubTime(),
-									entry.getAnchor() }));
-				}
-
-				// release the database connection
-				roller.release();
-			}
-		} catch (Exception e) {
-			mLogger.error("ERROR adding/deleting doc to index", e);
-		} finally {
-			endWriting();
-			if (roller != null)
-				roller.release();
-		}
-
-		Date end = new Date();
-		double length = (end.getTime() - start.getTime()) / (double) 1000;
-
-		if (website == null) {
-			mLogger.info("Completed rebuilding index for all users in '"
-					+ length + "' secs");
-		} else {
-			mLogger.info("Completed rebuilding index for website handle: '"
-					+ website.getHandle() + "' in '" + length + "' seconds");
-		}
-	}
+    private Weblog website;
+    private Weblogger roller;
+
+    // ~ Constructors
+    // ===========================================================
+
+    /**
+     * Create a new operation that will recreate an index.
+     * 
+     * @param website
+     *            The website to rebuild the index for, or null for all users.
+     */
+    public RebuildWebsiteIndexOperation(Weblogger roller, IndexManagerImpl mgr,
+            Weblog website) {
+        super(mgr);
+        this.roller = roller;
+        this.website = website;
+    }
+
+    // ~ Methods
+    // ================================================================
+
+    public void doRun() {
+
+        Date start = new Date();
+
+        // since this operation can be run on a separate thread we must treat
+        // the weblog object passed in as a detached object which is proned to
+        // lazy initialization problems, so requery for the object now
+        if (this.website != null) {
+            mLogger.debug("Reindexining weblog " + website.getHandle());
+            try {
+                this.website = roller.getWeblogManager().getWeblog(
+                        this.website.getId());
+            } catch (WebloggerException ex) {
+                mLogger.error("Error getting website object", ex);
+                return;
+            }
+        } else {
+            mLogger.debug("Reindexining entire site");
+        }
+
+        IndexWriter writer = beginWriting();
+
+        try {
+            if (writer != null) {
+
+                // Delete Doc
+                Term tWebsite = null;
+                if (website != null) {
+                    tWebsite = IndexUtil.getTerm(FieldConstants.WEBSITE_HANDLE,
+                            website.getHandle());
+                }
+                if (tWebsite != null) {
+                    writer.deleteDocuments(tWebsite);
+                } else {
+                    Term all = IndexUtil.getTerm(FieldConstants.CONSTANT,
+                            FieldConstants.CONSTANT_V);
+                    writer.deleteDocuments(all);
+                }
+
+                // Add Doc
+                WeblogEntryManager weblogManager = roller
+                        .getWeblogEntryManager();
+                List entries = weblogManager.getWeblogEntries(website, // website
+                        null, null, // startDate
+                        null, // endDate
+                        null, // catName
+                        null, WeblogEntry.PUBLISHED, // status
+                        null, // text
+                        null, // sortby (null means pubTime)
+                        null, null, 0, -1); // offset, length, locale
+
+                mLogger.debug("Entries to index: " + entries.size());
+
+                for (Iterator wbItr = entries.iterator(); wbItr.hasNext();) {
+                    WeblogEntry entry = (WeblogEntry) wbItr.next();
+                    writer.addDocument(getDocument(entry));
+                    mLogger.debug(MessageFormat.format(
+                            "Indexed entry {0}: {1}",
+                            new Object[] { entry.getPubTime(),
+                                    entry.getAnchor() }));
+                }
+
+                // release the database connection
+                roller.release();
+            }
+        } catch (Exception e) {
+            mLogger.error("ERROR adding/deleting doc to index", e);
+        } finally {
+            endWriting();
+            if (roller != null)
+                roller.release();
+        }
+
+        Date end = new Date();
+        double length = (end.getTime() - start.getTime()) / (double) 1000;
+
+        if (website == null) {
+            mLogger.info("Completed rebuilding index for all users in '"
+                    + length + "' secs");
+        } else {
+            mLogger.info("Completed rebuilding index for website handle: '"
+                    + website.getHandle() + "' in '" + length + "' seconds");
+        }
+    }
 }

Modified: roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/RemoveEntryOperation.java
URL: http://svn.apache.org/viewvc/roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/RemoveEntryOperation.java?rev=1465341&r1=1465340&r2=1465341&view=diff
==============================================================================
--- roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/RemoveEntryOperation.java (original)
+++ roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/RemoveEntryOperation.java Sun Apr  7 08:09:27 2013
@@ -38,55 +38,55 @@ import org.apache.roller.weblogger.pojos
  */
 public class RemoveEntryOperation extends WriteToIndexOperation {
 
-	// ~ Static fields/initializers
-	// =============================================
+    // ~ Static fields/initializers
+    // =============================================
 
-	private static Log mLogger = LogFactory.getFactory().getInstance(
-			RemoveEntryOperation.class);
+    private static Log mLogger = LogFactory.getFactory().getInstance(
+            RemoveEntryOperation.class);
 
-	// ~ Instance fields
-	// ========================================================
+    // ~ Instance fields
+    // ========================================================
 
-	private WeblogEntry data;
-	private Weblogger roller;
-
-	// ~ Constructors
-	// ===========================================================
-
-	public RemoveEntryOperation(Weblogger roller, IndexManagerImpl mgr,
-			WeblogEntry data) {
-		super(mgr);
-		this.roller = roller;
-		this.data = data;
-	}
-
-	// ~ Methods
-	// ================================================================
-
-	public void doRun() {
-
-		// since this operation can be run on a separate thread we must treat
-		// the weblog object passed in as a detached object which is proned to
-		// lazy initialization problems, so requery for the object now
-		try {
-			WeblogEntryManager wMgr = roller.getWeblogEntryManager();
-			this.data = wMgr.getWeblogEntry(this.data.getId());
-		} catch (WebloggerException ex) {
-			mLogger.error("Error getting weblogentry object", ex);
-			return;
-		}
-
-		IndexWriter writer = beginWriting();
-		try {
-			if (writer != null) {
-				Term term = new Term(FieldConstants.ID, data.getId());
-				writer.deleteDocuments(term);
-			}
-		} catch (IOException e) {
-			mLogger.error("Error deleting doc from index", e);
-		} finally {
-			endWriting();
-		}
-	}
+    private WeblogEntry data;
+    private Weblogger roller;
+
+    // ~ Constructors
+    // ===========================================================
+
+    public RemoveEntryOperation(Weblogger roller, IndexManagerImpl mgr,
+            WeblogEntry data) {
+        super(mgr);
+        this.roller = roller;
+        this.data = data;
+    }
+
+    // ~ Methods
+    // ================================================================
+
+    public void doRun() {
+
+        // since this operation can be run on a separate thread we must treat
+        // the weblog object passed in as a detached object which is proned to
+        // lazy initialization problems, so requery for the object now
+        try {
+            WeblogEntryManager wMgr = roller.getWeblogEntryManager();
+            this.data = wMgr.getWeblogEntry(this.data.getId());
+        } catch (WebloggerException ex) {
+            mLogger.error("Error getting weblogentry object", ex);
+            return;
+        }
+
+        IndexWriter writer = beginWriting();
+        try {
+            if (writer != null) {
+                Term term = new Term(FieldConstants.ID, data.getId());
+                writer.deleteDocuments(term);
+            }
+        } catch (IOException e) {
+            mLogger.error("Error deleting doc from index", e);
+        } finally {
+            endWriting();
+        }
+    }
 
 }

Modified: roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/RemoveWebsiteIndexOperation.java
URL: http://svn.apache.org/viewvc/roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/RemoveWebsiteIndexOperation.java?rev=1465341&r1=1465340&r2=1465341&view=diff
==============================================================================
--- roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/RemoveWebsiteIndexOperation.java (original)
+++ roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/RemoveWebsiteIndexOperation.java Sun Apr  7 08:09:27 2013
@@ -39,77 +39,77 @@ import org.apache.roller.weblogger.pojos
  */
 public class RemoveWebsiteIndexOperation extends WriteToIndexOperation {
 
-	// ~ Static fields/initializers
-	// =============================================
+    // ~ Static fields/initializers
+    // =============================================
 
-	private static Log mLogger = LogFactory.getFactory().getInstance(
-			RemoveWebsiteIndexOperation.class);
+    private static Log mLogger = LogFactory.getFactory().getInstance(
+            RemoveWebsiteIndexOperation.class);
 
-	// ~ Instance fields
-	// ========================================================
+    // ~ Instance fields
+    // ========================================================
 
-	private Weblog website;
-	private Weblogger roller;
-
-	// ~ Constructors
-	// ===========================================================
-
-	/**
-	 * Create a new operation that will recreate an index.
-	 * 
-	 * @param website
-	 *            The website to rebuild the index for, or null for all sites.
-	 */
-	public RemoveWebsiteIndexOperation(Weblogger roller, IndexManagerImpl mgr,
-			Weblog website) {
-		super(mgr);
-		this.roller = roller;
-		this.website = website;
-	}
-
-	// ~ Methods
-	// ================================================================
-
-	public void doRun() {
-		Date start = new Date();
-
-		// since this operation can be run on a separate thread we must treat
-		// the weblog object passed in as a detached object which is proned to
-		// lazy initialization problems, so requery for the object now
-		try {
-			this.website = roller.getWeblogManager().getWeblog(
-					this.website.getId());
-		} catch (WebloggerException ex) {
-			mLogger.error("Error getting website object", ex);
-			return;
-		}
-
-		IndexWriter writer = beginWriting();
-		try {
-			if (writer != null) {
-				String handle = null;
-				if (website != null) {
-					handle = website.getHandle();
-				}
-				Term tHandle = IndexUtil.getTerm(FieldConstants.WEBSITE_HANDLE,
-						handle);
-
-				if (tHandle != null) {
-					writer.deleteDocuments(tHandle);
-				}
-			}
-		} catch (IOException e) {
-			mLogger.info("Problems deleting doc from index", e);
-		} finally {
-			endWriting();
-		}
-
-		Date end = new Date();
-		double length = (end.getTime() - start.getTime()) / (double) 1000;
-
-		if (website != null) {
-			mLogger.info("Completed deleting indices for website '"
-					+ website.getName() + "' in '" + length + "' seconds");
-		}
-	}
+    private Weblog website;
+    private Weblogger roller;
+
+    // ~ Constructors
+    // ===========================================================
+
+    /**
+     * Create a new operation that will recreate an index.
+     * 
+     * @param website
+     *            The website to rebuild the index for, or null for all sites.
+     */
+    public RemoveWebsiteIndexOperation(Weblogger roller, IndexManagerImpl mgr,
+            Weblog website) {
+        super(mgr);
+        this.roller = roller;
+        this.website = website;
+    }
+
+    // ~ Methods
+    // ================================================================
+
+    public void doRun() {
+        Date start = new Date();
+
+        // since this operation can be run on a separate thread we must treat
+        // the weblog object passed in as a detached object which is proned to
+        // lazy initialization problems, so requery for the object now
+        try {
+            this.website = roller.getWeblogManager().getWeblog(
+                    this.website.getId());
+        } catch (WebloggerException ex) {
+            mLogger.error("Error getting website object", ex);
+            return;
+        }
+
+        IndexWriter writer = beginWriting();
+        try {
+            if (writer != null) {
+                String handle = null;
+                if (website != null) {
+                    handle = website.getHandle();
+                }
+                Term tHandle = IndexUtil.getTerm(FieldConstants.WEBSITE_HANDLE,
+                        handle);
+
+                if (tHandle != null) {
+                    writer.deleteDocuments(tHandle);
+                }
+            }
+        } catch (IOException e) {
+            mLogger.info("Problems deleting doc from index", e);
+        } finally {
+            endWriting();
+        }
+
+        Date end = new Date();
+        double length = (end.getTime() - start.getTime()) / (double) 1000;
+
+        if (website != null) {
+            mLogger.info("Completed deleting indices for website '"
+                    + website.getName() + "' in '" + length + "' seconds");
+        }
+    }
 }

Modified: roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/SearchOperation.java
URL: http://svn.apache.org/viewvc/roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/SearchOperation.java?rev=1465341&r1=1465340&r2=1465341&view=diff
==============================================================================
--- roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/SearchOperation.java (original)
+++ roller/trunk/weblogger-business/src/main/java/org/apache/roller/weblogger/business/search/operations/SearchOperation.java Sun Apr  7 08:09:27 2013
@@ -46,185 +46,185 @@ import org.apache.roller.weblogger.busin
  */
 public class SearchOperation extends ReadFromIndexOperation {
 
-	// ~ Static fields/initializers
-	// =============================================
+    // ~ Static fields/initializers
+    // =============================================
 
-	private static Log mLogger = LogFactory.getFactory().getInstance(
-			SearchOperation.class);
+    private static Log mLogger = LogFactory.getFactory().getInstance(
+            SearchOperation.class);
 
-	private static String[] SEARCH_FIELDS = new String[] {
-			FieldConstants.CONTENT, FieldConstants.TITLE,
-			FieldConstants.C_CONTENT, FieldConstants.CATEGORY };
-
-	// private static BooleanClause.Occur[] SEARCH_FLAGS = new
-	// BooleanClause.Occur[] {
-	// BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD,
-	// BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD };
-
-	private static Sort SORTER = new Sort(new SortField(
-			FieldConstants.PUBLISHED, SortField.STRING, true));
-
-	// ~ Instance fields
-	// ========================================================
-
-	private IndexSearcher searcher;
-	private TopFieldDocs searchresults;
-
-	private String term;
-	private String websiteHandle;
-	private String category;
-	private String parseError;
-
-	private int nMax = 500; // Limit documents.
-
-	// ~ Constructors
-	// ===========================================================
-
-	/**
-	 * Create a new operation that searches the index.
-	 */
-	public SearchOperation(IndexManager mgr) {
-		// TODO: finish moving IndexManager to backend, so this cast is not
-		// needed
-		super((IndexManagerImpl) mgr);
-	}
-
-	// ~ Methods
-	// ================================================================
-
-	public void setTerm(String term) {
-		this.term = term;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Runnable#run()
-	 */
-	public void doRun() {
-		searchresults = null;
-
-		searcher = null;
-
-		try {
-			IndexReader reader = manager.getSharedIndexReader();
-			searcher = new IndexSearcher(reader);
-
-			// Query query = MultiFieldQueryParser.parse(
-			// FieldConstants.LUCENE_VERSION, term, SEARCH_FIELDS,
-			// SEARCH_FLAGS, IndexManagerImpl.getAnalyzer());
-
-			MultiFieldQueryParser multiParser = new MultiFieldQueryParser(
-					FieldConstants.LUCENE_VERSION, SEARCH_FIELDS,
-					IndexManagerImpl.getAnalyzer());
-
-			// Make it an AND by default. Comment this out for an or (default)
-			multiParser.setDefaultOperator(MultiFieldQueryParser.Operator.AND);
-
-			// Create a query object out of our term
-			Query query = multiParser.parse(term);
-
-			Term tUsername = IndexUtil.getTerm(FieldConstants.WEBSITE_HANDLE,
-					websiteHandle);
-
-			if (tUsername != null) {
-				BooleanQuery bQuery = new BooleanQuery();
-				bQuery.add(query, BooleanClause.Occur.MUST);
-				bQuery.add(new TermQuery(tUsername), BooleanClause.Occur.MUST);
-				query = bQuery;
-			}
-
-			Term tCategory = IndexUtil.getTerm(FieldConstants.CATEGORY,
-					category);
-
-			if (tCategory != null) {
-				BooleanQuery bQuery = new BooleanQuery();
-				bQuery.add(query, BooleanClause.Occur.MUST);
-				bQuery.add(new TermQuery(tCategory), BooleanClause.Occur.MUST);
-				query = bQuery;
-			}
-
-			searchresults = searcher.search(query, null/* Filter */, nMax,
-					SORTER);
-
-		} catch (IOException e) {
-			mLogger.error("Error searching index", e);
-			parseError = e.getMessage();
-
-		} catch (ParseException e) {
-			// who cares?
-			parseError = e.getMessage();
-		}
-		// don't need to close the reader, since we didn't do any writing!
-	}
-
-	/**
-	 * Gets the searcher.
-	 * 
-	 * @return the searcher
-	 */
-	public IndexSearcher getSearcher() {
-		return searcher;
-	}
-
-	/**
-	 * Sets the searcher.
-	 * 
-	 * @param searcher
-	 *            the new searcher
-	 */
-	public void setSearcher(IndexSearcher searcher) {
-		this.searcher = searcher;
-	}
-
-	/**
-	 * Gets the results.
-	 * 
-	 * @return the results
-	 */
-	public TopFieldDocs getResults() {
-		return searchresults;
-	}
-
-	/**
-	 * Gets the results count.
-	 * 
-	 * @return the results count
-	 */
-	public int getResultsCount() {
-		if (searchresults == null)
-			return -1;
-
-		return searchresults.totalHits;
-	}
-
-	/**
-	 * Gets the parses the error.
-	 * 
-	 * @return the parses the error
-	 */
-	public String getParseError() {
-		return parseError;
-	}
-
-	/**
-	 * Sets the website handle.
-	 * 
-	 * @param websiteHandle
-	 *            the new website handle
-	 */
-	public void setWebsiteHandle(String websiteHandle) {
-		this.websiteHandle = websiteHandle;
-	}
-
-	/**
-	 * Sets the category.
-	 * 
-	 * @param category
-	 *            the new category
-	 */
-	public void setCategory(String category) {
-		this.category = category;
-	}
+    private static String[] SEARCH_FIELDS = new String[] {
+            FieldConstants.CONTENT, FieldConstants.TITLE,
+            FieldConstants.C_CONTENT, FieldConstants.CATEGORY };
+
+    // private static BooleanClause.Occur[] SEARCH_FLAGS = new
+    // BooleanClause.Occur[] {
+    // BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD,
+    // BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD };
+
+    private static Sort SORTER = new Sort(new SortField(
+            FieldConstants.PUBLISHED, SortField.STRING, true));
+
+    // ~ Instance fields
+    // ========================================================
+
+    private IndexSearcher searcher;
+    private TopFieldDocs searchresults;
+
+    private String term;
+    private String websiteHandle;
+    private String category;
+    private String parseError;
+
+    private int nMax = 500; // Limit documents.
+
+    // ~ Constructors
+    // ===========================================================
+
+    /**
+     * Create a new operation that searches the index.
+     */
+    public SearchOperation(IndexManager mgr) {
+        // TODO: finish moving IndexManager to backend, so this cast is not
+        // needed
+        super((IndexManagerImpl) mgr);
+    }
+
+    // ~ Methods
+    // ================================================================
+
+    public void setTerm(String term) {
+        this.term = term;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see java.lang.Runnable#run()
+     */
+    public void doRun() {
+        searchresults = null;
+
+        searcher = null;
+
+        try {
+            IndexReader reader = manager.getSharedIndexReader();
+            searcher = new IndexSearcher(reader);
+
+            // Query query = MultiFieldQueryParser.parse(
+            // FieldConstants.LUCENE_VERSION, term, SEARCH_FIELDS,
+            // SEARCH_FLAGS, IndexManagerImpl.getAnalyzer());
+
+            MultiFieldQueryParser multiParser = new MultiFieldQueryParser(
+                    FieldConstants.LUCENE_VERSION, SEARCH_FIELDS,
+                    IndexManagerImpl.getAnalyzer());
+
+            // Make it an AND by default. Comment this out for an or (default)
+            multiParser.setDefaultOperator(MultiFieldQueryParser.Operator.AND);
+
+            // Create a query object out of our term
+            Query query = multiParser.parse(term);
+
+            Term tUsername = IndexUtil.getTerm(FieldConstants.WEBSITE_HANDLE,
+                    websiteHandle);
+
+            if (tUsername != null) {
+                BooleanQuery bQuery = new BooleanQuery();
+                bQuery.add(query, BooleanClause.Occur.MUST);
+                bQuery.add(new TermQuery(tUsername), BooleanClause.Occur.MUST);
+                query = bQuery;
+            }
+
+            Term tCategory = IndexUtil.getTerm(FieldConstants.CATEGORY,
+                    category);
+
+            if (tCategory != null) {
+                BooleanQuery bQuery = new BooleanQuery();
+                bQuery.add(query, BooleanClause.Occur.MUST);
+                bQuery.add(new TermQuery(tCategory), BooleanClause.Occur.MUST);
+                query = bQuery;
+            }
+
+            searchresults = searcher.search(query, null/* Filter */, nMax,
+                    SORTER);
+
+        } catch (IOException e) {
+            mLogger.error("Error searching index", e);
+            parseError = e.getMessage();
+
+        } catch (ParseException e) {
+            // who cares?
+            parseError = e.getMessage();
+        }
+        // don't need to close the reader, since we didn't do any writing!
+    }
+
+    /**
+     * Gets the searcher.
+     * 
+     * @return the searcher
+     */
+    public IndexSearcher getSearcher() {
+        return searcher;
+    }
+
+    /**
+     * Sets the searcher.
+     * 
+     * @param searcher
+     *            the new searcher
+     */
+    public void setSearcher(IndexSearcher searcher) {
+        this.searcher = searcher;
+    }
+
+    /**
+     * Gets the results.
+     * 
+     * @return the results
+     */
+    public TopFieldDocs getResults() {
+        return searchresults;
+    }
+
+    /**
+     * Gets the results count.
+     * 
+     * @return the results count
+     */
+    public int getResultsCount() {
+        if (searchresults == null)
+            return -1;
+
+        return searchresults.totalHits;
+    }
+
+    /**
+     * Gets the parses the error.
+     * 
+     * @return the parses the error
+     */
+    public String getParseError() {
+        return parseError;
+    }
+
+    /**
+     * Sets the website handle.
+     * 
+     * @param websiteHandle
+     *            the new website handle
+     */
+    public void setWebsiteHandle(String websiteHandle) {
+        this.websiteHandle = websiteHandle;
+    }
+
+    /**
+     * Sets the category.
+     * 
+     * @param category
+     *            the new category
+     */
+    public void setCategory(String category) {
+        this.category = category;
+    }
 
 }