Re: Final classes and a regexp agent decoratormapper

Scott Farquhar <[email protected]> Mon, 23 May 2005 08:28:03 +1000
Newsgroups gmane.comp.web.sitemesh.general
Message-ID <[email protected]>
I have removed the 'final' from the DecoratorMappers in CVS.

Cheers,
Scott 

On Fri, May 20, 2005 at 03:26:26PM -0500, time4tea wrote:
> Just a small niggle in a a great piece of software.... why make classes final and so difficult to extend? Case in point, I wanted to make a RegexpDecoratorMapper, which would have involved subclassing AgentDecoratorMapper, and overriding getExt() and initMap(), however, the class was declared final, and in any case those methods were declared private.
> 
> In such a "framework" as this, it would be great if we can extend such good example classes as these (even with the caveat that the class API might not be 100% stable, its still better than a copy 'n' paste job).
> 
> Anyhow, if anybody finds it interesting or vaguely useful:
> 
> /*
>  * Copyright (c) 2005 Gill Flett Lifestyle Photography . All Rights Reserved.
>  * $Header: /data/cvsroot/wedding_maven/Wedding.ipr,v 1.1.1.1 2005/04/23 20:17:26 richja Exp $
>  */
> package com.gillflett.lifestyle.jsp.sitemesh;
> 
> import com.opensymphony.module.sitemesh.Config;
> import com.opensymphony.module.sitemesh.Decorator;
> import com.opensymphony.module.sitemesh.DecoratorMapper;
> import com.opensymphony.module.sitemesh.Page;
> import com.opensymphony.module.sitemesh.mapper.AbstractDecoratorMapper;
> import com.opensymphony.module.sitemesh.mapper.DefaultDecorator;
> import org.apache.oro.text.regex.MalformedPatternException;
> import org.apache.oro.text.regex.Pattern;
> import org.apache.oro.text.regex.Perl5Compiler;
> import org.apache.oro.text.regex.Perl5Matcher;
> 
> import javax.servlet.http.HttpServletRequest;
> import java.io.File;
> import java.util.HashMap;
> import java.util.Iterator;
> import java.util.Map;
> import java.util.Properties;
> 
> /**
>  * Extend the idea of the AgentDecoratorMapper to use a regexp to match stuff.
>  * <p/>
>  * $Header$
>  * Initially by: james on 20-May-2005
>  */
> public class AgentRegexpDecoratorMapper extends AbstractDecoratorMapper {
> 
>     protected Map<Pattern, String> map;
> 
>     public void init(Config config, Properties properties, DecoratorMapper parent) throws InstantiationException {
>         super.init(config, properties, parent);
>         map = new HashMap<Pattern, String>();
>         initMap(properties);
>     }
> 
>     public Decorator getDecorator(HttpServletRequest request, Page page) {
>         try {
>             Decorator result = null;
>             final Decorator d = super.getDecorator(request, page);
>             String path = modifyPath(d.getPage(), getExt(request.getHeader("User-Agent")));
> 
>             File decFile = new File(config.getServletContext().getRealPath(path));
> 
>             if (decFile.isFile()) {
>                 result = new DefaultDecorator(d.getName(), path, null) {
>                     public String getInitParameter(String paramName) {
>                         return d.getInitParameter(paramName);
>                     }
>                 };
>             }
>             return result == null ? super.getDecorator(request, page) : result;
>         }
>         catch (NullPointerException e) {
>             return super.getDecorator(request, page);
>         }
>     }
> 
>     /**
>      * Get extension for user-agent.
>      */
>     protected String getExt(String userAgent) {
> 
>         Perl5Matcher matcher = new Perl5Matcher();
> 
>         for (Map.Entry<Pattern, String> entry : map.entrySet()) {
>             Pattern pattern = entry.getKey();
>             if (matcher.contains(userAgent, pattern)) {
>                 return entry.getValue();
>             }
>         }
>         return null;
>     }
> 
>     /**
>      * Change /abc/def.jsp into /abc/def-XYZ.jsp
>      */
>     protected static String modifyPath(String path, String ext) {
>         int dot = path.indexOf('.');
>         if (dot > -1) {
>             return path.substring(0, dot) + '-' + ext + path.substring(dot);
>         }
>         else {
>             return path + '-' + ext;
>         }
>     }
> 
>     /**
>      * Initialize user-agent mappings.
>      */
>     protected void initMap(Properties props) {
>         Iterator i = props.entrySet().iterator();
>         Perl5Compiler compiler = new Perl5Compiler();
>         while (i.hasNext()) {
>             Map.Entry entry = (Map.Entry) i.next();
> 
>             String key = (String) entry.getKey();
>             if (key.startsWith("match.")) {
>                 String match = key.substring(6);
>                 try {
>                     Pattern pattern = compiler.compile(match);
>                     String ext = (String) entry.getValue();
>                     map.put(pattern, ext);
>                 }
>                 catch (MalformedPatternException e) {
>                     //Log.error(this, "", "initMap", "Malformed regexp " + match + ":" + e.toString());
>                 }
>             }
>         }
>     }
> }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]