package io.loli.sc.server.service;
import io.loli.sc.server.dao.GalleryDao;
import io.loli.sc.server.dao.UploadedImageDao;
import io.loli.sc.server.entity.Gallery;
import io.loli.sc.server.entity.UploadedImage;
import io.loli.sc.server.entity.User;
import io.loli.sc.server.storage.StorageUploader;
import io.loli.util.image.ThumbnailUtil;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.transaction.annotation.Transactional;
@Named("imageService")
public class UploadedImageService {
@Inject
@Named("imageDao")
private UploadedImageDao ud;
@Inject
private GalleryDao gd;
@Transactional
public void save(UploadedImage image) {
ud.save(image);
if (image.getGallery() != null) {
image.getGallery().setLastUpdate(new Date());
}
}
@Transactional
public void update(UploadedImage image) {
ud.update(image);
}
@Transactional
public void delete(int id) {
UploadedImage image = this.findById(id);
// StorageBucket sb = image.getStorageBucket();
// StorageUploader.newInstance(sb).delete(image.getPath().substring(image.getPath().lastIndexOf("/")
// + 1));
// System.out.println(image.getPath().substring(image.getPath().indexOf("/")
// + 1));
image.setDelFlag(true);
}
public List<UploadedImage> findAll() {
return ud.findAll();
}
/**
* 根据图片id将查询出此图片的信息
*
* @param id
* @return 查询出的图片,如果没有此id的图片,则返回null
*/
public UploadedImage findById(int id) {
return ud.findById(id);
}
private int maxResults = 18;
/**
* 分页查询出指定用户的截图列表
*
* @param u_id 用户id
* @param firstPosition 初始位置
* @param maxResults 每页的最大数量
* @param name 图片名
* @return 截图列表
*/
public List<UploadedImage> listByUId(int u_id, int firstPosition, int maxResults, String name) {
return ud.listByUId(u_id, firstPosition, maxResults, name);
}
/**
* 不包含分页参数的查询,默认查询出20行
*
* @param u_id 用户id
* @param firstPosition 开始位置
* @param name 图片名
* @return 截图列表
*/
public List<UploadedImage> listByUId(int u_id, int firstPosition, String name) {
return this.listByUId(u_id, firstPosition, maxResults, name);
}
public List<UploadedImage> listByUIdAndFileName(int u_id, String fileName, int firstPosition, Integer tag) {
return this.listByUIdAndFileName(u_id, fileName, firstPosition, maxResults, tag);
}
public List<UploadedImage> listByUIdAndFileName(int u_id, String fileName, int firstPosition, int maxResults,
Integer tag) {
if (tag == 0 || tag == null) {
return ud.listByUIdAndFileName(u_id, fileName, firstPosition, maxResults);
} else {
return ud.listByUIdAndFileName(u_id, fileName, firstPosition, maxResults, tag);
}
}
public int countByUId(int u_id) {
return ud.countByUId(u_id);
}
public int countByUId(int u_id, String name) {
return ud.countByUId(u_id, name);
}
public int getMaxResults() {
return maxResults;
}
public void setMaxResults(int maxResults) {
this.maxResults = maxResults;
}
public int countByUIdAndFileName(int u_id, String fileName) {
return ud.countByUIdAndFileName(u_id, fileName);
}
public int countByUIdAndFileName(int u_id, String fileName, Integer tag) {
if (tag == 0 || tag == null) {
return ud.countByUIdAndFileName(u_id, fileName);
} else {
return ud.countByUIdAndFileName(u_id, fileName, tag);
}
}
public boolean checkExists(String code) {
List<UploadedImage> result = ud.checkExists(code);
if (result.isEmpty()) {
return false;
} else {
return true;
}
}
public UploadedImage findByCode(String redirectCode) {
List<UploadedImage> images = ud.findByCode(redirectCode);
if (images.isEmpty() || images.size() > 1) {
throw new IllegalArgumentException("Invalid code:" + redirectCode);
} else {
return images.get(0);
}
}
@Transactional
public void updateThumbnail(UploadedImage image, File file, StorageUploader uploader) {
String format = file.getName().contains(".") ? file.getName().substring(file.getName().lastIndexOf(".") + 1)
: "png";
try {
String tempDir = System.getProperty("java.io.tmpdir");
File f0 = new File(tempDir, image.getGeneratedCode() + "q." + format);
toFile(ThumbnailUtil.cutSqureWithResizeSmall(new BufferedInputStream(new FileInputStream(file)), format),
f0);
uploader.upload(f0, image.getContentType());
image.setSmallSquareName(f0.getName());
File f1 = new File(tempDir, image.getGeneratedCode() + "s." + format);
toFile(ThumbnailUtil.resizeSmall(new BufferedInputStream(new FileInputStream(file)), format), f1);
uploader.upload(f1, image.getContentType());
image.setSmallName(f1.getName());
File f2 = new File(tempDir, image.getGeneratedCode() + "m." + format);
toFile(ThumbnailUtil.resizeMiddle(new BufferedInputStream(new FileInputStream(file)), format), f2);
uploader.upload(f2, image.getContentType());
image.setMiddleName(f2.getName());
File f3 = new File(tempDir, image.getGeneratedCode() + "l." + format);
toFile(ThumbnailUtil.resizeBig(new BufferedInputStream(new FileInputStream(file)), format), f3);
uploader.upload(f3, image.getContentType());
image.setLargeName(f3.getName());
this.update(image);
} catch (IOException e) {
e.printStackTrace();
}
}
private static void toFile(OutputStream os, File file) {
try {
FileUtils.writeByteArrayToFile(file, ((ByteArrayOutputStream) os).toByteArray());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public String getImageType(File file) {
try (ImageInputStream iis = ImageIO.createImageInputStream(file);) {
Iterator<ImageReader> iter = ImageIO.getImageReaders(iis);
if (!iter.hasNext()) {
return "";
}
ImageReader reader = iter.next();
return reader.getFormatName();
} catch (IOException e) {
e.printStackTrace();
}
// The image could not be read
return "";
}
public List<UploadedImage> findByGalIdAndUId(int id, Integer gid, int page, String name) {
int start = this.getMaxResults() * (page - 1);
return ud.findByGalIdAndUId(id, gid, start, this.getMaxResults(), name);
}
public int countByGalIdAndUId(int id, Integer gid) {
return ud.countByGalIdAndUId(id, gid).intValue();
}
public int countByGalIdAndUId(int id, Integer gid, String name) {
return ud.countByGalIdAndUId(id, gid, name).intValue();
}
@Transactional
public void batchDelete(String ids) {
for (String id : ids.split(",")) {
if (StringUtils.isNoneBlank(id)) {
Integer iid = Integer.parseInt(id.trim());
UploadedImage img = ud.findById(iid);
img.setDelFlag(true);
}
}
}
@Transactional
public void batchDelete(String ids, User user) {
for (String id : ids.split(",")) {
if (StringUtils.isNoneBlank(id)) {
Integer iid = Integer.parseInt(id.trim());
UploadedImage img = ud.findById(iid);
if (user.getId() != img.getUser().getId()) {
new IllegalArgumentException("图片" + img.getRedirectCode() + "非该用户所有");
}
img.setDelFlag(true);
}
}
}
@Transactional
public void batchMove(String ids, User user, Integer gid) {
Gallery gal = gd.findById(gid);
gal.setLastUpdate(new Date());
for (String id : ids.split(",")) {
if (StringUtils.isNoneBlank(id)) {
Integer iid = Integer.parseInt(id.trim());
UploadedImage img = ud.findById(iid);
if (user.getId() != img.getUser().getId()) {
new IllegalArgumentException("图片" + img.getRedirectCode() + "非该用户所有");
} else {
img.setGallery(gal);
}
}
}
}
public List<UploadedImage> findByNameAndUser(String name, User user) {
return ud.findByNameAndUser("%" + name + "%", user.getId());
}
}