/* * Copyright (c) JForum Team * All rights reserved. * * Redistribution and use in source and binary forms, * with or without modification, are permitted provided * that the following conditions are met: * * 1) Redistributions of source code must retain the above * copyright notice, this list of conditions and the * following disclaimer. * 2) Redistributions in binary form must reproduce the * above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or * other materials provided with the distribution. * 3) Neither the name of "Rafael Steil" nor * the names of its contributors may be used to endorse * or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE * * Created on 23/07/2007 15:14:27 * * The JForum Project * http://www.jforum.net */ package net.jforum.view.admin; import java.io.File; import java.io.IOException; import java.util.Date; import java.util.GregorianCalendar; import net.jforum.context.RequestContext; import net.jforum.context.ResponseContext; import net.jforum.exceptions.ForumException; import net.jforum.repository.ForumRepository; import net.jforum.search.LuceneManager; import net.jforum.search.LuceneReindexArgs; import net.jforum.search.LuceneReindexer; import net.jforum.search.LuceneSettings; import net.jforum.util.preferences.ConfigKeys; import net.jforum.util.preferences.SystemGlobals; import net.jforum.util.preferences.TemplateKeys; import org.apache.commons.lang.StringUtils; import org.apache.lucene.index.IndexReader; import freemarker.template.SimpleHash; import freemarker.template.Template; /** * @author Rafael Steil * @version $Id: LuceneStatsAction.java,v 1.24 2007/09/09 16:43:55 rafaelsteil Exp $ */ public class LuceneStatsAction extends AdminCommand { /** * @see net.jforum.Command#list() */ public void list() { IndexReader reader = null; try { File indexDir = new File(SystemGlobals.getValue(ConfigKeys.LUCENE_INDEX_WRITE_PATH)); this.setTemplateName(TemplateKeys.SEARCH_STATS_LIST); boolean isInformationAvailable = true; try { reader = IndexReader.open(indexDir); } catch (IOException e) { isInformationAvailable = false; } this.context.put("isInformationAvailable", isInformationAvailable); this.context.put("indexExists", IndexReader.indexExists(indexDir)); this.context.put("currentlyIndexing", "1".equals(SystemGlobals.getValue(ConfigKeys.LUCENE_CURRENTLY_INDEXING))); if (isInformationAvailable) { this.context.put("isLocked", IndexReader.isLocked(indexDir.getAbsolutePath())); this.context.put("lastModified", new Date(IndexReader.lastModified(indexDir))); this.context.put("indexLocation", indexDir.getAbsolutePath()); this.context.put("totalMessages", new Integer(ForumRepository.getTotalMessages())); this.context.put("indexVersion", new Long(reader.getVersion())); this.context.put("numberOfDocs", new Integer(reader.numDocs())); } } catch (IOException e) { throw new ForumException(e); } finally { if (reader != null) { try { reader.close(); } catch (Exception e) {} } } } public void createIndexDirectory() throws Exception { this.settings().createIndexDirectory( SystemGlobals.getValue(ConfigKeys.LUCENE_INDEX_WRITE_PATH)); this.list(); } public void reconstructIndexFromScratch() { LuceneReindexArgs args = this.buildReindexArgs(); boolean recreate = "recreate".equals(this.request.getParameter("indexOperationType")); LuceneReindexer reindexer = new LuceneReindexer(this.settings(), args, recreate); reindexer.startBackgroundProcess(); this.list(); } public void cancelIndexing() { SystemGlobals.setValue(ConfigKeys.LUCENE_CURRENTLY_INDEXING, "0"); this.list(); } public void luceneNotEnabled() { this.setTemplateName(TemplateKeys.SEARCH_STATS_NOT_ENABLED); } public Template process(RequestContext request, ResponseContext response, SimpleHash context) { if (!this.isSearchEngineLucene()) { this.ignoreAction(); this.luceneNotEnabled(); } return super.process(request, response, context); } private boolean isSearchEngineLucene() { return LuceneManager.class.getName() .equals(SystemGlobals.getValue(ConfigKeys.SEARCH_INDEXER_IMPLEMENTATION)) || this.settings() == null; } private LuceneSettings settings() { return (LuceneSettings)SystemGlobals.getObjectValue(ConfigKeys.LUCENE_SETTINGS); } private LuceneReindexArgs buildReindexArgs() { Date fromDate = this.buildDateFromRequest("from"); Date toDate = this.buildDateFromRequest("to"); int firstPostId = 0; int lastPostId = 0; if (!StringUtils.isEmpty(this.request.getParameter("firstPostId"))) { firstPostId = this.request.getIntParameter("firstPostId"); } if (!StringUtils.isEmpty(this.request.getParameter("lastPostId"))) { lastPostId = this.request.getIntParameter("lastPostId"); } return new LuceneReindexArgs(fromDate, toDate, firstPostId, lastPostId, "yes".equals(this.request.getParameter("avoidDuplicatedRecords")), this.request.getIntParameter("type")); } private Date buildDateFromRequest(String prefix) { String day = this.request.getParameter(prefix + "Day"); String month = this.request.getParameter(prefix + "Month"); String year = this.request.getParameter(prefix + "Year"); String hour = this.request.getParameter(prefix + "Hour"); String minutes = this.request.getParameter(prefix + "Minutes"); Date date = null; if (!StringUtils.isEmpty(day) && !StringUtils.isEmpty(month) && !StringUtils.isEmpty(year) && !StringUtils.isEmpty(hour) && !StringUtils.isEmpty(minutes)) { date = new GregorianCalendar(Integer.parseInt(year), Integer.parseInt(month) - 1, Integer.parseInt(year), Integer.parseInt(hour), Integer.parseInt(minutes), 0).getTime(); } return date; } }