diff --git a/cleanup.xml b/cleanup.xml
new file mode 100644
index 0000000..40f9b7a
--- /dev/null
+++ b/cleanup.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/formatter.xml b/formatter.xml
new file mode 100644
index 0000000..e7ba7aa
--- /dev/null
+++ b/formatter.xml
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/org/rometools/certiorem/HttpStatusCodeException.java b/src/main/java/org/rometools/certiorem/HttpStatusCodeException.java
index 1bdeb0f..d1ff1b0 100644
--- a/src/main/java/org/rometools/certiorem/HttpStatusCodeException.java
+++ b/src/main/java/org/rometools/certiorem/HttpStatusCodeException.java
@@ -16,24 +16,23 @@
* limitations under the License.
*/
-
package org.rometools.certiorem;
/**
- *
+ *
* @author robert.cooper
*/
public class HttpStatusCodeException extends RuntimeException {
private final int status;
- public HttpStatusCodeException(int status, String message, Throwable cause){
+ public HttpStatusCodeException(final int status, final String message, final Throwable cause) {
super(message, cause);
this.status = status;
}
- public int getStatus(){
- return this.status;
+ public int getStatus() {
+ return status;
}
}
diff --git a/src/main/java/org/rometools/certiorem/hub/DeltaFeedInfoCache.java b/src/main/java/org/rometools/certiorem/hub/DeltaFeedInfoCache.java
index a0702f3..edf0c02 100644
--- a/src/main/java/org/rometools/certiorem/hub/DeltaFeedInfoCache.java
+++ b/src/main/java/org/rometools/certiorem/hub/DeltaFeedInfoCache.java
@@ -5,33 +5,32 @@
package org.rometools.certiorem.hub;
import java.net.URL;
+
import org.rometools.fetcher.impl.FeedFetcherCache;
import org.rometools.fetcher.impl.SyndFeedInfo;
/**
- * Wrapper FeedFetcherCache that wraps a backing FeedFetcherCache and makes sure that
- * any SyndFeedInfo used within it are replaced with a DeltaSyndFeedInfo which is capable of
- * tracking changes to entries in the underlying feed.
+ * Wrapper FeedFetcherCache that wraps a backing FeedFetcherCache and makes sure that any SyndFeedInfo used within it are replaced with a DeltaSyndFeedInfo
+ * which is capable of tracking changes to entries in the underlying feed.
*
* @author najmi
*/
public class DeltaFeedInfoCache implements FeedFetcherCache {
-
+
FeedFetcherCache backingCache;
-
-
- public DeltaFeedInfoCache(FeedFetcherCache backingCache) {
+
+ public DeltaFeedInfoCache(final FeedFetcherCache backingCache) {
this.backingCache = backingCache;
}
@Override
- public SyndFeedInfo getFeedInfo(URL feedUrl) {
+ public SyndFeedInfo getFeedInfo(final URL feedUrl) {
return backingCache.getFeedInfo(feedUrl);
}
@Override
- public void setFeedInfo(URL feedUrl, SyndFeedInfo syndFeedInfo) {
- //Make sure that syndFeedInfo is an instance of DeltaSyndFeedInfo
+ public void setFeedInfo(final URL feedUrl, SyndFeedInfo syndFeedInfo) {
+ // Make sure that syndFeedInfo is an instance of DeltaSyndFeedInfo
if (!(syndFeedInfo instanceof DeltaSyndFeedInfo)) {
syndFeedInfo = new DeltaSyndFeedInfo(syndFeedInfo);
}
@@ -40,12 +39,12 @@ public class DeltaFeedInfoCache implements FeedFetcherCache {
@Override
public void clear() {
- backingCache.clear();
+ backingCache.clear();
}
@Override
- public SyndFeedInfo remove(URL feedUrl) {
+ public SyndFeedInfo remove(final URL feedUrl) {
return backingCache.remove(feedUrl);
}
-
+
}
diff --git a/src/main/java/org/rometools/certiorem/hub/DeltaSyndFeedInfo.java b/src/main/java/org/rometools/certiorem/hub/DeltaSyndFeedInfo.java
index 0bb13c5..ed9284e 100644
--- a/src/main/java/org/rometools/certiorem/hub/DeltaSyndFeedInfo.java
+++ b/src/main/java/org/rometools/certiorem/hub/DeltaSyndFeedInfo.java
@@ -4,8 +4,6 @@
*/
package org.rometools.certiorem.hub;
-import com.sun.syndication.feed.synd.SyndEntry;
-import com.sun.syndication.feed.synd.SyndFeed;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.util.ArrayList;
@@ -13,51 +11,55 @@ import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+
import org.rometools.fetcher.impl.SyndFeedInfo;
+import com.sun.syndication.feed.synd.SyndEntry;
+import com.sun.syndication.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.
+ * 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 {
+public class DeltaSyndFeedInfo extends SyndFeedInfo {
Map entryTagsMap = new HashMap();
Map changedMap = new HashMap();
-
- private DeltaSyndFeedInfo() {
+
+ private DeltaSyndFeedInfo() {
}
-
- public DeltaSyndFeedInfo(SyndFeedInfo backingFeedInfo) {
- this.setETag(backingFeedInfo.getETag());
- this.setId(backingFeedInfo.getId());
- this.setLastModified(backingFeedInfo.getLastModified());
- this.setSyndFeed(backingFeedInfo.getSyndFeed());
+
+ 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
+ * @return
*/
@Override
public synchronized SyndFeed getSyndFeed() {
try {
- SyndFeed feed = (SyndFeed) super.getSyndFeed().clone();
-
- List changedEntries = new ArrayList();
-
- List entries = feed.getEntries();
- for (SyndEntry entry : entries) {
+ 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);
+ changedEntries.add(entry);
}
}
-
+
feed.setEntries(changedEntries);
-
+
return feed;
- } catch (CloneNotSupportedException ex) {
+ } catch (final CloneNotSupportedException ex) {
throw new RuntimeException(ex);
}
}
@@ -65,58 +67,58 @@ public class DeltaSyndFeedInfo extends SyndFeedInfo {
/**
* Overrides super class method to update changedMap and entryTagsMap for tracking changed entries.
*
- * @param feed
+ * @param feed
*/
@Override
- public final synchronized void setSyndFeed(SyndFeed feed) {
+ public final synchronized void setSyndFeed(final SyndFeed feed) {
super.setSyndFeed(feed);
-
- changedMap.clear();
- List entries = feed.getEntries();
- for (SyndEntry entry : entries) {
- String currentEntryTag = computeEntryTag(entry);
- String previousEntryTag = entryTagsMap.get(entry.getUri());
- if ((previousEntryTag == null) || (!(currentEntryTag.equals(previousEntryTag)))) {
- //Entry has changed
+ 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(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();
+ private String computeEntryTag(final SyndEntry entry) {
-
- String id = entry.getUri();
+ // 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();
- Date publishedDate = entry.getPublishedDate();
+ 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
+ } 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();
}
}
- String key = id + ":" + entry.getUpdatedDate();
- return computeDigest(key);
+ final String key = id + ":" + entry.getUpdatedDate();
+ return computeDigest(key);
}
-
- private String computeDigest(String content) {
+
+ private String computeDigest(final String content) {
try {
- MessageDigest md = MessageDigest.getInstance("SHA");
- byte[] digest = md.digest(content.getBytes());
- BigInteger bi = new BigInteger(digest);
+ final MessageDigest md = MessageDigest.getInstance("SHA");
+ final byte[] digest = md.digest(content.getBytes());
+ final BigInteger bi = new BigInteger(digest);
return bi.toString(16);
- } catch (Exception e) {
+ } catch (final Exception e) {
return "";
}
- }
+ }
}
diff --git a/src/main/java/org/rometools/certiorem/hub/Hub.java b/src/main/java/org/rometools/certiorem/hub/Hub.java
index 480359b..da5b446 100644
--- a/src/main/java/org/rometools/certiorem/hub/Hub.java
+++ b/src/main/java/org/rometools/certiorem/hub/Hub.java
@@ -18,21 +18,9 @@
package org.rometools.certiorem.hub;
-import com.sun.syndication.feed.synd.SyndFeed;
-
-import org.rometools.certiorem.HttpStatusCodeException;
-import org.rometools.certiorem.hub.Notifier.SubscriptionSummaryCallback;
-import org.rometools.certiorem.hub.Verifier.VerificationCallback;
-import org.rometools.certiorem.hub.data.HubDAO;
-import org.rometools.certiorem.hub.data.Subscriber;
-import org.rometools.certiorem.hub.data.SubscriptionSummary;
-
-import org.rometools.fetcher.FeedFetcher;
-
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
-
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
@@ -40,12 +28,20 @@ import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
+import org.rometools.certiorem.HttpStatusCodeException;
+import org.rometools.certiorem.hub.Notifier.SubscriptionSummaryCallback;
+import org.rometools.certiorem.hub.Verifier.VerificationCallback;
+import org.rometools.certiorem.hub.data.HubDAO;
+import org.rometools.certiorem.hub.data.Subscriber;
+import org.rometools.certiorem.hub.data.SubscriptionSummary;
+import org.rometools.fetcher.FeedFetcher;
+
+import com.sun.syndication.feed.synd.SyndFeed;
/**
- * The basic business logic controller for the Hub implementation. It is intended
- * to be usable under a very thin servlet wrapper, or other, non-HTTP notification
- * methods you might want to use.
- *
+ * The basic business logic controller for the Hub implementation. It is intended to be usable under a very thin servlet wrapper, or other, non-HTTP
+ * notification methods you might want to use.
+ *
* @author robert.cooper
*/
public class Hub {
@@ -66,6 +62,7 @@ public class Hub {
/**
* Constructs a new Hub instance
+ *
* @param dao The persistence HubDAO to use
* @param verifier The verification strategy to use.
*/
@@ -74,122 +71,111 @@ public class Hub {
this.verifier = verifier;
this.notifier = notifier;
this.fetcher = fetcher;
- this.validSchemes = STANDARD_SCHEMES;
- this.validPorts = Collections.EMPTY_SET;
- this.validTopics = Collections.EMPTY_SET;
+ validSchemes = STANDARD_SCHEMES;
+ validPorts = Collections.EMPTY_SET;
+ validTopics = Collections.EMPTY_SET;
}
/**
* Constructs a new Hub instance.
+ *
* @param dao The persistence HubDAO to use
* @param verifier The verification strategy to use
* @param validSchemes A list of valid URI schemes for callbacks (default: http, https)
* @param validPorts A list of valid port numbers for callbacks (default: any)
* @param validTopics A set of valid topic URIs which can be subscribed to (default: any)
*/
- public Hub(final HubDAO dao, final Verifier verifier, final Notifier notifier, final FeedFetcher fetcher,
- final Set validSchemes, final Set validPorts, final Set validTopics) {
+ public Hub(final HubDAO dao, final Verifier verifier, final Notifier notifier, final FeedFetcher fetcher, final Set validSchemes,
+ final Set validPorts, final Set validTopics) {
this.dao = dao;
this.verifier = verifier;
this.notifier = notifier;
this.fetcher = fetcher;
- Set readOnlySchemes = Collections.unmodifiableSet(validSchemes);
- this.validSchemes = (readOnlySchemes == null) ? STANDARD_SCHEMES : readOnlySchemes;
+ final Set readOnlySchemes = Collections.unmodifiableSet(validSchemes);
+ this.validSchemes = readOnlySchemes == null ? STANDARD_SCHEMES : readOnlySchemes;
- Set readOnlyPorts = Collections.unmodifiableSet(validPorts);
- this.validPorts = (readOnlyPorts == null) ? Collections.EMPTY_SET : readOnlyPorts;
+ final Set readOnlyPorts = Collections.unmodifiableSet(validPorts);
+ this.validPorts = readOnlyPorts == null ? Collections.EMPTY_SET : readOnlyPorts;
- Set readOnlyTopics = Collections.unmodifiableSet(validTopics);
- this.validTopics = (readOnlyTopics == null) ? Collections.EMPTY_SET : readOnlyTopics;
+ final Set readOnlyTopics = Collections.unmodifiableSet(validTopics);
+ this.validTopics = readOnlyTopics == null ? Collections.EMPTY_SET : readOnlyTopics;
}
/**
* Sends a notification to the subscribers
+ *
* @param requestHost the host name the hub is running on. (Used for the user agent)
* @param topic the URL of the topic that was updated.
* @throws HttpStatusCodeException a wrapper exception with a recommended status code for the request.
*/
- public void sendNotification(String requestHost, final String topic) {
- assert this.validTopics.isEmpty() || this.validTopics.contains(topic) : "That topic is not supported by this hub. " +
- topic;
+ public void sendNotification(final String requestHost, final String topic) {
+ assert validTopics.isEmpty() || validTopics.contains(topic) : "That topic is not supported by this hub. " + topic;
Logger.getLogger(Hub.class.getName()).log(Level.FINE, "Sending notification for {0}", topic);
try {
- List subscribers = dao.subscribersForTopic(topic);
+ final List extends Subscriber> subscribers = dao.subscribersForTopic(topic);
if (subscribers.isEmpty()) {
Logger.getLogger(Hub.class.getName()).log(Level.FINE, "No subscribers to notify for {0}", topic);
return;
}
- List summaries = (List) dao.summariesForTopic(topic);
+ final List summaries = (List) dao.summariesForTopic(topic);
int total = 0;
- StringBuilder hosts = new StringBuilder();
+ final StringBuilder hosts = new StringBuilder();
- for (SubscriptionSummary s : summaries) {
+ for (final SubscriptionSummary s : summaries) {
if (s.getSubscribers() > 0) {
total += s.getSubscribers();
- hosts.append(" (")
- .append(s.getHost())
- .append("; ")
- .append(s.getSubscribers())
- .append(" subscribers)");
+ hosts.append(" (").append(s.getHost()).append("; ").append(s.getSubscribers()).append(" subscribers)");
}
}
- StringBuilder userAgent = new StringBuilder("ROME-Certiorem (+http://").append(requestHost)
- .append("; ")
- .append(total)
- .append(" subscribers)")
- .append(hosts);
- SyndFeed feed = fetcher.retrieveFeed(userAgent.toString(), new URL(topic));
- Logger.getLogger(Hub.class.getName()).log(Level.FINE, "Got feed for {0} Sending to {1} subscribers.", new Object[]{topic, subscribers.size()});
- this.notifier.notifySubscribers((List) subscribers, feed,
- new SubscriptionSummaryCallback() {
- @Override
- public void onSummaryInfo(SubscriptionSummary summary) {
- dao.handleSummary(topic, summary);
- }
- });
- } catch (Exception ex) {
- Logger.getLogger(Hub.class.getName())
- .log(Level.SEVERE, "Exception getting " + topic, ex);
+ final StringBuilder userAgent = new StringBuilder("ROME-Certiorem (+http://").append(requestHost).append("; ").append(total)
+ .append(" subscribers)").append(hosts);
+ final SyndFeed feed = fetcher.retrieveFeed(userAgent.toString(), new URL(topic));
+ Logger.getLogger(Hub.class.getName()).log(Level.FINE, "Got feed for {0} Sending to {1} subscribers.", new Object[] { topic, subscribers.size() });
+ notifier.notifySubscribers((List) subscribers, feed, new SubscriptionSummaryCallback() {
+ @Override
+ public void onSummaryInfo(final SubscriptionSummary summary) {
+ dao.handleSummary(topic, summary);
+ }
+ });
+ } catch (final Exception ex) {
+ Logger.getLogger(Hub.class.getName()).log(Level.SEVERE, "Exception getting " + topic, ex);
throw new HttpStatusCodeException(500, ex.getMessage(), ex);
}
}
/**
* Subscribes to a topic.
+ *
* @param callback Callback URI
* @param topic Topic URI
* @param verify Verification Type
* @param lease_seconds Duration of the lease
* @param secret Secret value
* @param verify_token verify_token;
- * @return Boolean.TRUE if the subscription succeeded synchronously,
- * Boolean.FALSE if the subscription failed synchronously, or null if the request is asynchronous.
+ * @return Boolean.TRUE if the subscription succeeded synchronously, Boolean.FALSE if the subscription failed synchronously, or null if the request is
+ * asynchronous.
* @throws HttpStatusCodeException a wrapper exception with a recommended status code for the request.
*/
- public Boolean subscribe(String callback, String topic, String verify, long lease_seconds, String secret,
- String verify_token) {
- Logger.getLogger(Hub.class.getName()).log(Level.FINE, "{0} wants to subscribe to {1}", new Object[]{callback, topic});
+ public Boolean subscribe(final String callback, final String topic, final String verify, final long lease_seconds, final String secret,
+ final String verify_token) {
+ Logger.getLogger(Hub.class.getName()).log(Level.FINE, "{0} wants to subscribe to {1}", new Object[] { callback, topic });
try {
try {
assert callback != null : "Callback URL is required.";
assert topic != null : "Topic URL is required.";
- URI uri = new URI(callback);
- assert this.validSchemes.contains(uri.getScheme()) : "Not a valid protocol " + uri.getScheme();
- assert this.validPorts.isEmpty() || this.validPorts.contains(uri.getPort()) : "Not a valid port " +
- uri.getPort();
- assert this.validTopics.isEmpty() || this.validTopics.contains(topic) : "Not a supported topic " +
- topic;
- } catch (URISyntaxException ex) {
+ final URI uri = new URI(callback);
+ assert validSchemes.contains(uri.getScheme()) : "Not a valid protocol " + uri.getScheme();
+ assert validPorts.isEmpty() || validPorts.contains(uri.getPort()) : "Not a valid port " + uri.getPort();
+ assert validTopics.isEmpty() || validTopics.contains(topic) : "Not a supported topic " + topic;
+ } catch (final URISyntaxException ex) {
assert false : "Not a valid URI " + callback;
}
- assert (verify != null) &&
- (verify.equals(Subscriber.VERIFY_ASYNC) || verify.equals(Subscriber.VERIFY_SYNC)) : "Unexpected verify value " +
- verify;
+ assert verify != null && (verify.equals(Subscriber.VERIFY_ASYNC) || verify.equals(Subscriber.VERIFY_SYNC)) : "Unexpected verify value " + verify;
final Subscriber subscriber = new Subscriber();
subscriber.setCallback(callback);
@@ -199,18 +185,19 @@ public class Hub {
subscriber.setVerify(verify);
subscriber.setVertifyToken(verify_token);
- VerificationCallback verified = new VerificationCallback() {
- @Override
- public void onVerify(boolean verified) {
- if (verified) {
- Logger.getLogger(Hub.class.getName()).log(Level.FINE, "Verified {0} subscribed to {1}", new Object[]{subscriber.getCallback(), subscriber.getTopic()});
- dao.addSubscriber(subscriber);
- }
+ final VerificationCallback verified = new VerificationCallback() {
+ @Override
+ public void onVerify(final boolean verified) {
+ if (verified) {
+ Logger.getLogger(Hub.class.getName()).log(Level.FINE, "Verified {0} subscribed to {1}",
+ new Object[] { subscriber.getCallback(), subscriber.getTopic() });
+ dao.addSubscriber(subscriber);
}
- };
+ }
+ };
if (Subscriber.VERIFY_SYNC.equals(subscriber.getVerify())) {
- boolean result = verifier.verifySubcribeSyncronously(subscriber);
+ final boolean result = verifier.verifySubcribeSyncronously(subscriber);
verified.onVerify(result);
return result;
@@ -219,33 +206,34 @@ public class Hub {
return null;
}
- } catch (AssertionError ae) {
+ } catch (final AssertionError ae) {
throw new HttpStatusCodeException(400, ae.getMessage(), ae);
- } catch (Exception e) {
+ } catch (final Exception e) {
throw new HttpStatusCodeException(500, e.getMessage(), e);
}
}
- public Boolean unsubscribe(final String callback, final String topic, String verify, String secret, String verifyToken) {
+ public Boolean unsubscribe(final String callback, final String topic, final String verify, final String secret, final String verifyToken) {
final Subscriber subscriber = dao.findSubscriber(topic, callback);
- if(subscriber == null){
+ if (subscriber == null) {
throw new HttpStatusCodeException(400, "Not a valid subscription.", null);
}
subscriber.setVertifyToken(verifyToken);
subscriber.setSecret(secret);
- if(Subscriber.VERIFY_SYNC.equals(verify)){
+ if (Subscriber.VERIFY_SYNC.equals(verify)) {
- boolean ret = verifier.verifyUnsubcribeSyncronously(subscriber);
- if(ret){
+ final boolean ret = verifier.verifyUnsubcribeSyncronously(subscriber);
+ if (ret) {
dao.removeSubscriber(topic, callback);
}
} else {
- verifier.verifyUnsubscribeAsyncronously(subscriber, new VerificationCallback(){
+ verifier.verifyUnsubscribeAsyncronously(subscriber, new VerificationCallback() {
@Override
- public void onVerify(boolean verified) {
- Logger.getLogger(Hub.class.getName()).log(Level.FINE, "Unsubscribe for {0} at {1} verified {2}", new Object[]{subscriber.getTopic(), subscriber.getCallback(), verified});
- if(verified){
+ public void onVerify(final boolean verified) {
+ Logger.getLogger(Hub.class.getName()).log(Level.FINE, "Unsubscribe for {0} at {1} verified {2}",
+ new Object[] { subscriber.getTopic(), subscriber.getCallback(), verified });
+ if (verified) {
dao.removeSubscriber(topic, callback);
}
}
diff --git a/src/main/java/org/rometools/certiorem/hub/Notifier.java b/src/main/java/org/rometools/certiorem/hub/Notifier.java
index cebd93f..dfc01fb 100644
--- a/src/main/java/org/rometools/certiorem/hub/Notifier.java
+++ b/src/main/java/org/rometools/certiorem/hub/Notifier.java
@@ -18,22 +18,21 @@
package org.rometools.certiorem.hub;
-import com.sun.syndication.feed.synd.SyndFeed;
+import java.util.List;
import org.rometools.certiorem.hub.data.Subscriber;
import org.rometools.certiorem.hub.data.SubscriptionSummary;
-import java.util.List;
-
+import com.sun.syndication.feed.synd.SyndFeed;
/**
- *
+ *
* @author robert.cooper
*/
public interface Notifier {
/**
* Instructs the notifier to begin sending notifications to the list of subscribers
- *
+ *
* @param subscribers Subscribers to notify
* @param value The SyndFeed to send them
* @param callback A callback that is invoked each time a subscriber is notified.
@@ -41,11 +40,11 @@ public interface Notifier {
public void notifySubscribers(List subscribers, SyndFeed value, SubscriptionSummaryCallback callback);
/**
- * A callback that is invoked each time a subscriber is notified.
+ * A callback that is invoked each time a subscriber is notified.
*/
public static interface SubscriptionSummaryCallback {
/**
- *
+ *
* @param summary A summary of the data received from the subscriber
*/
public void onSummaryInfo(SubscriptionSummary summary);
diff --git a/src/main/java/org/rometools/certiorem/hub/Verifier.java b/src/main/java/org/rometools/certiorem/hub/Verifier.java
index ddc15ed..fe79e78 100644
--- a/src/main/java/org/rometools/certiorem/hub/Verifier.java
+++ b/src/main/java/org/rometools/certiorem/hub/Verifier.java
@@ -20,9 +20,9 @@ package org.rometools.certiorem.hub;
import org.rometools.certiorem.hub.data.Subscriber;
-
/**
* A strategy interface for verification of subscriptions.
+ *
* @author robert.cooper
*/
public interface Verifier {
@@ -38,6 +38,7 @@ public interface Verifier {
/**
* Verifies a subscriber (possibly) asyncronously
+ *
* @param subscriber the Subscriber to verify
* @param callback a callback with the result of the verification.
*/
@@ -45,32 +46,34 @@ public interface Verifier {
/**
* Verifies a subscriber syncronously
- * @param subscriber The subscriber data
+ *
+ * @param subscriber The subscriber data
* @return boolean result;
*/
public boolean verifySubcribeSyncronously(Subscriber subscriber);
/**
* Verifies am unsubscribe (possibly) asyncronously
+ *
* @param subscriber The subscriber data
* @param callback result
*/
public void verifyUnsubscribeAsyncronously(Subscriber subscriber, VerificationCallback callback);
- /**
+ /**
* Verifies an unsubscribe syncronously
- * @param subscriber The subscriber data
+ *
+ * @param subscriber The subscriber data
* @return boolean result;
*/
public boolean verifyUnsubcribeSyncronously(Subscriber subscriber);
-
/**
* An interface for capturing the result of a verification (subscribe or unsubscribe)
*/
public static interface VerificationCallback {
/**
- *
+ *
* @param verified success state of the verification
*/
public void onVerify(boolean verified);
diff --git a/src/main/java/org/rometools/certiorem/hub/data/HubDAO.java b/src/main/java/org/rometools/certiorem/hub/data/HubDAO.java
index 95c255f..bd23698 100644
--- a/src/main/java/org/rometools/certiorem/hub/data/HubDAO.java
+++ b/src/main/java/org/rometools/certiorem/hub/data/HubDAO.java
@@ -16,13 +16,12 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.hub.data;
import java.util.List;
/**
- *
+ *
* @author robert.cooper
*/
public interface HubDAO {
diff --git a/src/main/java/org/rometools/certiorem/hub/data/Subscriber.java b/src/main/java/org/rometools/certiorem/hub/data/Subscriber.java
index fb3e4a3..ed56456 100644
--- a/src/main/java/org/rometools/certiorem/hub/data/Subscriber.java
+++ b/src/main/java/org/rometools/certiorem/hub/data/Subscriber.java
@@ -20,9 +20,8 @@ package org.rometools.certiorem.hub.data;
import java.io.Serializable;
-
/**
- *
+ *
* @author robert.cooper
*/
public class Subscriber implements Serializable {
@@ -38,132 +37,132 @@ public class Subscriber implements Serializable {
/**
* Set the value of callback
- *
+ *
* @param newcallback new value of callback
*/
- public void setCallback(String newcallback) {
- this.callback = newcallback;
+ public void setCallback(final String newcallback) {
+ callback = newcallback;
}
/**
* Get the value of callback
- *
+ *
* @return the value of callback
*/
public String getCallback() {
- return this.callback;
+ return callback;
}
/**
* Set the value of creationTime
- *
+ *
* @param newcreationTime new value of creationTime
*/
- public void setCreationTime(long newcreationTime) {
- this.creationTime = newcreationTime;
+ public void setCreationTime(final long newcreationTime) {
+ creationTime = newcreationTime;
}
/**
* Get the value of creationTime
- *
+ *
* @return the value of creationTime
*/
public long getCreationTime() {
- return this.creationTime;
+ return creationTime;
}
/**
* Set the value of leaseSeconds
- *
+ *
* @param newleaseSeconds new value of leaseSeconds
*/
- public void setLeaseSeconds(long newleaseSeconds) {
- this.leaseSeconds = newleaseSeconds;
+ public void setLeaseSeconds(final long newleaseSeconds) {
+ leaseSeconds = newleaseSeconds;
}
/**
* Get the value of leaseSeconds
- *
+ *
* @return the value of leaseSeconds
*/
public long getLeaseSeconds() {
- return this.leaseSeconds;
+ return leaseSeconds;
}
/**
* Set the value of secret
- *
+ *
* @param newsecret new value of secret
*/
- public void setSecret(String newsecret) {
- this.secret = newsecret;
+ public void setSecret(final String newsecret) {
+ secret = newsecret;
}
/**
* Get the value of secret
- *
+ *
* @return the value of secret
*/
public String getSecret() {
- return this.secret;
+ return secret;
}
/**
* Set the value of topic
- *
+ *
* @param newtopic new value of topic
*/
- public void setTopic(String newtopic) {
- this.topic = newtopic;
+ public void setTopic(final String newtopic) {
+ topic = newtopic;
}
/**
* Get the value of topic
- *
+ *
* @return the value of topic
*/
public String getTopic() {
- return this.topic;
+ return topic;
}
/**
* Set the value of verify
- *
+ *
* @param newverify new value of verify
*/
- public void setVerify(String newverify) {
- this.verify = newverify;
+ public void setVerify(final String newverify) {
+ verify = newverify;
}
/**
* Get the value of verify
- *
+ *
* @return the value of verify
*/
public String getVerify() {
- return this.verify;
+ return verify;
}
/**
* Set the value of vertifyToken
- *
+ *
* @param newvertifyToken new value of vertifyToken
*/
- public void setVertifyToken(String newvertifyToken) {
- this.vertifyToken = newvertifyToken;
+ public void setVertifyToken(final String newvertifyToken) {
+ vertifyToken = newvertifyToken;
}
/**
* Get the value of vertifyToken
- *
+ *
* @return the value of vertifyToken
*/
public String getVertifyToken() {
- return this.vertifyToken;
+ return vertifyToken;
}
@Override
- public boolean equals(Object obj) {
+ public boolean equals(final Object obj) {
if (obj == null) {
return false;
}
@@ -174,31 +173,31 @@ public class Subscriber implements Serializable {
final Subscriber other = (Subscriber) obj;
- if ((this.callback == null) ? (other.callback != null) : (!this.callback.equals(other.callback))) {
+ if (callback == null ? other.callback != null : !callback.equals(other.callback)) {
return false;
}
- if ((this.secret == null) ? (other.secret != null) : (!this.secret.equals(other.secret))) {
+ if (secret == null ? other.secret != null : !secret.equals(other.secret)) {
return false;
}
- if ((this.topic == null) ? (other.topic != null) : (!this.topic.equals(other.topic))) {
+ if (topic == null ? other.topic != null : !topic.equals(other.topic)) {
return false;
}
- if ((this.verify == null) ? (other.verify != null) : (!this.verify.equals(other.verify))) {
+ if (verify == null ? other.verify != null : !verify.equals(other.verify)) {
return false;
}
- if ((this.vertifyToken == null) ? (other.vertifyToken != null) : (!this.vertifyToken.equals(other.vertifyToken))) {
+ if (vertifyToken == null ? other.vertifyToken != null : !vertifyToken.equals(other.vertifyToken)) {
return false;
}
- if (this.creationTime != other.creationTime) {
+ if (creationTime != other.creationTime) {
return false;
}
- if (this.leaseSeconds != other.leaseSeconds) {
+ if (leaseSeconds != other.leaseSeconds) {
return false;
}
@@ -208,13 +207,13 @@ public class Subscriber implements Serializable {
@Override
public int hashCode() {
int hash = 7;
- hash = (67 * hash) + ((this.callback != null) ? this.callback.hashCode() : 0);
- hash = (67 * hash) + ((this.secret != null) ? this.secret.hashCode() : 0);
- hash = (67 * hash) + ((this.topic != null) ? this.topic.hashCode() : 0);
- hash = (67 * hash) + ((this.verify != null) ? this.verify.hashCode() : 0);
- hash = (67 * hash) + ((this.vertifyToken != null) ? this.vertifyToken.hashCode() : 0);
- hash = (67 * hash) + (int) (this.creationTime ^ (this.creationTime >>> 32));
- hash = (67 * hash) + (int) (this.leaseSeconds ^ (this.leaseSeconds >>> 32));
+ hash = 67 * hash + (callback != null ? callback.hashCode() : 0);
+ hash = 67 * hash + (secret != null ? secret.hashCode() : 0);
+ hash = 67 * hash + (topic != null ? topic.hashCode() : 0);
+ hash = 67 * hash + (verify != null ? verify.hashCode() : 0);
+ hash = 67 * hash + (vertifyToken != null ? vertifyToken.hashCode() : 0);
+ hash = 67 * hash + (int) (creationTime ^ creationTime >>> 32);
+ hash = 67 * hash + (int) (leaseSeconds ^ leaseSeconds >>> 32);
return hash;
}
diff --git a/src/main/java/org/rometools/certiorem/hub/data/SubscriptionSummary.java b/src/main/java/org/rometools/certiorem/hub/data/SubscriptionSummary.java
index c826f40..90dd65d 100644
--- a/src/main/java/org/rometools/certiorem/hub/data/SubscriptionSummary.java
+++ b/src/main/java/org/rometools/certiorem/hub/data/SubscriptionSummary.java
@@ -20,9 +20,8 @@ package org.rometools.certiorem.hub.data;
import java.io.Serializable;
-
/**
- *
+ *
* @author robert.cooper
*/
public class SubscriptionSummary implements Serializable {
@@ -32,55 +31,55 @@ public class SubscriptionSummary implements Serializable {
/**
* Set the value of host
- *
+ *
* @param newhost new value of host
*/
- public void setHost(String newhost) {
- this.host = newhost;
+ public void setHost(final String newhost) {
+ host = newhost;
}
/**
* Get the value of host
- *
+ *
* @return the value of host
*/
public String getHost() {
- return this.host;
+ return host;
}
/**
* Set the value of lastPublishSuccessful
- *
+ *
* @param newlastPublishSuccessful new value of lastPublishSuccessful
*/
- public void setLastPublishSuccessful(boolean newlastPublishSuccessful) {
- this.lastPublishSuccessful = newlastPublishSuccessful;
+ public void setLastPublishSuccessful(final boolean newlastPublishSuccessful) {
+ lastPublishSuccessful = newlastPublishSuccessful;
}
/**
* Get the value of lastPublishSuccessful
- *
+ *
* @return the value of lastPublishSuccessful
*/
public boolean isLastPublishSuccessful() {
- return this.lastPublishSuccessful;
+ return lastPublishSuccessful;
}
/**
* Set the value of subscribers
- *
+ *
* @param newsubscribers new value of subscribers
*/
- public void setSubscribers(int newsubscribers) {
- this.subscribers = newsubscribers;
+ public void setSubscribers(final int newsubscribers) {
+ subscribers = newsubscribers;
}
/**
* Get the value of subscribers
- *
+ *
* @return the value of subscribers
*/
public int getSubscribers() {
- return this.subscribers;
+ return subscribers;
}
}
diff --git a/src/main/java/org/rometools/certiorem/hub/data/jpa/JPADAO.java b/src/main/java/org/rometools/certiorem/hub/data/jpa/JPADAO.java
index c33eca3..b8d6c50 100644
--- a/src/main/java/org/rometools/certiorem/hub/data/jpa/JPADAO.java
+++ b/src/main/java/org/rometools/certiorem/hub/data/jpa/JPADAO.java
@@ -16,12 +16,8 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.hub.data.jpa;
-import org.rometools.certiorem.hub.data.HubDAO;
-import org.rometools.certiorem.hub.data.Subscriber;
-
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
@@ -31,10 +27,13 @@ import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.NoResultException;
import javax.persistence.Query;
+
+import org.rometools.certiorem.hub.data.HubDAO;
+import org.rometools.certiorem.hub.data.Subscriber;
import org.rometools.certiorem.hub.data.SubscriptionSummary;
/**
- *
+ *
* @author robert.cooper
*/
public class JPADAO implements HubDAO {
@@ -48,41 +47,39 @@ public class JPADAO implements HubDAO {
}
@Override
- public List extends Subscriber> subscribersForTopic(String topic) {
- LinkedList result = new LinkedList();
- EntityManager em = factory.createEntityManager();
- EntityTransaction tx = em.getTransaction();
+ public List extends Subscriber> subscribersForTopic(final String topic) {
+ final LinkedList result = new LinkedList();
+ final EntityManager em = factory.createEntityManager();
+ final EntityTransaction tx = em.getTransaction();
tx.begin();
- Query query = em.createNamedQuery("Subcriber.forTopic");
+ final Query query = em.createNamedQuery("Subcriber.forTopic");
query.setParameter("topic", topic);
try {
- for (JPASubscriber subscriber : (List) query.getResultList()) {
+ for (final JPASubscriber subscriber : (List) query.getResultList()) {
if (subscriber.getLeaseSeconds() == -1) {
result.add(subscriber);
continue;
}
- if (subscriber.getSubscribedAt().getTime() < (System.currentTimeMillis() - (1000 * subscriber.getLeaseSeconds()))) {
+ if (subscriber.getSubscribedAt().getTime() < System.currentTimeMillis() - 1000 * subscriber.getLeaseSeconds()) {
subscriber.setExpired(true);
} else {
result.add(subscriber);
}
- if (subscriber.isExpired() && this.purgeExpired) {
+ if (subscriber.isExpired() && purgeExpired) {
em.remove(subscriber);
}
}
- } catch (NoResultException e) {
+ } catch (final NoResultException e) {
tx.rollback();
em.close();
return result;
}
-
-
if (!tx.getRollbackOnly()) {
tx.commit();
} else {
@@ -95,12 +92,12 @@ public class JPADAO implements HubDAO {
}
@Override
- public Subscriber addSubscriber(Subscriber subscriber) {
+ public Subscriber addSubscriber(final Subscriber subscriber) {
assert subscriber != null : "Attempt to store a null subscriber";
- EntityManager em = factory.createEntityManager();
- EntityTransaction tx = em.getTransaction();
+ final EntityManager em = factory.createEntityManager();
+ final EntityTransaction tx = em.getTransaction();
tx.begin();
- JPASubscriber data = new JPASubscriber();
+ final JPASubscriber data = new JPASubscriber();
data.copyFrom(subscriber);
data.setId(UUID.randomUUID().toString());
em.persist(data);
@@ -110,22 +107,22 @@ public class JPADAO implements HubDAO {
}
@Override
- public Subscriber findSubscriber(String topic, String callbackUrl) {
+ public Subscriber findSubscriber(final String topic, final String callbackUrl) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
- public void handleSummary(String topic, SubscriptionSummary summary) {
+ public void handleSummary(final String topic, final SubscriptionSummary summary) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
- public List extends SubscriptionSummary> summariesForTopic(String topic) {
+ public List extends SubscriptionSummary> summariesForTopic(final String topic) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
- public void removeSubscriber(String topic, String callback) {
+ public void removeSubscriber(final String topic, final String callback) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
diff --git a/src/main/java/org/rometools/certiorem/hub/data/jpa/JPASubscriber.java b/src/main/java/org/rometools/certiorem/hub/data/jpa/JPASubscriber.java
index 5980f48..6b8621a 100644
--- a/src/main/java/org/rometools/certiorem/hub/data/jpa/JPASubscriber.java
+++ b/src/main/java/org/rometools/certiorem/hub/data/jpa/JPASubscriber.java
@@ -16,13 +16,9 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.hub.data.jpa;
-import org.rometools.certiorem.hub.data.Subscriber;
-
import java.io.Serializable;
-
import java.util.Date;
import javax.persistence.Entity;
@@ -32,14 +28,14 @@ import javax.persistence.NamedQuery;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
+import org.rometools.certiorem.hub.data.Subscriber;
/**
- *
+ *
* @author robert.cooper
*/
@Entity
-@NamedQueries({@NamedQuery(name = "Subcriber.forTopic", query = "SELECT o FROM JPASubscriber o WHERE o.topic = :topic AND o.expired = false ORDER BY o.subscribedAt")
-})
+@NamedQueries({ @NamedQuery(name = "Subcriber.forTopic", query = "SELECT o FROM JPASubscriber o WHERE o.topic = :topic AND o.expired = false ORDER BY o.subscribedAt") })
public class JPASubscriber extends Subscriber implements Serializable {
private Date subscribedAt = new Date();
private String id;
@@ -47,65 +43,65 @@ public class JPASubscriber extends Subscriber implements Serializable {
/**
* Set the value of expired
- *
+ *
* @param newexpired new value of expired
*/
- public void setExpired(boolean newexpired) {
- this.expired = newexpired;
+ public void setExpired(final boolean newexpired) {
+ expired = newexpired;
}
/**
* Get the value of expired
- *
+ *
* @return the value of expired
*/
public boolean isExpired() {
- return this.expired;
+ return expired;
}
/**
* Set the value of id
- *
+ *
* @param newid new value of id
*/
- public void setId(String newid) {
- this.id = newid;
+ public void setId(final String newid) {
+ id = newid;
}
/**
* Get the value of id
- *
+ *
* @return the value of id
*/
@Id
public String getId() {
- return this.id;
+ return id;
}
/**
* Set the value of subscribedAt
- *
+ *
* @param newsubscribedAt new value of subscribedAt
*/
- public void setSubscribedAt(Date newsubscribedAt) {
- this.subscribedAt = newsubscribedAt;
+ public void setSubscribedAt(final Date newsubscribedAt) {
+ subscribedAt = newsubscribedAt;
}
/**
* Get the value of subscribedAt
- *
+ *
* @return the value of subscribedAt
*/
@Temporal(TemporalType.TIMESTAMP)
public Date getSubscribedAt() {
- return this.subscribedAt;
+ return subscribedAt;
}
- public void copyFrom(Subscriber source) {
- this.setLeaseSeconds(source.getLeaseSeconds());
- this.setSecret(source.getSecret());
- this.setTopic(source.getTopic());
- this.setVerify(source.getVerify());
- this.setVertifyToken(source.getVertifyToken());
+ public void copyFrom(final Subscriber source) {
+ setLeaseSeconds(source.getLeaseSeconds());
+ setSecret(source.getSecret());
+ setTopic(source.getTopic());
+ setVerify(source.getVerify());
+ setVertifyToken(source.getVertifyToken());
}
}
diff --git a/src/main/java/org/rometools/certiorem/hub/data/ram/InMemoryHubDAO.java b/src/main/java/org/rometools/certiorem/hub/data/ram/InMemoryHubDAO.java
index a7f484d..44497db 100644
--- a/src/main/java/org/rometools/certiorem/hub/data/ram/InMemoryHubDAO.java
+++ b/src/main/java/org/rometools/certiorem/hub/data/ram/InMemoryHubDAO.java
@@ -18,36 +18,35 @@
package org.rometools.certiorem.hub.data.ram;
-import org.rometools.certiorem.hub.data.HubDAO;
-import org.rometools.certiorem.hub.data.Subscriber;
-import org.rometools.certiorem.hub.data.SubscriptionSummary;
-
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
+import org.rometools.certiorem.hub.data.HubDAO;
+import org.rometools.certiorem.hub.data.Subscriber;
+import org.rometools.certiorem.hub.data.SubscriptionSummary;
/**
* A Simple In-Memory HubDAO for subscribers.
- *
+ *
* @author robert.cooper
*/
public class InMemoryHubDAO implements HubDAO {
- private ConcurrentHashMap> subscribers = new ConcurrentHashMap>();
- private ConcurrentHashMap> summaries = new ConcurrentHashMap>();
+ private final ConcurrentHashMap> subscribers = new ConcurrentHashMap>();
+ private final ConcurrentHashMap> summaries = new ConcurrentHashMap>();
@Override
- public Subscriber addSubscriber(Subscriber subscriber) {
+ public Subscriber addSubscriber(final Subscriber subscriber) {
assert subscriber != null : "Attempt to store a null subscriber";
- List subList = this.subscribers.get(subscriber.getTopic());
+ List subList = subscribers.get(subscriber.getTopic());
if (subList == null) {
synchronized (this) {
subList = new CopyOnWriteArrayList();
- this.subscribers.put(subscriber.getTopic(), subList);
+ subscribers.put(subscriber.getTopic(), subList);
}
}
@@ -57,13 +56,13 @@ public class InMemoryHubDAO implements HubDAO {
}
@Override
- public void handleSummary(String topic, SubscriptionSummary summary) {
- ConcurrentHashMap hostsToSummaries = this.summaries.get(topic);
+ public void handleSummary(final String topic, final SubscriptionSummary summary) {
+ ConcurrentHashMap hostsToSummaries = summaries.get(topic);
if (hostsToSummaries == null) {
synchronized (this) {
hostsToSummaries = new ConcurrentHashMap();
- this.summaries.put(topic, hostsToSummaries);
+ summaries.put(topic, hostsToSummaries);
}
}
@@ -71,14 +70,13 @@ public class InMemoryHubDAO implements HubDAO {
}
@Override
- public List subscribersForTopic(String topic) {
+ public List extends Subscriber> subscribersForTopic(final String topic) {
if (subscribers.containsKey(topic)) {
- List result = new LinkedList();
- LinkedList expired = new LinkedList();
+ final List result = new LinkedList();
+ final LinkedList expired = new LinkedList();
- for (Subscriber s : subscribers.get(topic)) {
- if ((s.getLeaseSeconds() > 0) &&
- (System.currentTimeMillis() >= (s.getCreationTime() + (s.getLeaseSeconds() * 1000L)))) {
+ for (final Subscriber s : subscribers.get(topic)) {
+ if (s.getLeaseSeconds() > 0 && System.currentTimeMillis() >= s.getCreationTime() + s.getLeaseSeconds() * 1000L) {
expired.add(s);
} else {
result.add(s);
@@ -86,8 +84,7 @@ public class InMemoryHubDAO implements HubDAO {
}
if (!expired.isEmpty()) {
- subscribers.get(topic)
- .removeAll(expired);
+ subscribers.get(topic).removeAll(expired);
}
return result;
@@ -97,41 +94,41 @@ public class InMemoryHubDAO implements HubDAO {
}
@Override
- public List summariesForTopic(String topic) {
- LinkedList result = new LinkedList();
+ public List extends SubscriptionSummary> summariesForTopic(final String topic) {
+ final LinkedList result = new LinkedList();
- if (this.summaries.containsKey(topic)) {
- result.addAll(this.summaries.get(topic).values());
+ if (summaries.containsKey(topic)) {
+ result.addAll(summaries.get(topic).values());
}
return result;
}
@Override
- public Subscriber findSubscriber(String topic, String callbackUrl) {
+ public Subscriber findSubscriber(final String topic, final String callbackUrl) {
- for (Subscriber s : this.subscribersForTopic(topic)) {
+ for (final Subscriber s : subscribersForTopic(topic)) {
if (callbackUrl.equals(s.getCallback())) {
- return s;
+ return s;
}
}
return null;
}
@Override
- public void removeSubscriber(String topic, String callback) {
- List subs = this.subscribers.get(topic);
- if(subs == null){
+ public void removeSubscriber(final String topic, final String callback) {
+ final List subs = subscribers.get(topic);
+ if (subs == null) {
return;
}
Subscriber match = null;
- for(Subscriber s: subs){
- if(s.getCallback().equals(callback)){
+ for (final Subscriber s : subs) {
+ if (s.getCallback().equals(callback)) {
match = s;
break;
}
}
- if(match != null){
+ if (match != null) {
subs.remove(match);
}
}
diff --git a/src/main/java/org/rometools/certiorem/hub/notify/standard/AbstractNotifier.java b/src/main/java/org/rometools/certiorem/hub/notify/standard/AbstractNotifier.java
index 193063c..7cf9cc0 100644
--- a/src/main/java/org/rometools/certiorem/hub/notify/standard/AbstractNotifier.java
+++ b/src/main/java/org/rometools/certiorem/hub/notify/standard/AbstractNotifier.java
@@ -16,152 +16,140 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.hub.notify.standard;
-import com.sun.syndication.feed.synd.SyndFeed;
-import com.sun.syndication.io.FeedException;
-import com.sun.syndication.io.SyndFeedOutput;
-
-import org.rometools.certiorem.hub.Notifier;
-import org.rometools.certiorem.hub.data.Subscriber;
-import org.rometools.certiorem.hub.data.SubscriptionSummary;
-
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
-
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
-
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
-import org.rometools.certiorem.sub.data.ram.InMemorySubDAO;
+import org.rometools.certiorem.hub.Notifier;
+import org.rometools.certiorem.hub.data.Subscriber;
+import org.rometools.certiorem.hub.data.SubscriptionSummary;
+
+import com.sun.syndication.feed.synd.SyndFeed;
+import com.sun.syndication.io.FeedException;
+import com.sun.syndication.io.SyndFeedOutput;
/**
- *
+ *
* @author robert.cooper
*/
public abstract class AbstractNotifier implements Notifier {
/**
- * This method will serialize the synd feed and build Notifications for the
- * implementation class to handle.
- * @see enqueueNotification
- *
+ * This method will serialize the synd feed and build Notifications for the implementation class to handle.
+ *
+ * @see enqueueNotification
+ *
* @param subscribers List of subscribers to notify
* @param value The SyndFeed object to send
* @param callback A callback that will be invoked each time a subscriber is notified.
- *
+ *
*/
@Override
- public void notifySubscribers(List subscribers, SyndFeed value, SubscriptionSummaryCallback callback) {
+ public void notifySubscribers(final List subscribers, final SyndFeed value, final SubscriptionSummaryCallback callback) {
String mimeType = null;
- if (value.getFeedType()
- .startsWith("rss")) {
+ if (value.getFeedType().startsWith("rss")) {
mimeType = "application/rss+xml";
} else {
mimeType = "application/atom+xml";
}
- SyndFeedOutput output = new SyndFeedOutput();
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ final SyndFeedOutput output = new SyndFeedOutput();
+ final ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
output.output(value, new OutputStreamWriter(baos));
baos.close();
- } catch (IOException ex) {
- Logger.getLogger(AbstractNotifier.class.getName())
- .log(Level.SEVERE, null, ex);
+ } catch (final IOException ex) {
+ Logger.getLogger(AbstractNotifier.class.getName()).log(Level.SEVERE, null, ex);
throw new RuntimeException("Unable to output the feed.", ex);
- } catch (FeedException ex) {
- Logger.getLogger(AbstractNotifier.class.getName())
- .log(Level.SEVERE, null, ex);
+ } catch (final FeedException ex) {
+ Logger.getLogger(AbstractNotifier.class.getName()).log(Level.SEVERE, null, ex);
throw new RuntimeException("Unable to output the feed.", ex);
}
- byte[] payload = baos.toByteArray();
+ final byte[] payload = baos.toByteArray();
- for (Subscriber s : subscribers) {
- Notification not = new Notification();
+ for (final Subscriber s : subscribers) {
+ final Notification not = new Notification();
not.callback = callback;
not.lastRun = 0;
not.mimeType = mimeType;
not.payload = payload;
not.retryCount = 0;
not.subscriber = s;
- this.enqueueNotification(not);
+ enqueueNotification(not);
}
}
- /** Implementation method that queues/sends a notification
- *
+
+ /**
+ * Implementation method that queues/sends a notification
+ *
* @param not notification to send.
*/
protected abstract void enqueueNotification(Notification not);
/**
- * POSTs the payload to the subscriber's callback and returns a
- * SubscriptionSummary with subscriber counts (where possible) and the
- * success state of the notification.
+ * POSTs the payload to the subscriber's callback and returns a SubscriptionSummary with subscriber counts (where possible) and the success state of the
+ * notification.
+ *
* @param subscriber subscriber data.
* @param mimeType MIME type for the request
* @param payload payload of the feed to send
* @return SubscriptionSummary with the returned data.
*/
- protected SubscriptionSummary postNotification(Subscriber subscriber, String mimeType, byte[] payload) {
- SubscriptionSummary result = new SubscriptionSummary();
+ protected SubscriptionSummary postNotification(final Subscriber subscriber, final String mimeType, final byte[] payload) {
+ final SubscriptionSummary result = new SubscriptionSummary();
try {
- URL target = new URL(subscriber.getCallback());
+ final URL target = new URL(subscriber.getCallback());
Logger.getLogger(AbstractNotifier.class.getName()).log(Level.INFO, "Posting notification to subscriber {0}", subscriber.getCallback());
result.setHost(target.getHost());
- HttpURLConnection connection = (HttpURLConnection) target.openConnection();
+ final HttpURLConnection connection = (HttpURLConnection) target.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", mimeType);
connection.setDoOutput(true);
connection.connect();
- OutputStream os = connection.getOutputStream();
+ final OutputStream os = connection.getOutputStream();
os.write(payload);
os.close();
- int responseCode = connection.getResponseCode();
- String subscribers = connection.getHeaderField("X-Hub-On-Behalf-Of");
+ final int responseCode = connection.getResponseCode();
+ final String subscribers = connection.getHeaderField("X-Hub-On-Behalf-Of");
connection.disconnect();
-
+
if (responseCode != 200) {
- Logger.getLogger(AbstractNotifier.class.getName())
- .log(Level.WARNING, "Got code " + responseCode + " from " + target);
+ Logger.getLogger(AbstractNotifier.class.getName()).log(Level.WARNING, "Got code " + responseCode + " from " + target);
result.setLastPublishSuccessful(false);
return result;
}
-
-
if (subscribers != null) {
try {
result.setSubscribers(Integer.parseInt(subscribers));
- } catch (NumberFormatException nfe) {
- Logger.getLogger(AbstractNotifier.class.getName())
- .log(Level.WARNING, "Invalid subscriber value " + subscribers + " " + target, nfe);
+ } catch (final NumberFormatException nfe) {
+ Logger.getLogger(AbstractNotifier.class.getName()).log(Level.WARNING, "Invalid subscriber value " + subscribers + " " + target, nfe);
result.setSubscribers(-1);
}
} else {
result.setSubscribers(-1);
}
- } catch (MalformedURLException ex) {
- Logger.getLogger(AbstractNotifier.class.getName())
- .log(Level.WARNING, null, ex);
+ } catch (final MalformedURLException ex) {
+ Logger.getLogger(AbstractNotifier.class.getName()).log(Level.WARNING, null, ex);
result.setLastPublishSuccessful(false);
- } catch (IOException ex) {
- Logger.getLogger(AbstractNotifier.class.getName())
- .log(Level.SEVERE, null, ex);
+ } catch (final IOException ex) {
+ Logger.getLogger(AbstractNotifier.class.getName()).log(Level.SEVERE, null, ex);
result.setLastPublishSuccessful(false);
}
diff --git a/src/main/java/org/rometools/certiorem/hub/notify/standard/Notification.java b/src/main/java/org/rometools/certiorem/hub/notify/standard/Notification.java
index 470956b..053e091 100644
--- a/src/main/java/org/rometools/certiorem/hub/notify/standard/Notification.java
+++ b/src/main/java/org/rometools/certiorem/hub/notify/standard/Notification.java
@@ -16,14 +16,13 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.hub.notify.standard;
import org.rometools.certiorem.hub.Notifier.SubscriptionSummaryCallback;
import org.rometools.certiorem.hub.data.Subscriber;
/**
- *
+ *
* @author robert.cooper
*/
public class Notification {
diff --git a/src/main/java/org/rometools/certiorem/hub/notify/standard/ThreadPoolNotifier.java b/src/main/java/org/rometools/certiorem/hub/notify/standard/ThreadPoolNotifier.java
index 7f1c724..d305f5a 100644
--- a/src/main/java/org/rometools/certiorem/hub/notify/standard/ThreadPoolNotifier.java
+++ b/src/main/java/org/rometools/certiorem/hub/notify/standard/ThreadPoolNotifier.java
@@ -16,11 +16,8 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.hub.notify.standard;
-import org.rometools.certiorem.hub.data.SubscriptionSummary;
-
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentSkipListSet;
@@ -28,11 +25,11 @@ import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
+import org.rometools.certiorem.hub.data.SubscriptionSummary;
/**
- * A notifier implementation that uses a thread pool to deliver notifications to
- * subscribers
- *
+ * A notifier implementation that uses a thread pool to deliver notifications to subscribers
+ *
* @author robert.cooper
*/
public class ThreadPoolNotifier extends AbstractNotifier {
@@ -45,47 +42,47 @@ public class ThreadPoolNotifier extends AbstractNotifier {
this(2, 5, 5);
}
- public ThreadPoolNotifier(int startPoolSize, int maxPoolSize, int queueSize) {
- this.exeuctor = new ThreadPoolExecutor(startPoolSize, maxPoolSize, 300, TimeUnit.SECONDS,
- new LinkedBlockingQueue(queueSize));
+ public ThreadPoolNotifier(final int startPoolSize, final int maxPoolSize, final int queueSize) {
+ exeuctor = new ThreadPoolExecutor(startPoolSize, maxPoolSize, 300, TimeUnit.SECONDS, new LinkedBlockingQueue(queueSize));
}
protected ThreadPoolNotifier(final ThreadPoolExecutor executor) {
- this.exeuctor = executor;
+ exeuctor = executor;
}
/**
- * Enqueues a notification to run. If the notification fails, it will be
- * retried every two minutes until 5 attempts are completed. Notifications
- * to the same callback should be delivered successfully in order.
+ * Enqueues a notification to run. If the notification fails, it will be retried every two minutes until 5 attempts are completed. Notifications to the same
+ * callback should be delivered successfully in order.
+ *
* @param not
*/
@Override
protected void enqueueNotification(final Notification not) {
- Runnable r = new Runnable() {
- @Override
- public void run() {
- not.lastRun = System.currentTimeMillis();
+ final Runnable r = new Runnable() {
+ @Override
+ public void run() {
+ not.lastRun = System.currentTimeMillis();
- SubscriptionSummary summary = postNotification(not.subscriber, not.mimeType, not.payload);
+ final SubscriptionSummary summary = postNotification(not.subscriber, not.mimeType, not.payload);
- if (!summary.isLastPublishSuccessful()) {
- not.retryCount++;
+ if (!summary.isLastPublishSuccessful()) {
+ not.retryCount++;
- if (not.retryCount <= 5) {
- retry(not);
- }
+ if (not.retryCount <= 5) {
+ retry(not);
}
-
- not.callback.onSummaryInfo(summary);
}
- };
- this.exeuctor.execute(r);
+ not.callback.onSummaryInfo(summary);
+ }
+ };
+
+ exeuctor.execute(r);
}
/**
* Schedules a notification to retry in two minutes.
+ *
* @param not Notification to retry
*/
protected void retry(final Notification not) {
@@ -94,21 +91,21 @@ public class ThreadPoolNotifier extends AbstractNotifier {
// will schedule the retry
pendings.add(not.subscriber.getCallback());
timer.schedule(new TimerTask() {
- @Override
- public void run() {
- pendings.remove(not.subscriber.getCallback());
- enqueueNotification(not);
- }
- }, TWO_MINUTES);
+ @Override
+ public void run() {
+ pendings.remove(not.subscriber.getCallback());
+ enqueueNotification(not);
+ }
+ }, TWO_MINUTES);
} else {
// There is a retry in front of this one, so we will just schedule
// it to retry again in a bit
timer.schedule(new TimerTask() {
- @Override
- public void run() {
- retry(not);
- }
- }, TWO_MINUTES);
+ @Override
+ public void run() {
+ retry(not);
+ }
+ }, TWO_MINUTES);
}
}
}
diff --git a/src/main/java/org/rometools/certiorem/hub/notify/standard/UnthreadedNotifier.java b/src/main/java/org/rometools/certiorem/hub/notify/standard/UnthreadedNotifier.java
index df5a19b..303bf9d 100644
--- a/src/main/java/org/rometools/certiorem/hub/notify/standard/UnthreadedNotifier.java
+++ b/src/main/java/org/rometools/certiorem/hub/notify/standard/UnthreadedNotifier.java
@@ -18,32 +18,30 @@
package org.rometools.certiorem.hub.notify.standard;
-import org.rometools.certiorem.hub.data.SubscriptionSummary;
-
import java.util.concurrent.ConcurrentSkipListSet;
+import org.rometools.certiorem.hub.data.SubscriptionSummary;
/**
* A notifier that does not use threads. All calls are blocking and synchronous.
- *
+ *
* @author robert.cooper
*/
public class UnthreadedNotifier extends AbstractNotifier {
private final ConcurrentSkipListSet retries = new ConcurrentSkipListSet();
/**
- * A blocking call that performs a notification.
- * If there are pending retries that are older than two minutes old, they will
- * be retried before the method returns.
- *
+ * A blocking call that performs a notification. If there are pending retries that are older than two minutes old, they will be retried before the method
+ * returns.
+ *
* @param not
*/
@Override
- protected void enqueueNotification(Notification not) {
+ protected void enqueueNotification(final Notification not) {
not.lastRun = System.currentTimeMillis();
- SubscriptionSummary summary = postNotification(not.subscriber, not.mimeType, not.payload);
-
+ final SubscriptionSummary summary = postNotification(not.subscriber, not.mimeType, not.payload);
+
not.callback.onSummaryInfo(summary);
}
}
diff --git a/src/main/java/org/rometools/certiorem/hub/verify/standard/AbstractVerifier.java b/src/main/java/org/rometools/certiorem/hub/verify/standard/AbstractVerifier.java
index 6a8c9a1..528505f 100644
--- a/src/main/java/org/rometools/certiorem/hub/verify/standard/AbstractVerifier.java
+++ b/src/main/java/org/rometools/certiorem/hub/verify/standard/AbstractVerifier.java
@@ -16,91 +16,77 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.hub.verify.standard;
-import org.rometools.certiorem.hub.Verifier;
-import org.rometools.certiorem.hub.data.Subscriber;
-
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
-
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
-
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
+import org.rometools.certiorem.hub.Verifier;
+import org.rometools.certiorem.hub.data.Subscriber;
/**
- * An abstract verifier based on the java.net HTTP classes. This implements only
- * synchronous operations, and expects a child class to do Async ops.
+ * An abstract verifier based on the java.net HTTP classes. This implements only synchronous operations, and expects a child class to do Async ops.
*
* @author robert.cooper
*/
public abstract class AbstractVerifier implements Verifier {
@Override
- public boolean verifySubcribeSyncronously(Subscriber subscriber) {
+ public boolean verifySubcribeSyncronously(final Subscriber subscriber) {
return doOp(Verifier.MODE_SUBSCRIBE, subscriber);
}
@Override
- public boolean verifyUnsubcribeSyncronously(Subscriber subscriber) {
+ public boolean verifyUnsubcribeSyncronously(final Subscriber subscriber) {
return doOp(Verifier.MODE_UNSUBSCRIBE, subscriber);
}
- private boolean doOp(String mode, Subscriber subscriber){
+ private boolean doOp(final String mode, final Subscriber subscriber) {
try {
- String challenge = UUID.randomUUID()
- .toString();
- StringBuilder queryString = new StringBuilder();
- queryString.append("hub.mode=")
- .append(mode)
- .append("&hub.topic=")
- .append(URLEncoder.encode(subscriber.getTopic(), "UTF-8"))
- .append("&hub.challenge=")
- .append(challenge);
+ final String challenge = UUID.randomUUID().toString();
+ final StringBuilder queryString = new StringBuilder();
+ queryString.append("hub.mode=").append(mode).append("&hub.topic=").append(URLEncoder.encode(subscriber.getTopic(), "UTF-8"))
+ .append("&hub.challenge=").append(challenge);
if (subscriber.getLeaseSeconds() != -1) {
- queryString.append("&hub.lease_seconds=")
- .append(subscriber.getLeaseSeconds());
+ queryString.append("&hub.lease_seconds=").append(subscriber.getLeaseSeconds());
}
if (subscriber.getVertifyToken() != null) {
- queryString.append("&hub.verify_token=")
- .append(URLEncoder.encode(subscriber.getVertifyToken(), "UTF-8"));
+ queryString.append("&hub.verify_token=").append(URLEncoder.encode(subscriber.getVertifyToken(), "UTF-8"));
}
- URL url = new URL(subscriber.getCallback() + "?" + queryString.toString());
- HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ final URL url = new URL(subscriber.getCallback() + "?" + queryString.toString());
+ final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
-// connection.setRequestProperty("Host", url.getHost());
-// connection.setRequestProperty("Port", Integer.toString(url.getPort()));
+ // connection.setRequestProperty("Host", url.getHost());
+ // connection.setRequestProperty("Port", Integer.toString(url.getPort()));
connection.setRequestProperty("User-Agent", "ROME-Certiorem");
connection.connect();
- int rc = connection.getResponseCode();
- InputStream is = connection.getInputStream();
- BufferedReader reader = new BufferedReader(new InputStreamReader(is));
- String result = reader.readLine();
+ final int rc = connection.getResponseCode();
+ final InputStream is = connection.getInputStream();
+ final BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+ final String result = reader.readLine();
reader.close();
connection.disconnect();
- if ((rc != 200) || !challenge.equals(result.trim())) {
+ if (rc != 200 || !challenge.equals(result.trim())) {
return false;
} else {
return true;
}
- } catch (UnsupportedEncodingException ex) {
- Logger.getLogger(AbstractVerifier.class.getName())
- .log(Level.SEVERE, null, ex);
+ } catch (final UnsupportedEncodingException ex) {
+ Logger.getLogger(AbstractVerifier.class.getName()).log(Level.SEVERE, null, ex);
throw new RuntimeException("Should not happen. UTF-8 threw unsupported encoding", ex);
- } catch (IOException ex) {
- Logger.getLogger(AbstractVerifier.class.getName())
- .log(Level.SEVERE, null, ex);
+ } catch (final IOException ex) {
+ Logger.getLogger(AbstractVerifier.class.getName()).log(Level.SEVERE, null, ex);
return false;
}
diff --git a/src/main/java/org/rometools/certiorem/hub/verify/standard/ThreadPoolVerifier.java b/src/main/java/org/rometools/certiorem/hub/verify/standard/ThreadPoolVerifier.java
index 8bd864c..7bc7452 100644
--- a/src/main/java/org/rometools/certiorem/hub/verify/standard/ThreadPoolVerifier.java
+++ b/src/main/java/org/rometools/certiorem/hub/verify/standard/ThreadPoolVerifier.java
@@ -16,53 +16,51 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.hub.verify.standard;
-import org.rometools.certiorem.hub.data.Subscriber;
-
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
+import org.rometools.certiorem.hub.data.Subscriber;
/**
* Uses a ThreadPoolExecutor to do async verifications.
+ *
* @author robert.cooper
*/
public class ThreadPoolVerifier extends AbstractVerifier {
protected final ThreadPoolExecutor exeuctor;
- protected ThreadPoolVerifier(final ThreadPoolExecutor executor){
- this.exeuctor = executor;
+ protected ThreadPoolVerifier(final ThreadPoolExecutor executor) {
+ exeuctor = executor;
}
-
+
public ThreadPoolVerifier() {
this(2, 5, 5);
}
- public ThreadPoolVerifier(int startPoolSize, int maxPoolSize, int queueSize) {
- this.exeuctor = new ThreadPoolExecutor(startPoolSize, maxPoolSize, 300, TimeUnit.SECONDS,
- new LinkedBlockingQueue(queueSize));
+ public ThreadPoolVerifier(final int startPoolSize, final int maxPoolSize, final int queueSize) {
+ exeuctor = new ThreadPoolExecutor(startPoolSize, maxPoolSize, 300, TimeUnit.SECONDS, new LinkedBlockingQueue(queueSize));
}
@Override
public void verifySubscribeAsyncronously(final Subscriber subscriber, final VerificationCallback callback) {
- this.exeuctor.execute(new Runnable() {
- @Override
- public void run() {
- callback.onVerify(verifySubcribeSyncronously(subscriber));
- }
- });
+ exeuctor.execute(new Runnable() {
+ @Override
+ public void run() {
+ callback.onVerify(verifySubcribeSyncronously(subscriber));
+ }
+ });
}
@Override
public void verifyUnsubscribeAsyncronously(final Subscriber subscriber, final VerificationCallback callback) {
- this.exeuctor.execute(new Runnable() {
- @Override
- public void run() {
- callback.onVerify(verifyUnsubcribeSyncronously(subscriber));
- }
- });
+ exeuctor.execute(new Runnable() {
+ @Override
+ public void run() {
+ callback.onVerify(verifyUnsubcribeSyncronously(subscriber));
+ }
+ });
}
}
diff --git a/src/main/java/org/rometools/certiorem/hub/verify/standard/ThreadpoolVerifierAdvanced.java b/src/main/java/org/rometools/certiorem/hub/verify/standard/ThreadpoolVerifierAdvanced.java
index a8cd755..4a206fe 100644
--- a/src/main/java/org/rometools/certiorem/hub/verify/standard/ThreadpoolVerifierAdvanced.java
+++ b/src/main/java/org/rometools/certiorem/hub/verify/standard/ThreadpoolVerifierAdvanced.java
@@ -21,12 +21,12 @@ package org.rometools.certiorem.hub.verify.standard;
import java.util.concurrent.ThreadPoolExecutor;
/**
- *
+ *
* @author robert.cooper
*/
-public class ThreadpoolVerifierAdvanced extends ThreadPoolVerifier{
+public class ThreadpoolVerifierAdvanced extends ThreadPoolVerifier {
- public ThreadpoolVerifierAdvanced(ThreadPoolExecutor executor){
+ public ThreadpoolVerifierAdvanced(final ThreadPoolExecutor executor) {
super(executor);
}
diff --git a/src/main/java/org/rometools/certiorem/hub/verify/standard/UnthreadedVerifier.java b/src/main/java/org/rometools/certiorem/hub/verify/standard/UnthreadedVerifier.java
index d0859ee..69b1f19 100644
--- a/src/main/java/org/rometools/certiorem/hub/verify/standard/UnthreadedVerifier.java
+++ b/src/main/java/org/rometools/certiorem/hub/verify/standard/UnthreadedVerifier.java
@@ -16,25 +16,24 @@
* limitations under the License.
*/
-
-
package org.rometools.certiorem.hub.verify.standard;
import org.rometools.certiorem.hub.data.Subscriber;
/**
* A verifier that does not use threads. Suitable for Google App Engine.
+ *
* @author robert.cooper
*/
-public class UnthreadedVerifier extends AbstractVerifier{
+public class UnthreadedVerifier extends AbstractVerifier {
@Override
- public void verifySubscribeAsyncronously(Subscriber subscriber, VerificationCallback callback) {
+ public void verifySubscribeAsyncronously(final Subscriber subscriber, final VerificationCallback callback) {
callback.onVerify(verifySubcribeSyncronously(subscriber));
}
@Override
- public void verifyUnsubscribeAsyncronously(Subscriber subscriber, VerificationCallback callback) {
+ public void verifyUnsubscribeAsyncronously(final Subscriber subscriber, final VerificationCallback callback) {
callback.onVerify(verifyUnsubcribeSyncronously(subscriber));
}
diff --git a/src/main/java/org/rometools/certiorem/pub/NotificationException.java b/src/main/java/org/rometools/certiorem/pub/NotificationException.java
index 8075e5f..9138694 100644
--- a/src/main/java/org/rometools/certiorem/pub/NotificationException.java
+++ b/src/main/java/org/rometools/certiorem/pub/NotificationException.java
@@ -16,20 +16,19 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.pub;
/**
- *
+ *
* @author robert.cooper
*/
public class NotificationException extends Exception {
- public NotificationException(String message){
+ public NotificationException(final String message) {
super(message);
}
- public NotificationException(String message, Throwable cause){
+ public NotificationException(final String message, final Throwable cause) {
super(message, cause);
}
diff --git a/src/main/java/org/rometools/certiorem/pub/Publisher.java b/src/main/java/org/rometools/certiorem/pub/Publisher.java
index bc9f21a..5ac17b6 100644
--- a/src/main/java/org/rometools/certiorem/pub/Publisher.java
+++ b/src/main/java/org/rometools/certiorem/pub/Publisher.java
@@ -16,28 +16,24 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.pub;
-import com.sun.syndication.feed.synd.SyndFeed;
-import com.sun.syndication.feed.synd.SyndLink;
-
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
-
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
-
-import java.util.List;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.logging.Level;
import java.util.logging.Logger;
+import com.sun.syndication.feed.synd.SyndFeed;
+import com.sun.syndication.feed.synd.SyndLink;
/**
* A class for sending update notifications to a hub.
+ *
* @author robert.cooper
*/
public class Publisher {
@@ -52,61 +48,57 @@ public class Publisher {
/**
* Constructs a new publisher with an optional ThreadPoolExector for sending updates.
*/
- public Publisher(ThreadPoolExecutor executor) {
+ public Publisher(final ThreadPoolExecutor executor) {
this.executor = executor;
}
/**
* Sends the HUB url a notification of a change in topic
+ *
* @param hub URL of the hub to notify.
- * @param topic The Topic that has changed
+ * @param topic The Topic that has changed
* @throws NotificationException Any failure
*/
- public void sendUpdateNotification(String hub, String topic)
- throws NotificationException {
+ public void sendUpdateNotification(final String hub, final String topic) throws NotificationException {
try {
- StringBuilder sb = new StringBuilder("hub.mode=publish&hub.url=").append(URLEncoder.encode(topic, "UTF-8"));
- URL hubUrl = new URL(hub);
- HttpURLConnection connection = (HttpURLConnection) hubUrl.openConnection();
-// connection.setRequestProperty("Host", hubUrl.getHost());
+ final StringBuilder sb = new StringBuilder("hub.mode=publish&hub.url=").append(URLEncoder.encode(topic, "UTF-8"));
+ final URL hubUrl = new URL(hub);
+ final HttpURLConnection connection = (HttpURLConnection) hubUrl.openConnection();
+ // connection.setRequestProperty("Host", hubUrl.getHost());
connection.setRequestProperty("User-Agent", "ROME-Certiorem");
connection.setRequestProperty("ContentType", "application/x-www-form-urlencoded");
connection.setDoOutput(true);
connection.connect();
- OutputStream os = connection.getOutputStream();
+ final OutputStream os = connection.getOutputStream();
os.write(sb.toString().getBytes("UTF-8"));
os.close();
- int rc = connection.getResponseCode();
+ final int rc = connection.getResponseCode();
connection.disconnect();
-
+
if (rc != 204) {
- throw new NotificationException("Server returned an unexcepted response code: " + rc + " " +
- connection.getResponseMessage());
+ throw new NotificationException("Server returned an unexcepted response code: " + rc + " " + connection.getResponseMessage());
}
-
- } catch (UnsupportedEncodingException ex) {
- Logger.getLogger(Publisher.class.getName())
- .log(Level.SEVERE, null, ex);
+ } catch (final UnsupportedEncodingException ex) {
+ Logger.getLogger(Publisher.class.getName()).log(Level.SEVERE, null, ex);
throw new NotificationException("Could not encode URL", ex);
- } catch (IOException ex) {
- Logger.getLogger(Publisher.class.getName())
- .log(Level.SEVERE, null, ex);
+ } catch (final IOException ex) {
+ Logger.getLogger(Publisher.class.getName()).log(Level.SEVERE, null, ex);
throw new NotificationException("Unable to communicate with " + hub, ex);
}
}
/**
* Sends a notification for a feed located at "topic". The feed MUST contain rel="hub".
+ *
* @param topic URL for the feed
* @param feed The feed itself
* @throws NotificationException Any failure
*/
- public void sendUpdateNotification(String topic, SyndFeed feed)
- throws NotificationException {
- for (SyndLink link : (List) feed.getLinks()) {
+ public void sendUpdateNotification(final String topic, final SyndFeed feed) throws NotificationException {
+ for (final SyndLink link : feed.getLinks()) {
if ("hub".equals(link.getRel())) {
sendUpdateNotification(link.getRel(), topic);
@@ -118,14 +110,15 @@ public class Publisher {
/**
* Sends a notification for a feed. The feed MUST contain rel="hub" and rel="self" links.
+ *
* @param feed The feed to notify
* @throws NotificationException Any failure
*/
- public void sendUpdateNotification(SyndFeed feed) throws NotificationException {
+ public void sendUpdateNotification(final SyndFeed feed) throws NotificationException {
SyndLink hub = null;
SyndLink self = null;
- for (SyndLink link : (List) feed.getLinks()) {
+ for (final SyndLink link : feed.getLinks()) {
if ("hub".equals(link.getRel())) {
hub = link;
}
@@ -134,7 +127,7 @@ public class Publisher {
self = link;
}
- if ((hub != null) && (self != null)) {
+ if (hub != null && self != null) {
break;
}
}
@@ -152,27 +145,27 @@ public class Publisher {
/**
* Sends the HUB url a notification of a change in topic asynchronously
+ *
* @param hub URL of the hub to notify.
- * @param topic The Topic that has changed
- * @param callback A callback invoked when the notification completes.
+ * @param topic The Topic that has changed
+ * @param callback A callback invoked when the notification completes.
* @throws NotificationException Any failure
*/
- public void sendUpdateNotificationAsyncronously(final String hub, final String topic,
- final AsyncNotificationCallback callback) {
- Runnable r = new Runnable() {
- @Override
- public void run() {
- try {
- sendUpdateNotification(hub, topic);
- callback.onSuccess();
- } catch (Throwable t) {
- callback.onFailure(t);
- }
+ public void sendUpdateNotificationAsyncronously(final String hub, final String topic, final AsyncNotificationCallback callback) {
+ final Runnable r = new Runnable() {
+ @Override
+ public void run() {
+ try {
+ sendUpdateNotification(hub, topic);
+ callback.onSuccess();
+ } catch (final Throwable t) {
+ callback.onFailure(t);
}
- };
+ }
+ };
- if (this.executor != null) {
- this.executor.execute(r);
+ if (executor != null) {
+ executor.execute(r);
} else {
new Thread(r).start();
}
@@ -180,66 +173,70 @@ public class Publisher {
/**
* Asynchronously sends a notification for a feed located at "topic". The feed MUST contain rel="hub".
+ *
* @param topic URL for the feed
* @param feed The feed itself
- * @param callback A callback invoked when the notification completes.
+ * @param callback A callback invoked when the notification completes.
* @throws NotificationException Any failure
*/
- public void sendUpdateNotificationAsyncronously(final String topic, final SyndFeed feed,
- final AsyncNotificationCallback callback) {
- Runnable r = new Runnable() {
- @Override
- public void run() {
- try {
- sendUpdateNotification(topic, feed);
- callback.onSuccess();
- } catch (Throwable t) {
- callback.onFailure(t);
- }
+ public void sendUpdateNotificationAsyncronously(final String topic, final SyndFeed feed, final AsyncNotificationCallback callback) {
+ final Runnable r = new Runnable() {
+ @Override
+ public void run() {
+ try {
+ sendUpdateNotification(topic, feed);
+ callback.onSuccess();
+ } catch (final Throwable t) {
+ callback.onFailure(t);
}
- };
+ }
+ };
- if (this.executor != null) {
- this.executor.execute(r);
+ if (executor != null) {
+ executor.execute(r);
} else {
new Thread(r).start();
}
}
/**
- * Asyncronously sends a notification for a feed. The feed MUST contain rel="hub" and rel="self" links.
+ * Asyncronously sends a notification for a feed. The feed MUST contain rel="hub" and rel="self" links.
+ *
* @param feed The feed to notify
- * @param callback A callback invoked when the notification completes.
+ * @param callback A callback invoked when the notification completes.
* @throws NotificationException Any failure
*/
public void sendUpdateNotificationAsyncronously(final SyndFeed feed, final AsyncNotificationCallback callback) {
- Runnable r = new Runnable() {
- @Override
- public void run() {
- try {
- sendUpdateNotification(feed);
- callback.onSuccess();
- } catch (Throwable t) {
- callback.onFailure(t);
- }
+ final Runnable r = new Runnable() {
+ @Override
+ public void run() {
+ try {
+ sendUpdateNotification(feed);
+ callback.onSuccess();
+ } catch (final Throwable t) {
+ callback.onFailure(t);
}
- };
+ }
+ };
- if (this.executor != null) {
- this.executor.execute(r);
+ if (executor != null) {
+ executor.execute(r);
} else {
new Thread(r).start();
}
}
+
/**
* A callback interface for asynchronous notifications.
*/
public static interface AsyncNotificationCallback {
/**
* Called when a notification fails
+ *
* @param thrown Whatever was thrown during the failure
*/
public void onFailure(Throwable thrown);
+
/**
* Invoked with the asyncronous notification completes successfully.
*/
diff --git a/src/main/java/org/rometools/certiorem/sub/Requester.java b/src/main/java/org/rometools/certiorem/sub/Requester.java
index 72d9481..3bfce54 100644
--- a/src/main/java/org/rometools/certiorem/sub/Requester.java
+++ b/src/main/java/org/rometools/certiorem/sub/Requester.java
@@ -20,17 +20,15 @@ package org.rometools.certiorem.sub;
import org.rometools.certiorem.sub.data.Subscription;
-
/**
- *
+ *
* @author robert.cooper
*/
public interface Requester {
- public void sendSubscribeRequest(String hubUrl, Subscription subscription, String verifySync, long leaseSeconds,
- String secret, String callbackUrl, RequestCallback callback);
+ public void sendSubscribeRequest(String hubUrl, Subscription subscription, String verifySync, long leaseSeconds, String secret, String callbackUrl,
+ RequestCallback callback);
- public void sendUnsubscribeRequest(String hubUrl, Subscription subscription, String verifySync, String secret,
- String callbackUrl, RequestCallback callback);
+ public void sendUnsubscribeRequest(String hubUrl, Subscription subscription, String verifySync, String secret, String callbackUrl, RequestCallback callback);
public static interface RequestCallback {
public void onFailure(Exception e);
diff --git a/src/main/java/org/rometools/certiorem/sub/Subscriptions.java b/src/main/java/org/rometools/certiorem/sub/Subscriptions.java
index 32492d2..1f04342 100644
--- a/src/main/java/org/rometools/certiorem/sub/Subscriptions.java
+++ b/src/main/java/org/rometools/certiorem/sub/Subscriptions.java
@@ -18,104 +18,95 @@
package org.rometools.certiorem.sub;
-import com.sun.syndication.feed.synd.SyndFeed;
-import com.sun.syndication.feed.synd.SyndLink;
-import com.sun.syndication.io.FeedException;
-import com.sun.syndication.io.SyndFeedInput;
-
-import org.rometools.certiorem.HttpStatusCodeException;
-import org.rometools.certiorem.sub.Requester.RequestCallback;
-import org.rometools.certiorem.sub.data.SubDAO;
-import org.rometools.certiorem.sub.data.Subscription;
-
-import org.rometools.fetcher.impl.FeedFetcherCache;
-import org.rometools.fetcher.impl.SyndFeedInfo;
-
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
-
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
-
-import java.util.List;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
-import org.rometools.certiorem.sub.data.SubscriptionCallback;
+import org.rometools.certiorem.HttpStatusCodeException;
+import org.rometools.certiorem.sub.Requester.RequestCallback;
+import org.rometools.certiorem.sub.data.SubDAO;
+import org.rometools.certiorem.sub.data.Subscription;
+import org.rometools.certiorem.sub.data.SubscriptionCallback;
+import org.rometools.fetcher.impl.FeedFetcherCache;
+import org.rometools.fetcher.impl.SyndFeedInfo;
+
+import com.sun.syndication.feed.synd.SyndFeed;
+import com.sun.syndication.feed.synd.SyndLink;
+import com.sun.syndication.io.FeedException;
+import com.sun.syndication.io.SyndFeedInput;
/**
- *
+ *
* @author robert.cooper
*/
public class Subscriptions {
- //TODO unsubscribe.
+ // TODO unsubscribe.
private FeedFetcherCache cache;
private Requester requester;
private String callbackPrefix;
private SubDAO dao;
- public Subscriptions() {
+ public Subscriptions() {
}
-
- public Subscriptions(final FeedFetcherCache cache, final Requester requester, final String callbackPrefix,
- final SubDAO dao) {
+
+ public Subscriptions(final FeedFetcherCache cache, final Requester requester, final String callbackPrefix, final SubDAO dao) {
this.cache = cache;
this.requester = requester;
this.callbackPrefix = callbackPrefix;
this.dao = dao;
}
- public void callback(String callbackPath, String feed) {
+ public void callback(final String callbackPath, final String feed) {
try {
this.callback(callbackPath, feed.getBytes("UTF-8"));
- } catch (UnsupportedEncodingException ex) {
- Logger.getLogger(Subscriptions.class.getName())
- .log(Level.SEVERE, null, ex);
+ } catch (final UnsupportedEncodingException ex) {
+ Logger.getLogger(Subscriptions.class.getName()).log(Level.SEVERE, null, ex);
throw new HttpStatusCodeException(400, "Unable to parse feed.", ex);
}
}
- public void callback(String callbackPath, InputStream feed) {
- SyndFeedInput input = new SyndFeedInput();
+ public void callback(final String callbackPath, final InputStream feed) {
+ final SyndFeedInput input = new SyndFeedInput();
try {
this.callback(callbackPath, input.build(new InputStreamReader(feed)));
- } catch (IllegalArgumentException ex) {
- Logger.getLogger(Subscriptions.class.getName())
- .log(Level.SEVERE, null, ex);
+ } catch (final IllegalArgumentException ex) {
+ Logger.getLogger(Subscriptions.class.getName()).log(Level.SEVERE, null, ex);
throw new HttpStatusCodeException(500, "Unable to parse feed.", ex);
- } catch (FeedException ex) {
- Logger.getLogger(Subscriptions.class.getName())
- .log(Level.SEVERE, null, ex);
+ } catch (final FeedException ex) {
+ Logger.getLogger(Subscriptions.class.getName()).log(Level.SEVERE, null, ex);
throw new HttpStatusCodeException(400, "Unable to parse feed.", ex);
}
}
- public void callback(String callbackPath, byte[] feed) {
+ public void callback(final String callbackPath, final byte[] feed) {
this.callback(callbackPath, new ByteArrayInputStream(feed));
}
- public void callback(String callbackPath, SyndFeed feed) {
+ public void callback(final String callbackPath, final SyndFeed feed) {
if (!callbackPath.startsWith(callbackPrefix)) {
- throw new HttpStatusCodeException(404, "Not a valid callback prefix.", new Exception(callbackPath+" doesnt start with "+callbackPrefix));
+ throw new HttpStatusCodeException(404, "Not a valid callback prefix.", new Exception(callbackPath + " doesnt start with " + callbackPrefix));
}
- String id = callbackPath.substring(callbackPrefix.length());
+ final String id = callbackPath.substring(callbackPrefix.length());
Logger.getLogger(Subscriptions.class.getName()).log(Level.FINE, "Got callback for {0}", id);
- Subscription s = dao.findById(id);
+ final Subscription s = dao.findById(id);
if (s == null) {
throw new HttpStatusCodeException(404, "Not a valid callback.", null);
}
- this.validateLink(feed, s.getSourceUrl());
+ validateLink(feed, s.getSourceUrl());
SyndFeedInfo info = null;
URL url = null;
@@ -123,9 +114,8 @@ public class Subscriptions {
try {
url = new URL(s.getSourceUrl());
info = cache.getFeedInfo(url);
- } catch (MalformedURLException ex) {
- Logger.getLogger(Subscriptions.class.getName())
- .log(Level.SEVERE, null, ex);
+ } catch (final MalformedURLException ex) {
+ Logger.getLogger(Subscriptions.class.getName()).log(Level.SEVERE, null, ex);
}
if (info == null) {
@@ -141,58 +131,53 @@ public class Subscriptions {
s.getCallback().onNotify(s, info);
}
- public void unsubscribe(final Subscription subscription, String hubUrl, boolean sync, String secret,
- final SubscriptionCallback callback) {
+ public void unsubscribe(final Subscription subscription, final String hubUrl, final boolean sync, final String secret, final SubscriptionCallback callback) {
subscription.setUnsubscribed(true);
- this.requester.sendUnsubscribeRequest(hubUrl, subscription, (sync ? "sync" : "async"), secret,
- this.callbackPrefix + subscription.getId(),
- new RequestCallback() {
- @Override
- public void onSuccess() {
- callback.onUnsubscribe(subscription);
- }
+ requester.sendUnsubscribeRequest(hubUrl, subscription, sync ? "sync" : "async", secret, callbackPrefix + subscription.getId(), new RequestCallback() {
+ @Override
+ public void onSuccess() {
+ callback.onUnsubscribe(subscription);
+ }
- @Override
- public void onFailure(Exception e) {
- callback.onFailure(e);
- }
- });
+ @Override
+ public void onFailure(final Exception e) {
+ callback.onFailure(e);
+ }
+ });
}
-
- public void subscribe(String hubUrl, String topic, boolean sync, long leaseSeconds, String secret,
- final SubscriptionCallback callback) {
- Subscription s = new Subscription();
+
+ public void subscribe(final String hubUrl, final String topic, final boolean sync, final long leaseSeconds, final String secret,
+ final SubscriptionCallback callback) {
+ final Subscription s = new Subscription();
s.setId(UUID.randomUUID().toString());
s.setVerifyToken(UUID.randomUUID().toString());
s.setSourceUrl(topic);
s.setCallback(callback);
if (leaseSeconds > 0) {
- s.setExpirationTime(System.currentTimeMillis() + (leaseSeconds * 1000));
+ s.setExpirationTime(System.currentTimeMillis() + leaseSeconds * 1000);
}
- final Subscription stored = this.dao.addSubscription(s);
+ final Subscription stored = dao.addSubscription(s);
- this.requester.sendSubscribeRequest(hubUrl, stored, (sync ? "sync" : "async"), leaseSeconds, secret,
- this.callbackPrefix + stored.getId(),
- new RequestCallback() {
- @Override
- public void onSuccess() {
- callback.onSubscribe(stored);
- }
+ requester.sendSubscribeRequest(hubUrl, stored, sync ? "sync" : "async", leaseSeconds, secret, callbackPrefix + stored.getId(), new RequestCallback() {
+ @Override
+ public void onSuccess() {
+ callback.onSubscribe(stored);
+ }
- @Override
- public void onFailure(Exception e) {
- callback.onFailure(e);
- }
- });
+ @Override
+ public void onFailure(final Exception e) {
+ callback.onFailure(e);
+ }
+ });
}
- public void subscribe(String topic, boolean sync, long leaseSeconds, String secret,
- final SubscriptionCallback callback) throws IllegalArgumentException, IOException, FeedException {
- SyndFeedInput input = new SyndFeedInput();
- SyndFeed feed = input.build(new InputStreamReader(new URL(topic).openStream()));
- String hubUrl = this.findHubUrl(feed);
+ public void subscribe(final String topic, final boolean sync, final long leaseSeconds, final String secret, final SubscriptionCallback callback)
+ throws IllegalArgumentException, IOException, FeedException {
+ final SyndFeedInput input = new SyndFeedInput();
+ final SyndFeed feed = input.build(new InputStreamReader(new URL(topic).openStream()));
+ final String hubUrl = findHubUrl(feed);
if (hubUrl == null) {
throw new FeedException("No hub link");
@@ -201,20 +186,19 @@ public class Subscriptions {
this.subscribe(hubUrl, topic, sync, leaseSeconds, secret, callback);
}
- public String validate(String callbackPath, String topic, String mode, String challenge, String leaseSeconds,
- String verifyToken) {
+ public String validate(final String callbackPath, final String topic, final String mode, final String challenge, final String leaseSeconds,
+ final String verifyToken) {
if (!callbackPath.startsWith(callbackPrefix)) {
- throw new HttpStatusCodeException(404, "Not a valid callback prefix.", new Exception(callbackPath+" doesnt start with "+callbackPrefix));
+ throw new HttpStatusCodeException(404, "Not a valid callback prefix.", new Exception(callbackPath + " doesnt start with " + callbackPrefix));
}
- String id = callbackPath.substring(callbackPrefix.length());
+ final String id = callbackPath.substring(callbackPrefix.length());
Logger.getLogger(Subscriptions.class.getName()).log(Level.FINE, "Handling validation request for id {0}", id);
- Subscription s = dao.findById(id);
- if(s == null){
+ final Subscription s = dao.findById(id);
+ if (s == null) {
throw new HttpStatusCodeException(404, "Not a valid subscription id", null);
}
- if (!s.getVerifyToken()
- .equals(verifyToken)) {
+ if (!s.getVerifyToken().equals(verifyToken)) {
throw new HttpStatusCodeException(403, "Verification Token Mismatch.", null);
}
@@ -238,8 +222,8 @@ public class Subscriptions {
return challenge;
}
- private String findHubUrl(SyndFeed feed) {
- for (SyndLink l : (List) feed.getLinks()) {
+ private String findHubUrl(final SyndFeed feed) {
+ for (final SyndLink l : feed.getLinks()) {
if ("hub".equals(l.getRel())) {
return l.getHref();
}
@@ -248,21 +232,20 @@ public class Subscriptions {
return null;
}
- private void validateLink(SyndFeed feed, String source) {
- for (SyndLink l : (List) feed.getLinks()) {
+ private void validateLink(final SyndFeed feed, final String source) {
+ for (final SyndLink l : feed.getLinks()) {
if ("self".equalsIgnoreCase(l.getRel())) {
try {
- URI u = new URI(l.getHref());
- URI t = new URI(source);
+ final URI u = new URI(l.getHref());
+ final URI t = new URI(source);
if (!u.equals(t)) {
throw new HttpStatusCodeException(400, "Feed self link does not match the subscribed URI.", null);
}
break;
- } catch (URISyntaxException ex) {
- Logger.getLogger(Subscriptions.class.getName())
- .log(Level.SEVERE, null, ex);
+ } catch (final URISyntaxException ex) {
+ Logger.getLogger(Subscriptions.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
@@ -271,28 +254,28 @@ public class Subscriptions {
/**
* @param cache the cache to set
*/
- public void setCache(FeedFetcherCache cache) {
+ public void setCache(final FeedFetcherCache cache) {
this.cache = cache;
}
/**
* @param requester the requester to set
*/
- public void setRequester(Requester requester) {
+ public void setRequester(final Requester requester) {
this.requester = requester;
}
/**
* @param callbackPrefix the callbackPrefix to set
*/
- public void setCallbackPrefix(String callbackPrefix) {
+ public void setCallbackPrefix(final String callbackPrefix) {
this.callbackPrefix = callbackPrefix;
}
/**
* @param dao the dao to set
*/
- public void setDao(SubDAO dao) {
+ public void setDao(final SubDAO dao) {
this.dao = dao;
}
}
diff --git a/src/main/java/org/rometools/certiorem/sub/data/SubDAO.java b/src/main/java/org/rometools/certiorem/sub/data/SubDAO.java
index 0eb12d0..dac96f5 100644
--- a/src/main/java/org/rometools/certiorem/sub/data/SubDAO.java
+++ b/src/main/java/org/rometools/certiorem/sub/data/SubDAO.java
@@ -16,11 +16,10 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.sub.data;
/**
- *
+ *
* @author robert.cooper
*/
public interface SubDAO {
diff --git a/src/main/java/org/rometools/certiorem/sub/data/Subscription.java b/src/main/java/org/rometools/certiorem/sub/data/Subscription.java
index 5aa1de2..c6f19c6 100644
--- a/src/main/java/org/rometools/certiorem/sub/data/Subscription.java
+++ b/src/main/java/org/rometools/certiorem/sub/data/Subscription.java
@@ -20,9 +20,8 @@ package org.rometools.certiorem.sub.data;
import java.io.Serializable;
-
/**
- *
+ *
* @author robert.cooper
*/
public class Subscription implements Serializable {
@@ -36,110 +35,110 @@ public class Subscription implements Serializable {
/**
* Set the value of expirationTime
- *
+ *
* @param newexpirationTime new value of expirationTime
*/
- public void setExpirationTime(long newexpirationTime) {
- this.expirationTime = newexpirationTime;
+ public void setExpirationTime(final long newexpirationTime) {
+ expirationTime = newexpirationTime;
}
/**
* Get the value of expirationTime
- *
+ *
* @return the value of expirationTime
*/
public long getExpirationTime() {
- return this.expirationTime;
+ return expirationTime;
}
/**
* Set the value of id
- *
+ *
* @param newid new value of id
*/
- public void setId(String newid) {
- this.id = newid;
+ public void setId(final String newid) {
+ id = newid;
}
/**
* Get the value of id
- *
+ *
* @return the value of id
*/
public String getId() {
- return this.id;
+ return id;
}
/**
* Set the value of sourceUrl
- *
+ *
* @param newsourceUrl new value of sourceUrl
*/
- public void setSourceUrl(String newsourceUrl) {
- this.sourceUrl = newsourceUrl;
+ public void setSourceUrl(final String newsourceUrl) {
+ sourceUrl = newsourceUrl;
}
/**
* Get the value of sourceUrl
- *
+ *
* @return the value of sourceUrl
*/
public String getSourceUrl() {
- return this.sourceUrl;
+ return sourceUrl;
}
/**
* Set the value of unsubscribed
- *
+ *
* @param newunsubscribed new value of unsubscribed
*/
- public void setUnsubscribed(boolean newunsubscribed) {
- this.unsubscribed = newunsubscribed;
+ public void setUnsubscribed(final boolean newunsubscribed) {
+ unsubscribed = newunsubscribed;
}
/**
* Get the value of unsubscribed
- *
+ *
* @return the value of unsubscribed
*/
public boolean isUnsubscribed() {
- return this.unsubscribed;
+ return unsubscribed;
}
/**
* Set the value of validated
- *
+ *
* @param newvalidated new value of validated
*/
- public void setValidated(boolean newvalidated) {
- this.validated = newvalidated;
+ public void setValidated(final boolean newvalidated) {
+ validated = newvalidated;
}
/**
* Get the value of validated
- *
+ *
* @return the value of validated
*/
public boolean isValidated() {
- return this.validated;
+ return validated;
}
/**
* Set the value of verifyToken
- *
+ *
* @param newverifyToken new value of verifyToken
*/
- public void setVerifyToken(String newverifyToken) {
- this.verifyToken = newverifyToken;
+ public void setVerifyToken(final String newverifyToken) {
+ verifyToken = newverifyToken;
}
/**
* Get the value of verifyToken
- *
+ *
* @return the value of verifyToken
*/
public String getVerifyToken() {
- return this.verifyToken;
+ return verifyToken;
}
/**
@@ -152,7 +151,7 @@ public class Subscription implements Serializable {
/**
* @param callback the callback to set
*/
- public void setCallback(SubscriptionCallback callback) {
+ public void setCallback(final SubscriptionCallback callback) {
this.callback = callback;
}
}
diff --git a/src/main/java/org/rometools/certiorem/sub/data/SubscriptionCallback.java b/src/main/java/org/rometools/certiorem/sub/data/SubscriptionCallback.java
index 6c050a5..01018df 100644
--- a/src/main/java/org/rometools/certiorem/sub/data/SubscriptionCallback.java
+++ b/src/main/java/org/rometools/certiorem/sub/data/SubscriptionCallback.java
@@ -8,7 +8,7 @@ package org.rometools.certiorem.sub.data;
import org.rometools.fetcher.impl.SyndFeedInfo;
/**
- *
+ *
* @author najmi
*/
public interface SubscriptionCallback {
@@ -18,6 +18,6 @@ public interface SubscriptionCallback {
void onFailure(Exception e);
void onSubscribe(Subscription subscribed);
-
+
void onUnsubscribe(Subscription subscribed);
}
diff --git a/src/main/java/org/rometools/certiorem/sub/data/ram/InMemorySubDAO.java b/src/main/java/org/rometools/certiorem/sub/data/ram/InMemorySubDAO.java
index 9cb0587..0e50fce 100644
--- a/src/main/java/org/rometools/certiorem/sub/data/ram/InMemorySubDAO.java
+++ b/src/main/java/org/rometools/certiorem/sub/data/ram/InMemorySubDAO.java
@@ -27,25 +27,27 @@ import java.util.Date;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
+
import org.rometools.certiorem.sub.data.SubDAO;
import org.rometools.certiorem.sub.data.Subscription;
/**
- *
+ *
* @author robert.cooper
*/
public class InMemorySubDAO implements SubDAO {
- private ConcurrentHashMap subscriptions = new ConcurrentHashMap();
+ private final ConcurrentHashMap subscriptions = new ConcurrentHashMap();
@Override
- public Subscription findById(String id) {
- Subscription s = subscriptions.get(id);
- if(s == null){
+ public Subscription findById(final String id) {
+ final Subscription s = subscriptions.get(id);
+ if (s == null) {
return null;
}
- if(s.getExpirationTime() > 0 && s.getExpirationTime() <= System.currentTimeMillis()){
- Logger.getLogger(InMemorySubDAO.class.getName()).log(Level.FINE, "Subscription {0} expired at {1}", new Object[]{s.getSourceUrl(), new Date(s.getExpirationTime())});
+ if (s.getExpirationTime() > 0 && s.getExpirationTime() <= System.currentTimeMillis()) {
+ Logger.getLogger(InMemorySubDAO.class.getName()).log(Level.FINE, "Subscription {0} expired at {1}",
+ new Object[] { s.getSourceUrl(), new Date(s.getExpirationTime()) });
subscriptions.remove(id);
return null;
@@ -54,20 +56,20 @@ public class InMemorySubDAO implements SubDAO {
}
@Override
- public Subscription addSubscription(Subscription s) {
+ public Subscription addSubscription(final Subscription s) {
subscriptions.put(s.getId(), s);
- Logger.getLogger(InMemorySubDAO.class.getName()).log(Level.FINE, "Stored subscription {0} {1}", new Object[]{s.getSourceUrl(), s.getId()});
+ Logger.getLogger(InMemorySubDAO.class.getName()).log(Level.FINE, "Stored subscription {0} {1}", new Object[] { s.getSourceUrl(), s.getId() });
return s;
}
@Override
- public Subscription updateSubscription(Subscription s) {
+ public Subscription updateSubscription(final Subscription s) {
subscriptions.put(s.getId(), s);
return s;
}
@Override
- public void removeSubscription(Subscription s) {
+ public void removeSubscription(final Subscription s) {
subscriptions.remove(s.getId());
}
diff --git a/src/main/java/org/rometools/certiorem/sub/request/AbstractRequester.java b/src/main/java/org/rometools/certiorem/sub/request/AbstractRequester.java
index ff32ca5..532260f 100644
--- a/src/main/java/org/rometools/certiorem/sub/request/AbstractRequester.java
+++ b/src/main/java/org/rometools/certiorem/sub/request/AbstractRequester.java
@@ -16,64 +16,51 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.sub.request;
-import org.rometools.certiorem.sub.Requester;
-import org.rometools.certiorem.sub.data.Subscription;
-
import java.io.IOException;
-
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
+import org.rometools.certiorem.sub.Requester;
+import org.rometools.certiorem.sub.data.Subscription;
/**
- *
+ *
* @author robert.cooper
*/
public abstract class AbstractRequester implements Requester {
-
- protected boolean sendRequest(String hubUrl, String mode, Subscription subscription, String verifySync,
- long leaseSeconds, String secret, String callbackUrl, RequestCallback callback)
- throws IOException {
- StringBuilder sb = new StringBuilder("hub.callback=").append(URLEncoder.encode(callbackUrl, "UTF-8"))
- .append("&hub.topic=")
- .append(URLEncoder.encode(subscription.getSourceUrl(),
- "UTF-8"))
- .append("&hub.verify=")
- .append(URLEncoder.encode(verifySync, "UTF-8"))
- .append("&hub.mode=")
- .append(URLEncoder.encode(mode, "UTF-8"));
+
+ protected boolean sendRequest(final String hubUrl, final String mode, final Subscription subscription, final String verifySync, final long leaseSeconds,
+ final String secret, final String callbackUrl, final RequestCallback callback) throws IOException {
+ final StringBuilder sb = new StringBuilder("hub.callback=").append(URLEncoder.encode(callbackUrl, "UTF-8")).append("&hub.topic=")
+ .append(URLEncoder.encode(subscription.getSourceUrl(), "UTF-8")).append("&hub.verify=").append(URLEncoder.encode(verifySync, "UTF-8"))
+ .append("&hub.mode=").append(URLEncoder.encode(mode, "UTF-8"));
if (leaseSeconds > 0) {
- sb.append("&hub.lease_seconds=")
- .append(Long.toString(leaseSeconds));
+ sb.append("&hub.lease_seconds=").append(Long.toString(leaseSeconds));
}
if (secret != null) {
- sb.append("&hub.secret=")
- .append(URLEncoder.encode(secret, "UTF-8"));
+ sb.append("&hub.secret=").append(URLEncoder.encode(secret, "UTF-8"));
}
if (subscription.getVerifyToken() != null) {
- sb.append("&hub.verify_token=")
- .append(URLEncoder.encode(subscription.getVerifyToken(), "UTF-8"));
+ sb.append("&hub.verify_token=").append(URLEncoder.encode(subscription.getVerifyToken(), "UTF-8"));
}
- URL url = new URL(hubUrl);
- HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ final URL url = new URL(hubUrl);
+ final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setDoOutput(true);
-// connection.setRequestProperty("Host", url.getHost());
+ // connection.setRequestProperty("Host", url.getHost());
connection.setRequestProperty("User-Agent", "ROME-Certiorem");
connection.connect();
- connection.getOutputStream()
- .write(sb.toString().getBytes("UTF-8"));
+ connection.getOutputStream().write(sb.toString().getBytes("UTF-8"));
- int rc = connection.getResponseCode();
+ final int rc = connection.getResponseCode();
connection.disconnect();
if (rc != 204) {
diff --git a/src/main/java/org/rometools/certiorem/sub/request/AsyncRequester.java b/src/main/java/org/rometools/certiorem/sub/request/AsyncRequester.java
index c345410..305a12b 100644
--- a/src/main/java/org/rometools/certiorem/sub/request/AsyncRequester.java
+++ b/src/main/java/org/rometools/certiorem/sub/request/AsyncRequester.java
@@ -18,57 +18,53 @@
package org.rometools.certiorem.sub.request;
-import org.rometools.certiorem.sub.data.Subscription;
-
import java.io.IOException;
-
import java.util.logging.Level;
import java.util.logging.Logger;
+import org.rometools.certiorem.sub.data.Subscription;
/**
* A simple requester implementation that always makes requests as Async.
+ *
* @author robert.cooper
*/
public class AsyncRequester extends AbstractRequester {
@Override
- public void sendSubscribeRequest(final String hubUrl, final Subscription subscription, final String verifySync,
- final long leaseSeconds, final String secret, final String callbackUrl, final RequestCallback callback) {
- Logger.getLogger(AsyncRequester.class.getName()).log(Level.FINE, "Sending subscribe request to {0} for {1} to {2}", new Object[]{hubUrl, subscription.getSourceUrl(), callbackUrl});
- Runnable r = new Runnable() {
- @Override
- public void run() {
- try {
- sendRequest(hubUrl, "subscribe", subscription, verifySync, leaseSeconds, secret, callbackUrl,
- callback);
- } catch (Exception ex) {
- Logger.getLogger(AsyncRequester.class.getName())
- .log(Level.SEVERE, null, ex);
- callback.onFailure(ex);
- }
+ public void sendSubscribeRequest(final String hubUrl, final Subscription subscription, final String verifySync, final long leaseSeconds,
+ final String secret, final String callbackUrl, final RequestCallback callback) {
+ Logger.getLogger(AsyncRequester.class.getName()).log(Level.FINE, "Sending subscribe request to {0} for {1} to {2}",
+ new Object[] { hubUrl, subscription.getSourceUrl(), callbackUrl });
+ final Runnable r = new Runnable() {
+ @Override
+ public void run() {
+ try {
+ sendRequest(hubUrl, "subscribe", subscription, verifySync, leaseSeconds, secret, callbackUrl, callback);
+ } catch (final Exception ex) {
+ Logger.getLogger(AsyncRequester.class.getName()).log(Level.SEVERE, null, ex);
+ callback.onFailure(ex);
}
- };
- new Thread(r).start();
+ }
+ };
+ new Thread(r).start();
}
@Override
- public void sendUnsubscribeRequest(final String hubUrl, final Subscription subscription, final String verifySync,
- final String secret,
- final String callbackUrl, final RequestCallback callback) {
- Logger.getLogger(AsyncRequester.class.getName()).log(Level.FINE, "Sending unsubscribe request to {0} for {1} to {2}", new Object[]{hubUrl, subscription.getSourceUrl(), callbackUrl});
- Runnable r = new Runnable() {
- @Override
- public void run() {
- try {
- sendRequest(hubUrl, "unsubscribe", subscription, verifySync, -1, secret, callbackUrl,
- callback);
- } catch (IOException ex) {
- Logger.getLogger(AsyncRequester.class.getName())
- .log(Level.SEVERE, null, ex);
- callback.onFailure(ex);
- }
+ public void sendUnsubscribeRequest(final String hubUrl, final Subscription subscription, final String verifySync, final String secret,
+ final String callbackUrl, final RequestCallback callback) {
+ Logger.getLogger(AsyncRequester.class.getName()).log(Level.FINE, "Sending unsubscribe request to {0} for {1} to {2}",
+ new Object[] { hubUrl, subscription.getSourceUrl(), callbackUrl });
+ final Runnable r = new Runnable() {
+ @Override
+ public void run() {
+ try {
+ sendRequest(hubUrl, "unsubscribe", subscription, verifySync, -1, secret, callbackUrl, callback);
+ } catch (final IOException ex) {
+ Logger.getLogger(AsyncRequester.class.getName()).log(Level.SEVERE, null, ex);
+ callback.onFailure(ex);
}
- };
- new Thread(r).start();
+ }
+ };
+ new Thread(r).start();
}
}
diff --git a/src/main/java/org/rometools/certiorem/sub/request/SyncRequester.java b/src/main/java/org/rometools/certiorem/sub/request/SyncRequester.java
index 2f25229..5cd6d17 100644
--- a/src/main/java/org/rometools/certiorem/sub/request/SyncRequester.java
+++ b/src/main/java/org/rometools/certiorem/sub/request/SyncRequester.java
@@ -22,46 +22,42 @@
*/
package org.rometools.certiorem.sub.request;
-import org.rometools.certiorem.sub.data.Subscription;
-
import java.io.IOException;
-
import java.util.logging.Level;
import java.util.logging.Logger;
+import org.rometools.certiorem.sub.data.Subscription;
/**
* A simple requester implementation that always makes requests as Async.
+ *
* @author Farrukh Najmi
*/
public class SyncRequester extends AbstractRequester {
@Override
- public void sendSubscribeRequest(final String hubUrl, final Subscription subscription, final String verifySync,
- final long leaseSeconds, final String secret, final String callbackUrl, final RequestCallback callback) {
- Logger.getLogger(SyncRequester.class.getName()).log(Level.INFO, "Sending subscribe request to {0} for {1} to {2}", new Object[]{hubUrl, subscription.getSourceUrl(), callbackUrl});
+ public void sendSubscribeRequest(final String hubUrl, final Subscription subscription, final String verifySync, final long leaseSeconds,
+ final String secret, final String callbackUrl, final RequestCallback callback) {
+ Logger.getLogger(SyncRequester.class.getName()).log(Level.INFO, "Sending subscribe request to {0} for {1} to {2}",
+ new Object[] { hubUrl, subscription.getSourceUrl(), callbackUrl });
try {
- sendRequest(hubUrl, "subscribe", subscription, verifySync, leaseSeconds, secret, callbackUrl,
- callback);
+ sendRequest(hubUrl, "subscribe", subscription, verifySync, leaseSeconds, secret, callbackUrl, callback);
callback.onSuccess();
- } catch (Exception ex) {
- Logger.getLogger(SyncRequester.class.getName())
- .log(Level.SEVERE, null, ex);
+ } catch (final Exception ex) {
+ Logger.getLogger(SyncRequester.class.getName()).log(Level.SEVERE, null, ex);
callback.onFailure(ex);
}
}
@Override
- public void sendUnsubscribeRequest(final String hubUrl, final Subscription subscription, final String verifySync,
- final String secret,
- final String callbackUrl, final RequestCallback callback) {
- Logger.getLogger(SyncRequester.class.getName()).log(Level.INFO, "Sending unsubscribe request to {0} for {1} to {2}", new Object[]{hubUrl, subscription.getSourceUrl(), callbackUrl});
+ public void sendUnsubscribeRequest(final String hubUrl, final Subscription subscription, final String verifySync, final String secret,
+ final String callbackUrl, final RequestCallback callback) {
+ Logger.getLogger(SyncRequester.class.getName()).log(Level.INFO, "Sending unsubscribe request to {0} for {1} to {2}",
+ new Object[] { hubUrl, subscription.getSourceUrl(), callbackUrl });
try {
- sendRequest(hubUrl, "unsubscribe", subscription, verifySync, -1, secret, callbackUrl,
- callback);
+ sendRequest(hubUrl, "unsubscribe", subscription, verifySync, -1, secret, callbackUrl, callback);
callback.onSuccess();
- } catch (IOException ex) {
- Logger.getLogger(SyncRequester.class.getName())
- .log(Level.SEVERE, null, ex);
+ } catch (final IOException ex) {
+ Logger.getLogger(SyncRequester.class.getName()).log(Level.SEVERE, null, ex);
callback.onFailure(ex);
}
}
diff --git a/src/main/java/org/rometools/certiorem/web/AbstractHubServlet.java b/src/main/java/org/rometools/certiorem/web/AbstractHubServlet.java
index 091bc6d..64d9f31 100644
--- a/src/main/java/org/rometools/certiorem/web/AbstractHubServlet.java
+++ b/src/main/java/org/rometools/certiorem/web/AbstractHubServlet.java
@@ -16,14 +16,9 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.web;
-import org.rometools.certiorem.HttpStatusCodeException;
-import org.rometools.certiorem.hub.Hub;
-
import java.io.IOException;
-
import java.util.Arrays;
import javax.servlet.ServletException;
@@ -31,9 +26,11 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import org.rometools.certiorem.HttpStatusCodeException;
+import org.rometools.certiorem.hub.Hub;
/**
- *
+ *
* @author robert.cooper
*/
public abstract class AbstractHubServlet extends HttpServlet {
@@ -46,37 +43,34 @@ public abstract class AbstractHubServlet extends HttpServlet {
}
@Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
+ protected void doPost(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
try {
if ("publish".equals(req.getParameter(HUBMODE))) {
hub.sendNotification(req.getServerName(), req.getParameter("hub.url"));
} else {
- String callback = req.getParameter("hub.callback");
- String topic = req.getParameter("hub.topic");
- String[] verifies = req.getParameterValues("hub.verify");
- String leaseString = req.getParameter("hub.lease_seconds");
- String secret = req.getParameter("hub.secret");
- String verifyToken = req.getParameter("hub.verify_token");
- String verifyMode = Arrays.asList(verifies)
- .contains("async") ? "async" : "sync";
+ final String callback = req.getParameter("hub.callback");
+ final String topic = req.getParameter("hub.topic");
+ final String[] verifies = req.getParameterValues("hub.verify");
+ final String leaseString = req.getParameter("hub.lease_seconds");
+ final String secret = req.getParameter("hub.secret");
+ final String verifyToken = req.getParameter("hub.verify_token");
+ final String verifyMode = Arrays.asList(verifies).contains("async") ? "async" : "sync";
Boolean result = null;
if ("subscribe".equals(req.getParameter(HUBMODE))) {
- long leaseSeconds = (leaseString != null) ? Long.parseLong(leaseString) : (-1);
+ final long leaseSeconds = leaseString != null ? Long.parseLong(leaseString) : -1;
result = hub.subscribe(callback, topic, verifyMode, leaseSeconds, secret, verifyToken);
} else if ("unsubscribe".equals(req.getParameter(HUBMODE))) {
result = hub.unsubscribe(callback, topic, verifyMode, secret, verifyToken);
}
- if ((result != null) && !result) {
+ if (result != null && !result) {
throw new HttpStatusCodeException(500, "Operation failed.", null);
}
}
- } catch (HttpStatusCodeException sc) {
+ } catch (final HttpStatusCodeException sc) {
resp.setStatus(sc.getStatus());
- resp.getWriter()
- .println(sc.getMessage());
+ resp.getWriter().println(sc.getMessage());
return;
}
diff --git a/src/main/java/org/rometools/certiorem/web/AbstractSubServlet.java b/src/main/java/org/rometools/certiorem/web/AbstractSubServlet.java
index 5c74657..9a3d42e 100644
--- a/src/main/java/org/rometools/certiorem/web/AbstractSubServlet.java
+++ b/src/main/java/org/rometools/certiorem/web/AbstractSubServlet.java
@@ -16,45 +16,46 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.web;
import java.io.IOException;
+
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpUtils;
+
import org.rometools.certiorem.HttpStatusCodeException;
import org.rometools.certiorem.sub.Subscriptions;
/**
- *
+ *
* @author robert.cooper
*/
public class AbstractSubServlet extends HttpServlet {
private final Subscriptions subscriptions;
-
- protected AbstractSubServlet(final Subscriptions subscriptions){
+
+ protected AbstractSubServlet(final Subscriptions subscriptions) {
super();
this.subscriptions = subscriptions;
-
+
}
@Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String mode = req.getParameter("hub.mode");
- String topic = req.getParameter("hub.topic");
- String challenge = req.getParameter("hub.challenge");
- String leaseString = req.getParameter("hub.lease_seconds");
- String verifyToken = req.getParameter("hub.verify_token");
- try{
- String result = subscriptions.validate(HttpUtils.getRequestURL(req).toString(), topic, mode, challenge, leaseString, verifyToken);
+ protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
+ final String mode = req.getParameter("hub.mode");
+ final String topic = req.getParameter("hub.topic");
+ final String challenge = req.getParameter("hub.challenge");
+ final String leaseString = req.getParameter("hub.lease_seconds");
+ final String verifyToken = req.getParameter("hub.verify_token");
+ try {
+ final String result = subscriptions.validate(HttpUtils.getRequestURL(req).toString(), topic, mode, challenge, leaseString, verifyToken);
resp.setStatus(200);
resp.getWriter().print(result);
return;
- } catch(HttpStatusCodeException e){
+ } catch (final HttpStatusCodeException e) {
e.printStackTrace();
resp.setStatus(e.getStatus());
resp.getWriter().print(e.getMessage());
@@ -63,17 +64,15 @@ public class AbstractSubServlet extends HttpServlet {
}
@Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- try{
- this.subscriptions.callback(HttpUtils.getRequestURL(req).toString(), req.getInputStream());
+ protected void doPost(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
+ try {
+ subscriptions.callback(HttpUtils.getRequestURL(req).toString(), req.getInputStream());
return;
- } catch(HttpStatusCodeException e){
+ } catch (final HttpStatusCodeException e) {
e.printStackTrace();
resp.setStatus(e.getStatus());
resp.getWriter().println(e.getMessage());
}
}
-
-
}
diff --git a/src/test/java/org/rometools/certiorem/hub/AlwaysVerifier.java b/src/test/java/org/rometools/certiorem/hub/AlwaysVerifier.java
index 447aed8..3e01b85 100644
--- a/src/test/java/org/rometools/certiorem/hub/AlwaysVerifier.java
+++ b/src/test/java/org/rometools/certiorem/hub/AlwaysVerifier.java
@@ -16,34 +16,33 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.hub;
import org.rometools.certiorem.hub.data.Subscriber;
/**
- *
+ *
* @author robert.cooper
*/
public class AlwaysVerifier implements Verifier {
@Override
- public void verifySubscribeAsyncronously(Subscriber subscriber, VerificationCallback callback) {
+ public void verifySubscribeAsyncronously(final Subscriber subscriber, final VerificationCallback callback) {
callback.onVerify(true);
}
@Override
- public boolean verifySubcribeSyncronously(Subscriber subscriber) {
+ public boolean verifySubcribeSyncronously(final Subscriber subscriber) {
return true;
}
@Override
- public void verifyUnsubscribeAsyncronously(Subscriber subscriber, VerificationCallback callback) {
+ public void verifyUnsubscribeAsyncronously(final Subscriber subscriber, final VerificationCallback callback) {
callback.onVerify(true);
}
@Override
- public boolean verifyUnsubcribeSyncronously(Subscriber subscriber) {
+ public boolean verifyUnsubcribeSyncronously(final Subscriber subscriber) {
return true;
}
diff --git a/src/test/java/org/rometools/certiorem/hub/ControllerTest.java b/src/test/java/org/rometools/certiorem/hub/ControllerTest.java
index 172d9b1..f337505 100644
--- a/src/test/java/org/rometools/certiorem/hub/ControllerTest.java
+++ b/src/test/java/org/rometools/certiorem/hub/ControllerTest.java
@@ -18,25 +18,25 @@
package org.rometools.certiorem.hub;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
import java.util.logging.Logger;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
import org.rometools.certiorem.HttpStatusCodeException;
+import org.rometools.certiorem.hub.data.HubDAO;
+import org.rometools.certiorem.hub.data.ram.InMemoryHubDAO;
import org.rometools.fetcher.FeedFetcher;
import org.rometools.fetcher.impl.HashMapFeedInfoCache;
import org.rometools.fetcher.impl.HttpURLFeedFetcher;
-import org.junit.After;
-import org.junit.AfterClass;
-import static org.junit.Assert.*;
-
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import org.rometools.certiorem.hub.data.HubDAO;
-import org.rometools.certiorem.hub.data.ram.InMemoryHubDAO;
-
/**
- *
+ *
* @author robert.cooper
*/
public class ControllerTest {
@@ -66,14 +66,14 @@ public class ControllerTest {
public void testSubscribe() {
Logger.getLogger(ControllerTest.class.getName()).info("subscribe");
- String callback = "http://localhost/doNothing";
- String topic = "http://feeds.feedburner.com/screaming-penguin";
- long lease_seconds = -1;
- String secret = null;
- String verify_token = "MyVoiceIsMyPassport";
- HubDAO dao = new InMemoryHubDAO();
- Notifier notifier = null;
- FeedFetcher fetcher = new HttpURLFeedFetcher(HashMapFeedInfoCache.getInstance());
+ final String callback = "http://localhost/doNothing";
+ final String topic = "http://feeds.feedburner.com/screaming-penguin";
+ final long lease_seconds = -1;
+ final String secret = null;
+ final String verify_token = "MyVoiceIsMyPassport";
+ final HubDAO dao = new InMemoryHubDAO();
+ final Notifier notifier = null;
+ final FeedFetcher fetcher = new HttpURLFeedFetcher(HashMapFeedInfoCache.getInstance());
Hub instance = new Hub(dao, new AlwaysVerifier(), notifier, fetcher);
Boolean result = instance.subscribe(callback, topic, "sync", lease_seconds, secret, verify_token);
@@ -90,7 +90,7 @@ public class ControllerTest {
try {
instance.subscribe(null, topic, "async", lease_seconds, secret, verify_token);
fail();
- } catch (HttpStatusCodeException e) {
+ } catch (final HttpStatusCodeException e) {
assertEquals(400, e.getStatus());
Logger.getLogger(ControllerTest.class.getName()).info(e.getMessage());
}
@@ -98,7 +98,7 @@ public class ControllerTest {
try {
instance.subscribe(callback, null, "async", lease_seconds, secret, verify_token);
fail();
- } catch (HttpStatusCodeException e) {
+ } catch (final HttpStatusCodeException e) {
assertEquals(400, e.getStatus());
Logger.getLogger(ControllerTest.class.getName()).info(e.getMessage());
}
@@ -106,7 +106,7 @@ public class ControllerTest {
try {
instance.subscribe(callback, topic, "foo", lease_seconds, secret, verify_token);
fail();
- } catch (HttpStatusCodeException e) {
+ } catch (final HttpStatusCodeException e) {
assertEquals(400, e.getStatus());
Logger.getLogger(ControllerTest.class.getName()).info(e.getMessage());
}
@@ -117,7 +117,7 @@ public class ControllerTest {
try {
result = instance.subscribe(callback, topic, "sync", lease_seconds, secret, verify_token);
fail();
- } catch (HttpStatusCodeException e) {
+ } catch (final HttpStatusCodeException e) {
assertEquals(500, e.getStatus());
}
}
diff --git a/src/test/java/org/rometools/certiorem/hub/DeltaSyndFeedInfoTest.java b/src/test/java/org/rometools/certiorem/hub/DeltaSyndFeedInfoTest.java
index a7786e1..4f35551 100644
--- a/src/test/java/org/rometools/certiorem/hub/DeltaSyndFeedInfoTest.java
+++ b/src/test/java/org/rometools/certiorem/hub/DeltaSyndFeedInfoTest.java
@@ -5,29 +5,32 @@
package org.rometools.certiorem.hub;
import java.io.IOException;
-import com.sun.syndication.feed.synd.SyndEntry;
-import java.util.List;
-import junit.framework.Assert;
-import org.rometools.fetcher.impl.HashMapFeedInfoCache;
-import org.rometools.fetcher.impl.HttpURLFeedFetcher;
import java.net.URL;
-import com.sun.syndication.feed.synd.SyndFeed;
+import java.util.List;
+
+import junit.framework.Assert;
+
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
+import org.rometools.fetcher.impl.HashMapFeedInfoCache;
+import org.rometools.fetcher.impl.HttpURLFeedFetcher;
+
+import com.sun.syndication.feed.synd.SyndEntry;
+import com.sun.syndication.feed.synd.SyndFeed;
/**
- *
+ *
* @author najmi
*/
public class DeltaSyndFeedInfoTest {
-
+
DeltaFeedInfoCache feedInfoCache;
HttpURLFeedFetcher feedFetcher;
SyndFeed feed;
-
+
public DeltaSyndFeedInfoTest() {
}
@@ -38,18 +41,16 @@ public class DeltaSyndFeedInfoTest {
@AfterClass
public static void tearDownClass() throws Exception {
}
-
-
+
@Before
public void setUp() {
feedInfoCache = new DeltaFeedInfoCache(new HashMapFeedInfoCache());
feedFetcher = new HttpURLFeedFetcher(feedInfoCache);
}
-
+
@After
- public void tearDown() {
+ public void tearDown() {
}
-
/**
* Test of getSyndFeed method, of class DeltaSyndFeedInfo.
@@ -57,21 +58,21 @@ public class DeltaSyndFeedInfoTest {
@Test
public void testGetSyndFeed() throws Exception {
System.out.println("getSyndFeed");
-
+
feed = feedFetcher.retrieveFeed(getFeedUrl());
List entries = feed.getEntries();
Assert.assertTrue(!entries.isEmpty());
- //Fetch again and this time the entries should be empty as none have changed.
+ // Fetch again and this time the entries should be empty as none have changed.
feed = feedFetcher.retrieveFeed(getFeedUrl());
entries = feed.getEntries();
- Assert.assertTrue(entries.isEmpty());
+ Assert.assertTrue(entries.isEmpty());
}
private URL getFeedUrl() throws IOException {
- URL feedUrl = new URL("http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&output=rss");
-// URL feedUrl = new URL("http://newsrss.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml");
-
+ final URL feedUrl = new URL("http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&output=rss");
+ // URL feedUrl = new URL("http://newsrss.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml");
+
return feedUrl;
- }
+ }
}
diff --git a/src/test/java/org/rometools/certiorem/hub/ExceptionVerifier.java b/src/test/java/org/rometools/certiorem/hub/ExceptionVerifier.java
index 9dfa920..87153b3 100644
--- a/src/test/java/org/rometools/certiorem/hub/ExceptionVerifier.java
+++ b/src/test/java/org/rometools/certiorem/hub/ExceptionVerifier.java
@@ -16,34 +16,33 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.hub;
import org.rometools.certiorem.hub.data.Subscriber;
/**
- *
+ *
* @author robert.cooper
*/
-public class ExceptionVerifier implements Verifier{
+public class ExceptionVerifier implements Verifier {
@Override
- public void verifySubscribeAsyncronously(Subscriber subscriber, VerificationCallback callback) {
+ public void verifySubscribeAsyncronously(final Subscriber subscriber, final VerificationCallback callback) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
- public boolean verifySubcribeSyncronously(Subscriber subscriber) {
+ public boolean verifySubcribeSyncronously(final Subscriber subscriber) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
- public void verifyUnsubscribeAsyncronously(Subscriber subscriber, VerificationCallback callback) {
+ public void verifyUnsubscribeAsyncronously(final Subscriber subscriber, final VerificationCallback callback) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
- public boolean verifyUnsubcribeSyncronously(Subscriber subscriber) {
+ public boolean verifyUnsubcribeSyncronously(final Subscriber subscriber) {
throw new UnsupportedOperationException("Not supported yet.");
}
diff --git a/src/test/java/org/rometools/certiorem/hub/NeverVerifier.java b/src/test/java/org/rometools/certiorem/hub/NeverVerifier.java
index 86cd96d..b514293 100644
--- a/src/test/java/org/rometools/certiorem/hub/NeverVerifier.java
+++ b/src/test/java/org/rometools/certiorem/hub/NeverVerifier.java
@@ -16,34 +16,33 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.hub;
import org.rometools.certiorem.hub.data.Subscriber;
/**
- *
+ *
* @author robert.cooper
*/
-public class NeverVerifier implements Verifier{
+public class NeverVerifier implements Verifier {
@Override
- public void verifySubscribeAsyncronously(Subscriber subscriber, VerificationCallback callback) {
+ public void verifySubscribeAsyncronously(final Subscriber subscriber, final VerificationCallback callback) {
callback.onVerify(false);
}
@Override
- public boolean verifySubcribeSyncronously(Subscriber subscriber) {
+ public boolean verifySubcribeSyncronously(final Subscriber subscriber) {
return false;
}
@Override
- public void verifyUnsubscribeAsyncronously(Subscriber subscriber, VerificationCallback callback) {
+ public void verifyUnsubscribeAsyncronously(final Subscriber subscriber, final VerificationCallback callback) {
callback.onVerify(false);
}
@Override
- public boolean verifyUnsubcribeSyncronously(Subscriber subscriber) {
+ public boolean verifyUnsubcribeSyncronously(final Subscriber subscriber) {
return false;
}
diff --git a/src/test/java/org/rometools/certiorem/hub/data/AbstractDAOTest.java b/src/test/java/org/rometools/certiorem/hub/data/AbstractDAOTest.java
index ff39791..af8f1c7 100644
--- a/src/test/java/org/rometools/certiorem/hub/data/AbstractDAOTest.java
+++ b/src/test/java/org/rometools/certiorem/hub/data/AbstractDAOTest.java
@@ -21,10 +21,11 @@ package org.rometools.certiorem.hub.data;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
+
import org.junit.Test;
/**
- *
+ *
* @author robert.cooper
*/
public abstract class AbstractDAOTest {
@@ -33,40 +34,40 @@ public abstract class AbstractDAOTest {
@Test
public void testSubscribe() {
- HubDAO instance = get();
+ final HubDAO instance = get();
Logger.getLogger(AbstractDAOTest.class.getName()).log(Level.INFO, "{0} testSubscribe", instance.getClass().getName());
- Subscriber subscriber = new Subscriber();
+ final Subscriber subscriber = new Subscriber();
subscriber.setCallback("http://localhost:9797/noop");
subscriber.setTopic("http://feeds.feedburner.com/screaming-penguin");
subscriber.setLeaseSeconds(-1);
subscriber.setVerify("VerifyMe");
- Subscriber result = instance.addSubscriber(subscriber);
+ final Subscriber result = instance.addSubscriber(subscriber);
assert result.equals(subscriber) : "Subscriber not equal.";
- List subscribers = (List) instance.subscribersForTopic(subscriber.getTopic());
+ final List subscribers = (List) instance.subscribersForTopic(subscriber.getTopic());
assert subscribers.contains(result) : "Subscriber not in result.";
}
@Test
public void testLeaseExpire() throws InterruptedException {
- HubDAO instance = get();
+ final HubDAO instance = get();
Logger.getLogger(AbstractDAOTest.class.getName()).log(Level.INFO, "{0} testLeaseExpire", instance.getClass().getName());
- Subscriber subscriber = new Subscriber();
+ final Subscriber subscriber = new Subscriber();
subscriber.setCallback("http://localhost:9797/noop");
subscriber.setTopic("http://feeds.feedburner.com/screaming-penguin");
subscriber.setLeaseSeconds(1);
subscriber.setVerify("VerifyMe");
- Subscriber result = instance.addSubscriber(subscriber);
+ final Subscriber result = instance.addSubscriber(subscriber);
assert subscriber.equals(result) : "Subscriber not equal.";
- //quick test for store.
+ // quick test for store.
List subscribers = (List) instance.subscribersForTopic(subscriber.getTopic());
assert subscribers.contains(result) : "Subscriber not in result.";
- //sleep past expiration
+ // sleep past expiration
Thread.sleep(1100);
subscribers = (List) instance.subscribersForTopic(subscriber.getTopic());
assert !subscribers.contains(result) : "Subscriber should have expired";
@@ -74,15 +75,15 @@ public abstract class AbstractDAOTest {
@Test
public void testUnsubscribe() throws InterruptedException {
- HubDAO instance = get();
+ final HubDAO instance = get();
Logger.getLogger(AbstractDAOTest.class.getName()).log(Level.INFO, "{0} testUnsubscribe", instance.getClass().getName());
- Subscriber subscriber = new Subscriber();
+ final Subscriber subscriber = new Subscriber();
subscriber.setCallback("http://localhost:9797/noop");
subscriber.setTopic("http://feeds.feedburner.com/screaming-penguin");
subscriber.setLeaseSeconds(1);
subscriber.setVerify("VerifyMe");
- Subscriber result = instance.addSubscriber(subscriber);
+ final Subscriber result = instance.addSubscriber(subscriber);
// TODO
}
diff --git a/src/test/java/org/rometools/certiorem/hub/data/ram/InMemoryDAOTest.java b/src/test/java/org/rometools/certiorem/hub/data/ram/InMemoryDAOTest.java
index 90db87f..218fcbe 100644
--- a/src/test/java/org/rometools/certiorem/hub/data/ram/InMemoryDAOTest.java
+++ b/src/test/java/org/rometools/certiorem/hub/data/ram/InMemoryDAOTest.java
@@ -16,18 +16,17 @@
* limitations under the License.
*/
-
package org.rometools.certiorem.hub.data.ram;
import org.rometools.certiorem.hub.data.AbstractDAOTest;
import org.rometools.certiorem.hub.data.HubDAO;
/**
- *
+ *
* @author robert.cooper
*/
-public class InMemoryDAOTest extends AbstractDAOTest{
- private InMemoryHubDAO dao = new InMemoryHubDAO();
+public class InMemoryDAOTest extends AbstractDAOTest {
+ private final InMemoryHubDAO dao = new InMemoryHubDAO();
public InMemoryDAOTest() {
}
@@ -37,8 +36,4 @@ public class InMemoryDAOTest extends AbstractDAOTest{
return dao;
}
-
-
-
-
}
\ No newline at end of file
diff --git a/src/test/resources/.gitignore b/src/test/resources/.gitignore
new file mode 100644
index 0000000..53b845b
--- /dev/null
+++ b/src/test/resources/.gitignore
@@ -0,0 +1 @@
+# needed to commit empty folder
\ No newline at end of file