package com.cfinkel.reports.wrappers; import com.cfinkel.reports.QueryGenerator; import com.cfinkel.reports.exceptions.BadReportSyntaxException; import com.cfinkel.reports.generatedbeans.GeneratedQueryElement; import com.cfinkel.reports.generatedbeans.OutputElement; import com.cfinkel.reports.generatedbeans.QueryElement; import com.cfinkel.reports.util.Util; import com.cfinkel.reports.web.AppData; import com.cfinkel.reports.web.WebContext; import org.apache.log4j.Logger; import org.springframework.dao.DataAccessException; import java.text.ParseException; import java.util.HashMap; import java.util.List; import java.util.Map; /** * $Author: charles $ * $Revision: 8904 $ * $Date: 2006-05-01 18:02:06 -0400 (Mon, 01 May 2006) $ * <p/> * Created by IntelliJ IDEA. * User: charles * Date: Mar 25, 2006 * Time: 6:09:54 PM * To change this template use File | Settings | File Templates. */ public class GeneratedQuery extends Query { private static final Logger log = Logger.getLogger(GeneratedQuery.class); private GeneratedQueryElement generatedQueryElement; private QueryGenerator queryGenerator; public QueryElement getQueryElement() { return generatedQueryElement; } public GeneratedQuery(GeneratedQueryElement generatedQueryElement) throws BadReportSyntaxException { super(generatedQueryElement, null); populateQueryGeneratorClass(generatedQueryElement); } public GeneratedQuery(GeneratedQueryElement generatedQueryElement, OutputElement outputElement) throws BadReportSyntaxException { super(generatedQueryElement, outputElement); populateQueryGeneratorClass(generatedQueryElement); } private void populateQueryGeneratorClass(GeneratedQueryElement generatedQueryElement) throws BadReportSyntaxException { this.generatedQueryElement = generatedQueryElement; if (generatedQueryElement.getClazz() != null) { updateQueryGeneratorClass(); } else { throw new BadReportSyntaxException("generated-query element must 'class' attribute"); } } /** * inputs is the map from HttpServletRequest.getParameterMap() * * @param parameters * @return * @throws DataAccessException */ public List getData(Map<Input, Object> parameters) throws DataAccessException, ParseException { String query = getQueryString(parameters); List data; data = jdbcTemplate.queryForList(query); return data; } public String getQueryString(Map<Input, Object> parameters) throws ParseException { // get the user from session: String userName = "unknown user"; WebContext user = WebContext.get(); if (user != null) { userName = Util.getUserName(user.getRequest()); } // * reconstruct original rqeuest param map (a bit of a kludge) // * todo: make less kludgey Map<String, Object> stringParameters = new HashMap<String, Object>(); for (Input input : parameters.keySet()) { Object value = parameters.get(input); if ((value instanceof String) || ((value instanceof String[]) && (((String[]) value).length > 1)) ) { stringParameters.put(input.getName(), parameters.get(input)); } else { String finalVal = ((String[]) value)[0]; stringParameters.put(input.getName(), finalVal); } } String query = queryGenerator.generateQuery(stringParameters, userName); log.info("User " + userName + " generated query: \n" + query); return query; } public void updateQueryGeneratorClass() throws BadReportSyntaxException { String className = generatedQueryElement.getClazz(); try { Class clazz = AppData.getCustomClassLoader().loadClass(className); queryGenerator = (QueryGenerator) clazz.newInstance(); } catch (InstantiationException e) { throw new BadReportSyntaxException("Class " + className + " cannot be abstract or interface."); } catch (IllegalAccessException e) { throw new BadReportSyntaxException("No access to class " + className); } catch (ClassNotFoundException e) { throw new BadReportSyntaxException("Can't find class " + className); } } }