001/**
002 * Copyright 2005-2018 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 */
016package org.kuali.rice.krad.uif.lifecycle;
017
018import java.io.Serializable;
019import java.text.MessageFormat;
020
021import org.apache.commons.lang.StringUtils;
022import org.kuali.rice.krad.messages.MessageService;
023import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
024import org.kuali.rice.krad.uif.UifConstants;
025import org.kuali.rice.krad.uif.util.ScriptUtils;
026import org.kuali.rice.krad.uif.view.View;
027import org.kuali.rice.krad.uif.view.ViewModel;
028import org.kuali.rice.krad.util.ErrorMessage;
029import org.kuali.rice.krad.util.GlobalVariables;
030import org.kuali.rice.krad.util.GrowlMessage;
031import org.kuali.rice.krad.util.KRADConstants;
032import org.kuali.rice.krad.util.MessageMap;
033
034/**
035 * @author Kuali Rice Team (rice.collab@kuali.org)
036 */
037public class LifecycleBase implements Serializable {
038    private static final long serialVersionUID = 9150578453981086356L;
039
040    public static void performPostLifecycleProcessing(View view, Object model, ViewPostMetadata viewPostMetadata) {
041        String growlScript = buildGrowlScript(view.isGrowlMessagingEnabled());
042        ((ViewModel) model).setGrowlScript(growlScript);
043
044    }
045
046    /**
047     * Builds JS script that will invoke the show growl method to display a growl message when the
048     * page is rendered.
049     *
050     * <p>A growl call will be created for any explicit growl messages added to the message map.</p>
051     *
052     * @param growlMessagingEnabled indicates whether growls have been enabled, if not any growl messages are
053     * written as info messages
054     * @return JS script string for generated growl messages
055     */
056    protected static String buildGrowlScript(boolean growlMessagingEnabled) {
057        StringBuilder growlScript = new StringBuilder();
058
059        MessageService messageService = KRADServiceLocatorWeb.getMessageService();
060
061        MessageMap messageMap = GlobalVariables.getMessageMap();
062        for (GrowlMessage growl : messageMap.getGrowlMessages()) {
063            if (growlMessagingEnabled) {
064                String message = messageService.getMessageText(growl.getNamespaceCode(), growl.getComponentCode(),
065                        growl.getMessageKey());
066
067                if (StringUtils.isBlank(message)) {
068                    continue;
069                }
070
071                if (growl.getMessageParameters() != null) {
072                    message = message.replace("'", "''");
073                    message = MessageFormat.format(message, (Object[]) growl.getMessageParameters());
074                }
075
076                // escape single quotes in message or title since that will cause problem with plugin
077                message = message.replace("'", "\\'");
078
079                String title = growl.getTitle();
080                if (StringUtils.isNotBlank(growl.getTitleKey())) {
081                    title = messageService.getMessageText(growl.getNamespaceCode(), growl.getComponentCode(),
082                            growl.getTitleKey());
083                }
084                title = title.replace("'", "\\'");
085
086                growlScript.append(ScriptUtils.buildFunctionCall(UifConstants.JsFunctions.SHOW_GROWL, message, title,
087                        growl.getTheme()));
088
089            } else {
090                ErrorMessage infoMessage = new ErrorMessage(growl.getMessageKey(), growl.getMessageParameters());
091                infoMessage.setNamespaceCode(growl.getNamespaceCode());
092                infoMessage.setComponentCode(growl.getComponentCode());
093
094                messageMap.putInfoForSectionId(KRADConstants.GLOBAL_INFO, infoMessage);
095            }
096        }
097
098        return growlScript.toString();
099    }
100
101}