diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml index cd5c809af1f872239d234c8f1e6cba56f25a95fb..0b244a12a46ec7d9ec25ba86fd01c9f2d5b97d5f 100644 --- a/dbrepo-data-service/pom.xml +++ b/dbrepo-data-service/pom.xml @@ -23,7 +23,7 @@ <module>report</module> </modules> - <url>https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/</url> + <url>https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/</url> <developers> <developer> <name>Martin Weise</name> diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java index f656ba84bb8eb52d46301ba40fabeb68c060db44..a2fb1264cc360f0de0d5502306b215d79a442a70 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java @@ -21,12 +21,11 @@ import static jakarta.persistence.GenerationType.IDENTITY; @AllArgsConstructor @NoArgsConstructor @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @Table(name = "mdb_containers") public class Container { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @@ -55,7 +54,7 @@ public class Container { @Column private String uiAdditionalFlags; - @ToString.Exclude + @EqualsAndHashCode.Exclude @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @JoinColumns({ @JoinColumn(name = "cid", referencedColumnName = "id", insertable = false, updatable = false) @@ -68,11 +67,13 @@ public class Container { }) private ContainerImage image; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") private Instant created; + @EqualsAndHashCode.Exclude @LastModifiedDate @Column(columnDefinition = "TIMESTAMP") private Instant lastModified; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java index fbd4e44e8e5d3e9639cacb99acb5d55f5b045f61..7e04ce2086c3b4e9e677548b106cc28ddc9756ee 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/ContainerImage.java @@ -20,7 +20,7 @@ import static jakarta.persistence.GenerationType.IDENTITY; @AllArgsConstructor @NoArgsConstructor @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @Table(name = "mdb_images", uniqueConstraints = @UniqueConstraint(columnNames = {"name", "version"})) @NamedQueries({ @NamedQuery(name = "ContainerImage.findAll", query = "select i from ContainerImage i order by i.id asc") @@ -28,7 +28,6 @@ import static jakarta.persistence.GenerationType.IDENTITY; public class ContainerImage { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) public Long id; @@ -61,11 +60,13 @@ public class ContainerImage { @OneToMany(fetch = FetchType.LAZY, mappedBy = "image") private List<Container> containers; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") private Instant created; + @EqualsAndHashCode.Exclude @LastModifiedDate @Column(columnDefinition = "TIMESTAMP") private Instant lastModified; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/DataType.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/DataType.java index 93759ed5cbfb6a1de6789de943036b457f7e63f7..5f4ddbfb8c6dd8a657a88432d4606fa6f9c56f7e 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/DataType.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/DataType.java @@ -13,12 +13,11 @@ import static jakarta.persistence.GenerationType.IDENTITY; @AllArgsConstructor @NoArgsConstructor @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @Table(name = "mdb_image_types") public class DataType { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) public Long id; @@ -69,6 +68,7 @@ public class DataType { private Boolean buildable; @ToString.Exclude + @EqualsAndHashCode.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ @JoinColumn(name = "image_id", referencedColumnName = "id") diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/Operator.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/Operator.java index ae01dbee2f2a22dc40712b0fff2f8ac7e16adbc6..bbd994fa7ec05d775ba8a7c2eebb1ece418d2726 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/Operator.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/image/Operator.java @@ -13,12 +13,11 @@ import static jakarta.persistence.GenerationType.IDENTITY; @AllArgsConstructor @NoArgsConstructor @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @Table(name = "mdb_image_operators") public class Operator { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) public Long id; @@ -33,6 +32,7 @@ public class Operator { private String documentation; @ToString.Exclude + @EqualsAndHashCode.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ @JoinColumn(name = "image_id", referencedColumnName = "id") diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java index e54b097bd045ae550a594e3b0585fa2fec110c96..f70fbd93a31d7566e878fd11f31945bc73689c49 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java @@ -26,6 +26,7 @@ import static jakarta.persistence.GenerationType.IDENTITY; @ToString @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @jakarta.persistence.Table(name = "mdb_databases", uniqueConstraints = { @UniqueConstraint(columnNames = {"cid", "internalName"}) @@ -43,12 +44,10 @@ import static jakarta.persistence.GenerationType.IDENTITY; public class Database implements Serializable { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; - @ToString.Exclude @JdbcTypeCode(java.sql.Types.VARCHAR) @Column(name = "owned_by", columnDefinition = "VARCHAR(36)") private UUID ownedBy; @@ -62,6 +61,7 @@ public class Database implements Serializable { @Column(nullable = false) private Long cid; + @ToString.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @JoinColumns({ @JoinColumn(name = "cid", referencedColumnName = "id", insertable = false, updatable = false) @@ -80,7 +80,6 @@ public class Database implements Serializable { @Column(columnDefinition = "TEXT") private String description; - @ToString.Exclude @JdbcTypeCode(java.sql.Types.VARCHAR) @Column(name = "contact_person", columnDefinition = "VARCHAR(36)") private UUID contactPerson; @@ -91,29 +90,24 @@ public class Database implements Serializable { }) private User contact; - @ToString.Exclude @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}, mappedBy = "database") @Where(clause = "identifier_type='DATABASE'") @OrderBy("id DESC") private List<Identifier> identifiers; - @ToString.Exclude @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}, mappedBy = "database") @Where(clause = "identifier_type='SUBSET'") @OrderBy("id DESC") private List<Identifier> subsets; - @ToString.Exclude @OrderBy("id DESC") @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "database", orphanRemoval = true) private List<Table> tables; - @ToString.Exclude @OrderBy("id DESC") @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "database", orphanRemoval = true) private List<View> views; - @ToString.Exclude @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "database", orphanRemoval = true) private List<DatabaseAccess> accesses; @@ -128,11 +122,13 @@ public class Database implements Serializable { @Column(columnDefinition = "LONGBLOB") private byte[] image; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") private Instant created; + @EqualsAndHashCode.Exclude @LastModifiedDate @Column(columnDefinition = "TIMESTAMP") private Instant lastModified; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java index eeb9da55fef08b16b743d3afe06ef1ea9b4ab5bc..079aac84c7d191f71d29657c6837a6ae9f545bab 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/DatabaseAccess.java @@ -17,7 +17,7 @@ import java.util.UUID; @ToString @AllArgsConstructor @NoArgsConstructor -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @IdClass(DatabaseAccessKey.class) @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_have_access") @@ -28,7 +28,6 @@ import java.util.UUID; public class DatabaseAccess { @Id - @EqualsAndHashCode.Include @JdbcTypeCode(java.sql.Types.VARCHAR) @Column(name = "user_id", updatable = false, columnDefinition = "VARCHAR(36)") private UUID huserid; @@ -42,11 +41,11 @@ public class DatabaseAccess { private User user; @Id - @EqualsAndHashCode.Include @Column(name = "database_id", updatable = false) private Long hdbid; @ToString.Exclude + @EqualsAndHashCode.Exclude @org.springframework.data.annotation.Transient @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ @@ -58,9 +57,4 @@ public class DatabaseAccess { @Column(nullable = false, name = "access_type", columnDefinition = "enum('READ', 'WRITE_OWN', 'WRITE_ALL')") private AccessType type; - @CreatedDate - @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - } diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java index ae12208ad8e7f66e00a7c73ce59ae1cd18ef343f..67e6d6d18ac26a1cb2641ed45ae9e969c7393164 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java @@ -25,6 +25,7 @@ import static jakarta.persistence.GenerationType.IDENTITY; @ToString @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_view") @NamedQueries({ @@ -37,7 +38,6 @@ public class View { @Id @org.springframework.data.annotation.Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @@ -89,6 +89,7 @@ public class View { private List<Identifier> identifiers; @ToString.Exclude + @EqualsAndHashCode.Exclude @org.springframework.data.annotation.Transient @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ @@ -102,11 +103,13 @@ public class View { @OrderBy("ordinalPosition") private List<ViewColumn> columns; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") private Instant created; + @EqualsAndHashCode.Exclude @LastModifiedDate @Column(columnDefinition = "TIMESTAMP") private Instant lastModified; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java index ef1372f3bc7339c694c42c4b3aed0d7010c9193f..7ef6e8b9d63c30e05313514c78ad562306318185 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/ViewColumn.java @@ -13,7 +13,7 @@ import static jakarta.persistence.GenerationType.IDENTITY; @ToString @AllArgsConstructor @NoArgsConstructor -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @jakarta.persistence.Table(name = "mdb_view_columns", uniqueConstraints = { @UniqueConstraint(columnNames = {"view_id", "internal_name"}) @@ -21,12 +21,12 @@ import static jakarta.persistence.GenerationType.IDENTITY; public class ViewColumn implements Comparable<ViewColumn> { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @ToString.Exclude + @EqualsAndHashCode.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ @JoinColumn(name = "view_id", referencedColumnName = "id", nullable = false) diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java index 921a873c44e935a3b89459c8d9bb20c44df4dc84..3cdb01d7d38477cc8a77b4e12ed9af61d04ecfba 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java @@ -30,7 +30,7 @@ import static jakarta.persistence.GenerationType.IDENTITY; @ToString @AllArgsConstructor @NoArgsConstructor -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @jakarta.persistence.Table(name = "mdb_tables", uniqueConstraints = { @UniqueConstraint(columnNames = {"tdbid", "internalName"}) @@ -38,7 +38,6 @@ import static jakarta.persistence.GenerationType.IDENTITY; public class Table { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(name = "ID", updatable = false, nullable = false) private Long id; @@ -70,6 +69,7 @@ public class Table { private String description; @ToString.Exclude + @EqualsAndHashCode.Exclude @org.springframework.data.annotation.Transient @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ @@ -88,7 +88,6 @@ public class Table { @OrderBy("id DESC") private List<Identifier> identifiers; - @ToString.Exclude @Embedded private Constraints constraints; @@ -113,17 +112,18 @@ public class Table { @Column(name = "avg_row_length") private Long avgRowLength; - @ToString.Exclude @OnDelete(action = OnDeleteAction.CASCADE) @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}, mappedBy = "table") @OrderBy("ordinalPosition") private List<TableColumn> columns; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") private Instant created; + @EqualsAndHashCode.Exclude @LastModifiedDate @Column(columnDefinition = "TIMESTAMP") private Instant lastModified; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java index 32e3b46c5dedd265ffcf363480dc3baa20005692..9f4c4e0606802a475e5873e3d0ebc57455a6a0e2 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumn.java @@ -20,7 +20,7 @@ import static jakarta.persistence.GenerationType.IDENTITY; @ToString @AllArgsConstructor @NoArgsConstructor -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @jakarta.persistence.Table(name = "mdb_columns", uniqueConstraints = { @UniqueConstraint(columnNames = {"tID", "internal_name"}) @@ -31,12 +31,12 @@ import static jakarta.persistence.GenerationType.IDENTITY; public class TableColumn implements Comparable<TableColumn> { @Id - @EqualsAndHashCode.Include - @GeneratedValue(strategy=IDENTITY) + @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @ToString.Exclude + @EqualsAndHashCode.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ @JoinColumn(name = "tID", referencedColumnName = "id", nullable = false) @@ -71,11 +71,6 @@ public class TableColumn implements Comparable<TableColumn> { @Column(nullable = false) private Integer ordinalPosition; - @CreatedDate - @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") - private Instant created; - @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}) @JoinTable(name = "mdb_columns_concepts", joinColumns = @JoinColumn(name = "cid", referencedColumnName = "id", nullable = false), @@ -119,6 +114,13 @@ public class TableColumn implements Comparable<TableColumn> { @Column(name = "std_dev") private BigDecimal stdDev; + @EqualsAndHashCode.Exclude + @CreatedDate + @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") + private Instant created; + + @EqualsAndHashCode.Exclude @LastModifiedDate @Column(columnDefinition = "TIMESTAMP") private Instant lastModified; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnConcept.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnConcept.java index 0283b10cd0a0066d7573e3e4d0a579cffad3e1b9..5a9e8292be0af3e99050bc87be1ba7b8b9756bf7 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnConcept.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnConcept.java @@ -18,7 +18,7 @@ import static jakarta.persistence.GenerationType.IDENTITY; @NoArgsConstructor @ToString @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @Table(name = "mdb_concepts", uniqueConstraints = { @UniqueConstraint(columnNames = {"uri"}) }) @@ -29,7 +29,6 @@ import static jakarta.persistence.GenerationType.IDENTITY; public class TableColumnConcept { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @@ -43,6 +42,7 @@ public class TableColumnConcept { @Column(columnDefinition = "TEXT") private String description; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnUnit.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnUnit.java index def2a78e0814d21a768b3e62a62f3576f4adb5c4..7e8fe915b3b9de49e53eb0806da1f5ed03608a1d 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnUnit.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/columns/TableColumnUnit.java @@ -18,7 +18,7 @@ import static jakarta.persistence.GenerationType.IDENTITY; @AllArgsConstructor @NoArgsConstructor @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @Table(name = "mdb_units", uniqueConstraints = { @UniqueConstraint(columnNames = {"uri"}) }) @@ -29,7 +29,6 @@ import static jakarta.persistence.GenerationType.IDENTITY; public class TableColumnUnit { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @@ -43,6 +42,7 @@ public class TableColumnUnit { @Column(columnDefinition = "TEXT") private String description; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP") @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC") diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java index 69dad3d01ce6eb557588c5d7f9472828ff65c712..76de9463cfa37048fb45d2b091b472190124ff1b 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKey.java @@ -16,12 +16,11 @@ import static jakarta.persistence.GenerationType.IDENTITY; @NoArgsConstructor @ToString @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @jakarta.persistence.Table(name = "mdb_constraints_foreign_key") public class ForeignKey { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(name = "fkid", updatable = false, nullable = false) private Long id; @@ -30,6 +29,7 @@ public class ForeignKey { private String name; @ToString.Exclude + @EqualsAndHashCode.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @JoinColumns({ @JoinColumn(name = "tid", referencedColumnName = "id", nullable = false) @@ -37,6 +37,7 @@ public class ForeignKey { private Table table; @ToString.Exclude + @EqualsAndHashCode.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE) @JoinColumns({ @JoinColumn(name = "rtid", referencedColumnName = "id", nullable = false) diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java index 0ec2a3393d2fdb539b8207d9fe94fc3f8002b93c..ed2691fc524a3de33788ed977b1ba213b18b5bfe 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/foreignKey/ForeignKeyReference.java @@ -14,19 +14,19 @@ import static jakarta.persistence.GenerationType.IDENTITY; @NoArgsConstructor @ToString @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @Table(name = "mdb_constraints_foreign_key_reference", uniqueConstraints = { @UniqueConstraint(columnNames = {"fkid", "cid", "rcid"}) }) public class ForeignKeyReference { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @ToString.Exclude + @EqualsAndHashCode.Exclude @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumn(name = "fkid", referencedColumnName = "fkid", nullable = false) private ForeignKey foreignKey; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/primaryKey/PrimaryKey.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/primaryKey/PrimaryKey.java index 84d8cb75d7f68a0ea5f9e5336e477e19b00fd076..407e2fb7f3f98b6a8b65d28636c92afaceb3e69c 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/primaryKey/PrimaryKey.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/primaryKey/PrimaryKey.java @@ -15,17 +15,17 @@ import static jakarta.persistence.GenerationType.IDENTITY; @NoArgsConstructor @ToString @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @jakarta.persistence.Table(name = "mdb_constraints_primary_key") public class PrimaryKey { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(name = "pkid", updatable = false, nullable = false) private Long id; @ToString.Exclude + @EqualsAndHashCode.Exclude @org.springframework.data.annotation.Transient @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ @@ -34,6 +34,7 @@ public class PrimaryKey { private Table table; @ToString.Exclude + @EqualsAndHashCode.Exclude @org.springframework.data.annotation.Transient @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java index f8517dda17367172072392ba65db1a5e0f08b8c0..c0dfc467109cf794dda89925393b442286254da5 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/constraints/unique/Unique.java @@ -17,12 +17,11 @@ import static jakarta.persistence.GenerationType.IDENTITY; @NoArgsConstructor @ToString @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @jakarta.persistence.Table(name = "mdb_constraints_unique") public class Unique { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(name = "uid", updatable = false, nullable = false) private Long id; @@ -31,6 +30,7 @@ public class Unique { private String name; @ToString.Exclude + @EqualsAndHashCode.Exclude @org.springframework.data.annotation.Transient @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinColumns({ @@ -38,6 +38,7 @@ public class Unique { }) private Table table; + @EqualsAndHashCode.Exclude @org.springframework.data.annotation.Transient @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}) @JoinTable( diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Creator.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Creator.java index 9ec7dca46891e7ae7d99134977d44b67a23a5679..1b0692ae50adf8d6ca280a5403908cb3e8d65f42 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Creator.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Creator.java @@ -12,13 +12,13 @@ import static jakarta.persistence.GenerationType.IDENTITY; @ToString @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_identifier_creators") public class Creator { @Id @org.springframework.data.annotation.Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java index db34a5aca526b0ca009946f677811e9d175bd6ec..b98a1b8c6b7509ef0772f69e2af343b1b63d386e 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java @@ -25,7 +25,7 @@ import static jakarta.persistence.GenerationType.IDENTITY; @ToString @AllArgsConstructor @NoArgsConstructor -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_identifiers") @NamedQueries({ @@ -39,7 +39,6 @@ import static jakarta.persistence.GenerationType.IDENTITY; public class Identifier implements Serializable { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @@ -139,6 +138,7 @@ public class Identifier implements Serializable { * Databases are never created/updated/deleted by the Identifier entity. */ @ToString.Exclude + @EqualsAndHashCode.Exclude @ManyToOne(fetch = FetchType.LAZY) @JoinColumns({ @JoinColumn(name = "dbid", referencedColumnName = "id", nullable = false, updatable = false) @@ -166,10 +166,12 @@ public class Identifier implements Serializable { }) private User owner; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()") private Instant created; + @EqualsAndHashCode.Exclude @LastModifiedDate @Column(columnDefinition = "TIMESTAMP") private Instant lastModified; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierDescription.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierDescription.java index 83e123e90dc83d28dff6d471f99a624b4a278479..af684d2347b20bd54a959040b7b07937fc69952f 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierDescription.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierDescription.java @@ -15,13 +15,13 @@ import static jakarta.persistence.GenerationType.IDENTITY; @ToString @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_identifier_descriptions") public class IdentifierDescription implements Serializable { @Id @org.springframework.data.annotation.Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierFunder.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierFunder.java index 56372bdb6382562f45154ba430bfe593e19d3ee6..c5720223467f5e52ac54354c11dc21baf36fcd0d 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierFunder.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierFunder.java @@ -14,12 +14,12 @@ import static jakarta.persistence.GenerationType.IDENTITY; @ToString @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_identifier_funders") public class IdentifierFunder implements Serializable { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierTitle.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierTitle.java index ea1c17bc92765ad0659eafd5aebe5a10108778fd..cecc2c5c9804114529be0c6543de1ea69f5668aa 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierTitle.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/IdentifierTitle.java @@ -15,12 +15,12 @@ import static jakarta.persistence.GenerationType.IDENTITY; @ToString @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_identifier_titles") public class IdentifierTitle implements Serializable { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifier.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifier.java index b09c7afc36e7466734f6c1fd923a46081d9d4b13..e8b1acde125265bdda9d94918daf0bf478ff4904 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifier.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/RelatedIdentifier.java @@ -12,7 +12,7 @@ import static jakarta.persistence.GenerationType.IDENTITY; @ToString @AllArgsConstructor @NoArgsConstructor -@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_related_identifiers", uniqueConstraints = { @UniqueConstraint(columnNames = {"id", "pid"}) @@ -20,7 +20,6 @@ import static jakarta.persistence.GenerationType.IDENTITY; public class RelatedIdentifier { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/maintenance/BannerMessage.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/maintenance/BannerMessage.java index 94cb08490ab47930894d79431501cee1f3a0324f..f22cee71a7a3dc4a97c8294619b5ec8931db1714 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/maintenance/BannerMessage.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/maintenance/BannerMessage.java @@ -14,6 +14,7 @@ import static jakarta.persistence.GenerationType.IDENTITY; @ToString @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_banner_messages") @NamedQueries({ @@ -22,7 +23,6 @@ import static jakarta.persistence.GenerationType.IDENTITY; public class BannerMessage { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/semantics/Ontology.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/semantics/Ontology.java index 28451838c654fc0009e7d99b5f1266da051feea5..576aab1e375028a9a776ae96cb0ea983f84e7274 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/semantics/Ontology.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/semantics/Ontology.java @@ -16,6 +16,7 @@ import static jakarta.persistence.GenerationType.IDENTITY; @ToString @AllArgsConstructor @NoArgsConstructor +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) @Table(name = "mdb_ontologies") @NamedQueries({ @@ -26,7 +27,6 @@ import static jakarta.persistence.GenerationType.IDENTITY; public class Ontology { @Id - @EqualsAndHashCode.Include @GeneratedValue(strategy = IDENTITY) @Column(updatable = false, nullable = false) private Long id; @@ -46,10 +46,12 @@ public class Ontology { @Column private String rdfPath; + @EqualsAndHashCode.Exclude @CreatedDate @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP") private Instant created; + @EqualsAndHashCode.Exclude @LastModifiedDate @Column(columnDefinition = "TIMESTAMP") private Instant lastModified; diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java index 2d6ac4ccbee653e28cc25c5b78bbedeb89b1652f..c732864969c23bf45e4c616bd0c154703615d286 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/user/User.java @@ -15,16 +15,15 @@ import java.util.UUID; @Data @Entity @Builder +@ToString @AllArgsConstructor @NoArgsConstructor -@ToString +@EqualsAndHashCode @EntityListeners(AuditingEntityListener.class) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) @Table(name = "mdb_users") public class User { @Id - @EqualsAndHashCode.Include @JdbcTypeCode(java.sql.Types.VARCHAR) @Column(name = "ID", nullable = false, columnDefinition = "VARCHAR(36)") private UUID id; @@ -50,7 +49,6 @@ public class User { @Column private String language; - @ToString.Exclude @OneToMany(fetch = FetchType.LAZY) @JoinColumns({ @JoinColumn(name = "user_id", referencedColumnName = "ID", insertable = false, updatable = false) @@ -60,43 +58,7 @@ public class User { @Column(nullable = false) private String theme; - @ToString.Exclude @Column(name = "mariadb_password", nullable = false) private String mariadbPassword; - @Override - public boolean equals(Object o) { - if (o == this) { - return true; - } - if (o instanceof Principal principal) { - final boolean result = this.getUsername().equals(principal.getName()); - log.trace("check if username {} equals principal name {}: {}", username, principal.getName(), result); - return result; - } - if (!(o instanceof User other)) { - return false; - } - final boolean result = this.getId().equals(other.getId()); - log.trace("check if id {} equals other id {}: {}", id, other.getId(), result); - return result; - } - - @Override - public int hashCode() { - int hash = 7; - hash = 31 * hash + (id == null ? 0 : id.hashCode()); - hash = 31 * hash + (username == null ? 0 : username.hashCode()); - hash = 31 * hash + (firstname == null ? 0 : firstname.hashCode()); - hash = 31 * hash + (lastname == null ? 0 : lastname.hashCode()); - hash = 31 * hash + (email == null ? 0 : email.hashCode()); - hash = 31 * hash + (orcid == null ? 0 : orcid.hashCode()); - hash = 31 * hash + (affiliation == null ? 0 : affiliation.hashCode()); - hash = 31 * hash + (language == null ? 0 : language.hashCode()); - hash = 31 * hash + (accesses == null ? 0 : accesses.hashCode()); - hash = 31 * hash + (theme == null ? 0 : theme.hashCode()); - hash = 31 * hash + (mariadbPassword == null ? 0 : mariadbPassword.hashCode()); - return hash; - } - } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java index f0e2aaeaa1c046aa582d6ea97931fa5c706dcf2d..29c27074d77253c5cecd6e4ea67afb07954e3bed 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java @@ -213,7 +213,7 @@ public class DatabaseEndpoint { log.debug("endpoint refresh database metadata, databaseId={}", databaseId); final Database database = databaseService.findById(databaseId); final User caller = userService.findByUsername(principal.getName()); - if (!database.getOwner().equals(principal)) { + if (!database.getOwner().getId().equals(caller.getId())) { log.error("Failed to refresh database tables metadata: not owner"); throw new NotAllowedException("Failed to refresh tables metadata: not owner"); } @@ -259,10 +259,10 @@ public class DatabaseEndpoint { @NotNull Principal principal) throws DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, UserNotFoundException, SearchServiceConnectionException, NotAllowedException, QueryNotFoundException, ViewNotFoundException { - log.debug("endpoint refresh database metadata, databaseId={}", databaseId); + log.debug("endpoint refresh database metadata, databaseId={}, principal.name={}", databaseId, principal.getName()); final Database database = databaseService.findById(databaseId); final User caller = userService.findByUsername(principal.getName()); - if (!database.getOwner().equals(principal)) { + if (!database.getOwner().getId().equals(caller.getId())) { log.error("Failed to refresh database views metadata: not owner"); throw new NotAllowedException("Failed to refresh database views metadata: not owner"); } @@ -429,7 +429,7 @@ public class DatabaseEndpoint { log.debug("endpoint modify database image, databaseId={}, data.key={}", databaseId, data.getKey()); final Database database = databaseService.findById(databaseId); final User caller = userService.findByUsername(principal.getName()); - if (!database.getOwner().equals(caller)) { + if (!database.getOwner().getId().equals(caller.getId())) { log.error("Failed to update database image: not owner"); throw new NotAllowedException("Failed to update database image: not owner"); } @@ -510,7 +510,7 @@ public class DatabaseEndpoint { caller = null; } final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(database, caller); - if (database.getOwner().equals(principal)) { + if (caller != null && database.getOwner().getId().equals(caller.getId())) { log.debug("current logged-in user is also the owner: additionally load access list"); /* only owner sees the access rights */ final List<DatabaseAccess> accesses = accessService.list(database); diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java index 886db20df0d917f36e13e7f36c669259a0b5c4d5..fbfd40e6289ef20d20ae2ade97b08b9e47f96d96 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/MetadataEndpoint.java @@ -18,7 +18,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.util.List; @@ -97,9 +100,8 @@ public class MetadataEndpoint { log.error("Failed to get record: Identifier is empty"); return ResponseEntity.status(HttpStatus.BAD_REQUEST) .body(metadataService.error(OaiErrorType.NO_RECORDS_MATCH)); - } else if (supportedIdentifierPrefixes.stream().noneMatch(identifierPrefix -> parameters.getIdentifier().startsWith(identifierPrefix)) - || parameters.getIdentifier().indexOf(':') > 3) { - log.error("Failed to get record: Identifier does not match supported prefixes {}", supportedIdentifierPrefixes); + } else if (supportedIdentifierPrefixes.stream().noneMatch(identifierPrefix -> parameters.getIdentifier().startsWith(identifierPrefix))) { + log.error("Failed to get record: Identifier does not match supported identifier prefixes {}", supportedIdentifierPrefixes); return ResponseEntity.status(HttpStatus.BAD_REQUEST) .body(metadataService.error(OaiErrorType.NO_RECORDS_MATCH)); } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java index a517c39d10f9c0463a756239c40fa14818d3a6b2..e04cba85cef7d0256add7794bb13b22f62ecb0b4 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java @@ -540,7 +540,7 @@ public class TableEndpoint { log.debug("endpoint delete table, databaseId={}, tableId={}", databaseId, tableId); final Table table = tableService.findById(databaseId, tableId); /* roles */ - if (!table.getOwner().equals(principal) && !UserUtil.hasRole(principal, "delete-foreign-table")) { + if (!table.getOwner().getUsername().equals(principal.getName()) && !UserUtil.hasRole(principal, "delete-foreign-table")) { log.error("Failed to delete table: not owned by current user"); throw new NotAllowedException("Failed to delete table: not owned by current user"); } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java index ca8159fd536ba0f55aefeb418479836b589192eb..fe2d0a343a28bfabf259925d90acf53834f0e209 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/UserEndpoint.java @@ -281,7 +281,7 @@ public class UserEndpoint { log.debug("endpoint find a user, userId={}, principal.name={}", userId, principal.getName()); /* check */ final User user = userService.findById(userId); - if (!user.equals(principal)) { + if (!user.getUsername().equals(principal.getName())) { if (!UserUtil.hasRole(principal, "find-foreign-user")) { log.error("Failed to find user: foreign user"); throw new NotAllowedException("Failed to find user: foreign user"); @@ -332,13 +332,12 @@ public class UserEndpoint { @NotNull Principal principal) throws NotAllowedException, UserNotFoundException, DatabaseNotFoundException { log.debug("endpoint modify a user, userId={}, data={}", userId, data); - User user = userService.findById(userId); - if (!user.equals(principal)) { - log.error("Failed to modify user: not current user"); - throw new NotAllowedException("Failed to modify user: not current user"); + final User user = userService.findById(userId); + if (!user.getUsername().equals(principal.getName())) { + log.error("Failed to modify user: not current user {}", user.getId()); + throw new NotAllowedException("Failed to modify user: not current user " + user.getId()); } - user = userService.modify(user, data); - final UserDto dto = userMapper.userToUserDto(user); + final UserDto dto = userMapper.userToUserDto(userService.modify(user, data)); return ResponseEntity.accepted() .body(dto); } @@ -386,7 +385,7 @@ public class UserEndpoint { DataServiceConnectionException, CredentialsInvalidException { log.debug("endpoint modify a user password, userId={}", userId); final User user = userService.findById(userId); - if (!user.equals(principal)) { + if (!user.getUsername().equals(principal.getName())) { log.error("Failed to modify user password: not current user"); throw new NotAllowedException("Failed to modify user password: not current user"); } diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java index 75958f5bde9f8aca33cf1e517fab437d376866cf..359c1be7967f48ffbaa671f52fa0bcaf5b6c5f61 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java @@ -256,9 +256,9 @@ public class ViewEndpoint { SearchServiceConnectionException { log.debug("endpoint delete view, databaseId={}, viewId={}", databaseId, viewId); final Database database = databaseService.findById(databaseId); - if (!database.getOwner().equals(principal)) { - log.error("Failed to delete view: not the database owner"); - throw new NotAllowedException("Failed to delete view: not the database owner"); + if (!database.getOwner().getUsername().equals(principal.getName())) { + log.error("Failed to delete view: not the database owner {}", database.getOwner().getId()); + throw new NotAllowedException("Failed to delete view: not the database owner " + database.getOwner().getId()); } final View view = viewService.findById(database, viewId); viewService.delete(view); diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java index 75c277a3b9699a722a5d43a6eb6548a809de0406..70f2e4e420eb104b7e76caaa702ed23850fe9565 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java @@ -176,7 +176,7 @@ public class EndpointValidator { log.error("validation failed: access is null"); return false; } - if (owner.equals(principal) && (access.getType().equals(AccessType.WRITE_ALL) || access.getType().equals(AccessType.WRITE_OWN))) { + if (owner.getUsername().equals(principal.getName()) && (access.getType().equals(AccessType.WRITE_ALL) || access.getType().equals(AccessType.WRITE_OWN))) { log.debug("validation passed: user {} matches owner {} and has write access {}", principal.getName(), owner.getUsername(), access.getType()); return true; } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java index 710a64c3ab2d0bf694c87c6626e461eb3fb38f28..861863a3151792709067e299c467f576b5999d58 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java @@ -5,7 +5,6 @@ import at.tuwien.entities.database.Database; import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.gateway.KeycloakGateway; -import at.tuwien.repository.UserRepository; import at.tuwien.service.*; import at.tuwien.service.impl.DatabaseServiceImpl; import at.tuwien.test.AbstractUnitTest; @@ -19,13 +18,13 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.AccessDeniedException; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.security.Principal; import java.util.List; -import java.util.Optional; import java.util.UUID; import static org.junit.jupiter.api.Assertions.*; @@ -76,7 +75,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { .build(); /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { create_generic(request, null, null); }); } @@ -91,7 +90,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { .build(); /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { create_generic(request, USER_4_PRINCIPAL, USER_4); }); } @@ -125,6 +124,156 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { create_generic(request, USER_1_PRINCIPAL, USER_1); } + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"create-database"}) + public void create_quotaExceeded_fails() throws UserNotFoundException, ContainerNotFoundException { + final DatabaseCreateDto request = DatabaseCreateDto.builder() + .cid(CONTAINER_4_ID) + .name(DATABASE_1_NAME) + .isPublic(DATABASE_1_PUBLIC) + .build(); + + /* mock */ + when(containerService.find(CONTAINER_4_ID)) + .thenReturn(CONTAINER_4); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); + + /* test */ + assertThrows(ContainerQuotaException.class, () -> { + create_generic(request, USER_1_PRINCIPAL, USER_1); + }); + } + + @Test + @WithAnonymousUser + public void refreshTableMetadata_anonymous_succeeds() { + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + databaseEndpoint.refreshTableMetadata(DATABASE_1_ID, null); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void refreshTableMetadata_noRole_succeeds() { + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + databaseEndpoint.refreshTableMetadata(DATABASE_1_ID, USER_1_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_2_USERNAME, authorities = {"find-database"}) + public void refreshTableMetadata_notOwner_fails() throws UserNotFoundException, TableNotFoundException, + SearchServiceException, MalformedException, DataServiceException, DatabaseNotFoundException, + SearchServiceConnectionException, DataServiceConnectionException { + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(userService.findByUsername(USER_2_USERNAME)) + .thenReturn(USER_2); + when(databaseService.updateTableMetadata(any(Database.class))) + .thenReturn(DATABASE_1); + + /* test */ + assertThrows(NotAllowedException.class, () -> { + databaseEndpoint.refreshTableMetadata(DATABASE_1_ID, USER_2_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"find-database"}) + public void refreshTableMetadata_succeeds() throws UserNotFoundException, TableNotFoundException, + SearchServiceException, MalformedException, DataServiceException, DatabaseNotFoundException, + SearchServiceConnectionException, DataServiceConnectionException, NotAllowedException, + QueryNotFoundException { + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); + when(databaseService.updateTableMetadata(any(Database.class))) + .thenReturn(DATABASE_1); + + /* test */ + final ResponseEntity<DatabaseDto> response = databaseEndpoint.refreshTableMetadata(DATABASE_1_ID, USER_1_PRINCIPAL); + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertNotNull(response.getBody()); + } + + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"find-database"}) + public void refreshViewMetadata_succeeds() throws UserNotFoundException, SearchServiceException, + NotAllowedException, DataServiceException, QueryNotFoundException, DatabaseNotFoundException, + SearchServiceConnectionException, DataServiceConnectionException, ViewNotFoundException { + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); + when(databaseService.updateViewMetadata(any(Database.class))) + .thenReturn(DATABASE_1); + + /* test */ + final ResponseEntity<DatabaseDto> response = databaseEndpoint.refreshViewMetadata(DATABASE_1_ID, USER_1_PRINCIPAL); + assertEquals(HttpStatus.OK, response.getStatusCode()); + assertNotNull(response.getBody()); + } + + @Test + @WithMockUser(username = USER_2_USERNAME, authorities = {"find-database"}) + public void refreshViewMetadata_notOwner_fails() throws UserNotFoundException, DatabaseNotFoundException { + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(userService.findByUsername(USER_2_USERNAME)) + .thenReturn(USER_2); + + /* test */ + assertThrows(NotAllowedException.class, () -> { + databaseEndpoint.refreshViewMetadata(DATABASE_1_ID, USER_2_PRINCIPAL); + }); + } + + @Test + @WithMockUser(username = USER_1_USERNAME) + public void refreshViewMetadata_noRole_fails() throws UserNotFoundException, DatabaseNotFoundException { + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + databaseEndpoint.refreshViewMetadata(DATABASE_1_ID, USER_1_PRINCIPAL); + }); + } + + @Test + @WithAnonymousUser + public void refreshViewMetadata_anonymous_fails() throws UserNotFoundException, DatabaseNotFoundException { + + /* mock */ + when(databaseService.findById(DATABASE_1_ID)) + .thenReturn(DATABASE_1); + when(userService.findByUsername(USER_1_USERNAME)) + .thenReturn(USER_1); + + /* test */ + assertThrows(AccessDeniedException.class, () -> { + databaseEndpoint.refreshViewMetadata(DATABASE_1_ID, null); + }); + } + @Test @WithAnonymousUser public void list_anonymous_succeeds() throws DatabaseNotFoundException { @@ -182,7 +331,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { .build(); /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { visibility_generic(DATABASE_1_ID, DATABASE_1, request, null); }); } @@ -214,7 +363,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { .build(); /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { visibility_generic(DATABASE_1_ID, DATABASE_1, request, USER_4_PRINCIPAL); }); } @@ -244,7 +393,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { .build(); /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { databaseEndpoint.modifyImage(DATABASE_3_ID, request, USER_4_PRINCIPAL); }); } @@ -278,7 +427,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { .build(); /* test */ - assertThrows(org.springframework.security.access.AccessDeniedException.class, () -> { + assertThrows(AccessDeniedException.class, () -> { databaseEndpoint.transfer(DATABASE_3_ID, request, USER_4_PRINCIPAL); }); } @@ -403,7 +552,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest { final DatabaseDto response = findById_generic(DATABASE_1_ID, DATABASE_1, USER_1_PRINCIPAL); final List<DatabaseAccessDto> accessList = response.getAccesses(); assertNotNull(accessList); - assertEquals(2, accessList.size()); + assertEquals(3, accessList.size()); } @Test diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java index 8a98bf11f5035e5e746e3fccfec77691d70a9ff7..ba3debd79dbde119b92b981d05c55a6590ee8975 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java @@ -345,7 +345,7 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { StandardCharsets.UTF_8); /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_1, BibliographyTypeDto.APA)) + when(identifierService.exportBibliography(any(Identifier.class), eq(BibliographyTypeDto.APA))) .thenReturn(compare); when(identifierService.find(IDENTIFIER_1_ID)) .thenReturn(IDENTIFIER_1_WITH_DOI); @@ -437,7 +437,7 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { StandardCharsets.UTF_8); /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_1, BibliographyTypeDto.IEEE)) + when(identifierService.exportBibliography(any(Identifier.class), eq(BibliographyTypeDto.IEEE))) .thenReturn(compare); when(identifierService.find(IDENTIFIER_1_ID)) .thenReturn(IDENTIFIER_1_WITH_DOI); @@ -529,7 +529,7 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest { StandardCharsets.UTF_8); /* mock */ - when(identifierService.exportBibliography(IDENTIFIER_1, BibliographyTypeDto.BIBTEX)) + when(identifierService.exportBibliography(any(Identifier.class), eq(BibliographyTypeDto.BIBTEX))) .thenReturn(compare); when(identifierService.find(IDENTIFIER_1_ID)) .thenReturn(IDENTIFIER_1_WITH_DOI); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MetadataEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MetadataEndpointUnitTest.java index 7ed994534287e13f0f3b33e0c19abcfb360e3f50..8853728d471e3649c5b5108a21ea5404e5ed1ea2 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MetadataEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/MetadataEndpointUnitTest.java @@ -1,9 +1,9 @@ package at.tuwien.endpoints; -import at.tuwien.test.AbstractUnitTest; import at.tuwien.oaipmh.OaiListIdentifiersParameters; import at.tuwien.oaipmh.OaiRecordParameters; import at.tuwien.repository.IdentifierRepository; +import at.tuwien.test.AbstractUnitTest; import at.tuwien.utils.XmlUtils; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeEach; @@ -178,6 +178,24 @@ public class MetadataEndpointUnitTest extends AbstractUnitTest { // TODO: currently no strict validation passes } + @Test + @WithAnonymousUser + public void getRecord_invalidIdentifierPrefix_succeeds() { + final OaiRecordParameters parameters = new OaiRecordParameters(); + parameters.setMetadataPrefix("oai_datacite"); + parameters.setIdentifier("ark:1"); + + /* mock */ + when(identifierRepository.findById(IDENTIFIER_1_ID)) + .thenReturn(Optional.of(IDENTIFIER_1)); + + /* test */ + final ResponseEntity<String> response = metadataEndpoint.getRecord(parameters); + assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); + final String body = response.getBody(); + assertNotNull(body); + } + @Test @WithAnonymousUser public void getRecord_notFound_fails() { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/OntologyEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/OntologyEndpointUnitTest.java index b7af494253ebc97fa51f3b5da86f72a9515a4703..c3f276c2dfca9a557117571bfa3a147b0f8bc507 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/OntologyEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/OntologyEndpointUnitTest.java @@ -81,6 +81,26 @@ public class OntologyEndpointUnitTest extends AbstractUnitTest { find_generic(ONTOLOGY_1_ID, ONTOLOGY_1); } + @Test + @WithMockUser(username = USER_1_USERNAME, authorities = {"execute-semantic-query"}) + public void find_noSparql_fails() throws OntologyNotFoundException { + final Ontology mock = Ontology.builder() + .id(9999L) + .uri(ONTOLOGY_1_URI) + .uriPattern(ONTOLOGY_1_URI_PATTERN) + .sparqlEndpoint(null) // <<< + .build(); + + /* mock */ + when(ontologyService.find(9999L)) + .thenReturn(mock); + + /* test */ + assertThrows(OntologyNotFoundException.class, () -> { + ontologyEndpoint.find(9999L, null, UNIT_1_URI); + }); + } + @Test @WithAnonymousUser public void find_notFound_fails() { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java index abfd9653dbbdaf8e40916b893d4acae35af865a0..fb574f35cae9dd3f3e10ae53be29d2d2b87aa8ff 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java @@ -63,23 +63,6 @@ public class MetadataMapperUnitTest extends AbstractUnitTest { assertNotEquals(CONTAINER_1, CONTAINER_2); } - @Test - public void containerEquals_identity_succeeds() { - - /* test */ - assertEquals(CONTAINER_1, CONTAINER_1); - } - - @Test - public void containerEquals_similar_succeeds() { - final Container tmp = Container.builder() - .id(CONTAINER_1_ID) - .build(); - - /* test */ - assertEquals(CONTAINER_1, tmp); - } - @Test public void identifierTypeDtoToIdentifierType_succeeds() { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceUnitTest.java index fa939b0cb1795b08257b743ddb239bd075871cf0..54015177aaff7d3e52a98b5c2db7103a8c272fc1 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/AccessServiceUnitTest.java @@ -65,8 +65,6 @@ public class AccessServiceUnitTest extends AbstractUnitTest { @Test public void find_succeeds() throws AccessNotFoundException { - /* mock */ - /* test */ final DatabaseAccess response = accessService.find(DATABASE_1, USER_1); assertEquals(AccessType.READ, response.getType()); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ConceptServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ConceptServiceUnitTest.java index 7cec5e624187fcb5c5285fc4fc0b4787b6a4e9a0..164f335eb73f68c986583da9881b743a32c44a06 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ConceptServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/ConceptServiceUnitTest.java @@ -6,7 +6,6 @@ import at.tuwien.test.AbstractUnitTest; import at.tuwien.entities.database.table.columns.TableColumnConcept; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java index a319044d3909efc8f87f703c9f6658e1d6be8b5b..43f99276f5c6f8dba3803a29f2fe71cea7cd70b3 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java @@ -30,6 +30,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; @@ -121,6 +122,7 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest { } @Test + @Transactional(readOnly = true) public void find_succeeds() throws IdentifierNotFoundException { /* test */ diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java index b324a94c9e1c9ba8346eb4d3e3c6a81ecc7cad0b..bda2fc0ee5b103393a14b32b4244018c242d3f5a 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java @@ -54,79 +54,21 @@ public class DatabaseServicePersistenceTest extends AbstractUnitTest { } @Test - @Transactional + @Transactional(readOnly = true) public void findById_succeeds() throws DatabaseNotFoundException { /* test */ final Database response = databaseService.findById(DATABASE_1_ID); - assertEquals(DATABASE_1_ID, response.getId()); - assertEquals(CONTAINER_1_ID, response.getCid()); - /* container */ - assertNotNull(response.getContainer()); - assertEquals(CONTAINER_1_ID, response.getContainer().getId()); - assertEquals(CONTAINER_1_NAME, response.getContainer().getName()); - assertEquals(CONTAINER_1_INTERNALNAME, response.getContainer().getInternalName()); - assertEquals(CONTAINER_1_HOST, response.getContainer().getHost()); - assertEquals(CONTAINER_1_PORT, response.getContainer().getPort()); - assertEquals(CONTAINER_1_UI_HOST, response.getContainer().getUiHost()); - assertEquals(CONTAINER_1_UI_PORT, response.getContainer().getUiPort()); - assertEquals(CONTAINER_1_UI_ADDITIONAL_FLAGS, response.getContainer().getUiAdditionalFlags()); - assertEquals(CONTAINER_1_PRIVILEGED_USERNAME, response.getContainer().getPrivilegedUsername()); - assertEquals(CONTAINER_1_PRIVILEGED_PASSWORD, response.getContainer().getPrivilegedPassword()); - assertNotNull(response.getContainer().getImage()); - assertEquals(IMAGE_1_NAME, response.getContainer().getImage().getName()); - assertEquals(IMAGE_1_VERSION, response.getContainer().getImage().getVersion()); - assertEquals(IMAGE_1_DIALECT, response.getContainer().getImage().getDialect()); - assertEquals(IMAGE_1_JDBC, response.getContainer().getImage().getJdbcMethod()); - assertEquals(IMAGE_1_DRIVER, response.getContainer().getImage().getDriverClass()); - assertEquals(IMAGE_1_REGISTRY, response.getContainer().getImage().getRegistry()); - assertEquals(IMAGE_1_PORT, response.getContainer().getImage().getDefaultPort()); - /* creator */ - assertNotNull(response.getOwner()); - assertEquals(USER_1_ID, response.getOwner().getId()); - assertEquals(USER_1_USERNAME, response.getOwner().getUsername()); - assertEquals(USER_1_EMAIL, response.getOwner().getEmail()); - assertEquals(USER_1_THEME, response.getOwner().getTheme()); - assertEquals(USER_1_LANGUAGE, response.getOwner().getLanguage()); - assertNotNull(response.getOwner().getAccesses()); + assertEquals(DATABASE_1, response); } @Test - @Transactional + @Transactional(readOnly = true) public void findByInternalName_succeeds() throws DatabaseNotFoundException { /* test */ final Database response = databaseService.findByInternalName(DATABASE_1_INTERNALNAME); - assertEquals(DATABASE_1_ID, response.getId()); - assertEquals(CONTAINER_1_ID, response.getCid()); - /* container */ - assertNotNull(response.getContainer()); - assertEquals(CONTAINER_1_ID, response.getContainer().getId()); - assertEquals(CONTAINER_1_NAME, response.getContainer().getName()); - assertEquals(CONTAINER_1_INTERNALNAME, response.getContainer().getInternalName()); - assertEquals(CONTAINER_1_HOST, response.getContainer().getHost()); - assertEquals(CONTAINER_1_PORT, response.getContainer().getPort()); - assertEquals(CONTAINER_1_UI_HOST, response.getContainer().getUiHost()); - assertEquals(CONTAINER_1_UI_PORT, response.getContainer().getUiPort()); - assertEquals(CONTAINER_1_UI_ADDITIONAL_FLAGS, response.getContainer().getUiAdditionalFlags()); - assertEquals(CONTAINER_1_PRIVILEGED_USERNAME, response.getContainer().getPrivilegedUsername()); - assertEquals(CONTAINER_1_PRIVILEGED_PASSWORD, response.getContainer().getPrivilegedPassword()); - assertNotNull(response.getContainer().getImage()); - assertEquals(IMAGE_1_NAME, response.getContainer().getImage().getName()); - assertEquals(IMAGE_1_VERSION, response.getContainer().getImage().getVersion()); - assertEquals(IMAGE_1_DIALECT, response.getContainer().getImage().getDialect()); - assertEquals(IMAGE_1_JDBC, response.getContainer().getImage().getJdbcMethod()); - assertEquals(IMAGE_1_DRIVER, response.getContainer().getImage().getDriverClass()); - assertEquals(IMAGE_1_REGISTRY, response.getContainer().getImage().getRegistry()); - assertEquals(IMAGE_1_PORT, response.getContainer().getImage().getDefaultPort()); - /* creator */ - assertNotNull(response.getOwner()); - assertEquals(USER_1_ID, response.getOwner().getId()); - assertEquals(USER_1_USERNAME, response.getOwner().getUsername()); - assertEquals(USER_1_EMAIL, response.getOwner().getEmail()); - assertEquals(USER_1_THEME, response.getOwner().getTheme()); - assertEquals(USER_1_LANGUAGE, response.getOwner().getLanguage()); - assertNotNull(response.getOwner().getAccesses()); + assertEquals(DATABASE_1, response); } } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java index b0919f816a0b3aa0cbaad90aa62093987c54eabd..7815c4ae69a98c5dfd5171e1c83cd9fdb6de0a72 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java @@ -2,7 +2,9 @@ package at.tuwien.service; import at.tuwien.api.database.DatabaseModifyVisibilityDto; import at.tuwien.api.database.internal.CreateDatabaseDto; +import at.tuwien.api.user.internal.UpdateUserPasswordDto; import at.tuwien.entities.database.Database; +import at.tuwien.entities.database.table.Table; import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.gateway.DataServiceGateway; @@ -22,10 +24,8 @@ import java.util.List; import java.util.Optional; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.when; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; @Log4j2 @SpringBootTest @@ -87,6 +87,263 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest { }); } + @Test + public void findByInternalName_notFound_fails() { + + /* mock */ + when(databaseRepository.findByInternalName(DATABASE_1_INTERNALNAME)) + .thenReturn(Optional.empty()); + + /* test */ + assertThrows(DatabaseNotFoundException.class, () -> { + databaseService.findByInternalName(DATABASE_1_INTERNALNAME); + }); + } + + @Test + public void updatePassword_succeeds() throws DataServiceException, DatabaseNotFoundException, + DataServiceConnectionException { + + /* mock */ + when(databaseRepository.findReadAccess(USER_1_ID)) + .thenReturn(List.of(DATABASE_1)); + doNothing() + .when(dataServiceGateway) + .updateDatabase(eq(DATABASE_1_ID), any(UpdateUserPasswordDto.class)); + + /* test */ + databaseService.updatePassword(DATABASE_1, USER_1); + } + + @Test + public void modifyImage_succeeds() throws SearchServiceException, DatabaseNotFoundException, SearchServiceConnectionException { + final byte[] image = new byte[]{1, 2, 3, 4, 5}; + + /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final Database response = databaseService.modifyImage(DATABASE_1, image); + assertNotNull(response); + } + + @Test + public void modifyImage_searchServiceNotFound_fails() throws SearchServiceException, DatabaseNotFoundException, + SearchServiceConnectionException { + final byte[] image = new byte[]{1, 2, 3, 4, 5}; + + /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + doThrow(DatabaseNotFoundException.class) + .when(searchServiceGateway) + .update(any(Database.class)); + + /* test */ + assertThrows(DatabaseNotFoundException.class, () -> { + databaseService.modifyImage(DATABASE_1, image); + }); + } + + @Test + public void modifyImage_searchServiceConnection_fails() throws SearchServiceException, DatabaseNotFoundException, + SearchServiceConnectionException { + final byte[] image = new byte[]{1, 2, 3, 4, 5}; + + /* mock */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + doThrow(SearchServiceConnectionException.class) + .when(searchServiceGateway) + .update(any(Database.class)); + + /* test */ + assertThrows(SearchServiceConnectionException.class, () -> { + databaseService.modifyImage(DATABASE_1, image); + }); + } + + @Test + public void updateViewMetadata_empty_succeeds() throws SearchServiceException, DataServiceException, + QueryNotFoundException, DatabaseNotFoundException, SearchServiceConnectionException, + DataServiceConnectionException, ViewNotFoundException { + + /* mock */ + when(dataServiceGateway.getViewSchemas(DATABASE_1_ID)) + .thenReturn(List.of()); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final Database response = databaseService.updateViewMetadata(DATABASE_1); + assertNotNull(response); + } + + @Test + public void updateViewMetadata_searchServiceConnection_fails() throws SearchServiceException, DataServiceException, + DatabaseNotFoundException, SearchServiceConnectionException, DataServiceConnectionException, + ViewNotFoundException { + + /* mock */ + when(dataServiceGateway.getViewSchemas(DATABASE_1_ID)) + .thenReturn(List.of()); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + doThrow(SearchServiceConnectionException.class) + .when(searchServiceGateway) + .update(any(Database.class)); + + /* test */ + assertThrows(SearchServiceConnectionException.class, () -> { + databaseService.updateViewMetadata(DATABASE_1); + }); + } + + @Test + public void updateViewMetadata_searchServiceNotFound_fails() throws SearchServiceException, DataServiceException, + DatabaseNotFoundException, SearchServiceConnectionException, DataServiceConnectionException, + ViewNotFoundException { + + /* mock */ + when(dataServiceGateway.getViewSchemas(DATABASE_1_ID)) + .thenReturn(List.of()); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + doThrow(DatabaseNotFoundException.class) + .when(searchServiceGateway) + .update(any(Database.class)); + + /* test */ + assertThrows(DatabaseNotFoundException.class, () -> { + databaseService.updateViewMetadata(DATABASE_1); + }); + } + + @Test + public void updateViewMetadata_oneMissing_succeeds() throws SearchServiceException, DataServiceException, + QueryNotFoundException, DatabaseNotFoundException, SearchServiceConnectionException, + DataServiceConnectionException, ViewNotFoundException { + + /* mock */ + when(dataServiceGateway.getViewSchemas(DATABASE_1_ID)) + .thenReturn(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO, VIEW_4_DTO)); /* <<< */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final Database response = databaseService.updateViewMetadata(DATABASE_1); + assertNotNull(response); + } + + @Test + public void updateViewMetadata_allKnown_succeeds() throws SearchServiceException, DataServiceException, + QueryNotFoundException, DatabaseNotFoundException, SearchServiceConnectionException, + DataServiceConnectionException, ViewNotFoundException { + + /* mock */ + when(dataServiceGateway.getViewSchemas(DATABASE_1_ID)) + .thenReturn(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO)); /* <<< */ + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final Database response = databaseService.updateViewMetadata(DATABASE_1); + assertNotNull(response); + } + + @Test + public void updateTableMetadata_empty_succeeds() throws TableNotFoundException, SearchServiceException, + MalformedException, DataServiceException, QueryNotFoundException, DatabaseNotFoundException, + SearchServiceConnectionException, DataServiceConnectionException { + + /* mock */ + when(dataServiceGateway.getTableSchemas(DATABASE_1_ID)) + .thenReturn(List.of()); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final Database response = databaseService.updateTableMetadata(DATABASE_1); + assertNotNull(response); + } + + @Test + public void updateTableMetadata_allKnown_succeeds() throws TableNotFoundException, SearchServiceException, + MalformedException, DataServiceException, QueryNotFoundException, DatabaseNotFoundException, + SearchServiceConnectionException, DataServiceConnectionException { + + /* mock */ + when(dataServiceGateway.getTableSchemas(DATABASE_1_ID)) + .thenReturn(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO)); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final Database response = databaseService.updateTableMetadata(DATABASE_1); + assertNotNull(response); + } + + @Test + public void updateTableMetadata_oneMissing_succeeds() throws TableNotFoundException, SearchServiceException, + MalformedException, DataServiceException, QueryNotFoundException, DatabaseNotFoundException, + SearchServiceConnectionException, DataServiceConnectionException { + + /* mock */ + when(dataServiceGateway.getTableSchemas(DATABASE_1_ID)) + .thenReturn(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO, TABLE_5_DTO)); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final Database response = databaseService.updateTableMetadata(DATABASE_1); + assertNotNull(response); + final Optional<Table> optional = response.getTables() + .stream() + .filter(t -> t.getInternalName().equals(TABLE_5_INTERNALNAME)) + .findFirst(); + assertTrue(optional.isPresent()); + final Table table = optional.get(); + table.getColumns() + .forEach(column -> { + assertNotNull(column.getTable()); + assertEquals(TABLE_5_ID, column.getTable().getId()); + }); + table.getConstraints() + .getUniques() + .forEach(uk -> { + assertNotNull(uk.getTable()); + assertEquals(TABLE_5_ID, uk.getTable().getId()); + }); + table.getConstraints() + .getForeignKeys() + .forEach(fk -> { + assertNotNull(fk.getTable()); + assertEquals(TABLE_5_ID, fk.getTable().getId()); + }); + table.getConstraints() + .getPrimaryKey() + .forEach(pk -> { + assertNotNull(pk.getTable()); + assertEquals(TABLE_5_ID, pk.getTable().getId()); + assertEquals(TABLE_5_COLUMNS.get(0), pk.getColumn()); + }); + } + @Test public void find_succeeds() throws DatabaseNotFoundException { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java index 48da5206bbd8ddeb4125605891a7b4bef1e0f1f6..8947e823fc9ce070343d6f32bd68e5b793a14014 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java @@ -118,6 +118,7 @@ public class IdentifierServicePersistenceTest extends AbstractUnitTest { } @Test + @Transactional(readOnly = true) public void find_succeeds() throws IdentifierNotFoundException { /* test */ diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java index 8a5c4af131fd40775e7c826a17ce4b7506c80960..3126f9e9f42b36fb8dc09dfa3f8e60c88d851722 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServicePersistenceTest.java @@ -30,11 +30,13 @@ import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; -import java.util.*; +import java.util.List; +import java.util.Set; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.when; @Log4j2 @SpringBootTest @@ -140,4 +142,21 @@ public class TableServicePersistenceTest extends AbstractUnitTest { assertEquals(request.getConstraints().getForeignKeys().size(), foreignKeys.size()); } + @Test + public void findColumnById_succeeds() throws MalformedException { + + /* test */ + final TableColumn response = tableService.findColumnById(TABLE_1, COLUMN_1_1_ID); + assertEquals(TABLE_1_COLUMNS.get(0), response); + } + + @Test + public void findColumnById_fails() { + + /* test */ + assertThrows(MalformedException.class, () -> { + tableService.findColumnById(TABLE_1, 9999L); + }); + } + } diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java index 01fc883bc8668b8c163527913b23d1206af302a6..477d2bd17da0d350e53c1b142c07f9531293d0f8 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java @@ -1,8 +1,11 @@ package at.tuwien.service; import at.tuwien.api.database.table.TableCreateDto; +import at.tuwien.api.database.table.TableStatisticDto; import at.tuwien.api.database.table.columns.ColumnCreateDto; +import at.tuwien.api.database.table.columns.ColumnStatisticDto; import at.tuwien.api.database.table.columns.ColumnTypeDto; +import at.tuwien.api.database.table.columns.concepts.ColumnSemanticsUpdateDto; import at.tuwien.api.database.table.constraints.ConstraintsCreateDto; import at.tuwien.api.database.table.constraints.foreign.ForeignKeyCreateDto; import at.tuwien.entities.database.Database; @@ -25,6 +28,7 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.*; import static org.junit.jupiter.api.Assertions.*; @@ -46,6 +50,15 @@ public class TableServiceUnitTest extends AbstractUnitTest { @MockBean private UserService userService; + @MockBean + private UnitService unitService; + + @MockBean + private EntityService entityService; + + @MockBean + private ConceptService conceptService; + @MockBean private DataServiceGateway dataServiceGateway; @@ -111,6 +124,146 @@ public class TableServiceUnitTest extends AbstractUnitTest { }); } + @Test + public void updateStatistics_succeeds() throws TableNotFoundException, DataServiceException, + DataServiceConnectionException, SearchServiceException, DatabaseNotFoundException, + SearchServiceConnectionException, MalformedException { + + /* mock */ + when(dataServiceGateway.getTableStatistics(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(TABLE_8_STATISTIC_DTO); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + tableService.updateStatistics(TABLE_8); + } + + @Test + public void updateStatistics_searchServiceNotFound_fails() throws TableNotFoundException, DataServiceException, + DataServiceConnectionException, SearchServiceException, DatabaseNotFoundException, + SearchServiceConnectionException { + + /* mock */ + when(dataServiceGateway.getTableStatistics(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(TABLE_8_STATISTIC_DTO); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + doThrow(DatabaseNotFoundException.class) + .when(searchServiceGateway) + .update(any(Database.class)); + + /* test */ + assertThrows(DatabaseNotFoundException.class, () -> { + tableService.updateStatistics(TABLE_8); + }); + } + + @Test + public void updateStatistics_searchServiceConnection_fails() throws TableNotFoundException, DataServiceException, + DataServiceConnectionException, SearchServiceException, DatabaseNotFoundException, + SearchServiceConnectionException { + + /* mock */ + when(dataServiceGateway.getTableStatistics(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(TABLE_8_STATISTIC_DTO); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + doThrow(SearchServiceConnectionException.class) + .when(searchServiceGateway) + .update(any(Database.class)); + + /* test */ + assertThrows(SearchServiceConnectionException.class, () -> { + tableService.updateStatistics(TABLE_8); + }); + } + + @Test + public void updateStatistics_columnNotFound_fails() throws TableNotFoundException, DataServiceException, + DataServiceConnectionException { + final TableStatisticDto mock = TableStatisticDto.builder() + .columns(new HashMap<>() {{ + put("unknown_column", ColumnStatisticDto.builder() + .min(BigDecimal.valueOf(11.2)) + .max(BigDecimal.valueOf(23.1)) + .mean(BigDecimal.valueOf(13.5333)) + .median(BigDecimal.valueOf(11.4)) + .stdDev(BigDecimal.valueOf(4.2952)) + .build()); + }}) + .build(); + + /* mock */ + when(dataServiceGateway.getTableStatistics(DATABASE_3_ID, TABLE_8_ID)) + .thenReturn(mock); + + /* test */ + assertThrows(MalformedException.class, () -> { + tableService.updateStatistics(TABLE_8); + }); + } + + @Test + public void update_known_succeeds() throws SearchServiceException, MalformedException, DataServiceException, + DatabaseNotFoundException, OntologyNotFoundException, SearchServiceConnectionException, + SemanticEntityNotFoundException, DataServiceConnectionException, UnitNotFoundException, + ConceptNotFoundException { + final ColumnSemanticsUpdateDto request = ColumnSemanticsUpdateDto.builder() + .unitUri(UNIT_1_URI) + .conceptUri(CONCEPT_1_URI) + .build(); + + /* mock */ + when(unitService.find(UNIT_1_URI)) + .thenReturn(UNIT_1); + when(conceptService.find(CONCEPT_1_URI)) + .thenReturn(CONCEPT_1); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final TableColumn response = tableService.update(TABLE_1_COLUMNS.get(0), request); + assertNotNull(response.getUnit()); + assertNotNull(response.getConcept()); + } + + @Test + public void update_unknown_succeeds() throws SearchServiceException, MalformedException, DataServiceException, + DatabaseNotFoundException, OntologyNotFoundException, SearchServiceConnectionException, + SemanticEntityNotFoundException, DataServiceConnectionException, UnitNotFoundException, + ConceptNotFoundException { + final ColumnSemanticsUpdateDto request = ColumnSemanticsUpdateDto.builder() + .unitUri(UNIT_1_URI) + .conceptUri(CONCEPT_1_URI) + .build(); + + /* mock */ + doThrow(UnitNotFoundException.class) + .when(unitService) + .find(UNIT_1_URI); + when(entityService.findOneByUri(UNIT_1_URI)) + .thenReturn(UNIT_1_ENTITY_DTO); + doThrow(ConceptNotFoundException.class) + .when(conceptService) + .find(CONCEPT_1_URI); + when(entityService.findOneByUri(CONCEPT_1_URI)) + .thenReturn(CONCEPT_1_ENTITY_DTO); + when(databaseRepository.save(any(Database.class))) + .thenReturn(DATABASE_1); + when(searchServiceGateway.update(any(Database.class))) + .thenReturn(DATABASE_1_DTO); + + /* test */ + final TableColumn response = tableService.update(TABLE_1_COLUMNS.get(0), request); + assertNotNull(response.getUnit()); + assertNotNull(response.getConcept()); + } + @Test public void createTable_succeeds() throws DataServiceException, DataServiceConnectionException, UserNotFoundException, TableNotFoundException, DatabaseNotFoundException, TableExistsException, diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/validator/EndpointValidatorUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/validator/EndpointValidatorUnitTest.java index 8528d29f07d267bd4dcbe94de5379e47e13f1cef..9444cea6e909995d7a4c04194020eea377e19217 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/validator/EndpointValidatorUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/validator/EndpointValidatorUnitTest.java @@ -1,21 +1,20 @@ package at.tuwien.validator; -import at.tuwien.entities.database.Database; -import at.tuwien.entities.user.User; -import at.tuwien.test.AbstractUnitTest; import at.tuwien.SortType; import at.tuwien.api.database.table.TableCreateDto; import at.tuwien.api.database.table.columns.ColumnCreateDto; import at.tuwien.api.database.table.columns.ColumnTypeDto; import at.tuwien.api.identifier.IdentifierSaveDto; +import at.tuwien.entities.database.Database; +import at.tuwien.entities.user.User; import at.tuwien.exception.*; import at.tuwien.service.AccessService; import at.tuwien.service.DatabaseService; import at.tuwien.service.TableService; +import at.tuwien.test.AbstractUnitTest; import at.tuwien.validation.EndpointValidator; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; @@ -159,12 +158,7 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { } @Test - @Disabled - public void validateOnlyAccessOrPublic_privateAnonymous_fails() throws DatabaseNotFoundException { - - /* mock */ - when(databaseService.findById(anyLong())) - .thenReturn(DATABASE_1); + public void validateOnlyAccessOrPublic_privateAnonymous_fails() { /* test */ assertThrows(NotAllowedException.class, () -> { @@ -173,13 +167,9 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { } @Test - @Disabled - public void validateOnlyAccessOrPublic_privateNoAccess_fails() throws DatabaseNotFoundException, - AccessNotFoundException { + public void validateOnlyAccessOrPublic_privateNoAccess_fails() throws AccessNotFoundException { /* mock */ - when(databaseService.findById(DATABASE_1_ID)) - .thenReturn(DATABASE_1); doThrow(AccessNotFoundException.class) .when(accessService) .find(any(Database.class), any(User.class)); @@ -334,12 +324,7 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { } @Test - @Disabled - public void validateOnlyPrivateHasRole_privatePrincipalMissing_fails() throws DatabaseNotFoundException { - - /* mock */ - when(databaseService.findById(anyLong())) - .thenReturn(DATABASE_1); + public void validateOnlyPrivateHasRole_privatePrincipalMissing_fails() { /* test */ assertThrows(NotAllowedException.class, () -> { @@ -348,12 +333,7 @@ public class EndpointValidatorUnitTest extends AbstractUnitTest { } @Test - @Disabled - public void validateOnlyPrivateHasRole_privateRoleMissing_fails() throws DatabaseNotFoundException { - - /* mock */ - when(databaseService.findById(anyLong())) - .thenReturn(DATABASE_1); + public void validateOnlyPrivateHasRole_privateRoleMissing_fails() { /* test */ assertThrows(NotAllowedException.class, () -> { diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AccessService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AccessService.java index c47bb8daa36519ff251202d14a02f38c9212aafe..2642574f2720e0e6f565e0b83669c6398ccf453f 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AccessService.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/AccessService.java @@ -6,6 +6,7 @@ import at.tuwien.entities.database.DatabaseAccess; import at.tuwien.entities.user.User; import at.tuwien.exception.*; +import java.security.Principal; import java.util.List; public interface AccessService { @@ -19,7 +20,7 @@ public interface AccessService { List<DatabaseAccess> list(Database database); /** - * Finds database access by given database and user. + * Finds database access by given database and user, where the access is determined by the username (needed since {@link Principal#getName()} embeds the username). * * @param database The database. * @param user The user. @@ -37,7 +38,7 @@ public interface AccessService { * @return The database access, if successful. * @throws DataServiceException The data service responded with unexpected behavior. * @throws DataServiceConnectionException The connection with the data service could not be established. - * @throws DatabaseNotFoundException The database was not found in the metadata/search database. + * @throws DatabaseNotFoundException The database was not found in the metadata/search database. */ DatabaseAccess create(Database database, User user, AccessTypeDto access) throws DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException; @@ -50,7 +51,7 @@ public interface AccessService { * @param access The updated access. * @throws DataServiceException The data service responded with unexpected behavior. * @throws DataServiceConnectionException The connection with the data service could not be established. - * @throws DatabaseNotFoundException The database was not found in the metadata/search database. + * @throws DatabaseNotFoundException The database was not found in the metadata/search database. */ void update(Database database, User user, AccessTypeDto access) throws at.tuwien.exception.DataServiceException, DataServiceConnectionException, AccessNotFoundException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException; @@ -62,7 +63,7 @@ public interface AccessService { * @param user The user. * @throws DataServiceException The data service responded with unexpected behavior. * @throws DataServiceConnectionException The connection with the data service could not be established. - * @throws DatabaseNotFoundException The database was not found in the search database. + * @throws DatabaseNotFoundException The database was not found in the search database. */ void delete(Database database, User user) throws AccessNotFoundException, DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException; diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java index b3f98b01bbb2d406738d314fd15333727aaf4885..a0f45fb34f3c3762a8da630c622d9aa23d327af3 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java @@ -16,7 +16,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.security.Principal; import java.util.List; import java.util.Optional; @@ -52,7 +51,7 @@ public class AccessServiceImpl implements AccessService { public DatabaseAccess find(Database database, User user) throws AccessNotFoundException { final Optional<DatabaseAccess> optional = database.getAccesses() .stream() - .filter(a -> a.getUser().getId().equals(user.getId())) + .filter(a -> a.getUser().getUsername().equals(user.getUsername())) .findFirst(); if (optional.isEmpty()) { log.error("Failed to find database access for database with id: {}", database.getId()); @@ -93,19 +92,16 @@ public class AccessServiceImpl implements AccessService { /* update in data database */ dataServiceGateway.updateAccess(database.getId(), user.getId(), access); /* update in metadata database */ - final DatabaseAccess entity = DatabaseAccess.builder() - .hdbid(database.getId()) - .database(database) - .huserid(user.getId()) - .type(metadataMapper.accessTypeDtoToAccessType(access)) - .user(user) - .build(); - final int idx = database.getAccesses().indexOf(entity); - if (idx == -1) { - log.error("Failed to update access"); - throw new AccessNotFoundException("Failed to find update access"); + final Optional<DatabaseAccess> optional = database.getAccesses() + .stream() + .filter(a -> a.getUser().getId().equals(user.getId())) + .findFirst(); + if (optional.isEmpty()) { + log.error("Failed to update access for user with id: {}", user.getId()); + throw new AccessNotFoundException("Failed to find update access for user with id: " + user.getId()); } - database.getAccesses().set(idx, entity); + optional.get() + .setType(metadataMapper.accessTypeDtoToAccessType(access)); database = databaseRepository.save(database); /* update in search service */ searchServiceGateway.update(database); diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java index c67cb68ce2ca8bf58d07654a3a05deeb97404a4d..b0f5d3f85c3474c4c577e4c21b4633a543f8ad73 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java @@ -1,5 +1,6 @@ package at.tuwien.test; +import at.tuwien.entities.database.AccessType; import org.springframework.test.context.TestPropertySource; import java.util.LinkedList; @@ -25,11 +26,16 @@ public abstract class AbstractUnitTest extends BaseTest { /* USER_4 */ USER_5.setAccesses(new LinkedList<>()); /* DATABASE 1 */ + TABLE_1_COLUMNS.get(0).setUnit(null); + TABLE_1_COLUMNS.get(0).setConcept(null); DATABASE_1.setOwner(USER_1); DATABASE_1.setSubsets(new LinkedList<>()); + DATABASE_1.setIsPublic(false); + DATABASE_1_USER_1_READ_ACCESS.setType(AccessType.READ); DATABASE_1.setAccesses(new LinkedList<>(List.of(DATABASE_1_USER_1_READ_ACCESS, DATABASE_1_USER_2_WRITE_OWN_ACCESS, DATABASE_1_USER_3_WRITE_ALL_ACCESS))); DATABASE_1_PRIVILEGED_DTO.setAccesses(new LinkedList<>(List.of(DATABASE_1_USER_1_READ_ACCESS_DTO, DATABASE_1_USER_2_WRITE_OWN_ACCESS_DTO, DATABASE_1_USER_3_WRITE_ALL_ACCESS_DTO))); TABLE_1.setDatabase(DATABASE_1); + UNIT_1.setId(UNIT_1_ID); TABLE_1.setColumns(new LinkedList<>(TABLE_1_COLUMNS)); TABLE_1.setConstraints(TABLE_1_CONSTRAINTS); TABLE_1_PRIVILEGED_DTO.setColumns(new LinkedList<>(TABLE_1_COLUMNS_DTO)); diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java index 78c14fe2acb2e3b1c1bd19d6c4d139ea73620414..f706dd021d1578677d9ad356b0726f4b4e6d49aa 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java @@ -56,6 +56,7 @@ import at.tuwien.api.orcid.activities.employments.affiliation.group.summary.orga import at.tuwien.api.orcid.person.OrcidPersonDto; import at.tuwien.api.orcid.person.name.OrcidNameDto; import at.tuwien.api.orcid.person.name.OrcidValueDto; +import at.tuwien.api.semantics.EntityDto; import at.tuwien.api.semantics.OntologyCreateDto; import at.tuwien.api.semantics.OntologyModifyDto; import at.tuwien.api.user.*; @@ -313,6 +314,12 @@ public abstract class BaseTest { .created(CONCEPT_1_CREATED) .build(); + public final static EntityDto CONCEPT_1_ENTITY_DTO = EntityDto.builder() + .uri(CONCEPT_1_URI) + .description(CONCEPT_1_DESCRIPTION) + .label(CONCEPT_1_NAME) + .build(); + public final static Long CONCEPT_2_ID = 2L; public final static String CONCEPT_2_NAME = "FAIR data"; public final static String CONCEPT_2_URI = "http://www.wikidata.org/entity/Q29032648"; @@ -367,6 +374,12 @@ public abstract class BaseTest { .created(UNIT_1_CREATED) .build(); + public final static EntityDto UNIT_1_ENTITY_DTO = EntityDto.builder() + .uri(UNIT_1_URI) + .description(UNIT_1_DESCRIPTION) + .label(UNIT_1_NAME) + .build(); + public final static Long UNIT_2_ID = 2L; public final static String UNIT_2_NAME = "tonne"; public final static String UNIT_2_URI = "http://www.ontology-of-units-of-measure.org/resource/om-2/tonne"; @@ -2339,6 +2352,7 @@ public abstract class BaseTest { public final static String ONTOLOGY_1_PREFIX = "om2"; public final static String ONTOLOGY_1_NEW_PREFIX = "om-2"; public final static String ONTOLOGY_1_URI = "http://www.ontology-of-units-of-measure.org/resource/om-2/"; + public final static String ONTOLOGY_1_URI_PATTERN = "http://www.ontology-of-units-of-measure.org/resource/om-2/.*"; public final static String ONTOLOGY_1_SPARQL_ENDPOINT = null; public final static String ONTOLOGY_1_RDF_PATH = "rdf/om-2.0.rdf"; public final static UUID ONTOLOGY_1_CREATED_BY = USER_1_ID; @@ -2347,6 +2361,7 @@ public abstract class BaseTest { .id(ONTOLOGY_1_ID) .prefix(ONTOLOGY_1_PREFIX) .uri(ONTOLOGY_1_URI) + .uriPattern(ONTOLOGY_1_URI_PATTERN) .sparqlEndpoint(ONTOLOGY_1_SPARQL_ENDPOINT) .rdfPath(ONTOLOGY_1_RDF_PATH) .build(); @@ -7759,6 +7774,7 @@ public abstract class BaseTest { public final static Constraints TABLE_2_CONSTRAINTS = Constraints.builder() .checks(new LinkedHashSet<>(List.of("`mintemp` > 0"))) .foreignKeys(new LinkedList<>(List.of(ForeignKey.builder() + .id(1L) .name("fk_location") .onDelete(ReferenceType.NO_ACTION) .references(new LinkedList<>(List.of(ForeignKeyReference.builder()