Skip to content
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,22 @@ To activate either mode please navigate to the frontend folder via `cd frontend`

Web mode: The default user is `admin` and the default password is `admin`.

### Generating JWT keys (web mode only)
## Generating JWT keys (web mode only)

To generate the keys necessary for authentication via JWT please run the following script once:
```
./backend/generate-keys.sh
```

## Database and Fuzzy Match
ProA uses fuzzy match so that the BPMN labels can be matched with some degree of tolerance, e.g. ignoring typos.
To this end, postgres levenshtein function is used, which needs to be activated by ececuting the following:

```CREATE EXTENSION fuzzystrmatch;```

Furthermore, in Azure before executing the above statement, the extension needs to be activated via: DB >> Settings >> Server parameters >> azure.extensions >> fuzzystrmatch;


## The Entire Application

In order to build an uber jar, which also contains the frontend, run the following in the root:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,21 @@

import de.envite.proa.repository.tables.DataStoreTable;
import de.envite.proa.repository.tables.ProjectVersionTable;
import de.envite.proa.util.SearchLabelBuilder;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.persistence.EntityManager;
import jakarta.transaction.Transactional;
import org.eclipse.microprofile.config.inject.ConfigProperty;

import java.util.List;

@ApplicationScoped
public class DataStoreDao {

@ConfigProperty(name = "quarkus.datasource.db-kind")
String dbKind;

private EntityManager em;

@Inject
Expand All @@ -34,11 +39,28 @@ public List<DataStoreTable> getDataStores(ProjectVersionTable projectVersionTabl

@Transactional
public DataStoreTable getDataStoreForLabel(String label, ProjectVersionTable projectVersionTable) {
return em //
.createQuery("SELECT d FROM DataStoreTable d WHERE d.label = :label AND d.project = :project",
DataStoreTable.class)
.setParameter("label", label)//
.setParameter("project", projectVersionTable)//
.getSingleResult();

String searchLabel = SearchLabelBuilder.buildSearchLabel(label);

if ("postgresql".equals(dbKind)) {
return em.createQuery(
"SELECT d FROM DataStoreTable d " +
"WHERE d.project = :project " +
"AND ( d.searchLabel = :searchLabel " +
"OR function('levenshtein', d.searchLabel, :searchLabel) <= 4 )",
DataStoreTable.class)
.setParameter("searchLabel", searchLabel)//
.setParameter("project", projectVersionTable)//
.getSingleResult();
} else {
return em.createQuery(
"SELECT d FROM DataStoreTable d " +
"WHERE d.project = :project " +
"AND d.searchLabel = :searchLabel ",
DataStoreTable.class)
.setParameter("searchLabel", searchLabel)//
.setParameter("project", projectVersionTable)//
.getSingleResult();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,21 @@
import de.envite.proa.repository.tables.CallActivityTable;
import de.envite.proa.repository.tables.ProcessModelTable;
import de.envite.proa.repository.tables.ProjectVersionTable;
import de.envite.proa.util.SearchLabelBuilder;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Inject;
import jakarta.persistence.EntityManager;
import jakarta.transaction.Transactional;
import org.eclipse.microprofile.config.inject.ConfigProperty;

import java.util.List;

@RequestScoped
public class CallActivityDao {

@ConfigProperty(name = "quarkus.datasource.db-kind")
String dbKind;

private final EntityManager em;

@Inject
Expand All @@ -26,13 +31,30 @@ public void persist(CallActivityTable table) {
}

@Transactional
public List<CallActivityTable> getCallActivitiesForName(String name, ProjectVersionTable project) {
return em //
.createQuery("SELECT c FROM CallActivityTable c WHERE c.label = :label AND c.project = :project",
CallActivityTable.class)
.setParameter("label", name)//
.setParameter("project", project)//
.getResultList();
public List<CallActivityTable> getCallActivitiesForName(String label, ProjectVersionTable projectVersionTable) {

String searchLabel = SearchLabelBuilder.buildSearchLabel(label);

if ("postgresql".equals(dbKind)) {
return em.createQuery(
"SELECT c FROM CallActivityTable c " +
"WHERE c.project = :project " +
"AND ( c.searchLabel = :searchLabel " +
"OR function('levenshtein', c.searchLabel, :searchLabel) <= 4 )",
CallActivityTable.class)
.setParameter("searchLabel", searchLabel)//
.setParameter("project", projectVersionTable)//
.getResultList();
} else {
return em.createQuery(
"SELECT c FROM CallActivityTable c " +
"WHERE c.project = :project " +
"AND c.searchLabel = :searchLabel ",
CallActivityTable.class)
.setParameter("searchLabel", searchLabel)//
.setParameter("project", projectVersionTable)//
.getResultList();
}
}

@Transactional
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
package de.envite.proa.repository.processmodel;

import java.util.List;

import de.envite.proa.entities.process.EventType;
import de.envite.proa.repository.tables.ProcessEventTable;
import de.envite.proa.repository.tables.ProcessModelTable;
import de.envite.proa.repository.tables.ProjectVersionTable;
import de.envite.proa.util.SearchLabelBuilder;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Inject;
import jakarta.persistence.EntityManager;
import jakarta.transaction.Transactional;

import java.util.List;
import org.eclipse.microprofile.config.inject.ConfigProperty;

@RequestScoped
public class ProcessEventDao {

@ConfigProperty(name = "quarkus.datasource.db-kind")
String dbKind;

private EntityManager em;

@Inject
Expand All @@ -25,14 +30,32 @@ public ProcessEventDao(EntityManager em) {
public List<ProcessEventTable> getEventsForLabelAndType(String label, EventType eventType,
ProjectVersionTable projectVersionTable) {

return em //
.createQuery(
"SELECT e FROM ProcessEventTable e WHERE e.label = :label AND e.eventType=:eventType AND e.project=:project",
ProcessEventTable.class)
.setParameter("label", label)//
.setParameter("eventType", eventType)//
.setParameter("project", projectVersionTable)//
.getResultList();
String searchLabel = SearchLabelBuilder.buildSearchLabel(label);

if ("postgresql".equals(dbKind)) {
return em.createQuery(
"SELECT e FROM ProcessEventTable e " +
"WHERE e.eventType = :eventType " +
"AND e.project = :project " +
"AND ( e.searchLabel = :searchLabel " +
"OR function('levenshtein', e.searchLabel, :searchLabel) <= 4 )",
ProcessEventTable.class)
.setParameter("searchLabel", searchLabel)
.setParameter("eventType", eventType)
.setParameter("project", projectVersionTable)
.getResultList();
} else {
return em.createQuery(
"SELECT e FROM ProcessEventTable e " +
"WHERE e.eventType = :eventType " +
"AND e.project = :project " +
"AND e.searchLabel = :searchLabel ",
ProcessEventTable.class)
.setParameter("searchLabel", searchLabel)
.setParameter("eventType", eventType)
.setParameter("project", projectVersionTable)
.getResultList();
}
}

@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import de.envite.proa.entities.process.ProcessType;
import de.envite.proa.repository.tables.ProcessModelTable;
import de.envite.proa.repository.tables.ProjectVersionTable;
import de.envite.proa.util.SearchLabelBuilder;
import jakarta.enterprise.context.RequestScoped;
import jakarta.inject.Inject;
import jakarta.persistence.EntityGraph;
Expand All @@ -13,8 +14,13 @@
import java.util.List;
import java.util.Map;

import org.eclipse.microprofile.config.inject.ConfigProperty;

@RequestScoped
public class ProcessModelDao {

@ConfigProperty(name = "quarkus.datasource.db-kind")
private String dbKind;

private EntityManager em;

Expand Down Expand Up @@ -52,16 +58,35 @@ public List<ProcessModelTable> getProcessModelsWithoutCollaborationsAndWithEvent

@Transactional
public List<ProcessModelTable> getProcessModelsForName(String name, ProjectVersionTable projectVersionTable) {
return em
.createQuery(
"SELECT p " +
"FROM ProcessModelTable p " +
"WHERE p.name = :name " +
"AND p.project = :project",
ProcessModelTable.class)
.setParameter("name", name)
.setParameter("project", projectVersionTable)
.getResultList();

if ("postgresql".equals(dbKind)) {

String searchLabel = SearchLabelBuilder.buildSearchLabel(name);

return em
.createQuery(
"SELECT p " +
"FROM ProcessModelTable p " +
"WHERE ( p.name = :name " +
"OR function('levenshtein', p.searchLabel, :searchLabel) <= 4 )" +
"AND p.project = :project",
ProcessModelTable.class)
.setParameter("name", name)
.setParameter("searchLabel", searchLabel)
.setParameter("project", projectVersionTable)
.getResultList();
}else {
return em
.createQuery(
"SELECT p " +
"FROM ProcessModelTable p " +
"WHERE p.name = :name " +
"AND p.project = :project",
ProcessModelTable.class)
.setParameter("name", name)
.setParameter("project", projectVersionTable)
.getResultList();
}
}

@Transactional
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package de.envite.proa.repository.tables;

import de.envite.proa.util.SearchLabelBuilder;
import jakarta.persistence.*;
import lombok.Data;

Expand All @@ -15,9 +16,17 @@ public class CallActivityTable {

private String label;

private String searchLabel;

@ManyToOne(fetch = FetchType.LAZY)
private ProcessModelTable processModel;

@ManyToOne(fetch = FetchType.LAZY)
private ProjectVersionTable project;

@PrePersist
@PreUpdate
private void generateSearchLabel() {
this.searchLabel = SearchLabelBuilder.buildSearchLabel(this.label);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package de.envite.proa.repository.tables;

import de.envite.proa.util.SearchLabelBuilder;
import jakarta.persistence.*;
import lombok.Data;

Expand All @@ -13,6 +14,14 @@ public class DataStoreTable {

private String label;

private String searchLabel;

@ManyToOne(fetch = FetchType.LAZY)
private ProjectVersionTable project;

@PrePersist
@PreUpdate
private void generateSearchLabel() {
this.searchLabel = SearchLabelBuilder.buildSearchLabel(this.label);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package de.envite.proa.repository.tables;

import de.envite.proa.entities.process.EventType;
import de.envite.proa.util.SearchLabelBuilder;
import jakarta.persistence.*;
import lombok.Data;

Expand All @@ -16,12 +17,20 @@ public class ProcessEventTable {

private String label;

private String searchLabel;

@Enumerated(EnumType.STRING)
private EventType eventType;

@ManyToOne(fetch = FetchType.LAZY)
private ProcessModelTable processModel;

@ManyToOne(fetch = FetchType.LAZY)
private ProjectVersionTable project;
private ProjectVersionTable project;

@PrePersist
@PreUpdate
private void generateSearchLabel() {
this.searchLabel = SearchLabelBuilder.buildSearchLabel(this.label);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package de.envite.proa.repository.tables;

import de.envite.proa.entities.process.ProcessType;
import de.envite.proa.util.SearchLabelBuilder;
import jakarta.persistence.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
Expand Down Expand Up @@ -56,6 +57,8 @@ public ProcessModelTable(Long id) {

@EqualsAndHashCode.Include
private String name;

private String searchLabel;

@EqualsAndHashCode.Include
private String bpmnProcessId;
Expand All @@ -77,7 +80,7 @@ public ProcessModelTable(Long id) {
@Column
@EqualsAndHashCode.Include
private String description;

@Column
@EqualsAndHashCode.Include
private LocalDateTime createdAt;
Expand All @@ -99,4 +102,10 @@ public ProcessModelTable(Long id) {

@EqualsAndHashCode.Include
private ProcessType processType;

@PrePersist
@PreUpdate
private void generateSearchLabel() {
this.searchLabel = SearchLabelBuilder.buildSearchLabel(this.name);
}
}
Loading