001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portal.service.impl;
016    
017    import com.liferay.portal.MembershipRequestCommentsException;
018    import com.liferay.portal.kernel.exception.PortalException;
019    import com.liferay.portal.kernel.exception.SystemException;
020    import com.liferay.portal.kernel.language.LanguageUtil;
021    import com.liferay.portal.kernel.mail.MailMessage;
022    import com.liferay.portal.kernel.util.PropsKeys;
023    import com.liferay.portal.kernel.util.StringUtil;
024    import com.liferay.portal.kernel.util.Validator;
025    import com.liferay.portal.model.Company;
026    import com.liferay.portal.model.Group;
027    import com.liferay.portal.model.MembershipRequest;
028    import com.liferay.portal.model.MembershipRequestConstants;
029    import com.liferay.portal.model.Role;
030    import com.liferay.portal.model.RoleConstants;
031    import com.liferay.portal.model.User;
032    import com.liferay.portal.model.UserGroupRole;
033    import com.liferay.portal.service.base.MembershipRequestLocalServiceBaseImpl;
034    import com.liferay.portal.util.PrefsPropsUtil;
035    import com.liferay.util.UniqueList;
036    
037    import java.io.IOException;
038    
039    import java.util.Date;
040    import java.util.List;
041    
042    import javax.mail.internet.InternetAddress;
043    
044    /**
045     * @author Jorge Ferrer
046     */
047    public class MembershipRequestLocalServiceImpl
048            extends MembershipRequestLocalServiceBaseImpl {
049    
050            public MembershipRequest addMembershipRequest(
051                            long userId, long groupId, String comments)
052                    throws PortalException, SystemException {
053    
054                    User user = userPersistence.findByPrimaryKey(userId);
055                    Date now = new Date();
056    
057                    validate(comments);
058    
059                    long membershipRequestId = counterLocalService.increment();
060    
061                    MembershipRequest membershipRequest =
062                            membershipRequestPersistence.create(membershipRequestId);
063    
064                    membershipRequest.setCompanyId(user.getCompanyId());
065                    membershipRequest.setUserId(userId);
066                    membershipRequest.setCreateDate(now);
067                    membershipRequest.setGroupId(groupId);
068                    membershipRequest.setComments(comments);
069                    membershipRequest.setStatusId(
070                            MembershipRequestConstants.STATUS_PENDING);
071    
072                    membershipRequestPersistence.update(membershipRequest, false);
073    
074                    try {
075                            notifyCommunityAdministrators(membershipRequest);
076                    }
077                    catch (IOException ioe) {
078                            throw new SystemException(ioe);
079                    }
080    
081                    return membershipRequest;
082            }
083    
084            public MembershipRequest getMembershipRequest(long membershipRequestId)
085                    throws PortalException, SystemException {
086    
087                    return membershipRequestPersistence.findByPrimaryKey(
088                            membershipRequestId);
089            }
090    
091            public void deleteMembershipRequests(long groupId) throws SystemException {
092                    membershipRequestPersistence.removeByGroupId(groupId);
093            }
094    
095            public void deleteMembershipRequests(long groupId, int statusId)
096                    throws SystemException {
097    
098                    membershipRequestPersistence.removeByG_S(groupId, statusId);
099            }
100    
101            public List<MembershipRequest> search(
102                            long groupId, int status, int start, int end)
103                    throws SystemException {
104    
105                    return membershipRequestPersistence.findByG_S(
106                            groupId, status, start, end);
107            }
108    
109            public int searchCount(long groupId, int status) throws SystemException {
110                    return membershipRequestPersistence.countByG_S(groupId, status);
111            }
112    
113            public void updateStatus(
114                            long replierUserId, long membershipRequestId, String replyComments,
115                            int statusId)
116                    throws PortalException, SystemException {
117    
118                    validate(replyComments);
119    
120                    MembershipRequest membershipRequest =
121                            membershipRequestPersistence.findByPrimaryKey(
122                                    membershipRequestId);
123    
124                    membershipRequest.setReplyComments(replyComments);
125                    membershipRequest.setReplyDate(new Date());
126                    membershipRequest.setReplierUserId(replierUserId);
127                    membershipRequest.setStatusId(statusId);
128    
129                    membershipRequestPersistence.update(membershipRequest, false);
130    
131                    if (statusId == MembershipRequestConstants.STATUS_APPROVED) {
132                            long[] addUserIds = new long[] {membershipRequest.getUserId()};
133    
134                            userLocalService.addGroupUsers(
135                                    membershipRequest.getGroupId(), addUserIds);
136                    }
137    
138                    try {
139                            notify(
140                                    membershipRequest.getUserId(), membershipRequest,
141                                    PropsKeys.COMMUNITIES_EMAIL_MEMBERSHIP_REPLY_SUBJECT,
142                                    PropsKeys.COMMUNITIES_EMAIL_MEMBERSHIP_REPLY_BODY);
143                    }
144                    catch (IOException ioe) {
145                            throw new SystemException(ioe);
146                    }
147            }
148    
149            protected void notify(
150                            long userId, MembershipRequest membershipRequest,
151                            String subjectProperty, String bodyProperty)
152                    throws IOException, PortalException, SystemException {
153    
154                    Company company = companyPersistence.findByPrimaryKey(
155                            membershipRequest.getCompanyId());
156    
157                    Group group = groupPersistence.findByPrimaryKey(
158                            membershipRequest.getGroupId());
159    
160                    User user = userPersistence.findByPrimaryKey(userId);
161                    User requestUser = userPersistence.findByPrimaryKey(
162                            membershipRequest.getUserId());
163    
164                    String fromName = PrefsPropsUtil.getString(
165                            membershipRequest.getCompanyId(),
166                            PropsKeys.COMMUNITIES_EMAIL_FROM_NAME);
167    
168                    String fromAddress = PrefsPropsUtil.getString(
169                            membershipRequest.getCompanyId(),
170                            PropsKeys.COMMUNITIES_EMAIL_FROM_ADDRESS);
171    
172                    String toName = user.getFullName();
173                    String toAddress = user.getEmailAddress();
174    
175                    String subject = PrefsPropsUtil.getContent(
176                            membershipRequest.getCompanyId(), subjectProperty);
177    
178                    String body = PrefsPropsUtil.getContent(
179                            membershipRequest.getCompanyId(), bodyProperty);
180    
181                    String statusKey = null;
182    
183                    if (membershipRequest.getStatusId() ==
184                                    MembershipRequestConstants.STATUS_APPROVED) {
185    
186                            statusKey = "approved";
187                    }
188                    else if (membershipRequest.getStatusId() ==
189                                            MembershipRequestConstants.STATUS_DENIED) {
190    
191                            statusKey = "denied";
192                    }
193                    else {
194                            statusKey = "pending";
195                    }
196    
197                    subject = StringUtil.replace(
198                            subject,
199                            new String[] {
200                                    "[$COMMUNITY_NAME$]",
201                                    "[$COMPANY_ID$]",
202                                    "[$COMPANY_MX$]",
203                                    "[$COMPANY_NAME$]",
204                                    "[$FROM_ADDRESS$]",
205                                    "[$FROM_NAME$]",
206                                    "[$PORTAL_URL$]",
207                                    "[$REQUEST_USER_ADDRESS$]",
208                                    "[$REQUEST_USER_NAME$]",
209                                    "[$STATUS$]",
210                                    "[$TO_NAME$]",
211                                    "[$USER_ADDRESS$]",
212                                    "[$USER_NAME$]",
213                            },
214                            new String[] {
215                                    group.getName(),
216                                    String.valueOf(company.getCompanyId()),
217                                    company.getMx(),
218                                    company.getName(),
219                                    fromAddress,
220                                    fromName,
221                                    company.getVirtualHost(),
222                                    requestUser.getEmailAddress(),
223                                    requestUser.getFullName(),
224                                    LanguageUtil.get(user.getLocale(), statusKey),
225                                    toName,
226                                    user.getEmailAddress(),
227                                    user.getFullName()
228                            });
229    
230                    body = StringUtil.replace(
231                            body,
232                            new String[] {
233                                    "[$COMMENTS$]",
234                                    "[$COMMUNITY_NAME$]",
235                                    "[$COMPANY_ID$]",
236                                    "[$COMPANY_MX$]",
237                                    "[$COMPANY_NAME$]",
238                                    "[$FROM_ADDRESS$]",
239                                    "[$FROM_NAME$]",
240                                    "[$PORTAL_URL$]",
241                                    "[$REPLY_COMMENTS$]",
242                                    "[$REQUEST_USER_NAME$]",
243                                    "[$REQUEST_USER_ADDRESS$]",
244                                    "[$STATUS$]",
245                                    "[$TO_NAME$]",
246                                    "[$USER_ADDRESS$]",
247                                    "[$USER_NAME$]",
248                            },
249                            new String[] {
250                                    membershipRequest.getComments(),
251                                    group.getName(),
252                                    String.valueOf(company.getCompanyId()),
253                                    company.getMx(),
254                                    company.getName(),
255                                    fromAddress,
256                                    fromName,
257                                    company.getVirtualHost(),
258                                    membershipRequest.getReplyComments(),
259                                    requestUser.getFullName(),
260                                    requestUser.getEmailAddress(),
261                                    LanguageUtil.get(user.getLocale(), statusKey),
262                                    toName,
263                                    user.getEmailAddress(),
264                                    user.getFullName()
265                            });
266    
267                    InternetAddress from = new InternetAddress(fromAddress, fromName);
268    
269                    InternetAddress to = new InternetAddress(toAddress, toName);
270    
271                    MailMessage message = new MailMessage(from, to, subject, body, true);
272    
273                    mailService.sendEmail(message);
274            }
275    
276            protected void notifyCommunityAdministrators(
277                            MembershipRequest membershipRequest)
278                    throws IOException, PortalException, SystemException {
279    
280                    List<UserGroupRole> admins = new UniqueList<UserGroupRole>();
281    
282                    Role communityAdminRole = roleLocalService.getRole(
283                            membershipRequest.getCompanyId(),
284                            RoleConstants.COMMUNITY_ADMINISTRATOR);
285    
286                    List<UserGroupRole> communityAdmins =
287                            userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
288                                    membershipRequest.getGroupId(), communityAdminRole.getRoleId());
289    
290                    admins.addAll(communityAdmins);
291    
292                    Role communityOwnerRole = rolePersistence.findByC_N(
293                            membershipRequest.getCompanyId(), RoleConstants.COMMUNITY_OWNER);
294    
295                    List<UserGroupRole> communityOwners =
296                            userGroupRoleLocalService.getUserGroupRolesByGroupAndRole(
297                                    membershipRequest.getGroupId(), communityOwnerRole.getRoleId());
298    
299                    admins.addAll(communityOwners);
300    
301                    for (UserGroupRole userGroupRole : admins) {
302                            notify(
303                                    userGroupRole.getUserId(), membershipRequest,
304                                    PropsKeys.COMMUNITIES_EMAIL_MEMBERSHIP_REQUEST_SUBJECT,
305                                    PropsKeys.COMMUNITIES_EMAIL_MEMBERSHIP_REQUEST_BODY);
306                    }
307            }
308    
309            protected void validate(String comments)
310                    throws PortalException {
311    
312                    if ((Validator.isNull(comments)) || (Validator.isNumber(comments))) {
313                            throw new MembershipRequestCommentsException();
314                    }
315            }
316    
317    }