/** * 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.kernel.settings; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.kernel.resource.ResourceRetriever; import com.liferay.portal.kernel.resource.manager.ResourceManager; import com.liferay.portal.kernel.util.StringUtil; import java.io.FileInputStream; import java.io.IOException; /** * @author Iván Zaera */ public class LocationVariableResolver { /** * @deprecated As of 7.0.0, replaced by {@link #LocationVariableResolver( * ResourceManager, SettingsLocatorHelper)} */ @Deprecated public LocationVariableResolver( ResourceManager resourceManager, SettingsFactory settingsFactory) { _resourceManager = resourceManager; _settingsLocatorHelper = SettingsLocatorHelperUtil.getSettingsLocatorHelper(); } public LocationVariableResolver( ResourceManager resourceManager, SettingsLocatorHelper settingsLocatorHelper) { _resourceManager = resourceManager; _settingsLocatorHelper = settingsLocatorHelper; } public boolean isLocationVariable(String value) { if (value == null) { return false; } if (value.startsWith(_LOCATION_VARIABLE_START) && value.endsWith(_LOCATION_VARIABLE_END) && value.contains(_LOCATION_VARIABLE_PROTOCOL_SEPARATOR)) { return true; } return false; } public String resolve(String value) { String protocol = _getProtocol(value); String location = _getLocation(value); if (protocol.equals("resource")) { return _resolveResource(location); } else if (protocol.equals("file")) { return _resolveFile(location); } else if (protocol.equals("server-property")) { return _resolveServerProperty(location); } throw new UnsupportedOperationException( "Unsupported protocol " + protocol); } private String _getLocation(String value) { int i = value.indexOf(_LOCATION_VARIABLE_PROTOCOL_SEPARATOR); return value.substring(i + 1, value.length() - 1); } private String _getProtocol(String value) { int i = value.indexOf(_LOCATION_VARIABLE_PROTOCOL_SEPARATOR); return value.substring(2, i); } private String _resolveFile(String location) { if (!location.startsWith("///")) { throw new IllegalArgumentException( "Invalid file location " + location + " because only local " + "file URIs starting with file:/// are supported"); } try { return StringUtil.read(new FileInputStream(location.substring(2))); } catch (IOException ioe) { throw new SystemException("Unable to read file " + location, ioe); } } private String _resolveResource(String location) { ResourceRetriever resourceRetriever = _resourceManager.getResourceRetriever(location); try { return StringUtil.read(resourceRetriever.getInputStream()); } catch (IOException ioe) { throw new SystemException( "Unable to read resource " + location, ioe); } } private String _resolveServerProperty(String location) { if (!location.startsWith("//")) { throw new IllegalArgumentException( "Invalid server property location " + location); } location = location.substring(2); int i = location.indexOf("/"); if (i == -1) { throw new IllegalArgumentException( "Invalid server property location " + location); } String serviceName = location.substring(0, i); Settings settings = _settingsLocatorHelper.getServerSettings( serviceName); String property = location.substring(i + 1); return settings.getValue(property, null); } private static final String _LOCATION_VARIABLE_END = "}"; private static final String _LOCATION_VARIABLE_PROTOCOL_SEPARATOR = ":"; private static final String _LOCATION_VARIABLE_START = "${"; private final ResourceManager _resourceManager; private final SettingsLocatorHelper _settingsLocatorHelper; }