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}