/*
* Copyright (c) JForum Team. All rights reserved.
*
* The software in this package is published under the terms of the LGPL
* license a copy of which has been included with this distribution in the
* license.txt file.
*
* The JForum Project
* http://www.jforum.net
*/
package net.jforum.services;
import java.io.File;
import net.jforum.core.exceptions.ValidationException;
import net.jforum.entities.Smilie;
import net.jforum.repository.SmilieRepository;
import net.jforum.util.ConfigKeys;
import net.jforum.util.JForumConfig;
import net.jforum.util.MD5;
import net.jforum.util.UploadUtils;
import org.apache.commons.lang.StringUtils;
import br.com.caelum.vraptor.interceptor.multipart.UploadedFile;
import br.com.caelum.vraptor.ioc.Component;
/**
* @author Rafael Steil
*/
@Component
public class SmilieService {
private SmilieRepository repository;
private JForumConfig config;
public SmilieService(SmilieRepository repository, JForumConfig config) {
this.repository = repository;
this.config = config;
}
/**
* Adds a new smilie
*
* @param smilie
*/
public void add(Smilie smilie, UploadedFile uploadedFile) {
this.applyCommonConstraints(smilie);
if (smilie.getId() > 0) {
throw new ValidationException(
"Cannot add an existing (id > 0) smilie");
}
String imageDiskName = this.saveImage(uploadedFile);
if (imageDiskName == null) {
throw new NullPointerException(
"Could not find the smile file to save");
}
smilie.setDiskName(imageDiskName);
this.repository.add(smilie);
}
/**
* Updates a existing smilie
*
* @param smilie
* @param file
*/
public void update(Smilie smilie, UploadedFile uploadedFile) {
this.applyCommonConstraints(smilie);
if (smilie.getId() == 0) {
throw new ValidationException(
"update() expects a smilie with an existing id");
}
String imageDiskName = this.saveImage(uploadedFile);
Smilie current = this.repository.get(smilie.getId());
current.setCode(smilie.getCode());
if (imageDiskName != null) {
this.deleteImage(current);
current.setDiskName(imageDiskName);
}
this.repository.update(current);
}
/**
* Delete smilies
*
* @param smiliesId
*/
public void delete(int... smiliesId) {
if (smiliesId != null) {
for (int id : smiliesId) {
Smilie s = this.repository.get(id);
this.repository.remove(s);
this.deleteImage(s);
}
}
}
private void deleteImage(Smilie smilie) {
String filename = String.format("%s/%s/%s",
this.config.getApplicationPath(),
this.config.getValue(ConfigKeys.SMILIE_IMAGE_DIR),
smilie.getDiskName());
new File(filename).delete();
}
private String saveImage(UploadedFile uploadedFile) {
if (uploadedFile != null) {
UploadUtils upload = new UploadUtils(uploadedFile);
String imageName = String.format(
"%s.%s",
MD5.hash(uploadedFile.getFileName()
+ System.currentTimeMillis()),
upload.getExtension());
upload.saveUploadedFile(String.format("%s/%s/%s",
this.config.getApplicationPath(),
this.config.getValue(ConfigKeys.SMILIE_IMAGE_DIR),
imageName));
return imageName;
}
return null;
}
private void applyCommonConstraints(Smilie smilie) {
if (smilie == null) {
throw new NullPointerException("Cannot save a null smilie");
}
if (StringUtils.isEmpty(smilie.getCode())) {
throw new ValidationException("Smilie code cannot be empty");
}
}
}