From 5a4d11c4de2a0c476bb408d21621ec86129070d6 Mon Sep 17 00:00:00 2001 From: Athou Date: Sat, 30 Mar 2013 20:51:51 +0100 Subject: [PATCH] fetch feed name --- .../commafeed/backend/feeds/FeedParser.java | 2 +- .../com/commafeed/backend/model/Feed.java | 12 ++++++++++ .../rest/JSONMessageBodyReaderWriter.java | 13 ++++++---- .../frontend/rest/resources/AbstractREST.java | 4 ++++ .../rest/resources/SubscriptionsREST.java | 17 +++++++++++++ src/main/webapp/directives/subscribe.html | 2 +- src/main/webapp/js/directives.js | 24 +++++++++++++++++++ src/main/webapp/js/services.js | 7 ++++++ 8 files changed, 75 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/commafeed/backend/feeds/FeedParser.java b/src/main/java/com/commafeed/backend/feeds/FeedParser.java index f922e2ac..e2edd353 100644 --- a/src/main/java/com/commafeed/backend/feeds/FeedParser.java +++ b/src/main/java/com/commafeed/backend/feeds/FeedParser.java @@ -32,7 +32,7 @@ public class FeedParser { try { SyndFeed rss = new SyndFeedInput().build(new StringReader(xml)); - + feed.setTitle(rss.getTitle()); List items = rss.getEntries(); for (SyndEntry item : items) { FeedEntry entry = new FeedEntry(); diff --git a/src/main/java/com/commafeed/backend/model/Feed.java b/src/main/java/com/commafeed/backend/model/Feed.java index 174fc50a..b38353b1 100644 --- a/src/main/java/com/commafeed/backend/model/Feed.java +++ b/src/main/java/com/commafeed/backend/model/Feed.java @@ -9,6 +9,7 @@ import javax.persistence.OneToMany; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; +import javax.persistence.Transient; import org.hibernate.annotations.Index; @@ -23,6 +24,9 @@ public class Feed extends AbstractModel { @Index(name = "feed_index") private String url; + @Transient + private String title; + @Temporal(TemporalType.TIMESTAMP) private Date lastUpdated; @@ -83,4 +87,12 @@ public class Feed extends AbstractModel { this.subscriptions = subscriptions; } + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + } diff --git a/src/main/java/com/commafeed/frontend/rest/JSONMessageBodyReaderWriter.java b/src/main/java/com/commafeed/frontend/rest/JSONMessageBodyReaderWriter.java index 13427b3c..a8983cdc 100644 --- a/src/main/java/com/commafeed/frontend/rest/JSONMessageBodyReaderWriter.java +++ b/src/main/java/com/commafeed/frontend/rest/JSONMessageBodyReaderWriter.java @@ -66,12 +66,17 @@ public class JSONMessageBodyReaderWriter implements MessageBodyWriter, OutputStream entityStream) throws IOException, WebApplicationException { httpHeaders.putSingle(HttpHeaders.CONTENT_TYPE, mediaType.toString() - + ";charset=UTF-8"); + + ";charset=" + UTF_8); httpHeaders.putSingle(HttpHeaders.CACHE_CONTROL, "no-cache"); httpHeaders.putSingle("Pragma", "no-cache"); - OutputStreamWriter writer = new OutputStreamWriter(entityStream, UTF_8); - getGson().toJson(t, type, writer); - writer.flush(); + if (type == String.class) { + entityStream.write(t.toString().getBytes(UTF_8)); + } else { + OutputStreamWriter writer = new OutputStreamWriter(entityStream, + UTF_8); + getGson().toJson(t, type, writer); + writer.flush(); + } } @Override diff --git a/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java b/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java index e859eee4..1d7d687a 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java @@ -31,6 +31,7 @@ import com.commafeed.backend.dao.FeedSubscriptionService; import com.commafeed.backend.dao.UserRoleService; import com.commafeed.backend.dao.UserService; import com.commafeed.backend.dao.UserSettingsService; +import com.commafeed.backend.feeds.FeedFetcher; import com.commafeed.backend.feeds.OPMLImporter; import com.commafeed.backend.model.User; import com.commafeed.backend.model.UserRole.Role; @@ -80,6 +81,9 @@ public abstract class AbstractREST { @Inject PasswordEncryptionService encryptionService; + @Inject + FeedFetcher feedFetcher; + @PostConstruct public void init() { CommaFeedApplication app = CommaFeedApplication.get(); 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 566f4b5e..94e0c698 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/SubscriptionsREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/SubscriptionsREST.java @@ -7,6 +7,7 @@ import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; @@ -25,10 +26,26 @@ import com.commafeed.frontend.model.Category; import com.commafeed.frontend.model.Subscription; import com.commafeed.frontend.model.SubscriptionRequest; import com.google.common.base.Preconditions; +import com.sun.syndication.io.FeedException; @Path("subscriptions") public class SubscriptionsREST extends AbstractREST { + @GET + @Path("fetch") + public Feed fetchFeed(@QueryParam("url") String url) { + Preconditions.checkNotNull(url); + Feed feed = null; + try { + feed = feedFetcher.fetch(url); + } catch (FeedException e) { + throw new WebApplicationException(Response + .status(Status.INTERNAL_SERVER_ERROR) + .entity(e.getMessage()).build()); + } + return feed; + } + @POST @Path("subscribe") public Response subscribe(SubscriptionRequest req) { diff --git a/src/main/webapp/directives/subscribe.html b/src/main/webapp/directives/subscribe.html index a09ab8d2..c309b589 100644 --- a/src/main/webapp/directives/subscribe.html +++ b/src/main/webapp/directives/subscribe.html @@ -21,7 +21,7 @@
- + Required
diff --git a/src/main/webapp/js/directives.js b/src/main/webapp/js/directives.js index 3bcefc63..135a0220 100644 --- a/src/main/webapp/js/directives.js +++ b/src/main/webapp/js/directives.js @@ -1,5 +1,16 @@ var module = angular.module('commafeed.directives', []); +app.directive('ngBlur', function() { + return { + restrict: 'A', + link: function(scope, elm, attrs) { + elm.bind('blur', function() { + scope.$apply(attrs.ngBlur); + }); + } + }; +}); + module.directive('scrollTo', function() { return { restrict : 'A', @@ -46,6 +57,19 @@ module.directive('subscribe', function(SubscriptionService) { $scope.close = function() { $scope.isOpen = false; }; + + + $scope.urlChanged = function() { + if ($scope.sub.url && !$scope.sub.title) { + $scope.sub.title = 'Loading'; + SubscriptionService.fetch({ + url : $scope.sub.url + }, function(data) { + console.log(data) + $scope.sub.title = data.title; + }); + } + }; $scope.save = function() { SubscriptionService.subscribe($scope.sub); diff --git a/src/main/webapp/js/services.js b/src/main/webapp/js/services.js index 8323c125..2deeca14 100644 --- a/src/main/webapp/js/services.js +++ b/src/main/webapp/js/services.js @@ -21,6 +21,12 @@ module.factory('SubscriptionService', [ return array; } var actions = { + fetch : { + method : 'GET', + params : { + _method : 'fetch' + } + }, get : { method : 'GET', params : { @@ -58,6 +64,7 @@ module.factory('SubscriptionService', [ callback(data); }); }; + s.fetch = res.fetch; s.subscribe = function(sub, callback) { res.subscribe(sub, function(data) { s.init();