blob: b02d375ab6030cf06df21d64347976368867969c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 flex.messaging.util;
import flex.messaging.client.UserAgentSettings;
import flex.messaging.config.ConfigMap;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Manages user agent information.
*/
public class UserAgentManager
{
/**
* The name of the HTTP header that transports the user agent value.
*/
public static final String USER_AGENT_HEADER_NAME = "User-Agent";
/*
* Configuration constants
*/
private static final String KICKSTART_BYTES = "kickstart-bytes";
private static final String MATCH_ON = "match-on";
// max-streaming-connections-per-session is deprecated; use max-persistent-connections-per-session instead.
public static final String MAX_STREAMING_CONNECTIONS_PER_SESSION = "max-streaming-connections-per-session";
public static final String MAX_PERSISTENT_CONNECTIONS_PER_SESSION = "max-persistent-connections-per-session";
private static final String USER_AGENT = "user-agent";
private static final String USER_AGENT_SETTINGS = "user-agent-settings";
/**
* Used to keep track of the mapping between user agent match strings and
* the settings object.
*/
private Map<String, UserAgentSettings> userAgentSettingsMap = new HashMap<String, UserAgentSettings>();
/**
* Default settings, where match="*".
*/
private UserAgentSettings defaultSettings;
/**
* Given a match-on string, returns the settings for that user agent, or
* null if no user agent settings exist for that match-on string.
*
* @param matchOn The match-on string used to match a specific user agent.
* @return The settings for that user agent, or null if no user agent settings
* exist for that match-on string.
*/
public UserAgentSettings getUserAgentSettings(String matchOn)
{
return userAgentSettingsMap.get(matchOn);
}
/**
* Returns the collection of user agent settings.
* Collection can be empty.
*
* @return The (possibly empty) collection of user agent settings.
*/
public Collection<UserAgentSettings> getUserAgentSettings()
{
return userAgentSettingsMap.values();
}
/**
* Puts a new user agent to the existing list of user agents. If an existing
* user agent with the same match-on property as the new user agent exists,
* it is simply overwritten.
* @param userAgent the UserAgentSettings
*/
public void putUserAgentSettings(UserAgentSettings userAgent)
{
userAgentSettingsMap.put(userAgent.getMatchOn(), userAgent);
}
/**
* Removes the user agent with the same match-on property from the list of
* existing user agents.
* @param useAgent the UserAgentSettings object
*/
public void removeUserAgentSettings(UserAgentSettings userAgent)
{
if (userAgent != null)
userAgentSettingsMap.remove(userAgent.getMatchOn());
}
/**
* Set the default settings to return when there is no match found.
* @param settings the UserAgentSettings object
*/
public void setDefaultUserAgentSettings(UserAgentSettings settings)
{
defaultSettings = settings;
}
/**
* Look for the best match (based on longest match) for a user agent.
* If no match is found, the default settings are returned if set.
*
* @param userAgent a user agent to look for
* @return settings or null if no match and no default.
* @see UserAgentManager#setDefaultUserAgentSettings(flex.messaging.client.UserAgentSettings)
*/
public UserAgentSettings match(String userAgent)
{
// Dearch for the longest match
if (userAgent != null && userAgentSettingsMap.size() > 0)
{
// Search for the best match based upon length.
int bestMatchLength = 0;
String matchedAgent = null;
for (String key : userAgentSettingsMap.keySet())
{
if (userAgent.indexOf(key) != -1)
{
int matchLength = key.length();
if (matchLength > bestMatchLength)
{
bestMatchLength = matchLength;
matchedAgent = key;
}
}
}
if (matchedAgent != null)
return userAgentSettingsMap.get(matchedAgent);
}
// Return default if we have one
return defaultSettings;
}
/**
* Initializes the provided manager with settings from the property map.
* Sets default settings if it encounters a match="*" entry.
*
* @param properties configuration properties, possibly containing "user-agent-settings" element
* @param manager the UserAgentManager to configure
*/
public static void setupUserAgentManager(ConfigMap properties, UserAgentManager manager)
{
// Add default entries for user agents.
manager.putUserAgentSettings(UserAgentSettings.getAgent(UserAgentSettings.USER_AGENT_ANDROID));
manager.putUserAgentSettings(UserAgentSettings.getAgent(UserAgentSettings.USER_AGENT_CHROME));
manager.putUserAgentSettings(UserAgentSettings.getAgent(UserAgentSettings.USER_AGENT_FIREFOX));
manager.putUserAgentSettings(UserAgentSettings.getAgent(UserAgentSettings.USER_AGENT_FIREFOX_1));
manager.putUserAgentSettings(UserAgentSettings.getAgent(UserAgentSettings.USER_AGENT_FIREFOX_2));
manager.putUserAgentSettings(UserAgentSettings.getAgent(UserAgentSettings.USER_AGENT_MSIE));
manager.putUserAgentSettings(UserAgentSettings.getAgent(UserAgentSettings.USER_AGENT_MSIE_5));
manager.putUserAgentSettings(UserAgentSettings.getAgent(UserAgentSettings.USER_AGENT_MSIE_6));
manager.putUserAgentSettings(UserAgentSettings.getAgent(UserAgentSettings.USER_AGENT_MSIE_7));
manager.putUserAgentSettings(UserAgentSettings.getAgent(UserAgentSettings.USER_AGENT_OPERA));
manager.putUserAgentSettings(UserAgentSettings.getAgent(UserAgentSettings.USER_AGENT_OPERA_8));
manager.putUserAgentSettings(UserAgentSettings.getAgent(UserAgentSettings.USER_AGENT_OPERA_10));
manager.putUserAgentSettings(UserAgentSettings.getAgent(UserAgentSettings.USER_AGENT_SAFARI));
if (properties == null)
return;
ConfigMap userAgents = properties.getPropertyAsMap(USER_AGENT_SETTINGS, null);
if (userAgents == null)
return;
List userAgent = userAgents.getPropertyAsList(USER_AGENT, null);
if (userAgent == null || userAgent.size() == 0)
return;
for (Object anUserAgent : userAgent)
{
ConfigMap agent = (ConfigMap)anUserAgent;
String matchOn = agent.getPropertyAsString(MATCH_ON, null);
if (matchOn == null)
continue;
int kickstartBytes = agent.getPropertyAsInt(KICKSTART_BYTES, 0);
int connectionsPerSession = agent.getPropertyAsInt(MAX_PERSISTENT_CONNECTIONS_PER_SESSION,
agent.getPropertyAsInt(MAX_STREAMING_CONNECTIONS_PER_SESSION, UserAgentSettings.MAX_PERSISTENT_CONNECTIONS_DEFAULT));
UserAgentSettings ua = UserAgentSettings.getAgent(matchOn);
ua.setKickstartBytes(kickstartBytes);
ua.setMaxPersistentConnectionsPerSession(connectionsPerSession);
if (matchOn.equals("*"))
manager.setDefaultUserAgentSettings(ua);
else
manager.putUserAgentSettings(ua);
}
}
}