You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by "Daniel L. Rall" <dl...@collab.net> on 2005/03/02 07:20:09 UTC
Re: svn commit: r155328 -
jakarta/velocity-tools/trunk/src/java/org/apache/velocity/tools/view/tools/BrowserSnifferTool.java
Should this really be using println()?
On Fri, 2005-02-25 at 13:58 +0000, marino@apache.org 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:claude@renegat.net">Claude Brisson</a>
> + * @since VelocityTools 1.2
> + * @version $Revision$ $Date$
> + *
> + */
> +
> +/**
> + * Thanks to Lee Semel (lee@semel.net), 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: velocity-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: velocity-dev-help@jakarta.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: velocity-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: velocity-dev-help@jakarta.apache.org
RE: svn commit: r155328 -jakarta/velocity-tools/trunk/src/java/org/apache/velocity/tools/view/tools/BrowserSnifferTool.java
Posted by "Marinó A. Jónsson" <ma...@centrum.is>.
Nathan said:
i think he's referring to the main() method at the end of the class file
that appears to have been written for testing the tool.
I realize that :)
Nathan said:
my question is not whether println() should be used, but whether we should
have a public static void main(args) method in a tool at all!
and my answer is "no". :) i think that if we want to set up tests, we
should get some junit type stuff going. so i'd much prefer that that method
just be removed.
I agree - but my question is what could be wrong with using println() in a
main method used for test purposes? ... just curious.
cheers,
Marinó
On Wed, 2 Mar 2005 11:03:04 -0000, Marinó A. Jónsson <ma...@centrum.is>
wrote:
> could you elaborate please?
>
> Marinó.
>
> -----Original Message-----
> From: Daniel L. Rall [mailto:dlr@collab.net]
> Sent: 2. mars 2005 06:20
> To: Velocity Developers List
> Subject: Re: svn commit: r155328
> -jakarta/velocity-tools/trunk/src/java/org/apache/velocity/tools/view/
> tools/
> BrowserSnifferTool.java
>
> Should this really be using println()?
>
<snip>
> > + 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();
> > + }
> > + }
> > +}
</snip>
---------------------------------------------------------------------
To unsubscribe, e-mail: velocity-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: velocity-dev-help@jakarta.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: velocity-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: velocity-dev-help@jakarta.apache.org
Re: svn commit: r155328 -jakarta/velocity-tools/trunk/src/java/org/apache/velocity/tools/view/tools/BrowserSnifferTool.java
Posted by Nathan Bubna <nb...@gmail.com>.
i think he's referring to the main() method at the end of the class
file that appears to have been written for testing the tool.
<confession>i hadn't actually looked over the whole commit until now,
so i didn't see it before.</confession> but now that i have, my
question is not whether println() should be used, but whether we
should have a public static void main(args) method in a tool at all!
and my answer is "no". :) i think that if we want to set up tests,
we should get some junit type stuff going. so i'd much prefer that
that method just be removed.
On Wed, 2 Mar 2005 11:03:04 -0000, Marinó A. Jónsson
<ma...@centrum.is> wrote:
> could you elaborate please?
>
> Marinó.
>
> -----Original Message-----
> From: Daniel L. Rall [mailto:dlr@collab.net]
> Sent: 2. mars 2005 06:20
> To: Velocity Developers List
> Subject: Re: svn commit: r155328
> -jakarta/velocity-tools/trunk/src/java/org/apache/velocity/tools/view/tools/
> BrowserSnifferTool.java
>
> Should this really be using println()?
>
<snip>
> > + 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();
> > + }
> > + }
> > +}
</snip>
---------------------------------------------------------------------
To unsubscribe, e-mail: velocity-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: velocity-dev-help@jakarta.apache.org
RE: svn commit: r155328 -jakarta/velocity-tools/trunk/src/java/org/apache/velocity/tools/view/tools/BrowserSnifferTool.java
Posted by "Marinó A. Jónsson" <ma...@centrum.is>.
could you elaborate please?
Marinó.
-----Original Message-----
From: Daniel L. Rall [mailto:dlr@collab.net]
Sent: 2. mars 2005 06:20
To: Velocity Developers List
Subject: Re: svn commit: r155328
-jakarta/velocity-tools/trunk/src/java/org/apache/velocity/tools/view/tools/
BrowserSnifferTool.java
Should this really be using println()?
On Fri, 2005-02-25 at 13:58 +0000, marino@apache.org 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/t
> ools/BrowserSnifferTool.java
>
> Added:
> jakarta/velocity-tools/trunk/src/java/org/apache/velocity/tools/view/t
> ools/BrowserSnifferTool.java
> URL:
> http://svn.apache.org/viewcvs/jakarta/velocity-tools/trunk/src/java/or
> g/apache/velocity/tools/view/tools/BrowserSnifferTool.java?view=auto&r
> ev=155328
> ======================================================================
> ========
> ---
> jakarta/velocity-tools/trunk/src/java/org/apache/velocity/tools/view/t
> ools/BrowserSnifferTool.java (added)
> +++ jakarta/velocity-tools/trunk/src/java/org/apache/velocity/tools/vi
> +++ ew/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:claude@renegat.net">Claude Brisson</a>
> + * @since VelocityTools 1.2
> + * @version $Revision$ $Date$
> + *
> + */
> +
> +/**
> + * Thanks to Lee Semel (lee@semel.net), 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: velocity-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: velocity-dev-help@jakarta.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: velocity-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: velocity-dev-help@jakarta.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: velocity-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: velocity-dev-help@jakarta.apache.org