blob: 807221fcad988036f5a72a866e1bce3b24565883 [file] [log] [blame]
/*-
* ============LICENSE_START=======================================================
* OSAM
* ================================================================================
* Copyright (C) 2018 AT&T
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============LICENSE_END=========================================================
*/
package org.onap.osam.job.dao.job;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.MoreObjects;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SelectBeforeUpdate;
import org.hibernate.annotations.Type;
import org.onap.osam.job.JobType;
import org.onap.osam.job.impl.JobData;
import org.onap.osam.job.impl.JobSharedData;
import org.onap.osam.model.dao.BaseEntity;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import javax.persistence.AttributeConverter;
import javax.persistence.Column;
import javax.persistence.Converter;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Lob;
import java.io.IOException;
import java.util.Date;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
/*
The following 2 annotations let hibernate to update only fields that actually have been changed.
DynamicUpdate tell hibernate to update only dirty fields.
SelectBeforeUpdate is needed since during update the entity is detached (get and update are in different sessions)
*/
@DynamicUpdate()
@SelectBeforeUpdate()
@Entity
@Getter
@Setter
@Slf4j
public class OsamJob extends BaseEntity {
@Column(unique = true, nullable = false, columnDefinition = "CHAR(36)")
@Type(type="org.hibernate.type.UUIDCharType")
private UUID uuid;
@CreatedDate
private Date createdDate;
@LastModifiedDate
private Date modifiedDate;
@Enumerated(value = EnumType.STRING)
private JobStatus status;
@Enumerated(value = EnumType.STRING)
private JobType type;
@Lob
@Column
private JobData data = new JobData();
@Column
private String takenBy;
@Column
private String userId;
@Column(nullable = false)
private Integer age = 0;
@Column(nullable = false)
private Integer indexInBulk = 0;
@Column
private Date deletedAt;
public Map<String, Object> getDataMap() {
return data.getCommandData().get(getType());
}
public void setTypeAndData(JobType jobType, Map<String, Object> data) {
// *add* the data to map,
// then change state to given type
this.type = jobType;
this.data.getCommandData().put(jobType, data);
}
public void setSharedData(JobSharedData sharedData) {
this.data.setSharedData(sharedData);
}
public JobSharedData getSharedData(){
return this.data.getSharedData();
};
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof OsamJob)) return false;
OsamJob daoJob = (OsamJob) o;
return Objects.equals(getUuid(), daoJob.getUuid());
}
@Override
public int hashCode() {
return Objects.hash(getUuid());
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("status", status)
.add("type", type)
.add("uuid", uuid)
.add("takenBy", takenBy)
.add("userId", userId)
.add("age", age)
.add("createdDate", createdDate)
.add("modifiedDate", modifiedDate)
.add("deletedAt", deletedAt)
.add("data", data)
.toString();
}
@Converter(autoApply = true)
public static class JobDataConverter implements AttributeConverter<JobData, String> {
@Override
public String convertToDatabaseColumn(JobData jobData) {
if( jobData == null )
return null;
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(jobData);
} catch (JsonProcessingException e) {
log.error("Couldn't persist JobData object {}, error: {}. Persisting null", jobData, e);
return null;
}
}
@Override
public JobData convertToEntityAttribute(String s) {
if( s == null )
return null;
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.readValue(s, JobData.class);
} catch (IOException e) {
log.error("Couldn't deserialize {} to JobData object, error: {}. Returning null", s, e);
return null;
}
}
}
}