/**
 * $RCSfile$
 * Copyright 2002-2003 by Robert Simmons Jr., All Rights Reserved
 *
 * Last Checked in by: $Author$
 * Last Checked in on: $Date$
 * Currently Locked By: $Locker$
 * Working Tag: $Name$
 *
 * End: Mirror Standard Header.
 ***** DO NOT EDIT ABOVE THIS LINE *****/
package jconfer.client.xmlclient;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import jconfer.data.Smiley;
import mirror.datafetch.DataFetch;
import mirror.datafetch.DataFetchHome;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.ProcessingInstruction;
import jconfer.client.xmlclient.commands.*;


/** An XML based client to JConfer.
 *
 * <p><b><small>Current CVS Tag:  $Name$</b></small></p>
 * @version $Revision$
 * @author $author$
 */
public class XMLClient extends HttpServlet {
  
  /** Holds the logger object. */
  private final static Logger LOGGER = Logger.getLogger(XMLClient.class);
  
  /** {@inheritdoc} */
  public void init(final ServletConfig config) throws ServletException {
    super.init(config);
  }
  
  /** {@inheritdoc} */
  public void destroy() {
  }
  
  /** Helper method to process requests.
   * @param request The request to process.
   * @param response response to the request.
   */
  protected void processRequest(final HttpServletRequest request, final HttpServletResponse response)
  throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    response.setContentType("text/xml");
    //response.setHeader("Cache-Control", "no-store");
    
    try {
      DocumentBuilderFactory domDBF = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = domDBF.newDocumentBuilder();
      Document doc = builder.newDocument();
      ProcessingInstruction procInstr = doc.createProcessingInstruction(
      "xml-stylesheet", "type=\"text/xsl\" href=\"XSL/jconfer-page.xsl\"");
      doc.appendChild(procInstr);
      procInstr = doc.createProcessingInstruction("cocoon-process","type=\"xslt\"");
      doc.appendChild(procInstr);
      Element root = doc.createElement("jconfer:jconfer-page");
      root.setAttribute("xmlns:jconfer", "http://www.jconfer.org/");
      root.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
      root.setAttribute("xsi:schemaLocation", "http://www.jconfer.org/ XSD/JConfer.xsd");
      doc.appendChild(root);
      // -- Username
      Element element = doc.createElement("username");
      element.setNodeValue("derisor");
      root.appendChild(element);
      // -- Dispatching
      Map params = request.getParameterMap();
      String command = ((String[])params.get("command"))[0];
      if (command.equals("SmileyAdminView")) {
        root.appendChild(new SmileyAdminView().executeCommand(request, doc));
      } else if (command.equals("SmileyEditView")) {
        root.appendChild(new SmileyEditView().executeCommand(request, doc));
      }
      // -- Output the document.
      TransformerFactory transformerFactory = TransformerFactory.newInstance();
      Transformer transformer = transformerFactory.newTransformer();
      transformer.setOutputProperty(OutputKeys.METHOD, "xml");
      transformer.setOutputProperty(OutputKeys.INDENT, "yes");
      transformer.transform(new DOMSource(doc), new StreamResult(response.getWriter()));
      
      // -- Close resources
      response.getWriter().close();
    } catch (Exception ex) {
      LOGGER.error("Exception while processing " + request.getRequestURI() +
      "?" + request.getQueryString() + ":" , ex);
    }
    if (LOGGER.isInfoEnabled()) {
      LOGGER.info(request.getRequestURI());
      LOGGER.info(request.getQueryString());
    }
    // Close the output stream. All done.
    out.close();
  }
  
  /** {@inheritdoc} */
  protected void doGet(final HttpServletRequest request, final HttpServletResponse response)
  throws ServletException, IOException {
    processRequest(request, response);
  }
  
  /** {@inheritdoc} */
  protected void doPost(final HttpServletRequest request, final HttpServletResponse response)
  throws ServletException, IOException {
    processRequest(request, response);
  }
  
  /** {@inheritdoc} */
  public String getServletInfo() {
    return "Short description";
  }
  
}