// package clt.taglibs.sql2xml;

import java.beans.*;
import java.io.*;
import java.sql.*;
import java.lang.reflect.*;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.TagSupport;

public class XmlForResultSetTag  extends TagSupport{
  // ------------------------------------------------------------- Properties
  String name    = null;
  String rootTag = "ROWSET";
  String rowTag  = "ROW"; 
 
  public void setName(String _name) {
    name = _name;
  }
  public void setRootTag(String _rootTag) {
    rootTag = _rootTag;
  }
  public void setRowTag(String _rowTag) {
    rowTag = _rowTag;
  } 
  // ----------------------------------------------------------------------------- Public Method 
  public int doStartTag() throws JspException {
    // 
    Object o = pageContext.findAttribute(name);
    
    if (o == null) {
      throw new JspException("Missing JSP bean '" + name + "'");
    }
    // Render the contents of this bean to our writer
    try {
        JspWriter out = pageContext.getOut();
        String xml = getXmlForResultSet((ResultSet) o, rootTag,  rowTag);
        out.print(xml);
    } catch (Exception e) {
        throw new JspException("Error writing output: " + e.toString());
    }
    // Skip the body of this tag (which should be empty anyway)
    return (SKIP_BODY);
  } //DoStartTag
  
  public void release() {
    name = null;
  }
  //-----------------------------------------------------------------------------
   private String getXmlForResultSet(ResultSet rs, String rootTag, String rowTag) throws SQLException {
      ResultSetMetaData rsMeta = rs.getMetaData();
      int Count;
      StringBuffer buf = new StringBuffer();
      buf.append("<?xml version=\"1.0\" encoding=\"Big5\"?>\n");
      Count = rsMeta.getColumnCount();
      // 
      buf.append('<'); buf.append(rootTag); buf.append(">\n");
      while(rs.next()) {
         buf.append('<'); buf.append(rowTag); buf.append(">\n");
         for(int i=1; i <= Count; i++) {
             String cName=rsMeta.getColumnName(i);
             String value = rs.getString(cName);
             buf.append('<');  buf.append(cName); buf.append('>');
             // 
             if(!rs.wasNull()) buf.append(value);
             buf.append("</"); buf.append(cName); buf.append(">\n");
         } // For
         buf.append("</"); buf.append(rowTag); buf.append(">\n");
      }  // While
      buf.append("</"); buf.append(rootTag); buf.append(">\n");
      return (buf.toString());
   }
}
