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.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 }