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    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.lang.StringUtils;
026    import org.kuali.rice.core.api.exception.RiceIllegalArgumentException;
027    import org.kuali.rice.krad.service.BusinessObjectService;
028    import org.kuali.rice.krms.api.repository.term.TermDefinition;
029    import org.kuali.rice.krms.api.repository.term.TermRepositoryService;
030    import org.kuali.rice.krms.api.repository.term.TermResolverDefinition;
031    import org.kuali.rice.krms.api.repository.term.TermSpecificationDefinition;
032    import org.kuali.rice.krms.impl.repository.ContextValidTermBo;
033    import org.kuali.rice.krms.impl.repository.TermSpecificationBo;
034    import org.springframework.util.CollectionUtils;
035    
036    /**
037     * Implementation of {@link TermBoService}
038     * 
039     * @author Kuali Rice Team (rice.collab@kuali.org)
040     *
041     */
042    public class TermBoServiceImpl implements TermBoService, TermRepositoryService {
043            
044            private BusinessObjectService businessObjectService;
045    
046            /**
047             * @param businessObjectService the businessObjectService to set
048             */
049            public void setBusinessObjectService(BusinessObjectService businessObjectService) {
050                    this.businessObjectService = businessObjectService;
051            }
052            
053            /**
054             * @see org.kuali.rice.krms.impl.repository.TermBoService#getTermSpecificationById(java.lang.String)
055             */
056            @Override
057            public TermSpecificationDefinition getTermSpecificationById(String id) {
058                    TermSpecificationBo termSpecificationBo = 
059                            businessObjectService.findBySinglePrimaryKey(TermSpecificationBo.class, id);
060                    return TermSpecificationDefinition.Builder.create(termSpecificationBo).build();
061            }
062            
063            /**
064             * @see org.kuali.rice.krms.impl.repository.TermBoService#createTermSpecification(org.kuali.rice.krms.api.repository.term.TermSpecificationDefinition)
065             */
066            @Override
067            public TermSpecificationDefinition createTermSpecification(TermSpecificationDefinition termSpec) {
068                    if (!StringUtils.isBlank(termSpec.getId())) {
069                            throw new RiceIllegalArgumentException("for creation, TermSpecification.id must be null");
070                    }
071                    
072                    TermSpecificationBo termSpecBo = TermSpecificationBo.from(termSpec);
073                    
074                    businessObjectService.save(termSpecBo);
075                    
076                    return TermSpecificationBo.to(termSpecBo);
077            }
078            
079            /**
080             * @see org.kuali.rice.krms.impl.repository.TermBoService#createTerm(org.kuali.rice.krms.api.repository.term.TermDefinition)
081             */
082            @Override
083            public TermDefinition createTerm(TermDefinition termDef) {
084                    if (!StringUtils.isBlank(termDef.getId())) {
085                            throw new RiceIllegalArgumentException("for creation, TermDefinition.id must be null");
086                    }
087                    
088                    TermBo termBo = TermBo.from(termDef);
089                    
090                    businessObjectService.save(termBo);
091                    
092                    return TermBo.to(termBo);
093            }
094            
095            /**
096             * @see org.kuali.rice.krms.impl.repository.TermBoService#createTermResolver(org.kuali.rice.krms.api.repository.term.TermResolverDefinition)
097             */
098            @Override
099            public TermResolverDefinition createTermResolver(TermResolverDefinition termResolver) {
100                    if (!StringUtils.isBlank(termResolver.getId())) {
101                            throw new RiceIllegalArgumentException("for creation, TermResolverDefinition.id must be null");
102                    }
103                    
104                    TermResolverBo termResolverBo = TermResolverBo.from(termResolver);
105                    
106                    termResolverBo = (TermResolverBo)businessObjectService.save(termResolverBo);
107                    
108                    return TermResolverBo.to(termResolverBo);
109            }
110            
111            /**
112             * @see org.kuali.rice.krms.impl.repository.TermBoService#getTerm(java.lang.String)
113             */
114            @Override
115            public TermDefinition getTerm(String id) {
116                    TermDefinition result = null;
117                    
118                    if (StringUtils.isBlank(id)) {
119                            throw new RiceIllegalArgumentException("id must not be blank or null");
120                    }
121                    TermBo termBo = businessObjectService.findBySinglePrimaryKey(TermBo.class, id);
122                    
123                    if (termBo != null) {
124                            result= TermBo.to(termBo);
125                    }
126                    
127                    return result;
128            }
129            
130            /**
131             * @see org.kuali.rice.krms.impl.repository.TermBoService#getTermResolverById(java.lang.String)
132             */
133            @Override
134            public TermResolverDefinition getTermResolverById(String id) {
135                    TermResolverDefinition result = null;
136                    
137                    if (StringUtils.isBlank(id)) {
138                            throw new RiceIllegalArgumentException("id must not be blank or null");
139                    }
140                    TermResolverBo termResolverBo = businessObjectService.findBySinglePrimaryKey(TermResolverBo.class, id);
141                    
142                    if (termResolverBo != null) {
143                            result = TermResolverBo.to(termResolverBo);
144                    }
145                    
146                    return result;
147            }
148    
149        @Override
150        public List<TermResolverDefinition> findTermResolversByOutputId(String id, String namespace) {
151            List<TermResolverDefinition> results = null;
152    
153                    if (StringUtils.isBlank(id)) {
154                            throw new RiceIllegalArgumentException("id must not be blank or null");
155                    }
156            if (StringUtils.isBlank(namespace)) {
157                            throw new RiceIllegalArgumentException("namespace must not be blank or null");
158                    }
159            Map<String, String> criteria = new HashMap<String, String>(2);
160    
161            criteria.put("outputId", id);
162            criteria.put("namespace", namespace);
163    
164                    Collection<TermResolverBo> termResolverBos = businessObjectService.findMatching(TermResolverBo.class, criteria);
165    
166                    if (!CollectionUtils.isEmpty(termResolverBos)) {
167                            results = new ArrayList<TermResolverDefinition>(termResolverBos.size());
168    
169                for (TermResolverBo termResolverBo : termResolverBos) {
170                    results.add(TermResolverBo.to(termResolverBo));
171                }
172                    } else {
173                results = Collections.emptyList();
174            }
175    
176                    return results;
177        }
178    
179        @Override
180        public List<TermResolverDefinition> findTermResolversByNamespace(String namespace) {
181            List<TermResolverDefinition> results = null;
182    
183            if (StringUtils.isBlank(namespace)) {
184                throw new RiceIllegalArgumentException("namespace must not be blank or null");
185            }
186    
187            Map fieldValues = new HashMap();
188            fieldValues.put("namespace", namespace);
189    
190            Collection<TermResolverBo> termResolverBos = businessObjectService.findMatching(TermResolverBo.class, fieldValues);
191    
192            if (!CollectionUtils.isEmpty(termResolverBos)) {
193                results = new ArrayList<TermResolverDefinition>(termResolverBos.size());
194    
195                for (TermResolverBo termResolverBo : termResolverBos) if (termResolverBo != null) {
196                    results.add(TermResolverBo.to(termResolverBo));
197                }
198            } else {
199                results = Collections.emptyList();
200            }
201    
202            return results;
203        }
204        
205        @Override
206        public List<TermSpecificationDefinition> findAllTermSpecificationsByContextId(String contextId){
207            List<TermSpecificationDefinition> results = null;
208            
209            if (StringUtils.isBlank(contextId)){
210                throw new RiceIllegalArgumentException("contextId must not be blank or null");        
211            }
212            
213            Collection<ContextValidTermBo> contextValidTerms = 
214                        businessObjectService.findMatching(ContextValidTermBo.class, 
215                                        Collections.singletonMap("contextId", contextId));
216            
217            if (!CollectionUtils.isEmpty(contextValidTerms)) {
218                results = new ArrayList<TermSpecificationDefinition>(contextValidTerms.size());
219                for (ContextValidTermBo validTerm : contextValidTerms) {
220                    results.add(TermSpecificationBo.to(validTerm.getTermSpecification()));
221                }        
222            } else {
223                results = Collections.emptyList();
224            }
225    
226            return results;
227        }
228    }