com.rometools.certiorem.hub.DeltaSyndFeedInfo Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of rome-certiorem Show documentation
Show all versions of rome-certiorem Show documentation
A PubSubHubub implementation for Java based on ROME
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.rometools.certiorem.hub;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.rometools.fetcher.impl.SyndFeedInfo;
import com.rometools.rome.feed.synd.SyndEntry;
import com.rometools.rome.feed.synd.SyndFeed;
/**
* Extends SyndFeedInfo to also track etags for individual entries. This may be used with
* DeltaFeedInfoCache to only return feed with a subset of entries that have changed since last
* fetch.
*
* @author najmi
*/
public class DeltaSyndFeedInfo extends SyndFeedInfo {
/**
*
*/
private static final long serialVersionUID = 1L;
Map entryTagsMap = new HashMap();
Map changedMap = new HashMap();
public DeltaSyndFeedInfo(final SyndFeedInfo backingFeedInfo) {
setETag(backingFeedInfo.getETag());
setId(backingFeedInfo.getId());
setLastModified(backingFeedInfo.getLastModified());
setSyndFeed(backingFeedInfo.getSyndFeed());
}
/**
* Gets a filtered version of the SyndFeed that only has entries that were changed in the last
* setSyndFeed() call.
*
* @return
*/
@Override
public synchronized SyndFeed getSyndFeed() {
try {
final SyndFeed feed = (SyndFeed) super.getSyndFeed().clone();
final List changedEntries = new ArrayList();
final List entries = feed.getEntries();
for (final SyndEntry entry : entries) {
if (changedMap.containsKey(entry.getUri())) {
changedEntries.add(entry);
}
}
feed.setEntries(changedEntries);
return feed;
} catch (final CloneNotSupportedException ex) {
throw new RuntimeException(ex);
}
}
/**
* Overrides super class method to update changedMap and entryTagsMap for tracking changed
* entries.
*
* @param feed
*/
@Override
public final synchronized void setSyndFeed(final SyndFeed feed) {
super.setSyndFeed(feed);
changedMap.clear();
final List entries = feed.getEntries();
for (final SyndEntry entry : entries) {
final String currentEntryTag = computeEntryTag(entry);
final String previousEntryTag = entryTagsMap.get(entry.getUri());
if (previousEntryTag == null || !currentEntryTag.equals(previousEntryTag)) {
// Entry has changed
changedMap.put(entry.getUri(), Boolean.TRUE);
}
entryTagsMap.put(entry.getUri(), currentEntryTag);
}
}
private String computeEntryTag(final SyndEntry entry) {
// Following hash algorithm suggested by Robert Cooper needs to be
// evaluated in future.
// int hash = ( entry.getUri() != null ? entry.getUri().hashCode() :
// entry.getLink().hashCode() ) ^
// (entry.getUpdatedDate() != null ? entry.getUpdatedDate().hashCode() :
// entry.getPublishedDate().hashCode()) ^
// entry.getTitle().hashCode() ^
// entry.getDescription().hashCode();
final String id = entry.getUri();
Date updateDate = entry.getUpdatedDate();
final Date publishedDate = entry.getPublishedDate();
if (updateDate == null) {
if (publishedDate != null) {
updateDate = publishedDate;
} else {
// For misbehaving feeds that do not set updateDate or
// publishedDate we use current tiem which pretty mucg assures
// that it will be viewed as
// changed even when it is not
updateDate = new Date();
}
}
final String key = id + ":" + entry.getUpdatedDate();
return computeDigest(key);
}
private String computeDigest(final String content) {
try {
final MessageDigest md = MessageDigest.getInstance("SHA");
final byte[] digest = md.digest(content.getBytes());
final BigInteger bi = new BigInteger(digest);
return bi.toString(16);
} catch (final Exception e) {
return "";
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy