Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions roda-common/roda-common-data/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,32 @@
import org.roda.core.data.v2.ip.HasId;
import org.roda.core.data.v2.ip.HasInstanceID;
import org.roda.core.data.v2.ip.HasInstanceName;
import org.roda.core.data.v2.jpa.JobUserDetailsListConverter;
import org.roda.core.data.v2.jpa.ObjectMapConverter;
import org.roda.core.data.v2.jpa.SelectedItemsConverter;
import org.roda.core.data.v2.jpa.StringListConverter;
import org.roda.core.data.v2.jpa.StringMapConverter;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;

import jakarta.persistence.Column;
import jakarta.persistence.Convert;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
import jakarta.persistence.Transient;

/**
* @author Hélder Silva <hsilva@keep.pt>
*/
@Entity
@Table(name = "jobs")
@jakarta.xml.bind.annotation.XmlRootElement(name = RodaConstants.RODA_OBJECT_JOB)
@JsonInclude(JsonInclude.Include.ALWAYS)
@JsonIgnoreProperties(ignoreUnknown = true)
Expand All @@ -42,46 +60,98 @@ public enum JOB_STATE {
PENDING_APPROVAL, REJECTED, SCHEDULED;
}
// job identifier
@Id
@Column(name = "id")
private String id = null;
// job name
@Column(name = "name")
private String name = null;
// job creator
@Column(name = "username")
private String username = null;
// job start date
@Column(name = "start_date")
@Temporal(TemporalType.TIMESTAMP)
private Date startDate = null;
// job end date
@Column(name = "end_date")
@Temporal(TemporalType.TIMESTAMP)
private Date endDate = null;
// job state
@Enumerated(EnumType.STRING)
@Column(name = "state")
private JOB_STATE state = null;
// job state details
@Column(name = "state_details", columnDefinition = "TEXT")
private String stateDetails = "";

// job instance id
@Column(name = "instance_id")
private String instanceId = null;

@Column(name = "job_users_details", columnDefinition = "TEXT")
@Convert(converter = JobUserDetailsListConverter.class)
private List<JobUserDetails> jobUsersDetails = new ArrayList<>();
@Column(name = "instance_name")
private String instanceName = null;

// job statistics (total source objects, etc.)
JobStats jobStats = new JobStats();
// job statistics - expanded into separate columns
@Column(name = "stats_completion_percentage")
private int statsCompletionPercentage = 0;
@Column(name = "stats_source_objects_count")
private int statsSourceObjectsCount = 0;
@Column(name = "stats_source_objects_being_processed")
private int statsSourceObjectsBeingProcessed = 0;
@Column(name = "stats_source_objects_waiting_to_be_processed")
private int statsSourceObjectsWaitingToBeProcessed = 0;
@Column(name = "stats_source_objects_processed_with_success")
private int statsSourceObjectsProcessedWithSuccess = 0;
@Column(name = "stats_source_objects_processed_with_partial_success")
private int statsSourceObjectsProcessedWithPartialSuccess = 0;
@Column(name = "stats_source_objects_processed_with_failure")
private int statsSourceObjectsProcessedWithFailure = 0;
@Column(name = "stats_source_objects_processed_with_skipped")
private int statsSourceObjectsProcessedWithSkipped = 0;
@Column(name = "stats_outcome_objects_with_manual_intervention")
private int statsOutcomeObjectsWithManualIntervention = 0;

// Transient jobStats field for backwards compatibility with existing code
@Transient
private JobStats jobStats = new JobStats();

// plugin full class (e.g. org.roda.core.plugins.plugins.base.FixityPlugin)
@Column(name = "plugin")
private String plugin = null;
// plugin type (e.g. ingest, maintenance, misc, etc.)
@Enumerated(EnumType.STRING)
@Column(name = "plugin_type")
private PluginType pluginType = null;
// plugin parameters
@Column(name = "plugin_parameters", columnDefinition = "TEXT")
@Convert(converter = StringMapConverter.class)
private Map<String, String> pluginParameters = new HashMap<>();

// objects to act upon (All, None, List, Filter, etc.)
@Column(name = "source_objects", columnDefinition = "TEXT")
@Convert(converter = SelectedItemsConverter.class)
private SelectedItems<? extends IsRODAObject> sourceObjects = null;
@Column(name = "outcome_objects_class")
private String outcomeObjectsClass = "";

@Column(name = "attachments_list", columnDefinition = "TEXT")
@Convert(converter = StringListConverter.class)
private List<String> attachmentsList = new ArrayList<>();

@Column(name = "fields", columnDefinition = "TEXT")
@Convert(converter = ObjectMapConverter.class)
private Map<String, Object> fields;

@Enumerated(EnumType.STRING)
@Column(name = "priority")
private JobPriority priority;

@Enumerated(EnumType.STRING)
@Column(name = "parallelism")
private JobParallelism parallelism;

public Job() {
Expand All @@ -104,14 +174,15 @@ public Job(Job job) {
this.pluginParameters = new HashMap<>(job.getPluginParameters());
this.sourceObjects = job.getSourceObjects();
if (sourceObjects instanceof SelectedItemsList) {
jobStats.setSourceObjectsCount(((SelectedItemsList<?>) sourceObjects).getIds().size());
getJobStats().setSourceObjectsCount(((SelectedItemsList<?>) sourceObjects).getIds().size());
}
this.instanceId = job.getInstanceId();
this.instanceName = job.getInstanceName();
this.attachmentsList = job.getAttachmentsList();
this.jobUsersDetails = job.getJobUsersDetails();
}

@Transient
@JsonIgnore
@Override
public int getClassVersion() {
Expand Down Expand Up @@ -205,11 +276,36 @@ public void setStateDetails(String stateDetails) {
}

public JobStats getJobStats() {
// Build JobStats from individual columns for backwards compatibility
if (jobStats == null) {
jobStats = new JobStats();
}
jobStats.setCompletionPercentage(statsCompletionPercentage);
jobStats.setSourceObjectsCount(statsSourceObjectsCount);
jobStats.setSourceObjectsBeingProcessed(statsSourceObjectsBeingProcessed);
jobStats.setSourceObjectsWaitingToBeProcessed(statsSourceObjectsWaitingToBeProcessed);
jobStats.setSourceObjectsProcessedWithSuccess(statsSourceObjectsProcessedWithSuccess);
jobStats.setSourceObjectsProcessedWithPartialSuccess(statsSourceObjectsProcessedWithPartialSuccess);
jobStats.setSourceObjectsProcessedWithFailure(statsSourceObjectsProcessedWithFailure);
jobStats.setSourceObjectsProcessedWithSkipped(statsSourceObjectsProcessedWithSkipped);
jobStats.setOutcomeObjectsWithManualIntervention(statsOutcomeObjectsWithManualIntervention);
return jobStats;
}

public void setJobStats(JobStats jobStats) {
this.jobStats = jobStats;
// Sync to individual columns
if (jobStats != null) {
this.statsCompletionPercentage = jobStats.getCompletionPercentage();
this.statsSourceObjectsCount = jobStats.getSourceObjectsCount();
this.statsSourceObjectsBeingProcessed = jobStats.getSourceObjectsBeingProcessed();
this.statsSourceObjectsWaitingToBeProcessed = jobStats.getSourceObjectsWaitingToBeProcessed();
this.statsSourceObjectsProcessedWithSuccess = jobStats.getSourceObjectsProcessedWithSuccess();
this.statsSourceObjectsProcessedWithPartialSuccess = jobStats.getSourceObjectsProcessedWithPartialSuccess();
this.statsSourceObjectsProcessedWithFailure = jobStats.getSourceObjectsProcessedWithFailure();
this.statsSourceObjectsProcessedWithSkipped = jobStats.getSourceObjectsProcessedWithSkipped();
this.statsOutcomeObjectsWithManualIntervention = jobStats.getOutcomeObjectsWithManualIntervention();
}
}

public String getPlugin() {
Expand Down
Loading
Loading