From d4824f2f886c8e192cf2f696b42db0e317982185 Mon Sep 17 00:00:00 2001 From: Herwig Birke Date: Mon, 12 Oct 2020 18:04:48 +0200 Subject: [PATCH] initial commit --- .../application/data/entity/Episode.java | 62 ++++++--- .../application/data/entity/Serie.java | 44 ++++-- .../data/service/EpisodeService.java | 18 ++- .../application/views/Series/SeriesView.java | 126 +++++++++++------- 4 files changed, 171 insertions(+), 79 deletions(-) diff --git a/src/main/java/at/windesign/application/data/entity/Episode.java b/src/main/java/at/windesign/application/data/entity/Episode.java index fae6512..a967363 100644 --- a/src/main/java/at/windesign/application/data/entity/Episode.java +++ b/src/main/java/at/windesign/application/data/entity/Episode.java @@ -2,30 +2,34 @@ package at.windesign.application.data.entity; public class Episode { - private int seriesID; - private String seriesName; - private int seriesFirstAired; - private String seriesResolution; + private int seriesID; + private String seriesName; + private int seriesFirstAired; + private String seriesResolution; private boolean seriesCliffhanger; - private String seriesStatus; - private String seriesDownload; - private int seasonNumber; - private int episodeNumber; + private String seriesStatus; + private String seriesDownload; + private int seasonNumber; + private int episodeNumber; private Integer episodeState; + private int minSeason; + private int maxSeason; - public Episode(int seriesID, String seriesName, int seriesFirstAired, String seriesResolution, boolean seriesCliffhanger, String seriesStatus, String seriesDownload, int seasonNumber, int episodeNumber, Integer episodeState) + public Episode(int seriesID, String seriesName, int seriesFirstAired, String seriesResolution, boolean seriesCliffhanger, String seriesStatus, String seriesDownload, int seasonNumber, int episodeNumber, Integer episodeState, int minSeason, int maxSeason) { super(); - this.seriesID = seriesID; - this.seriesName = seriesName; - this.seriesFirstAired = seriesFirstAired; - this.seriesResolution = seriesResolution; - this.seriesCliffhanger = seriesCliffhanger; - this.seriesStatus = seriesStatus; - this.seriesDownload = seriesDownload; - this.seasonNumber = seasonNumber; - this.episodeNumber = episodeNumber; - this.episodeState = episodeState; + this.seriesID = seriesID; + this.seriesName = seriesName; + this.seriesFirstAired = seriesFirstAired; + this.seriesResolution = seriesResolution; + this.seriesCliffhanger = seriesCliffhanger; + this.seriesStatus = seriesStatus; + this.seriesDownload = seriesDownload; + this.seasonNumber = seasonNumber; + this.episodeNumber = episodeNumber; + this.episodeState = episodeState; + this.minSeason = minSeason; + this.maxSeason = maxSeason; } public Episode() @@ -132,6 +136,26 @@ public class Episode this.episodeState = episodeState; } + public int getMinSeason() + { + return minSeason; + } + + public void setMinSeason(int minSeason) + { + this.minSeason = minSeason; + } + + public int getMaxSeason() + { + return maxSeason; + } + + public void setMaxSeason(int maxSeason) + { + this.maxSeason = maxSeason; + } + @Override public String toString() { diff --git a/src/main/java/at/windesign/application/data/entity/Serie.java b/src/main/java/at/windesign/application/data/entity/Serie.java index 2f16035..22696f2 100644 --- a/src/main/java/at/windesign/application/data/entity/Serie.java +++ b/src/main/java/at/windesign/application/data/entity/Serie.java @@ -1,5 +1,7 @@ package at.windesign.application.data.entity; +import com.vaadin.flow.component.icon.Icon; +import com.vaadin.flow.component.icon.VaadinIcon; import com.vaadin.flow.server.StreamResource; import javax.imageio.ImageIO; @@ -14,16 +16,18 @@ import java.util.SortedMap; public class Serie { - private int seriesID; - private String seriesName; - private int seriesFirstAired; - private String seriesResolution; - private boolean seriesCliffhanger; - private String seriesStatus; - private String seriesDownload; - SortedMap episodeState; + private int seriesID; + private String seriesName; + private int seriesFirstAired; + private String seriesResolution; + private boolean seriesCliffhanger; + private String seriesStatus; + private String seriesDownload; + private SortedMap episodeState; + private int minSeason; + private int maxSeason; - public Serie(int seriesID, String seriesName, int seriesFirstAired, String seriesResolution, boolean seriesCliffhanger, String seriesStatus, String seriesDownload, SortedMap episodeState) + public Serie(int seriesID, String seriesName, int seriesFirstAired, String seriesResolution, boolean seriesCliffhanger, String seriesStatus, String seriesDownload, SortedMap episodeState, int minSeason, int maxSeason) { super(); this.seriesID = seriesID; @@ -34,6 +38,8 @@ public class Serie this.seriesStatus = seriesStatus; this.seriesDownload = seriesDownload; this.episodeState = episodeState; + this.minSeason = minSeason; + this.maxSeason = maxSeason; } public Serie() @@ -120,6 +126,26 @@ public class Serie this.episodeState = episodeState; } + public int getMinSeason() + { + return minSeason; + } + + public void setMinSeason(int minSeason) + { + this.minSeason = minSeason; + } + + public int getMaxSeason() + { + return maxSeason; + } + + public void setMaxSeason(int maxSeason) + { + this.maxSeason = maxSeason; + } + @Override public String toString() { diff --git a/src/main/java/at/windesign/application/data/service/EpisodeService.java b/src/main/java/at/windesign/application/data/service/EpisodeService.java index 1fd99a2..fcae5f5 100644 --- a/src/main/java/at/windesign/application/data/service/EpisodeService.java +++ b/src/main/java/at/windesign/application/data/service/EpisodeService.java @@ -27,7 +27,9 @@ public class EpisodeService " serie.download seriesDownload," + " season.seasonNumber seasonNumber," + " episode.episodeNumber episodeNumber," + - " episode.state episodeState" + + " episode.state episodeState," + + " ( SELECT MIN(s.seasonNumber) FROM season s WHERE s.seriesID = serie.seriesID ) minSeason," + + " ( SELECT MAX(s.seasonNumber) FROM season s WHERE s.seriesID = serie.seriesID ) maxSeason" + " FROM serie" + " LEFT JOIN season ON serie.seriesID = season.seriesID" + " LEFT JOIN episode ON serie.seriesID = episode.seriesID AND season.seasonNumber = episode.seasonNumber" + @@ -37,14 +39,24 @@ public class EpisodeService " serie.firstAired," + " season.seasonNumber," + " episode.episodeNumber;", - (rs, rowNum) -> new Episode(rs.getInt("seriesID"), rs.getString("seriesName"), rs.getInt("seriesFirstAired"), rs.getString("seriesResolution"), rs.getBoolean("seriesCliffhanger"), rs.getString("seriesStatus"), rs.getString("seriesDownload"), rs.getInt("seasonNumber"), rs.getInt("episodeNumber"), rs.getInt("episodeState"))); + (rs, rowNum) -> new Episode(rs.getInt("seriesID"), rs.getString("seriesName"), rs.getInt("seriesFirstAired"), rs.getString("seriesResolution"), rs.getBoolean("seriesCliffhanger"), rs.getString("seriesStatus"), rs.getString("seriesDownload"), rs.getInt("seasonNumber"), rs.getInt("episodeNumber"), rs.getInt("episodeState"), rs.getInt("minSeason"), rs.getInt("maxSeason"))); } catch(Exception e) { - return new ArrayList(); + return new ArrayList<>(); } } + public Integer minSeason() + { + return jdbcTemplate.queryForObject("SELECT MIN(seasonNumber) FROM season;", Integer.class); + } + + public Integer maxSeason() + { + return jdbcTemplate.queryForObject("SELECT MAX(seasonNumber) FROM season;", Integer.class); + } + public int saveEpisode(Episode Episode) { return 0; diff --git a/src/main/java/at/windesign/application/views/Series/SeriesView.java b/src/main/java/at/windesign/application/views/Series/SeriesView.java index 2aa8d95..7aba5b3 100644 --- a/src/main/java/at/windesign/application/views/Series/SeriesView.java +++ b/src/main/java/at/windesign/application/views/Series/SeriesView.java @@ -9,6 +9,8 @@ import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.grid.GridVariant; import com.vaadin.flow.component.html.Div; import com.vaadin.flow.component.html.Image; +import com.vaadin.flow.component.icon.Icon; +import com.vaadin.flow.component.icon.VaadinIcon; import com.vaadin.flow.component.notification.Notification; import com.vaadin.flow.component.textfield.TextField; import com.vaadin.flow.router.AfterNavigationEvent; @@ -19,12 +21,14 @@ import com.vaadin.flow.server.StreamResource; import org.springframework.beans.factory.annotation.Autowired; import javax.imageio.ImageIO; +import javax.xml.transform.stream.StreamSource; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.text.DateFormat; import java.util.*; import java.util.List; @@ -41,13 +45,13 @@ public class SeriesView extends Div implements AfterNavigationObserver private TextField seriesName = new TextField(); private TextField seriesFirstAired = new TextField(); - ByteArrayOutputStream imagebuffer = null; - StreamResource resource; + private Integer minSeason = 0; + private Integer maxSeason = 0; + + private boolean isInitialized = false; public SeriesView() { - resource = new StreamResource("image.png", () -> getImageInputStream()); - setId("series-view"); serie = new Grid<>(); @@ -57,12 +61,6 @@ public class SeriesView extends Div implements AfterNavigationObserver serie.addColumn(Serie::getSeriesFirstAired).setHeader("First Aired"); serie.addColumn(Serie::getSeriesResolution).setHeader("Resolution"); serie.addColumn(Serie::getSeriesCliffhanger).setHeader("Cliffhanger"); - serie.addComponentColumn(i -> new Image(resource, "alt text")).setHeader("Preview"); -// serie.addComponentColumn(i -> new Image(new StreamResource("image.png", () -> getImageInputStream(Serie::getEpisodeState)), "alt text")).setHeader("Preview"); - - - //when a row is selected or deselected, populate form - serie.asSingleSelect().addValueChangeListener(event -> populateForm(event.getValue())); serie.addItemDoubleClickListener( event -> @@ -76,11 +74,33 @@ public class SeriesView extends Div implements AfterNavigationObserver @Override public void afterNavigation(AfterNavigationEvent event) { - List episodeList = episodeService.findAll(); - List serieList = new ArrayList<>(); - Episode lastEpisode = null; + if(!isInitialized) + { + minSeason = episodeService.minSeason(); + maxSeason = episodeService.maxSeason(); + + if(minSeason < 1) + minSeason = 1; + + for(Integer s = minSeason; s <= maxSeason; s++) + { + final Integer sFinal = s; + serie.addComponentColumn(i -> + { +// StreamResource r = new StreamResource("image.png", () -> getImageInputStream(sFinal, i.getEpisodeState())); +// Image img = new Image(r, ""); +// return img; + return new Image(new StreamResource("image.png", () -> getImageInputStream(sFinal, i.getEpisodeState())), ""); + }).setHeader("Season " + sFinal); + } + isInitialized = true; + } + + List episodeList = episodeService.findAll(); + List serieList = new ArrayList<>(); + Episode lastEpisode = null; SortedMap episodeState = new TreeMap<>(); - int oldID = -1; + int oldID = -1; for(Episode e : episodeList) { @@ -88,63 +108,73 @@ public class SeriesView extends Div implements AfterNavigationObserver { if(oldID != -1) { - serieList.add(new Serie(lastEpisode.getSeriesID(), lastEpisode.getSeriesName(), lastEpisode.getSeriesFirstAired(), lastEpisode.getSeriesResolution(), lastEpisode.getSeriesCliffhanger(), lastEpisode.getSeriesStatus(), lastEpisode.getSeriesDownload(), episodeState)); - episodeState.clear(); + serieList.add(new Serie(lastEpisode.getSeriesID(), lastEpisode.getSeriesName(), lastEpisode.getSeriesFirstAired(), lastEpisode.getSeriesResolution(), lastEpisode.getSeriesCliffhanger(), lastEpisode.getSeriesStatus(), lastEpisode.getSeriesDownload(), episodeState, lastEpisode.getMinSeason(), lastEpisode.getMaxSeason())); + episodeState = new TreeMap<>(); } lastEpisode = e; oldID = e.getSeriesID(); } - episodeState.put(e.getSeasonNumber() << 8 + e.getEpisodeNumber(), e.getEpisodeState()); + episodeState.put((e.getSeasonNumber() << 8) + e.getEpisodeNumber(), e.getEpisodeState()); } if(oldID != -1) - serieList.add(new Serie(lastEpisode.getSeriesID(), lastEpisode.getSeriesName(), lastEpisode.getSeriesFirstAired(), lastEpisode.getSeriesResolution(), lastEpisode.getSeriesCliffhanger(), lastEpisode.getSeriesStatus(), lastEpisode.getSeriesDownload(), episodeState)); + serieList.add(new Serie(lastEpisode.getSeriesID(), lastEpisode.getSeriesName(), lastEpisode.getSeriesFirstAired(), lastEpisode.getSeriesResolution(), lastEpisode.getSeriesCliffhanger(), lastEpisode.getSeriesStatus(), lastEpisode.getSeriesDownload(), episodeState, lastEpisode.getMinSeason(), lastEpisode.getMaxSeason())); serie.setItems(serieList); } - private void populateForm(Serie value) + private InputStream getImageInputStream(Integer curSeason, SortedMap state) { - if(value == null) - { - value = new Serie(); - } - } + ByteArrayOutputStream imagebuffer = null; + Integer season = -1; + Integer episode = -1; + boolean found = false; -// private InputStream getImageInputStream(SortedMap state) - private InputStream getImageInputStream() - { -// int reloads = state.firstKey(); - int reloads = 1; - BufferedImage image = new BufferedImage(400, 400, BufferedImage.TYPE_INT_RGB); + for(Integer key : state.keySet()) + { + season = key >> 8; + episode = key & 0xFF; + + if(season == curSeason) + { + found = true; + break; + } + } + + if(!found) + { + BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); + Graphics2D drawable = image.createGraphics(); + + drawable.setColor(Color.WHITE); + drawable.fillRect(0, 0, 1, 1); + + try + { + imagebuffer = new ByteArrayOutputStream(); + ImageIO.write(image, "png", imagebuffer); + return new ByteArrayInputStream(imagebuffer.toByteArray()); + } catch(IOException e) + { + return null; + } + } + + BufferedImage image = new BufferedImage(100, 10, BufferedImage.TYPE_INT_RGB); Graphics2D drawable = image.createGraphics(); - // Draw something static - drawable.setStroke(new BasicStroke(5)); drawable.setColor(Color.WHITE); - drawable.fillRect(0, 0, 400, 400); + drawable.fillRect(0, 0, 100, 10); drawable.setColor(Color.BLACK); - drawable.drawOval(50, 50, 300, 300); - - // Draw something dynamic - drawable.setFont(new Font("Montserrat", - Font.PLAIN, 48)); - drawable.drawString("Reloads=" + reloads, 75, 216); - reloads++; - drawable.setColor(new Color(0, 165, 235)); - int x = (int) (200 - 10 + 150 * Math.sin(reloads * 0.3)); - int y = (int) (200 - 10 + 150 * Math.cos(reloads * 0.3)); - drawable.fillOval(x, y, 20, 20); + drawable.drawString("S" + season + "E" + episode, 5, 10); try { - // Write the image to a buffer imagebuffer = new ByteArrayOutputStream(); ImageIO.write(image, "png", imagebuffer); - // Return a stream from the buffer - return new ByteArrayInputStream( - imagebuffer.toByteArray()); + return new ByteArrayInputStream(imagebuffer.toByteArray()); } catch(IOException e) { return null;