Skip to content

Commit

Permalink
Merge branch 'master' into generic-graphql-base-fetcher-main
Browse files Browse the repository at this point in the history
  • Loading branch information
dnlkoch authored Jan 29, 2021
2 parents ea9e80f + fe4accb commit 896f88f
Show file tree
Hide file tree
Showing 18 changed files with 201 additions and 39 deletions.
7 changes: 7 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@
<threetenbp.version>1.4.1</threetenbp.version>
<com.sun.mail.version>1.6.2</com.sun.mail.version>
<evo-inflector.version>1.2.2</evo-inflector.version>
<reflections.version>0.9.12</reflections.version>

<!-- Testing -->
<junit.version>4.13.1</junit.version>
Expand Down Expand Up @@ -644,6 +645,12 @@
<artifactId>javax.mail</artifactId>
<version>${com.sun.mail.version}</version>
</dependency>

<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>${reflections.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

Expand Down
10 changes: 5 additions & 5 deletions shogun-lib/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -236,11 +236,11 @@
<artifactId>HikariCP</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.12</version>
</dependency>

<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package de.terrestris.shogun.lib.annotation;

import java.io.Serializable;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* The `JsonSuperType` annotation helps to identify a type that should be deserialized instead of a parent type.
* The `type` property specifies the parent type. This annotation needs to go along with a `JsonDeserialize` pointing
* to the own type.
* If the super type that should get replaced is not an interface, than `override` needs to be set to `true`.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface JsonSuperType {
Class<? extends Serializable> type();
boolean override() default false;
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,110 @@
package de.terrestris.shogun.lib.config;

import com.bedatadriven.jackson.datatype.jts.JtsModule;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.vladmihalcea.hibernate.type.util.ObjectMapperSupplier;
import de.terrestris.shogun.lib.annotation.JsonSuperType;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.PrecisionModel;
import org.reflections.Reflections;
import org.reflections.scanners.SubTypesScanner;
import org.reflections.scanners.TypeAnnotationsScanner;
import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class JacksonConfig {
public class JacksonConfig implements ObjectMapperSupplier {

private static ObjectMapper mapper;

@Bean
public ObjectMapper objectMapper() {
init();
return mapper;
}

private static int srid;

@Value("${shogun.srid:4326}")
protected int srid;
public void setSrid(int srid) {
JacksonConfig.srid = srid;
}

private static int coordinatePrecisionScale;

@Value("${shogun.coordinatePrecisionScale:10}")
protected int coordinatePrecisionScale;
public void setCoordinatePrecisionScale(int coordinatePrecisionScale) {
JacksonConfig.coordinatePrecisionScale = coordinatePrecisionScale;
}

@Bean
public JtsModule jtsModule() {
GeometryFactory geomFactory = new GeometryFactory(new PrecisionModel(coordinatePrecisionScale), srid);
public static JtsModule jtsModule() {
GeometryFactory geomFactory = new GeometryFactory(new PrecisionModel(JacksonConfig.coordinatePrecisionScale), JacksonConfig.srid);
return new JtsModule(geomFactory);
}

@Override
public ObjectMapper get() {
return objectMapper();
}

@PostConstruct
public static void init() {
if (JacksonConfig.mapper == null) {
JacksonConfig.mapper = new ObjectMapper().registerModule(jtsModule());

JacksonConfig.mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
JacksonConfig.mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JacksonConfig.mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

for (var entry : findAnnotatedClasses().entrySet()) {
JacksonConfig.mapper.addMixIn(entry.getKey(), entry.getValue());
}
}
}

private static Map<Class<?>, Class<?>> findAnnotatedClasses() {
var reflections = new Reflections(new ConfigurationBuilder()
.setUrls(ClasspathHelper.forJavaClassPath())
.setScanners(new SubTypesScanner(),
new TypeAnnotationsScanner()));

Map<Class<?>, Class<?>> implementers = new HashMap<>();

// this finds the type furthest down along the implementation chain
for (var cl : reflections.getTypesAnnotatedWith(JsonSuperType.class)) {
var annotation = cl.getAnnotation(JsonSuperType.class);
var superType = annotation.type();

if (!annotation.override() && !superType.isInterface()) {
throw new IllegalStateException("The super type " + superType.getName() + " is not an interface. " +
"Set override to true if this is intended.");
}

if (!implementers.containsKey(superType)) {
implementers.put(superType, cl);
} else {
var previous = implementers.get(superType);
if (previous.isAssignableFrom(cl)) {
implementers.put(superType, cl);
} else if (!cl.isAssignableFrom(previous)) {
throw new IllegalStateException("Found 2 incompatible types that both want to deserialize to the type "
+ superType.getName() + ". Any existing type should get extended.");
}
}
}

return implementers;
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package de.terrestris.shogun.lib.model;

import de.terrestris.shogun.lib.model.jsonb.application.ApplicationClientConfig;
import de.terrestris.shogun.lib.model.jsonb.ApplicationClientConfig;
import java.util.Locale;
import java.util.Map;
import javax.persistence.Basic;
Expand All @@ -9,6 +9,10 @@
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Table;

import de.terrestris.shogun.lib.model.jsonb.LayerConfig;
import de.terrestris.shogun.lib.model.jsonb.LayerToolConfig;
import de.terrestris.shogun.lib.model.jsonb.LayerTree;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
Expand Down Expand Up @@ -55,18 +59,17 @@ public class Application extends BaseEntity {
@Column(columnDefinition = "jsonb")
@Basic(fetch = FetchType.LAZY)
@ToString.Exclude
private Map<String, Object> layerTree;
private LayerTree layerTree;

@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
@Basic(fetch = FetchType.LAZY)
@ToString.Exclude
private Map<String, Object> layerConfig;
private LayerConfig layerConfig;

@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
@Basic(fetch = FetchType.LAZY)
@ToString.Exclude
private Map<String, Object> toolConfig;
private LayerToolConfig toolConfig;
}

Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package de.terrestris.shogun.lib.model;

import de.terrestris.shogun.lib.enumeration.LayerType;
import java.util.Map;
import de.terrestris.shogun.lib.model.jsonb.LayerClientConfig;
import de.terrestris.shogun.lib.model.jsonb.LayerFeature;
import de.terrestris.shogun.lib.model.jsonb.LayerSourceConfig;

import java.util.List;
import javax.persistence.Basic;
import javax.persistence.Cacheable;
import javax.persistence.Column;
Expand Down Expand Up @@ -41,19 +45,19 @@ public class Layer extends BaseEntity {
@Column(columnDefinition = "jsonb")
@Basic(fetch = FetchType.LAZY)
@ToString.Exclude
private Map<String, Object> clientConfig;
private LayerClientConfig clientConfig;

@Type(type = "jsonb")
@Column(columnDefinition = "jsonb", nullable = false)
@Basic(fetch = FetchType.LAZY)
@ToString.Exclude
private Map<String, Object> sourceConfig;
private LayerSourceConfig sourceConfig;

@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
@Basic(fetch = FetchType.LAZY)
@ToString.Exclude
private Map<String, Object> features;
private List<LayerFeature> features;

@Column(nullable = false)
@Enumerated(EnumType.STRING)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package de.terrestris.shogun.lib.model;

import java.util.HashMap;
import java.util.Map;
import de.terrestris.shogun.lib.model.jsonb.UserClientConfig;
import de.terrestris.shogun.lib.model.jsonb.UserDetails;

import javax.persistence.Basic;
import javax.persistence.Cacheable;
import javax.persistence.Column;
Expand Down Expand Up @@ -44,13 +45,13 @@ public class User extends BaseEntity {
@Column(columnDefinition = "jsonb")
@Basic(fetch = FetchType.LAZY)
@ToString.Exclude
private Map<String, Object> details = new HashMap<>();
private UserDetails details;

@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
@Basic(fetch = FetchType.LAZY)
@ToString.Exclude
private Map<String, Object> clientConfig = new HashMap<>();
private UserClientConfig clientConfig;

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package de.terrestris.shogun.lib.model.jsonb;

import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

public interface ApplicationClientConfig extends Serializable {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package de.terrestris.shogun.lib.model.jsonb;

import java.io.Serializable;

public interface LayerClientConfig extends Serializable {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package de.terrestris.shogun.lib.model.jsonb;

import java.io.Serializable;

public interface LayerConfig extends Serializable {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package de.terrestris.shogun.lib.model.jsonb;

import java.io.Serializable;

public interface LayerFeature extends Serializable {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package de.terrestris.shogun.lib.model.jsonb;

import java.io.Serializable;

public interface LayerSourceConfig extends Serializable {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package de.terrestris.shogun.lib.model.jsonb;

import java.io.Serializable;

public interface LayerToolConfig extends Serializable {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package de.terrestris.shogun.lib.model.jsonb;

import java.io.Serializable;

public interface LayerTree extends Serializable {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package de.terrestris.shogun.lib.model.jsonb;

import java.io.Serializable;

public interface UserClientConfig extends Serializable {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package de.terrestris.shogun.lib.model.jsonb;

import java.io.Serializable;

public interface UserDetails extends Serializable {
}

This file was deleted.

1 change: 1 addition & 0 deletions shogun-lib/src/main/resources/hibernate.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
hibernate.types.jackson.object.mapper=de.terrestris.shoguncore.config.JacksonConfig

0 comments on commit 896f88f

Please sign in to comment.