Initial commit

This commit is contained in:
2020-10-07 16:36:04 +02:00
commit 5b52d0c5fa
26 changed files with 10947 additions and 0 deletions
@@ -0,0 +1,17 @@
package at.windesign.application;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
* The entry point of the Spring Boot application.
*/
@SpringBootApplication
public class Application extends SpringBootServletInitializer
{
public static void main(String[] args)
{
SpringApplication.run(Application.class, args);
}
}
@@ -0,0 +1,105 @@
package at.windesign.application.data.entity;
public class Movie
{
private int movieID;
private String movieTitle;
private String originalTitle;
private String releaseDate;
private String overview;
private String state;
private String resolution;
public Movie(int movieID, String movieTitle, String originalTitle, String releaseDate, String overview, String state, String resolution)
{
super();
this.movieID = movieID;
this.movieTitle = movieTitle;
this.originalTitle = originalTitle;
this.releaseDate = releaseDate;
this.overview = overview;
this.state = state;
this.resolution = resolution;
}
public Movie()
{
}
public int getMovieID()
{
return movieID;
}
public void setMovieID(int movieID)
{
this.movieID = movieID;
}
public String getMovieTitle()
{
return movieTitle;
}
public void setMovieTitle(String movieTitle)
{
this.movieTitle = movieTitle;
}
public String getOriginalTitle()
{
return originalTitle;
}
public void setOriginalTitle(String originalTitle)
{
this.originalTitle = originalTitle;
}
public String getReleaseDate()
{
return releaseDate;
}
public void setReleaseDate(String releaseDate)
{
this.releaseDate = releaseDate;
}
public String getOverview()
{
return overview;
}
public void setOverview(String overview)
{
this.overview = overview;
}
public String getState()
{
return state;
}
public void setState(String state)
{
this.state = state;
}
public String getResolution()
{
return resolution;
}
public void setResolution(String resolution)
{
this.resolution = resolution;
}
@Override
public String toString()
{
return String.valueOf(movieID);
}
}
@@ -0,0 +1,162 @@
package at.windesign.application.data.entity;
/*
$sql = " SELECT serie.seriesID seriesID," .
" serie.seriesName seriesName," .
" YEAR(serie.firstAired) seriesFirstAired," .
" serie.resolution seriesResolution," .
" serie.cliffhanger seriesCliffhanger," .
" serie.status seriesStatus," .
" serie.download seriesDownload," .
" season.seasonNumber seasonNumber," .
" episode.episodeNumber episodeNumber," .
" episode.state episodeState" .
" FROM serie" .
" LEFT JOIN season ON serie.seriesID = season.seriesID" .
" LEFT JOIN episode ON serie.seriesID = episode.seriesID AND season.seasonNumber = episode.seasonNumber" .
" WHERE season.seasonNumber != 0 OR" .
" serie.seriesID >= 1000000 " .
" ORDER BY serie.seriesName," .
" serie.firstAired," .
" season.seasonNumber," .
" episode.episodeNumber;";
*/
public class Series
{
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 episodeState;
public Series(int seriesID, String seriesName, int seriesFirstAired, String seriesResolution, boolean seriesCliffhanger, String seriesStatus, String seriesDownload, int seasonNumber, int episodeNumber, String episodeState)
{
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;
}
public Series()
{
}
public int getSeriesID()
{
return seriesID;
}
public void setSeriesID(int seriesID)
{
this.seriesID = seriesID;
}
public String getSeriesName()
{
return seriesName;
}
public void setSeriesName(String seriesName)
{
this.seriesName = seriesName;
}
public int getSeriesFirstAired()
{
return seriesFirstAired;
}
public void setSeriesFirstAired(int seriesFirstAired)
{
this.seriesFirstAired = seriesFirstAired;
}
public String getSeriesResolution()
{
return seriesResolution;
}
public void setSeriesResolution(String seriesResolution)
{
this.seriesResolution = seriesResolution;
}
public boolean getSeriesCliffhanger()
{
return seriesCliffhanger;
}
public void setSeriesCliffhanger(boolean seriesCliffhanger)
{
this.seriesCliffhanger = seriesCliffhanger;
}
public String getSeriesStatus()
{
return seriesStatus;
}
public void setSeriesStatus(String seriesStatus)
{
this.seriesStatus = seriesStatus;
}
public String getSeriesDownload()
{
return seriesDownload;
}
public void setSeriesDownload(String seriesDownload)
{
this.seriesDownload = seriesDownload;
}
public int getSeasonNumber()
{
return seasonNumber;
}
public void setSeasonNumber(int seasonNumber)
{
this.seasonNumber = seasonNumber;
}
public int getEpisodeNumber()
{
return episodeNumber;
}
public void setEpisodeNumber(int episodeNumber)
{
this.episodeNumber = episodeNumber;
}
public String getEpisodeState()
{
return episodeState;
}
public void setEpisodeState(String episodeState)
{
this.episodeState = episodeState;
}
@Override
public String toString()
{
return String.valueOf(seriesID);
}
}
@@ -0,0 +1,48 @@
package at.windesign.application.data.service;
import at.windesign.application.data.entity.Movie;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class MovieService
{
@Autowired
private JdbcTemplate jdbcTemplate;
public List<Movie> findAll()
{
try
{
return jdbcTemplate.query("SELECT movieID, movieTitle, originalTitle, releaseDate, overview, state, resolution FROM movie ORDER BY movieTitle",
(rs, rowNum) -> new Movie(rs.getInt("movieID"), rs.getString("movieTitle"), rs.getString("originalTitle"), rs.getString("releaseDate"), rs.getString("overview"), rs.getString("state"), rs.getString("resolution")));
} catch(Exception e)
{
return new ArrayList<Movie>();
}
}
public int saveMovie(Movie movie)
{
return 0;
}
private int updateMovie(Movie movie)
{
return 0;
}
private int insertMovie(Movie movie)
{
return 0;
}
public int deleteMovie(Movie movie)
{
return 0;
}
}
@@ -0,0 +1,67 @@
package at.windesign.application.data.service;
import at.windesign.application.data.entity.Series;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class SerieService
{
@Autowired
private JdbcTemplate jdbcTemplate;
public List<Series> findAll()
{
try
{
return jdbcTemplate.query("SELECT serie.seriesID seriesID," +
" serie.seriesName seriesName," +
" YEAR(serie.firstAired) seriesFirstAired," +
" serie.resolution seriesResolution," +
" serie.cliffhanger seriesCliffhanger," +
" serie.status seriesStatus," +
" serie.download seriesDownload," +
" season.seasonNumber seasonNumber," +
" episode.episodeNumber episodeNumber," +
" episode.state episodeState" +
" FROM serie" +
" LEFT JOIN season ON serie.seriesID = season.seriesID" +
" LEFT JOIN episode ON serie.seriesID = episode.seriesID AND season.seasonNumber = episode.seasonNumber" +
" WHERE season.seasonNumber != 0 OR" +
" serie.seriesID >= 1000000 " +
" ORDER BY serie.seriesName," +
" serie.firstAired," +
" season.seasonNumber," +
" episode.episodeNumber;",
(rs, rowNum) -> new Series(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.getString("episodeState")));
} catch(Exception e)
{
return new ArrayList<Series>();
}
}
public int saveSerie(Series Series)
{
return 0;
}
private int updateSerie(Series Series)
{
return 0;
}
private int insertSerie(Series Series)
{
return 0;
}
public int deleteSerie(Series Series)
{
return 0;
}
}
@@ -0,0 +1,84 @@
package at.windesign.application.views.Series;
import at.windesign.application.data.entity.Series;
import at.windesign.application.data.service.SerieService;
import at.windesign.application.views.main.MainView;
import com.vaadin.flow.component.dependency.CssImport;
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.notification.Notification;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.router.AfterNavigationEvent;
import com.vaadin.flow.router.AfterNavigationObserver;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.List;
@Route(value = "series", layout = MainView.class)
@PageTitle("TV Shows")
@CssImport("styles/views/series/series-view.css")
public class SeriesView extends Div implements AfterNavigationObserver
{
@Autowired
private SerieService serieService;
private Grid<Series> series;
private TextField seriesName = new TextField();
private TextField seriesFirstAired = new TextField();
public SeriesView()
{
setId("series-view");
series = new Grid<>();
series.addThemeVariants(GridVariant.LUMO_NO_BORDER);
series.setHeightFull();
series.addColumn(Series::getSeriesName).setHeader("Series Name");
series.addColumn(Series::getSeriesFirstAired).setHeader("First Aired");
series.addColumn(Series::getSeriesResolution).setHeader("Resolution");
series.addColumn(Series::getSeriesCliffhanger).setHeader("Cliffhanger");
//when a row is selected or deselected, populate form
series.asSingleSelect().addValueChangeListener(event -> populateForm(event.getValue()));
series.addItemDoubleClickListener(
event ->
{
Notification.show("Clicked Item: " + event.getItem());
});
add(series);
}
@Override
public void afterNavigation(AfterNavigationEvent event)
{
List<Series> seriesList = serieService.findAll();
List<Series> seriesList1 = new ArrayList<Series>();
int oldID = -1;
for(Series s : seriesList)
{
if(s.getSeriesID() != oldID)
{
oldID = s.getSeriesID();
seriesList1.add(s);
}
};
series.setItems(seriesList1);
}
private void populateForm(Series value)
{
if(value == null)
{
value = new Series();
}
}
}
@@ -0,0 +1,123 @@
package at.windesign.application.views.main;
import java.util.Optional;
import at.windesign.application.views.Series.SeriesView;
import at.windesign.application.views.movies.MoviesView;
import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.ComponentUtil;
import com.vaadin.flow.component.applayout.DrawerToggle;
import com.vaadin.flow.component.dependency.CssImport;
import com.vaadin.flow.component.dependency.JsModule;
import com.vaadin.flow.component.applayout.AppLayout;
import com.vaadin.flow.component.html.H1;
import com.vaadin.flow.component.html.Image;
import com.vaadin.flow.component.orderedlayout.FlexComponent;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.tabs.Tab;
import com.vaadin.flow.component.tabs.Tabs;
import com.vaadin.flow.component.tabs.TabsVariant;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.RouterLink;
import com.vaadin.flow.server.PWA;
/**
* The main view is a top-level placeholder for other views.
*/
@JsModule("./styles/shared-styles.js")
@CssImport("./styles/views/main/main-view.css")
@PWA(name = "multimedia", shortName = "multimedia", enableInstallPrompt = false)
//@Theme(value = Lumo.class, variant = Lumo.LIGHT)
public class MainView extends AppLayout
{
private final Tabs menu;
private H1 viewTitle;
public MainView()
{
setPrimarySection(Section.DRAWER);
addToNavbar(true, createHeaderContent());
menu = createMenu();
addToDrawer(createDrawerContent(menu));
}
private Component createHeaderContent()
{
HorizontalLayout layout = new HorizontalLayout();
layout.setId("header");
layout.getThemeList().set("dark", true);
layout.setWidthFull();
layout.setSpacing(false);
layout.setAlignItems(FlexComponent.Alignment.CENTER);
layout.add(new DrawerToggle());
viewTitle = new H1();
layout.add(viewTitle);
layout.add(new Image("images/user.svg", "Avatar"));
return layout;
}
private Component createDrawerContent(Tabs menu)
{
VerticalLayout layout = new VerticalLayout();
layout.setSizeFull();
layout.setPadding(false);
layout.setSpacing(false);
layout.getThemeList().set("spacing-s", true);
layout.setAlignItems(FlexComponent.Alignment.STRETCH);
HorizontalLayout logoLayout = new HorizontalLayout();
logoLayout.setId("logo");
logoLayout.setAlignItems(FlexComponent.Alignment.CENTER);
logoLayout.add(new Image("images/logo.png", "multimedia logo"));
logoLayout.add(new H1("multimedia"));
layout.add(logoLayout, menu);
return layout;
}
private Tabs createMenu()
{
final Tabs tabs = new Tabs();
tabs.setOrientation(Tabs.Orientation.VERTICAL);
tabs.addThemeVariants(TabsVariant.LUMO_MINIMAL);
tabs.setId("tabs");
tabs.add(createMenuItems());
return tabs;
}
private Component[] createMenuItems()
{
return new Tab[]{
createTab("TVShows", SeriesView.class),
createTab("Movies", MoviesView.class),
};
}
private static Tab createTab(String text, Class<? extends Component> navigationTarget)
{
final Tab tab = new Tab();
tab.add(new RouterLink(text, navigationTarget));
ComponentUtil.setData(tab, Class.class, navigationTarget);
return tab;
}
@Override
protected void afterNavigation()
{
super.afterNavigation();
getTabForComponent(getContent()).ifPresent(menu::setSelectedTab);
viewTitle.setText(getCurrentPageTitle());
}
private Optional<Tab> getTabForComponent(Component component)
{
return menu.getChildren()
.filter(tab -> ComponentUtil.getData(tab, Class.class)
.equals(component.getClass()))
.findFirst().map(Tab.class::cast);
}
private String getCurrentPageTitle()
{
return getContent().getClass().getAnnotation(PageTitle.class).value();
}
}
@@ -0,0 +1,68 @@
package at.windesign.application.views.movies;
import at.windesign.application.data.entity.Movie;
import at.windesign.application.data.service.MovieService;
import at.windesign.application.views.main.MainView;
import com.vaadin.flow.component.dependency.CssImport;
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.notification.Notification;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.router.AfterNavigationEvent;
import com.vaadin.flow.router.AfterNavigationObserver;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import org.springframework.beans.factory.annotation.Autowired;
@Route(value = "movies", layout = MainView.class)
@PageTitle("Movies")
@CssImport("styles/views/movies/movies-view.css")
public class MoviesView extends Div implements AfterNavigationObserver
{
@Autowired
private MovieService movieService;
private Grid<Movie> movies;
private TextField movieTitle = new TextField();
private TextField originalTitle = new TextField();
public MoviesView()
{
setId("movies-view");
movies = new Grid<>();
movies.addThemeVariants(GridVariant.LUMO_NO_BORDER);
movies.setHeightFull();
movies.addColumn(Movie::getMovieTitle).setHeader("Movie Title");
movies.addColumn(Movie::getOriginalTitle).setHeader("Original Title");
movies.addColumn(Movie::getReleaseDate).setHeader("Release Date");
movies.addColumn(Movie::getResolution).setHeader("Resolution");
//when a row is selected or deselected, populate form
movies.asSingleSelect().addValueChangeListener(event -> populateForm(event.getValue()));
movies.addItemDoubleClickListener(
event ->
{
Notification.show("Clicked Item: " + event.getItem());
});
add(movies);
}
@Override
public void afterNavigation(AfterNavigationEvent event)
{
movies.setItems(movieService.findAll());
}
private void populateForm(Movie value)
{
if(value == null)
{
value = new Movie();
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

+15
View File
@@ -0,0 +1,15 @@
server.port=8080
# Ensure application is run in Vaadin 14/npm mode
vaadin.compatibilityMode = false
# Workaround for https://github.com/vaadin/flow/issues/5947
spring.devtools.restart.additional-exclude=META-INF/VAADIN/config/**
logging.level.org.atmosphere = warn
## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.url = jdbc:mysql://localhost:3306/multimedia
spring.datasource.username = multimedia
spring.datasource.password = WeissIchNicht8
##spring.datasource.url = jdbc:mysql://localhost:3306/dummydata
##spring.datasource.username = dummydata
##spring.datasource.password = dummydata
+6
View File
@@ -0,0 +1,6 @@
_ _ _ _ _
__| | __ _ | |_ __ _ | |__ __ _ ___ ___ _ __ ___ _ _ ___ __ _ | | ___ __ __ __ _ _ __ ___ _ __ | | ___
/ _` | / _` || __| / _` || '_ \ / _` |/ __| / _ \ _____ | '_ ` _ \ | | | |/ __| / _` || | _____ / _ \\ \/ / / _` || '_ ` _ \ | '_ \ | | / _ \
| (_| || (_| || |_ | (_| || |_) || (_| |\__ \| __/|_____|| | | | | || |_| |\__ \| (_| || ||_____|| __/ > < | (_| || | | | | || |_) || || __/
\__,_| \__,_| \__| \__,_||_.__/ \__,_||___/ \___| |_| |_| |_| \__, ||___/ \__, ||_| \___|/_/\_\ \__,_||_| |_| |_|| .__/ |_| \___|
|___/ |_| |_|