From 81cbb541b802c641e84973c43b5814efa4e54426 Mon Sep 17 00:00:00 2001 From: Athou Date: Wed, 3 Apr 2013 15:53:57 +0200 Subject: [PATCH] display favicon --- .../com/commafeed/backend/HttpGetter.java | 42 +++++++++ .../commafeed/backend/feeds/FeedFetcher.java | 30 ++----- .../commafeed/backend/feeds/FeedParser.java | 1 + .../commafeed/backend/feeds/FeedUpdater.java | 4 + .../com/commafeed/backend/model/Feed.java | 11 +++ .../frontend/CommaFeedApplication.java | 2 + .../frontend/model/Subscription.java | 9 ++ .../commafeed/frontend/pages/FaviconPage.java | 81 ++++++++++++++++++ .../rest/resources/SubscriptionsREST.java | 7 +- src/main/resources/favicon.gif | Bin 0 -> 238 bytes src/main/webapp/directives/category.html | 4 +- 11 files changed, 162 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/commafeed/backend/HttpGetter.java create mode 100644 src/main/java/com/commafeed/frontend/pages/FaviconPage.java create mode 100644 src/main/resources/favicon.gif diff --git a/src/main/java/com/commafeed/backend/HttpGetter.java b/src/main/java/com/commafeed/backend/HttpGetter.java new file mode 100644 index 00000000..8baed463 --- /dev/null +++ b/src/main/java/com/commafeed/backend/HttpGetter.java @@ -0,0 +1,42 @@ +package com.commafeed.backend; + +import javax.ejb.Stateless; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.params.HttpConnectionParams; +import org.apache.http.params.HttpProtocolParams; +import org.apache.http.util.EntityUtils; + +@Stateless +public class HttpGetter { + + public String get(String url) throws Exception { + return new String(getBinary(url), "UTF-8"); + } + + public byte[] getBinary(String url) throws Exception { + byte[] content = null; + + HttpClient httpclient = new DefaultHttpClient(); + HttpProtocolParams.setContentCharset(httpclient.getParams(), "UTF-8"); + HttpConnectionParams + .setConnectionTimeout(httpclient.getParams(), 15000); + HttpConnectionParams.setSoTimeout(httpclient.getParams(), 15000); + + try { + HttpGet httpget = new HttpGet(url); + HttpResponse response = httpclient.execute(httpget); + HttpEntity entity = response.getEntity(); + if (entity != null) { + content = EntityUtils.toByteArray(entity); + } + } finally { + httpclient.getConnectionManager().shutdown(); + } + return content; + } +} diff --git a/src/main/java/com/commafeed/backend/feeds/FeedFetcher.java b/src/main/java/com/commafeed/backend/feeds/FeedFetcher.java index 46617410..77c854b7 100644 --- a/src/main/java/com/commafeed/backend/feeds/FeedFetcher.java +++ b/src/main/java/com/commafeed/backend/feeds/FeedFetcher.java @@ -3,20 +3,13 @@ package com.commafeed.backend.feeds; import javax.ejb.Stateless; import javax.inject.Inject; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.params.HttpConnectionParams; -import org.apache.http.params.HttpProtocolParams; -import org.apache.http.util.EntityUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.commafeed.backend.HttpGetter; import com.commafeed.backend.model.Feed; import com.sun.syndication.io.FeedException; @@ -28,34 +21,23 @@ public class FeedFetcher { @Inject FeedParser parser; + @Inject + HttpGetter getter; + public Feed fetch(String feedUrl) throws FeedException { log.debug("Fetching feed {}", feedUrl); Feed feed = null; - HttpClient httpclient = new DefaultHttpClient(); - HttpProtocolParams.setContentCharset(httpclient.getParams(), "UTF-8"); - HttpConnectionParams - .setConnectionTimeout(httpclient.getParams(), 15000); - HttpConnectionParams.setSoTimeout(httpclient.getParams(), 15000); - try { - HttpGet httpget = new HttpGet(feedUrl); - HttpResponse response = httpclient.execute(httpget); - HttpEntity entity = response.getEntity(); - String content = EntityUtils.toString(entity, "UTF-8"); + String content = getter.get(feedUrl); String extractedUrl = extractFeedUrl(content); if (extractedUrl != null) { - httpget = new HttpGet(extractedUrl); - response = httpclient.execute(httpget); - entity = response.getEntity(); - content = EntityUtils.toString(entity, "UTF-8"); + content = getter.get(extractedUrl); feedUrl = extractedUrl; } feed = parser.parse(feedUrl, content); } catch (Exception e) { throw new FeedException(e.getMessage(), e); - } finally { - httpclient.getConnectionManager().shutdown(); } return feed; } diff --git a/src/main/java/com/commafeed/backend/feeds/FeedParser.java b/src/main/java/com/commafeed/backend/feeds/FeedParser.java index e155d993..23e59e95 100644 --- a/src/main/java/com/commafeed/backend/feeds/FeedParser.java +++ b/src/main/java/com/commafeed/backend/feeds/FeedParser.java @@ -33,6 +33,7 @@ public class FeedParser { SyndFeed rss = new SyndFeedInput().build(new StringReader(xml)); feed.setUrl(feedUrl); feed.setTitle(rss.getTitle()); + feed.setLink(rss.getLink()); List items = rss.getEntries(); for (SyndEntry item : items) { FeedEntry entry = new FeedEntry(); diff --git a/src/main/java/com/commafeed/backend/feeds/FeedUpdater.java b/src/main/java/com/commafeed/backend/feeds/FeedUpdater.java index 96f9ece4..f1a49619 100644 --- a/src/main/java/com/commafeed/backend/feeds/FeedUpdater.java +++ b/src/main/java/com/commafeed/backend/feeds/FeedUpdater.java @@ -38,6 +38,10 @@ public class FeedUpdater { try { Feed fetchedFeed = fetcher.fetch(feed.getUrl()); + if (feed.getLink() == null) { + feed.setLink(fetchedFeed.getLink()); + feedService.update(feed); + } feedEntryService.updateEntries(feed.getUrl(), fetchedFeed.getEntries()); } catch (Exception e) { diff --git a/src/main/java/com/commafeed/backend/model/Feed.java b/src/main/java/com/commafeed/backend/model/Feed.java index 4a40d126..378f62fc 100644 --- a/src/main/java/com/commafeed/backend/model/Feed.java +++ b/src/main/java/com/commafeed/backend/model/Feed.java @@ -24,6 +24,9 @@ public class Feed extends AbstractModel { @Transient private String title; + @Column(length = 2048) + private String link; + @Temporal(TemporalType.TIMESTAMP) private Date lastUpdated; @@ -92,4 +95,12 @@ public class Feed extends AbstractModel { this.title = title; } + public String getLink() { + return link; + } + + public void setLink(String link) { + this.link = link; + } + } diff --git a/src/main/java/com/commafeed/frontend/CommaFeedApplication.java b/src/main/java/com/commafeed/frontend/CommaFeedApplication.java index 5f9496e0..a882c22b 100644 --- a/src/main/java/com/commafeed/frontend/CommaFeedApplication.java +++ b/src/main/java/com/commafeed/frontend/CommaFeedApplication.java @@ -38,6 +38,7 @@ import org.reflections.vfs.ZipDir; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.commafeed.frontend.pages.FaviconPage; import com.commafeed.frontend.pages.HomePage; import com.commafeed.frontend.pages.LoginPage; import com.commafeed.frontend.pages.LogoutPage; @@ -57,6 +58,7 @@ public class CommaFeedApplication extends AuthenticatedWebApplication { mountPage("login", LoginPage.class); mountPage("logout", LogoutPage.class); mountPage("error", DisplayExceptionPage.class); + mountPage("favicon", FaviconPage.class); setupInjection(); diff --git a/src/main/java/com/commafeed/frontend/model/Subscription.java b/src/main/java/com/commafeed/frontend/model/Subscription.java index 89d1c752..63ba82c8 100644 --- a/src/main/java/com/commafeed/frontend/model/Subscription.java +++ b/src/main/java/com/commafeed/frontend/model/Subscription.java @@ -8,6 +8,7 @@ public class Subscription implements Serializable { private Long id; private String name; private String message; + private String feedUrl; private int unread; public Long getId() { @@ -42,4 +43,12 @@ public class Subscription implements Serializable { this.message = message; } + public String getFeedUrl() { + return feedUrl; + } + + public void setFeedUrl(String feedUrl) { + this.feedUrl = feedUrl; + } + } \ No newline at end of file diff --git a/src/main/java/com/commafeed/frontend/pages/FaviconPage.java b/src/main/java/com/commafeed/frontend/pages/FaviconPage.java new file mode 100644 index 00000000..147c584a --- /dev/null +++ b/src/main/java/com/commafeed/frontend/pages/FaviconPage.java @@ -0,0 +1,81 @@ +package com.commafeed.frontend.pages; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; + +import javax.inject.Inject; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.wicket.request.IRequestCycle; +import org.apache.wicket.request.IRequestHandler; +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.commafeed.backend.HttpGetter; +import com.commafeed.backend.model.UserRole.Role; +import com.commafeed.frontend.SecurityCheck; + +@SuppressWarnings("serial") +@SecurityCheck(Role.USER) +public class FaviconPage extends BasePage { + + private static final Logger log = LoggerFactory + .getLogger(FaviconPage.class); + + @Inject + HttpGetter getter; + + public FaviconPage(PageParameters params) { + final String url = params.get("url").toString(); + getRequestCycle().scheduleRequestHandlerAfterCurrent( + new IRequestHandler() { + + @Override + public void respond(IRequestCycle requestCycle) { + requestCycle.getResponse().write(getImage(url)); + } + + @Override + public void detach(IRequestCycle requestCycle) { + } + }); + + } + + private byte[] getImage(String url) { + byte[] img = null; + try { + if (StringUtils.isNotBlank(url)) { + int index = Math.max(url.length(), url.lastIndexOf("?")); + url = url.substring(0, index); + + String iconUrl = "http://g.etfv.co/" + + URLEncoder.encode(url, "UTF-8") + "?defaulticon=none"; + img = getter.getBinary(iconUrl); + } + } catch (Exception e) { + log.error(e.getMessage(), e); + } + if (img == null) { + img = getDefaultIcon(); + } + return img; + } + + private byte[] getDefaultIcon() { + byte[] bytes = null; + InputStream is = null; + try { + is = getClass().getResourceAsStream("/favicon.gif"); + bytes = IOUtils.toByteArray(is); + } catch (IOException e) { + log.error(e.getMessage(), e); + } finally { + IOUtils.closeQuietly(is); + } + return bytes; + } +} diff --git a/src/main/java/com/commafeed/frontend/rest/resources/SubscriptionsREST.java b/src/main/java/com/commafeed/frontend/rest/resources/SubscriptionsREST.java index db55da04..19f89a92 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/SubscriptionsREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/SubscriptionsREST.java @@ -59,13 +59,12 @@ public class SubscriptionsREST extends AbstractREST { Feed fetchedFeed = fetchFeed(req.getUrl()); Feed feed = feedService.findByUrl(fetchedFeed.getUrl()); if (feed == null) { - feed = new Feed(); - feed.setUrl(fetchedFeed.getUrl()); + feed = fetchedFeed; feedService.save(feed); } FeedSubscription sub = new FeedSubscription(); - sub.setCategory("all".equals(req.getCategoryId()) ? null + sub.setCategory(EntriesREST.ALL.equals(req.getCategoryId()) ? null : feedCategoryService.findById(Long.valueOf(req.getCategoryId()))); sub.setFeed(feed); sub.setTitle(req.getTitle()); @@ -206,6 +205,7 @@ public class SubscriptionsREST extends AbstractREST { sub.setId(subscription.getId()); sub.setName(subscription.getTitle()); sub.setMessage(subscription.getFeed().getMessage()); + sub.setFeedUrl(subscription.getFeed().getLink()); int size = feedEntryService.getEntries(subscription.getFeed(), getUser(), true).size(); sub.setUnread(size); @@ -220,5 +220,4 @@ public class SubscriptionsREST extends AbstractREST { }); return category; } - } diff --git a/src/main/resources/favicon.gif b/src/main/resources/favicon.gif new file mode 100644 index 0000000000000000000000000000000000000000..de44d0147d2aff925688e6d02059e06779b3e874 GIT binary patch literal 238 zcmZ?wbhEHb6krfwI3mojWACr-Ne>Pm|Fw4WkNL~Kzkc(7*_yAPzx?043$Sq>;O!RURXkgVy zV04(o*6gyVYK7IA#f=Qp1$2aXIAT=d@8q&E<*Tx>=&&$y@^cDSD={*1aZQ{Mqcweo Iup)ys0HV`Xs{jB1 literal 0 HcmV?d00001 diff --git a/src/main/webapp/directives/category.html b/src/main/webapp/directives/category.html index 81ce6754..f310a629 100644 --- a/src/main/webapp/directives/category.html +++ b/src/main/webapp/directives/category.html @@ -16,7 +16,9 @@ {{formatFeedName({feed:feed})}} + ng-class="{selected: (feed.id == selectedId && selectedType == 'feed'), unread: feed.unread }"> + + {{formatFeedName({feed:feed})}}