// 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: MDRepository.java,v 1.7 2006/03/16 15:32:46 spyromus Exp $
//
package com.salas.bb.discovery;
import com.salas.bb.domain.FeedMetaDataHolder;
import java.net.URL;
import java.util.*;
/**
* Repository of discovered meta-data information. Plays role of run-time
* cache.
*/
final class MDRepository
{
private final Map repository;
/**
* Creates repository.
*/
public MDRepository()
{
repository = new HashMap();
}
/**
* Returns meta-data for a given URL.
*
* @param url URL.
*
* @return meta-data object.
*/
public FeedMetaDataHolder lookup(URL url)
{
FeedMetaDataHolder holder = null;
if (url != null)
{
String urlString = url.toString();
synchronized (repository)
{
holder = (FeedMetaDataHolder)repository.get(urlString);
}
}
return holder;
}
/**
* Returns all valid meta-data objects which are currently in repository.
*
* @return all valid meta-data objects.
*/
public FeedMetaDataHolder[] lookupValid()
{
FeedMetaDataHolder[] holders;
synchronized (repository)
{
Collection holdersCol = repository.values();
holders = (FeedMetaDataHolder[])holdersCol.toArray(
new FeedMetaDataHolder[holdersCol.size()]);
}
List holdersList = new ArrayList(holders.length);
for (int i = 0; i < holders.length; i++)
{
FeedMetaDataHolder holder = holders[i];
if (holder.isComplete() && holder.isDiscoveredValid() && !holdersList.contains(holder))
{
holdersList.add(holder);
}
}
return (FeedMetaDataHolder[])holdersList.toArray(
new FeedMetaDataHolder[holdersList.size()]);
}
/**
* Records the holder in repository.
*
* @param holder holder to record.
* @param url URL to associate with.
*/
public void record(FeedMetaDataHolder holder, URL url)
{
String urlString = url.toString();
synchronized (repository)
{
if (!repository.containsKey(urlString))
{
repository.put(urlString, holder);
}
}
}
/**
* Orders the repository to forget anything about given holders.
*
* @param aHolders hoders to forget.
*/
public void forget(FeedMetaDataHolder[] aHolders)
{
List holdersList = Arrays.asList(aHolders);
Map.Entry[] entries;
synchronized (repository)
{
Set entriesSet = repository.entrySet();
entries = (Map.Entry[])entriesSet.toArray(new Map.Entry[entriesSet.size()]);
}
List keysToRemove = new ArrayList();
for (int i = 0; i < entries.length; i++)
{
Map.Entry entry = entries[i];
FeedMetaDataHolder holder = (FeedMetaDataHolder)entry.getValue();
if (holdersList.contains(holder)) keysToRemove.add(entry.getKey());
}
Iterator iterator = keysToRemove.iterator();
synchronized (repository)
{
while (iterator.hasNext())
{
Object key = iterator.next();
repository.remove(key);
}
}
}
}