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.view;
017
018import org.apache.commons.lang.StringUtils;
019import org.kuali.rice.core.api.util.RiceConstants;
020import org.kuali.rice.core.api.util.RiceKeyConstants;
021import org.kuali.rice.kim.api.identity.Person;
022import org.kuali.rice.krad.datadictionary.parse.BeanTag;
023import org.kuali.rice.krad.document.Document;
024import org.kuali.rice.krad.document.authorization.PessimisticLock;
025import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
026import org.kuali.rice.krad.service.PessimisticLockService;
027import org.kuali.rice.krad.uif.UifConstants;
028import org.kuali.rice.krad.util.GlobalVariables;
029import org.kuali.rice.krad.util.KRADConstants;
030import org.kuali.rice.krad.web.form.TransactionalDocumentFormBase;
031import org.kuali.rice.krad.uif.util.LifecycleElement;
032
033/**
034 * View type for Transactional documents.
035 *
036 * @author Kuali Rice Team (rice.collab@kuali.org)
037 */
038@BeanTag(name = "transactionalDocumentView", parent = "Uif-TransactionalDocumentView")
039public class TransactionalDocumentView extends DocumentView {
040
041    private static final long serialVersionUID = 4375336878804984171L;
042
043    private PessimisticLockService pessimisticLockService;
044
045    public TransactionalDocumentView() {
046        super();
047
048        setViewTypeName(UifConstants.ViewType.TRANSACTIONAL);
049    }
050
051    /**
052     * {@inheritDoc}
053     *
054     * <p>
055     * Locks the document if pessimistic locking is turned on.
056     * </p>
057     */
058    @Override
059    public void performFinalize(Object model, LifecycleElement parent) {
060        super.performFinalize(model, parent);
061
062        if (getDocumentEntryForView().getUsePessimisticLocking()) {
063            TransactionalDocumentFormBase form = (TransactionalDocumentFormBase) model;
064
065            generatePessimisticLockMessages(form);
066            setupPessimisticLockingTimeout(form);
067        }
068    }
069
070    /**
071     * Generates the messages that warn users that the document has been locked for editing by another user.
072     *
073     * @param form form instance containing the transactional document data
074     */
075    protected void generatePessimisticLockMessages(TransactionalDocumentFormBase form) {
076        Document document = form.getDocument();
077        Person user = GlobalVariables.getUserSession().getPerson();
078
079        for (PessimisticLock lock : document.getPessimisticLocks()) {
080            if (!lock.isOwnedByUser(user)) {
081                String lockDescriptor = StringUtils.defaultIfBlank(lock.getLockDescriptor(), "full");
082                String lockOwner = lock.getOwnedByUser().getName();
083                String lockTime = RiceConstants.getDefaultTimeFormat().format(lock.getGeneratedTimestamp());
084                String lockDate = RiceConstants.getDefaultDateFormat().format(lock.getGeneratedTimestamp());
085
086                GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS,
087                        RiceKeyConstants.ERROR_TRANSACTIONAL_LOCKED, lockDescriptor, lockOwner, lockTime, lockDate);
088            }
089        }
090    }
091
092    /**
093     * Enables the session timeout warning if any pessimistic locks exist.
094     *
095     * @param form form instance containing the transactional document data
096     */
097    protected void setupPessimisticLockingTimeout(TransactionalDocumentFormBase form) {
098        Document document = form.getDocument();
099
100        if (!document.getPessimisticLocks().isEmpty()) {
101            form.getView().getSessionPolicy().setEnableTimeoutWarning(true);
102        }
103    }
104
105    protected PessimisticLockService getPessimisticLockService() {
106        if (pessimisticLockService == null) {
107            pessimisticLockService = KRADServiceLocatorWeb.getPessimisticLockService();
108        }
109
110        return pessimisticLockService;
111    }
112
113    protected void setPessimisticLockService(PessimisticLockService pessimisticLockService) {
114        this.pessimisticLockService = pessimisticLockService;
115    }
116
117}