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    }