Should this really be using println()?

On Fri, 2005-02-25 at 13:58 +0000, [EMAIL PROTECTED] wrote:
> Author: marino
> Date: Fri Feb 25 05:58:01 2005
> New Revision: 155328
> 
> URL: http://svn.apache.org/viewcvs?view=rev&rev=155328
> Log:
> obviously a very useful generic tool ... thanks Claude!
> 
> Added:
>     
> jakarta/velocity-tools/trunk/src/java/org/apache/velocity/tools/view/tools/BrowserSnifferTool.java
> 
> Added: 
> jakarta/velocity-tools/trunk/src/java/org/apache/velocity/tools/view/tools/BrowserSnifferTool.java
> URL: 
> http://svn.apache.org/viewcvs/jakarta/velocity-tools/trunk/src/java/org/apache/velocity/tools/view/tools/BrowserSnifferTool.java?view=auto&rev=155328
> ==============================================================================
> --- 
> jakarta/velocity-tools/trunk/src/java/org/apache/velocity/tools/view/tools/BrowserSnifferTool.java
>  (added)
> +++ 
> jakarta/velocity-tools/trunk/src/java/org/apache/velocity/tools/view/tools/BrowserSnifferTool.java
>  Fri Feb 25 05:58:01 2005
> @@ -0,0 +1,1101 @@
> +/*
> + * Copyright 2003-2005 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.velocity.tools.view.tools;
> +
> +import javax.servlet.http.HttpServletRequest;
> +import javax.servlet.ServletRequest;
> +
> +import org.apache.velocity.tools.view.context.ViewContext;
> +import org.apache.velocity.tools.view.tools.ViewTool;
> +
> +import java.util.regex.Pattern;
> +import java.util.regex.Matcher;
> +import java.util.regex.PatternSyntaxException;
> +
> +/* for testing : */
> +import java.io.BufferedReader;
> +import java.io.FileReader;
> +import java.lang.reflect.Method;
> +import java.lang.reflect.Modifier;
> +import java.util.List;
> +import java.util.ArrayList;
> +import java.util.Iterator;
> +
> +/**
> + *  <p>browser-sniffing tool (session or request scope requested, session 
> scope advised).</p>
> + *  <p></p>
> + * <p><b>Usage:</b></p>
> + * <p>BrowserSniffer defines properties that are used to test the client 
> browser, operating system, device...
> + * Apart from properties related to versionning, all properties are 
> booleans.</p>
> + * <p>The following properties are available:</p>
> + * <ul>
> + * <li><i>Versioning:</i>version majorVersion minorVersion geckoVersion</li>
> + * <li><i>Browser:</i>mosaic netscape nav2 nav3 nav4 nav4up nav45 nav45up 
> nav6 nav6up navgold firefox safari
> + * ie ie3 ie4 ie4up ie5 ie5up ie55 ie55up ie6 opera opera3 opera4 opera5 
> opera6 opera7 lynx links
> + * aol aol3 aol4 aol5 aol6 neoplanet neoplanet2 amaya icab avantgo emacs 
> mozilla gecko webtv staroffice
> + * lotusnotes konqueror</li>
> + * <li><i>Operating systems:</i>win16 win3x win31 win95 win98 winnt windows 
> win32 win2k winxp winme dotnet
> + * mac macosx mac68k macppc os2 unix sun sun4 sun5 suni86 irix irix5 irix6 
> hpux hpux9 hpux10 aix aix1 aix2 aix3 aix4
> + * linux sco unixware mpras reliant dec sinix freebsd bsd vms x11 amiga</li>
> + * <li><i>Devices:</i>palm audrey iopener wap blackberry</li>
> + * <li><i>Features:</i>javascript css css1 css2 dom0 dom1 dom2</li>
> + * <li><i>Special:</i>robot (true if the page is requested by a robot, i.e. 
> when one of the following properties is true:
> + * wget getright yahoo altavista lycos infoseek lwp webcrawler linkexchange 
> slurp google java)
> + * </ul>
> + *
> + *
> + * @author <a href="mailto:[EMAIL PROTECTED]">Claude Brisson</a>
> + * @since VelocityTools 1.2
> + * @version $Revision$ $Date$
> + *
> + */
> +
> +/**
> + * Thanks to Lee Semel ([EMAIL PROTECTED]), the author of the 
> HTTP::BrowserDetect Perl module.
> + * See also http://www.zytrax.com/tech/web/browser_ids.htm and 
> http://www.mozilla.org/docs/web-developer/sniffer/browser_type.html
> + */
> +
> +
> +public class BrowserSnifferTool
> +        implements ViewTool
> +{
> +    public BrowserSnifferTool()
> +    {
> +    }
> +
> +    public void init(Object initData)
> +    {
> +
> +        HttpServletRequest req;
> +        if(initData instanceof ViewContext)
> +        {
> +            req = ( (ViewContext)initData).getRequest();
> +        }
> +        else if(initData instanceof HttpServletRequest)
> +        {
> +            req = (HttpServletRequest)initData;
> +        }
> +        else
> +        {
> +            throw new IllegalArgumentException("Was expecting " + 
> ViewContext.class +
> +                                               " or " + 
> HttpServletRequest.class);
> +        }
> +        userAgent = req.getHeader("User-Agent").toLowerCase();
> +    }
> +
> +    /* Generic getter for unknown tests
> +     */
> +    public boolean get(String key)
> +    {
> +        return test(key);
> +    }
> +
> +    /* Versioning */
> +
> +    public String getVersion()
> +    {
> +        parseVersion();
> +        return version;
> +    }
> +
> +    public int getMajorVersion()
> +    {
> +        parseVersion();
> +        return majorVersion;
> +    }
> +
> +    public int getMinorVersion()
> +    {
> +        parseVersion();
> +        return minorVersion;
> +    }
> +
> +    public String getGeckoVersion()
> +    {
> +        parseVersion();
> +        return geckoVersion;
> +    }
> +
> +    /* Browsers */
> +
> +    public boolean getGecko()
> +    {
> +        return test("gecko");
> +    }
> +
> +    public boolean getFirefox()
> +    {
> +        return test("firefox") || test("firebird") || test("phoenix");
> +    }
> +
> +    public boolean getSafari()
> +    {
> +        return test("safari") || test("applewebkit");
> +    }
> +
> +    public boolean getNetscape()
> +    {
> +        return!getFirefox() && !getSafari() && test("mozilla") &&
> +                !test("spoofer")
> +                && !test("compatible") && !test("opera") && !test("webtv") &&
> +                !test("hotjava");
> +    }
> +
> +    public boolean getNav2()
> +    {
> +        return getNetscape() && getMajorVersion() == 2;
> +    }
> +
> +    public boolean getNav3()
> +    {
> +        return getNetscape() && getMajorVersion() == 3;
> +    }
> +
> +    public boolean getNav4()
> +    {
> +        return getNetscape() && getMajorVersion() == 4;
> +    }
> +
> +    public boolean getNav4up()
> +    {
> +        return getNetscape() && getMajorVersion() >= 4;
> +    }
> +
> +    public boolean getNav45()
> +    {
> +        return getNetscape() && getMajorVersion() == 4 &&
> +                getMinorVersion() == 5;
> +    }
> +
> +    public boolean getNav45up()
> +    {
> +        return getNetscape() && getMajorVersion() >= 5 ||
> +                getNav4() && getMinorVersion() >= 5;
> +    }
> +
> +    public boolean getNavgold()
> +    {
> +        return test("gold");
> +    }
> +
> +    public boolean getNav6()
> +    {
> +        return getNetscape() && getMajorVersion() == 5; /* sic */
> +    }
> +
> +    public boolean getNav6up()
> +    {
> +        return getNetscape() && getMajorVersion() >= 5;
> +    }
> +
> +    public boolean getMozilla()
> +    {
> +        return getNetscape() && getGecko();
> +    }
> +
> +    public boolean getIe()
> +    {
> +        return test("msie") && !test("opera") ||
> +                test("microsoft internet explorer");
> +    }
> +
> +    public boolean getIe3()
> +    {
> +        return getIe() && getMajorVersion() < 4;
> +    }
> +
> +    public boolean getIe4()
> +    {
> +        return getIe() && getMajorVersion() == 4;
> +    }
> +
> +    public boolean getIe4up()
> +    {
> +        return getIe() && getMajorVersion() >= 4;
> +    }
> +
> +    public boolean getIe5()
> +    {
> +        return getIe() && getMajorVersion() == 5;
> +    }
> +
> +    public boolean getIe5up()
> +    {
> +        return getIe() && getMajorVersion() >= 5;
> +    }
> +
> +    public boolean getIe55()
> +    {
> +        return getIe() && getMajorVersion() == 5 && getMinorVersion() >= 5;
> +    }
> +
> +    public boolean getIe55up()
> +    {
> +        return(getIe5() && getMinorVersion() >= 5) ||
> +                (getIe() && getMajorVersion() >= 6);
> +    }
> +
> +    public boolean getIe6()
> +    {
> +        return getIe() && getMajorVersion() == 6;
> +    }
> +
> +    public boolean getIe6up()
> +    {
> +        return getIe() && getMajorVersion() >= 6;
> +    }
> +
> +    public boolean getNeoplanet()
> +    {
> +        return test("neoplanet");
> +    }
> +
> +    public boolean getNeoplanet2()
> +    {
> +        return getNeoplanet() && test("2.");
> +    }
> +
> +    public boolean getAol()
> +    {
> +        return test("aol");
> +    }
> +
> +    public boolean getAol3()
> +    {
> +        return test("aol 3.0") || getAol() && getIe3();
> +    }
> +
> +    public boolean getAol4()
> +    {
> +        return test("aol 4.0") || getAol() && getIe4();
> +    }
> +
> +    public boolean getAol5()
> +    {
> +        return test("aol 5.0");
> +    }
> +
> +    public boolean getAol6()
> +    {
> +        return test("aol 6.0");
> +    }
> +
> +    public boolean getAolTV()
> +    {
> +        return test("navio") || test("navio_aoltv");
> +    }
> +
> +    public boolean getOpera()
> +    {
> +        return test("opera");
> +    }
> +
> +    public boolean getOpera3()
> +    {
> +        return test("opera 3") || test("opera/3");
> +    }
> +
> +    public boolean getOpera4()
> +    {
> +        return test("opera 4") || test("opera/4");
> +    }
> +
> +    public boolean getOpera5()
> +    {
> +        return test("opera 5") || test("opera/5");
> +    }
> +
> +    public boolean getOpera6()
> +    {
> +        return test("opera 6") || test("opera/6");
> +    }
> +
> +    public boolean getOpera7()
> +    {
> +        return test("opera 7") || test("opera/7");
> +    }
> +
> +    public boolean getHotjava()
> +    {
> +        return test("hotjava");
> +    }
> +
> +    public boolean getHotjava3()
> +    {
> +        return getHotjava() && getMajorVersion() == 3;
> +    }
> +
> +    public boolean getHotjava3up()
> +    {
> +        return getHotjava() && getMajorVersion() >= 3;
> +    }
> +
> +    public boolean getAmaya()
> +    {
> +        return test("amaya");
> +    }
> +
> +    public boolean getCurl()
> +    {
> +        return test("libcurl");
> +    }
> +
> +    public boolean getStaroffice()
> +    {
> +        return test("staroffice");
> +    }
> +
> +    public boolean getIcab()
> +    {
> +        return test("icab");
> +    }
> +
> +    public boolean getLotusnotes()
> +    {
> +        return test("lotus-notes");
> +    }
> +
> +    public boolean getKonqueror()
> +    {
> +        return test("konqueror");
> +    }
> +
> +    public boolean getLynx()
> +    {
> +        return test("lynx");
> +    }
> +
> +    public boolean getLinks()
> +    {
> +        return test("links");
> +    }
> +
> +    public boolean getWebTV()
> +    {
> +        return test("webtv");
> +    }
> +
> +    public boolean getMosaic()
> +    {
> +        return test("mosaic");
> +    }
> +
> +    public boolean getWget()
> +    {
> +        return test("wget");
> +    }
> +
> +    public boolean getGetright()
> +    {
> +        return test("getright");
> +    }
> +
> +    public boolean getLwp()
> +    {
> +        return test("libwww-perl") || test("lwp-");
> +    }
> +
> +    public boolean getYahoo()
> +    {
> +        return test("yahoo");
> +    }
> +
> +    public boolean getGoogle()
> +    {
> +        return test("google");
> +    }
> +
> +    public boolean getJava()
> +    {
> +        return test("java") || test("jdk");
> +    }
> +
> +    public boolean getAltavista()
> +    {
> +        return test("altavista");
> +    }
> +
> +    public boolean getScooter()
> +    {
> +        return test("scooter");
> +    }
> +
> +    public boolean getLycos()
> +    {
> +        return test("lycos");
> +    }
> +
> +    public boolean getInfoseek()
> +    {
> +        return test("infoseek");
> +    }
> +
> +    public boolean getWebcrawler()
> +    {
> +        return test("webcrawler");
> +    }
> +
> +    public boolean getLinkexchange()
> +    {
> +        return test("lecodechecker");
> +    }
> +
> +    public boolean getSlurp()
> +    {
> +        return test("slurp");
> +    }
> +
> +    public boolean getRobot()
> +    {
> +        return getWget() || getGetright() || getLwp() || getYahoo() ||
> +                getGoogle() || getAltavista()
> +                || getScooter() || getLycos() || getInfoseek() || 
> getWebcrawler() ||
> +                getLinkexchange()
> +                || test("bot") || test("spider") || test("crawl") ||
> +                test("agent") || test("seek")
> +                || test("search") || test("reap") || test("worm") ||
> +                test("find") || test("index")
> +                || test("copy") || test("fetch") || test("ia_archive") ||
> +                test("zyborg");
> +    }
> +
> +    /* Devices */
> +
> +    public boolean getBlackberry()
> +    {
> +        return test("blackberry");
> +    }
> +
> +    public boolean getAudrey()
> +    {
> +        return test("audrey");
> +    }
> +
> +    public boolean getIopener()
> +    {
> +        return test("i-opener");
> +    }
> +
> +    public boolean getAvantgo()
> +    {
> +        return test("avantgo");
> +    }
> +
> +    public boolean getPalm()
> +    {
> +        return getAvantgo() || test("palmos");
> +    }
> +
> +    public boolean getWap()
> +    {
> +        return test("up.browser") || test("nokia") || test("alcatel") ||
> +                test("ericsson")
> +                || userAgent.indexOf("sie-") == 0 || test("wmlib") ||
> +                test(" wap") || test("wap ")
> +                || test("wap/") || test("-wap") || test("wap-") ||
> +                userAgent.indexOf("wap") == 0
> +                || test("wapper") || test("zetor");
> +    }
> +
> +    /* Operating System */
> +
> +    public boolean getWin16()
> +    {
> +        return test("win16") || test("16bit") || test("windows 3") ||
> +                test("windows 16-bit");
> +    }
> +
> +    public boolean getWin3x()
> +    {
> +        return test("win16") || test("windows 3") || test("windows 16-bit");
> +    }
> +
> +    public boolean getWin31()
> +    {
> +        return test("win16") || test("windows 3.1") || test("windows 
> 16-bit");
> +    }
> +
> +    public boolean getWin95()
> +    {
> +        return test("win95") || test("windows 95");
> +    }
> +
> +    public boolean getWin98()
> +    {
> +        return test("win98") || test("windows 98");
> +    }
> +
> +    public boolean getWinnt()
> +    {
> +        return test("winnt") || test("windows nt") || test("nt4") || 
> test("nt3");
> +    }
> +
> +    public boolean getWin2k()
> +    {
> +        return test("nt 5.0") || test("nt5");
> +    }
> +
> +    public boolean getWinxp()
> +    {
> +        return test("nt 5.1");
> +    }
> +
> +    public boolean getDotnet()
> +    {
> +        return test(".net clr");
> +    }
> +
> +    public boolean getWinme()
> +    {
> +        return test("win 9x 4.90");
> +    }
> +
> +    public boolean getWin32()
> +    {
> +        return getWin95() || getWin98() || getWinnt() || getWin2k()
> +                || getWinxp() || getWinme() || test("win32");
> +    }
> +
> +    public boolean getWindows()
> +    {
> +        return getWin16() || getWin31() || getWin95() || getWin98() || 
> getWinnt() ||
> +                getWin32()
> +                || getWin2k() || getWinme() || test("win");
> +    }
> +
> +    public boolean getMac()
> +    {
> +        return test("macintosh") || test("mac_");
> +    }
> +
> +    public boolean getMacosx()
> +    {
> +        return test("macintosh") || test("mac os x");
> +    }
> +
> +    public boolean getMac68k()
> +    {
> +        return getMac() && (test("68k") || test("68000"));
> +    }
> +
> +    public boolean getMacppc()
> +    {
> +        return getMac() && (test("ppc") || test("powerpc"));
> +    }
> +
> +    public boolean getAmiga()
> +    {
> +        return test("amiga");
> +    }
> +
> +    public boolean getEmacs()
> +    {
> +        return test("emacs");
> +    }
> +
> +    public boolean getOs2()
> +    {
> +        return test("os/2");
> +    }
> +
> +    public boolean getSun()
> +    {
> +        return test("sun");
> +    }
> +
> +    public boolean getSun4()
> +    {
> +        return test("sunos 4");
> +    }
> +
> +    public boolean getSun5()
> +    {
> +        return test("sunos 5");
> +    }
> +
> +    public boolean getSuni86()
> +    {
> +        return getSun() && test("i86");
> +    }
> +
> +    public boolean getIrix()
> +    {
> +        return test("irix");
> +    }
> +
> +    public boolean getIrix5()
> +    {
> +        return test("irix5");
> +    }
> +
> +    public boolean getIrix6()
> +    {
> +        return test("irix6");
> +    }
> +
> +    public boolean getHpux()
> +    {
> +        return test("hp-ux");
> +    }
> +
> +    public boolean getHpux9()
> +    {
> +        return getHpux() && test("09.");
> +    }
> +
> +    public boolean getHpux10()
> +    {
> +        return getHpux() && test("10.");
> +    }
> +
> +    public boolean getAix()
> +    {
> +        return test("aix");
> +    }
> +
> +    public boolean getAix1()
> +    {
> +        return test("aix 1");
> +    }
> +
> +    public boolean getAix2()
> +    {
> +        return test("aix 2");
> +    }
> +
> +    public boolean getAix3()
> +    {
> +        return test("aix 3");
> +    }
> +
> +    public boolean getAix4()
> +    {
> +        return test("aix 4");
> +    }
> +
> +    public boolean getLinux()
> +    {
> +        return test("linux");
> +    }
> +
> +    public boolean getSco()
> +    {
> +        return test("sco") || test("unix_sv");
> +    }
> +
> +    public boolean getUnixware()
> +    {
> +        return test("unix_system_v");
> +    }
> +
> +    public boolean getMpras()
> +    {
> +        return test("ncr");
> +    }
> +
> +    public boolean getReliant()
> +    {
> +        return test("reliantunix");
> +    }
> +
> +    public boolean getDec()
> +    {
> +        return test("dec") || test("osf1") || test("delalpha") ||
> +                test("alphaserver") || test("ultrix") || 
> test("alphastation");
> +    }
> +
> +    public boolean getSinix()
> +    {
> +        return test("sinix");
> +    }
> +
> +    public boolean getFreebsd()
> +    {
> +        return test("freebsd");
> +    }
> +
> +    public boolean getBsd()
> +    {
> +        return test("bsd");
> +    }
> +
> +    public boolean getX11()
> +    {
> +        return test("x11");
> +    }
> +
> +    public boolean getUnix()
> +    {
> +        return getX11() || getSun() || getIrix() || getHpux() || getSco() ||
> +                getUnixware()
> +                || getMpras() || getReliant() || getDec() || getLinux() ||
> +                getBsd() || test("unix");
> +    }
> +
> +    public boolean getVMS()
> +    {
> +        return test("vax") || test("openvms");
> +    }
> +
> +    /* Features */
> +
> +    /* Since support of those features is often partial, the sniffer returns 
> true
> +        when a consequent subset is supported. */
> +
> +    public boolean getCss()
> +    {
> +        return getIe() && getMajorVersion() >= 4
> +                || getNetscape() && getMajorVersion() >= 4
> +                || getGecko()
> +                || getKonqueror()
> +                || getOpera() && getMajorVersion() >= 3
> +                || getSafari()
> +                || getLinks();
> +    }
> +
> +    public boolean getCss1()
> +    {
> +        return getCss();
> +    }
> +
> +    public boolean getCss2()
> +    {
> +        return getIe() &&
> +                (getMac() && getMajorVersion() >= 5 ||
> +                 getWin32() && getMajorVersion() >= 6)
> +                || getGecko() // && version >= ?
> +                || getOpera() && getMajorVersion() >= 4
> +                || getSafari() && getMajorVersion() >= 2
> +                || getKonqueror() && getMajorVersion() >= 2;
> +
> +    }
> +
> +    public boolean getDom0()
> +    {
> +        return getIe() && getMajorVersion() >= 3
> +                || getNetscape() && getMajorVersion() >= 2
> +                || getOpera() && getMajorVersion() >= 3
> +                || getGecko()
> +                || getSafari()
> +                || getKonqueror();
> +    }
> +
> +    public boolean getDom1()
> +    {
> +        return getIe() && getMajorVersion() >= 5
> +                || getGecko()
> +                || getSafari() && getMajorVersion() >= 2
> +                || getOpera() && getMajorVersion() >= 4
> +                || getKonqueror() && getMajorVersion() >= 2;
> +    }
> +
> +    public boolean getDom2()
> +    {
> +        return getIe() && getMajorVersion() >= 6
> +                || getMozilla() && getMajorVersion() >= 5.0
> +                || getOpera() && getMajorVersion() >= 7
> +                || getFirefox();
> +    }
> +
> +    public boolean getJavascript()
> +    {
> +        return getDom0(); // good approximation
> +    }
> +
> +    /* Helpers */
> +
> +    private boolean test(String key)
> +    {
> +        return userAgent.indexOf(key) != -1;
> +    }
> +
> +    private void parseVersion()
> +    {
> +        try
> +        {
> +
> +            if(version != null)
> +            {
> +                return; /* parsing of version already done */
> +            }
> +
> +            /* generic versionning */
> +            Matcher v = Pattern.compile(
> +                    "/"
> +                    /* Version starts with a slash */
> +                    +
> +                    "([A-Za-z]*"
> +                    /* Eat any letters before the major version */
> +                    +
> +                    "( [\\d]* )"
> +                    /* Major version number is every digit before the first 
> dot */
> +                    + "\\." /* The first dot */
> +                    +
> +                    "( [\\d]* )"
> +                    /* Minor version number is every digit after the first 
> dot */
> +                    + "[^\\s]*)" /* Throw away the remaining */
> +                    , Pattern.COMMENTS).matcher(userAgent);
> +
> +            if(v.find())
> +            {
> +                version = v.group(1);
> +                try
> +                {
> +                    majorVersion = Integer.parseInt(v.group(2));
> +                    String minor = v.group(3);
> +                    if(minor.startsWith("0"))minorVersion = 0;
> +                    else minorVersion = Integer.parseInt(minor);
> +                }
> +                catch(NumberFormatException nfe)
> +                {}
> +            }
> +
> +            /* Firefox versionning */
> +            if(test("firefox"))
> +            {
> +                Matcher fx = Pattern.compile(
> +                        "/"
> +                        +
> +                        "(( [\\d]* )"
> +                        /* Major version number is every digit before the 
> first dot */
> +                        + "\\." /* The first dot */
> +                        +
> +                        "( [\\d]* )"
> +                        /* Minor version number is every digit after the 
> first dot */
> +                        + "[^\\s]*)" /* Throw away the remaining */
> +                        , Pattern.COMMENTS)
> +                        .matcher(userAgent);
> +                if(fx.find())
> +                {
> +                    version = fx.group(1);
> +                    try
> +                    {
> +                        majorVersion = Integer.parseInt(fx.group(2));
> +                        String minor = fx.group(3);
> +                        if(minor.startsWith("0"))minorVersion = 0;
> +                        else minorVersion = Integer.parseInt(minor);
> +                    }
> +                    catch(NumberFormatException nfe)
> +                    {}
> +                }
> +            }
> +
> +            /* IE versionning */
> +            if(test("compatible"))
> +            {
> +                Matcher ie = Pattern.compile(
> +                        "compatible;"
> +                        + "\\s*"
> +                        + "\\w*" /* Browser name */
> +                        + "[\\s|/]"
> +                        +
> +                        "([A-Za-z]*"
> +                        /* Eat any letters before the major version */
> +                        +
> +                        "( [\\d]* )"
> +                        /* Major version number is every digit before first 
> dot */
> +                        + "\\." /* The first dot */
> +                        +
> +                        "( [\\d]* )"
> +                        /* Minor version number is digits after first dot */
> +                        + "[^\\s]*)" /* Throw away remaining dots and digits 
> */
> +                        , Pattern.COMMENTS)
> +                        .matcher(userAgent);
> +                if(ie.find())
> +                {
> +                    version = ie.group(1);
> +                    try
> +                    {
> +                        majorVersion = Integer.parseInt(ie.group(2));
> +                        String minor = ie.group(3);
> +                        if(minor.startsWith("0"))minorVersion = 0;
> +                        else minorVersion = Integer.parseInt(minor);
> +                    }
> +                    catch(NumberFormatException nfe)
> +                    {}
> +                }
> +            }
> +
> +            /* Safari versionning*/
> +            if(getSafari())
> +            {
> +                Matcher safari = Pattern.compile(
> +                        "safari/"
> +                        +
> +                        "(( [\\d]* )"
> +                        /* Major version number is every digit before first 
> dot */
> +                        + "(?:"
> +                        + "\\." /* The first dot */
> +                        +
> +                        " [\\d]* )?)"
> +                        /* Minor version number is digits after first dot */
> +                        , Pattern.COMMENTS)
> +                        .matcher(userAgent);
> +                if(safari.find())
> +                {
> +                    version = safari.group(1);
> +                    try
> +                    {
> +                        int sv = Integer.parseInt(safari.group(2));
> +                        majorVersion = sv / 100;
> +                        minorVersion = sv % 100;
> +                    }
> +                    catch(NumberFormatException nfe)
> +                    {}
> +                }
> +            }
> +
> +            /* Gecko-powered Netscape (i.e. Mozilla) versions */
> +            if(getGecko() && getNetscape() && test("netscape"))
> +            {
> +                Matcher netscape = Pattern.compile(
> +                        "netscape/"
> +                        +
> +                        "(( [\\d]* )"
> +                        /* Major version number is every digit before the 
> first dot */
> +                        + "\\." /* The first dot */
> +                        +
> +                        "( [\\d]* )"
> +                        /* Minor version number is every digit after the 
> first dot */
> +                        + "[^\\s]*)" /* Throw away the remaining */
> +                        , Pattern.COMMENTS)
> +                        .matcher(userAgent);
> +                if(netscape.find())
> +                {
> +                    version = netscape.group(1);
> +                    try
> +                    {
> +                        majorVersion = Integer.parseInt(netscape.group(2));
> +                        String minor = netscape.group(3);
> +                        if(minor.startsWith("0"))minorVersion = 0;
> +                        else minorVersion = Integer.parseInt(minor);
> +                    }
> +                    catch(NumberFormatException nfe)
> +                    {}
> +                }
> +            }
> +
> +            /* last try if version not found */
> +            if(version == null)
> +            {
> +                Matcher mv = Pattern.compile(
> +                        "[\\w]+/"
> +                        +
> +                        "( [\\d]+ );"
> +                        /* Major version number is every digit before the 
> first dot */
> +                        , Pattern.COMMENTS)
> +                        .matcher(userAgent);
> +                if(mv.find())
> +                {
> +                    version = mv.group(1);
> +                    try
> +                    {
> +                        majorVersion = Integer.parseInt(version);
> +                        minorVersion = 0;
> +                    }
> +                    catch(NumberFormatException nfe)
> +                    {}
> +                }
> +            }
> +
> +            /* gecko engine version */
> +            if(getGecko())
> +            {
> +                Matcher g = Pattern.compile(
> +                        "\\([^)]*rv:(.*)\\)"
> +                        ).matcher(userAgent);
> +                if(g.find())
> +                {
> +                    geckoVersion = g.group(1);
> +                }
> +            }
> +        }
> +        catch(PatternSyntaxException nfe)
> +        {
> +            // where should I log ?!
> +        }
> +    }
> +
> +    private String userAgent = null;
> +    private String version = null;
> +    private int majorVersion = -1;
> +    private int minorVersion = -1;
> +    private String geckoVersion = null;
> +
> +    /* testing : give a filename as argument
> +     * the file is supposed to contains user agent strings, one per line
> +     */
> +    public static void main(String[] args)
> +    {
> +        try
> +        {
> +
> +            /* open a reader on the input file */
> +            BufferedReader reader = new BufferedReader(new 
> FileReader(args[0]));
> +            String ua;
> +            BrowserSnifferTool browser = new BrowserSnifferTool();
> +
> +            /* build an array of all the tests */
> +            Method[] methods = BrowserSnifferTool.class.getDeclaredMethods();
> +            List tests = new ArrayList();
> +            for(int i = 0; i < methods.length; i++)
> +            {
> +                Method m = methods[i];
> +                int mod = m.getModifiers();
> +                String name = m.getName();
> +                if(Modifier.isPublic(mod) && !Modifier.isStatic(mod) &&
> +                   name.startsWith("get") && name.length() > 3 &&
> +                   m.getReturnType().getName().equals("boolean"))
> +                {
> +                    tests.add(m);
> +                }
> +            }
> +
> +            while( (ua = reader.readLine()) != null)
> +            {
> +                browser.version = null;
> +                browser.majorVersion = -1;
> +                browser.minorVersion = -1;
> +                browser.geckoVersion = null;
> +                browser.userAgent = ua.toLowerCase();
> +                System.out.println("User Agent: " + ua);
> +                System.out.print("    version=" + browser.getVersion() +
> +                                 ", major=" + browser.getMajorVersion() +
> +                                 ", minor=" + browser.getMinorVersion());
> +                if(browser.getGecko())System.out.print(", gecko=" +
> +                        browser.getGeckoVersion());
> +                System.out.println();
> +                System.out.print("    ");
> +                for(Iterator mi = tests.iterator(); mi.hasNext(); )
> +                {
> +                    Method m = (Method)mi.next();
> +                    boolean b = ( (Boolean)m.invoke(browser, new Object[]
> +                            {})).
> +                            booleanValue();
> +                    if(b)System.out.print(m.getName().substring(3).
> +                                          toLowerCase() + " ");
> +                }
> +                System.out.println();
> +                System.out.println();
> +            }
> +        }
> +        catch(Exception e)
> +        {
> +            e.printStackTrace();
> +        }
> +    }
> +}
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to