001    /**
002     * Copyright 2005-2013 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.ken.web.spring;
017    
018    import org.apache.commons.lang.StringUtils;
019    import org.apache.log4j.Logger;
020    import org.kuali.rice.core.api.exception.RiceIllegalArgumentException;
021    import org.kuali.rice.coreservice.api.namespace.Namespace;
022    import org.kuali.rice.coreservice.api.namespace.NamespaceService;
023    import org.kuali.rice.ken.exception.ErrorList;
024    import org.kuali.rice.kim.api.group.Group;
025    import org.kuali.rice.kim.api.group.GroupService;
026    import org.kuali.rice.kim.api.identity.IdentityService;
027    import org.kuali.rice.kim.api.identity.principal.Principal;
028    import org.kuali.rice.kim.api.services.KimApiServiceLocator;
029    import org.kuali.rice.krad.service.KRADServiceLocatorInternal;
030    import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
031    
032    import javax.servlet.http.HttpServletRequest;
033    import java.util.ArrayList;
034    import java.util.List;
035    
036    /**
037     * Base class for KEN controllers for sending notifications
038     *
039     * @author Kuali Rice Team (rice.collab@kuali.org)
040     *
041     */
042    public class BaseSendNotificationController extends MultiActionController {
043        private static final Logger LOG = Logger.getLogger(BaseSendNotificationController.class);
044    
045        private static final String USER_RECIPS_PARAM = "userRecipients";
046        private static final String WORKGROUP_RECIPS_PARAM = "workgroupRecipients";
047        private static final String WORKGROUP_NAMESPACE_CODES_PARAM = "workgroupNamespaceCodes";
048        private static final String SPLIT_REGEX = "(%2C|,)";
049        
050        private static IdentityService identityService;
051        private static GroupService groupService;
052        private static NamespaceService namespaceService;
053    
054        protected static IdentityService getIdentityService() {
055            if ( identityService == null ) {
056                identityService = KimApiServiceLocator.getIdentityService();
057            }
058            return identityService;
059        }
060    
061        protected static GroupService getGroupService() {
062            if ( groupService == null ) {
063                groupService = KimApiServiceLocator.getGroupService();
064            }
065            return groupService;
066        }
067        
068        protected static NamespaceService getNamespaceService() {
069            if ( namespaceService == null ) {
070                namespaceService = KRADServiceLocatorInternal.getNamespaceService();
071            }
072            return namespaceService;
073        }
074        
075        protected String[] parseUserRecipients(HttpServletRequest request) {
076            return parseCommaSeparatedValues(request, USER_RECIPS_PARAM);
077        }
078    
079        protected String[] parseWorkgroupRecipients(HttpServletRequest request) {
080            return parseCommaSeparatedValues(request, WORKGROUP_RECIPS_PARAM);
081        }
082    
083        protected String[] parseWorkgroupNamespaceCodes(HttpServletRequest request) {
084            return parseCommaSeparatedValues(request, WORKGROUP_NAMESPACE_CODES_PARAM);
085        }
086        
087        protected String[] parseCommaSeparatedValues(HttpServletRequest request, String param) {
088            String vals = request.getParameter(param);
089            if (vals != null) {
090                String[] split = vals.split(SPLIT_REGEX);
091                List<String> strs = new ArrayList<String>();
092                for (String component: split) {
093                    if (StringUtils.isNotBlank(component)) {
094                        strs.add(component.trim());
095                    }
096                }
097                return strs.toArray(new String[strs.size()]);
098            } else {
099                return new String[0];
100            }
101        }
102    
103        protected boolean isUserRecipientValid(String user, ErrorList errors) {
104            boolean valid = true;
105            Principal principal = getIdentityService().getPrincipalByPrincipalName(user);
106            if (principal == null) {
107                    valid = false;
108                    errors.addError("'" + user + "' is not a valid principal name");
109            }
110    
111            return valid;
112        }
113    
114        protected boolean isWorkgroupRecipientValid(String groupName, String namespaceCode, ErrorList errors) {
115            Namespace nSpace = getNamespaceService().getNamespace(namespaceCode);
116            if (nSpace == null) {
117                    errors.addError((new StringBuilder()).append('\'').append(namespaceCode).append("' is not a valid namespace code").toString());
118                    return false;
119            } else {
120                    Group i = getGroupService().getGroupByNamespaceCodeAndName(namespaceCode, groupName);
121                    if (i == null) {
122                            errors.addError((new StringBuilder()).append('\'').append(groupName).append(
123                                            "' is not a valid group name for namespace code '").append(namespaceCode).append('\'').toString());
124                            return false;
125                    } else {
126                            return true;
127                    }
128            }
129        }
130        protected String getPrincipalIdFromIdOrName(String principalIdOrName) {
131            Principal principal = KimApiServiceLocator.getIdentityService().getPrincipal(principalIdOrName);
132            if (principal == null) {
133                principal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName(principalIdOrName);
134            }
135            if (principal == null) {
136                throw new RiceIllegalArgumentException("Could not locate a principal as initiator with the given remoteUser of " + principalIdOrName);
137            }
138            return principal.getPrincipalId();
139        }
140    }