1
2
3
4
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
56
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
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
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
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 }