001 /**
002 * Copyright 2005-2013 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.krad.datadictionary.state;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.kuali.rice.core.api.config.property.ConfigurationService;
020 import org.kuali.rice.krad.datadictionary.parse.BeanTag;
021 import org.kuali.rice.krad.datadictionary.parse.BeanTagAttribute;
022 import org.kuali.rice.krad.datadictionary.parse.BeanTags;
023 import org.kuali.rice.krad.datadictionary.validator.ValidationTrace;
024 import org.kuali.rice.krad.service.KRADServiceLocator;
025 import org.kuali.rice.krad.uif.util.ObjectPropertyUtils;
026
027 import java.util.ArrayList;
028 import java.util.List;
029 import java.util.Map;
030
031 /**
032 * Base implementation of StateMapping.
033 *
034 * @author Kuali Rice Team (rice.collab@kuali.org)
035 * @see StateMapping
036 * @since 2.2
037 */
038 @BeanTags({@BeanTag(name = "stateMapping-bean", parent = "StateMapping"),
039 @BeanTag(name = "workflowStateMapping-bean", parent = "workflowStateMapping")})
040 public class StateMappingBase implements StateMapping {
041
042 private Map<String, String> stateNameMessageKeyMap;
043 private List<String> states;
044 private String statePropertyName;
045 private Map<String, String> customClientSideValidationStates;
046
047 /**
048 * @see StateMapping#getStateNameMessage(String)
049 */
050 @Override
051 public String getStateNameMessage(String state) {
052 String message = null;
053 if (StringUtils.isNotBlank(state) && this.getStates().contains(state)) {
054 if (this.getStateNameMessageKeyMap() != null) {
055 ConfigurationService configService = KRADServiceLocator.getKualiConfigurationService();
056 String key = this.getStateNameMessageKeyMap().get(state);
057 message = configService.getPropertyValueAsString(key);
058 }
059
060 if (message == null) {
061 message = state;
062 }
063 }
064 return message;
065 }
066
067 /**
068 * @see StateMapping#getCurrentState(Object object)
069 */
070 @Override
071 public String getCurrentState(Object object) {
072 return ObjectPropertyUtils.getPropertyValue(object, this.getStatePropertyName());
073 }
074
075 /**
076 * @see StateMapping#getNextState(Object)
077 */
078 @Override
079 public String getNextState(Object object) {
080 int currentStateIndex = this.getStates().indexOf(this.getCurrentState(object));
081 if (currentStateIndex != -1) {
082 int index = currentStateIndex + 1;
083 if (index == this.getStates().size()) {
084 return this.getCurrentState(object);
085 } else {
086 return this.getStates().get(index);
087 }
088 } else {
089 return this.getCurrentState(object);
090 }
091 }
092
093 /**
094 * @see org.kuali.rice.krad.datadictionary.state.StateMapping#getStateNameMessageKeyMap()
095 */
096 @Override
097 @BeanTagAttribute(name = "stateNameMessageKeyMap", type = BeanTagAttribute.AttributeType.MAPVALUE)
098 public Map<String, String> getStateNameMessageKeyMap() {
099 return stateNameMessageKeyMap;
100 }
101
102 /**
103 * @see StateMapping#setStateNameMessageKeyMap(java.util.Map)
104 */
105 @Override
106 public void setStateNameMessageKeyMap(Map<String, String> stateNameMessageKeyMap) {
107 this.stateNameMessageKeyMap = stateNameMessageKeyMap;
108 }
109
110 /**
111 * @see org.kuali.rice.krad.datadictionary.state.StateMapping#getStates()
112 */
113 @Override
114 @BeanTagAttribute(name = "states", type = BeanTagAttribute.AttributeType.LISTVALUE)
115 public List<String> getStates() {
116 if (states == null) {
117 states = new ArrayList<String>();
118 }
119 return states;
120 }
121
122 /**
123 * @see StateMapping#setStates(java.util.List)
124 */
125 @Override
126 public void setStates(List<String> states) {
127 this.states = states;
128 }
129
130 /**
131 * @see org.kuali.rice.krad.datadictionary.state.StateMapping#getStatePropertyName()
132 */
133 @Override
134 @BeanTagAttribute(name = "statePropertyName")
135 public String getStatePropertyName() {
136 return statePropertyName;
137 }
138
139 /**
140 * @see StateMapping#setStatePropertyName(String)
141 */
142 @Override
143 public void setStatePropertyName(String statePropertyName) {
144 this.statePropertyName = statePropertyName;
145 }
146
147 /**
148 * @see org.kuali.rice.krad.datadictionary.state.StateMapping#getCustomClientSideValidationStates()
149 */
150 @BeanTagAttribute(name = "customClientSideValidationStates", type = BeanTagAttribute.AttributeType.MAPVALUE)
151 public Map<String, String> getCustomClientSideValidationStates() {
152 return customClientSideValidationStates;
153 }
154
155 /**
156 * @see StateMapping#setCustomClientSideValidationStates(java.util.Map)
157 */
158 public void setCustomClientSideValidationStates(Map<String, String> customClientSideValidationStates) {
159 this.customClientSideValidationStates = customClientSideValidationStates;
160 }
161
162 /**
163 * @see StateMapping#completeValidation(org.kuali.rice.krad.datadictionary.validator.ValidationTrace)
164 */
165 public void completeValidation(ValidationTrace tracer) {
166 tracer.addBean("StateMappingBase", getStatePropertyName());
167
168 // Checking that propertyName is set
169 if (getStatePropertyName() == null) {
170 String currentValues[] = {"statePropertyName = null"};
171 tracer.createWarning("The State Property Name must be set", currentValues);
172 }
173
174 // Checking that states are set
175 if (getStates() == null) {
176 String currentValues[] = {"states = null"};
177 tracer.createWarning("States should be set", currentValues);
178 }
179 }
180 }