/*
* Copyright 2008-2010 the original author or authors.
*
* 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 es.alvsanand.webpage.services.session;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.cache.Cache;
import javax.cache.CacheException;
import javax.cache.CacheFactory;
import javax.cache.CacheManager;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.datanucleus.util.StringUtils;
import com.google.appengine.api.datastore.Blob;
import es.alvsanand.webpage.common.AlvsanandProperties;
import es.alvsanand.webpage.common.Globals;
import es.alvsanand.webpage.common.Logger;
import es.alvsanand.webpage.common.MessageResources;
import es.alvsanand.webpage.db.QueryBean;
import es.alvsanand.webpage.db.dao.DAOException;
import es.alvsanand.webpage.db.dao.admin.UserDAO;
import es.alvsanand.webpage.db.dao.admin.UserDAOImpl;
import es.alvsanand.webpage.model.Avatar;
import es.alvsanand.webpage.model.User;
import es.alvsanand.webpage.services.ServiceException;
import es.alvsanand.webpage.services.admin.ImageAdminService;
import es.alvsanand.webpage.services.admin.ImageAdminServiceImpl;
import es.alvsanand.webpage.services.admin.WebAdminService;
import es.alvsanand.webpage.services.admin.WebAdminServiceImpl;
/**
* This class implements the service User
*
* @author alvaro.santos
* @date 18/11/2009
*
*/
public class UserServiceImpl implements UserService {
private final static Logger logger = new Logger(UserServiceImpl.class);
private UserDAO userDAO = new UserDAOImpl();
private transient WebAdminService webAdminService = new WebAdminServiceImpl();
private transient ImageAdminService imageAdminService = new ImageAdminServiceImpl();
/*
* (non-Javadoc)
*
* @see
* es.alvsanand.webpage.services.session.UserService#saveUser(es.alvsanand
* .webpage.model.User)
*/
public void saveUser(User user) throws ServiceException {
try {
logger.debug("Saving user[" + ((user != null) ? user : "") + "]");
if(user.getCreationdate()==null){
user.setCreationdate(new java.util.Date());
}
if(user.getAvatar()!=null && user.getAvatar().getData()!=null){
byte[] photoData = imageAdminService.createAvatarImage(user.getAvatar().getData().getBytes());
user.getAvatar().setData(new Blob(photoData));
removeAvatFromCache(user);
}
userDAO.saveOrUpdateUser(user);
} catch (DAOException e) {
logger.error("Error saving user", e);
throw new ServiceException(e);
}
}
/*
* (non-Javadoc)
*
* @see
* es.alvsanand.webpage.services.session.UserService#getUser(es.alvsanand
* .webpage.model.User)
*/
public User getUser(User user) throws ServiceException {
try {
logger.debug("Getting user[" + ((user != null) ? user : "") + "]");
return userDAO.getUser(user);
} catch (DAOException e) {
logger.error("Error getting user", e);
throw new ServiceException(e);
}
}
/*
* (non-Javadoc)
*
* @see
* es.alvsanand.webpage.services.session.UserService#getUserByRegistrationHash(java.lang.String
* )
*/
public User getUserByRegistrationHash(String registrationHash) throws ServiceException {
try {
logger.debug("Getting user by registrationHash[" + ((registrationHash != null) ? registrationHash : "") + "]");
return userDAO.getUserByRegistrationHash(registrationHash);
} catch (DAOException e) {
logger.error("Error getting user by registrationHash", e);
throw new ServiceException(e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.session.UserService#getUserByLoginName(java.lang.String)
*/
public User getUserByLoginName(String loginName) throws ServiceException {
try {
logger.debug("Getting user by loginName[" + ((loginName != null) ? loginName : "") + "]");
return userDAO.getUserByLoginName(loginName);
} catch (DAOException e) {
logger.error("Error getting user by loginName", e);
throw new ServiceException(e);
}
}
/*
* (non-Javadoc)
*
* @see
* es.alvsanand.webpage.services.session.UserService#delete(es.alvsanand
* .webpage.model.User)
*/
public void delete(User user) throws ServiceException {
try {
logger.debug("Deleting user[" + ((user != null) ? user : "") + "]");
userDAO.deleteUser(user);
} catch (DAOException e) {
logger.error("Error deleting user", e);
throw new ServiceException(e);
}
}
/*
* (non-Javadoc)
*
* @see
* es.alvsanand.webpage.services.session.UserService#getUsers(es.alvsanand
* .webpage.db.QueryBean)
*/
public List<User> getUsers(QueryBean queryBean) throws ServiceException {
try {
logger.debug("Getting users[" + ((queryBean != null) ? queryBean : "") + "]");
return userDAO.getUsers(queryBean);
} catch (DAOException e) {
logger.error("Error getting users", e);
throw new ServiceException(e);
}
}
/*
* (non-Javadoc)
*
* @see
* es.alvsanand.webpage.services.session.UserService#getUserCount(java.lang
* .String)
*/
public int getUserCount(String loginName) throws ServiceException {
try {
logger.debug("Getting count of user[" + ((loginName != null) ? loginName : "") + "]");
return userDAO.getUserCountByLoginName(loginName);
} catch (DAOException e) {
logger.error("Error count of user", e);
throw new ServiceException(e);
}
}
/*
* (non-Javadoc)
*
* @see
* es.alvsanand.webpage.services.session.UserService#sendActivationEmail
* (es.alvsanand.webpage.model.User)
*/
public void sendActivationEmail(User user) throws ServiceException {
try {
logger.debug("Sending activation email[" + ((user != null) ? user : "") + "]");
if (user == null) {
throw new IllegalArgumentException();
}
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
String domain = AlvsanandProperties.getProperty(Globals.DOMAIN_CONFIG_KEY);
String contextPath = AlvsanandProperties.getProperty(Globals.CONTEXT_CONFIG_KEY);
String activationUrl = MessageFormat.format(Globals.ACTIVATION_URL_FORMAT, new String[] { domain, contextPath, user.getRegistrationHash() });
String subject = MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME, "registration.activation.email.subject",
null);
String bodyText = MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME, "registration.activation.email.body",
new String[] { activationUrl });
String sender = AlvsanandProperties.getProperty(Globals.EMAIL_CONFIG_KEY);
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(sender));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail()));
message.setSubject(subject);
message.setText(bodyText);
webAdminService.sentEmail(message);
} catch (AddressException e) {
logger.error("Error sending activation email", e);
throw new ServiceException(e);
} catch (MessagingException e) {
logger.error("Error sending activation email", e);
throw new ServiceException(e);
}
}
/* (non-Javadoc)
* @see es.alvsanand.webpage.services.session.UserService#sendResetPasswordEmail(es.alvsanand.webpage.model.User, java.lang.String)
*/
public void sendResetPasswordEmail(User user, String plainPassword) throws ServiceException {
try {
logger.debug("Sending reset password email[" + ((user != null) ? user : "") + "]");
if (user == null || StringUtils.isEmpty(plainPassword)) {
throw new IllegalArgumentException();
}
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
String subject = MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME, "registration.resotrePassword.email.subject",
null);
String bodyText = MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME, "registration.resotrePassword.email.body",
new String[] { user.getLoginName(), plainPassword });
String sender = AlvsanandProperties.getProperty(Globals.EMAIL_CONFIG_KEY);
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(sender));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail()));
message.setSubject(subject);
message.setText(bodyText);
webAdminService.sentEmail(message);
} catch (AddressException e) {
logger.error("Error sending reset password email", e);
throw new ServiceException(e);
} catch (MessagingException e) {
logger.error("Error sending reset password email", e);
throw new ServiceException(e);
}
}
private void removeAvatFromCache(User user){
Cache cache;
try {
logger.debug("Removing avatar of user[" + user +"] from cache.");
CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory();
cache = cacheFactory.createCache(Collections.emptyMap());
{
Map<String, Avatar> articlesMap = (Map<String, Avatar>)cache.get(Globals.AVATAR_BY_ID_USER_CACHE_NAME);
if(articlesMap!=null){
List<String> avatarToDelete = new ArrayList<String>();
for(String idUser: articlesMap.keySet()){
Avatar avatar = articlesMap.get(idUser);
if(avatar!=null){
avatarToDelete.add(idUser);
break;
}
}
for(String idUser: avatarToDelete){
articlesMap.remove(idUser);
}
cache.put(Globals.AVATAR_BY_ID_USER_CACHE_NAME, articlesMap);
}
}
} catch (CacheException cacheException) {
logger.error("Error removing avatar of user[" + user +"] from cache",cacheException);
}
}
}