001: package org.tigris.scarab.actions.admin;
002:
003: /* ================================================================
004: * Copyright (c) 2000-2002 CollabNet. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions are
008: * met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in the
015: * documentation and/or other materials provided with the distribution.
016: *
017: * 3. The end-user documentation included with the redistribution, if
018: * any, must include the following acknowlegement: "This product includes
019: * software developed by Collab.Net <http://www.Collab.Net/>."
020: * Alternately, this acknowlegement may appear in the software itself, if
021: * and wherever such third-party acknowlegements normally appear.
022: *
023: * 4. The hosted project names must not be used to endorse or promote
024: * products derived from this software without prior written
025: * permission. For written permission, please contact info@collab.net.
026: *
027: * 5. Products derived from this software may not use the "Tigris" or
028: * "Scarab" names nor may "Tigris" or "Scarab" appear in their names without
029: * prior written permission of Collab.Net.
030: *
031: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
032: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
033: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
034: * IN NO EVENT SHALL COLLAB.NET OR ITS CONTRIBUTORS BE LIABLE FOR ANY
035: * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
036: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
037: * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
038: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
039: * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
040: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
041: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
042: *
043: * ====================================================================
044: *
045: * This software consists of voluntary contributions made by many
046: * individuals on behalf of Collab.Net.
047: */
048:
049: // Turbine Stuff
050: import org.apache.turbine.TemplateContext;
051: import org.apache.turbine.RunData;
052:
053: // Scarab Stuff
054: import org.tigris.scarab.tools.ScarabRequestTool;
055: import org.tigris.scarab.tools.ScarabLocalizationTool;
056: import org.tigris.scarab.actions.base.RequireLoginFirstAction;
057: import org.tigris.scarab.util.word.SearchFactory;
058: import org.tigris.scarab.util.word.SearchIndex;
059: import org.tigris.scarab.util.Log;
060:
061: /**
062: * This class allows an admin to update the search index. It performs
063: * its magic by creating a background thread which executes until it is
064: * finished. The page will continue to refresh until the thread is
065: * done executing.
066: *
067: * @author <a href="mailto:jmcnally@collab.net">John McNally</a>
068: * @author <a href="mailto:jon@collab.net">Jon Scott Stevens</a>
069: * @version $Id: UpdateSearchIndex.java 9104 2004-05-10 21:04:51Z dabbous $
070: */
071: public class UpdateSearchIndex extends RequireLoginFirstAction {
072: private static ThreadGroup tg = null;
073: private static int seconds = 5;
074: private static int counter = 0;
075:
076: private void reset() {
077: seconds = 5;
078: counter = 0;
079: tg = null;
080: }
081:
082: public void doPerform(RunData data, TemplateContext context)
083: throws Exception {
084: ScarabRequestTool scarabR = getScarabRequestTool(context);
085: ScarabLocalizationTool l10n = getLocalizationTool(context);
086:
087: synchronized (this ) {
088: Integer inttime = new Integer(seconds);
089: Object[] time = { inttime };
090: if (tg == null) {
091: try {
092: tg = new ThreadGroup("UpdateIndex");
093: Thread updateThread = new Thread(tg,
094: new UpdateThread());
095: updateThread.start();
096: context.put("updateFrequency", inttime.toString());
097: scarabR.setConfirmMessage(l10n.format(
098: "SearchIndexDoNoteLeavePage", time));
099: } catch (Exception e) {
100: reset();
101: context.put("updateFrequency", "");
102: scarabR.setAlertMessage(l10n.getMessage(e));
103: }
104: } else if (tg.activeCount() == 0) {
105: reset();
106: context.put("updateFrequency", "");
107: scarabR.setConfirmMessage(l10n
108: .get("SearchIndexUpdated"));
109: } else {
110: if (counter > 5) {
111: seconds = 15;
112: } else if (counter > 10) {
113: seconds = 20;
114: }
115: context.put("updateFrequency", inttime.toString());
116: scarabR.setConfirmMessage(l10n.format(
117: "SearchIndexDoNoteLeavePage", time));
118: counter++;
119: }
120: }
121:
122: String template = getCurrentTemplate(data, null);
123: String nextTemplate = getNextTemplate(data, template);
124: setTarget(data, nextTemplate);
125: }
126:
127: public class UpdateThread implements Runnable {
128: public UpdateThread() {
129: }
130:
131: public void run() {
132: try {
133: Log.get().info("Update index started!");
134: SearchIndex indexer = SearchFactory.getInstance();
135: indexer.updateIndex();
136: Log.get().info("Update index completed!");
137: } catch (Exception e) {
138: Log.get().error("Update index failed:", e);
139: }
140: }
141: }
142: }
|