initial commit
This commit is contained in:
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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<Integer, Integer> episodeState;
|
||||
private int seriesID;
|
||||
private String seriesName;
|
||||
private int seriesFirstAired;
|
||||
private String seriesResolution;
|
||||
private boolean seriesCliffhanger;
|
||||
private String seriesStatus;
|
||||
private String seriesDownload;
|
||||
private SortedMap<Integer, Integer> episodeState;
|
||||
private int minSeason;
|
||||
private int maxSeason;
|
||||
|
||||
public Serie(int seriesID, String seriesName, int seriesFirstAired, String seriesResolution, boolean seriesCliffhanger, String seriesStatus, String seriesDownload, SortedMap<Integer, Integer> episodeState)
|
||||
public Serie(int seriesID, String seriesName, int seriesFirstAired, String seriesResolution, boolean seriesCliffhanger, String seriesStatus, String seriesDownload, SortedMap<Integer, Integer> 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()
|
||||
{
|
||||
|
||||
@@ -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<Episode>();
|
||||
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;
|
||||
|
||||
@@ -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<Episode> episodeList = episodeService.findAll();
|
||||
List<Serie> 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<Episode> episodeList = episodeService.findAll();
|
||||
List<Serie> serieList = new ArrayList<>();
|
||||
Episode lastEpisode = null;
|
||||
SortedMap<Integer, Integer> 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<Integer, Integer> state)
|
||||
{
|
||||
if(value == null)
|
||||
{
|
||||
value = new Serie();
|
||||
}
|
||||
}
|
||||
ByteArrayOutputStream imagebuffer = null;
|
||||
Integer season = -1;
|
||||
Integer episode = -1;
|
||||
boolean found = false;
|
||||
|
||||
// private InputStream getImageInputStream(SortedMap<Integer, Integer> 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;
|
||||
|
||||
Reference in New Issue
Block a user