allowedStyles = new HashSet<>();
/** Feature Attributes associated to the Layer
* We'll use the pair (details_id, name) as PK for the associated table.
* To do so, we have to perform some trick on the {@link LayerAttribute#access} field.
*/
- @org.hibernate.annotations.CollectionOfElements(fetch=FetchType.EAGER)
- @JoinTable( name = "gf_layer_attributes", joinColumns = @JoinColumn(name = "details_id"), uniqueConstraints = @UniqueConstraint(columnNames={"details_id", "name"}))
+ @ElementCollection(fetch=FetchType.EAGER)
+ @JoinTable(
+ name = "gf_layer_attributes", // @InternalModel
+ joinColumns = @JoinColumn(name = "details_id"),
+ uniqueConstraints = @UniqueConstraint(columnNames={"details_id", "name"}, name="gf_layer_attributes_didname_unq"),
+ foreignKey = @ForeignKey(name="fk_attribute_layer")
+ ) // @InternalModel
// override is used to set the pk as {"details_id", "name"}
// @AttributeOverride( name="access", column=@Column(name="access", nullable=false) )
- @ForeignKey(name="fk_attribute_layer")
@Fetch(FetchMode.SELECT) // without this, hibernate will duplicate results(!)
- private Set attributes = new HashSet();
+ private Set attributes = new HashSet<>();
@XmlJavaTypeAdapter(MultiPolygonAdapter.class)
public MultiPolygon getArea() {
diff --git a/src/services/core/model/src/main/java/org/geoserver/geofence/core/model/Rule.java b/src/services/core/model/src/main/java/org/geoserver/geofence/core/model/Rule.java
index d988bd08..4cdee966 100644
--- a/src/services/core/model/src/main/java/org/geoserver/geofence/core/model/Rule.java
+++ b/src/services/core/model/src/main/java/org/geoserver/geofence/core/model/Rule.java
@@ -17,8 +17,11 @@
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
+import javax.persistence.ForeignKey;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
+import javax.persistence.Index;
+import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
@@ -28,8 +31,6 @@
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
-import org.hibernate.annotations.ForeignKey;
-import org.hibernate.annotations.Index;
/**
* A Rule expresses if a given combination of request access is allowed or not.
@@ -61,14 +62,26 @@
* @author ETj (etj at geo-solutions.it)
*/
@Entity(name = "Rule")
-@Table(name = "gf_rule", uniqueConstraints = {
- @UniqueConstraint(columnNames = {"username", "rolename", "instance_id", "service", "request", "workspace", "layer"})})
+@Table(name = "gf_rule",
+ uniqueConstraints = { // @InternalModel
+ @UniqueConstraint(
+ columnNames = {"username", "rolename", "instance_id", "service", "request", "workspace", "layer"}, // @InternalModel
+ name = "gf_rule_username_rolename_instance_id_service_request_works_key" // @InternalModel
+ )}, // @InternalModel
+ indexes = { // @InternalModel
+ @Index(name = "idx_rule_priority", columnList = "priority"),
+ @Index(name = "idx_rule_service", columnList = "service"),
+ @Index(name = "idx_rule_request", columnList = "request"),
+ @Index(name = "idx_rule_workspace", columnList = "workspace"),
+ @Index(name = "idx_rule_layer", columnList = "layer")
+ } // @InternalModel
+) // @InternalModel
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "Rule")
@XmlRootElement(name = "Rule")
@XmlType(propOrder={"id","priority","username","rolename","instance","addressRange","service","request","workspace","layer","access","layerDetails","ruleLimits"})
public class Rule implements Identifiable, Serializable, Prioritizable, IPRangeProvider {
- private static final long serialVersionUID = -5127129225384707164L;
+ private static final long serialVersionUID = -3803809225384707164L;
/** The id. */
@Id
@@ -78,7 +91,6 @@ public class Rule implements Identifiable, Serializable, Prioritizable, IPRangeP
/** Lower numbers have higher priority */
@Column(nullable = false)
- @Index(name = "idx_rule_priority")
private long priority;
@Column(name = "username", nullable = true)
@@ -88,11 +100,10 @@ public class Rule implements Identifiable, Serializable, Prioritizable, IPRangeP
private String rolename;
@ManyToOne(optional = true, fetch = FetchType.EAGER)
- @ForeignKey(name = "fk_rule_instance")
+ @JoinColumn(foreignKey = @ForeignKey(name="fk_rule_instance"))
private GSInstance instance;
@Column
- @Index(name = "idx_rule_service")
private String service;
@Embedded
@@ -103,18 +114,15 @@ public class Rule implements Identifiable, Serializable, Prioritizable, IPRangeP
private IPAddressRange addressRange;
@Column
- @Index(name = "idx_rule_request")
private String request;
@Column
private String subfield;
@Column
- @Index(name = "idx_rule_workspace")
private String workspace;
@Column
- @Index(name = "idx_rule_layer")
private String layer;
@Enumerated(EnumType.STRING)
@@ -122,11 +130,11 @@ public class Rule implements Identifiable, Serializable, Prioritizable, IPRangeP
private GrantType access;
@OneToOne(optional = true, cascade = CascadeType.REMOVE, mappedBy = "rule") // main ref is in LayerDetails
- @ForeignKey(name = "fk_rule_details")
+ @JoinColumn(foreignKey = @ForeignKey(name="fk_rule_details"))
private LayerDetails layerDetails;
@OneToOne(optional = true, cascade = CascadeType.REMOVE, mappedBy = "rule") // main ref is in ruleLimits
- @ForeignKey(name = "fk_rule_limits")
+ @JoinColumn(foreignKey = @ForeignKey(name="fk_rule_limits"))
private RuleLimits ruleLimits;
public Rule() {
@@ -147,15 +155,6 @@ public Rule(long priority, String username, String rolename, GSInstance instance
this.access = access;
}
- /**
- * @deprecated need new subfield argument
- */
- @Deprecated
- public Rule(long priority, String username, String rolename, GSInstance instance, IPAddressRange addressRange,
- String service, String request, String workspace, String layer, GrantType access) {
- this(priority, username, rolename, instance, addressRange, service, request, null, workspace, layer, access);
- }
-
public Long getId() {
return id;
}
@@ -262,6 +261,7 @@ public RuleLimits getRuleLimits() {
* @deprecated This setter is only used by hibernate, should not be called by the user.
* @param ruleLimits
*/
+ @Deprecated
public void setRuleLimits(RuleLimits ruleLimits) {
this.ruleLimits = ruleLimits;
}
@@ -273,6 +273,7 @@ public LayerDetails getLayerDetails() {
/**
* @deprecated This setter is only used by hibernate, should not be called by the user.
*/
+ @Deprecated
public void setLayerDetails(LayerDetails layerDetails) {
this.layerDetails = layerDetails;
}
diff --git a/src/services/core/model/src/main/java/org/geoserver/geofence/core/model/RuleLimits.java b/src/services/core/model/src/main/java/org/geoserver/geofence/core/model/RuleLimits.java
index 53cbe550..d4d039c6 100644
--- a/src/services/core/model/src/main/java/org/geoserver/geofence/core/model/RuleLimits.java
+++ b/src/services/core/model/src/main/java/org/geoserver/geofence/core/model/RuleLimits.java
@@ -11,7 +11,9 @@
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
+import javax.persistence.ForeignKey;
import javax.persistence.Id;
+import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
@@ -26,8 +28,6 @@
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.Check;
-import org.hibernate.annotations.ForeignKey;
-import org.hibernate.annotations.Type;
import org.locationtech.jts.geom.MultiPolygon;
@@ -38,12 +38,16 @@
* @author ETj (etj at geo-solutions.it)
*/
@Entity(name = "RuleLimits")
-@Table(name = "gf_rule_limits", uniqueConstraints = @UniqueConstraint(columnNames = "rule_id"))
+@Table(name = "gf_rule_limits",
+ uniqueConstraints = @UniqueConstraint(
+ columnNames = "rule_id", // @InternalModel
+ name = "gf_rule_limits_rule_id_key") // @InternalModel
+) // @InternalModel
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "RuleLimits")
@XmlRootElement(name = "RuleLimits")
-public class RuleLimits implements Serializable {
+public class RuleLimits implements Identifiable, Serializable {
- private static final long serialVersionUID = 2829839552804345725L;
+ private static final long serialVersionUID = 3809839552804345725L;
/** The id. */
@Id
@@ -53,10 +57,10 @@ public class RuleLimits implements Serializable {
@OneToOne(optional = false)
@Check(constraints = "rule.access='LIMIT'") // ??? check this
- @ForeignKey(name = "fk_limits_rule")
+ @JoinColumn(foreignKey = @ForeignKey(name = "fk_limits_rule"))
private Rule rule;
- @Type(type = "org.hibernatespatial.GeometryUserType")
+ //@Type(type = "org.hibernate.spatial.JTSGeometryType")
@Column(name = "area")
private MultiPolygon allowedArea;
diff --git a/src/services/core/model/src/main/java/org/geoserver/geofence/core/model/UserGroup.java b/src/services/core/model/src/main/java/org/geoserver/geofence/core/model/UserGroup.java
index 08e42c20..3a6956dd 100644
--- a/src/services/core/model/src/main/java/org/geoserver/geofence/core/model/UserGroup.java
+++ b/src/services/core/model/src/main/java/org/geoserver/geofence/core/model/UserGroup.java
@@ -16,6 +16,7 @@
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
+import javax.persistence.UniqueConstraint;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@@ -30,7 +31,15 @@
* @author ETj (etj at geo-solutions.it)
*/
@Entity(name = "UserGroup")
-@Table(name = "gf_usergroup")
+@Table(name = "gf_usergroup",
+ uniqueConstraints = { // @InternalModel
+ @UniqueConstraint(
+ columnNames = {"extid"}, name = "gf_usergroup_extid_key"), // @InternalModel
+ @UniqueConstraint(
+ columnNames = {"name"}, name = "gf_usergroup_name_key") // @InternalModel
+ } // @InternalModel
+) // @InternalModel
+
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "usergroup")
@XmlRootElement(name = "UserGroup")
@XmlType(propOrder={"id","extId","name","dateCreation"/*,"customProps"*/})
@@ -49,11 +58,11 @@ public class UserGroup implements Identifiable, Serializable {
* An ID used in an external systems.
* This field should simplify Geofence integration in complex systems.
*/
- @Column(nullable=true, updatable=false, unique=true)
+ @Column(nullable=true, updatable=false)
private String extId;
/** The name. */
- @Column(nullable=false, updatable=true, unique=true)
+ @Column(nullable=false, updatable=true)
private String name;
/** The date creation. */
diff --git a/src/services/core/model/src/main/java/org/geoserver/geofence/core/model/util/EWKTParser.java b/src/services/core/model/src/main/java/org/geoserver/geofence/core/model/util/EWKTParser.java
new file mode 100644
index 00000000..1e9427d0
--- /dev/null
+++ b/src/services/core/model/src/main/java/org/geoserver/geofence/core/model/util/EWKTParser.java
@@ -0,0 +1,35 @@
+/* (c) 2024 Open Source Geospatial Foundation - all rights reserved
+ * This code is licensed under the GPL 2.0 license, available at the root
+ * application directory.
+ */
+package org.geoserver.geofence.core.model.util;
+
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.io.ParseException;
+import org.locationtech.jts.io.WKTReader;
+
+/**
+ *
+ * @author etj
+ */
+public class EWKTParser {
+
+ static public Geometry parse(String wkt) throws ParseException {
+ if (wkt == null) {
+ return null;
+ }
+
+ WKTReader reader = new WKTReader();
+ Geometry result;
+ if (wkt.startsWith("SRID=")) {
+ String[] areaAr = wkt.split(";");
+ String srid = areaAr[0].split("=")[1];
+ result = reader.read(areaAr[1]);
+ result.setSRID(Integer.valueOf(srid));
+ } else {
+ result = reader.read(wkt);
+ result.setSRID(4326);
+ }
+ return result;
+ }
+}
diff --git a/src/services/core/persistence-pg-test/pom.xml b/src/services/core/persistence-pg-test/pom.xml
index b2282e5d..97d5fb34 100644
--- a/src/services/core/persistence-pg-test/pom.xml
+++ b/src/services/core/persistence-pg-test/pom.xml
@@ -12,7 +12,7 @@
org.geoserver.geofence
geofence-core
- 3.7-SNAPSHOT
+ 3.8-SNAPSHOT
org.geoserver.geofence
diff --git a/src/services/core/persistence/pom.xml b/src/services/core/persistence/pom.xml
index 3593050e..41c4fdc3 100644
--- a/src/services/core/persistence/pom.xml
+++ b/src/services/core/persistence/pom.xml
@@ -12,7 +12,7 @@
org.geoserver.geofence
geofence-core
- 3.7-SNAPSHOT
+ 3.8-SNAPSHOT
org.geoserver.geofence
@@ -69,7 +69,7 @@
- dom4j
+ org.dom4j
dom4j
@@ -98,36 +98,36 @@
spring-jdbc