Java tutorial
/* UserAccountService.java Copyright (c) 2009 Juergen Schlierf, All Rights Reserved This file is part of Cubusmail (http://code.google.com/p/cubusmail/). This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with Cubusmail. If not, see <http://www.gnu.org/licenses/>. */ package com.cubusmail.gwtui.server.services; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Enumeration; import java.util.List; import java.util.Locale; import java.util.ResourceBundle; import java.util.TimeZone; import javax.mail.MessagingException; import javax.mail.internet.InternetAddress; import javax.servlet.ServletException; import net.sf.hibernate4gwt.core.HibernateBeanManager; import net.sf.hibernate4gwt.gwt.HibernateRemoteService; import org.apache.commons.beanutils.BeanComparator; import org.apache.commons.collections.comparators.ReverseComparator; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.springframework.web.util.HtmlUtils; import com.google.gwt.user.client.rpc.SerializationException; import com.google.gwt.user.server.rpc.RPC; import com.google.gwt.user.server.rpc.RPCRequest; import com.cubusmail.core.BeanFactory; import com.cubusmail.core.BeanIds; import com.cubusmail.gwtui.client.exceptions.GWTInvalidSessionException; import com.cubusmail.gwtui.client.services.IUserAccountService; import com.cubusmail.gwtui.domain.Contact; import com.cubusmail.gwtui.domain.ContactFolder; import com.cubusmail.gwtui.domain.ContactListFields; import com.cubusmail.gwtui.domain.Identity; import com.cubusmail.gwtui.domain.UserAccount; import com.cubusmail.mail.IMailbox; import com.cubusmail.mail.SessionManager; import com.cubusmail.mail.util.MessageUtils; import com.cubusmail.mail.util.MessageUtils.AddressStringType; import com.cubusmail.user.UserAccountDao; /** * Implementation of UserAccountService. * * @author Juergen Schlierf */ public class UserAccountService extends HibernateRemoteService implements IUserAccountService { private static final long serialVersionUID = 3680152258110434790L; private Logger log = Logger.getLogger(getClass().getName()); public UserAccountService() { } @Override public void init() throws ServletException { super.init(); setBeanManager((HibernateBeanManager) BeanFactory.getBean("hibernateBeanManager")); } /** * @return */ private UserAccountDao getUserAccountDao() { return (UserAccountDao) BeanFactory.getBean(BeanIds.USER_ACCOUNT_DAO); } /* * (non-Javadoc) * * @see * com.google.gwt.user.server.rpc.RemoteServiceServlet#processCall(java. * lang.String) */ @Override public String processCall(String payload) throws SerializationException { if (SessionManager.isLoggedIn()) { try { return super.processCall(payload); } catch (SerializationException e) { log.error(e.getMessage(), e); throw e; } } else { RPCRequest rpcRequest = RPC.decodeRequest(payload, this.getClass(), this); return RPC.encodeResponseForFailure(rpcRequest.getMethod(), new GWTInvalidSessionException()); } } /* * (non-Javadoc) * * @see * com.cubusmail.gwtui.client.services.IUserAccountService#saveUserAccount * (com.cubusmail.gwtui.domain.UserAccount) */ public UserAccount saveUserAccount(UserAccount account) { UserAccount origin = SessionManager.get().getUserAccount(); List<Identity> identitiesToDelete = new ArrayList<Identity>(); for (Identity identity : origin.getIdentities()) { if (!account.getIdentities().contains(identity)) { identitiesToDelete.add(identity); account.removeIdentity(identity); } } if (identitiesToDelete.size() > 0) { getUserAccountDao().deleteIdentities(identitiesToDelete); } getUserAccountDao().saveUserAccount(account); SessionManager.get().setUserAccount(account); return account; } /* * (non-Javadoc) * * @see * com.cubusmail.gwtui.client.services.IUserAccountService#retrieveUserAccount * () */ public UserAccount retrieveUserAccount() { IMailbox mailbox = SessionManager.get().getMailbox(); return getUserAccountDao().getUserAccountByUsername(mailbox.getUserName()); } /* * (non-Javadoc) * * @seecom.cubusmail.gwtui.client.services.IUserAccountService# * retrieveContactFolders() */ public List<ContactFolder> retrieveContactFolders() { UserAccount account = SessionManager.get().getUserAccount(); return getUserAccountDao().retrieveContactFolders(account); } /* * (non-Javadoc) * * @see * com.cubusmail.gwtui.client.services.IUserAccountService#createContactFolder * (com.cubusmail.gwtui.domain.ContactFolder) */ public ContactFolder createContactFolder(String folderName) { ContactFolder folder = new ContactFolder(); folder.setFolderName(folderName); UserAccount account = SessionManager.get().getUserAccount(); folder.setUserAccount(account); getUserAccountDao().saveContactFolder(folder); return folder; } /* * (non-Javadoc) * * @see * com.cubusmail.gwtui.client.services.IUserAccountService#saveContactFolder * (com.cubusmail.gwtui.domain.ContactFolder) */ public void saveContactFolder(ContactFolder folder) { UserAccount account = SessionManager.get().getUserAccount(); folder.setUserAccount(account); getUserAccountDao().saveContactFolder(folder); } /* * (non-Javadoc) * * @see * com.cubusmail.gwtui.client.services.IUserAccountService#deleteContactFolder * (com.cubusmail.gwtui.domain.ContactFolder) */ public void deleteContactFolder(ContactFolder folder) { getUserAccountDao().deleteContactFolder(folder); } /* * (non-Javadoc) * * @see * com.cubusmail.gwtui.client.services.IUserAccountService#retrieveContactArray * () */ @SuppressWarnings("unchecked") public String[][] retrieveContactArray(ContactFolder folder, String sortField, String sortDirection) { List<Contact> contactList = getUserAccountDao().retrieveContactList(folder); if (contactList != null && contactList.size() > 0) { if (!StringUtils.isEmpty(sortField)) { boolean ascending = "ASC".equals(sortDirection); String fieldName = null; if (sortField.equals(ContactListFields.DISPLAY_NAME.name())) { fieldName = "displayName"; } else if (sortField.equals(ContactListFields.EMAIL.name())) { fieldName = "email"; } else if (sortField.equals(ContactListFields.COMPANY.name())) { fieldName = "company"; } Comparator comparator = null; if (ascending) { comparator = new BeanComparator(fieldName); } else { comparator = new ReverseComparator(new BeanComparator(fieldName)); } Collections.sort(contactList, comparator); } String[][] array = new String[contactList.size()][ContactListFields.values().length]; for (int i = 0; i < contactList.size(); i++) { array[i][ContactListFields.ID.ordinal()] = Long.toString(contactList.get(i).getId()); array[i][ContactListFields.DISPLAY_NAME.ordinal()] = contactList.get(i).getDisplayName(); array[i][ContactListFields.EMAIL.ordinal()] = contactList.get(i).getEmail(); array[i][ContactListFields.COMPANY.ordinal()] = contactList.get(i).getCompany(); array[i][ContactListFields.INTERNET_ADDRESS.ordinal()] = MessageUtils .toInternetAddress(contactList.get(i).getEmail(), contactList.get(i).getDisplayName()); } return array; } else { return new String[0][0]; } } /* * (non-Javadoc) * * @seecom.cubusmail.gwtui.client.services.IUserAccountService# * retrieveRecipientsArray() */ public String[][] retrieveRecipientsArray(String addressLine) { UserAccount account = SessionManager.get().getUserAccount(); String[] addressStrings = parsePreviousAndLastAddress(addressLine); String searchString = addressStrings[1]; List<Contact> contacts = getUserAccountDao().retrieveRecipients(account, searchString); if (contacts != null) { String[][] array = new String[contacts.size()][2]; for (int i = 0; i < contacts.size(); i++) { if (!StringUtils.isEmpty(addressStrings[0])) { array[i][0] = addressStrings[0] + ", " + MessageUtils .toInternetAddress(contacts.get(i).getEmail(), contacts.get(i).getDisplayName()); } else { array[i][0] = MessageUtils.toInternetAddress(contacts.get(i).getEmail(), contacts.get(i).getDisplayName()); } array[i][1] = HtmlUtils.htmlEscape(array[i][0]); } return array; } return new String[][] { { addressLine, addressLine } }; } /** * Parse out, the uncomplete Adresses * * @param addressLine * @return * @throws MessagingException */ public String[] parsePreviousAndLastAddress(String addressLine) { String[] result = new String[] { "", "" }; try { InternetAddress[] addresses = InternetAddress.parse(addressLine, false); if (addresses != null) { if (addresses.length > 1) { InternetAddress[] dest = new InternetAddress[addresses.length - 1]; for (int i = 0; i < addresses.length - 1; i++) { dest[i] = addresses[i]; } result[0] = MessageUtils.getMailAdressString(dest, AddressStringType.COMPLETE); } result[1] = addresses[addresses.length - 1].toUnicodeString(); } } catch (MessagingException e) { // should never happen log.error(e.getMessage()); } return result; } /* * (non-Javadoc) * * @see * com.cubusmail.gwtui.client.services.IUserAccountService#deleteContacts * (java.util.List) */ public void deleteContacts(Long[] ids) { getUserAccountDao().deleteContacts(ids); } /* * (non-Javadoc) * * @see * com.cubusmail.gwtui.client.services.IUserAccountService#moveContacts( * java.lang.Long[], com.cubusmail.gwtui.domain.ContactFolder) */ public void moveContacts(Long[] contactIds, ContactFolder targetFolder) { getUserAccountDao().moveContacts(contactIds, targetFolder); } /* * (non-Javadoc) * * @see * com.cubusmail.gwtui.client.services.IUserAccountService#saveContact(com * .cubusmail.gwtui.domain.Contact) */ public void saveContact(Contact contact) { getUserAccountDao().saveContact(contact); } /* * (non-Javadoc) * * @see * com.cubusmail.gwtui.client.services.IUserAccountService#retrieveContact * (java.lang.Long) */ public Contact retrieveContact(Long id) { return getUserAccountDao().getContactById(id); } /* * (non-Javadoc) * * @see * com.cubusmail.gwtui.client.services.IUserAccountService#retrieveTimezones * () */ public String[][] retrieveTimezones() { NumberFormat format = new DecimalFormat("00"); Locale locale = SessionManager.get().getLocale(); ResourceBundle bundle = ConvertUtil.getTimezonesBundle(locale); Enumeration<String> ids = bundle.getKeys(); List<TimeZone> timeZoneList = toSortedZimeZoneList(ids); String[][] result = new String[timeZoneList.size()][2]; int index = 0; for (TimeZone timeZone : timeZoneList) { result[index][0] = timeZone.getID(); String hours = format.format(timeZone.getRawOffset() / 3600000); if (timeZone.getRawOffset() >= 0) { result[index][1] = "(+" + hours + ":00) " + bundle.getString(timeZone.getID()); } else { result[index][1] = "(" + hours + ":00) " + bundle.getString(timeZone.getID()); } index++; } return result; } @SuppressWarnings("unchecked") private List<TimeZone> toSortedZimeZoneList(Enumeration<String> ids) { List<TimeZone> result = new ArrayList<TimeZone>(); while (ids.hasMoreElements()) { result.add(TimeZone.getTimeZone(ids.nextElement())); } Collections.sort(result, new BeanComparator("rawOffset")); return result; } }