Package com.salas.bb.discovery

Source Code of com.salas.bb.discovery.MDUpdater$ServiceAccessibilityListener

// BlogBridge -- RSS feed reader, manager, and web based service
// Copyright (C) 2002-2006 by R. Pito Salas
//
// This program is free software; you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free Software Foundation;
// either version 2 of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with this program;
// if not, write to the Free Software Foundation, Inc., 59 Temple Place,
// Suite 330, Boston, MA 02111-1307 USA
//
// Contact: R. Pito Salas
// mailto:pitosalas@users.sourceforge.net
// More information: about BlogBridge
// http://www.blogbridge.com
// http://sourceforge.net/projects/blogbridge
//
// $Id: MDUpdater.java,v 1.7 2007/04/10 10:33:44 spyromus Exp $
//

package com.salas.bb.discovery;

import com.salas.bb.domain.DirectFeed;
import com.salas.bb.domain.FeedMetaDataHolder;
import com.salas.bb.domain.GuidesSet;
import com.salas.bb.domain.IFeed;
import com.salas.bb.domain.prefs.UserPreferences;
import com.salas.bb.utils.ConnectionState;
import com.salas.bb.utils.i18n.Strings;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.net.URL;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
* Updater is a background task which is walking through the list of subscriptions
* and updates their meta-data.
*/
public final class MDUpdater implements Runnable
{
    private static final Logger LOG = Logger.getLogger(MDUpdater.class.getName());

    // Meta-data update period (min)
    private static long updatePeriod = UserPreferences.DEFAULT_WEBSTAT_MINS * 60 * 1000;

    private final MDManager metaDataManager;
    private final ConnectionState connectionState;

    private GuidesSet       guidesSet;

    /** Armed into <code>TRUE</code> state when meta-data even happened during being offline. */
    private boolean skippedUpdateDuringOffline;

    /**
     * Creates updater which is talking to meta-data manager.
     *
     * @param aMetaDataManager  meta-data manager to talk to.
     * @param aConnectionState  connection state interface.
     */
    public MDUpdater(MDManager aMetaDataManager, ConnectionState aConnectionState)
    {
        metaDataManager = aMetaDataManager;
        connectionState = aConnectionState;
        guidesSet = null;

        skippedUpdateDuringOffline = false;
        aConnectionState.addPropertyChangeListener(ConnectionState.PROP_SERVICE_ACCESSIBLE,
            new ServiceAccessibilityListener());
    }

    /**
     * Sets new guides set to use.
     *
     * @param aGuidesSet guides set.
     */
    public synchronized void setGuidesSet(GuidesSet aGuidesSet)
    {
        guidesSet = aGuidesSet;
    }

    /**
     * Invoked when someone wishes to execute this runnable task.
     */
    public void run()
    {
        try
        {
            if (connectionState.isServiceAccessible())
            {
                update();
            } else
            {
                skippedUpdateDuringOffline = true;
            }
        } catch (RuntimeException e)
        {
            LOG.log(Level.SEVERE, Strings.error("unhandled.exception"), e);
        }
    }

    /**
     * This operation scans the guides set for all direct feeds with outdated meta-data
     * information and asks {@link #metaDataManager} to update them.
     */
    public void update()
    {
        List<IFeed> feeds;

        synchronized (this)
        {
            feeds = guidesSet == null ? null : guidesSet.getFeeds();
        }

        if (feeds != null)
        {
            long updateTimeThreshold = System.currentTimeMillis() - getUpdatePeriod();
            for (IFeed feed : feeds)
            {
                if (feed instanceof DirectFeed)
                {
                    update((DirectFeed)feed, updateTimeThreshold);
                }
            }
        }
    }

    /**
     * Returns currently set update period.
     *
     * @return update period in milliseconds.
     */
    private static long getUpdatePeriod()
    {
        return updatePeriod;
    }

    /**
     * Sets new update period.
     *
     * @param aUpdatePeriod update period in milliseconds.
     */
    public static void setUpdatePeriod(long aUpdatePeriod)
    {
        updatePeriod = aUpdatePeriod;
    }

    /**
     * Updates given feed if necessary.
     *
     * @param aFeed                 feed to check and update.
     * @param updateTimeThreshold   maximum last update time. If feed has update time
     *                              older than this one it will be updated.
     */
    private void update(DirectFeed aFeed, long updateTimeThreshold)
    {
        long lastUpdate = aFeed.getLastMetaDataUpdateTime();
        if (lastUpdate < updateTimeThreshold)
        {
            URL baseURL = getBaseURL(aFeed);
            FeedMetaDataHolder holder = aFeed.getMetaDataHolder();
            if (baseURL != null && holder != null)
            {
                if (LOG.isLoggable(Level.FINE)) LOG.fine("Updating meta-data of " + aFeed);
                metaDataManager.update(holder, baseURL);
            }
        }
    }

    /**
     * Finds base URL for further updating activity. It's preferrable to have
     * XML URL, then site URL.
     *
     * @param aFeed feed to evaluate base URL from.
     *
     * @return base URL or <code>NULL</code> if not possible get one.
     */
    private URL getBaseURL(DirectFeed aFeed)
    {
        URL baseURL = aFeed.getXmlURL();
        if (baseURL == null) baseURL = aFeed.getSiteURL();

        return baseURL;
    }

    /** Listens to the updates in service accessibility. */
    private class ServiceAccessibilityListener implements PropertyChangeListener
    {
        /**
         * Called when service accessibility changes.
         *
         * @param evt property change event.
         */
        public void propertyChange(PropertyChangeEvent evt)
        {
            if (skippedUpdateDuringOffline && connectionState.isServiceAccessible()) run();
        }
    }
}
TOP

Related Classes of com.salas.bb.discovery.MDUpdater$ServiceAccessibilityListener

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.