/* * Created on 1/04/2005 */ package DMS; import java.sql.Connection; import java.util.Vector; import java.util.HashMap; import java.util.Enumeration; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.ResultSet; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Calendar; import java.util.GregorianCalendar; import javax.servlet.http.HttpServletRequest; import java.sql.Timestamp; import java.util.TimeZone; /** * @author mtayler */ public class dbTemplateData { private int FRecPos; private Vector FRecords; private Vector FFilteredRecords; private templateItem FTemplate; private HttpServletRequest FRequest; private Calendar FLastLoadTime = null; private static int LOAD_INTERVAL_MIN = 1; //interval that the data should be reloaded public dbTemplateData(templateItem template, HttpServletRequest request) { FRecords = new Vector(); FFilteredRecords = new Vector(); FTemplate = template; FRequest = request; } private String getParameter(String key) { if (FRequest!=null) return FRequest.getParameter(key); else return null; } private String getData(String name, String datatype, String format, ResultSet rs) { try { if (datatype.toLowerCase().equals("string")||datatype.toLowerCase().equals("varchar")||datatype.toLowerCase().equals("char")) { return rs.getString(name); } else if (datatype.toLowerCase().equals("number")||datatype.toLowerCase().equals("int")||datatype.toLowerCase().equals("integer")||datatype.toLowerCase().equals("bigint")) { double data = rs.getDouble(name); DecimalFormat df = new DecimalFormat(format); return df.format(data); } else if (datatype.toLowerCase().equals("date")||datatype.toLowerCase().equals("datetime")) { //need to add 8 hours to the date because the db stores the date as GMT+0 instead of GMT+8 GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone("GMT+08:00")); Timestamp data = rs.getTimestamp(name, cal); SimpleDateFormat df = new SimpleDateFormat(format); return df.format(data); } } catch (SQLException e) { e.printStackTrace(); } return ""; } private boolean isFilteredRecord(HashMap map) { columnItem [] cols = FTemplate.getColumns().getColumns(); for (int i = 0; i 0) || (toDate!=null && toDate.compareTo(dataValueDate)<0))) { return false; } } else if (cols[i].getDataType().equals("number")||cols[i].getDataType().equals("integer")||cols[i].getDataType().equals("int")||cols[i].getDataType().equals("bigint")) { String nameFrom="numberrangefield" + cols[i].getName() + "From"; String nameTo="numberrangefield" + cols[i].getName() + "To"; String defaultValueFrom = DMSUtils.NVL(getParameter(nameFrom)); String defaultValueTo = DMSUtils.NVL(getParameter(nameTo)); Integer fromInt = DMSUtils.StringToInteger(defaultValueFrom); Integer toInt = DMSUtils.StringToInteger(defaultValueTo); Integer dataValueInt = DMSUtils.StringToInteger(dataValue); if (dataValueInt!=null && ((fromInt!=null && fromInt.compareTo(dataValueInt) > 0) || (toInt!=null && toInt.compareTo(dataValueInt)<0))) { return false; } } else { String filterValue = DMSUtils.NVL(getParameter("filterfield"+cols[i].getName())); if (!filterValue.equals("") && !filterValue.equals("ALL") && !filterValue.equals(dataValue)) { return false; } } } return true; } public String getSortField() { Enumeration e = null; if (FRequest!=null) e = FRequest.getParameterNames(); while (e!=null && e.hasMoreElements()) { String name = DMSUtils.NVL((String) e.nextElement()); if (name.length()>=9 && name.toLowerCase().substring(0,9).equals("sortfield")) { String value = DMSUtils.NVL(getParameter(name)); if (value.equals("asc") || value.equals("desc")) return name.toLowerCase(); } } return ""; } private void sortValue(String sortField, boolean isAscending, HashMap data, int startIndex, int endIndex) { String firstRecordValue = getFieldValue(sortField, startIndex); String lastRecordValue = getFieldValue(sortField, endIndex); String newValue = (String)data.get(sortField); columnItem item = FTemplate.getColumnByName(sortField); String datatype = item.getDataType(); String format = item.getFormat(); if (DMSUtils.compareToValue(firstRecordValue, newValue, datatype, format, isAscending)>0) { //if newValue is less than firstValue FFilteredRecords.insertElementAt(data,startIndex); //insert before the first record } else if (DMSUtils.compareToValue(lastRecordValue, newValue, datatype, format, isAscending)<=0) { //if newValue is greater than or equal to the lastValue FFilteredRecords.insertElementAt(data,endIndex+1); //insert after the last record } else if (startIndex == endIndex-1) { //if there are no more records in between FFilteredRecords.insertElementAt(data,startIndex+1); //insert after the first record } else { //recursive sort int midIndex = (startIndex + endIndex) / 2; String midRecordValue = getFieldValue(sortField, midIndex); if (DMSUtils.compareToValue(midRecordValue, newValue, datatype, format, isAscending)>0) { //if newValue is less than midRecordValue sortValue(sortField, isAscending, data, startIndex+1, midIndex); } else { sortValue(sortField, isAscending, data, midIndex, endIndex-1); } } } private void addFilteredRecord(HashMap data) { //get the field to sort on String sortFieldParam = getSortField(); boolean isAscending = DMSUtils.NVL(getParameter(sortFieldParam)).toLowerCase().equals("asc"); if (FFilteredRecords.size()==0 || sortFieldParam.equals("")) { //if empty or no sorting is performed append the record FFilteredRecords.add(data); } else { String sortField = sortFieldParam.substring(9); sortValue(sortField, isAscending, data, 0, FFilteredRecords.size()-1); } } private boolean hasTimeExceeded() { if (FLastLoadTime!=null) { long lastTimeMin = FLastLoadTime.getTimeInMillis()/60000; Calendar currentTime = new GregorianCalendar(); currentTime.setTime(new Date()); long newTimeMin = currentTime.getTimeInMillis()/60000; return (newTimeMin-lastTimeMin)>LOAD_INTERVAL_MIN; } return true; } public void load(HttpServletRequest request) { FRequest = request; //update request object FFilteredRecords.clear(); //clear old records FRecPos = -1; if (!hasTimeExceeded()) { for (int i = 0; i < FRecords.size(); i++) { HashMap data = (HashMap)FRecords.get(i); if (isFilteredRecord(data)) addFilteredRecord(data); } } else { //reset time FLastLoadTime = new GregorianCalendar(); FLastLoadTime.setTime(new Date()); FRecords.clear(); //clear old records Connection conn = dbConnector.getConnection(FTemplate.getDSName()); try { try { String SQL = FTemplate.getSQL(); PreparedStatement pstmnt = conn.prepareStatement(SQL); ResultSet rs = pstmnt.executeQuery(); try { while (rs.next()) { HashMap data = new HashMap(); columnItem [] cols = FTemplate.getColumns().getColumns(); for (int i = 0; i< cols.length; i++) { String sValue = getData(cols[i].getName(),cols[i].getDataType(), cols[i].getFormat(), rs); data.put(cols[i].getName(), sValue); } FRecords.add(data); if (isFilteredRecord(data)) addFilteredRecord(data); } } finally { rs.close(); } } finally { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } public boolean next() { FRecPos++; return FRecPos0) FRecPos=0; } public void last() { if (FFilteredRecords.size()>0) FRecPos=FFilteredRecords.size()-1; } public String getFieldValue(String fieldname, int index) { String fieldvalue = ""; if (index>-1 && index-1 && index