/* * ProActive Parallel Suite(TM): * The Open Source library for parallel and distributed * Workflows & Scheduling, Orchestration, Cloud Automation * and Big Data Analysis on Enterprise Grids & Clouds. * * Copyright (c) 2007 - 2017 ActiveEon * Contact: contact@activeeon.com * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation: version 3 of * the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * If needed, contact us to obtain a release under GPL Version 2 or 3 * or a different license than the AGPL. */ package org.ow2.proactive.scheduler.core.db; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Index; import javax.persistence.JoinColumn; import javax.persistence.Lob; import javax.persistence.ManyToOne; import javax.persistence.MapsId; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.Table; import javax.persistence.Transient; import org.apache.commons.lang3.SerializationUtils; import org.apache.log4j.Logger; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; import org.ow2.proactive.scheduler.common.job.Job; import org.ow2.proactive.scheduler.common.job.TaskFlowJob; import org.ow2.proactive.scheduler.util.ByteCompressionUtils; /** * JobContent Entity class, store workflow content to database * * @author ActiveEon team * */ @Entity @NamedQueries({ @NamedQuery(name = "deleteJobContentInBulk", query = "delete from JobContent where id in :jobIdList"), @NamedQuery(name = "loadJobContent", query = "from JobContent as content where content.jobId = :id"), @NamedQuery(name = "countJobContent", query = "select count (*) from JobContent") }) @Table(name = "JOB_CONTENT", indexes = { @Index(name = "INITIAL_JOB_INDEX", columnList = "JOB_ID") }) public class JobContent implements Serializable { private static final Logger LOGGER = Logger.getLogger(JobContent.class); @Lob @Column(name = "CONTENT", length = Integer.MAX_VALUE) private byte[] jobContentAsByteArray; @Id @Column(name = "JOB_ID", unique = true, nullable = false) @GeneratedValue(generator = "keyGenerator") @GenericGenerator(name = "keyGenerator", strategy = "foreign", parameters = { @Parameter(value = "jobData", name = "property") }) private Long jobId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "JOB_ID", referencedColumnName = "ID") @MapsId private JobData jobData; public Long getJobId() { return jobId; } public void setJobId(Long jobId) { this.jobId = jobId; } public byte[] getJobContentAsByteArray() { return jobContentAsByteArray; } public JobData getJobData() { return jobData; } public void setJobData(JobData jobData) { this.jobData = jobData; } public void setJobContentAsByteArray(byte[] jobContentAsByteArray) { this.jobContentAsByteArray = jobContentAsByteArray; } @Transient public TaskFlowJob getInitJobContent() { try { byte[] deCompressed = ByteCompressionUtils.decompress(jobContentAsByteArray); return SerializationUtils.deserialize(deCompressed); } catch (Exception e) { LOGGER.error(e); } return SerializationUtils.deserialize(jobContentAsByteArray); } public void setInitJobContent(Job job) { byte[] jobByte = SerializationUtils.serialize(job); try { this.jobContentAsByteArray = ByteCompressionUtils.compress(jobByte); } catch (Exception e) { LOGGER.error(e); this.jobContentAsByteArray = jobByte; } } @Override public int hashCode() { return jobId.hashCode(); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; JobContent other = (JobContent) obj; if (other.getJobId().equals(this.getJobId())) return false; return true; } }