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.kew.engine.node.service.impl;
017    
018    import java.util.List;
019    
020    import org.apache.log4j.Logger;
021    import org.kuali.rice.kew.engine.node.Branch;
022    import org.kuali.rice.kew.engine.node.BranchState;
023    import org.kuali.rice.kew.engine.node.dao.BranchDAO;
024    import org.kuali.rice.kew.engine.node.service.BranchService;
025    
026    
027    
028    public class BranchServiceImpl implements BranchService {
029        private static final Logger LOG = Logger.getLogger(BranchServiceImpl.class);
030    
031        private BranchDAO branchDAO;
032        
033        public void save(Branch branch){
034            getBranchDAO().save(branch);
035        }
036        
037         public BranchDAO getBranchDAO() {
038            return branchDAO;
039        }
040        public void setBranchDAO(BranchDAO branchDAO) {
041            this.branchDAO = branchDAO;
042        }
043        
044        public void deleteBranchStates(List statesToBeDeleted){
045            getBranchDAO().deleteBranchStates(statesToBeDeleted);
046        }
047    
048        /**
049         * Walks up the Branch/scope hierarchy trying to find a variable with the specified name
050         * @param branch the lowermost branch at which to start the search
051         * @param name name of the variable to search for
052         * @return a BranchState object in the first Branch/scope in which the variable was found
053         */
054        private BranchState resolveScopedVariable(Branch branch, String name) {
055            Branch b = branch;
056            while (b != null) {
057                for (BranchState bs: b.getBranchState()) {
058                    LOG.debug(bs);
059                }
060                LOG.debug("Resolving variable: '" + name + "' in scope (branch): '" + branch.getName() + "' (" + branch.getBranchId() + ")");
061                BranchState bs = b.getBranchState(name);
062                if (bs != null) {
063                    return bs;    
064                }
065                b = b.getParentBranch();
066            }
067            return null;
068        }
069    
070        public String getScopedVariableValue(Branch branch, String name) {
071            BranchState bs = resolveScopedVariable(branch, name);
072            if (bs != null) return bs.getValue();
073            return null;
074        }
075    
076        public String setScopedVariableValue(Branch branch, String name, String value) {
077            LOG.debug("Setting scoped variable value: " + name + " " + value);
078            BranchState bs = resolveScopedVariable(branch, name);
079            String oldValue = null;
080            if (bs == null) {
081                LOG.debug("Defining new variable named '" + name + "' at scope '" + branch + "'");
082                // create new variable at initial search scope
083                bs = new BranchState();
084                bs.setKey(name);
085                bs.setValue(value);
086                bs.setBranch(branch);
087                branch.addBranchState(bs);
088            } else {
089                oldValue = bs.getValue();
090                LOG.debug("Replacing old value of variable '" + name + "' (" + oldValue + ") at scope '" + branch + "' with new value: " + value);
091                bs.setValue(value);
092            }
093            // now save the Branch whose state we just modified
094            save(bs.getBranch());
095            return oldValue;
096        }
097        
098    }