package dev.rsems.feedreader; import com.rometools.fetcher.FeedFetcher; import com.rometools.fetcher.impl.FeedFetcherCache; import com.rometools.fetcher.impl.HttpURLFeedFetcher; import com.rometools.fetcher.impl.LinkedHashMapFeedInfoCache; import dev.rsems.feedreader.fetcher.FetcherEventListenerImpl; import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import java.text.DateFormat; import java.text.SimpleDateFormat; @Controller @Slf4j public class FeedReaderController { @Value("${spring.application.name}") String appName; private static final Logger logger = log; private static final FeedFetcherCache feedInfoCache = LinkedHashMapFeedInfoCache.getInstance(); public static final FeedFetcher fetcher = new HttpURLFeedFetcher(feedInfoCache); private static final FetcherEventListenerImpl listener = new FetcherEventListenerImpl(); static { fetcher.addFetcherEventListener(listener); } private static final int MAX_ITEMS_PER_FEED = 20; private static final DateFormat TIME_FMT = new SimpleDateFormat("HH:mm"); private static final DateFormat DAY_FMT = new SimpleDateFormat("EEEE',' dd. M. yyyy"); @GetMapping("/") public String index(Model model) { model.addAttribute("appName", appName); // Stopwatch stw = new Stopwatch(true); // // Set feedFetcherTasks = new TreeSet(); // // logger.info("[" + "] Reading database and building the feed fetcher tasks list"); // // ConnectionSource connectionSource = null; // try { // connectionSource = new JdbcConnectionSource("jdbc:mysql://db.rsems.de/feeds?user=feeds&password=fems1211"); // Dao userFeedDao = DaoManager.createDao(connectionSource, UserFeed.class); // CloseableIterator ituf = userFeedDao.closeableIterator(); // try { // int i = 0; // while (ituf.hasNext()) { // UserFeed userFeed = ituf.next(); // if (userFeed.getVisible()) { // i++; // // feedFetcherTasks.add(new FeedFetcherTask(i, userFeed.getFeed().getName(), userFeed.getFeed().getUrl(), "", userFeed.getFilter())); // // logger.info("[" + remoteHost + "] #" + new DecimalFormat("00").format(i) + " " + userFeed.getFeed().getName() + " added"); // } // } // } catch (Exception e) { // logger.error(ExceptionUtils.getMessages(e)); // logger.error("\n" + ExceptionUtils.getStackTrace(e)); // throw new FeedException(e); // } finally { // ituf.close(); // } // } catch (SQLException e) { // logger.error(ExceptionUtils.getMessages(e)); // logger.error("\n" + ExceptionUtils.getStackTrace(e)); // throw new FeedException("Failed to access database", e); // } finally { // if (connectionSource != null) { // try { // connectionSource.close(); // } catch (SQLException unhandled) { // } // } // } // // logger.info("[" + remoteHost + "] About to invoke " + feedFetcherTasks.size() + " feed retrieval tasks after " // + stw.getTimeElapsed() + " ms"); // // List> feedFutures = null; // ExecutorService executorService = Executors.newCachedThreadPool(); // try { // feedFutures = executorService.invokeAll(feedFetcherTasks); // } catch (InterruptedException e) { // logger.error(ExceptionUtils.getMessages(e)); // logger.error("\n" + ExceptionUtils.getStackTrace(e)); // throw new FeedException(e); // } // // logger.info("[" + remoteHost + "] About to extract retrieved data from task results after " + stw.getTimeElapsed() + " ms"); // // ArrayList feeds = new ArrayList(); // try { // for (Future ff : feedFutures) { // feeds.add(ff.get()); // } // } catch (Exception e) { // logger.error(ExceptionUtils.getMessages(e)); // logger.error("\n" + ExceptionUtils.getStackTrace(e)); // throw new FeedException(e); // } finally { // executorService.shutdown(); // } // // logger.info("[" + remoteHost + "] About to render retrieved data after " + stw.getTimeElapsed() + " ms"); // // add(new Label("head.title", Globals.TITLE)); // RepeatingView feedRv = new RepeatingView("feed"); // add(feedRv); // // int fc = 0; // for (IFeed feed : feeds) { // fc++; // // long lap = stw.getTimeElapsed(); // // WebMarkupContainer feedMarkup = new WebMarkupContainer(feedRv.newChildId()); // feedRv.add(feedMarkup); // String errorStatus = feed.getErrorStatus(); // // feedMarkup.add(new ExternalLink("feedtitle", (feed.getLink() == null ? "" : feed.getLink()), feed.getName())); // // if (errorStatus.equals("")) { // feedMarkup.add(new ExternalLink("feedurl", feed.getUrl().toExternalForm(), feed.getTitle())); // feedMarkup // .add(new Label("feeddate", feed.getDate() != null ? Globals.DEFAULT_DISPLAY_DATE_FORMAT.format(feed.getDate()) : " ")); // this is ANSI 160, not space // } else { // feedMarkup.add(new ExternalLink("feedurl", feed.getUrl().toExternalForm(), "Error retrieving feed").add(new Behavior() { // @Override // public void beforeRender(Component component) { // component.getResponse().write(""); // super.beforeRender(component); // } // // @Override // public void afterRender(Component component) { // super.afterRender(component); // component.getResponse().write(""); // } // })); // feedMarkup.add(new Label("feeddate", errorStatus)); // } // // RepeatingView itemRv = new RepeatingView("item"); // feedMarkup.add(itemRv); // String lastDay = null; // ArrayList items = feed.getFeedItems(); // // if (feed.getErrorStatus() != "") { // logger.info("[Client " + remoteHost + "] " + feed.getErrorStatus() + "\n" + feed.getStackTrace()); // } // // Collections.sort(items, FeedItem.LATEST_FIRST); // int count = 0; // for (Iterator it = items.iterator(); it.hasNext(); ) { // FeedItem item = it.next(); // // String itemlabel = item.getTitle() == null ? "—" : StringUtils.cleanHtml(item.getTitle(), feed.getUrl().getPath()); // // if (!item.getTitle().isEmpty() && !feed.getFilter().matches(itemlabel)) { // // WebMarkupContainer itemMarkup = new WebMarkupContainer(itemRv.newChildId()); // itemRv.add(itemMarkup); // // Date itemDate = item.getDate(); // String day = itemDate == null ? " " : DAY_FMT.format(itemDate); //   not space // final boolean dayEqualsLastDay = day.equals(lastDay); // itemMarkup.add(new Label("date", day) { // @Override // public boolean isVisible() { // return !dayEqualsLastDay; // } // }); // if (!dayEqualsLastDay) { // lastDay = day; // } // itemMarkup.add(new Label("itemdate", itemDate == null ? "—" : TIME_FMT.format(itemDate))); // // String itemlink = item.getLink() == null ? "" : item.getLink(); // // String itemsummary = item.getSummary() == null ? "" : StringUtils.cleanHtml(item.getSummary(), feed.getUrl().getPath()); // itemMarkup.add(new ExternalLink("itemlink", itemlink, itemlabel).add(new AttributeModifier("title", itemsummary))); // // String itemAuthor = item.getAuthor() == null || item.getAuthor().equals("") ? "" // : " (" + item.getAuthor().replaceFirst("(.*?)<(.*?)@(.*?)>", "$1").trim() + ")"; // itemMarkup.add(new Label("itemauthor", StringUtils.unquote(itemAuthor))); // // count++; // if (count >= MAX_ITEMS_PER_FEED) { // break; // } // // } // // } // // logger.info("[" + remoteHost + "] #" + fc + ": " + count + " feed items processed (" + (stw.getTimeElapsed() - lap) + " ms)"); // // } // // add(new Label("foot", Globals.TITLE + " " + Version.VERSION + " " + Globals.DEFAULT_DISPLAY_DATE_FORMAT.format(new Date()))); // // logger.info("[" + remoteHost + "] Finished processing feeds after " + stw.getTimeElapsed() + " ms"); return "index"; } @GetMapping("/about") public String about(Model model) { model.addAttribute("appName", appName); return "about"; } }