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