/* ====================================================================
 * The Apache Software License, Version 1.1
 *
 * Copyright (c) 2000-2001 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Apache" and "Apache Software Foundation" and
 *     "Apache Jetspeed" must not be used to endorse or promote products
 *    derived from this software without prior written permission. For
 *    written permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache" or
 *    "Apache Jetspeed", nor may "Apache" appear in their name, without
 *    prior written permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 */

package org.apache.jetspeed.util.rewriter;


// java.io
import java.io.Reader;

// java.net
import java.net.MalformedURLException;

// this makes it dependent on Swing...need an abstraction WTP
import javax.swing.text.html.HTML;
import javax.swing.text.MutableAttributeSet;

/**
 *
 * Sample of extending HTML Rewriter for your specific needs
 *
 *
 * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
 * @version $Id: SampleRewriter.java,v 1.4 2003/03/04 00:05:16 sgala Exp $
 */

public class SampleRewriter extends HTMLRewriter
{
    private boolean debug = false;
    private String basePortalURL;
    private String fullPortalURL;
    private String sampleURL;

    private String sessionID = "NONE";
    private String formID = "NONE";
    private boolean sampleEndFlag = false;

    public String getSessionID()
    {
        return sessionID;
    }

    public String getFormID()
    {
        return formID;
    }

    public boolean getSampleEndFlag()
    {
        return sampleEndFlag;
    }

    /*
     * Basic constructor for creating a Sample Rewriter.
     *
     * @param basePortalURL Base Portal URL
     * @param fullPortalURL  Full Portal URL with path parameters and query strings (sessionid)
     * @param sampleURL  The sample URL.
     *
     */
    public SampleRewriter(String basePortalURL, String fullPortalURL, String sampleURL )
    {
        this.basePortalURL = basePortalURL;
        this.fullPortalURL = fullPortalURL;
        this.sampleURL = sampleURL;
    }

    /*
     * Entry point into rewriting HTML content.
     *
     * Reads stream from proxied host, runs configured HTML parser against that stream,
     * rewriting relevant links, and writes the parsed stream back to the client.
     *
     * @param input the HTML input stream.
     * @param baseURL the base URL of the target host.
     * @return the rewritten HTML output stream.
     *
     * @exception MalformedURLException a servlet exception.
     */

    public String rewrite(Reader input, String baseURL)
                               throws MalformedURLException
    {
        String rewrittenHTML = "";
        this.basePortalURL = baseURL;

        HTMLParserAdaptor parser = new SwingParserAdaptor(this);
        rewrittenHTML = parser.run(input);

        return rewrittenHTML;
    }

    /*
     * <p>
     * This callback is called by the HTMLParserAdaptor implementation to write
     * back all rewritten URLs to point to the proxy server. The MMS implementation
     * writes specifically for network element ids and relative paths to MMS
     * resources.
     * </p>
     * <p>
     * Given the targetURL, rewrites the link as a link back to the proxy server.
     * </p>
     *
     * Example format:
     *
     *   http://proxyserver/proxy?neid=id?nepath=path
     *
     * @param targetURL the URL to be rewritten back to the proxy server.
     * @param baseURL the base URL of the target host.
     * @param proxyURL the base URL of the proxy server.
     * @return the rewritten URL to the proxy server.
     *
     * @exception MalformedURLException a servlet exception.
     */
    public String generateNewUrl(String targetURL, HTML.Tag tag, HTML.Attribute attribute)
    {
        if (debug)
            System.out.println("[rewriter] Tag: " + tag.toString() + "  Attribute: " + attribute.toString() + "  targetURL: " + targetURL + "  target = " + fullPortalURL + "]");

        // The only URL we want to re-write is ACTION attribute of the <FORM> tag.
        // Ignore all others
        if (tag == HTML.Tag.FORM && attribute == HTML.Attribute.ACTION) {

            // Strip the session Id value out of the ACTION attribute value
            int sessionLocation = targetURL.indexOf( "?sessionId" );
            if (sessionLocation > -1) {
                int equalsLocation = targetURL.indexOf( "=", sessionLocation );
                if (equalsLocation > -1) {
                    int ampLocation = targetURL.indexOf( "&", equalsLocation );
                    if (ampLocation > -1) {
                        sessionID = targetURL.substring( equalsLocation + 1, ampLocation );
                    } else {
                        sessionID = targetURL.substring( equalsLocation + 1 );
                    }
                }
            }

            if (sampleEndFlag) {
                // The sample session is being terminated, make the form action return to the portal home page
                return basePortalURL;
            } else {
                // Make the form action run the same portal page
                return fullPortalURL;
            }
        }

        // This is a tag that we do not wish to re-write, return it's own value unmodified
        return targetURL;
    }

    /*
     * Returns true if all rewritten URLs should be sent back to the proxy server.
     *
     * @return true if all URLs are rewritten back to proxy server.
     */
    public boolean proxyAllTags()
    {
        return true;
    }

    /*
     * Start Tag Events
     */
    public String exitStartTagEvent(HTML.Tag tag, MutableAttributeSet attrs)
    {
        if (tag == HTML.Tag.FORM)
        {
            String inputTag = "<input type='hidden' name='sessionId' value='" + sessionID + "'/>";
            return inputTag;
        }
        return null;
    }

    /*
     * Simple Tag Events
     */

    public boolean enterSimpleTagEvent(HTML.Tag tag, MutableAttributeSet attrs)
    {
        if (tag == HTML.Tag.META)
        {
            Object o = attrs.getAttribute(HTML.Attribute.NAME);
            if (o != null)
            {
                String s = o.toString();
                if (s.equalsIgnoreCase("SampleEnd"))
                {
                    sampleEndFlag = true;
                }
            }
        }
        return true;
    }


    /*
     * Convert Tag Events
     */

    public void convertTagEvent(HTML.Tag tag, MutableAttributeSet attrs)
    {
        if (tag == HTML.Tag.FORM) {
           // All forms from sample will have the same form NAME.
           // Jetspeed will add its own FORM depending on the type of portlet
           // being used.  So if you have multiple forms, any Javascript will
           // have to know which form to reference.
           attrs.addAttribute("NAME","SampleForm");
        }

        // INPUT Tag
        if (tag == HTML.Tag.INPUT)
        {
            Object o = attrs.getAttribute(HTML.Attribute.NAME);
            if (o != null)
            {
                String s = o.toString();
                if (s.equalsIgnoreCase("FormID"))
                {
                    o = attrs.getAttribute(HTML.Attribute.VALUE);
                    if (o != null)
                    {
                        formID = o.toString();
                    }
                }
            }
        }

    }

}

