View Javadoc
1   /*
2    * Copyright (C) 2023 B3Partners B.V.
3    *
4    * SPDX-License-Identifier: MIT
5    */
6   package org.tailormap.api.persistence;
7   
8   import jakarta.persistence.Column;
9   import jakarta.persistence.Entity;
10  import jakarta.persistence.EntityListeners;
11  import jakarta.persistence.GeneratedValue;
12  import jakarta.persistence.GenerationType;
13  import jakarta.persistence.Id;
14  import jakarta.persistence.JoinColumn;
15  import jakarta.persistence.ManyToOne;
16  import jakarta.persistence.PrePersist;
17  import jakarta.persistence.PreUpdate;
18  import jakarta.persistence.Table;
19  import jakarta.persistence.Version;
20  import jakarta.validation.constraints.NotNull;
21  import java.util.ArrayList;
22  import java.util.List;
23  import java.util.Optional;
24  import org.hibernate.annotations.Type;
25  import org.tailormap.api.persistence.helper.TMAttributeTypeHelper;
26  import org.tailormap.api.persistence.json.FeatureTypeSettings;
27  import org.tailormap.api.persistence.json.TMAttributeDescriptor;
28  import org.tailormap.api.persistence.json.TMFeatureTypeInfo;
29  import org.tailormap.api.persistence.listener.EntityEventPublisher;
30  
31  @Entity
32  @Table(name = "feature_type")
33  @EntityListeners(EntityEventPublisher.class)
34  public class TMFeatureType {
35  
36    @Id
37    @GeneratedValue(strategy = GenerationType.IDENTITY)
38    private Long id;
39  
40    @Version private Long version;
41  
42    @NotNull private String name;
43  
44    @ManyToOne(optional = false)
45    @JoinColumn(name = "feature_source")
46    private TMFeatureSource featureSource;
47  
48    private String title;
49  
50    @Type(value = io.hypersistence.utils.hibernate.type.json.JsonBinaryType.class)
51    @Column(columnDefinition = "jsonb")
52    @NotNull
53    private TMFeatureTypeInfo info = new TMFeatureTypeInfo();
54  
55    // Note: this will vanish when feature type disappears at the source, unless we move this to a
56    // separate featureTypeSettings JSON property in TMFeatureSource
57    @Column(columnDefinition = "text")
58    private String comment;
59  
60    private String owner;
61  
62    private boolean writeable;
63  
64    private String defaultGeometryAttribute;
65  
66    // XXX: multiple primary keys?
67    private String primaryKeyAttribute;
68  
69    @Type(value = io.hypersistence.utils.hibernate.type.json.JsonBinaryType.class)
70    @Column(columnDefinition = "jsonb")
71    @NotNull
72    private List<TMAttributeDescriptor> attributes = new ArrayList<>();
73  
74    @Type(value = io.hypersistence.utils.hibernate.type.json.JsonBinaryType.class)
75    @Column(columnDefinition = "jsonb")
76    @NotNull
77    private FeatureTypeSettings settings = new FeatureTypeSettings();
78  
79    // <editor-fold desc="getters and setters">
80    public Long getId() {
81      return id;
82    }
83  
84    public TMFeatureType setId(Long id) {
85      this.id = id;
86      return this;
87    }
88  
89    public Long getVersion() {
90      return version;
91    }
92  
93    public TMFeatureType setVersion(Long version) {
94      this.version = version;
95      return this;
96    }
97  
98    public String getName() {
99      return name;
100   }
101 
102   public TMFeatureType setName(String type) {
103     this.name = type;
104     return this;
105   }
106 
107   public TMFeatureSource getFeatureSource() {
108     return featureSource;
109   }
110 
111   public TMFeatureType setFeatureSource(TMFeatureSource featureSource) {
112     this.featureSource = featureSource;
113     return this;
114   }
115 
116   public String getTitle() {
117     return title;
118   }
119 
120   public TMFeatureType setTitle(String title) {
121     this.title = title;
122     return this;
123   }
124 
125   public TMFeatureTypeInfo getInfo() {
126     return info;
127   }
128 
129   public TMFeatureType setInfo(TMFeatureTypeInfo info) {
130     this.info = info;
131     return this;
132   }
133 
134   public String getComment() {
135     return comment;
136   }
137 
138   public TMFeatureType setComment(String comment) {
139     this.comment = comment;
140     return this;
141   }
142 
143   public String getOwner() {
144     return owner;
145   }
146 
147   public TMFeatureType setOwner(String owner) {
148     this.owner = owner;
149     return this;
150   }
151 
152   public boolean isWriteable() {
153     return writeable;
154   }
155 
156   public TMFeatureType setWriteable(boolean writeable) {
157     this.writeable = writeable;
158     return this;
159   }
160 
161   public String getDefaultGeometryAttribute() {
162     return defaultGeometryAttribute;
163   }
164 
165   public TMFeatureType setDefaultGeometryAttribute(String defaultGeometryAttribute) {
166     this.defaultGeometryAttribute = defaultGeometryAttribute;
167     return this;
168   }
169 
170   public String getPrimaryKeyAttribute() {
171     return primaryKeyAttribute;
172   }
173 
174   public TMFeatureType setPrimaryKeyAttribute(String primaryKeyAttribute) {
175     this.primaryKeyAttribute = primaryKeyAttribute;
176     return this;
177   }
178 
179   public List<TMAttributeDescriptor> getAttributes() {
180     return attributes;
181   }
182 
183   public TMFeatureType setAttributes(List<TMAttributeDescriptor> attributes) {
184     this.attributes = attributes;
185     return this;
186   }
187 
188   public FeatureTypeSettings getSettings() {
189     return settings;
190   }
191 
192   public TMFeatureType setSettings(FeatureTypeSettings settings) {
193     this.settings = settings;
194     return this;
195   }
196 
197   // </editor-fold>
198 
199   @PrePersist
200   @PreUpdate
201   public void checkDefaultGeometryAttribute() {
202     if (defaultGeometryAttribute == null) {
203       defaultGeometryAttribute =
204           getAttributes().stream()
205               .filter(a -> TMAttributeTypeHelper.isGeometry(a.getType()))
206               .findFirst()
207               .map(TMAttributeDescriptor::getName)
208               .orElse(null);
209     }
210   }
211 
212   public Optional<TMAttributeDescriptor> getDefaultGeometryDescriptor() {
213     return getAttributeByName(defaultGeometryAttribute);
214   }
215 
216   public Optional<TMAttributeDescriptor> getAttributeByName(String name) {
217     if (name == null) {
218       return Optional.empty();
219     }
220     return getAttributes().stream().filter(a -> name.equals(a.getName())).findFirst();
221   }
222 }