package net.mar;
import java.sql.*;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import uk.ac.roe.wfau.HTMLFormatter;


public class ParseVOT
{
    static DateFormat timeFormatter =DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT,Locale.UK);
    static double nan=0.0;
    ResultSetMetaData rsmd;
	String SQLQuery=""; 
	String [] stringArray;
	int [] typesArray;
	private int noCols=0;
	String database="";
	public ParseVOT () {
	    }
    public ParseVOT (String SQLQuery ) {
	        this.SQLQuery=SQLQuery;
	    }
    public ParseVOT (String SQLQuery,String database ) {
        this.SQLQuery=SQLQuery;
        this.database=database;
    }
public String getVOTHeader(){
		return "<?xml version=\"1.0\"?>\n" +
//		"<!DOCTYPE VOTABLE SYSTEM \"http://us-vo.org/xml/VOTable.dtd\">\n" +
		"<!DOCTYPE VOTABLE SYSTEM \"http://surveys.roe.ac.uk/ssa/VOTable.dtd\">\n" +
		"<VOTABLE version=\"1.0\">\n"+
		"<DEFINITIONS>\n"+
		"</DEFINITIONS>\n"+
  		"<RESOURCE>\n"+
        "<PARAM name=\"archive\" datatype=\"char\" arraysize=\"*\" value=\"\">"+
        "<DESCRIPTION>URL of data archive</DESCRIPTION></PARAM>\n"+
        "<TABLE name=\"Results\">\n"+
        "<DESCRIPTION>Results of Query: database "+database+" "+timeFormatter.format(new Date())+" <!-- "+SQLQuery+" --></DESCRIPTION>";

}
public String setRSMD(ResultSetMetaData rsmd){
	StringBuffer meta = new StringBuffer("");
	try {
	this.rsmd=rsmd;
		noCols=rsmd.getColumnCount();
	    int length=0;
	    String datatype;
	    String name;
	    String arraysize;
	    String ucd;
	    typesArray=new int[noCols];
	    stringArray=new String[noCols];

			for (int i=0; i<noCols; i += 1) {
				datatype="";
				name="";
				arraysize="";
				ucd="";
				name=rsmd.getColumnName(i+1);

				switch(rsmd.getColumnType(i+1)){
					case Types.TINYINT :
					datatype="short";
					typesArray[i]=Types.TINYINT;
					break;
					case Types.SMALLINT :
					datatype="short";
					typesArray[i]=Types.SMALLINT;
					break;
					case Types.INTEGER :
					datatype="int";
					typesArray[i]=Types.INTEGER;
					break;
					case Types.BIGINT :
					datatype="long";
					typesArray[i]=Types.BIGINT;
					break;					
					case Types.REAL :
					datatype="float";
					typesArray[i]=Types.REAL;
					break;
					case Types.FLOAT :
					datatype="double";
					typesArray[i]=Types.FLOAT;
					break;
					case Types.DOUBLE :
					datatype="double";
					typesArray[i]=Types.DOUBLE;
					break;
					case Types.VARCHAR :
					datatype="char";
				    length=rsmd.getPrecision(i+1);
				    arraysize=" arraysize=\""+length+"\"";
				    typesArray[i]=Types.VARCHAR;
					break;
					case Types.CHAR :
					datatype="char";
				    length=rsmd.getPrecision(i+1);
				    arraysize=" arraysize=\""+length+"\"";
				    typesArray[i]=Types.CHAR;
					break;
					case Types.DATE :
					datatype="char";
					typesArray[i]=Types.DATE;
					break;					
					case Types.DECIMAL :
					datatype="double";
					typesArray[i]=Types.DECIMAL;
					break;
					case Types.NUMERIC :
					datatype="double";
					typesArray[i]=Types.NUMERIC;
					break;
					default :
					datatype="char";
				    length=rsmd.getPrecision(i+1);
				    arraysize=" arraysize=\"21\"";
					typesArray[i]=Types.OTHER;
					break;
			}
			meta.append("<FIELD name=\""+name+"\" datatype=\""+datatype+"\""+arraysize+"/> \n");
		}
	}
	catch(Exception e){
					System.out.println("A Problem occured: " + e);
			}
			meta.append("<DATA>\n<TABLEDATA>\n");
	return meta.toString();
}



