package com.triplemind.asp.generator;

import com.triplemind.asp.NappingAndAncestors;
import com.triplemind.asp.Page;
import com.triplemind.asp.Part;

import urlaubstage.site.Environment;

import org.apache.avalon.framework.parameters.Parameters;
import org.apache.avalon.framework.parameters.ParameterException;
import org.apache.cocoon.Constants;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.components.language.markup.xsp.XSPUtil;
import org.apache.cocoon.components.parser.Parser;
import org.apache.cocoon.environment.Request;
import org.apache.cocoon.environment.SourceResolver;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;

import java.io.IOException;
import java.io.StringReader;
import java.util.Map;

public class PageGenerator extends AbstractAggregator {

  protected NappingAndAncestors napping = null;
  protected Page page = null;

  public void setup(SourceResolver resolver, Map objectModel, String src, Parameters par)
  throws ProcessingException, SAXException, IOException {
    // Request holen
    Request request = (Request) objectModel.get(Constants.REQUEST_OBJECT);

    // Seite und Napping holen
    String nappingName = par.getParameter("nappingname", "default");
    String pageName = par.getParameter("pagename", "default");
    this.napping = new NappingAndAncestors(nappingName);
    this.page = napping.getPage(pageName);

    // Environment anlegen
    Environment env = Environment.getEnv(request, page);

    // Aggregieren
    this.setRootElement("page", "", "");
    for(int i=0; i<this.page.getPartList().size(); i++) {
      Part part = (Part) this.page.getPartList().get(i);
      this.addPart("cocoon:/component/" + napping.getName() +
                   "/" + part.getComponent().getComponentName() + ".xml",
        part.getElement(), part.getNamespace(),
        part.isStripRoot()?"true":"false", part.getPrefix());
    }

    super.setup(resolver, objectModel, src, par);
  }

  protected void extraElements() throws SAXException {
    Parser parser = null;
    try {
      parser = (Parser) this.manager.lookup(Parser.ROLE);
      parser.setContentHandler(contentHandler);
      InputSource in = new InputSource(new StringReader(page.getExtraXML()));
      XSPUtil.include(in, this.contentHandler, parser);
    } catch (Exception e) {
        contentHandler.startElement("", "", "error", new AttributesImpl());
        try {
          contentHandler.characters(e.getMessage().toCharArray(), 0, e.getMessage().length());
        } finally {
          contentHandler.endElement("", "", "error");
        }
    } finally {
      if (parser != null) this.manager.release(parser);
    }
  }

  public void recycle() {
    this.napping = null;
    this.page = null;
    super.recycle();
  }
}

