/* ********************************************************************** **
** Copyright notice **
** **
** (c) 2005-2006 RSSOwl Development Team **
** http://www.rssowl.org/ **
** **
** All rights reserved **
** **
** This program and the accompanying materials are made available under **
** the terms of the Eclipse Public License v1.0 which accompanies this **
** distribution, and is available at: **
** http://www.rssowl.org/legal/epl-v10.html **
** **
** A copy is found in the file epl-v10.html and important notices to the **
** license from the team is found in the textfile LICENSE.txt distributed **
** in this package. **
** **
** This copyright notice MUST APPEAR in all copies of the file! **
** **
** Contributors: **
** RSSOwl Development Team - initial API and implementation **
** **
** ********************************************************************** */
package org.rssowl.core.model.internal.db4o;
import org.rssowl.core.model.dao.PersistenceException;
import org.rssowl.core.model.events.EventsMap;
import org.rssowl.core.model.events.FeedEvent;
import org.rssowl.core.model.events.ModelEvent;
import org.rssowl.core.model.events.NewsEvent;
import org.rssowl.core.model.events.runnable.EventRunnable;
import org.rssowl.core.model.internal.types.Feed;
import org.rssowl.core.model.types.IFeed;
import org.rssowl.core.model.types.INews;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;
import com.db4o.ext.Db4oException;
import com.db4o.query.Query;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class DBHelper {
public static final void cleanUpAndFireEvents() {
List<EventRunnable> eventNotifiers = EventsMap.getInstance().removeEventRunnables();
EventsMap.getInstance().removeEventTemplatesMap();
EventManager.getInstance().clear();
fireEvents(eventNotifiers);
}
public static final void fireEvents(List<EventRunnable> eventNotifiers) {
if (eventNotifiers == null) {
return;
}
for (EventRunnable runnable : eventNotifiers) {
runnable.run();
}
}
static final void putEventTemplate(ModelEvent modelEvent) {
int id = System.identityHashCode(modelEvent.getEntity());
EventsMap.getInstance().putEventTemplate(id, modelEvent);
}
static final void saveFeed(ObjectContainer db, IFeed feed) {
ModelEvent feedEventTemplate = new FeedEvent(feed, true);
DBHelper.putEventTemplate(feedEventTemplate);
List<INews> changedNews = new ArrayList<INews>(feed.getNews().size());
for (INews news : feed.getNews()) {
INews oldNews = db.ext().peekPersisted(news, 2, true);
if (oldNews == null) {
changedNews.add(news);
}
else if (!news.isIdentical(oldNews)) {
ModelEvent newsEventTemplate = new NewsEvent(oldNews, news, false);
DBHelper.putEventTemplate(newsEventTemplate);
changedNews.add(news);
}
}
for (INews news : changedNews) {
db.set(news);
}
db.ext().set(feed, 2);
db.set(feed);
}
static final boolean feedExists(ObjectContainer db, URL link) {
return getFeedSet(db, link).hasNext();
}
@SuppressWarnings("unchecked")
private static ObjectSet<IFeed> getFeedSet(ObjectContainer db, URL link){
Query query = db.query();
query.constrain(Feed.class);
query.descend("fLinkText").constrain(link.toString()); //$NON-NLS-1$
ObjectSet<IFeed> set = query.execute();
return set;
}
static final IFeed loadFeed(ObjectContainer db, URL link, Integer activationDepth) {
try {
ObjectSet<IFeed> set = getFeedSet(db, link);
if (set.hasNext()) {
IFeed feed = set.next();
if (activationDepth != null)
db.ext().activate(feed, activationDepth.intValue());
return feed;
}
return null;
} catch (Db4oException e) {
throw new PersistenceException(e);
}
}
}