001 /*
002 Licensed to the Apache Software Foundation (ASF) under one
003 or more contributor license agreements. See the NOTICE file
004 distributed with this work for additional information
005 regarding copyright ownership. The ASF licenses this file
006 to you under the Apache License, Version 2.0 (the
007 "License"); you may not use this file except in compliance
008 with the License. You may obtain a copy of the License at
009
010 http://www.apache.org/licenses/LICENSE-2.0
011
012 Unless required by applicable law or agreed to in writing,
013 software distributed under the License is distributed on an
014 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 KIND, either express or implied. See the License for the
016 specific language governing permissions and limitations
017 under the License.
018 */
019 package org.apache.wiki.ui.admin.beans;
020
021 import java.util.Collection;
022
023 import javax.management.NotCompliantMBeanException;
024
025 import org.apache.wiki.WikiBackgroundThread;
026 import org.apache.wiki.WikiContext;
027 import org.apache.wiki.WikiEngine;
028 import org.apache.wiki.WikiPage;
029 import org.apache.wiki.search.SearchManager;
030 import org.apache.wiki.ui.admin.SimpleAdminBean;
031 import org.apache.wiki.ui.progress.ProgressItem;
032
033 /**
034 * The SearchManagerBean is a simple AdminBean interface
035 * to the SearchManager. It currently can be used to force
036 * a reload of all of the pages.
037 *
038 * @since 2.6
039 */
040 public class SearchManagerBean extends SimpleAdminBean
041 {
042 private static final String PROGRESS_ID = "searchmanagerbean.reindexer";
043
044 private static final String[] METHODS = { "reload" };
045
046 // private static Logger log = Logger.getLogger( SearchManagerBean.class );
047
048 private WikiBackgroundThread m_updater;
049
050 public SearchManagerBean(WikiEngine engine) throws NotCompliantMBeanException
051 {
052 super();
053 initialize(engine);
054 }
055
056 public String[] getAttributeNames()
057 {
058 return new String[0];
059 }
060
061 public String[] getMethodNames()
062 {
063 return METHODS;
064 }
065
066 public String getTitle()
067 {
068 return "Search manager";
069 }
070
071 /**
072 * Starts a background thread which goes through all the pages and adds them
073 * to the reindex queue.
074 * <p>
075 * This method prevents itself from being called twice.
076 */
077 public synchronized void reload()
078 {
079 if( m_updater == null )
080 {
081 m_updater = new WikiBackgroundThread(m_engine, 0) {
082 int m_count;
083 int m_max;
084
085 public void startupTask() throws Exception
086 {
087 super.startupTask();
088
089 setName("Reindexer started");
090 }
091
092 @SuppressWarnings("unchecked")
093 public void backgroundTask() throws Exception
094 {
095 Collection<WikiPage> allPages = m_engine.getPageManager().getAllPages();
096
097 SearchManager mgr = m_engine.getSearchManager();
098 m_max = allPages.size();
099
100 ProgressItem pi = new ProgressItem() {
101 public int getProgress()
102 {
103 return 100 * m_count / m_max;
104 }
105 };
106
107 m_engine.getProgressManager().startProgress( pi, PROGRESS_ID );
108
109 for( WikiPage page : allPages )
110 {
111 mgr.reindexPage(page);
112 m_count++;
113 }
114
115 m_engine.getProgressManager().stopProgress( PROGRESS_ID );
116 shutdown();
117 m_updater = null;
118 }
119
120 };
121
122 m_updater.start();
123 }
124 }
125
126 public int getType()
127 {
128 return CORE;
129 }
130
131 public String doGet(WikiContext context)
132 {
133 if( m_updater != null )
134 {
135 return "Update already in progress ("+
136 context.getEngine().getProgressManager().getProgress(PROGRESS_ID)+
137 "%)";
138 }
139
140 return "<input type='submit' id='searchmanagerbean-reload' name='searchmanagerbean-reload' value='Force index reload'/>"+
141 "<div class='description'>Forces JSPWiki search engine to reindex all pages. Use this if you think some pages are not being found even if they should.</div>";
142 }
143
144 public String doPost(WikiContext context)
145 {
146 String val = context.getHttpParameter("searchmanagerbean-reload");
147
148 if( val != null )
149 {
150 reload();
151
152 context.getWikiSession().addMessage( "Started reload of all indexed pages..." );
153
154 return "";
155 }
156
157 return doGet(context);
158 }
159
160 }