001    /*
002     * Copyright 2006-2011 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    
017    package org.kuali.rice.shareddata.impl.country;
018    
019    
020    import org.apache.commons.lang.StringUtils;
021    import org.kuali.rice.core.api.exception.RiceIllegalArgumentException;
022    import org.kuali.rice.core.api.exception.RiceIllegalStateException;
023    import org.kuali.rice.krad.service.BusinessObjectService;
024    import org.kuali.rice.krad.util.KRADPropertyConstants;
025    import org.kuali.rice.shareddata.api.country.Country;
026    import org.kuali.rice.shareddata.api.country.CountryService;
027    
028    import java.util.ArrayList;
029    import java.util.Collection;
030    import java.util.Collections;
031    import java.util.HashMap;
032    import java.util.List;
033    import java.util.Map;
034    
035    public final class CountryServiceImpl implements CountryService {
036    
037        private BusinessObjectService businessObjectService;
038    
039        @Override
040        public Country getCountry(final String code) {
041            if (StringUtils.isBlank(code)) {
042                throw new RiceIllegalArgumentException("code is blank");
043            }
044    
045            CountryBo countryBo = businessObjectService.findByPrimaryKey(CountryBo.class, Collections.singletonMap(
046                    KRADPropertyConstants.POSTAL_COUNTRY_CODE, code));
047    
048            return CountryBo.to(countryBo);
049        }
050    
051        @Override
052        public Country getCountryByAlternateCode(final String alternateCode) {
053            if (StringUtils.isBlank(alternateCode)) {
054                throw new RiceIllegalArgumentException("alt code is blank");
055            }
056    
057            Collection<CountryBo> countryList = businessObjectService.findMatching(CountryBo.class, Collections.singletonMap(
058                    KRADPropertyConstants.ALTERNATE_POSTAL_COUNTRY_CODE, alternateCode));
059            if (countryList == null || countryList.isEmpty()) {
060                return null;
061            } else if (countryList.size() == 1) {
062                return CountryBo.to(countryList.iterator().next());
063            } else throw new RiceIllegalStateException("Multiple countries found with same alternateCode");
064        }
065    
066        @Override
067        public List<Country> findAllCountriesNotRestricted() {
068            List<String> criteriaValues = new ArrayList<String>();
069            criteriaValues.add(null);
070            criteriaValues.add("N");
071    
072            final Map<String, Object> map = new HashMap<String, Object>();
073            map.put(KRADPropertyConstants.POSTAL_COUNTRY_RESTRICTED_INDICATOR, criteriaValues);
074            map.put("active", Boolean.TRUE);
075    
076            Collection<CountryBo> countryBos = businessObjectService.findMatching(CountryBo.class, Collections.unmodifiableMap(map));
077    
078            return convertListOfBosToImmutables(countryBos);
079        }
080    
081        @Override
082        public List<Country> findAllCountries() {
083            final Map<String, Object> map = new HashMap<String, Object>();
084            map.put("active", Boolean.TRUE);
085    
086            Collection<CountryBo> countryBos = businessObjectService.findMatching(CountryBo.class, Collections.unmodifiableMap(map));
087            return convertListOfBosToImmutables(countryBos);
088        }
089    
090        /**
091         * Sets the businessObjectServiceMockFor attribute value.
092         *
093         * @param businessObjectService The businessObjectServiceMockFor to set.
094         */
095        public void setBusinessObjectService(final BusinessObjectService businessObjectService) {
096            this.businessObjectService = businessObjectService;
097        }
098    
099        /**
100         * Converts a List<CountryBo> to an Unmodifiable List<Country>
101         *
102         * @param countryBos a mutable List<CountryBo> to made completely immutable.
103         * @return An unmodifiable List<Country>
104         */
105        List<Country> convertListOfBosToImmutables(final Collection<CountryBo> countryBos) {
106            ArrayList<Country> countries = new ArrayList<Country>();
107            for (CountryBo bo : countryBos) {
108                Country country = CountryBo.to(bo);
109                countries.add(country);
110            }
111            return Collections.unmodifiableList(countries);
112        }
113    }