package com.nvarghese.beowulf.common.cobra.html.test; import java.security.Policy; import java.util.HashSet; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import com.nvarghese.beowulf.common.cobra.html.HttpRequest; import com.nvarghese.beowulf.common.cobra.html.UserAgentContext; /** * Simple implementation of * {@link com.nvarghese.beowulf.common.cobra.html.UserAgentContext}. This class * is provided for user convenience. Usually this class should be extended in * order to provide appropriate user agent information and more robust content * loading routines. Its setters can be called to modify certain user agent * defaults. */ public class SimpleUserAgentContext implements UserAgentContext { private static final Logger logger = Logger.getLogger(SimpleUserAgentContext.class.getName()); private static final Set mediaNames = new HashSet(); static { // Media names claimed by this context. Set mn = mediaNames; mn.add("screen"); mn.add("tv"); mn.add("tty"); mn.add("all"); } /** * This implementation returns true for certain media names, such as * <code>screen</code>. */ public boolean isMedia(final String mediaName) { return mediaNames.contains(mediaName.toLowerCase()); } /** * Creates a * {@link com.nvarghese.beowulf.common.cobra.com.nvarghese.beowulf.common.cobra.html.test.SimpleHttpRequest} * instance. The {@link com.nvarghese.beowulf.common.cobra.html.HttpRequest} * object returned by this method is used to load images, scripts, style * sheets, and to implement the Javascript XMLHttpRequest class. Override if * a custom mechanism to make requests is needed. */ public HttpRequest createHttpRequest() { return new SimpleHttpRequest(this, this.getProxy()); } private java.net.Proxy proxy = java.net.Proxy.NO_PROXY; /** * Gets the connection proxy used in requests created by * {@link #createHttpRequest()} by default. This implementation returns the * value of a local field. * * @see #setProxy(java.net.Proxy) */ protected java.net.Proxy getProxy() { return this.proxy; } /** * Sets the value of the proxy normally returned by {@link #getProxy()}. * * @param proxy * A <code>java.net.Proxy</code> instance. */ public void setProxy(final java.net.Proxy proxy) { this.proxy = proxy; } private String appCodeName = "Cobra"; /** * Returns the application "code name." This implementation returns the * value of a local field. * * @see #setAppCodeName(String) */ public String getAppCodeName() { return this.appCodeName; } /** * Sets the application code name normally returned by * {@link #getAppCodeName()}. * * @param appCodeName * An application "code name." */ public void setAppCodeName(final String appCodeName) { this.appCodeName = appCodeName; } private String appMinorVersion = "0"; /** * Gets the "minor version" of the application. This implementation returns * the value of a local field. * * @see #setAppMinorVersion(String) */ public String getAppMinorVersion() { return this.appMinorVersion; } /** * Sets the value normally returned by {@link #getAppMinorVersion()}. * * @param appMinorVersion * The application's "minor version." */ public void setAppMinorVersion(final String appMinorVersion) { this.appMinorVersion = appMinorVersion; } private String appName = "Cobra"; /** * Gets the application name. This implementation returns the value of a * local field. * * @see #setAppName(String) */ public String getAppName() { return this.appName; } /** * Sets the value normally returned by {@link #getAppName()}. * * @param appName * The application name. */ public void setAppName(final String appName) { this.appName = appName; } private String appVersion = "1"; /** * Gets the major application version. This implementation returns the value * of a local field. * * @see #setAppVersion(String) */ public String getAppVersion() { return this.appVersion; } /** * Sets the value normally returned by {@link #getAppVersion()}. * * @param appVersion * The application version. */ public void setAppVersion(final String appVersion) { this.appVersion = appVersion; } /** * Get the browser language. This implementation returns the language of the * default locale. It may be overridden to provide a different value. */ public String getBrowserLanguage() { return "EN"; } /* * public String getBrowserLanguage() { return * Locale.getDefault().getLanguage(); } */ /** * Returns the value of Java property <code>os.name</code>. It may be * overridden to provide a different value. */ public String getPlatform() { return System.getProperty("os.name"); } private String userAgent = "Mozilla/4.0 (compatible; MSIE 6.0;) Cobra/Simple"; /** * Gets the User-Agent string. This implementation returns the value of a * local field. * * @see #setUserAgent(String) */ public String getUserAgent() { return this.userAgent; } /** * Sets the value normally returned by {@link #getUserAgent()}. * * @param userAgent * A User-Agent string. */ public void setUserAgent(final String userAgent) { this.userAgent = userAgent; } /** * This implementation returns true if and only if * <code>java.net.CookieHandler.getDefault()</code> is returning a non-null * value. The method may be overridden to provide an alternative means of * determining cookie enabling state. * * Currently Disabled! */ public boolean isCookieEnabled() { this.warn("isCookieEnabled(): Not overridden - returning false"); return false; } /* * public boolean isCookieEnabled() { return * java.net.CookieHandler.getDefault() != null; } */ /** * This implementation uses the default <code>java.net.CookieHandler</code>, * if any, to get cookie information for the given URL. If no cookie handler * is available, this method returns the empty string. */ public String getCookie(final java.net.URL url) { this.warn("getCookie(): Method not overridden; returning null."); return ""; } /* * public String getCookie(java.net.URL url) { java.net.CookieHandler * handler = java.net.CookieHandler.getDefault(); if(handler == null) { * return ""; } Map results; try { results = handler.get(url.toURI(), new * HashMap()); } catch(Exception err) { logger.log(Level.WARNING, * "getCookie()", err); return ""; } if(results == null) { return ""; } * StringBuffer buffer = new StringBuffer(); Iterator i = * results.entrySet().iterator(); boolean firstTime = true; * while(i.hasNext()) { Map.Entry entry = (Map.Entry) i.next(); String key = * (String) entry.getKey(); if("Cookie".equalsIgnoreCase(key) || * "Cookie2".equalsIgnoreCase(key)) { List list = (List) entry.getValue(); * Iterator li = list.iterator(); while(li.hasNext()) { String value = * (String) li.next(); if(firstTime) { firstTime = false; } else { * buffer.append("; "); } buffer.append(value); } } } return * buffer.toString(); } */ private boolean scriptingEnabled = true; /** * Returns <code>true</code>. Implementations wishing to disable JavaScript * may override this method. */ public boolean isScriptingEnabled() { return true; } /** * Sets the value normally returned by {@link #isScriptingEnabled()}. * * @param enable * A boolean value. */ public void setScriptingEnabled(final boolean enable) { this.scriptingEnabled = enable; } /** * This method uses the default CookieHandler, if one is available, to set a * cookie value. */ public void setCookie(final java.net.URL url, final String cookieSpec) { this.warn("setCookie(): Method not overridden."); } /* * public void setCookie(java.net.URL url, String cookieSpec) { * java.net.CookieHandler handler = java.net.CookieHandler.getDefault(); * if(handler == null) { return; } Map headers = new HashMap(2); * headers.put("Set-Cookie", Collections.singletonList(cookieSpec)); try { * handler.put(url.toURI(), headers); } catch(Exception err) { * logger.log(Level.WARNING, "setCookie()", err); } } */ /** * Returns <code>null</code>. This method must be overridden if JavaScript * code is untrusted. */ public Policy getSecurityPolicy() { return null; } private int scriptingOptimizationLevel = -1; /** * Gets the Rhino optimization level. This implementation returns the value * of a local field defaulting to <code>-1</code>. * * @see #setScriptingOptimizationLevel(int) */ public int getScriptingOptimizationLevel() { return this.scriptingOptimizationLevel; } /** * Sets the value normally returned by * {@link #getScriptingOptimizationLevel()}. * * @param level * A Rhino optimization level. */ public void setScriptingOptimizationLevel(final int level) { this.scriptingOptimizationLevel = level; } private String vendor = "The Lobo Project"; public String getVendor() { return this.vendor; } public void setVendor(final String vendor) { this.vendor = vendor; } private String product = "Cobra"; public String getProduct() { return this.product; } public void setProduct(final String product) { this.product = product; } private boolean externalCSSEnabled = true; /** * Determines whether external CSS loading should be enabled. This * implementation returns the value of a local field defaulting to * <code>true</code>. * * @see #setExternalCSSEnabled(boolean) */ public boolean isExternalCSSEnabled() { return this.externalCSSEnabled; } /** * Sets the value normally returned by {@link #isExternalCSSEnabled()}. * * @param enabled * A boolean value. */ public void setExternalCSSEnabled(final boolean enabled) { this.externalCSSEnabled = enabled; } private void warn(final String message) { if (logger.isLoggable(Level.WARNING)) { logger.log(Level.WARNING, message); } } private void warn(final String message, final Throwable throwable) { if (logger.isLoggable(Level.WARNING)) { logger.log(Level.WARNING, message, throwable); } } }