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    
019    import java.util.ArrayList;
020    import java.util.Collection;
021    import java.util.Collections;
022    import java.util.HashMap;
023    import java.util.List;
024    import java.util.Map;
025    
026    import org.apache.commons.lang.StringUtils;
027    import org.kuali.rice.krad.service.BusinessObjectService;
028    import org.kuali.rice.krms.api.repository.action.ActionDefinition;
029    import org.kuali.rice.krms.impl.util.KrmsImplConstants.PropertyNames;
030    
031    public final class ActionBoServiceImpl implements ActionBoService {
032    
033        private BusinessObjectService businessObjectService;
034    
035            /**
036             * This overridden method creates a KRMS Action in the repository.
037             */
038            @Override
039            public ActionDefinition createAction(ActionDefinition action) {
040                    if (action == null){
041                    throw new IllegalArgumentException("action is null");
042                    }
043                    final String actionNameKey = action.getName();
044                    final String actionNamespaceKey = action.getNamespace();
045                    final ActionDefinition existing = getActionByNameAndNamespace(actionNameKey, actionNamespaceKey);
046                    if (existing != null){
047                throw new IllegalStateException("the action to create already exists: " + action);                  
048                    }       
049                    
050                    ActionBo bo = ActionBo.from(action);
051                    businessObjectService.save(bo);
052                    
053                    return ActionBo.to(bo);
054            }
055    
056            /**
057             * This overridden method updates an existing Action in the repository.
058             */
059            @Override
060            public void updateAction(ActionDefinition action) {
061                    if (action == null){
062                    throw new IllegalArgumentException("action is null");
063                    }
064    
065                    // must already exist to be able to update
066                    final String actionIdKey = action.getId();
067                    final ActionBo existing = businessObjectService.findBySinglePrimaryKey(ActionBo.class, actionIdKey);
068            if (existing == null) {
069                throw new IllegalStateException("the action does not exist: " + action);
070            }
071            final ActionDefinition toUpdate;
072            if (existing.getId().equals(action.getId())) {
073                toUpdate = action;
074            } else {
075                // if passed in id does not match existing id, correct it
076                final ActionDefinition.Builder builder = ActionDefinition.Builder.create(action);
077                builder.setId(existing.getId());
078                toUpdate = builder.build();
079            }
080         
081                    // copy all updateable fields to bo
082            ActionBo boToUpdate = ActionBo.from(toUpdate);
083    
084                    // delete any old, existing attributes
085                    Map<String,String> fields = new HashMap<String,String>(1);
086                    fields.put(PropertyNames.Action.ACTION_ID, toUpdate.getId());
087                    businessObjectService.deleteMatching(ActionAttributeBo.class, fields);
088            
089                    // update the action and create new attributes
090            businessObjectService.save(boToUpdate);
091            }
092    
093            /**
094             * This overridden method retrieves an Action from the repository.
095             */
096            @Override
097            public ActionDefinition getActionByActionId(String actionId) {
098                    if (StringUtils.isBlank(actionId)){
099                throw new IllegalArgumentException("action ID is null or blank");                   
100                    }
101                    ActionBo bo = businessObjectService.findBySinglePrimaryKey(ActionBo.class, actionId);
102                    return ActionBo.to(bo);
103            }
104    
105            /**
106             * This overridden method retrieves an Action from the repository.
107             */
108            @Override
109            public ActionDefinition getActionByNameAndNamespace(String name, String namespace) {
110            if (StringUtils.isBlank(name)) {
111                throw new IllegalArgumentException("name is blank");
112            }
113            if (StringUtils.isBlank(namespace)) {
114                throw new IllegalArgumentException("namespace is blank");
115            }
116    
117            final Map<String, Object> map = new HashMap<String, Object>();
118            map.put("name", name);
119            map.put("namespace", namespace);
120    
121            ActionBo myAction = businessObjectService.findByPrimaryKey(ActionBo.class, Collections.unmodifiableMap(map));
122            return ActionBo.to(myAction);
123            }
124    
125            /**
126             * This overridden method retrieves a List of Actions associated with a Rule.
127             */
128            @Override
129            public List<ActionDefinition> getActionsByRuleId(String ruleId) {
130                    if (StringUtils.isBlank(ruleId)){
131                throw new IllegalArgumentException("ruleId is null or blank");                      
132                    }
133            final Map<String, Object> map = new HashMap<String, Object>();
134            map.put("ruleId", ruleId);
135                    List<ActionBo> bos = (List<ActionBo>) businessObjectService.findMatchingOrderBy(ActionBo.class, map, "sequenceNumber", true);
136                    return convertListOfBosToImmutables(bos);
137            }
138    
139            /**
140             * This overridden method retrieves a specific Action associated with a Rule.
141             */
142            @Override
143            public ActionDefinition getActionByRuleIdAndSequenceNumber(String ruleId, Integer sequenceNumber) {
144                    if (StringUtils.isBlank(ruleId)) {
145                throw new IllegalArgumentException("ruleId is null or blank");
146                    }
147                    if (sequenceNumber == null) {
148                throw new IllegalArgumentException("sequenceNumber is null");
149                    }
150            final Map<String, Object> map = new HashMap<String, Object>();
151            map.put("ruleId", ruleId);
152            map.put("sequenceNumber", sequenceNumber);
153                    ActionBo bo = businessObjectService.findByPrimaryKey(ActionBo.class, map);
154                    return ActionBo.to(bo);
155            }
156    
157            /**
158             * This method retrieves an ActionAttributeBo by id
159             *
160             * @see org.kuali.rice.krms.impl.repository.ActionBoService#getActionsByRuleId(java.lang.String)
161             */
162            public ActionAttributeBo getActionAttributeById(String attrId) {
163                    if (StringUtils.isBlank(attrId)){
164                return null;                        
165                    }
166            return businessObjectService.findBySinglePrimaryKey(ActionAttributeBo.class, attrId);
167            }
168    
169        /**
170         * Sets the businessObjectService attribute value.
171         *
172         * @param businessObjectService The businessObjectService to set.
173         */
174        public void setBusinessObjectService(final BusinessObjectService businessObjectService) {
175            this.businessObjectService = businessObjectService;
176        }
177    
178        /**
179         * Converts a List<ActionBo> to an Unmodifiable List<Action>
180         *
181         * @param actionBos a mutable List<ActionBo> to made completely immutable.
182         * @return An unmodifiable List<Action>
183         */
184        List<ActionDefinition> convertListOfBosToImmutables(final Collection<ActionBo> actionBos) {
185            if (actionBos == null) { return Collections.emptyList(); }
186            ArrayList<ActionDefinition> actions = new ArrayList<ActionDefinition>();
187            for (ActionBo bo : actionBos) {
188                ActionDefinition action = ActionBo.to(bo);
189                actions.add(action);
190            }
191            return Collections.unmodifiableList(actions);
192        }
193    
194    
195    }