001/**
002 * Copyright 2005-2016 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.service;
017
018import org.kuali.rice.kim.api.identity.Person;
019import org.kuali.rice.krad.document.Document;
020import org.kuali.rice.krad.document.authorization.PessimisticLock;
021
022import java.util.List;
023import java.util.Map;
024import java.util.Set;
025
026/**
027 * This is the service interface for documents to use the Pessimistic Locking mechanism 
028 * 
029 * @author Kuali Rice Team (rice.collab@kuali.org)
030 *
031 */
032public interface PessimisticLockService {
033    
034    /**
035     * This method deletes the given lock object
036     * 
037     * @param id - the id of the lock to delete
038     */
039    public void delete(String id);
040    
041    /**
042     * This method will generate a new {@link PessimisticLock} object with a 'document'
043     * lock descriptor
044     * 
045     * @param documentNumber - the document number of the document associated with the new lock
046     * @return the newly generated document descriptor {@link PessimisticLock}
047     */
048    public PessimisticLock generateNewLock(String documentNumber);
049
050    /**
051     * This method will generate a new {@link PessimisticLock} object with a lock descriptor of
052     * the given parameter
053     * 
054     * @param documentNumber - the document number of the document associated with the new lock
055     * @param lockDescriptor - the lock descriptor the new PessimisticLock object should contain
056     * @return the newly generated {@link PessimisticLock} containing the given lockDescriptor
057     */
058    public PessimisticLock generateNewLock(String documentNumber, String lockDescriptor);
059    
060    /**
061     * This method will generate a new {@link PessimisticLock} object with a 'document'
062     * lock descriptor
063     * 
064     * @param documentNumber - the document number of the document associated with the new lock
065     * @param user - the user to set on the new lock being generated
066     * @return the newly generated document descriptor {@link PessimisticLock}
067     */
068    public PessimisticLock generateNewLock(String documentNumber, Person user);
069
070    /**
071     * This method will generate a new {@link PessimisticLock} object with a lock descriptor of
072     * the given parameter
073     * 
074     * @param documentNumber - the document number of the document associated with the new lock
075     * @param lockDescriptor - the lock descriptor the new PessimisticLock object should contain
076     * @param user - the user to set on the new lock being generated
077     * @return the newly generated {@link PessimisticLock} containing the given lockDescriptor
078     */
079    public PessimisticLock generateNewLock(String documentNumber, String lockDescriptor, Person user);
080    
081    /**
082     * This method gets all locks associated with the given document number
083     * 
084     * @param documentNumber - the document number of the document requiring locks
085     * @return an empty list if no locks are found or the list of {@link PessimisticLock} objects
086     * found for the given documentNumber
087     */
088    public List<PessimisticLock> getPessimisticLocksForDocument(String documentNumber);
089
090    /**
091     * Return all locks associated with the given session id
092     *
093     * @param sessionId - the session id
094     * @return an empty list of no locks are found or the list of {@link PessimisticLock} objects
095     * found for the given sessionId
096     */
097    public List<PessimisticLock> getPessimisticLocksForSession(String sessionId);
098    
099    /**
100     * This method is used to identify who is an admin user for {@link PessimisticLock} objects
101     * 
102     * @param user - user to verify as admin
103     * @return true if the given use is an admin user or false if not
104     */
105    public boolean isPessimisticLockAdminUser(Person user);
106    
107    /**
108     * This method will release all locks in the given list that are owned by the given user
109     * 
110     * @param locks - locks to release if owned by given user
111     * @param user - user to check for lock ownership
112     */
113    public void releaseAllLocksForUser(List<PessimisticLock> locks, Person user);
114
115    /**
116     * This method will release all locks in the given list that are owned by the given user that have a matching lock
117     * descriptor value
118     * 
119     * @param locks - locks to release if owned by given user
120     * @param user - user to check for lock ownership
121     * @param lockDescriptor - lock descriptor value to match locks against
122     */
123    public void releaseAllLocksForUser(List<PessimisticLock> locks, Person user, String lockDescriptor);
124
125    /**
126     * This method saves the given lock object
127     * 
128     */
129    public PessimisticLock save(PessimisticLock lock);
130    
131    /**
132     * @param document - the document locks are to be established against or by
133     * @param editMode - the editMode returned by the method {@link #getEditMode(Document, Person)}
134     * @param user - the user locks are being established for
135     * @return New map generated by locking logic combined with passed in parameter editMode.  Map contains keys 
136     *         AuthorizationConstants.EditMode value (String) which indicates what operations the user is currently 
137     *         allowed to take on that document.  This may be a modified list of 
138     */
139    public Map establishLocks(Document document, Map editMode, Person user);
140
141    /**
142     * @param document - the document to create the lock against and add the lock to
143     */
144    public void establishWorkflowPessimisticLocking(Document document);
145
146    /**
147     * @param document - document to release locks from
148     */
149    public void releaseWorkflowPessimisticLocking(Document document);
150    
151    /**
152     * @param document
153     * @param user
154     * @return Set of actions are permitted the given user on the given document
155     */
156    public Set getDocumentActions(Document document, Person user, Set<String> documentActions);
157  
158}
159