/*
* Copyright 2000-2001,2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
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.5 2004/02/23 03:18:59 jford 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();
}
}
}
}
}
}