2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.vid.model;
23 import java.text.DateFormat;
24 import java.text.ParseException;
25 import java.text.SimpleDateFormat;
26 import java.util.Date;
27 import java.util.Locale;
28 import java.util.TimeZone;
29 import java.util.UUID;
30 import javax.persistence.Column;
31 import javax.persistence.Entity;
32 import javax.persistence.EnumType;
33 import javax.persistence.Enumerated;
34 import javax.persistence.GeneratedValue;
35 import javax.persistence.GenerationType;
36 import javax.persistence.Id;
37 import javax.persistence.Table;
38 import javax.persistence.Transient;
39 import org.apache.commons.lang3.StringUtils;
40 import org.apache.commons.lang3.builder.EqualsBuilder;
41 import org.apache.commons.lang3.builder.HashCodeBuilder;
42 import org.hibernate.annotations.DynamicUpdate;
43 import org.hibernate.annotations.SelectBeforeUpdate;
44 import org.hibernate.annotations.Type;
45 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
46 import org.onap.vid.job.Job.JobStatus;
49 The following 2 annotations let hibernate to update only fields that actually have been changed.
50 DynamicUpdate tell hibernate to update only dirty fields.
51 SelectBeforeUpdate is needed since during update the entity is detached (get and update are in different sessions)
56 @Table(name = "vid_job_audit_status")
57 public class JobAuditStatus extends VidBaseEntity {
59 public static final int MAX_ADDITIONAL_INFO_LENGTH = 2000;
60 static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(JobAuditStatus.class);
61 private static final String defaultFormat = "E, dd MMM yyyy HH:mm:ss z";
63 public JobAuditStatus(){}
65 private JobAuditStatus(UUID jobId, String instanceName, String instanceType, String jobStatus,
66 SourceStatus source, UUID requestId, String additionalInfo, Date date, int ordinal) {
68 this.instanceName = instanceName;
69 this.instanceType = instanceType;
70 this.jobStatus = jobStatus;
72 this.requestId = requestId;
73 setAdditionalInfo(additionalInfo);
74 this.ordinal = ordinal;
78 public JobAuditStatus(UUID jobId, String jobStatus, SourceStatus source){
79 this(jobId, null, null, jobStatus, source, null, null, null, 0);
82 public JobAuditStatus(UUID jobId, String jobStatus, SourceStatus source, UUID requestId, String additionalInfo) {
83 this(jobId, null, null, jobStatus, source, requestId, additionalInfo, null, 0);
86 public JobAuditStatus(String instanceName, String jobStatus, UUID requestId, String additionalInfo, String date, String instanceType) {
87 this(null, instanceName, instanceType, jobStatus, null, requestId, additionalInfo, null, 0);
88 this.created = dateStringToDate(date);
91 public static JobAuditStatus createForTest(UUID jobId, String jobStatus, SourceStatus source, Date date, int ordinal) {
92 return new JobAuditStatus(jobId, null, null, jobStatus, source, null, null, date, ordinal);
95 public static JobAuditStatus createForTest(UUID jobId, String jobStatus, SourceStatus source, UUID requestId, String additionalInfo, Date date) {
96 return new JobAuditStatus(jobId, null, null, jobStatus, source, requestId, additionalInfo, date, 0);
99 private Date dateStringToDate(String dateAsString){
100 if (StringUtils.isEmpty(dateAsString)) {
104 DateFormat format = new SimpleDateFormat(defaultFormat, Locale.US);
105 format.setTimeZone(TimeZone.getTimeZone("GMT"));
108 date = format.parse(dateAsString);
109 } catch (ParseException e) {
110 logger.error("There was an error to parse the string "+ dateAsString +" to date ", e.getMessage());
116 public boolean equals(Object o) {
117 if (this == o) return true;
119 if (o == null || getClass() != o.getClass()) return false;
121 JobAuditStatus that = (JobAuditStatus) o;
123 return new EqualsBuilder()
124 .append(jobId, that.jobId)
125 .append(jobStatus, that.jobStatus)
126 .append(source, that.source)
127 .append(requestId, that.requestId)
128 .append(additionalInfo, that.additionalInfo)
129 .append(modelType, that.modelType)
130 // ordinal is not part of equality (similarly to "created" field)
135 public int hashCode() {
136 return new HashCodeBuilder(17, 37)
141 .append(additionalInfo)
143 // ordinal is not part of equality (similarly to "created" field)
147 public enum SourceStatus {
152 public enum ResourceTypeFilter {
153 SERVICE("serviceInstanceId"),
154 VNF("vnfInstanceId"),
155 VFMODULE("vfModuleInstanceId"),
156 NETWORK("networkInstanceId"),
157 VNFGROUP("instanceGroupId");
159 private final String filterBy;
161 ResourceTypeFilter(String filterBy) {
162 this.filterBy = filterBy;
165 public String getFilterBy() {
170 public JobAuditStatus(UUID requestId, String instanceName,
171 String modelType, String instanceType, String startTime,
172 String finishTime, String jobStatus, String instanceId, String additionalInfo) {
173 this.requestId = requestId;
174 this.instanceName = instanceName;
175 this.modelType = modelType;
176 this.instanceType = instanceType;
178 this.startTime = startTime;
179 this.finishTime = finishTime;
181 this.instanceId = instanceId;
182 this.jobStatus = jobStatus;
183 this.additionalInfo = additionalInfo;
184 this.created = dateStringToDate(finishTime);
186 private String modelType;
187 private String startTime;
188 private String finishTime;
191 public String getInstanceId() {
195 public void setInstanceId(String instanceId) {
196 this.instanceId = instanceId;
199 private String instanceId;
202 public String getModelType() {
206 public void setModelType(String modelType) {
207 this.modelType = modelType;
211 public String getFinishTime() {
215 public void setFinishTime(String finishTime) {
216 this.finishTime = finishTime;
220 public String getStartTime() {
224 public void setStartTime(String startTime) {
225 this.startTime = startTime;
230 private String instanceName;
231 private String instanceType;
232 private String jobStatus;
233 private SourceStatus source;
234 private UUID requestId;
235 private String additionalInfo;
239 @GeneratedValue(strategy = GenerationType.IDENTITY)
241 @Column(name = "ID", columnDefinition = "INT(11)")
242 public Long getId() {
246 @Column(name = "JOB_ID", columnDefinition = "CHAR(36)")
247 @Type(type="org.hibernate.type.UUIDCharType")
248 public UUID getJobId() {
252 public void setJobId(UUID jobId) {
257 @Column(name = "JOB_STATUS")
258 public String getJobStatus() {
262 public void setJobStatus(String jobStatus) {
263 this.jobStatus = jobStatus;
267 @Enumerated(EnumType.STRING)
268 @Column(name = "SOURCE")
269 public SourceStatus getSource() {
273 public void setSource(SourceStatus source) {
274 this.source = source;
277 @Column(name = "REQUEST_ID", columnDefinition = "CHAR(36)")
278 @Type(type="org.hibernate.type.UUIDCharType")
279 public UUID getRequestId() {
283 public void setRequestId(UUID requestId) {
284 this.requestId = requestId;
287 @Column(name = "ADDITIONAL_INFO", columnDefinition = "VARCHAR(2000)")
288 public String getAdditionalInfo() {
289 return additionalInfo;
292 public void setAdditionalInfo(String additionalInfo) {
293 this.additionalInfo = StringUtils.substring(additionalInfo, 0, MAX_ADDITIONAL_INFO_LENGTH);
296 @Column(name = "ORDINAL", columnDefinition = "INT")
297 public int getOrdinal() {
298 // Ordinal allows sorting audit statuses by
299 // insertion order, regardless of "created"
304 public void setOrdinal(int ordinal) {
305 this.ordinal = ordinal;
309 public String getInstanceName() {
313 public void setInstanceName(String instanceName) {
314 this.instanceName = instanceName;
318 public String getInstanceType() {
322 public void setInstanceType(String instanceType) {
323 this.instanceType = instanceType;
327 public Boolean isFinal(){
329 if (getSource() == SourceStatus.VID) {
330 return JobStatus.valueOf(getJobStatus()).isFinal();
333 catch (IllegalArgumentException e){
334 logger.error("JobStatus: " + getJobStatus() + " from vid isn't a value of JobStatus enum" + e.getMessage());
341 public Date getCreatedDate() {