// 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 $ // package com.salas.bb.core; import com.salas.bb.domain.IFeed; import com.salas.bb.domain.IGuide; import com.salas.bb.domain.StandardGuide; import com.salas.bb.domain.ReadingList; import com.salas.bb.domain.utils.DomainAdapter; import com.salas.bb.persistence.IPersistenceManager; import com.salas.bb.persistence.PersistenceException; import java.util.logging.Level; import java.util.logging.Logger; /** * Records all deleted feeds and reading lists and manipulates these records. */ public class DeletedObjectsRepository extends DomainAdapter { private static final Logger LOG = Logger.getLogger(DeletedObjectsRepository.class.getName()); private static final String MSG_FAILED_QUERY = "Failed to query for deleted object record presence."; private static final String FAILED_PURGE = "Failed to purge deleted object records."; private static final String FAILED_ADD = "Failed to delete deleted object record."; private static final String FAILED_REMOVE = "Failed to add deleted object record."; private final IPersistenceManager pm; /** * Creates repository. * * @param pm persistence manager. */ public DeletedObjectsRepository(IPersistenceManager pm) { this.pm = pm; } /** * Returns <code>TRUE</code> if a object was deleted. * * @param guideTitle guide title. * @param objectKey object match key. * * @return <code>TRUE</code> if a object was deleted. */ public boolean wasDeleted(String guideTitle, String objectKey) { boolean deleted = false; try { deleted = pm.isDeletedObjectRecordPresent(guideTitle, objectKey); } catch (PersistenceException e) { LOG.log(Level.SEVERE, MSG_FAILED_QUERY, e); } return deleted; } /** * Removes all known records about deleted items. */ public void purge() { try { pm.purgeDeletedObjectRecords(); } catch (PersistenceException e) { LOG.log(Level.SEVERE, FAILED_PURGE, e); } } // -------------------------------------------------------------------------------------------- // Domain Events // -------------------------------------------------------------------------------------------- /** * Invoked when the feed has been removed directly from the feed. It has nothing to do with the * visual representation of the guide because this feed can still be visible in the guide * because of its presence in one or more associated reading lists. This even simply means that * there's no direct connection between the guide and the feed. * * @param guide guide. * @param feed removed feed. */ public void feedLinkRemoved(IGuide guide, IFeed feed) { String guideTitle = guide.getTitle(); addDeletedObjectRecord(guideTitle, feed.getMatchKey()); } /** * Invoked after reading list is removed from the guide. * * @param guide source guide. * @param list reading list removed. */ public void readingListRemoved(IGuide guide, ReadingList list) { String guideTitle = guide.getTitle(); addDeletedObjectRecord(guideTitle, list.getURL().toString()); } /** * Invoked when new feed has been added directly to this guide (not through the Reading List). * In fact, it doesn't mean that the feed should appear in the guide if it's already there. This * event will be followed by <code>feedAdded</code> event if this is the first addition of this * feed (not visible yet) and will not, if the feed is already in the list. * * @param guide parent guide. * @param feed added feed. */ public void feedLinkAdded(IGuide guide, IFeed feed) { String guideTitle = guide.getTitle(); removeDeletedObjectRecord(guideTitle, feed.getMatchKey()); } /** * Invoked after new reading list is added to the guide. * * @param guide source guide. * @param list reading list added. */ public void readingListAdded(IGuide guide, ReadingList list) { String guideTitle = guide.getTitle(); removeDeletedObjectRecord(guideTitle, list.getURL().toString()); } /** * Invoked when the property of the guide has been changed. * * @param guide guide owning the property. * @param property property name. * @param oldValue old property value. * @param newValue new property value. */ public void propertyChanged(IGuide guide, String property, Object oldValue, Object newValue) { if (IGuide.PROP_TITLE.equals(property)) { // When the guide title changes all of the feeds and rl's it had can be marked as deleted // and all the feeds and rl's in the guide with a new name -- undeleted String oldGuideTitle = (String)oldValue; String newGuideTitle = (String)newValue; IFeed[] feeds = guide.getFeeds(); for (int i = 0; i < feeds.length; i++) { IFeed feed = feeds[i]; String feedKey = feed.getMatchKey(); addDeletedObjectRecord(oldGuideTitle, feedKey); removeDeletedObjectRecord(newGuideTitle, feedKey); } if (guide instanceof StandardGuide) { ReadingList[] rls = ((StandardGuide)guide).getReadingLists(); for (int i = 0; i < rls.length; i++) { ReadingList rl = rls[i]; String rlKey = rl.getURL().toString(); addDeletedObjectRecord(oldGuideTitle, rlKey); removeDeletedObjectRecord(newGuideTitle, rlKey); } } } } /** * Add an deleted object record. * * @param guideTitle guide title. * @param key key. */ private void addDeletedObjectRecord(String guideTitle, String key) { try { pm.addDeletedObjectRecord(guideTitle, key); } catch (PersistenceException e) { LOG.log(Level.SEVERE, FAILED_ADD, e); } } /** * Remove deleted object record. * * @param guideTitle guide title. * @param key key. */ private void removeDeletedObjectRecord(String guideTitle, String key) { try { pm.removeDeletedObjectRecord(guideTitle, key); } catch (PersistenceException e) { LOG.log(Level.SEVERE, FAILED_REMOVE, e); } } }