001 /*
002 * Copyright 2007-2010 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.kns.web;
017
018 import java.util.HashMap;
019 import java.util.HashSet;
020 import java.util.LinkedList;
021 import java.util.Map;
022 import java.util.Queue;
023 import java.util.Set;
024
025 import org.kuali.rice.kns.service.KNSServiceLocator;
026 import org.kuali.rice.kns.service.KualiConfigurationService;
027 import org.kuali.rice.kns.util.Guid;
028
029 /**
030 * A class which will hold a Map of editable properties, dropping editable properties when too many
031 * are filled in.
032 *
033 * @author Kuali Rice Team (rice.collab@kuali.org)
034 *
035 */
036 public class EditablePropertiesHistoryHolder implements java.io.Serializable {
037 private Map<String, Set<String>> editablePropertiesMap;
038 private Integer maxLength = null;
039 private Queue<String> historyOrder;
040 private static final String EDITABLE_PROPERTIES_HISTORY_SIZE_PROPERTY_NAME = "kns.editable.properties.history.size";
041 private transient KualiConfigurationService configurationService;
042
043 /**
044 * Constructs the EditablePropertiesHistoryHolder
045 *
046 */
047 public EditablePropertiesHistoryHolder() {
048 editablePropertiesMap = new HashMap<String, Set<String>>();
049 historyOrder = new LinkedList<String>();
050 }
051
052 /**
053 * @return the maximum length of the history that this will hold
054 */
055 public int getMaxHistoryLength() {
056 if (maxLength == null) {
057 final String historyLengthAsString = getConfigurationService().getPropertyString(EditablePropertiesHistoryHolder.EDITABLE_PROPERTIES_HISTORY_SIZE_PROPERTY_NAME);
058 if (historyLengthAsString == null) {
059 maxLength = new Integer(20);
060 } else {
061 try {
062 maxLength = new Integer(historyLengthAsString);
063 } catch (NumberFormatException nfe) {
064 throw new RuntimeException("Cannot convert property "+EditablePropertiesHistoryHolder.EDITABLE_PROPERTIES_HISTORY_SIZE_PROPERTY_NAME+" with value "+historyLengthAsString+" to integer", nfe);
065 }
066 }
067 }
068 return maxLength.intValue();
069 }
070
071 /**
072 * Adds a Set of editable property names to the history, keyed with the given guid String. If the editable properties exceeds the buffer size,
073 * the earliest editable properties will be bumped
074 * @param editableProperties the Set of editable property names to save in the history
075 * @return a String to act as a key (or guid) to the editable properties
076 */
077 public String addEditablePropertiesToHistory(Set<String> editableProperties) {
078 String guid = generateNewGuid();
079
080 if (getHistoryOrder().size() > getMaxHistoryLength()) {
081 final String guidForRemoval = getHistoryOrder().remove();
082 getEditablePropertiesMap().remove(guidForRemoval);
083 }
084 getHistoryOrder().add(guid);
085 getEditablePropertiesMap().put(guid, editableProperties);
086
087 return guid;
088 }
089
090 /**
091 *
092 * @return a newly generated Guid to act as a key to an editable properties Set
093 */
094 public String generateNewGuid() {
095 final String guid = new Guid().toString();
096 return guid;
097 }
098
099 /**
100 * Returns the editable properties registered with the current guid
101 * @param guid the guid to find editable properties for
102 * @return a Set<String> of editable properties
103 */
104 public Set<String> getEditableProperties(String guid) {
105 return getEditablePropertiesMap().get(guid);
106 }
107
108 /**
109 * Clears out the editable properties associated with the given guid
110 * @param guid the guid to clear out editable properties for
111 */
112 public void clearEditableProperties(String guid) {
113 getEditablePropertiesMap().put(guid, createNewEditablePropertiesEntry());
114 }
115
116 /**
117 * @return the order of the entries as they chronologically were created
118 */
119 protected Queue<String> getHistoryOrder() {
120 return historyOrder;
121 }
122
123 /**
124 * @return the Map which associates editable property guids with Sets of editable property names
125 */
126 protected Map<String, Set<String>> getEditablePropertiesMap() {
127 return editablePropertiesMap;
128 }
129
130 /**
131 * @return a new Entry to hold the names of editable properties
132 */
133 protected Set<String> createNewEditablePropertiesEntry() {
134 return new HashSet<String>();
135 }
136
137 /**
138 * @return an implementation of the KualiConfigurationService
139 */
140 protected KualiConfigurationService getConfigurationService() {
141 if (configurationService == null) {
142 configurationService = KNSServiceLocator.getKualiConfigurationService();
143 }
144 return configurationService;
145 }
146 }