diff --git a/Kitodo-DataEditor/src/test/java/org/kitodo/dataeditor/ruleset/RulesetManagementIT.java b/Kitodo-DataEditor/src/test/java/org/kitodo/dataeditor/ruleset/RulesetManagementIT.java index fd7402da1ef..7c9700b273d 100644 --- a/Kitodo-DataEditor/src/test/java/org/kitodo/dataeditor/ruleset/RulesetManagementIT.java +++ b/Kitodo-DataEditor/src/test/java/org/kitodo/dataeditor/ruleset/RulesetManagementIT.java @@ -1206,8 +1206,8 @@ private ComplexMetadataViewInterface getCmvi( List metadataViewWithValuesInterfaceList, String keyId) { return (ComplexMetadataViewInterface) metadataViewWithValuesInterfaceList.stream() .filter(mvwvi -> mvwvi.getMetadata().isPresent()) - .filter(metadataViewWithValuesInterface -> keyId - .equals(metadataViewWithValuesInterface.getMetadata().get().getId())) + .filter(metadataViewWithValues -> keyId + .equals(metadataViewWithValues.getMetadata().get().getId())) .findAny().get().getMetadata().get(); } @@ -1235,8 +1235,8 @@ private List ids(Collection mviColl) { */ private List ids(List metadataViewWithValuesInterfaceList) { return metadataViewWithValuesInterfaceList.stream() - .filter(metadataViewWithValuesInterface -> metadataViewWithValuesInterface.getMetadata().isPresent()) - .map(metadataViewWithValuesInterface -> metadataViewWithValuesInterface.getMetadata().get().getId()) + .filter(metadataViewWithValues -> metadataViewWithValues.getMetadata().isPresent()) + .map(metadataViewWithValues -> metadataViewWithValues.getMetadata().get().getId()) .collect(Collectors.toList()); } diff --git a/Kitodo-DataManagement/pom.xml b/Kitodo-DataManagement/pom.xml index ec67dfc5391..d9e6a26760b 100644 --- a/Kitodo-DataManagement/pom.xml +++ b/Kitodo-DataManagement/pom.xml @@ -71,10 +71,6 @@ org.apache.myfaces.core myfaces-impl - - org.elasticsearch.client - elasticsearch-rest-high-level-client - org.glassfish javax.json @@ -87,6 +83,12 @@ org.hibernate hibernate-jcache + + com.github.spotbugs + spotbugs-annotations + ${spotbugs-maven-plugin.version} + provided + org.ehcache ehcache @@ -119,10 +121,6 @@ org.junit.vintage junit-vintage-engine - - org.elasticsearch.plugin - transport-netty4-client - diff --git a/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/BaseBean.java b/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/BaseBean.java index b994453c647..22863227286 100644 --- a/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/BaseBean.java +++ b/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/BaseBean.java @@ -23,22 +23,25 @@ import org.hibernate.Hibernate; import org.kitodo.data.database.persistence.BaseDAO; +import org.kitodo.data.interfaces.DataInterface; /** * Base bean class. */ @MappedSuperclass -public abstract class BaseBean implements Serializable { +public abstract class BaseBean implements DataInterface, Serializable { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) protected Integer id; + @Override public Integer getId() { return id; } + @Override public void setId(Integer id) { this.id = id; } diff --git a/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Batch.java b/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Batch.java index c51d6f10f3d..931bdf09f1d 100644 --- a/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Batch.java +++ b/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Batch.java @@ -29,6 +29,8 @@ import org.kitodo.data.database.enums.BatchType; import org.kitodo.data.database.persistence.BatchDAO; +import org.kitodo.data.interfaces.BatchInterface; +import org.kitodo.data.interfaces.ProcessInterface; /** * A user-definable, unordered collection of processes whose batch-type tasks @@ -39,7 +41,7 @@ */ @Entity @Table(name = "batch") -public class Batch extends BaseIndexedBean { +public class Batch extends BaseIndexedBean implements BatchInterface { /** * The batch title. Using titles for batches is optional, the field may be @@ -105,22 +107,12 @@ public Batch(String title, Collection processes) { this.processes = new ArrayList<>(processes); } - /** - * Returns the batch title. Using titles for batches is optional, the field - * may be {@code null}. If so, the function returns null. - * - * @return the batch title - */ + @Override public String getTitle() { return title; } - /** - * Sets a batch title. - * - * @param title - * title of the batch - */ + @Override public void setTitle(String title) { this.title = title; } @@ -134,11 +126,7 @@ public BatchType getType() { return type; } - /** - * Return the processes that belong to the batch. - * - * @return the processes of the batch - */ + @Override public List getProcesses() { initialize(new BatchDAO(), this.processes); if (Objects.isNull(this.processes)) { @@ -147,18 +135,14 @@ public List getProcesses() { return this.processes; } - /** - * Sets the processes that belong to the batch. - * - * @param processes - * processes of the batch - */ - public void setProcesses(List processes) { + @Override + @SuppressWarnings("unchecked") + public void setProcesses(List processes) { if (this.processes == null) { - this.processes = processes; + this.processes = (List) processes; } else { this.processes.clear(); - this.processes.addAll(processes); + this.processes.addAll((List) processes); } } diff --git a/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Client.java b/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Client.java index 7711d56dc31..9d523cb2849 100644 --- a/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Client.java +++ b/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Client.java @@ -22,13 +22,17 @@ import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; +import javax.persistence.OneToMany; import javax.persistence.Table; import org.kitodo.data.database.persistence.ClientDAO; +import org.kitodo.data.interfaces.ClientInterface; +import org.kitodo.data.interfaces.ProjectInterface; +import org.kitodo.data.interfaces.UserInterface; @Entity @Table(name = "client") -public class Client extends BaseBean { +public class Client extends BaseBean implements ClientInterface { @Column(name = "name") private String name; @@ -40,21 +44,18 @@ public class Client extends BaseBean { foreignKey = @ForeignKey(name = "FK_column_id"))}) private List listColumns; - /** - * Gets name. - * - * @return The name. - */ + @ManyToMany(mappedBy = "clients", cascade = CascadeType.PERSIST) + private List users; + + @OneToMany(mappedBy = "client", cascade = CascadeType.ALL, orphanRemoval = true) + private List projects; + + @Override public String getName() { return name; } - /** - * Sets name. - * - * @param name - * The name. - */ + @Override public void setName(String name) { this.name = name; } @@ -99,4 +100,26 @@ public List getListColumns() { public void setListColumns(List columns) { this.listColumns = columns; } + + @Override + public List getUsers() { + return users; + } + + @Override + @SuppressWarnings("unchecked") + public void setUsers(List users) { + this.users = (List) users; + } + + @Override + public List getProjects() { + return projects; + } + + @Override + @SuppressWarnings("unchecked") + public void setProjects(List projects) { + this.projects = (List) projects; + } } diff --git a/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Comment.java b/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Comment.java index 6c55dbb93f1..8921b92be48 100644 --- a/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Comment.java +++ b/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Comment.java @@ -23,6 +23,7 @@ import javax.persistence.Table; import org.kitodo.data.database.enums.CommentType; +import org.kitodo.data.interfaces.TaskInterface; @Entity @Table(name = "comment") @@ -216,10 +217,10 @@ public Task getCurrentTask() { /** * Set currentTask. * - * @param currentTask as org.kitodo.data.database.beans.Task + * @param currentTask as org.kitodo.data.interfaces.TaskInterface */ - public void setCurrentTask(Task currentTask) { - this.currentTask = currentTask; + public void setCurrentTask(TaskInterface currentTask) { + this.currentTask = (Task) currentTask; } /** diff --git a/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Docket.java b/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Docket.java index 76950a7aed2..c934f03c8c3 100644 --- a/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Docket.java +++ b/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Docket.java @@ -20,9 +20,12 @@ import javax.persistence.ManyToOne; import javax.persistence.Table; +import org.kitodo.data.interfaces.ClientInterface; +import org.kitodo.data.interfaces.DocketInterface; + @Entity @Table(name = "docket") -public class Docket extends BaseIndexedBean { +public class Docket extends BaseIndexedBean implements DocketInterface { @Column(name = "title") private String title; @@ -37,18 +40,22 @@ public class Docket extends BaseIndexedBean { @JoinColumn(name = "client_id", foreignKey = @ForeignKey(name = "FK_docket_client_id")) private Client client; + @Override public String getTitle() { return title; } + @Override public void setTitle(String title) { this.title = title; } + @Override public String getFile() { return file; } + @Override public void setFile(String file) { this.file = file; } @@ -74,23 +81,14 @@ public void setActive(boolean active) { this.active = active; } - /** - * Get client. - * - * @return Client object - */ + @Override public Client getClient() { return this.client; } - /** - * Set client. - * - * @param client - * as Client object - */ - public void setClient(Client client) { - this.client = client; + @Override + public void setClient(ClientInterface client) { + this.client = (Client) client; } @Override diff --git a/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Filter.java b/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Filter.java index 120eaa1a4d1..9c38e18bb20 100644 --- a/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Filter.java +++ b/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Filter.java @@ -21,12 +21,14 @@ import javax.persistence.ManyToOne; import javax.persistence.Table; +import org.kitodo.data.interfaces.FilterInterface; + /** * Filter bean. */ @Entity @Table(name = "filter") -public class Filter extends BaseIndexedBean { +public class Filter extends BaseIndexedBean implements FilterInterface { @Column(name = "value", columnDefinition = "longtext") private String value; @@ -38,21 +40,12 @@ public class Filter extends BaseIndexedBean { @JoinColumn(name = "user_id", foreignKey = @ForeignKey(name = "FK_filter_user_id")) private User user; - /** - * Get filter value. - * - * @return filter value - */ + @Override public String getValue() { return value; } - /** - * Set filter value. - * - * @param value - * filter - */ + @Override public void setValue(String value) { this.value = value; } diff --git a/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Process.java b/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Process.java index dc69926aca4..ce14278cd41 100644 --- a/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Process.java +++ b/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Process.java @@ -17,6 +17,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; import javax.persistence.CascadeType; import javax.persistence.Column; @@ -28,14 +29,31 @@ import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.OrderBy; +import javax.persistence.PostLoad; +import javax.persistence.PostUpdate; import javax.persistence.Table; import javax.persistence.Transient; +import org.apache.commons.collections.CollectionUtils; +import org.hibernate.LazyInitializationException; +import org.hibernate.annotations.LazyCollection; +import org.hibernate.annotations.LazyCollectionOption; +import org.kitodo.data.database.enums.TaskStatus; +import org.kitodo.data.database.persistence.HibernateUtil; import org.kitodo.data.database.persistence.ProcessDAO; +import org.kitodo.data.elasticsearch.index.converter.ProcessConverter; +import org.kitodo.data.interfaces.BatchInterface; +import org.kitodo.data.interfaces.DocketInterface; +import org.kitodo.data.interfaces.ProcessInterface; +import org.kitodo.data.interfaces.ProjectInterface; +import org.kitodo.data.interfaces.PropertyInterface; +import org.kitodo.data.interfaces.RulesetInterface; +import org.kitodo.data.interfaces.TaskInterface; +import org.kitodo.data.interfaces.UserInterface; @Entity @Table(name = "process") -public class Process extends BaseTemplateBean { +public class Process extends BaseTemplateBean implements ProcessInterface { @Column(name = "sortHelperImages") private Integer sortHelperImages; @@ -81,10 +99,14 @@ public class Process extends BaseTemplateBean { @OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST) private List children; + @Transient + private boolean hasChildren = true; + @OneToMany(mappedBy = "process", cascade = CascadeType.ALL, orphanRemoval = true) @OrderBy("ordering") private List tasks; + @LazyCollection(LazyCollectionOption.FALSE) @OneToMany(mappedBy = "process", cascade = CascadeType.PERSIST, orphanRemoval = true) private List comments; @@ -120,7 +142,7 @@ public class Process extends BaseTemplateBean { private String ocrdWorkflowId; @Transient - private User blockedUser; + private UserInterface blockedUser; @Transient private List> metadata; @@ -151,11 +173,16 @@ public Process() { this.creationDate = new Date(); } + @PostLoad + @PostUpdate + private void onPostLoad() { + this.hasChildren = CollectionUtils.isNotEmpty(children); + } + /** - * Get sorting helper for images. - * - * @return sorting helper as Integer, in case of null it returns 0 + * {@inheritDoc} In case of {@code null}, it returns 0. */ + @Override public Integer getSortHelperImages() { if (this.sortHelperImages == null) { this.sortHelperImages = 0; @@ -163,15 +190,15 @@ public Integer getSortHelperImages() { return this.sortHelperImages; } + @Override public void setSortHelperImages(Integer sortHelperImages) { this.sortHelperImages = sortHelperImages; } /** - * Get sorting helper for articles. - * - * @return sorting helper as Integer, in case of null it returns 0 + * {@inheritDoc} In case of {@code null}, it returns 0. */ + @Override public Integer getSortHelperArticles() { if (this.sortHelperArticles == null) { this.sortHelperArticles = 0; @@ -179,15 +206,15 @@ public Integer getSortHelperArticles() { return this.sortHelperArticles; } + @Override public void setSortHelperArticles(Integer sortHelperArticles) { this.sortHelperArticles = sortHelperArticles; } /** - * Get sorting helper for document structure. - * - * @return sorting helper as Integer, in case of null it returns 0 + * {@inheritDoc} In case of {@code null}, it returns 0. */ + @Override public Integer getSortHelperDocstructs() { if (this.sortHelperDocstructs == null) { this.sortHelperDocstructs = 0; @@ -195,15 +222,15 @@ public Integer getSortHelperDocstructs() { return this.sortHelperDocstructs; } + @Override public void setSortHelperDocstructs(Integer sortHelperDocstructs) { this.sortHelperDocstructs = sortHelperDocstructs; } /** - * Get sorting helper for metadata. - * - * @return sorting helper as Integer, in case of null it returns 0 + * {@inheritDoc} In case of {@code null}, it returns 0. */ + @Override public Integer getSortHelperMetadata() { if (this.sortHelperMetadata == null) { this.sortHelperMetadata = 0; @@ -211,41 +238,27 @@ public Integer getSortHelperMetadata() { return this.sortHelperMetadata; } + @Override public void setSortHelperMetadata(Integer sortHelperMetadata) { this.sortHelperMetadata = sortHelperMetadata; } - /** - * Get wikiField. - * - * @return value of wikiField - */ + @Override public String getWikiField() { return this.wikiField; } - /** - * Set wikiField. - * - * @param wikiField as java.lang.String - */ + @Override public void setWikiField(String wikiField) { this.wikiField = wikiField; } - /** - * Gets the process base URI. - */ + @Override public URI getProcessBaseUri() { return Objects.isNull(processBaseUri) ? null : URI.create(processBaseUri); } - /** - * Sets the process base URI. - * - * @param processBaseUri - * the given process base URI - */ + @Override public void setProcessBaseUri(URI processBaseUri) { this.processBaseUri = Objects.isNull(processBaseUri) ? null : processBaseUri.toString(); } @@ -262,32 +275,91 @@ public Integer getOrdering() { /** * Set ordering. * - * @param ordering as java.lang.Integer + * @param ordering + * as java.lang.Integer */ public void setOrdering(Integer ordering) { this.ordering = ordering; } + @Override public Project getProject() { return this.project; } + @Override + public void setProject(ProjectInterface project) { + this.project = (Project) project; + } + + /** + * Specifies the project to which the process belongs. + * + *

+ * API Note:
+ * This function exists because Faces does not recognize the more generic + * function {@link #setProject(ProjectInterface)} as a setter for the + * property {@code project} and otherwise throws a + * {@code PropertyNotWritableException}. + * + * @param project + * project to which the process should belong + */ public void setProject(Project project) { this.project = project; } + @Override public Ruleset getRuleset() { return this.ruleset; } + @Override + public void setRuleset(RulesetInterface ruleset) { + this.ruleset = (Ruleset) ruleset; + } + + /** + * Sets the business domain specification this process is using. + * + *

+ * API Note:
+ * This function exists because Faces does not recognize the more generic + * function {@link #setRuleset(RulesetInterface)} as a setter for the + * property {@code ruleset} and otherwise throws a + * {@code PropertyNotWritableException}. + * + * @param ruleset + * the business domain specification + */ public void setRuleset(Ruleset ruleset) { this.ruleset = ruleset; } + @Override public Docket getDocket() { return docket; } + @Override + public void setDocket(DocketInterface docket) { + this.docket = (Docket) docket; + } + + /** + * Sets the docket generation statement to use when creating a docket for + * this process. + * + *

+ * API Note:
+ * This function exists because Faces does not recognize the more generic + * function {@link #setDocket(DocketInterface)} as a setter for the property + * {@code docket} and otherwise throws a + * {@code PropertyNotWritableException}. + * + * @param docket + * the docket generation statement + */ public void setDocket(Docket docket) { this.docket = docket; } @@ -304,7 +376,8 @@ public Template getTemplate() { /** * Set template. * - * @param template as Template object + * @param template + * as Template object */ public void setTemplate(Template template) { this.template = template; @@ -322,7 +395,8 @@ public Process getParent() { /** * Set parent. * - * @param parent as org.kitodo.data.database.beans.Process + * @param parent + * as org.kitodo.data.database.beans.Process */ public void setParent(Process parent) { this.parent = parent; @@ -344,17 +418,14 @@ public List getChildren() { /** * Set children. * - * @param children as List of Process objects + * @param children + * as List of Process objects */ public void setChildren(List children) { this.children = children; } - /** - * Get list of task. - * - * @return list of Task objects or empty list - */ + @Override public List getTasks() { initialize(new ProcessDAO(), this.tasks); if (Objects.isNull(this.tasks)) { @@ -363,8 +434,10 @@ public List getTasks() { return this.tasks; } - public void setTasks(List tasks) { - this.tasks = tasks; + @Override + @SuppressWarnings("unchecked") + public void setTasks(List tasks) { + this.tasks = (List) tasks; } /** @@ -414,11 +487,7 @@ public void setWorkpieces(List workpieces) { this.workpieces = workpieces; } - /** - * Get list of batches or empty list. - * - * @return list of batches or empty list - */ + @Override public List getBatches() { initialize(new ProcessDAO(), this.batches); if (Objects.isNull(this.batches)) { @@ -427,18 +496,17 @@ public List getBatches() { return this.batches; } - /** + /* * Set batches, if list is empty just set, if not first clear and next set. - * - * @param batches - * list */ - public void setBatches(List batches) { + @Override + @SuppressWarnings("unchecked") + public void setBatches(List batches) { if (this.batches == null) { - this.batches = batches; + this.batches = (List) batches; } else { this.batches.clear(); - this.batches.addAll(batches); + this.batches.addAll((List) batches); } } @@ -464,11 +532,7 @@ public void setComments(List comments) { this.comments = comments; } - /** - * Get list of properties. - * - * @return list of Property objects or empty list - */ + @Override public List getProperties() { initialize(new ProcessDAO(), this.properties); if (Objects.isNull(this.properties)) { @@ -477,8 +541,10 @@ public List getProperties() { return this.properties; } - public void setProperties(List properties) { - this.properties = properties; + @Override + @SuppressWarnings("unchecked") + public void setProperties(List properties) { + this.properties = (List) properties; } /** @@ -517,39 +583,22 @@ public void setMetadata(List> metadata) { this.metadata = metadata; } - /** - * Get blocked user. - * - * @return User object if this user is blocked - */ - public User getBlockedUser() { + @Override + public UserInterface getBlockedUser() { return blockedUser; } - /** - * Set blocked user. - * - * @param blockedUser - * User object - */ - public void setBlockedUser(User blockedUser) { + @Override + public void setBlockedUser(UserInterface blockedUser) { this.blockedUser = blockedUser; } - /** - * Get baseType. - * - * @return value of baseType - */ + @Override public String getBaseType() { return baseType; } - /** - * Set baseType. - * - * @param baseType as java.lang.String - */ + @Override public void setBaseType(String baseType) { this.baseType = baseType; } @@ -601,57 +650,33 @@ public int hashCode() { return Objects.hash(this.getId()); } - /** - * Get amount of structure elements. - * - * @return Amount of structure elements - */ - public int getNumberOfStructures() { + @Override + public Integer getNumberOfStructures() { return numberOfStructures; } - /** - * Get amount of meta data elements. - * - * @return Amount of meta data elements - */ - public int getNumberOfMetadata() { + @Override + public Integer getNumberOfMetadata() { return numberOfMetadata; } - /** - * Set amount of meta data elements. - * - * @param numberOfMetadata Integer value of amount of meta data elements - */ - public void setNumberOfMetadata(int numberOfMetadata) { + @Override + public void setNumberOfMetadata(Integer numberOfMetadata) { this.numberOfMetadata = numberOfMetadata; } - /** - * Get amount of images. - * - * @return Integer value of amount of images - */ - public int getNumberOfImages() { + @Override + public Integer getNumberOfImages() { return numberOfImages; } - /** - * Set amount of images. - * - * @param numberOfImages Integer value of amount of images - */ - public void setNumberOfImages(int numberOfImages) { + @Override + public void setNumberOfImages(Integer numberOfImages) { this.numberOfImages = numberOfImages; } - /** - * Set amount of structure elements. - * - * @param numberOfStructures Integer value of amount of structure elements - */ - public void setNumberOfStructures(int numberOfStructures) { + @Override + public void setNumberOfStructures(Integer numberOfStructures) { this.numberOfStructures = numberOfStructures; } @@ -673,4 +698,117 @@ public String getOcrdWorkflowId() { public void setOcrdWorkflowId(String ocrdWorkflowId) { this.ocrdWorkflowId = ocrdWorkflowId; } + + @Override + public Double getProgressClosed() { + if (CollectionUtils.isEmpty(tasks)) { + return 0.0; + } + return getProgressPercentageExact(TaskStatus.DONE); + } + + @Override + public Double getProgressInProcessing() { + if (CollectionUtils.isEmpty(tasks)) { + return 0.0; + } + return getProgressPercentageExact(TaskStatus.INWORK); + } + + @Override + public Double getProgressLocked() { + if (CollectionUtils.isEmpty(tasks)) { + return 100.0; + } + return getProgressPercentageExact(TaskStatus.LOCKED); + + } + + @Override + public Double getProgressOpen() { + if (CollectionUtils.isEmpty(tasks)) { + return 0.0; + } + return getProgressPercentageExact(TaskStatus.OPEN); + } + + private Double getProgressPercentageExact(TaskStatus status) { + Map taskProgress = ProcessConverter.getTaskProgressPercentageOfProcess(this, true); + return taskProgress.get(status); + } + + @Override + public String getProgressCombined() { + Map taskProgress = ProcessConverter.getTaskProgressPercentageOfProcess(this, true); + return ProcessConverter.getCombinedProgressFromTaskPercentages(taskProgress); + } + + @Override + public String getBatchID() { + return batches.stream().map(Batch::getTitle).collect(Collectors.joining(", ")); + } + + @Override + public Integer getParentID() { + return Objects.nonNull(parent) ? parent.getId() : null; + } + + @Override + public void setParentID(Integer parentID) { + this.parent = HibernateUtil.getSession().get(Process.class, parentID); + } + + @Override + public boolean hasChildren() { + try { + return CollectionUtils.isNotEmpty(children); + } catch (LazyInitializationException e) { + return hasChildren; + } + } + + @Override + public void setHasChildren(boolean hasChildren) { + if (!hasChildren && Objects.nonNull(children)) { + children.forEach(child -> child.setParent(null)); + children.clear(); + } else if (hasChildren && CollectionUtils.isEmpty(children)) { + throw new UnsupportedOperationException("cannot insert child processes"); + } + } + + @Override + public String getLastEditingUser() { + return ProcessConverter.getLastEditingUser(this); + } + + @Override + public Date getProcessingBeginLastTask() { + return ProcessConverter.getLastProcessingBegin(this); + } + + @Override + public Date getProcessingEndLastTask() { + return ProcessConverter.getLastProcessingEnd(this); + } + + @Override + public Integer getCorrectionCommentStatus() { + return ProcessConverter.getCorrectionCommentStatus(this).getValue(); + } + + @Override + public boolean hasComments() { + return CollectionUtils.isNotEmpty(comments); + } + + @Override + public void setHasComments(boolean hasComments) { + if (!hasComments && Objects.nonNull(comments)) { + comments.forEach(comment -> comment.setProcess(null)); + comments.clear(); + } else if (hasComments && CollectionUtils.isEmpty(comments)) { + throw new UnsupportedOperationException("cannot insert comments"); + } + } } diff --git a/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Project.java b/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Project.java index 0561483b1cc..e1a07d91ad5 100644 --- a/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Project.java +++ b/Kitodo-DataManagement/src/main/java/org/kitodo/data/database/beans/Project.java @@ -12,9 +12,13 @@ package org.kitodo.data.database.beans; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; import javax.persistence.CascadeType; import javax.persistence.Column; @@ -26,14 +30,25 @@ import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; +import javax.persistence.PostLoad; +import javax.persistence.PostUpdate; import javax.persistence.Table; +import javax.persistence.Transient; +import org.apache.commons.collections.CollectionUtils; +import org.hibernate.LazyInitializationException; +import org.hibernate.annotations.LazyCollection; +import org.hibernate.annotations.LazyCollectionOption; import org.kitodo.data.database.enums.PreviewHoverMode; import org.kitodo.data.database.persistence.ProjectDAO; +import org.kitodo.data.interfaces.ClientInterface; +import org.kitodo.data.interfaces.ProjectInterface; +import org.kitodo.data.interfaces.TemplateInterface; +import org.kitodo.data.interfaces.UserInterface; @Entity @Table(name = "project") -public class Project extends BaseIndexedBean implements Comparable { +public class Project extends BaseIndexedBean implements ProjectInterface, Comparable { @Column(name = "title", nullable = false, unique = true) private String title; @@ -89,6 +104,10 @@ public class Project extends BaseIndexedBean implements Comparable { @OneToMany(mappedBy = "project", cascade = CascadeType.ALL, orphanRemoval = true) private List processes; + @Transient + private boolean hasProcesses; + + @LazyCollection(LazyCollectionOption.FALSE) @ManyToMany(mappedBy = "projects", cascade = CascadeType.PERSIST) private List