001    /**
002     * Copyright 2005-2013 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.krad.uif.service.impl;
017    
018    import java.util.HashMap;
019    import java.util.List;
020    import java.util.Map;
021    
022    import org.apache.commons.lang.StringUtils;
023    import org.kuali.rice.core.api.exception.RiceRuntimeException;
024    import org.kuali.rice.krad.datadictionary.DataDictionary;
025    import org.kuali.rice.krad.inquiry.Inquirable;
026    import org.kuali.rice.krad.service.DataDictionaryService;
027    import org.kuali.rice.krad.uif.UifConstants;
028    import org.kuali.rice.krad.uif.UifParameters;
029    import org.kuali.rice.krad.uif.UifPropertyPaths;
030    import org.kuali.rice.krad.uif.util.ViewModelUtils;
031    import org.kuali.rice.krad.uif.view.LookupView;
032    import org.kuali.rice.krad.uif.view.View;
033    import org.kuali.rice.krad.uif.service.ViewDictionaryService;
034    import org.kuali.rice.krad.uif.UifConstants.ViewType;
035    import org.kuali.rice.krad.util.ObjectUtils;
036    import org.springframework.beans.PropertyValues;
037    
038    /**
039     * Implementation of <code>ViewDictionaryService</code>
040     *
041     * <p>
042     * Pulls view entries from the data dictionary to implement the various query
043     * methods
044     * </p>
045     *
046     * @author Kuali Rice Team (rice.collab@kuali.org)
047     */
048    public class ViewDictionaryServiceImpl implements ViewDictionaryService {
049        private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(
050                ViewDictionaryServiceImpl.class);
051    
052        private DataDictionaryService dataDictionaryService;
053    
054        /**
055         * @see org.kuali.rice.krad.uif.service.ViewDictionaryService#getInquirable(java.lang.Class,
056         *      java.lang.String)
057         */
058        public Inquirable getInquirable(Class<?> dataObjectClass, String viewName) {
059            Inquirable inquirable = null;
060    
061            if (StringUtils.isBlank(viewName)) {
062                viewName = UifConstants.DEFAULT_VIEW_NAME;
063            }
064    
065            Map<String, String> indexKey = new HashMap<String, String>();
066            indexKey.put(UifParameters.VIEW_NAME, viewName);
067            indexKey.put(UifParameters.DATA_OBJECT_CLASS_NAME, dataObjectClass.getName());
068    
069            // get view properties
070            PropertyValues propertyValues = getDataDictionary().getViewPropertiesByType(ViewType.INQUIRY, indexKey);
071    
072            String viewHelperServiceClassName = ViewModelUtils.getStringValFromPVs(propertyValues,
073                    UifPropertyPaths.VIEW_HELPER_SERVICE_CLASS);
074            if (StringUtils.isNotBlank(viewHelperServiceClassName)) {
075                try {
076                    inquirable = (Inquirable) ObjectUtils.newInstance(Class.forName(viewHelperServiceClassName));
077                } catch (ClassNotFoundException e) {
078                    throw new RiceRuntimeException(
079                            "Unable to find class for inquirable classname: " + viewHelperServiceClassName, e);
080                }
081            }
082    
083            return inquirable;
084        }
085    
086        /**
087         * @see org.kuali.rice.krad.uif.service.ViewDictionaryService#isInquirable(java.lang.Class)
088         */
089        public boolean isInquirable(Class<?> dataObjectClass) {
090            Map<String, String> indexKey = new HashMap<String, String>();
091            indexKey.put(UifParameters.VIEW_NAME, UifConstants.DEFAULT_VIEW_NAME);
092            indexKey.put(UifParameters.DATA_OBJECT_CLASS_NAME, dataObjectClass.getName());
093    
094            boolean isInquirable = getDataDictionary().viewByTypeExist(ViewType.INQUIRY, indexKey);
095    
096            return isInquirable;
097        }
098    
099        /**
100         * @see org.kuali.rice.krad.uif.service.ViewDictionaryService#isLookupable(java.lang.Class)
101         */
102        public boolean isLookupable(Class<?> dataObjectClass) {
103            Map<String, String> indexKey = new HashMap<String, String>();
104            indexKey.put(UifParameters.VIEW_NAME, UifConstants.DEFAULT_VIEW_NAME);
105            indexKey.put(UifParameters.DATA_OBJECT_CLASS_NAME, dataObjectClass.getName());
106    
107            boolean isLookupable = getDataDictionary().viewByTypeExist(ViewType.LOOKUP, indexKey);
108    
109            return isLookupable;
110        }
111    
112        /**
113         * @see org.kuali.rice.krad.uif.service.ViewDictionaryService#isMaintainable(java.lang.Class)
114         */
115        public boolean isMaintainable(Class<?> dataObjectClass) {
116            Map<String, String> indexKey = new HashMap<String, String>();
117            indexKey.put(UifParameters.VIEW_NAME, UifConstants.DEFAULT_VIEW_NAME);
118            indexKey.put(UifParameters.DATA_OBJECT_CLASS_NAME, dataObjectClass.getName());
119    
120            boolean isMaintainable = getDataDictionary().viewByTypeExist(ViewType.MAINTENANCE, indexKey);
121    
122            return isMaintainable;
123        }
124    
125        /**
126         * @see org.kuali.rice.krad.uif.service.impl.ViewDictionaryService#getResultSetLimitForLookup(java.lang.Class)
127         */
128        @Override
129        public Integer getResultSetLimitForLookup(Class<?> dataObjectClass) {
130            LookupView lookupView = null;
131    
132            List<View> lookupViews = getDataDictionary().getViewsForType(UifConstants.ViewType.LOOKUP);
133            for (View view : lookupViews) {
134                LookupView lView = (LookupView) view;
135    
136                if (StringUtils.equals(lView.getDataObjectClassName().getName(), dataObjectClass.getName())) {
137                    // if we already found a lookup view, only override if this is the default
138                    if (lookupView != null) {
139                        if (StringUtils.equals(lView.getViewName(), UifConstants.DEFAULT_VIEW_NAME)) {
140                            lookupView = lView;
141                        }
142                    } else {
143                        lookupView = lView;
144                    }
145                }
146            }
147    
148            if (lookupView != null) {
149                return lookupView.getResultSetLimit();
150            }
151    
152            return null;
153        }
154    
155        protected DataDictionary getDataDictionary() {
156            return getDataDictionaryService().getDataDictionary();
157        }
158    
159        protected DataDictionaryService getDataDictionaryService() {
160            return this.dataDictionaryService;
161        }
162    
163        public void setDataDictionaryService(DataDictionaryService dataDictionaryService) {
164            this.dataDictionaryService = dataDictionaryService;
165        }
166    }