From 5cdde7531b4e1594a0456efe6aeb9463555ccd55 Mon Sep 17 00:00:00 2001 From: Jj! Date: Mon, 11 Oct 2021 11:43:10 -0500 Subject: [PATCH 1/4] [SHIBUI-2165] updated precision for stored datetime --- .../tier/shibboleth/admin/ui/domain/AbstractAuditable.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java index 445d4cc92..edf805056 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java @@ -41,13 +41,13 @@ public abstract class AbstractAuditable implements Auditable { @CreationTimestamp @CreatedDate - @Column(nullable = false, updatable = false) + @Column(nullable = false, updatable = false, columnDefinition = "DATETIME(9)") @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS") private LocalDateTime createdDate; @UpdateTimestamp @LastModifiedDate - @Column(nullable = false) + @Column(nullable = false, columnDefinition = "DATETIME(9)") @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS") private LocalDateTime modifiedDate; From 923e62bf3ee9ea572a02b79a9cfe540f96840689 Mon Sep 17 00:00:00 2001 From: Jj! Date: Mon, 11 Oct 2021 16:25:22 -0500 Subject: [PATCH 2/4] [SHIBUI-2165] updated precision for json datetime --- .../tier/shibboleth/admin/ui/domain/AbstractAuditable.java | 4 ++-- .../controller/UsersControllerIntegrationTests.groovy | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java index edf805056..89560f04f 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/AbstractAuditable.java @@ -42,13 +42,13 @@ public abstract class AbstractAuditable implements Auditable { @CreationTimestamp @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "DATETIME(9)") - @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS") + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS") private LocalDateTime createdDate; @UpdateTimestamp @LastModifiedDate @Column(nullable = false, columnDefinition = "DATETIME(9)") - @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS") + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS") private LocalDateTime modifiedDate; @Column(name = "created_by") diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/security/controller/UsersControllerIntegrationTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/security/controller/UsersControllerIntegrationTests.groovy index 84f6cb33c..a87bcc819 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/security/controller/UsersControllerIntegrationTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/security/controller/UsersControllerIntegrationTests.groovy @@ -317,7 +317,7 @@ class UsersControllerIntegrationTests extends AbstractBaseDataJpaTest { @Bean ObjectMapper objectMapper() { JavaTimeModule module = new JavaTimeModule() - LocalDateTimeDeserializer localDateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSS")) + LocalDateTimeDeserializer localDateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS")) module.addDeserializer(LocalDateTime.class, localDateTimeDeserializer) return Jackson2ObjectMapperBuilder.json().modules(module).featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build() From e8f9a48998af249f61561cd0a83d259333a6a53a Mon Sep 17 00:00:00 2001 From: chasegawa Date: Mon, 11 Oct 2021 15:02:20 -0700 Subject: [PATCH 3/4] SHIBUI-2165 Adjustment object mapper to make tests more consistent --- .../ui/BaseDataJpaTestConfiguration.groovy | 11 ++++++-- .../UsersControllerIntegrationTests.groovy | 25 +------------------ 2 files changed, 10 insertions(+), 26 deletions(-) diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/BaseDataJpaTestConfiguration.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/BaseDataJpaTestConfiguration.groovy index 3ab919759..fe62a5770 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/BaseDataJpaTestConfiguration.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/BaseDataJpaTestConfiguration.groovy @@ -3,6 +3,7 @@ package edu.internet2.tier.shibboleth.admin.ui import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.SerializationFeature import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer import edu.internet2.tier.shibboleth.admin.ui.configuration.CustomPropertiesConfiguration import edu.internet2.tier.shibboleth.admin.ui.configuration.SearchConfiguration import edu.internet2.tier.shibboleth.admin.ui.configuration.ShibUIConfiguration @@ -23,6 +24,10 @@ import org.springframework.context.annotation.ComponentScan import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.Import import org.springframework.context.annotation.Primary +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder + +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL @@ -68,10 +73,12 @@ class BaseDataJpaTestConfiguration { @Bean ObjectMapper objectMapper() { - ObjectMapper mapper = new ObjectMapper() + JavaTimeModule module = new JavaTimeModule() + LocalDateTimeDeserializer localDateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS")) + module.addDeserializer(LocalDateTime.class, localDateTimeDeserializer) + ObjectMapper mapper = Jackson2ObjectMapperBuilder.json().modules(module).featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build() mapper.enable(SerializationFeature.INDENT_OUTPUT) mapper.setSerializationInclusion(NON_NULL) - mapper.registerModule(new JavaTimeModule()) mapper.registerModule(new StringTrimModule()) return mapper } diff --git a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/security/controller/UsersControllerIntegrationTests.groovy b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/security/controller/UsersControllerIntegrationTests.groovy index a87bcc819..5473be2c2 100644 --- a/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/security/controller/UsersControllerIntegrationTests.groovy +++ b/backend/src/test/groovy/edu/internet2/tier/shibboleth/admin/ui/security/controller/UsersControllerIntegrationTests.groovy @@ -1,9 +1,6 @@ package edu.internet2.tier.shibboleth.admin.ui.security.controller import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.databind.SerializationFeature -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer import edu.internet2.tier.shibboleth.admin.ui.AbstractBaseDataJpaTest import edu.internet2.tier.shibboleth.admin.ui.controller.support.RestControllersSupport import edu.internet2.tier.shibboleth.admin.ui.security.model.Group @@ -11,21 +8,14 @@ import edu.internet2.tier.shibboleth.admin.ui.security.model.User import edu.internet2.tier.shibboleth.admin.ui.util.WithMockAdmin import groovy.json.JsonOutput import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.test.context.TestConfiguration -import org.springframework.context.annotation.Bean import org.springframework.http.MediaType -import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder import org.springframework.test.annotation.Rollback -import org.springframework.test.context.ContextConfiguration import org.springframework.test.web.servlet.MockMvc import org.springframework.test.web.servlet.setup.MockMvcBuilders import org.springframework.transaction.annotation.Transactional import org.springframework.web.client.HttpClientErrorException import org.springframework.web.util.NestedServletException -import java.time.LocalDateTime -import java.time.format.DateTimeFormatter - import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch @@ -34,7 +24,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status -@ContextConfiguration(classes=[UCILocalConfig]) @Rollback class UsersControllerIntegrationTests extends AbstractBaseDataJpaTest { @Autowired @@ -311,16 +300,4 @@ class UsersControllerIntegrationTests extends AbstractBaseDataJpaTest { then: result.andExpect(status().isNotFound()) } - - @TestConfiguration - private static class UCILocalConfig { - @Bean - ObjectMapper objectMapper() { - JavaTimeModule module = new JavaTimeModule() - LocalDateTimeDeserializer localDateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS")) - module.addDeserializer(LocalDateTime.class, localDateTimeDeserializer) - - return Jackson2ObjectMapperBuilder.json().modules(module).featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build() - } - } -} +} \ No newline at end of file From c4d2b5553585dc07f57a44cc223bf549740f7851 Mon Sep 17 00:00:00 2001 From: chasegawa Date: Tue, 12 Oct 2021 10:46:53 -0700 Subject: [PATCH 4/4] SHIBUI-2165 Adjustment to fix tests --- .../domain/frontend/EntityDescriptorRepresentation.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/frontend/EntityDescriptorRepresentation.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/frontend/EntityDescriptorRepresentation.java index 821d9817d..c662b1388 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/frontend/EntityDescriptorRepresentation.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/domain/frontend/EntityDescriptorRepresentation.java @@ -10,12 +10,14 @@ import javax.validation.constraints.NotNull; import java.io.Serializable; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Map; public class EntityDescriptorRepresentation implements Serializable { private static final long serialVersionUID = 7753435553892353966L; + private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS"); private List assertionConsumerServices; @@ -98,7 +100,7 @@ public String getCreatedBy() { } public String getCreatedDate() { - return createdDate != null ? createdDate.toString() : null; + return createdDate != null ? formatter.format(createdDate) : null; } public String getEntityId() { @@ -125,7 +127,7 @@ public MduiRepresentation getMdui() { } public String getModifiedDate() { - return modifiedDate != null ? modifiedDate.toString() : null; + return modifiedDate != null ? formatter.format(modifiedDate) : null; } @JsonIgnore @@ -134,7 +136,6 @@ public LocalDateTime getModifiedDateAsDate() { return modifiedDate != null ? modifiedDate : createdDate != null ? createdDate : LocalDateTime.now(); } - public OrganizationRepresentation getOrganization() { return organization; } @@ -245,4 +246,4 @@ public void setServiceProviderSsoDescriptor(ServiceProviderSsoDescriptorRepresen public void setVersion(int version) { this.version = version; } -} +} \ No newline at end of file