001 /**
002 * Copyright 2005-2014 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.krms.impl.repository;
017
018
019 import java.util.Collection;
020 import java.util.Collections;
021 import java.util.HashMap;
022 import java.util.HashSet;
023 import java.util.List;
024 import java.util.Map;
025 import java.util.Set;
026
027 import org.apache.commons.lang.StringUtils;
028 import org.kuali.rice.krad.service.BusinessObjectService;
029 import org.kuali.rice.krms.api.repository.proposition.PropositionDefinition;
030 import org.kuali.rice.krms.api.repository.proposition.PropositionParameter;
031
032 /**
033 * Implementation of the interface for accessing KRMS repository Proposition related
034 * business objects.
035 *
036 * @author Kuali Rice Team (rice.collab@kuali.org)
037 *
038 */
039 public final class PropositionBoServiceImpl implements PropositionBoService {
040
041 private BusinessObjectService businessObjectService;
042
043 /**
044 * This overridden method creates a Proposition if it does not
045 * already exist in the repository.
046 *
047 * @see org.kuali.rice.krms.impl.repository.PropositionBoService#createProposition(org.kuali.rice.krms.api.repository.proposition.PropositionDefinition)
048 */
049 @Override
050 public PropositionDefinition createProposition(PropositionDefinition prop) {
051 if (prop == null){
052 throw new IllegalArgumentException("proposition is null");
053 }
054 if (null != prop.getId()) {
055 throw new IllegalStateException("for creation, PropositionDefinition.id must be null");
056 }
057
058 PropositionBo propositionBo = PropositionBo.from(prop);
059 businessObjectService.save(propositionBo);
060 return PropositionBo.to(propositionBo);
061 }
062
063 /**
064 * This overridden method updates an existing proposition
065 *
066 * @see org.kuali.rice.krms.impl.repository.PropositionBoService#updateProposition(org.kuali.rice.krms.api.repository.proposition.PropositionDefinition)
067 */
068 @Override
069 public void updateProposition(PropositionDefinition prop) {
070 if (prop == null) {
071 throw new IllegalArgumentException("proposition is null");
072 }
073 final String propIdKey = prop.getId();
074 final PropositionDefinition existing = getPropositionById(propIdKey);
075 if (existing == null) {
076 throw new IllegalStateException("the proposition does not exist: " + prop);
077 }
078 final PropositionDefinition toUpdate;
079 if (!existing.getId().equals(prop.getId())){
080 final PropositionDefinition.Builder builder = PropositionDefinition.Builder.create(prop);
081 builder.setId(existing.getId());
082 toUpdate = builder.build();
083 } else {
084 toUpdate = prop;
085 }
086
087 businessObjectService.save(PropositionBo.from(toUpdate));
088 }
089
090 /**
091 * This overridden method retrieves a proposition by the give proposition id.
092 *
093 * @see org.kuali.rice.krms.impl.repository.PropositionBoService#getPropositionById(java.lang.String)
094 */
095 @Override
096 public PropositionDefinition getPropositionById(String propId) {
097 if (StringUtils.isBlank(propId)){
098 throw new IllegalArgumentException("propId is null or blank");
099 }
100 PropositionBo bo = businessObjectService.findBySinglePrimaryKey(PropositionBo.class, propId);
101 return PropositionBo.to(bo);
102 }
103
104 @Override
105 public Set<PropositionDefinition> getPropositionsByType(String typeId) {
106 if (org.apache.commons.lang.StringUtils.isBlank(typeId)) {
107 throw new IllegalArgumentException("typeId is null or blank");
108 }
109
110 final Map<String, Object> map = new HashMap<String, Object>();
111 map.put("typeId", typeId);
112 Collection<PropositionBo> bos = (Collection<PropositionBo>) businessObjectService.findMatching(PropositionBo.class, map);
113
114 return convertBosToImmutables(bos);
115 }
116
117 @Override
118 public Set<PropositionDefinition> getPropositionsByRule(String ruleId) {
119 if (org.apache.commons.lang.StringUtils.isBlank(ruleId)) {
120 throw new IllegalArgumentException("ruleId is null or blank");
121 }
122
123 final Map<String, Object> map = new HashMap<String, Object>();
124 map.put("ruleId", ruleId);
125 Collection<PropositionBo> bos = (Collection<PropositionBo>) businessObjectService.findMatching(PropositionBo.class, map);
126
127 return convertBosToImmutables(bos);
128 }
129
130 public Set<PropositionDefinition> convertBosToImmutables(final Collection<PropositionBo> propositionBos) {
131 Set<PropositionDefinition> immutables = new HashSet<PropositionDefinition>();
132 if (propositionBos != null) {
133 PropositionDefinition immutable = null;
134 for (PropositionBo bo : propositionBos ) {
135 immutable = to(bo);
136 immutables.add(immutable);
137 }
138 }
139 return Collections.unmodifiableSet(immutables);
140 }
141
142 public PropositionDefinition to(PropositionBo propositionBo) {
143 return PropositionBo.to(propositionBo);
144 }
145
146 /**
147 * This overridden method creates a PropositionParameter if it does not
148 * already exist in the repository.
149 *
150 * @see org.kuali.rice.krms.impl.repository.PropositionBoService#createParameter(org.kuali.rice.krms.api.repository.proposition.PropositionParameter)
151 */
152 @Override
153 public void createParameter(PropositionParameter parameter) {
154 if (parameter == null){
155 throw new IllegalArgumentException("parameter is null");
156 }
157 final String propIdKey = parameter.getPropId();
158 final Integer seqNoKey = parameter.getSequenceNumber();
159 final PropositionParameter existing = getParameterByPropIdAndSequenceNumber(propIdKey, seqNoKey);
160 if (existing != null && existing.getPropId().equals(propIdKey) && existing.getSequenceNumber().equals(seqNoKey)){
161 throw new IllegalStateException("the parameter to create already exists: " + parameter);
162 }
163
164 businessObjectService.save(PropositionParameterBo.from(parameter));
165 }
166
167 /**
168 * This overridden method updates an existing proposition parameter
169 *
170 * @see org.kuali.rice.krms.impl.repository.PropositionBoService#updateParameter(org.kuali.rice.krms.api.repository.proposition.PropositionParameter)
171 */
172 @Override
173 public void updateParameter(PropositionParameter parameter) {
174 if (parameter == null) {
175 throw new IllegalArgumentException("parameter is null");
176 }
177 final String propIdKey = parameter.getPropId();
178 final Integer seqNoKey = parameter.getSequenceNumber();
179 final PropositionParameter existing = getParameterByPropIdAndSequenceNumber(propIdKey, seqNoKey);
180 if (existing == null) {
181 throw new IllegalStateException("the parameter does not exist: " + parameter);
182 }
183 final PropositionParameter toUpdate;
184 if (!existing.getId().equals(parameter.getId())){
185 final PropositionParameter.Builder builder = PropositionParameter.Builder.create(parameter);
186 builder.setId(existing.getId());
187 toUpdate = builder.build();
188 } else {
189 toUpdate = parameter;
190 }
191
192 businessObjectService.save(PropositionParameterBo.from(toUpdate));
193 }
194
195 @Override
196 public void deleteProposition(String propId) {
197 if (propId == null){ throw new IllegalArgumentException("propId is null"); }
198 final PropositionDefinition existing = getPropositionById(propId);
199 if (existing == null){ throw new IllegalStateException("the Proposition to delete does not exists: " + propId);}
200
201 List<PropositionParameter> propositionParameters = existing.getParameters();
202 for( PropositionParameter prop : propositionParameters) {
203 businessObjectService.delete(PropositionParameterBo.from(prop));
204 }
205
206 businessObjectService.delete(from(existing));
207 }
208
209 /**
210 * This overridden method retrieves a list of parameters for a given proposition
211 *
212 * @see org.kuali.rice.krms.impl.repository.PropositionBoService#getParameters(java.lang.Long)
213 */
214 @Override
215 public List<PropositionParameter> getParameters(String propId) {
216 if (StringUtils.isBlank(propId)) {
217 throw new IllegalArgumentException("propId is null or blank");
218 }
219 final Map<String, Object> map = new HashMap<String, Object>();
220 map.put("propId", propId);
221 List<PropositionParameterBo> bos = (List<PropositionParameterBo>) businessObjectService.findMatchingOrderBy(PropositionParameterBo.class, map, "sequenceNumber", true);
222 return PropositionParameterBo.to(bos);
223 }
224
225 /**
226 * This overridden method gets a parameter by the parameter id
227 *
228 * @see org.kuali.rice.krms.impl.repository.PropositionBoService#getParameterById(java.lang.String)
229 */
230 @Override
231 public PropositionParameter getParameterById(String id) {
232 if (StringUtils.isBlank(id)) {
233 throw new IllegalArgumentException("id is null or blank");
234 }
235 PropositionParameterBo bo = businessObjectService.findBySinglePrimaryKey(PropositionParameterBo.class, id);
236 return PropositionParameterBo.to(bo);
237 }
238
239 /**
240 * This overridden method gets a parameter by the Proposition Id and Sequence Number
241 *
242 * @see org.kuali.rice.krms.impl.repository.PropositionBoService#getParameterByPropIdAndSequenceNumber(java.lang.String, java.lang.String)
243 */
244 @Override
245 public PropositionParameter getParameterByPropIdAndSequenceNumber(
246 String propId, Integer sequenceNumber) {
247 if (StringUtils.isBlank(propId)) {
248 throw new IllegalArgumentException("propId is null or blank");
249 }
250 if (sequenceNumber == null) {
251 throw new IllegalArgumentException("sequenceNumber is null");
252 }
253 final Map<String, Object> map = new HashMap<String, Object>();
254 map.put("propId", propId);
255 map.put("sequenceNumber", sequenceNumber);
256 PropositionParameterBo bo = businessObjectService.findByPrimaryKey(PropositionParameterBo.class, map);
257 return PropositionParameterBo.to(bo);
258 }
259 /**
260 * Converts a immutable {@link PropositionDefinition} to its mutable {@link PropositionBo} counterpart.
261 * @param proposition the immutable object.
262 * @return a {@link PropositionBo} the mutable PropositionBo.
263 *
264 */
265 public PropositionBo from(PropositionDefinition proposition) {
266 if (proposition == null) { return null; }
267 PropositionBo propositionBo = new PropositionBo();
268 propositionBo.setDescription(proposition.getDescription());
269 propositionBo.setTypeId(proposition.getTypeId());
270 propositionBo.setRuleId(proposition.getRuleId());
271 propositionBo.setPropositionTypeCode(proposition.getPropositionTypeCode());
272 propositionBo.setCompoundOpCode(proposition.getCompoundOpCode());
273 propositionBo.setId(proposition.getId());
274 propositionBo.setVersionNumber(proposition.getVersionNumber());
275 return propositionBo;
276 }
277
278 /**
279 * Sets the businessObjectService attribute value.
280 *
281 * @param businessObjectService The businessObjectService to set.
282 */
283 public void setBusinessObjectService(BusinessObjectService businessObjectService) {
284 this.businessObjectService = businessObjectService;
285 }
286
287 }