    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 */
    019package org.apache.wiki.ui.admin.beans;
    020
    021import org.apache.wiki.WikiBackgroundThread;
    022import org.apache.wiki.api.core.Context;
    023import org.apache.wiki.api.core.Engine;
    024import org.apache.wiki.api.core.Page;
    025import org.apache.wiki.pages.PageManager;
    026import org.apache.wiki.search.SearchManager;
    027import org.apache.wiki.ui.admin.SimpleAdminBean;
    028import org.apache.wiki.ui.progress.ProgressItem;
    029import org.apache.wiki.ui.progress.ProgressManager;
    030
    031import javax.management.NotCompliantMBeanException;
    032import java.util.Collection;
    033
    034
    035/**
    036 * The SearchManagerBean is a simple AdminBean interface to the SearchManager.  It currently can be used to force a reload of all of the pages.
    037 *
    038 *  @since 2.6
    039 */
    040public class SearchManagerBean extends SimpleAdminBean {
    041
    042    private static final String PROGRESS_ID = "searchmanagerbean.reindexer";
    043    private static final String[] METHODS = { "reload" };
    044
    045    // private static Logger log = LogManager.getLogger( SearchManagerBean.class );
    046
    047    private WikiBackgroundThread m_updater;
    048
    049    public SearchManagerBean( final Engine engine ) throws NotCompliantMBeanException {
    050        super();
    051        initialize( engine );
    052    }
    053
    054    @Override
    055    public String[] getAttributeNames()
    056    {
    057        return new String[0];
    058    }
    059
    060    @Override
    061    public String[] getMethodNames()
    062    {
    063        return METHODS;
    064    }
    065
    066    @Override
    067    public String getTitle()
    068    {
    069        return "Search manager";
    070    }
    071
    072    /**
    073     *  Starts a background thread which goes through all the pages and adds them to the reindex queue.
    074     *  <p>
    075     *  This method prevents itself from being called twice.
    076     */
    077    public synchronized void reload() {
    078        if( m_updater == null ) {
    079            m_updater = new WikiBackgroundThread( m_engine, 0 ) {
    080
    081                int m_count;
    082                int m_max;
    083
    084                @Override
    085                public void startupTask() throws Exception {
    086                    super.startupTask();
    087
    088                    setName( "Reindexer started" );
    089                }
    090
    091                @Override
    092                public void backgroundTask() throws Exception {
    093                    final Collection< Page > allPages = m_engine.getManager( PageManager.class ).getAllPages();
    094
    095                    final SearchManager mgr = m_engine.getManager( SearchManager.class );
    096                    m_max = allPages.size();
    097
    098                    final ProgressItem pi = new ProgressItem() {
    099
    100                        @Override
    101                        public int getProgress() {
    102                            return 100 * m_count / m_max;
    103                        }
    104                    };
    105                    m_engine.getManager( ProgressManager.class ).startProgress( pi, PROGRESS_ID );
    106
    107                    for( final Page page : allPages ) {
    108                        mgr.reindexPage( page );
    109                        m_count++;
    110                    }
    111
    112                    m_engine.getManager( ProgressManager.class ).stopProgress( PROGRESS_ID );
    113                    shutdown();
    114                    m_updater = null;
    115                }
    116
    117            };
    118
    119            m_updater.start();
    120        }
    121    }
    122
    123    @Override
    124    public int getType() {
    125        return CORE;
    126    }
    127
    128    @Override
    129    public String doGet( final Context context ) {
    130        if( m_updater != null ) {
    131            return "Update already in progress ("+ context.getEngine().getManager( ProgressManager.class ).getProgress(PROGRESS_ID)+ "%)";
    132        }
    133
    134        return "<input type='submit' id='searchmanagerbean-reload' name='searchmanagerbean-reload' value='Force index reload'/>"+
    135               "<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>";
    136    }
    137
    138    @Override
    139    public String doPost( final Context context ) {
    140        final String val = context.getHttpParameter( "searchmanagerbean-reload" );
    141        if( val != null ) {
    142            reload();
    143            context.getWikiSession().addMessage( "Started reload of all indexed pages..." );
    144            return "";
    145        }
    146
    147        return doGet( context );
    148    }
    149
    150}