001 /* 002 * Copyright 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 package org.kuali.kfs.module.bc.document.dataaccess.impl; 017 018 import java.sql.Date; 019 import java.util.List; 020 021 import org.apache.log4j.Logger; 022 import org.kuali.kfs.module.bc.BCParameterKeyConstants; 023 import org.kuali.kfs.module.bc.document.BudgetConstructionDocument; 024 import org.kuali.kfs.module.bc.util.BudgetParameterFinder; 025 import org.kuali.rice.kns.dao.jdbc.PlatformAwareDaoBaseJdbc; 026 import org.kuali.rice.kns.service.ParameterService; 027 028 029 /** 030 * create methods for building SQL useful to all extenders 031 */ 032 public class BudgetConstructionDaoJdbcBase extends PlatformAwareDaoBaseJdbc { 033 034 ParameterService parameterService; 035 036 private static Logger LOG = org.apache.log4j.Logger.getLogger(BudgetConstructionDaoJdbcBase.class); 037 038 private String ojbPlatform; 039 private String ojbOraclePlatform; 040 041 private StringBuilder[] oracleSubString = {new StringBuilder("SUBSTR("),new StringBuilder(","),new StringBuilder(","), new StringBuilder(")")}; 042 private StringBuilder[] ansi92SubString = {new StringBuilder("SUBSTRING("),new StringBuilder(" FROM "), new StringBuilder(" FOR "), new StringBuilder(")")}; 043 private String dateFetcher = new String("SELECT MIN(UNIV_DT) FROM SH_UNIV_DATE_T WHERE (UNIV_FISCAL_YR = ?)"); 044 045 protected void clearTempTableByUnvlId(String tableName, String personUnvlIdColumn, String principalName) { 046 getSimpleJdbcTemplate().update("DELETE from " + tableName + " WHERE " + personUnvlIdColumn + " = ?", principalName); 047 } 048 049 protected void clearTempTableBySesId(String tableName, String SesIdColumn, String sessionId) { 050 getSimpleJdbcTemplate().update("DELETE from " + tableName + " WHERE " + SesIdColumn + " = ?", sessionId); 051 } 052 053 /** 054 * 055 * build a string of placeholders for a parameterized java.sql IN clause 056 * @param parameterCount the number of parameters in the IN clause 057 * @return the String (?,?,?) with the correct nubmer of parameters 058 */ 059 protected String inString(Integer parameterCount) 060 { 061 // there should be at least one parameter in the IN string 062 // but allow people to screw up and have an IN condition which is never satisfied 063 if (parameterCount == 0) 064 { 065 return new String("('')"); 066 } 067 StringBuffer sb = new StringBuffer(20); 068 sb = sb.append("(?"); 069 for (int i = 1; i < parameterCount; i++) 070 { 071 sb.append(",?"); 072 } 073 sb.append(")"); 074 return sb.toString(); 075 } 076 077 /** 078 * 079 * build a SQL IN clause from the array of parameters passed in 080 * @param inListValues: components of the IN list 081 * @return an empty string if the IN list will be empty 082 */ 083 protected String inString (List<String> inListValues) 084 { 085 // the delimiter for strings in the DB is assumed to be a single quote. 086 // this is the ANSI-92 standard. 087 // if the ArrayList input is empty, IN ('') is returned. 088 StringBuffer inBuilder = new StringBuffer(150); 089 090 inBuilder.append("('"); 091 if (! inListValues.isEmpty()) 092 { 093 inBuilder.append(inListValues.get(0)); 094 } 095 else 096 { 097 // for an empty list, return an empty string 098 return new String(""); 099 } 100 for (int idx = 1; idx < inListValues.size(); idx++) 101 { 102 inBuilder.append("','"); 103 inBuilder.append(inListValues.get(idx)); 104 } 105 inBuilder.append("')"); 106 107 return inBuilder.toString(); 108 } 109 110 /** 111 * 112 * given a fiscal year, get the first day of that fiscal year 113 * @param universityFiscalYear = fiscal year (must be in the table) 114 * @return the date on which the fiscal year passed as a parameter starts 115 */ 116 protected Date getFiscalYearStartDate(Integer universityFiscalYear) 117 { 118 return getSimpleJdbcTemplate().queryForObject(dateFetcher, Date.class, universityFiscalYear); 119 } 120 121 /** 122 * 123 * return a SQL IN list containing the budget construction expenditure object types 124 * @return a null string if the system parameter does not exist or is empty 125 */ 126 protected String getExpenditureINList() 127 { 128 if (! parameterService.parameterExists(BudgetConstructionDocument.class,BCParameterKeyConstants.EXPENDITURE_OBJECT_TYPES)) 129 { 130 LOG.warn(String.format("\n***Budget Construction Application Error***\nSQL will not be valid\nparameter %s does not exist\n",BCParameterKeyConstants.EXPENDITURE_OBJECT_TYPES)); 131 IllegalArgumentException ioex = new IllegalArgumentException("parameter "+BCParameterKeyConstants.EXPENDITURE_OBJECT_TYPES+" does not exist"); 132 throw (ioex); 133 } 134 135 List<String> expenditureObjectTypes = BudgetParameterFinder.getExpenditureObjectTypes(); 136 if (expenditureObjectTypes.isEmpty()) 137 { 138 LOG.warn(String.format("\n***Budget Construction Application Error***\nSQL will not be valid\nparameter %s is empty\n",BCParameterKeyConstants.EXPENDITURE_OBJECT_TYPES)); 139 IllegalArgumentException bfex = new IllegalArgumentException("parameter "+BCParameterKeyConstants.EXPENDITURE_OBJECT_TYPES+" is empty"); 140 throw (bfex); 141 } 142 return inString(expenditureObjectTypes); 143 } 144 145 /** 146 * 147 * return a SQL IN list containing the budget construction revenue object types 148 * @return a null string if the system parameter does not exist or is empty 149 */ 150 protected String getRevenueINList() 151 { 152 if (! parameterService.parameterExists(BudgetConstructionDocument.class,BCParameterKeyConstants.REVENUE_OBJECT_TYPES)) 153 { 154 LOG.warn(String.format("\n***Budget Construction Application Error***\nSQL will not be valid\nparameter %s does not exist\n",BCParameterKeyConstants.REVENUE_OBJECT_TYPES)); 155 IllegalArgumentException ioex = new IllegalArgumentException("parameter "+BCParameterKeyConstants.REVENUE_OBJECT_TYPES+" does not exist"); 156 throw (ioex); 157 } 158 List<String> revenueObjectTypes = BudgetParameterFinder.getRevenueObjectTypes(); 159 if (revenueObjectTypes.isEmpty()) 160 { 161 LOG.warn(String.format("\n***Budget Construction Application Error***\nSQL will not be valid\nparameter %s is empty\n",BCParameterKeyConstants.REVENUE_OBJECT_TYPES)); 162 IllegalArgumentException bfex = new IllegalArgumentException("parameter "+BCParameterKeyConstants.REVENUE_OBJECT_TYPES+" is empty"); 163 throw (bfex); 164 } 165 return inString(revenueObjectTypes); 166 } 167 168 /** 169 * 170 * return a substring function that is Oracle-specific if the DB Platform is Oracle, and an ANSI-92 compliant function otherwise 171 * Oracle's syntax is not ANSI-92 compliant 172 * @param fieldName = string representing the name of the DB field (possibly qualified) 173 * @param startLocation = starting location of the substring 174 * @param substringLength = length of the substring 175 * @return the substring function 176 */ 177 protected StringBuilder getSqlSubStringFunction(String fieldName, Integer startLocation, Integer substringLength){ 178 boolean oracleDB = ojbPlatform.equals(ojbOraclePlatform); 179 StringBuilder subStringer = new StringBuilder(40); 180 String start = startLocation.toString(); 181 String span = substringLength.toString(); 182 if (oracleDB) 183 { 184 subStringer.append(oracleSubString[0]); 185 subStringer.append(fieldName); 186 subStringer.append(oracleSubString[1]); 187 subStringer.append(start); 188 subStringer.append(oracleSubString[2]); 189 subStringer.append(span); 190 subStringer.append(oracleSubString[3]); 191 } 192 else 193 { 194 subStringer.append(ansi92SubString[0]); 195 subStringer.append(fieldName); 196 subStringer.append(ansi92SubString[1]); 197 subStringer.append(start); 198 subStringer.append(ansi92SubString[2]); 199 subStringer.append(span); 200 subStringer.append(ansi92SubString[3]); 201 } 202 return subStringer; 203 } 204 205 206 public void setOjbPlatform(String ojbPlatform) 207 { 208 this.ojbPlatform = ojbPlatform; 209 } 210 211 public void setOjbOraclePlatform(String ojbOraclePlatform) 212 { 213 this.ojbOraclePlatform = ojbOraclePlatform; 214 } 215 216 public void setParameterService(ParameterService parameterService) { 217 this.parameterService = parameterService; 218 } 219 220 221 222 } 223