001 /**
002 * Copyright 2005-2012 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 import org.apache.commons.lang.StringUtils;
019 import org.kuali.rice.core.api.exception.RiceIllegalStateException;
020 import org.kuali.rice.krad.service.BusinessObjectService;
021 import org.kuali.rice.krms.api.repository.language.NaturalLanguageTemplate;
022 import org.kuali.rice.krms.api.repository.language.NaturalLanguageTemplaterContract;
023 import org.kuali.rice.krms.api.repository.type.KrmsAttributeDefinition;
024 import org.kuali.rice.krms.impl.util.KrmsImplConstants;
025
026 import java.util.Collection;
027 import java.util.Collections;
028 import java.util.HashMap;
029 import java.util.HashSet;
030 import java.util.LinkedList;
031 import java.util.List;
032 import java.util.Map;
033 import java.util.Set;
034 import org.kuali.rice.krms.impl.repository.language.SimpleNaturalLanguageTemplater;
035
036 /**
037 * Implementation of the @{link NaturalLanguageTemplateBoService} interface for accessing {@link NaturalLanguageTemplateBo} related business objects.
038 *
039 * @author Kuali Rice Team (rice.collab@kuali.org)
040 *
041 */
042 public final class NaturalLanguageTemplateBoServiceImpl
043 implements NaturalLanguageTemplateBoService
044 {
045
046 private BusinessObjectService businessObjectService;
047 private KrmsAttributeDefinitionService attributeDefinitionService;
048 private NaturalLanguageTemplaterContract naturalLanguageTemplater = new SimpleNaturalLanguageTemplater ();
049
050 /**
051 * Sets the value of BusinessObjectService to the given value.
052 *
053 * @param businessObjectService the BusinessObjectService value to set.
054 *
055 */
056 public void setBusinessObjectService(BusinessObjectService businessObjectService) {
057 this.businessObjectService = businessObjectService;
058 }
059
060 public void setAttributeDefinitionService(KrmsAttributeDefinitionService attributeDefinitionService) {
061 this.attributeDefinitionService = attributeDefinitionService;
062 }
063
064 public KrmsAttributeDefinitionService getAttributeDefinitionService() {
065 if (attributeDefinitionService == null) {
066 attributeDefinitionService = KrmsRepositoryServiceLocator.getKrmsAttributeDefinitionService();
067 }
068 return attributeDefinitionService;
069 }
070
071 public NaturalLanguageTemplaterContract getNaturalLanguageTemplater() {
072 return naturalLanguageTemplater;
073 }
074
075 public void setNaturalLanguageTemplater(NaturalLanguageTemplaterContract naturalLanguageTemplater) {
076 this.naturalLanguageTemplater = naturalLanguageTemplater;
077 }
078
079 @Override
080 public NaturalLanguageTemplate createNaturalLanguageTemplate(NaturalLanguageTemplate naturalLanguageTemplate) {
081 incomingParamCheck(naturalLanguageTemplate , "naturalLanguageTemplate");
082 final String naturalLanguageTemplateIdKey = naturalLanguageTemplate.getId();
083 final NaturalLanguageTemplate existing = getNaturalLanguageTemplate(naturalLanguageTemplateIdKey);
084 if (existing != null){ throw new IllegalStateException("the NaturalLanguageTemplate to create already exists: " + naturalLanguageTemplate); }
085 NaturalLanguageTemplateBo bo = (NaturalLanguageTemplateBo)businessObjectService.save(from(naturalLanguageTemplate));
086 return NaturalLanguageTemplateBo.to(bo);
087 }
088
089 @Override
090 public NaturalLanguageTemplate getNaturalLanguageTemplate(String naturalLanguageTemplateId) {
091 incomingParamCheck(naturalLanguageTemplateId , "naturalLanguageTemplateId");
092 NaturalLanguageTemplateBo bo = businessObjectService.findBySinglePrimaryKey(NaturalLanguageTemplateBo.class, naturalLanguageTemplateId);
093 return NaturalLanguageTemplateBo.to(bo);
094 }
095
096 @Override
097 public void updateNaturalLanguageTemplate(NaturalLanguageTemplate naturalLanguageTemplate) {
098 incomingParamCheck(naturalLanguageTemplate , "naturalLanguageTemplate");
099 final NaturalLanguageTemplate existing = getNaturalLanguageTemplate(naturalLanguageTemplate.getId());
100 if (existing == null){ throw new IllegalStateException("the NaturalLanguageTemplate to update does not exists: " + naturalLanguageTemplate);}
101 final NaturalLanguageTemplate toUpdate;
102 if (!existing.getId().equals(naturalLanguageTemplate.getId())){
103 // if passed in id does not match existing id, correct it
104 final NaturalLanguageTemplate.Builder builder = NaturalLanguageTemplate.Builder.create(naturalLanguageTemplate);
105 builder.setId(existing.getId());
106 toUpdate = builder.build();
107 } else {
108 toUpdate = naturalLanguageTemplate;
109 }
110
111 // copy all updateable fields to bo
112 NaturalLanguageTemplateBo boToUpdate = from(toUpdate);
113
114 // delete any old, existing attributes
115 Map<String,String> fields = new HashMap<String,String>(1);
116 fields.put(KrmsImplConstants.PropertyNames.NaturalLanguageTemplate.NATURAL_LANGUAGE_TEMPLATE_ID, toUpdate.getId()); // TODO verify PropertyNames.NaturalLanguageTemplate.NATURAL_LANGUAGE_TEMPLATE_ID
117 businessObjectService.deleteMatching(NaturalLanguageTemplateAttributeBo.class, fields);
118
119 // update the rule and create new attributes
120 businessObjectService.save(boToUpdate);
121 }
122
123 @Override
124 public void deleteNaturalLanguageTemplate(String naturalLanguageTemplateId) {
125 incomingParamCheck(naturalLanguageTemplateId , "naturalLanguageTemplateId");
126 final NaturalLanguageTemplate existing = getNaturalLanguageTemplate(naturalLanguageTemplateId);
127 if (existing == null){ throw new IllegalStateException("the NaturalLanguageTemplate to delete does not exists: " + naturalLanguageTemplateId);}
128 businessObjectService.delete(from(existing));
129 }
130
131 @Override
132 public List<NaturalLanguageTemplate> findNaturalLanguageTemplatesByAttributes(Map attributes) {
133 if (attributes == null) {
134 throw new IllegalArgumentException("attributes is null");
135 }
136 final Map<String, Object> map = new HashMap<String, Object>();
137 map.put("attributes", attributes);
138 List<NaturalLanguageTemplateBo> bos = (List<NaturalLanguageTemplateBo>) businessObjectService.findMatching(NaturalLanguageTemplateBo.class, map);
139 return convertBosToImmutables(bos);
140 }
141
142 @Override
143 public List<NaturalLanguageTemplate> findNaturalLanguageTemplatesByLanguageCode(String languageCode) {
144 if (org.apache.commons.lang.StringUtils.isBlank(languageCode)) {
145 throw new IllegalArgumentException("languageCode is null or blank");
146 }
147 final Map<String, Object> map = new HashMap<String, Object>();
148 map.put("languageCode", languageCode);
149 List<NaturalLanguageTemplateBo> bos = (List<NaturalLanguageTemplateBo>) businessObjectService.findMatching(NaturalLanguageTemplateBo.class, map);
150 return convertBosToImmutables(bos);
151 }
152
153 @Override
154 public NaturalLanguageTemplate findNaturalLanguageTemplateByLanguageCodeTypeIdAndNluId(String languageCode, String typeId, String naturalLanguageUsageId) {
155 if (org.apache.commons.lang.StringUtils.isBlank(languageCode)) {
156 throw new IllegalArgumentException("languageCode is null or blank");
157 }
158 final Map<String, Object> map = new HashMap<String, Object>();
159 map.put("languageCode", languageCode);
160 map.put("naturalLanguageUsageId", naturalLanguageUsageId);
161 map.put("typeId", typeId);
162 List<NaturalLanguageTemplateBo> bos = (List<NaturalLanguageTemplateBo>) businessObjectService.findMatching(NaturalLanguageTemplateBo.class, map);
163 return convertBosToImmutables(bos).get(0);
164 }
165
166 @Override
167 public List<NaturalLanguageTemplate> findNaturalLanguageTemplatesByNaturalLanguageUsage(String naturalLanguageUsageId) {
168 if (org.apache.commons.lang.StringUtils.isBlank(naturalLanguageUsageId)) {
169 throw new IllegalArgumentException("naturalLanguageUsageId is null or blank");
170 }
171 final Map<String, Object> map = new HashMap<String, Object>();
172 map.put("naturalLanguageUsageId", naturalLanguageUsageId);
173 List<NaturalLanguageTemplateBo> bos = (List<NaturalLanguageTemplateBo>) businessObjectService.findMatching(NaturalLanguageTemplateBo.class, map);
174 return convertBosToImmutables(bos);
175 }
176
177 @Override
178 public List<NaturalLanguageTemplate> findNaturalLanguageTemplatesByType(String typeId) {
179 if (org.apache.commons.lang.StringUtils.isBlank(typeId)) {
180 throw new IllegalArgumentException("typeId is null or blank");
181 }
182 final Map<String, Object> map = new HashMap<String, Object>();
183 map.put("typeId", typeId);
184 List<NaturalLanguageTemplateBo> bos = (List<NaturalLanguageTemplateBo>) businessObjectService.findMatching(NaturalLanguageTemplateBo.class, map);
185 return convertBosToImmutables(bos);
186 }
187
188 @Override
189 public List<NaturalLanguageTemplate> findNaturalLanguageTemplatesByTemplate(String template) {
190 if (org.apache.commons.lang.StringUtils.isBlank(template)) {
191 throw new IllegalArgumentException("template is null or blank");
192 }
193 final Map<String, Object> map = new HashMap<String, Object>();
194 map.put("template", template);
195 List<NaturalLanguageTemplateBo> bos = (List<NaturalLanguageTemplateBo>) businessObjectService.findMatching(NaturalLanguageTemplateBo.class, map);
196 return convertBosToImmutables(bos);
197 }
198
199 public List<NaturalLanguageTemplate> convertBosToImmutables(final Collection<NaturalLanguageTemplateBo> naturalLanguageTemplateBos) {
200 List<NaturalLanguageTemplate> immutables = new LinkedList<NaturalLanguageTemplate>();
201 if (naturalLanguageTemplateBos != null) {
202 NaturalLanguageTemplate immutable = null;
203 for (NaturalLanguageTemplateBo bo : naturalLanguageTemplateBos ) {
204 immutable = to(bo);
205 immutables.add(immutable);
206 }
207 }
208 return Collections.unmodifiableList(immutables);
209 }
210
211 @Override
212 public NaturalLanguageTemplate to(NaturalLanguageTemplateBo naturalLanguageTemplateBo) {
213 return NaturalLanguageTemplateBo.to(naturalLanguageTemplateBo);
214 }
215
216 public NaturalLanguageTemplateBo from(NaturalLanguageTemplate naturalLanguageTemplate) {
217 return NaturalLanguageTemplateBo.from(naturalLanguageTemplate);
218 }
219
220 private Collection<NaturalLanguageTemplateAttributeBo> buildAttributes(NaturalLanguageTemplate im, Collection<NaturalLanguageTemplateAttributeBo> attributes) {
221 // build a map from attribute name to definition
222 Map<String, KrmsAttributeDefinition> attributeDefinitionMap = new HashMap<String, KrmsAttributeDefinition>();
223
224 List<KrmsAttributeDefinition> attributeDefinitions = getAttributeDefinitionService().findAttributeDefinitionsByType(im.getTypeId());
225
226 for (KrmsAttributeDefinition attributeDefinition : attributeDefinitions) {
227 attributeDefinitionMap.put(attributeDefinition.getName(), attributeDefinition);
228 }
229
230 // for each entry, build a NaturalLanguageTemplateAttributeBo and add it
231 if (im.getAttributes() != null) {
232 for (Map.Entry<String,String> entry : im.getAttributes().entrySet()) {
233 KrmsAttributeDefinition attrDef = attributeDefinitionMap.get(entry.getKey());
234
235 if (attrDef != null) {
236 NaturalLanguageTemplateAttributeBo attributeBo = new NaturalLanguageTemplateAttributeBo();
237 attributeBo.setNaturalLanguageTemplateId( im.getId() );
238 attributeBo.setAttributeDefinitionId(attrDef.getId());
239 attributeBo.setValue(entry.getValue());
240 attributeBo.setAttributeDefinition(KrmsAttributeDefinitionBo.from(attrDef));
241 attributes.add(attributeBo);
242 } else {
243 throw new RiceIllegalStateException("there is no attribute definition with the name '" +
244 entry.getKey() + "' that is valid for the naturalLanguageTemplate type with id = '" + im.getTypeId() +"'");
245 }
246 }
247 }
248 return attributes;
249 }
250
251 private Set<NaturalLanguageTemplateAttributeBo> buildAttributeBoSet(NaturalLanguageTemplate im) {
252 Set<NaturalLanguageTemplateAttributeBo> attributes = new HashSet<NaturalLanguageTemplateAttributeBo>();
253 return (Set)buildAttributes(im, attributes);
254 }
255
256 private List<NaturalLanguageTemplateAttributeBo> buildAttributeBoList(NaturalLanguageTemplate im) {
257 List<NaturalLanguageTemplateAttributeBo> attributes = new LinkedList<NaturalLanguageTemplateAttributeBo>();
258 return (List)buildAttributes(im, attributes);
259 }
260
261 private void incomingParamCheck(Object object, String name) {
262 if (object == null) {
263 throw new IllegalArgumentException(name + " was null");
264 } else if (object instanceof String
265 && StringUtils.isBlank((String)object)) {
266 throw new IllegalArgumentException(name + " was blank");
267 }
268 }
269
270 }