WepsConnection.java [tools/WepsReportData/src/usda/weru/weps/reports/query] Revision:   Date:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package usda.weru.weps.reports.query;
// Note: this code was moved from a WEPS package.
// This is a fairly major rewrite to produce a class that minimizes code changes
//   in the rest of the files taht were ported over.
//package usda.weru.weps.reports.query;

/**
 *
 * @author jplyon
 */

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.logging.Logger;
import usda.weru.util.Util;
import usda.weru.weps.RunFileData;

/**
 * Workhorse class of the weps reporting.  This connection class extends the H2
 * databases's JdbcConnection and connects to the H2 engine as a memory only 
 * database.  This database is specific to this connection.  A single connection
 * may be used for more than one report.  This is often desirable because 
 * WepsConnection caches loaded data until closed.  
 * @author joelevin
 */
public class WepsConnection {

    private static final Logger LOGGER = Logger.getLogger(WepsConnection.class.getName());
    public static final String PROP_UNITS = "units";
    private String c_units = Util.SIUnits;

    ////////////////////////////////////////////////////////////////////////////
    // New member variables.
    
    // Hash map from the names of the parameters (columns) to their arrayed data.
    protected HashMap<String, ArrayList<Object>> m_ParamValues;

    ////////////////////////////////////////////////////////////////////////////

    public WepsConnection() {
        m_ParamValues = new HashMap<String, ArrayList<Object>> ();
    }

    private void checkParams(Properties info) {
        //check the units value
        if (info.containsKey(PROP_UNITS)) {
            String newUnits = info.getProperty(PROP_UNITS);
            if (Util.SIUnits.equals(newUnits) || Util.USUnits.equals(newUnits)) {
                c_units = newUnits;
            } else {
//                throw new SQLException("Unrecognized units value: " + newUnits);
            }
        }
    }

    public HashMap<String, ArrayList<Object>> getParamValues()
    {
        return m_ParamValues;
    }
    
    public void setUnits(String units) {
        String old = c_units;
        c_units = units;
    }

    public String getUnits() {
        return c_units;
    }

//    public void clearWepsData() {
//        synchronized (this) {
//            if (c_data != null) {
//                c_data.clear();
//            }
//        }
//    }
//
//    public void clearWepsData(String dataname) {
//        synchronized (this) {
//            if (c_data != null) {
//                c_data.remove(dataname);
//            }
//        }
//    }
//
    @Override
    public String toString() {
        StringBuffer buffer = new StringBuffer();

//        buffer.append(this.m_ParamValues.toString() + "\n");
        buffer.append("{\n");
        int i=0; int nParams = m_ParamValues.size();
        for (Map.Entry<String, ArrayList<Object>> entry : m_ParamValues.entrySet()) {
            String param = entry.getKey();
            buffer.append("\"" + param + "\":");
            ArrayList<Object> values = entry.getValue();
            buffer.append(values.toString());
            buffer.append((++i < nParams)? ",\n" : "\n");
        }       

        buffer.append("}\n");
        return buffer.toString();
    }

//    protected ResultSet getWepsData(String dataname, boolean fill) {
////        ReportContext.enter();
//        try {
//            synchronized (this) {
//                if (c_data == null) {
//                    c_data = new HashMap<String, WepsResultSet>();
//                }
//                WepsResultSet data = c_data.get(dataname);
//
//                if (data == null) {
//                    //No cached data so try to create a new resultset.
//                    if (RunsResultSet.NAME.equals(dataname)) {
//                        data = new RunsResultSet(this);
//                    } else if (StirEnergyResultSet.NAME.equals(dataname)) {
//                        data = new StirEnergyResultSet(this);
//                    } else if (CropRotationResultSet.NAME.equals(dataname)) {
//                        data = new CropRotationResultSet(this);
//                    } else if (SciEnergyResultSet.NAME.equals(dataname)) {
//                        data = new SciEnergyResultSet(this);
//                    } else if (NotesResultSet.NAME.equals(dataname)) {
//                        data = new NotesResultSet(this);
//                    } else if (SoilsResultSet.NAME.equals(dataname)) {
//                        data = new SoilsResultSet(this);
//                    } else if (BarriersResultSet.NAME.equals(dataname)) {
//                        data = new BarriersResultSet(this);
//                    } else if (OutputResultSet.NAME.equals(dataname)) {
//                        data = new OutputResultSet(this);
//                    } else if (HarvestsResultSet.NAME.equals(dataname)) {
//                        data = new HarvestsResultSet(this);
//                    } else if (ManagementResultSet.NAME.equals(dataname)) {
//                        data = new ManagementResultSet(this);
//                    } else if (OutputOpCropResultSet.NAME.equals(dataname)) {
//                        data = new OutputOpCropResultSet(this);
//                    } else if (ManagementNotesResultSet.NAME.equals(dataname)) {
//                        data = new ManagementNotesResultSet(this);
//                    }else if (FuelsResultSet.NAME.equals(dataname)) {
//                        data = new FuelsResultSet(this);
//                    } 
//                    else if (DatabaseCropsResultSet.NAME.equals(dataname)) {
//                        data = new DatabaseCropsResultSet(this);
//                    }
//                    else if (DatabaseOperationsResultSet.NAME.equals(dataname)) {
//                        data = new DatabaseOperationsResultSet(this);
//                    }
//                     else if (DatabaseManagementsResultSet.NAME.equals(dataname)) {
//                        data = new DatabaseManagementsResultSet(this);
//                    }
//                    else if (ConfidenceIntervalResultSet.NAME.equals(dataname)) {
//                        data = new ConfidenceIntervalResultSet(this);
//                    }
//                     //other resultsets go here
//                    else {
//                        //this isn't a known resultset
//                        throw new SQLException("Unknown WEPS ResultSet: " + dataname);
//                    }
//                    c_data.put(data.getName(), data);
//                }
//
//                if (fill) {
//                    data.fill();
//                }
//                return data;
//
//            }
//        } finally {
////            ReportContext.exit();
//        }
//    }
//
//    public synchronized File[] getRunFiles() {
//        if (c_runFiles == null) {
//            //create the list of runs            
//            c_runFiles = new LinkedList<File>();
//
//            if (c_rootFiles == null) {
//                String[] roots = c_rootString.split(",", -1);
//                File[] rootFiles = new File[roots.length];
//                for (int i = 0; i < roots.length; i++) {
//                    rootFiles[i] = new File(roots[i]);
//                }
//                buildFileList(c_runFiles, rootFiles);
//            } else {
//                buildFileList(c_runFiles, c_rootFiles);
//            }
//
//        }
//        return c_runFiles.toArray(new File[c_runFiles.size()]);
//    }
//
//    private void buildFileList(List<File> toKeep, File[] roots) {
//        if (roots == null) {
//            return;
//        }
//        for (File root : roots) {
//            if (accept(root) && !toKeep.contains(root)) {
//                toKeep.add(root.getCanOrAbsFile());
//            } else if (root.isDirectory()) {
//                buildFileList(toKeep, root.listFiles(File.getDefaultArchiveDetector()));
//            }
//        }
//    }
//
    private boolean accept(File file) {
        return file.isDirectory() && file.getName().toLowerCase().endsWith(RunFileData.RunSuffix);
    }

}