/*
* 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.
*/
package com.asual.summer.sample.domain;
import static javax.persistence.GenerationType.IDENTITY;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.cache.Cache;
import javax.cache.CacheException;
import javax.cache.CacheFactory;
import javax.cache.CacheManager;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.PersistenceContext;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import com.asual.summer.core.util.StringUtils;
import com.google.appengine.api.datastore.Link;
/**
*
* @author Rostislav Hristov
*
*/
@Configurable
@Entity
@Table
public class Technology implements Serializable {
private static final long serialVersionUID = 1L;
private static final Log logger = LogFactory.getLog(Technology.class);
@PersistenceContext
private transient EntityManager entityManager;
@Id
@GeneratedValue(strategy=IDENTITY)
@Column(nullable=false)
private Long id;
@Column(nullable=false)
private String value;
@NotEmpty
@Size(max=128)
@Column(length=128)
private String name;
@Size(min=32, max=512)
@Column(length=512)
private String description;
@Size(max=255)
@Column
private String version;
@Column
private Link homepage;
@Column
private List<Long> licenseIds;
@NotNull
@Column
private Long statusId;
@Column
private boolean required;
@Lob
private Image image;
public Technology() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
if (name != null) {
value = StringUtils.toUriPath(name);
}
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public Link getHomepage() {
return homepage;
}
public void setHomepage(Link homepage) {
this.homepage = homepage;
}
public List<Long> getLicenseIds() {
return licenseIds;
}
public void setLicenseIds(List<Long> licenseIds) {
this.licenseIds = licenseIds;
}
public List<License> getLicenses() {
List<License> list = new ArrayList<License>();
if (licenseIds != null) {
for (Long id : licenseIds) {
list.add(entityManager.find(License.class, id));
}
}
return list;
}
public void setLicenses(List<License> licenses) {
List<Long> list = new ArrayList<Long>();
if (licenses != null) {
for (License license : licenses) {
list.add(license.getId());
}
}
setLicenseIds(list);
}
public Long getStatusId() {
return statusId;
}
public void setStatusId(Long statusId) {
this.statusId = statusId;
}
public Status getStatus() {
if (statusId != null) {
return entityManager.find(Status.class, statusId);
}
return null;
}
public void setStatus(Status status) {
this.setStatusId(status != null ? status.getId() : null);
}
public boolean isRequired() {
return required;
}
public void setRequired(boolean required) {
this.required = required;
}
public Image getImage() {
setImage(image);
return image;
}
@SuppressWarnings("unchecked")
public void setImage(Image image) {
if (image != null) {
try {
CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory();
Cache cache = cacheFactory.createCache(Collections.emptyMap());
cache.put(value, image);
} catch (CacheException e) {
logger.error(e.getMessage(), e);
}
} else if (value != null) {
image = findImage(value);
}
this.image = image;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Technology other = (Technology) obj;
if (value == null) {
if (other.value != null)
return false;
} else if (!value.equals(other.value))
return false;
return true;
}
@Transactional
public void persist() {
entityManager.persist(this);
}
@Transactional
public Technology merge() {
Technology merged = entityManager.merge(this);
entityManager.flush();
return merged;
}
@Transactional
public void remove() {
if (entityManager.contains(this)) {
entityManager.remove(this);
} else {
Technology attached = entityManager.find(this.getClass(), this.id);
entityManager.remove(attached);
}
}
@Transactional
public void flush() {
entityManager.flush();
}
public static final EntityManager entityManager() {
EntityManager em = new Technology().entityManager;
if (em == null) {
throw new IllegalStateException("Entity manager has not been injected.");
}
return em;
}
@SuppressWarnings("unchecked")
public static Technology find(String value) {
List<Technology> resultList =
entityManager().createQuery("select o from Technology o where o.value = ?1").setParameter(1, value).getResultList();
if (resultList.size() != 0) {
return resultList.get(0);
}
return null;
}
public static Image findImage(String value) {
if (value != null) {
try {
CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory();
Cache cache = cacheFactory.createCache(Collections.emptyMap());
return (Image) cache.get(value);
} catch (CacheException e) {
logger.error(e.getMessage(), e);
}
}
return null;
}
@SuppressWarnings("unchecked")
public static List<Technology> list() {
return entityManager().createQuery("select o from Technology o").getResultList();
}
@SuppressWarnings("unchecked")
public static List<Technology> list(int firstResult, int maxResults) {
return entityManager().createQuery("select o from Technology o").setFirstResult(firstResult).setMaxResults(maxResults).getResultList();
}
public static class Image implements Serializable {
private static final long serialVersionUID = 1L;
private String value;
private String contentType;
private byte[] bytes;
public Image(MultipartFile file) throws IOException {
value = file.getOriginalFilename();
contentType = file.getContentType();
bytes = file.getBytes();
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public byte[] getBytes() {
return bytes;
}
public void setBytes(byte[] bytes) {
this.bytes = bytes;
}
}
}