From 8ba7fbe8fd7c022ac2da3278eec97db57ca01167 Mon Sep 17 00:00:00 2001 From: Zsombor Gegesy Date: Mon, 27 Oct 2014 23:14:26 +0100 Subject: [PATCH 01/22] Add DateTime serializer, and DateTime handling in field generation --- app/index.js | 2 ++ .../util/_CustomDateTimeDeserializer.java | 32 +++++++++++++++++++ .../util/_CustomDateTimeSerializer.java | 28 ++++++++++++++++ entity/index.js | 11 +++++++ .../src/main/java/package/domain/_Entity.java | 21 ++++++++---- .../liquibase/changelog/_added_entity.xml | 3 +- .../src/main/webapp/views/_entities.html | 2 ++ .../package/web/rest/_EntityResourceTest.java | 18 ++++++++--- 8 files changed, 104 insertions(+), 13 deletions(-) create mode 100644 app/templates/src/main/java/package/domain/util/_CustomDateTimeDeserializer.java create mode 100644 app/templates/src/main/java/package/domain/util/_CustomDateTimeSerializer.java diff --git a/app/index.js b/app/index.js index af8dda620812..f39c2868455e 100755 --- a/app/index.js +++ b/app/index.js @@ -523,6 +523,8 @@ JhipsterGenerator.prototype.app = function app() { this.template('src/main/java/package/domain/_PersistentToken.java', javaDir + 'domain/PersistentToken.java'); this.template('src/main/java/package/domain/_User.java', javaDir + 'domain/User.java'); this.template('src/main/java/package/domain/util/_CustomLocalDateSerializer.java', javaDir + 'domain/util/CustomLocalDateSerializer.java'); + this.template('src/main/java/package/domain/util/_CustomDateTimeSerializer.java', javaDir + 'domain/util/CustomDateTimeSerializer.java'); + this.template('src/main/java/package/domain/util/_CustomDateTimeDeserializer.java', javaDir + 'domain/util/CustomDateTimeDeserializer.java'); this.template('src/main/java/package/repository/_package-info.java', javaDir + 'repository/package-info.java'); this.template('src/main/java/package/repository/_AuthorityRepository.java', javaDir + 'repository/AuthorityRepository.java'); diff --git a/app/templates/src/main/java/package/domain/util/_CustomDateTimeDeserializer.java b/app/templates/src/main/java/package/domain/util/_CustomDateTimeDeserializer.java new file mode 100644 index 000000000000..13ebeb50eb79 --- /dev/null +++ b/app/templates/src/main/java/package/domain/util/_CustomDateTimeDeserializer.java @@ -0,0 +1,32 @@ +package <%=packageName%>.domain.util; + +import java.io.IOException; + +import org.joda.time.DateTime; +import org.joda.time.format.ISODateTimeFormat; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +/** + * Custom Jackson deserializer for displaying Joda DateTime objects. + */ +public class CustomDateTimeDeserializer extends JsonDeserializer { + + @Override + public DateTime deserialize(JsonParser jp, DeserializationContext ctxt) + throws IOException, JsonProcessingException { + JsonToken t = jp.getCurrentToken(); + if (t == JsonToken.VALUE_STRING) { + String str = jp.getText().trim(); + return ISODateTimeFormat.dateTimeParser().parseDateTime(str); + } + if (t == JsonToken.VALUE_NUMBER_INT) { + return new DateTime(jp.getLongValue()); + } + throw ctxt.mappingException(handledType()); + } +} diff --git a/app/templates/src/main/java/package/domain/util/_CustomDateTimeSerializer.java b/app/templates/src/main/java/package/domain/util/_CustomDateTimeSerializer.java new file mode 100644 index 000000000000..05fdfffe342e --- /dev/null +++ b/app/templates/src/main/java/package/domain/util/_CustomDateTimeSerializer.java @@ -0,0 +1,28 @@ +package <%=packageName%>.domain.util; + +import java.io.IOException; + +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; +import org.joda.time.format.DateTimeFormatter; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +/** + * Custom Jackson serializer for displaying Joda DateTime objects. + */ +public class CustomDateTimeSerializer extends JsonSerializer { + + private static DateTimeFormatter formatter = DateTimeFormat + .forPattern("yyyy-MM-dd'T'HH:mm:ss"); + + @Override + public void serialize(DateTime value, JsonGenerator generator, + SerializerProvider serializerProvider) + throws IOException { + generator.writeString(formatter.print(value)); + } + +} diff --git a/entity/index.js b/entity/index.js index 52819cd3a1c1..ecc47fbea568 100755 --- a/entity/index.js +++ b/entity/index.js @@ -23,6 +23,8 @@ var EntityGenerator = module.exports = function EntityGenerator(args, options, c this.fieldId = 0; this.fields = []; this.fieldsContainLocalDate = false; + this.fieldsContainDateTime = false; + this.fieldsContainCustomTime = false; this.fieldsContainBigDecimal = false; this.fieldsContainOwnerManyToMany = false; this.fieldsContainOneToMany = false; @@ -86,6 +88,10 @@ EntityGenerator.prototype.askForFields = function askForFields() { value: 'LocalDate', name: 'LocalDate' }, + { + value: 'DateTime', + name: 'DateTime' + }, { value: 'Boolean', name: 'Boolean' @@ -106,10 +112,15 @@ EntityGenerator.prototype.askForFields = function askForFields() { this.fields.push(field); if (props.fieldType == 'LocalDate') { this.fieldsContainLocalDate = true; + this.fieldsContainCustomTime = true; } if (props.fieldType == 'BigDecimal') { this.fieldsContainBigDecimal = true; } + if (props.fieldType == 'DateTime') { + this.fieldsContainDateTime = true; + this.fieldsContainCustomTime = true; + } } console.log(chalk.red('===========' + _s.capitalize(this.name) + '==============')); for (var id in this.fields) { diff --git a/entity/templates/src/main/java/package/domain/_Entity.java b/entity/templates/src/main/java/package/domain/_Entity.java index 7587bb1d8f7b..517264d63302 100755 --- a/entity/templates/src/main/java/package/domain/_Entity.java +++ b/entity/templates/src/main/java/package/domain/_Entity.java @@ -1,14 +1,17 @@ package <%=packageName%>.domain; <% if (relationships.length > 0 && (fieldsContainOwnerManyToMany == false || fieldsContainOneToMany == true)) { %> -import com.fasterxml.jackson.annotation.JsonIgnore;<% } %><% if (fieldsContainLocalDate == true) { %> +import com.fasterxml.jackson.annotation.JsonIgnore;<% } %><% if (fieldsContainCustomTime == true) { %> import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize;<% } %><% if (fieldsContainLocalDate == true) { %> import com.fasterxml.jackson.datatype.joda.deser.LocalDateDeserializer; -import <%=packageName%>.domain.util.CustomLocalDateSerializer;<% } %><% if (hibernateCache != 'no') { %> +import <%=packageName%>.domain.util.CustomLocalDateSerializer;<% } %><% if (fieldsContainDateTime == true) { %> +import <%=packageName%>.domain.util.CustomDateTimeDeserializer; +import <%=packageName%>.domain.util.CustomDateTimeSerializer;<% } %><% if (hibernateCache != 'no') { %> import org.hibernate.annotations.Cache; -import org.hibernate.annotations.CacheConcurrencyStrategy;<% } %><% if (fieldsContainLocalDate == true) { %><% if (databaseType == 'sql') { %> -import org.hibernate.annotations.Type;<% } %> -import org.joda.time.LocalDate;<% } %><% if (databaseType == 'nosql') { %> +import org.hibernate.annotations.CacheConcurrencyStrategy;<% } %><% if (fieldsContainCustomTime == true && databaseType == 'sql') { %> +import org.hibernate.annotations.Type;<% } %><% if (fieldsContainLocalDate == true) { %> +import org.joda.time.LocalDate;<% } %><% if (fieldsContainDateTime == true) { %> +import org.joda.time.DateTime;<% } %><% if (databaseType == 'nosql') { %> import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field;<% } %> @@ -32,7 +35,11 @@ public class <%= entityClass %> implements Serializable { @GeneratedValue(strategy = GenerationType.TABLE) private Long id;<% } %><% if (databaseType == 'nosql') { %> private String id;<% } %> -<% for (fieldId in fields) { %><% if (databaseType == 'sql') { %><% if (fields[fieldId].fieldType == 'LocalDate') { %> +<% for (fieldId in fields) { %><% if (databaseType == 'sql') { %><% if (fields[fieldId].fieldType == 'DateTime') { %> + @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime") + @JsonSerialize(using = CustomDateTimeSerializer.class) + @JsonDeserialize(using = CustomDateTimeDeserializer.class) + @Column(name = "<%=fields[fieldId].fieldNameUnderscored %>", nullable = false)<% } else if (fields[fieldId].fieldType == 'LocalDate') { %> @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDate") @JsonDeserialize(using = LocalDateDeserializer.class) @JsonSerialize(using = CustomLocalDateSerializer.class) diff --git a/entity/templates/src/main/resources/config/liquibase/changelog/_added_entity.xml b/entity/templates/src/main/resources/config/liquibase/changelog/_added_entity.xml index 4b7904f4fe4e..7276b6aaa33d 100644 --- a/entity/templates/src/main/resources/config/liquibase/changelog/_added_entity.xml +++ b/entity/templates/src/main/resources/config/liquibase/changelog/_added_entity.xml @@ -20,7 +20,8 @@ <% } else if (fields[fieldId].fieldType == 'Long') { %> <% } else if (fields[fieldId].fieldType == 'BigDecimal') { %> <% } else if (fields[fieldId].fieldType == 'LocalDate') { %> - <% } else if (fields[fieldId].fieldType == 'Boolean') { %> + <% } else if (fields[fieldId].fieldType == 'DateTime') { %> + <% } else if (fields[fieldId].fieldType == 'Boolean') { %> <% } } %><% for (relationshipId in relationships) { %><% if ((relationships[relationshipId].relationshipType == 'many-to-one') || (relationships[relationshipId].relationshipType == 'one-to-one' && relationships[relationshipId].ownerSide == true)) { %> <% } } %> diff --git a/entity/templates/src/main/webapp/views/_entities.html b/entity/templates/src/main/webapp/views/_entities.html index 2101b233a0a3..d6c0becc774f 100644 --- a/entity/templates/src/main/webapp/views/_entities.html +++ b/entity/templates/src/main/webapp/views/_entities.html @@ -30,6 +30,8 @@