/**
 * MapGenerator Sample Extensions
 */
package mycompany.map.data;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashSet;

import mycompany.map.generator.MapGeneratorExtension;

import org.w3c.dom.Element;

import idea.geographic.coordsys.orthogonal2d.S42GeoPosition;
import idea.map.data.AbstractDataValues;
import idea.map.data.DataValue;
import idea.map.generator.MapGenerator;
import idea.mapgen.editor.XmlBean;


/**
 * Data values - obtained from PostgreSQL DB.
 * See /SQL/measured_data.sql
 * 
 * Usage:
 *  
 * DataValues class="mycompany.map.data.DataValuesFromPgSQL" ...
 *  
 * 
 * See /runsets/RunSet.xml for sample of usage
 *  
 * @author Lumir Vanek, vanek@idea-envi.cz
 *
 */
@XmlBean(icon="DataValuesFromDb.png")
public class DataValuesFromPgSQL extends AbstractDataValues 
{
	/**
	 * Serial ID
	 */
	private static final long serialVersionUID = 569620990893237824L;

	/**
	 * Constructor
	 * 
	 * @param notRenderedDataValues Codes of data values, that are not rendered on map
	 * @param disabledDataValues Codes of data values, that are not used for loading
	 */
	public DataValuesFromPgSQL(HashSet< String > notRenderedDataValues, HashSet< String > disabledDataValues)
	{
		super(notRenderedDataValues, disabledDataValues);
	}
	
	/**
	 * XML Runset constructor, initialize yourself from given DOM element
	 * 
	 * @param domElement DOM element
	 */
	public DataValuesFromPgSQL(Element domElement)
	{
		super(domElement);
	}

	/**
	 * Initialize
	 * 
	 * @param mapGenerator The Map generator
	 */
	public void initialize(final MapGenerator mapGenerator)
	{
		if(mapGenerator instanceof MapGeneratorExtension)
		{
			MapGeneratorExtension mpe = (MapGeneratorExtension) mapGenerator;
			// Connection to PostgreSQL
			final Connection connection = mpe.getConnection();
			
			try
			{
				final Statement stmtSelect = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
				
				try
				{
					final ResultSet resultSet = stmtSelect.executeQuery("SELECT * FROM measured_data");
					try
					{
						// Load data from measured_data table
						while(resultSet.next())
						{
							String name = resultSet.getString("name");
							int positionX = resultSet.getInt("position_x");
							int positionY = resultSet.getInt("position_y");
							float value = resultSet.getFloat("the_value");
							
							add(new DataValue(value,
									new S42GeoPosition(positionX, positionY),
									name)
							);
						}
					}
					finally
					{
						resultSet.close();
					}
				}
				finally
				{
					stmtSelect.close();
				}
			}
			catch (SQLException e) 
			{
				throw new RuntimeException(e.getClass().toString() + " - " + e.getLocalizedMessage());
			}
		}
		else
		{
			throw new RuntimeException("Map Generator is not MapGeneratorExtension");
		}
	}
}