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.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    // Note: this will vanish when feature type disappears at the source, unless we move this to a
54    // separate featureTypeSettings JSON property in TMFeatureSource
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    // XXX: multiple primary keys?
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    // <editor-fold desc="getters and setters">
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   // </editor-fold>
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 }