public String[] setRS(ResultSet rs){
    String tempString=new String()	;
	
	
	//stringArray=new String[noCols];
	
	try {
        //noRows=-+1;
		for (int i=0; i<noCols; i += 1) {
			//switch(rsmd.getColumnType(i+1)){
			switch(typesArray[i]){
				case Types.TINYINT :
				try {
				//stringArray[i]=formatArray[i].form(Long.parseLong(rs.getString(i+1)));
				//stringArray[i]=pad(tiny_int.format(Long.parseLong(rs.getString(i+1))),4);
				stringArray[i]=rs.getString(i+1);
				}
				catch(Exception e) {
				//stringArray[i]=formatArray[i].form(0L);
				stringArray[i]="0";
				}
				break;
				case Types.SMALLINT :
				try {
				//stringArray[i]=formatArray[i].form(Long.parseLong(rs.getString(i+1)));
				//stringArray[i]=pad(small_int.format(Long.parseLong(rs.getString(i+1))),6);
				stringArray[i]=rs.getString(i+1);
				}
				catch(Exception e) {
				//stringArray[i]=formatArray[i].form(0L);
				stringArray[i]="0";
				}
				break;
				case Types.INTEGER :
				try {
				//stringArray[i]=formatArray[i].form(Long.parseLong(rs.getString(i+1)));
				//stringArray[i]=pad(norm_int.format(Long.parseLong(rs.getString(i+1))),11);
				    stringArray[i]=rs.getString(i+1);
				}
				catch(Exception e) {
				//stringArray[i]=formatArray[i].form(0L);
				stringArray[i]="0";
				}
				break;
				case Types.BIGINT :
				try {
				//stringArray[i]=formatArray[i].form(Long.parseLong(rs.getString(i+1)));
				//stringArray[i]=pad(big_int.format(Long.parseLong(rs.getString(i+1))),20);
				    stringArray[i]=rs.getString(i+1);
				}
				catch(Exception e) {
				//stringArray[i]=formatArray[i].form(0L);
				stringArray[i]="0";
				}
				break;
				case Types.REAL :
				try {
				    stringArray[i]=rs.getString(i+1);
				}

				catch(Exception e) {
				//stringArray[i]=formatArray[i].form(dnull);
				stringArray[i]=String.valueOf(nan);
				}
				break;
				case Types.FLOAT :
				try {
				    stringArray[i]=rs.getString(i+1);
				}
				catch(Exception e) {
					stringArray[i]=String.valueOf(nan);
				}
				break;
				case Types.DOUBLE :
					try {
					    stringArray[i]=rs.getString(i+1);
					}
					catch(Exception e) {
					    stringArray[i]=String.valueOf(nan);
					}
					break;
				case Types.VARCHAR :
					try {
					    					    
						tempString=rs.getString(i+1).trim();
						if (tempString==null || tempString.equals("null")){
							tempString=" ";
								}
					stringArray[i]=HTMLFormatter.forHTMLTag(tempString);
						}										
					catch(Exception e) {
					stringArray[i]=" ";
					}
				    break;
					case Types.CHAR :
						try {
    					    	tempString=rs.getString(i+1).trim();
    					    		if (tempString==null || tempString.equals("null")){
    					    		    tempString=" ";
    					    		}
    					    		stringArray[i]=HTMLFormatter.forHTMLTag(tempString);
						}
						catch(Exception e) {
						    	stringArray[i]=" ";
							}
				    break;

					case Types.DATE :
							    tempString=rs.getString(i+1).trim();
							    if (tempString==null || tempString.equals("null")){
									tempString=" ";

								}
							    stringArray[i]=HTMLFormatter.forHTMLTag(tempString);
							    break;
					case Types.OTHER :
					tempString=rs.getString(i+1);
					if (tempString==null || tempString.equals("null")){
						tempString=" ";
								}
					
					stringArray[i]=HTMLFormatter.forHTMLTag(tempString);
								break;	
				case Types.DECIMAL :
				try {
				    stringArray[i]=rs.getString(i+1);				
				}
				catch(Exception e) {
				    stringArray[i]=String.valueOf(nan);
				}
				break;

				case Types.NUMERIC :
				try {
				    stringArray[i]=rs.getString(i+1);
				}
				catch(Exception e) {
				    stringArray[i]=String.valueOf(nan);
				}
				break;

				default :
				tempString=rs.getString(i+1);
				if (tempString==null || tempString.equals("null")){
					tempString=" ";
							}
				stringArray[i]=HTMLFormatter.forHTMLTag(tempString);
							break;
			}
		}

	}
catch(Exception e){
				System.out.println("A Problem occured: " + e);
			}
return stringArray;

}


public String getFooter(){
		return "</TABLEDATA>\n</DATA>\n</TABLE>\n</RESOURCE>\n</VOTABLE>" ;

}

}