diff --git a/pom.xml b/pom.xml index 30cb6519..f4634132 100644 --- a/pom.xml +++ b/pom.xml @@ -365,7 +365,7 @@ app - indent,devel,noarg,quotmark + indent,devel,noarg,quotmark,laxcomma,laxbreak diff --git a/src/main/java/com/commafeed/frontend/CommaFeedApplication.java b/src/main/java/com/commafeed/frontend/CommaFeedApplication.java index c3cf1fcc..0933de94 100644 --- a/src/main/java/com/commafeed/frontend/CommaFeedApplication.java +++ b/src/main/java/com/commafeed/frontend/CommaFeedApplication.java @@ -39,7 +39,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.commafeed.frontend.pages.DemoLoginPage; -import com.commafeed.frontend.pages.FaviconPage; import com.commafeed.frontend.pages.GoogleImportCallbackPage; import com.commafeed.frontend.pages.GoogleImportRedirectPage; import com.commafeed.frontend.pages.HomePage; @@ -69,7 +68,6 @@ public class CommaFeedApplication extends AuthenticatedWebApplication { mountPage("demo", DemoLoginPage.class); mountPage("logout", LogoutPage.class); mountPage("error", DisplayExceptionPage.class); - mountPage("favicon", FaviconPage.class); mountPage("google/import/redirect", GoogleImportRedirectPage.class); mountPage(GoogleImportCallbackPage.PAGE_PATH, GoogleImportCallbackPage.class); diff --git a/src/main/java/com/commafeed/frontend/pages/FaviconPage.java b/src/main/java/com/commafeed/frontend/pages/FaviconPage.java deleted file mode 100644 index cfb3760e..00000000 --- a/src/main/java/com/commafeed/frontend/pages/FaviconPage.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.commafeed.frontend.pages; - -import java.io.IOException; -import java.io.InputStream; -import java.net.URLEncoder; -import java.util.Date; -import java.util.concurrent.TimeUnit; - -import javax.inject.Inject; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.http.impl.cookie.DateUtils; -import org.apache.wicket.request.IRequestCycle; -import org.apache.wicket.request.IRequestHandler; -import org.apache.wicket.request.http.WebResponse; -import org.apache.wicket.request.mapper.parameter.PageParameters; -import org.apache.wicket.util.time.Time; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.commafeed.backend.HttpGetter; -import com.commafeed.backend.HttpGetter.HttpResult; -import com.commafeed.backend.StartupBean; -import com.commafeed.backend.model.UserRole.Role; -import com.commafeed.frontend.SecurityCheck; -import com.google.common.net.HttpHeaders; - -@SuppressWarnings("serial") -@SecurityCheck(Role.USER) -public class FaviconPage extends BasePage { - - private static final Logger log = LoggerFactory - .getLogger(FaviconPage.class); - - @Inject - HttpGetter getter; - - @Inject - StartupBean startupBean; - - public FaviconPage(PageParameters params) { - final String url = params.get("url").toString(); - getRequestCycle().scheduleRequestHandlerAfterCurrent( - new IRequestHandler() { - - @Override - public void respond(IRequestCycle requestCycle) { - WebResponse response = (WebResponse) requestCycle - .getResponse(); - response.setLastModifiedTime(Time.millis(startupBean - .getStartupTime())); - response.setContentType("image/x-icon"); - long expiresAfter = TimeUnit.DAYS.toMillis(7); - response.setHeader( - HttpHeaders.EXPIRES, - DateUtils.formatDate(new Date(startupBean - .getStartupTime() + expiresAfter))); - response.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"; - HttpResult result = getter.getBinary(iconUrl); - if (result != null) { - img = result.getContent(); - } - } - } 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/resources/favicon.gif b/src/main/webapp/images/default_favicon.gif similarity index 100% rename from src/main/resources/favicon.gif rename to src/main/webapp/images/default_favicon.gif diff --git a/src/main/webapp/js/directives.js b/src/main/webapp/js/directives.js index 83e9fb34..f3c3de32 100644 --- a/src/main/webapp/js/directives.js +++ b/src/main/webapp/js/directives.js @@ -7,7 +7,25 @@ module.directive('favicon', function() { url : '=' }, replace : true, - template : '' + template : '', + controller : function($scope) { + $scope.iconUrl = function() { + var url = $scope.url; + + var current = window.location.href; + var baseUrl = current.substring(0, current.lastIndexOf('#')); + var defaultIcon = baseUrl + 'images/default_favicon.gif'; + if (!url) { + return defaultIcon; + } + + var index = Math.max(url.length, url.lastIndexOf('?')); + var iconUrl = 'http://g.etfv.co/'; + iconUrl += encodeURIComponent(url.substring(0, index)); + iconUrl += '?defaulticon=none'; + return iconUrl; + }; + } }; }); @@ -82,133 +100,144 @@ module.directive('category', [ function() { restrict : 'E', replace : true, templateUrl : 'directives/category.html', - controller : ['$scope', '$state', '$dialog', 'FeedService', - 'CategoryService', 'SettingsService', function($scope, $state, $dialog, FeedService, - CategoryService, SettingsService) { - $scope.settingsService = SettingsService; - $scope.unsubscribe = function(subscription) { - var title = 'Unsubscribe'; - var msg = 'Unsubscribe from ' + subscription.name + ' ?'; - var btns = [ { - result : 'cancel', - label : 'Cancel' - }, { - result : 'ok', - label : 'OK', - cssClass : 'btn-primary' - } ]; + controller : [ + '$scope', + '$state', + '$dialog', + 'FeedService', + 'CategoryService', + 'SettingsService', + function($scope, $state, $dialog, FeedService, CategoryService, + SettingsService) { + $scope.settingsService = SettingsService; + $scope.unsubscribe = function(subscription) { + var title = 'Unsubscribe'; + var msg = 'Unsubscribe from ' + subscription.name + + ' ?'; + var btns = [ { + result : 'cancel', + label : 'Cancel' + }, { + result : 'ok', + label : 'OK', + cssClass : 'btn-primary' + } ]; - $dialog.messageBox(title, msg, btns).open().then( - function(result) { - if (result == 'ok') { - var data = { - id : subscription.id - }; - FeedService.unsubscribe(data, function() { - CategoryService.init(); + $dialog.messageBox(title, msg, btns).open().then( + function(result) { + if (result == 'ok') { + var data = { + id : subscription.id + }; + FeedService.unsubscribe(data, + function() { + CategoryService.init(); + }); + } }); - } + }; + + $scope.formatCategoryName = function(category) { + var count = $scope.unreadCount({ + category : category }); - }; + var label = category.name; + if (count > 0) { + label = label + ' (' + count + ')'; + } + return label; + }; - $scope.formatCategoryName = function(category) { - var count = $scope.unreadCount({ - category : category - }); - var label = category.name; - if (count > 0) { - label = label + ' (' + count + ')'; - } - return label; - }; + $scope.formatFeedName = function(feed) { + var label = feed.name; + if (feed.unread > 0) { + label = label + ' (' + feed.unread + ')'; + } + return label; + }; - $scope.formatFeedName = function(feed) { - var label = feed.name; - if (feed.unread > 0) { - label = label + ' (' + feed.unread + ')'; - } - return label; - }; + $scope.feedClicked = function(id) { + if ($scope.selectedType == 'feed' + && id == $scope.selectedId) { + $scope.$emit('emitReload'); + } else { + $state.transitionTo('feeds.view', { + _type : 'feed', + _id : id + }); + } + }; - $scope.feedClicked = function(id) { - if ($scope.selectedType == 'feed' && id == $scope.selectedId) { - $scope.$emit('emitReload'); - } else { - $state.transitionTo('feeds.view', { - _type : 'feed', - _id : id - }); - } - }; + $scope.categoryClicked = function(id) { + if ($scope.selectedType == 'category' + && id == $scope.selectedId) { + $scope.$emit('emitReload'); + } else { + $state.transitionTo('feeds.view', { + _type : 'category', + _id : id + }); + } + }; - $scope.categoryClicked = function(id) { - if ($scope.selectedType == 'category' && id == $scope.selectedId) { - $scope.$emit('emitReload'); - } else { - $state.transitionTo('feeds.view', { - _type : 'category', - _id : id - }); - } - }; + $scope.renameFeed = function(feed) { + var name = window.prompt('Rename feed : ', feed.name); + if (name && name != feed.name) { + feed.name = name; + FeedService.rename({ + id : feed.id, + name : name + }); + } + }; - $scope.renameFeed = function(feed) { - var name = window.prompt('Rename feed : ', feed.name); - if (name && name != feed.name) { - feed.name = name; - FeedService.rename({ - id : feed.id, - name : name - }); - } - }; + $scope.renameCategory = function(category) { + var name = window.prompt('Rename category: ', + category.name); + if (name && name != category.name) { + category.name = name; + CategoryService.rename({ + id : category.id, + name : name + }); + } + }; - $scope.renameCategory = function(category) { - var name = window.prompt('Rename category: ', category.name); - if (name && name != category.name) { - category.name = name; - CategoryService.rename({ - id : category.id, - name : name - }); - } - }; + $scope.deleteCategory = function(category) { + var title = 'Delete category'; + var msg = 'Delete category ' + category.name + ' ?'; + var btns = [ { + result : 'cancel', + label : 'Cancel' + }, { + result : 'ok', + label : 'OK', + cssClass : 'btn-primary' + } ]; - $scope.deleteCategory = function(category) { - var title = 'Delete category'; - var msg = 'Delete category ' + category.name + ' ?'; - var btns = [ { - result : 'cancel', - label : 'Cancel' - }, { - result : 'ok', - label : 'OK', - cssClass : 'btn-primary' - } ]; - - $dialog.messageBox(title, msg, btns).open().then( - function(result) { - if (result == 'ok') { - CategoryService.remove({ - id : category.id - }, function() { - CategoryService.init(); + $dialog.messageBox(title, msg, btns).open().then( + function(result) { + if (result == 'ok') { + CategoryService.remove({ + id : category.id + }, function() { + CategoryService.init(); + }); + } }); - } - }); - }; + }; - $scope.toggleCategory = function(category) { - category.expanded = !category.expanded; - if (category.id == 'all') { - return; - } - CategoryService.collapse({ - id : category.id, - collapse : !category.expanded - }); - }; - }] + $scope.toggleCategory = function(category) { + category.expanded = !category.expanded; + if (category.id == 'all') { + return; + } + CategoryService.collapse({ + id : category.id, + collapse : !category.expanded + }); + }; + } ] }; } ]);