/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library 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 Lesser General Public License for more * details. */ package com.liferay.portal.mobile.device.detection.fiftyonedegrees.internal; import com.liferay.portal.configuration.metatype.bnd.util.ConfigurableUtil; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.mobile.device.Device; import com.liferay.portal.kernel.mobile.device.UnknownDevice; import com.liferay.portal.mobile.device.detection.fiftyonedegrees.configuration.FiftyOneDegreesConfiguration; import com.liferay.portal.mobile.device.detection.fiftyonedegrees.data.DataFileProvider; import fiftyone.mobile.detection.Dataset; import fiftyone.mobile.detection.DatasetBuilder; import fiftyone.mobile.detection.Match; import fiftyone.mobile.detection.Provider; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.commons.io.IOUtils; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Deactivate; import org.osgi.service.component.annotations.Modified; import org.osgi.service.component.annotations.Reference; import org.osgi.service.component.annotations.ReferencePolicyOption; /** * @author Brian Greenwald * @author Prathima Shreenath */ @Component( configurationPid = "com.liferay.portal.mobile.device.detection.fiftyonedegrees.configuration.FiftyOneDegreesConfiguration", immediate = true, service = FiftyOneDegreesEngineProxy.class ) public class FiftyOneDegreesEngineProxy { public Dataset getDataset() { return _provider.dataSet; } public Device getDevice(HttpServletRequest request) { String userAgent = request.getHeader("User-Agent"); try { Match match = _provider.match(userAgent); return new FiftyOneDegreesDevice(match); } catch (IOException ioe) { if (_log.isDebugEnabled()) { _log.debug( "Unable to get match for user agent: " + userAgent, ioe); } return UnknownDevice.getInstance(); } } @Activate @Modified protected void activate(Map<String, Object> properties) { _fiftyOneDegreesConfiguration = ConfigurableUtil.createConfigurable( FiftyOneDegreesConfiguration.class, properties); try (InputStream inputStream = _dataFileProvider.getDataFileInputStream()) { File tempFile = File.createTempFile( "51degrees", String.valueOf(System.currentTimeMillis())); try (OutputStream outputStream = new FileOutputStream(tempFile)) { IOUtils.copy(inputStream, outputStream); outputStream.flush(); } DatasetBuilder.BuildFromFile buildFromFile = DatasetBuilder.file(); buildFromFile.configureCachesFromCacheSet( DatasetBuilder.CacheTemplate.Default); buildFromFile.setTempFile(); Dataset dataset = buildFromFile.build(tempFile.getAbsolutePath()); _provider = new Provider( dataset, _fiftyOneDegreesConfiguration.cacheSize()); } catch (IOException ioe) { if (_log.isWarnEnabled()) { _log.warn("Unable to load 51Degrees provider data", ioe); } throw new IllegalStateException(ioe); } } @Deactivate protected void deactivate() { _fiftyOneDegreesConfiguration = null; _provider = null; } private static final Log _log = LogFactoryUtil.getLog( FiftyOneDegreesEngineProxy.class); @Reference(policyOption = ReferencePolicyOption.GREEDY) private DataFileProvider _dataFileProvider; private volatile FiftyOneDegreesConfiguration _fiftyOneDegreesConfiguration; private Provider _provider; }