From 8bcd8cb9a17b5654a0f51195f61dd2fb7f1aad63 Mon Sep 17 00:00:00 2001 From: tim holloway Date: Wed, 31 Jan 2024 11:44:01 -0500 Subject: [PATCH] Version2 - Spring Boot 3.2.2 and jakarta EE --- .classpath | 22 ++-- .project | 8 +- application.properties | 14 +-- pom.xml | 103 +++++++++++------- .../com/mousetech/gourmetj/AdminMainBean.java | 15 +-- .../com/mousetech/gourmetj/CategoryView.java | 8 +- .../com/mousetech/gourmetj/CuisineBean.java | 6 +- .../mousetech/gourmetj/EditShopcatBean.java | 12 +- .../java/com/mousetech/gourmetj/JSFUtils.java | 8 +- .../mousetech/gourmetj/RecipeDetailBean.java | 25 ++--- .../mousetech/gourmetj/ShoppingListBean.java | 8 +- .../gourmetj/SpringPrimeFacesApplication.java | 17 +-- .../gourmetj/SpringSecurityConfig.java | 90 +++++++++------ .../com/mousetech/gourmetj/UserSession.java | 6 +- .../persistence/dao/PantryRepository.java | 2 +- .../persistence/dao/ShopcatRepository.java | 2 +- .../gourmetj/persistence/model/Category.java | 2 +- .../gourmetj/persistence/model/Convtable.java | 2 +- .../persistence/model/Crossunitdict.java | 2 +- .../gourmetj/persistence/model/Density.java | 2 +- .../gourmetj/persistence/model/Info.java | 2 +- .../persistence/model/Ingredient.java | 4 +- .../gourmetj/persistence/model/Keylookup.java | 2 +- .../gourmetj/persistence/model/Pantry.java | 2 +- .../persistence/model/PluginInfo.java | 2 +- .../gourmetj/persistence/model/Recipe.java | 2 +- .../gourmetj/persistence/model/Shopcat.java | 22 ++-- .../persistence/model/Shopcatsorder.java | 2 +- .../gourmetj/persistence/model/Unitdict.java | 2 +- .../persistence/service/CategoryService.java | 6 +- .../persistence/service/RecipeService.java | 6 +- .../gourmetj/springweb/PictureController.java | 6 +- .../gourmetj/utils/TimeConverter.java | 17 +-- .../gourmetj/utils/YamlShoppingList.java | 28 ++++- src/main/resources/application.yml | 6 +- xxx | 0 36 files changed, 272 insertions(+), 191 deletions(-) create mode 100644 xxx diff --git a/.classpath b/.classpath index f6013c0..abdaa94 100644 --- a/.classpath +++ b/.classpath @@ -9,17 +9,11 @@ + - - - - - - - - + @@ -60,14 +54,12 @@ - - @@ -89,16 +81,24 @@ + + + + + + + + + - diff --git a/.project b/.project index e2034e0..0d22db8 100644 --- a/.project +++ b/.project @@ -5,6 +5,11 @@ + + org.eclipse.wst.common.project.facet.core.builder + + + org.eclipse.jdt.core.javabuilder @@ -17,7 +22,8 @@ - org.eclipse.m2e.core.maven2Nature org.eclipse.jdt.core.javanature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.m2e.core.maven2Nature diff --git a/application.properties b/application.properties index 8a40528..68ffaef 100644 --- a/application.properties +++ b/application.properties @@ -1,13 +1,8 @@ # THIS is the application properties used when testing in the IDE -# The application.yml (production) is ignored. -#joinfaces.jsf.project-stage=development -# They lied. This doesn't work: -joinfaces.primefaces.theme=cupertino +# or running stand-alone from the command line. +# It augments/overrides application.yml in the JAR joinfaces.jsf.webapp-resources-directory=/resources -# This works. Note that ONLY THE FIRST theme set will work unless -# you delete the old primefaces.THEME from ServletContext -server.servlet.context-parameters.primefaces.THEME=omega server.servlet.session.timeout=30m spring.thymeleaf.enabled=false @@ -19,10 +14,11 @@ spring.datasource.username=recipes pring.datasource.password=yumyumyum spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver #org.sqlite.JDBC -#spring.jpa.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect -spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect +#Obs, no longer required: +#spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect #org.sqlite.hibernate.dialect.SQLiteDialect #spring.jpa.show-sql: true # My special properties gourmet.password.file=${user.home}/.gourmetpw + diff --git a/pom.xml b/pom.xml index 18aaef3..30af0fd 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.mousetech.gourmet gourmetj - 0.1.4-SNAPSHOT + 0.2.0-SNAPSHOT jar GourmetJ @@ -17,7 +17,7 @@ org.springframework.boot spring-boot-starter-parent - 2.1.0.RELEASE + 3.2.2 @@ -30,25 +30,44 @@ + + 3.0.2 + 5.2.2 + 3.9.6 + UTF-8 UTF-8 - 11 - 3.3.0-rc2 + 17 + 3.2.2 + 4.0.5 + 5.2.2 + 3.10.1 5.4.0 + + jakarta.validation + jakarta.validation-api + ${jakarta.validation-api.version} + org.joinfaces - joinfaces-dependencies + joinfaces-bom ${joinfaces.version} pom import + + org.apache.maven + maven-model + ${maven-model.version} + + org.joinfaces @@ -59,10 +78,10 @@ all-themes 1.0.10 - + org.springframework.boot spring-boot-starter-security @@ -71,55 +90,72 @@ org.springframework.boot spring-boot-starter-data-jpa + + + - javax.validation - validation-api + jakarta.validation + jakarta.validation-api - + org.hibernate.validator hibernate-validator - + org.springframework.boot spring-boot-starter-web - - javax.servlet.jsp - javax.servlet.jsp-api + + org.apache.tomcat.embed tomcat-embed-jasper provided - + - + com.twelvemonkeys.imageio imageio-core - 3.8.1 + ${twelvemonkeys.version} + + + org.apache.commons + commons-lang3 - + com.twelvemonkeys.imageio imageio-webp - 3.8.1 + ${twelvemonkeys.version} compile - - org.xerial - sqlite-jdbc - - - com.github.gwenn - sqlite-dialect - 0.1.2 - + org.junit.jupiter junit-jupiter - ${junit.jupiter.version} test @@ -164,7 +194,6 @@ test - diff --git a/src/main/java/com/mousetech/gourmetj/AdminMainBean.java b/src/main/java/com/mousetech/gourmetj/AdminMainBean.java index 317e144..96fcf16 100644 --- a/src/main/java/com/mousetech/gourmetj/AdminMainBean.java +++ b/src/main/java/com/mousetech/gourmetj/AdminMainBean.java @@ -2,13 +2,13 @@ package com.mousetech.gourmetj; import java.io.Serializable; -import javax.annotation.PostConstruct; -import javax.faces.event.AjaxBehaviorEvent; -import javax.faces.model.DataModel; -import javax.faces.model.ListDataModel; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.annotation.PostConstruct; +import jakarta.faces.event.AjaxBehaviorEvent; +import jakarta.faces.model.DataModel; +import jakarta.faces.model.ListDataModel; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -177,6 +177,7 @@ public class AdminMainBean implements Serializable { */ public String doFind() { List recipes = null; + searchText = searchText.trim(); switch (this.getUserSession().getSearchType()) { case rst_BY_NAME: diff --git a/src/main/java/com/mousetech/gourmetj/CategoryView.java b/src/main/java/com/mousetech/gourmetj/CategoryView.java index 1026c7a..4b52268 100644 --- a/src/main/java/com/mousetech/gourmetj/CategoryView.java +++ b/src/main/java/com/mousetech/gourmetj/CategoryView.java @@ -2,10 +2,10 @@ package com.mousetech.gourmetj; import java.io.Serializable; import java.util.List; -import javax.annotation.PostConstruct; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.annotation.PostConstruct; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/mousetech/gourmetj/CuisineBean.java b/src/main/java/com/mousetech/gourmetj/CuisineBean.java index 52ee14b..cb28087 100644 --- a/src/main/java/com/mousetech/gourmetj/CuisineBean.java +++ b/src/main/java/com/mousetech/gourmetj/CuisineBean.java @@ -8,9 +8,9 @@ package com.mousetech.gourmetj; import java.util.List; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import com.mousetech.gourmetj.persistence.service.RecipeService; diff --git a/src/main/java/com/mousetech/gourmetj/EditShopcatBean.java b/src/main/java/com/mousetech/gourmetj/EditShopcatBean.java index ce8629a..0f040b3 100644 --- a/src/main/java/com/mousetech/gourmetj/EditShopcatBean.java +++ b/src/main/java/com/mousetech/gourmetj/EditShopcatBean.java @@ -3,12 +3,12 @@ package com.mousetech.gourmetj; import java.io.Serializable; import java.util.List; -import javax.annotation.PostConstruct; -import javax.faces.event.AjaxBehaviorEvent; -import javax.faces.event.ValueChangeEvent; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.annotation.PostConstruct; +import jakarta.faces.event.AjaxBehaviorEvent; +import jakarta.faces.event.ValueChangeEvent; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import com.mousetech.gourmetj.persistence.dao.ShopcatRepository; diff --git a/src/main/java/com/mousetech/gourmetj/JSFUtils.java b/src/main/java/com/mousetech/gourmetj/JSFUtils.java index 536c6e4..f461f4b 100644 --- a/src/main/java/com/mousetech/gourmetj/JSFUtils.java +++ b/src/main/java/com/mousetech/gourmetj/JSFUtils.java @@ -2,10 +2,10 @@ package com.mousetech.gourmetj; import java.io.InputStream; -import javax.faces.application.FacesMessage; -import javax.faces.context.ExternalContext; -import javax.faces.context.FacesContext; -import javax.faces.context.Flash; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.context.ExternalContext; +import jakarta.faces.context.FacesContext; +import jakarta.faces.context.Flash; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/mousetech/gourmetj/RecipeDetailBean.java b/src/main/java/com/mousetech/gourmetj/RecipeDetailBean.java index 5479071..b00c689 100644 --- a/src/main/java/com/mousetech/gourmetj/RecipeDetailBean.java +++ b/src/main/java/com/mousetech/gourmetj/RecipeDetailBean.java @@ -7,24 +7,23 @@ import java.util.List; import java.util.Objects; import java.util.Set; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; -import javax.faces.event.AjaxBehaviorEvent; -import javax.faces.model.DataModel; -import javax.faces.model.ListDataModel; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; -import javax.servlet.http.Part; +import jakarta.faces.model.DataModel; +import jakarta.faces.model.ListDataModel; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.servlet.http.Part; +import jakarta.faces.event.AjaxBehaviorEvent; import org.apache.commons.lang3.StringUtils; import org.primefaces.event.FileUploadEvent; -import org.primefaces.model.UploadedFile; +import org.primefaces.model.file.UploadedFile; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.mousetech.gourmetj.IngredientUI; -import com.mousetech.gourmetj.UserSession; + import com.mousetech.gourmetj.persistence.model.Category; import com.mousetech.gourmetj.persistence.model.Ingredient; import com.mousetech.gourmetj.persistence.model.Recipe; @@ -391,7 +390,7 @@ public class RecipeDetailBean implements Serializable { * * @param event Unused */ - public void ajaxAddIngredient(AjaxBehaviorEvent event) { + public void ajaxAddIngredient(jakarta.faces.event.AjaxBehaviorEvent event) { doAddIngredient(); } @@ -1088,7 +1087,7 @@ public class RecipeDetailBean implements Serializable { public void ajaxUploadImage(FileUploadEvent event) { UploadedFile foo = event.getFile(); - PictureController.importImage(recipe, foo.getContents()); + PictureController.importImage(recipe, foo.getContent()); } /** diff --git a/src/main/java/com/mousetech/gourmetj/ShoppingListBean.java b/src/main/java/com/mousetech/gourmetj/ShoppingListBean.java index ea1da3e..f530330 100644 --- a/src/main/java/com/mousetech/gourmetj/ShoppingListBean.java +++ b/src/main/java/com/mousetech/gourmetj/ShoppingListBean.java @@ -6,10 +6,10 @@ import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; -import javax.annotation.PostConstruct; -import javax.faces.view.ViewScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.annotation.PostConstruct; +import jakarta.faces.view.ViewScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.apache.commons.lang3.StringUtils; import org.primefaces.model.StreamedContent; diff --git a/src/main/java/com/mousetech/gourmetj/SpringPrimeFacesApplication.java b/src/main/java/com/mousetech/gourmetj/SpringPrimeFacesApplication.java index d7a3e72..4cbbc98 100644 --- a/src/main/java/com/mousetech/gourmetj/SpringPrimeFacesApplication.java +++ b/src/main/java/com/mousetech/gourmetj/SpringPrimeFacesApplication.java @@ -1,8 +1,8 @@ package com.mousetech.gourmetj; -import javax.faces.application.ViewExpiredException; -import javax.servlet.ServletContext; -import javax.servlet.ServletException; +import jakarta.faces.application.ViewExpiredException; +import jakarta.servlet.ServletContext; +import jakarta.servlet.ServletException; import org.primefaces.application.resource.PrimeResourceHandler; import org.primefaces.renderkit.HeadRenderer; @@ -41,18 +41,19 @@ public class SpringPrimeFacesApplication { /* Note that we cannot set theme here since it was * already set earlier. Default value is "aristo". */ -// servletContext.setInitParameter( -// "primefaces.THEME", "bluesky"); servletContext.setInitParameter( - "javax.faces.FACELETS_SKIP_COMMENTS", + "joinfaces.primefaces.theme", "vela"); + servletContext.setInitParameter( + "primefaces.THEME", "overcast"); + servletContext.setInitParameter( + "jakarta.faces.FACELETS_SKIP_COMMENTS", "true"); servletContext.setInitParameter( "com.sun.faces.expressionFactory", "com.sun.el.ExpressionFactoryImpl"); servletContext.setInitParameter( "primefaces.UPLOADER", "native"); - - servletContext.addListener(IMAGE_IIO_PROVIDER_CONTEXT_LISTENER); + ////servletContext.addListener(IMAGE_IIO_PROVIDER_CONTEXT_LISTENER); } }; } diff --git a/src/main/java/com/mousetech/gourmetj/SpringSecurityConfig.java b/src/main/java/com/mousetech/gourmetj/SpringSecurityConfig.java index f7f5940..6de9ae6 100644 --- a/src/main/java/com/mousetech/gourmetj/SpringSecurityConfig.java +++ b/src/main/java/com/mousetech/gourmetj/SpringSecurityConfig.java @@ -2,7 +2,6 @@ package com.mousetech.gourmetj; import java.io.File; import java.io.FileReader; -import java.io.LineNumberInputStream; import java.io.LineNumberReader; import java.util.Arrays; @@ -10,52 +9,43 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.authentication.configurers.provisioning.InMemoryUserDetailsManagerConfigurer; import org.springframework.security.config.annotation.authentication.configurers.provisioning.UserDetailsManagerConfigurer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.web.SecurityFilterChain; + +import jakarta.servlet.DispatcherType; @Configuration @EnableWebSecurity -public class SpringSecurityConfig - extends WebSecurityConfigurerAdapter { +public class SpringSecurityConfig { + //extends WebSecurityConfigurerAdapter { /* Logger */ private static final Logger log = LoggerFactory.getLogger(SpringSecurityConfig.class); - @Override - protected void configure(HttpSecurity http) - throws Exception { - // require all requests to be authenticated except - // for the resources - http.authorizeRequests() - .antMatchers("/javax.faces.resource/**", - "/", - "/index.jsf", - "/main.jsf", - "/img/**", - "/recipeDetails.jsf", - "/recipePrint.jsf") - .permitAll().anyRequest().authenticated(); - // login - http.formLogin()// .loginPage("/login.xhtml") - .permitAll(); - // .failureUrl("/login.xhtml?error=true"); - // logout -// http.logout().logoutSuccessUrl("/login.xhtml"); - // not needed as JSF 2.2 is implicitly protected - // against CSRF - http.csrf().disable(); - } @Value("${gourmet.password.file}") private String passwordFile; + /** + * Load in config file with in-memory credentials. + * For practical use, this should probably be + * replace with JdbcUserDetailsManager and credentials in + * the recipe database. + * + * @param auth Builder for the authenticator + * @throws Exception + */ @Autowired public void configureGlobal( AuthenticationManagerBuilder auth) throws Exception { @@ -72,17 +62,21 @@ public class SpringSecurityConfig LineNumberReader rdr = new LineNumberReader(new FileReader(pwFile)); String pwLine; - InMemoryUserDetailsManagerConfigurer authenticator = + InMemoryUserDetailsManagerConfigurer + authenticator = auth.inMemoryAuthentication(); while ((pwLine = rdr.readLine()) != null) { pwLine = pwLine.trim(); - if (( pwLine.length() == 0) || (pwLine.charAt(0) == '#')) { + if ((pwLine.length() == 0) + || (pwLine.charAt(0) == '#')) { continue; } String[] creds = parseCreds(pwLine); - UserDetailsManagerConfigurer>.UserDetailsBuilder bar = + UserDetailsManagerConfigurer> + .UserDetailsBuilder bar = authenticator.withUser(creds[0]) - .password("{noop}"+creds[1]); + .password("{noop}" + creds[1]); int credlen = creds.length; for (int i = 2; i < credlen; i++) { bar.roles(creds[i]); @@ -104,4 +98,36 @@ public class SpringSecurityConfig .toArray(String[]::new); return ocreds; } + + @Bean + SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + + http + .csrf(AbstractHttpConfigurer::disable) + .cors(AbstractHttpConfigurer::disable) + .formLogin(Customizer.withDefaults()) + .authorizeHttpRequests((authorize)-> authorize + .dispatcherTypeMatchers(DispatcherType.FORWARD, DispatcherType.ERROR).permitAll() + .anyRequest().authenticated() + ); + + return http.build(); + } + + /** + * Replaces old antMatchers for determining secured URLs. + * @return customizer + */ + @Bean + public WebSecurityCustomizer webSecurityCustomizer() { + return (web) -> web.ignoring().requestMatchers( + "/javax.faces.resource/**", + "/", + "/index.jsf", + "/index.xhtml", + "/main.jsf", + "/img/**", + "/recipeDetails.jsf", + "/recipePrint.jsf"); + } } diff --git a/src/main/java/com/mousetech/gourmetj/UserSession.java b/src/main/java/com/mousetech/gourmetj/UserSession.java index 47411c5..8a74fb2 100644 --- a/src/main/java/com/mousetech/gourmetj/UserSession.java +++ b/src/main/java/com/mousetech/gourmetj/UserSession.java @@ -4,9 +4,9 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.List; -import javax.enterprise.context.SessionScoped; -import javax.faces.model.SelectItem; -import javax.inject.Named; +import jakarta.enterprise.context.SessionScoped; +import jakarta.faces.model.SelectItem; +import jakarta.inject.Named; import org.primefaces.PrimeFaces; import org.slf4j.Logger; diff --git a/src/main/java/com/mousetech/gourmetj/persistence/dao/PantryRepository.java b/src/main/java/com/mousetech/gourmetj/persistence/dao/PantryRepository.java index 773b644..77473f4 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/dao/PantryRepository.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/dao/PantryRepository.java @@ -2,7 +2,7 @@ package com.mousetech.gourmetj.persistence.dao; import java.util.List; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; diff --git a/src/main/java/com/mousetech/gourmetj/persistence/dao/ShopcatRepository.java b/src/main/java/com/mousetech/gourmetj/persistence/dao/ShopcatRepository.java index 576a784..ca96bca 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/dao/ShopcatRepository.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/dao/ShopcatRepository.java @@ -2,7 +2,7 @@ package com.mousetech.gourmetj.persistence.dao; import java.util.List; -import javax.transaction.Transactional; +import jakarta.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; diff --git a/src/main/java/com/mousetech/gourmetj/persistence/model/Category.java b/src/main/java/com/mousetech/gourmetj/persistence/model/Category.java index c9ce4b5..03a0162 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/model/Category.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/model/Category.java @@ -1,7 +1,7 @@ package com.mousetech.gourmetj.persistence.model; import java.io.Serializable; -import javax.persistence.*; +import jakarta.persistence.*; /** diff --git a/src/main/java/com/mousetech/gourmetj/persistence/model/Convtable.java b/src/main/java/com/mousetech/gourmetj/persistence/model/Convtable.java index 7d9e89c..a1f0d44 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/model/Convtable.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/model/Convtable.java @@ -1,7 +1,7 @@ package com.mousetech.gourmetj.persistence.model; import java.io.Serializable; -import javax.persistence.*; +import jakarta.persistence.*; /** diff --git a/src/main/java/com/mousetech/gourmetj/persistence/model/Crossunitdict.java b/src/main/java/com/mousetech/gourmetj/persistence/model/Crossunitdict.java index 731a5a7..ce32473 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/model/Crossunitdict.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/model/Crossunitdict.java @@ -1,7 +1,7 @@ package com.mousetech.gourmetj.persistence.model; import java.io.Serializable; -import javax.persistence.*; +import jakarta.persistence.*; /** diff --git a/src/main/java/com/mousetech/gourmetj/persistence/model/Density.java b/src/main/java/com/mousetech/gourmetj/persistence/model/Density.java index 124d735..c8ffe7d 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/model/Density.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/model/Density.java @@ -1,7 +1,7 @@ package com.mousetech.gourmetj.persistence.model; import java.io.Serializable; -import javax.persistence.*; +import jakarta.persistence.*; /** diff --git a/src/main/java/com/mousetech/gourmetj/persistence/model/Info.java b/src/main/java/com/mousetech/gourmetj/persistence/model/Info.java index da7d7c5..2c1bb91 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/model/Info.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/model/Info.java @@ -1,7 +1,7 @@ package com.mousetech.gourmetj.persistence.model; import java.io.Serializable; -import javax.persistence.*; +import jakarta.persistence.*; /** diff --git a/src/main/java/com/mousetech/gourmetj/persistence/model/Ingredient.java b/src/main/java/com/mousetech/gourmetj/persistence/model/Ingredient.java index 82d12b0..848cdd9 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/model/Ingredient.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/model/Ingredient.java @@ -1,8 +1,8 @@ package com.mousetech.gourmetj.persistence.model; import java.io.Serializable; -import javax.persistence.*; -import javax.validation.constraints.NotNull; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; /** * The persistent class for the "ingredients" database table. The diff --git a/src/main/java/com/mousetech/gourmetj/persistence/model/Keylookup.java b/src/main/java/com/mousetech/gourmetj/persistence/model/Keylookup.java index 37a73a7..031f9d6 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/model/Keylookup.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/model/Keylookup.java @@ -1,7 +1,7 @@ package com.mousetech.gourmetj.persistence.model; import java.io.Serializable; -import javax.persistence.*; +import jakarta.persistence.*; /** diff --git a/src/main/java/com/mousetech/gourmetj/persistence/model/Pantry.java b/src/main/java/com/mousetech/gourmetj/persistence/model/Pantry.java index 7c2abfe..8e2c4cc 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/model/Pantry.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/model/Pantry.java @@ -1,7 +1,7 @@ package com.mousetech.gourmetj.persistence.model; import java.io.Serializable; -import javax.persistence.*; +import jakarta.persistence.*; /** * The persistent class for the "pantry" database table. diff --git a/src/main/java/com/mousetech/gourmetj/persistence/model/PluginInfo.java b/src/main/java/com/mousetech/gourmetj/persistence/model/PluginInfo.java index d54de12..a9992d4 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/model/PluginInfo.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/model/PluginInfo.java @@ -1,7 +1,7 @@ package com.mousetech.gourmetj.persistence.model; import java.io.Serializable; -import javax.persistence.*; +import jakarta.persistence.*; /** diff --git a/src/main/java/com/mousetech/gourmetj/persistence/model/Recipe.java b/src/main/java/com/mousetech/gourmetj/persistence/model/Recipe.java index 265719a..b1b1657 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/model/Recipe.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/model/Recipe.java @@ -6,7 +6,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.persistence.*; +import jakarta.persistence.*; /** * The persistent class for the "recipe" database table. diff --git a/src/main/java/com/mousetech/gourmetj/persistence/model/Shopcat.java b/src/main/java/com/mousetech/gourmetj/persistence/model/Shopcat.java index d8a4709..aa2259e 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/model/Shopcat.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/model/Shopcat.java @@ -4,17 +4,17 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.List; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.ManyToOne; -import javax.persistence.NamedQueries; -import javax.persistence.NamedQuery; -import javax.persistence.OneToMany; -import javax.persistence.Table; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; /** * The persistent class for the "shopcats" database table. diff --git a/src/main/java/com/mousetech/gourmetj/persistence/model/Shopcatsorder.java b/src/main/java/com/mousetech/gourmetj/persistence/model/Shopcatsorder.java index ccc9253..4d01f6d 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/model/Shopcatsorder.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/model/Shopcatsorder.java @@ -1,7 +1,7 @@ package com.mousetech.gourmetj.persistence.model; import java.io.Serializable; -import javax.persistence.*; +import jakarta.persistence.*; /** diff --git a/src/main/java/com/mousetech/gourmetj/persistence/model/Unitdict.java b/src/main/java/com/mousetech/gourmetj/persistence/model/Unitdict.java index c8f717c..f2baf58 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/model/Unitdict.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/model/Unitdict.java @@ -1,7 +1,7 @@ package com.mousetech.gourmetj.persistence.model; import java.io.Serializable; -import javax.persistence.*; +import jakarta.persistence.*; /** diff --git a/src/main/java/com/mousetech/gourmetj/persistence/service/CategoryService.java b/src/main/java/com/mousetech/gourmetj/persistence/service/CategoryService.java index e6f8da3..1ba46e7 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/service/CategoryService.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/service/CategoryService.java @@ -2,9 +2,9 @@ package com.mousetech.gourmetj.persistence.service; import java.io.Serializable; import java.util.List; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/mousetech/gourmetj/persistence/service/RecipeService.java b/src/main/java/com/mousetech/gourmetj/persistence/service/RecipeService.java index ac56fe3..ce283c1 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/service/RecipeService.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/service/RecipeService.java @@ -4,9 +4,9 @@ import java.io.Serializable; import java.util.List; import java.util.Optional; -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.inject.Named; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.inject.Named; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/mousetech/gourmetj/springweb/PictureController.java b/src/main/java/com/mousetech/gourmetj/springweb/PictureController.java index 60c6c51..aaa65c6 100644 --- a/src/main/java/com/mousetech/gourmetj/springweb/PictureController.java +++ b/src/main/java/com/mousetech/gourmetj/springweb/PictureController.java @@ -17,9 +17,9 @@ import java.io.InputStream; import javax.imageio.ImageIO; import javax.imageio.stream.ImageInputStream; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpSession; -import javax.servlet.http.Part; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; +import jakarta.servlet.http.Part; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/com/mousetech/gourmetj/utils/TimeConverter.java b/src/main/java/com/mousetech/gourmetj/utils/TimeConverter.java index 6550ea9..959a048 100644 --- a/src/main/java/com/mousetech/gourmetj/utils/TimeConverter.java +++ b/src/main/java/com/mousetech/gourmetj/utils/TimeConverter.java @@ -6,13 +6,13 @@ */ package com.mousetech.gourmetj.utils; -import javax.faces.application.FacesMessage; -import javax.faces.component.UIComponent; -import javax.faces.context.FacesContext; -import javax.faces.convert.Converter; -import javax.faces.convert.ConverterException; -import javax.faces.convert.FacesConverter; -import javax.faces.validator.ValidatorException; +import jakarta.faces.application.FacesMessage; +import jakarta.faces.component.UIComponent; +import jakarta.faces.context.FacesContext; +import jakarta.faces.convert.Converter; +import jakarta.faces.convert.ConverterException; +import jakarta.faces.convert.FacesConverter; +import jakarta.faces.validator.ValidatorException; import org.apache.commons.lang3.StringUtils; @@ -48,6 +48,9 @@ public class TimeConverter implements Converter { @Override public String getAsString(FacesContext context, UIComponent component, Integer value) { + if ( value == null ) { + return "--"; + } return TimeFormatter.formatTime(Long.valueOf(value)); } } diff --git a/src/main/java/com/mousetech/gourmetj/utils/YamlShoppingList.java b/src/main/java/com/mousetech/gourmetj/utils/YamlShoppingList.java index 129fed4..35d7b81 100644 --- a/src/main/java/com/mousetech/gourmetj/utils/YamlShoppingList.java +++ b/src/main/java/com/mousetech/gourmetj/utils/YamlShoppingList.java @@ -1,18 +1,22 @@ package com.mousetech.gourmetj.utils; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.OutputStream; import java.io.PrintWriter; import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.primefaces.model.ByteArrayContent; +import org.primefaces.model.DefaultStreamedContent; import org.primefaces.model.StreamedContent; - +import org.primefaces.util.SerializableSupplier; import com.mousetech.gourmetj.ShopIngredient; /** * Construct a Primefaces file output content for an ingredient * list in YAML format. + * @see ShoppingListBean * * @author timh * @since Jan 15, 2022 @@ -20,18 +24,30 @@ import com.mousetech.gourmetj.ShopIngredient; public class YamlShoppingList { + /** + * Create "file" to download in YAML format + * @param ingredientList Ingredient list to format + * @return Http response for file download + */ public static StreamedContent createDownload( List ingredientList) { + StreamedContent file; + + ByteArrayOutputStream ary = new ByteArrayOutputStream(); PrintWriter wtr = new PrintWriter(ary); wtr.println("---"); formatContent(wtr, ingredientList); wtr.close(); - byte[] bas = ary.toByteArray(); - StreamedContent dlList = new ByteArrayContent(bas, - "text/text", "shopping_list.yml"); - return dlList; + InputStream airy = new ByteArrayInputStream(ary.toByteArray()); + file = DefaultStreamedContent. + builder().contentEncoding("text/text") + .name("shopping_list.yml") + .stream(() -> airy) + .build(); + + return file; } /** diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 4526ce4..3920e79 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -20,7 +20,7 @@ spring: hibernate: ddl-auto: none #database-platform: org.sqlite.hibernate.dialect.SQLiteDialect - database-platform: org.hibernate.dialect.MySQLDialect + ###database-platform: org.hibernate.dialect.MySQLDialect server: servlet: @@ -30,3 +30,7 @@ server: gourmet: password: file: .gourmetpw + +joinfaces: + primefaces: + theme: saga diff --git a/xxx b/xxx new file mode 100644 index 0000000..e69de29