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