package cwp.tags;

import java.io.*;
import javax.servlet.*;
import javax.servlet.jsp.*;
import javax.servlet.http.*;
import javax.servlet.jsp.tagext.*;
import javax.xml.transform.*;
import cwp.XslTransformer;

/** A tag that translates an XML document to HTML using XSLT.
 *  Depending on the client browser type, either an XSL style
 *  targeting Internet Explorer or Netscape (default) is 
 *  applied.
 *
 *  Taken from Core Web Programming from 
 *  Prentice Hall and Sun Microsystems Press,
 *  http://www.corewebprogramming.com/.
 *  &copy; 2001 Marty Hall and Larry Brown;
 *  may be freely used or adapted. 
 */

public class XslTransformTag extends TagSupport {
  private static final String FS = 
    System.getProperty("file.separator");
  private static final int IE = 1;
  private static final int NS = 2;
  private String xml, xslie, xslns;

  public void setXml(String xml) {
    this.xml = xml;
  }

  public String getXml() {
    return(xml);
  }

  public void setXslie(String xslie) {
    this.xslie = xslie;
  }

  public String getXslie() {
    return(xslie);
  }

  public void setXslns(String xslns) {
    this.xslns = xslns;
  }

  public String getXslns() {
    return(xslns);
  }

  public int doStartTag() throws JspException {
    // Determine the path to XML and XSL source files.
    // The path of SERVLET_HOME/WEB-INF/classes/cwp/ is 
    // assumed for the location of the source files.
    String FS = System.getProperty("file.separator");
    ServletContext context = pageContext.getServletContext();
    String path = context.getRealPath(FS) + "WEB-INF" + FS +
                  "classes" + FS + "cwp" + FS;

    HttpServletRequest request = 
      (HttpServletRequest)pageContext.getRequest();

    // Use either IE or NS style sheet depending on 
    // browser type.
    File xslFile = null;
    if ((browserType(request) == IE) && (getXslie() != null)) {
      xslFile = new File(path + getXslie());
    } else {
      xslFile = new File(path + getXslns());
    }
    File xmlFile = new File(path + getXml());

    try {
      JspWriter out = pageContext.getOut();
      XslTransformer transformer = new XslTransformer();
      transformer.process(xmlFile, xslFile, out);
    }
    catch(TransformerException tx) {
      context.log("XslTransformTag: " + tx.getMessage());
    }
    return(SKIP_BODY);
  }
  
  // Determine the browser type based on the User-Agent
  // HTTP request header.
  private int browserType(HttpServletRequest request) {
    int type = NS;
    String userAgent = request.getHeader("User-Agent");
    if ((userAgent != null) && 
        (userAgent.indexOf("IE") >=0)) {
      type = IE;
    }
    return(type);
  }
}