All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.isotrol.impe3.extensions.wurfl.WURFLDeviceCapabilitiesProvider Maven / Gradle / Ivy

/**
 * This file is part of Port@l
 * Port@l 3.0 - Portal Engine and Management System
 * Copyright (C) 2010  Isotrol, SA.  http://www.isotrol.com
 *
 * Port@l is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Port@l is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Port@l.  If not, see .
 */

package com.isotrol.impe3.extensions.wurfl;

import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.ws.rs.core.HttpHeaders;

import net.sourceforge.wurfl.core.WURFLHolder;
import net.sourceforge.wurfl.core.request.DefaultWURFLRequest;
import net.sourceforge.wurfl.core.request.WURFLRequest;
import net.sourceforge.wurfl.core.request.normalizer.UserAgentNormalizer;

import org.apache.commons.lang.StringUtils;

import com.isotrol.impe3.api.DeviceCapabilities;
import com.isotrol.impe3.api.DeviceCapabilitiesProvider;

/**
 * Default WURFL device capabilities provider implementation. 
 * @author Emilio Escobar Reyero
 */
public class WURFLDeviceCapabilitiesProvider implements DeviceCapabilitiesProvider {

	private WURFLHolder holder;
	private UserAgentNormalizer userAgentNormalizer;
	
	/**
	 * @see com.isotrol.impe3.api.DeviceCapabilitiesProvider#getDeviceCapabilities(javax.ws.rs.core.HttpHeaders)
	 */
	public DeviceCapabilities getDeviceCapabilities(HttpHeaders headers) {
		final String userAgent = getUserAgent(headers);
		final String userAgentProfile = getUAProfile(headers);
		final WURFLRequest agent = new DefaultWURFLRequest(userAgent, userAgentProfile);
		
		final net.sourceforge.wurfl.core.Device solvedDevice = holder
				.getWURFLManager().getDeviceForRequest(agent);

		if (isEmpty(solvedDevice.getCapability("mobile_browser"))){
			return null;
		}
		
		@SuppressWarnings("unchecked")
		final Map solvedCapabilities = solvedDevice.getCapabilities();
		
		if (solvedCapabilities == null) {
			return null;
		}

		return new WURFLDeviceCapabilities(solvedCapabilities);
	}
	
	private boolean isEmpty(String capability) {
		return capability == null || capability.trim().length() == 0;
	}
	
	private String getUserAgent(HttpHeaders headers) {
		final String userAgent;

		if (getHeader("UA", headers) != null) {
			userAgent = StringUtils.trimToEmpty(getHeader("UA", headers));
		} else if (getHeader("X-Skyfire-Version", headers) != null) {
			userAgent = "Generic_Skyfire_Browser";
		} else if (getHeader("x-device-user-agent", headers) != null) {
			userAgent = StringUtils.trimToEmpty(getHeader("x-device-user-agent", headers));
		} else {
			userAgent = StringUtils.trimToEmpty(getHeader("User-Agent", headers));
		}

		return userAgent.length() == 0 ? "" : userAgentNormalizer.normalize(userAgent);
	}

	private String getUAProfile(HttpHeaders headers) {
		String headerName = null;
		String uaProfile = null;

		if (getHeader("x-wap-profile", headers) != null) {
			headerName = "x-wap-profile";
		} else if (getHeader("Profile", headers) != null) {
			headerName = "Profile";
		} else if (getHeader("wap-profile", headers) != null) {
			headerName = "wap-profile";
		} else if (getHeader("Opt", headers) != null) {
			headerName = namespaceProfileHeader(getHeader("Opt", headers));
		}

		if (headerName != null && headerName.trim().length() > 0) {
			uaProfile = getHeader(headerName, headers);
		}

		// Strip out quotes from uaProfile
		if (uaProfile != null && uaProfile.trim().length() > 0) {
			STRIP_QUOTE_PATTERN.matcher(uaProfile).replaceAll("");
		}

		return uaProfile;
	}

	private String namespaceProfileHeader(String header) {
		String namespaceNumber = nameSpaceNumber(header);
		return namespaceNumber != null ? (namespaceNumber + "-Profile") : null;
	}

	private static final Pattern STRIP_QUOTE_PATTERN = Pattern.compile("\"");
	private static final Pattern NAMESPACE_NUMBER_PATTERN = Pattern
			.compile("ns=(\\d*)");

	private static String nameSpaceNumber(String header) {
		final Matcher matcher = NAMESPACE_NUMBER_PATTERN.matcher(header);
		return matcher.matches() ? matcher.group(1) : null;
	}

	private String getHeader(String key, HttpHeaders headers) {
		final List h = headers.getRequestHeader(key);

		if (h == null || h.isEmpty()) {
			return null;
		}
		
		return h.get(0);
	}

	public void setHolder(WURFLHolder holder) {
		this.holder = holder;
	}
	public void setUserAgentNormalizer(UserAgentNormalizer userAgentNormalizer) {
		this.userAgentNormalizer = userAgentNormalizer;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy