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.krms.impl.repository;
017
018 import java.util.ArrayList;
019 import java.util.Collection;
020 import java.util.Collections;
021 import java.util.HashMap;
022 import java.util.List;
023 import java.util.Map;
024
025 import org.apache.commons.collections.CollectionUtils;
026 import org.apache.commons.lang.StringUtils;
027 import org.kuali.rice.core.api.criteria.CriteriaLookupService;
028 import org.kuali.rice.core.api.criteria.GenericQueryResults;
029 import org.kuali.rice.core.api.criteria.Predicate;
030 import org.kuali.rice.core.api.criteria.QueryByCriteria;
031 import org.kuali.rice.krad.service.BusinessObjectService;
032 import org.kuali.rice.krad.service.KRADServiceLocator;
033 import org.kuali.rice.krms.api.repository.type.KrmsAttributeDefinition;
034 import org.kuali.rice.krms.impl.util.KrmsImplConstants;
035
036 import static org.kuali.rice.core.api.criteria.PredicateFactory.*;
037
038 public final class KrmsAttributeDefinitionServiceImpl implements KrmsAttributeDefinitionService {
039
040 private BusinessObjectService businessObjectService;
041 private CriteriaLookupService criteriaLookupService;
042
043 @Override
044 /**
045 * @see org.kuali.rice.krms.impl.repository.KrmsAttributeDefinitionService#convertAttributeKeys()
046 */
047 public Map<String,String> convertAttributeKeys(Map<String,String> attributesByName, String namespace) {
048 Map<String,String> attributesById = new HashMap<String,String>();
049 if(attributesByName != null) {
050 for(Map.Entry<String, String> attr : attributesByName.entrySet()) {
051 String newKey = getKrmsAttributeId(attr.getKey(), namespace);
052 if(StringUtils.isNotEmpty(newKey)) {
053 attributesById.put(newKey, attr.getValue());
054 }
055 }
056 }
057 return attributesById;
058 }
059
060 @Override
061 /**
062 * @see org.kuali.rice.krms.impl.repository.KrmsAttributeDefinitionService#getKrmsAttributeId()
063 */
064 public String getKrmsAttributeId( String attributeName, String namespace) {
065 String returnId = null;
066 KrmsAttributeDefinitionBo bo = getKrmsAttributeBo(attributeName, namespace);
067 if (bo != null){
068 returnId = bo.getId();
069 }
070 return returnId;
071 }
072
073 @Override
074 /**
075 * @see org.kuali.rice.krms.impl.repository.KrmsAttributeDefinitionService#getKrmsAttributeBo()
076 */
077 public KrmsAttributeDefinitionBo getKrmsAttributeBo( String attributeName, String namespace) {
078 KrmsAttributeDefinitionBo result = null;
079 Map<String,Object> criteria = new HashMap<String,Object>( 3 );
080 criteria.put( "name", attributeName );
081 criteria.put( "namespace", namespace );
082 criteria.put( "active", Boolean.TRUE );
083 Collection<KrmsAttributeDefinitionBo> defs = getBusinessObjectService().findMatching( KrmsAttributeDefinitionBo.class, criteria );
084 if(CollectionUtils.isNotEmpty(defs)) {
085 if (defs.size() > 1){
086 throw new IllegalStateException("Multiple KrmsAttributeDefinitions found with same name and namespace");
087 }
088 result = defs.iterator().next();
089 }
090 return result;
091 }
092
093 @Override
094 /**
095 * @see org.kuali.rice.krms.impl.repository.KrmsAttributeDefinitionService#createAttributeDefinition()
096 */
097 public KrmsAttributeDefinition createAttributeDefinition(KrmsAttributeDefinition attributeDefinition) {
098 if (attributeDefinition == null){
099 throw new IllegalArgumentException("attributeDefinition is null");
100 }
101 final String nameKey = attributeDefinition.getName();
102 final String namespaceKey = attributeDefinition.getNamespace();
103 final KrmsAttributeDefinition existing = getAttributeDefinitionByNameAndNamespace(nameKey, namespaceKey);
104 if (existing != null && existing.getName().equals(nameKey) && existing.getNamespace().equals(namespaceKey)){
105 throw new IllegalStateException("the krms attribute definition to create already exists: " + attributeDefinition);
106 }
107
108 KrmsAttributeDefinitionBo bo = KrmsAttributeDefinitionBo.from(attributeDefinition);
109 getBusinessObjectService().save(bo);
110 return KrmsAttributeDefinitionBo.to(bo);
111 }
112
113 @Override
114 /**
115 * @see org.kuali.rice.krms.impl.repository.KrmsAttributeDefinitionService#updateAttributeDefinition()
116 */
117 public void updateAttributeDefinition(KrmsAttributeDefinition attributeDefinition) {
118 if (attributeDefinition == null){
119 throw new IllegalArgumentException("attributeDefinition is null");
120 }
121 final String idKey = attributeDefinition.getId();
122 final KrmsAttributeDefinitionBo existing = getBusinessObjectService().findBySinglePrimaryKey(KrmsAttributeDefinitionBo.class, idKey);
123 if (existing == null){
124 throw new IllegalStateException("the krms attribute definition does not exist: " + attributeDefinition);
125 }
126 final KrmsAttributeDefinition toUpdate;
127 if (!existing.getId().equals(attributeDefinition.getId())){
128 final KrmsAttributeDefinition.Builder builder = KrmsAttributeDefinition.Builder.create(attributeDefinition);
129 builder.setId(existing.getId());
130 toUpdate = builder.build();
131 } else {
132 toUpdate = attributeDefinition;
133 }
134 KrmsAttributeDefinitionBo bo = KrmsAttributeDefinitionBo.from(toUpdate);
135 getBusinessObjectService().save(bo);
136 }
137
138 @Override
139 /**
140 * @see org.kuali.rice.krms.impl.repository.KrmsAttributeDefinitionService#getAttributeDefinitionById()
141 */
142 public KrmsAttributeDefinition getAttributeDefinitionById(final String id) {
143 if (StringUtils.isBlank(id)) {
144 throw new IllegalArgumentException("id is blank");
145 }
146 KrmsAttributeDefinitionBo bo = getBusinessObjectService().findBySinglePrimaryKey(KrmsAttributeDefinitionBo.class, id);
147 return KrmsAttributeDefinitionBo.to(bo);
148 }
149
150 @Override
151 /**
152 * @see org.kuali.rice.krms.impl.repository.KrmsAttributeDefinitionService#getAttributeDefinitionByNameAndNamespace()
153 */
154 public KrmsAttributeDefinition getAttributeDefinitionByNameAndNamespace(final String name, final String namespace) {
155 if (StringUtils.isBlank(name)) {
156 throw new IllegalArgumentException("name is blank");
157 }
158 if (StringUtils.isBlank(namespace)) {
159 throw new IllegalArgumentException("namespace is blank");
160 }
161 KrmsAttributeDefinitionBo bo = getKrmsAttributeBo(name, namespace);
162 if (bo == null)
163 return null;
164 return KrmsAttributeDefinitionBo.to(bo);
165 }
166
167 @Override
168 /**
169 * @see org.kuali.rice.krms.impl.repository.KrmsAttributeDefinitionService#findAttributeDefinitionsByNamespace()
170 */
171 public List<KrmsAttributeDefinition> findAttributeDefinitionsByNamespace(final String namespace) {
172 final Map<String, Object> map = new HashMap<String, Object>();
173 map.put("namespace", namespace);
174 map.put("active", Boolean.TRUE);
175 Collection<KrmsAttributeDefinitionBo> krmsAttributeDefinitionBos = getBusinessObjectService().findMatching(KrmsAttributeDefinitionBo.class, Collections.unmodifiableMap(map));
176 return convertListOfBosToImmutables(krmsAttributeDefinitionBos);
177 }
178
179 @Override
180 /**
181 * @see org.kuali.rice.krms.impl.repository.KrmsAttributeDefinitionService#findAttributeDefinitionsByType()
182 */
183 public List<KrmsAttributeDefinition> findAttributeDefinitionsByType(final String typeId) {
184
185 List<KrmsAttributeDefinition> results = Collections.emptyList();
186
187 final Map<String, Object> map = new HashMap<String, Object>();
188 map.put("typeId", typeId);
189 map.put("active", Boolean.TRUE);
190 Collection<KrmsTypeAttributeBo> krmsTypeAttributeBos = getBusinessObjectService().findMatching(KrmsTypeAttributeBo.class, Collections.unmodifiableMap(map));
191
192 if (!CollectionUtils.isEmpty(krmsTypeAttributeBos)) {
193 String [] inList = new String[krmsTypeAttributeBos.size()];
194 int inListIdex = 0;
195 for (KrmsTypeAttributeBo krmsTypeAttributeBo : krmsTypeAttributeBos) {
196 inList[inListIdex] = krmsTypeAttributeBo.getAttributeDefinitionId();
197 ++inListIdex; // don't forget to increment our index
198 }
199
200 QueryByCriteria.Builder qBuilder = QueryByCriteria.Builder.create();
201 qBuilder.setPredicates(in("id", inList));
202 results = convertListOfBosToImmutables(getCriteriaLookupService().lookup(KrmsAttributeDefinitionBo.class, qBuilder.build()).getResults());
203 }
204
205 return results;
206 }
207
208
209 @Override
210 /**
211 * @see org.kuali.rice.krms.impl.repository.KrmsAttributeDefinitionService#findAllAttributeDefinitions()
212 */
213 public List<KrmsAttributeDefinition> findAllAttributeDefinitions() {
214 final Map<String, Object> map = new HashMap<String, Object>();
215 map.put("active", Boolean.TRUE);
216
217 Collection<KrmsAttributeDefinitionBo> krmsAttributeDefinitionBos = getBusinessObjectService().findMatching(KrmsAttributeDefinitionBo.class, Collections.unmodifiableMap(map));
218 return convertListOfBosToImmutables(krmsAttributeDefinitionBos);
219 }
220
221 /**
222 * Sets the businessObjectService attribute value.
223 *
224 * @param businessObjectService The businessObjectService to set.
225 */
226 public void setBusinessObjectService(final BusinessObjectService businessObjectService) {
227 this.businessObjectService = businessObjectService;
228 }
229
230 /**
231 * This method returns a reference to the businessObjectService.
232 * If the businessObjectService is not set, get it from the KRADServiceLocator.
233 * @return businessObjectService
234 */
235 protected BusinessObjectService getBusinessObjectService() {
236 if ( businessObjectService == null ) {
237 businessObjectService = KRADServiceLocator.getBusinessObjectService();
238 }
239 return businessObjectService;
240 }
241
242 /**
243 * Converts a List<KrmsAttributeDefinitionBo> to an Unmodifiable List<KrmsAttributeDefinition>
244 *
245 * @param krmsAttributeDefinitionBos a mutable List<KrmsAttributeDefinitionBo> to made completely immutable.
246 * @return An unmodifiable List<KrmsAttributeDefinition>
247 */
248 public List<KrmsAttributeDefinition> convertListOfBosToImmutables(final Collection<KrmsAttributeDefinitionBo> krmsAttributeDefinitionBos) {
249 ArrayList<KrmsAttributeDefinition> krmsAttributeDefinitions = new ArrayList<KrmsAttributeDefinition>();
250 for (KrmsAttributeDefinitionBo bo : krmsAttributeDefinitionBos) {
251 KrmsAttributeDefinition krmsAttributeDefinition = KrmsAttributeDefinitionBo.to(bo);
252 krmsAttributeDefinitions.add(krmsAttributeDefinition);
253 }
254 return Collections.unmodifiableList(krmsAttributeDefinitions);
255 }
256
257 /**
258 * Sets the criteriaLookupService attribute value.
259 *
260 * @param criteriaLookupService The criteriaLookupService to set.
261 */
262 public void setCriteriaLookupService(final CriteriaLookupService criteriaLookupService) {
263 this.criteriaLookupService = criteriaLookupService;
264 }
265
266 protected CriteriaLookupService getCriteriaLookupService() {
267 return criteriaLookupService;
268 }
269
270 }