added browser information (port of browser information functionality from
Venice-Dynamo, includes browscap.ini)
This commit is contained in:
parent
1351306780
commit
b4c7aa4c8b
|
@ -115,6 +115,7 @@
|
||||||
</javac>
|
</javac>
|
||||||
<copy todir="buildwork">
|
<copy todir="buildwork">
|
||||||
<fileset dir="src" includes="**/*.properties"/>
|
<fileset dir="src" includes="**/*.properties"/>
|
||||||
|
<fileset dir="src" includes="**/*.ini"/>
|
||||||
</copy>
|
</copy>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||||
|
* (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.mozilla.org/MPL/>.
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||||
|
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
* language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Venice Web Communities System.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
|
||||||
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
|
* Copyright (C) 2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.ui.helpers;
|
||||||
|
|
||||||
|
public interface BrowserInformation
|
||||||
|
{
|
||||||
|
public String getAgent();
|
||||||
|
|
||||||
|
public String getAttribute(String name);
|
||||||
|
|
||||||
|
public boolean hasCapability(String name);
|
||||||
|
|
||||||
|
} // end interface BrowserInformation
|
|
@ -415,6 +415,7 @@ public abstract class BaseServlet extends HttpServlet
|
||||||
} // end if
|
} // end if
|
||||||
|
|
||||||
ScriptManagerContainer.initialize(rootconf,ctxt); // make sure container initialized
|
ScriptManagerContainer.initialize(rootconf,ctxt); // make sure container initialized
|
||||||
|
BrowserDatabase.get(ctxt); // initialize browser database
|
||||||
|
|
||||||
} // end synchronized block
|
} // end synchronized block
|
||||||
|
|
||||||
|
|
254
src/com/silverwrist/venice/ui/servlet/BrowserDatabase.java
Normal file
254
src/com/silverwrist/venice/ui/servlet/BrowserDatabase.java
Normal file
|
@ -0,0 +1,254 @@
|
||||||
|
/*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version 1.1
|
||||||
|
* (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.mozilla.org/MPL/>.
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
|
||||||
|
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
|
||||||
|
* language governing rights and limitations under the License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Venice Web Communities System.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
|
||||||
|
* for Silverwrist Design Studios. Portions created by Eric J. Bowersox are
|
||||||
|
* Copyright (C) 2004 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*/
|
||||||
|
package com.silverwrist.venice.ui.servlet;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
import javax.servlet.*;
|
||||||
|
import org.apache.log4j.*;
|
||||||
|
import org.apache.regexp.*;
|
||||||
|
import com.silverwrist.util.*;
|
||||||
|
|
||||||
|
class BrowserDatabase
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static Logger logger = Logger.getLogger(BrowserDatabase.class);
|
||||||
|
|
||||||
|
private static final String SERVLET_ATTR = "com.silverwrist.venice.ui.BrowserDatabase";
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private boolean m_broken = false; // true if we had an error in loading
|
||||||
|
private ArrayList m_browser_list = new ArrayList(); // the actual list
|
||||||
|
private HashMap m_name_map = new HashMap(); // map names to elements
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private BrowserDatabase()
|
||||||
|
{
|
||||||
|
InputStream stm = null;
|
||||||
|
BufferedReader rdr = null;
|
||||||
|
try
|
||||||
|
{ // load the contents of the browscap.ini file
|
||||||
|
stm = this.getClass().getResourceAsStream("browscap.ini");
|
||||||
|
rdr = new BufferedReader(new InputStreamReader(stm));
|
||||||
|
String line;
|
||||||
|
BrowserEntry current = null;
|
||||||
|
while ((line = rdr.readLine())!=null)
|
||||||
|
{ // read in lines from the resource
|
||||||
|
line = line.trim();
|
||||||
|
if ((line.length()==0) || line.startsWith(";"))
|
||||||
|
continue; // blank line or comment
|
||||||
|
|
||||||
|
if (line.startsWith("[") && line.endsWith("]"))
|
||||||
|
{ // start of new browser entry
|
||||||
|
current = new BrowserEntry(line.substring(1,line.length() - 1));
|
||||||
|
m_name_map.put(current.getName(),current);
|
||||||
|
m_browser_list.add(current);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
if (current!=null)
|
||||||
|
{ // break the line at the equals sign
|
||||||
|
int p = line.indexOf('=');
|
||||||
|
if (p!=-1)
|
||||||
|
{ // separate the name and value, and stow them
|
||||||
|
String name = line.substring(0,p).trim();
|
||||||
|
String value = line.substring(p + 1).trim();
|
||||||
|
if (value.startsWith("#"))
|
||||||
|
value = value.substring(1);
|
||||||
|
current.addValue(name,value);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
} // end try
|
||||||
|
catch (IOException e)
|
||||||
|
{ // WTF? this is bad!
|
||||||
|
logger.fatal("Error loading BROWSCAP.INI database",e);
|
||||||
|
m_broken = true;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
catch (RESyntaxException e)
|
||||||
|
{ // WTF? this is bad!
|
||||||
|
logger.fatal("Error loading BROWSCAP.INI database",e);
|
||||||
|
m_broken = true;
|
||||||
|
|
||||||
|
} // end catch
|
||||||
|
finally
|
||||||
|
{ // shut down the stream
|
||||||
|
IOUtil.shutdown(rdr);
|
||||||
|
IOUtil.shutdown(stm);
|
||||||
|
|
||||||
|
} // end finally
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
BrowserEntry lookup(String agent)
|
||||||
|
{
|
||||||
|
if (m_broken)
|
||||||
|
return null; // database wasn't loaded
|
||||||
|
|
||||||
|
for (Iterator it=m_browser_list.iterator(); it.hasNext(); )
|
||||||
|
{ // look for a matching agent
|
||||||
|
BrowserEntry be = (BrowserEntry)(it.next());
|
||||||
|
if (be.matches(agent))
|
||||||
|
return be;
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end lookup
|
||||||
|
|
||||||
|
BrowserEntry getByName(String name)
|
||||||
|
{
|
||||||
|
return (BrowserEntry)(m_name_map.get(name));
|
||||||
|
|
||||||
|
} // end getByName
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External static operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
static synchronized BrowserDatabase get(ServletContext ctxt)
|
||||||
|
{
|
||||||
|
BrowserDatabase rc = (BrowserDatabase)(ctxt.getAttribute(SERVLET_ATTR));
|
||||||
|
if (rc==null)
|
||||||
|
{ // create database and add it to attributes
|
||||||
|
rc = new BrowserDatabase();
|
||||||
|
ctxt.setAttribute(SERVLET_ATTR,rc);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end get
|
||||||
|
|
||||||
|
} // end class BrowserDatabase
|
||||||
|
|
||||||
|
class BrowserEntry
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static final String SPECIAL_CHARS = "*.?[](){}+|^$\\";
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private String m_id; // ID of this entry
|
||||||
|
private REProgram m_pattern; // pattern the entry matches
|
||||||
|
private HashMap m_values = new HashMap(); // values table for this entry
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
BrowserEntry(String header) throws RESyntaxException
|
||||||
|
{
|
||||||
|
m_id = header.intern();
|
||||||
|
RECompiler compiler = new RECompiler();
|
||||||
|
m_pattern = compiler.compile(preprocess(header));
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Internal operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static final String preprocess(String header)
|
||||||
|
{
|
||||||
|
StringBuffer buf = new StringBuffer();
|
||||||
|
char[] src = header.toCharArray();
|
||||||
|
for (int i=0; i<src.length; i++)
|
||||||
|
{ // turn DOS-style glob characters into a proper regular expression
|
||||||
|
if (src[i]=='*')
|
||||||
|
buf.append(".*");
|
||||||
|
else if (src[i]=='?')
|
||||||
|
buf.append('.');
|
||||||
|
else
|
||||||
|
{ // append the standard character
|
||||||
|
if (SPECIAL_CHARS.indexOf(src[i])>=0)
|
||||||
|
buf.append('\\');
|
||||||
|
buf.append(src[i]);
|
||||||
|
|
||||||
|
} // end else
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
return buf.toString();
|
||||||
|
|
||||||
|
} // end preprocess
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* External operations
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
String getName()
|
||||||
|
{
|
||||||
|
return m_id;
|
||||||
|
|
||||||
|
} // end getName
|
||||||
|
|
||||||
|
void addValue(String name, String value)
|
||||||
|
{
|
||||||
|
m_values.put(name,value);
|
||||||
|
|
||||||
|
} // end addValue
|
||||||
|
|
||||||
|
boolean matches(String agent)
|
||||||
|
{
|
||||||
|
RE r = new RE(m_pattern);
|
||||||
|
return r.match(agent);
|
||||||
|
|
||||||
|
} // end matches
|
||||||
|
|
||||||
|
String getValue(String name)
|
||||||
|
{
|
||||||
|
return (String)(m_values.get(name));
|
||||||
|
|
||||||
|
} // end getValue
|
||||||
|
|
||||||
|
} // end class BrowserEntry
|
|
@ -78,6 +78,8 @@ public class RequestImpl implements RequestInput
|
||||||
return RequestImpl.this.queryService(klass);
|
return RequestImpl.this.queryService(klass);
|
||||||
if (klass==ResourceLoader.class)
|
if (klass==ResourceLoader.class)
|
||||||
return RequestImpl.this.queryService(klass);
|
return RequestImpl.this.queryService(klass);
|
||||||
|
if (klass==BrowserInformation.class)
|
||||||
|
return RequestImpl.this.queryService(klass);
|
||||||
throw new NoSuchServiceException("RequestOutput",klass);
|
throw new NoSuchServiceException("RequestOutput",klass);
|
||||||
|
|
||||||
} // end queryService
|
} // end queryService
|
||||||
|
@ -557,6 +559,7 @@ public class RequestImpl implements RequestInput
|
||||||
private HTMLRenderingImpl html_rendering = null; // HTML rendering interface
|
private HTMLRenderingImpl html_rendering = null; // HTML rendering interface
|
||||||
private ScriptSupportImpl script_support = null; // script support interface
|
private ScriptSupportImpl script_support = null; // script support interface
|
||||||
private ResourceLoaderImpl m_resource_loader = null; // resource loader interface
|
private ResourceLoaderImpl m_resource_loader = null; // resource loader interface
|
||||||
|
private BrowserInformationImpl m_browser_info = null; // browser information interface
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------------
|
/*--------------------------------------------------------------------------------
|
||||||
* Constructor
|
* Constructor
|
||||||
|
@ -914,6 +917,14 @@ public class RequestImpl implements RequestInput
|
||||||
|
|
||||||
} // end if
|
} // end if
|
||||||
|
|
||||||
|
if (klass==BrowserInformation.class)
|
||||||
|
{ // create browser information obejct and return it
|
||||||
|
if (m_browser_info==null)
|
||||||
|
m_browser_info = new BrowserInformationImpl(request,ctxt);
|
||||||
|
return m_browser_info;
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
throw new NoSuchServiceException("RequestInput",klass);
|
throw new NoSuchServiceException("RequestInput",klass);
|
||||||
|
|
||||||
} // end queryService
|
} // end queryService
|
||||||
|
@ -2426,3 +2437,105 @@ class ResourceLoaderImpl implements ResourceLoader
|
||||||
} // end getMenuTemplate
|
} // end getMenuTemplate
|
||||||
|
|
||||||
} // end class ResourceLoader
|
} // end class ResourceLoader
|
||||||
|
|
||||||
|
class BrowserInformationImpl implements BrowserInformation
|
||||||
|
{
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Static data members
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private static final String AGENT_ATTR = "com.silverwrist.venice.BrowserInformation.agent";
|
||||||
|
private static final String ENTRY_ATTR = "com.silverwrist.venice.BrowserInformation.entries";
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Attributes
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
private String m_agent;
|
||||||
|
private List m_entries;
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Constructor
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
BrowserInformationImpl(HttpServletRequest req, ServletContext ctxt)
|
||||||
|
{
|
||||||
|
HttpSession sess = req.getSession(true);
|
||||||
|
m_agent = (String)(sess.getAttribute(AGENT_ATTR));
|
||||||
|
m_entries = (List)(sess.getAttribute(ENTRY_ATTR));
|
||||||
|
if ((m_agent==null) || (m_entries==null))
|
||||||
|
{ // get the agent header
|
||||||
|
m_agent = req.getHeader("User-Agent");
|
||||||
|
if (m_agent==null)
|
||||||
|
m_agent = req.getHeader("HTTP_USER_AGENT");
|
||||||
|
if (m_agent==null)
|
||||||
|
m_agent = "";
|
||||||
|
|
||||||
|
// get the browser database
|
||||||
|
BrowserDatabase bdata = BrowserDatabase.get(ctxt);
|
||||||
|
BrowserEntry ntry = bdata.lookup(m_agent);
|
||||||
|
if (ntry!=null)
|
||||||
|
{ // get the list of entries
|
||||||
|
ArrayList tmp = new ArrayList();
|
||||||
|
tmp.add(ntry);
|
||||||
|
String s = ntry.getName();
|
||||||
|
while (!(s.equals("*")))
|
||||||
|
{ // follow "parent" links
|
||||||
|
s = ntry.getValue("parent");
|
||||||
|
if (s==null)
|
||||||
|
s = "*";
|
||||||
|
ntry = bdata.getByName(s);
|
||||||
|
tmp.add(ntry);
|
||||||
|
|
||||||
|
} // end while
|
||||||
|
|
||||||
|
tmp.trimToSize();
|
||||||
|
m_entries = Collections.unmodifiableList(tmp);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
else
|
||||||
|
m_entries = Collections.EMPTY_LIST;
|
||||||
|
|
||||||
|
sess.setAttribute(AGENT_ATTR,m_agent);
|
||||||
|
sess.setAttribute(ENTRY_ATTR,m_entries);
|
||||||
|
|
||||||
|
} // end if
|
||||||
|
|
||||||
|
} // end constructor
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------------
|
||||||
|
* Implementations from interface BrowserInformation
|
||||||
|
*--------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
public String getAgent()
|
||||||
|
{
|
||||||
|
return m_agent;
|
||||||
|
|
||||||
|
} // end getAgent
|
||||||
|
|
||||||
|
public String getAttribute(String name)
|
||||||
|
{
|
||||||
|
for (Iterator it=m_entries.iterator(); it.hasNext(); )
|
||||||
|
{ // get first BrowserEntry with the attribute in question
|
||||||
|
BrowserEntry ntry = (BrowserEntry)(it.next());
|
||||||
|
String rc = ntry.getValue(name);
|
||||||
|
if (rc!=null)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
} // end for
|
||||||
|
|
||||||
|
return null;
|
||||||
|
|
||||||
|
} // end getAttribute
|
||||||
|
|
||||||
|
public boolean hasCapability(String name)
|
||||||
|
{
|
||||||
|
return StringUtil.isBooleanTrue(getAttribute(name));
|
||||||
|
|
||||||
|
} // end hasCapability
|
||||||
|
|
||||||
|
} // end class BrowserInformationImpl
|
||||||
|
|
13164
src/com/silverwrist/venice/ui/servlet/browscap.ini
Normal file
13164
src/com/silverwrist/venice/ui/servlet/browscap.ini
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user