Package org.w3c.jigsaw.filters

Source Code of org.w3c.jigsaw.filters.RegexRedirectFilter

// RegexRedirectFilter.java
// $Id: RegexRedirectFilter.java,v 1.3 2000/08/16 21:37:38 ylafon Exp $
// (c) COPYRIGHT MIT, INRIA and Keio, 1999.
// Please first read the full copyright statement in file COPYRIGHT.html

package org.w3c.jigsaw.filters;

import java.net.MalformedURLException;
import java.net.URL;

import org.w3c.tools.resources.Attribute;
import org.w3c.tools.resources.AttributeRegistry;
import org.w3c.tools.resources.FramedResource;
import org.w3c.tools.resources.ReplyInterface;
import org.w3c.tools.resources.RequestInterface;
import org.w3c.tools.resources.Resource;
import org.w3c.tools.resources.ResourceFilter;
import org.w3c.tools.resources.ResourceFrame;
import org.w3c.tools.resources.StringArrayAttribute;

import org.w3c.jigsaw.http.Reply;
import org.w3c.jigsaw.http.Request;

import org.w3c.www.http.HTTP;
import org.w3c.www.http.HttpReplyMessage;
import org.w3c.www.http.HttpRequestMessage;

import org.w3c.jigsaw.html.HtmlGenerator;

import org.w3c.www.http.HTTP;
import org.w3c.www.http.HttpReplyMessage;
import org.w3c.www.http.HttpRequestMessage;

import org.apache.oro.text.regex.MalformedPatternException;
import org.apache.oro.text.regex.Pattern;
import org.apache.oro.text.regex.PatternCompiler;
import org.apache.oro.text.regex.PatternMatcher;
import org.apache.oro.text.regex.Substitution;
import org.apache.oro.text.regex.Perl5Compiler;
import org.apache.oro.text.regex.Perl5Matcher;
import org.apache.oro.text.regex.Perl5Substitution;
import org.apache.oro.text.regex.Util;

public class RegexRedirectFilter extends ResourceFilter {
    /*
     * Attribute index - the URL rewriting patterns
     */
    protected static int ATTR_PATTERNS = -1;

    static {
  Class     c = null;
  Attribute a = null;
  try {
      c = Class.forName("org.w3c.jigsaw.filters.RegexRedirectFilter");
  } catch (Exception ex) {
      ex.printStackTrace();
      System.exit(1);
  }
  // Register the PATTERNS attribute:
  a = new StringArrayAttribute("patterns"
             , null
             , Attribute.EDITABLE);
  ATTR_PATTERNS = AttributeRegistry.registerAttribute(c, a);
    }

    Pattern patterns[]      = null;
    String  substitutions[] = null;
    Pattern dec_pat         = null;

    /**
     * Catch the regexp to reset the precomputed patterns
     * @param idx The attribute being set.
     * @param val The new attribute value.
     */

    public void setValue(int idx, Object value) {
  super.setValue(idx, value);
  if ( idx == ATTR_PATTERNS ) {
      synchronized (this) {
    patterns = null;;
      }
  }
    }

    private Pattern[] getPatterns() {
  if (patterns != null)
      return patterns;
  String raw_pat[] = (String[]) getValue(ATTR_PATTERNS, null);
  if (raw_pat == null)
      return null;
  patterns = new Pattern[raw_pat.length];
  substitutions = new String[raw_pat.length];
  int realsize = 0;

  PatternCompiler compiler = new Perl5Compiler();
  PatternMatcher matcher = new Perl5Matcher();
 
  for (int i=0; i<raw_pat.length; i++) {
      try {
    if (matcher.matches(raw_pat[i], dec_pat)) {
        patterns[realsize] =
      compiler.compile(matcher.getMatch().group(1));
        substitutions[realsize] = matcher.getMatch().group(2);
        realsize++;
    }
      } catch (MalformedPatternException ex) {
    // bad configuration...
      }
  }
  if (realsize != raw_pat.length) {
      // trim that the hard way :)
      Pattern t_patterns[] = new Pattern[realsize];
      String t_substitutions[] = new String[realsize];
      System.arraycopy(patterns, 0, t_patterns, 0, realsize);
      System.arraycopy(substitutions, 0, t_substitutions, 0, realsize);
      patterns = t_patterns;
      substitutions = t_substitutions;
  }
  return patterns;
    }

    private String[] getSubstitutions() {
  if (substitutions != null)
      return substitutions;
  getPatterns();
  return substitutions;
    }

    /**
     * The right syntax for rules is regexp$   substitution
     * like Apache redirecter rules
     */

    public void initialize(Object values[]) {
  super.initialize(values);
  PatternCompiler compiler = new Perl5Compiler();
  try {
      dec_pat = compiler.compile("(.*)\\$\\s+(.*)");
  } catch (MalformedPatternException ex) {
      ex.printStackTrace();
    // should never happen
  }
    }

    public ReplyInterface ingoingFilter(RequestInterface request) {
  Request req = (Request) request;
  String  requrl = req.getURL().toExternalForm();
  PatternMatcher matcher = new Perl5Matcher();
  Pattern pat[] = getPatterns();
  if (pat == null || pat.length == 0)
      return null;
  String sub[] = getSubstitutions();
  String result = null;
  for (int i=0; i< pat.length; i++) {
      if (matcher.matches(requrl, pat[i])) {
    Substitution s = new Perl5Substitution(sub[i]);
    result = Util.substitute(matcher, pat[i], s, requrl,
           Util.SUBSTITUTE_ALL);
    break;
      }
  }
  if (result != null) {
      URL loc = null;
      try {
    loc = new URL(req.getURL(), result);
      } catch (MalformedURLException ex) {
    return null;
      }
      Reply reply = req.makeReply(HTTP.FOUND);
      reply.setLocation(loc);
      HtmlGenerator g = new HtmlGenerator("Moved");
      g.append("<P>This resource has moved, click  if your browser"
         + " doesn't support automatic redirection<BR>"+
         "<A HREF=\""+loc.toExternalForm()+"\">"+
         loc.toExternalForm()+"</A>");
      reply.setStream(g);
      return reply ;
  }
  return null;
    }
}
 

TOP

Related Classes of org.w3c.jigsaw.filters.RegexRedirectFilter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.