001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.util;
016    
017    import com.liferay.portal.configuration.ConfigurationImpl;
018    import com.liferay.portal.kernel.configuration.Configuration;
019    import com.liferay.portal.kernel.configuration.Filter;
020    import com.liferay.portal.kernel.exception.PortalException;
021    import com.liferay.portal.kernel.log.Log;
022    import com.liferay.portal.kernel.log.LogFactoryUtil;
023    import com.liferay.portal.kernel.model.Company;
024    import com.liferay.portal.kernel.model.CompanyConstants;
025    import com.liferay.portal.kernel.security.auth.CompanyThreadLocal;
026    import com.liferay.portal.kernel.service.CompanyLocalServiceUtil;
027    import com.liferay.portal.kernel.servlet.WebDirDetector;
028    import com.liferay.portal.kernel.util.CharPool;
029    import com.liferay.portal.kernel.util.ClassUtil;
030    import com.liferay.portal.kernel.util.GetterUtil;
031    import com.liferay.portal.kernel.util.PropsKeys;
032    import com.liferay.portal.kernel.util.ReleaseInfo;
033    import com.liferay.portal.kernel.util.ServerDetector;
034    import com.liferay.portal.kernel.util.StringPool;
035    import com.liferay.portal.kernel.util.StringUtil;
036    import com.liferay.portal.kernel.util.SystemProperties;
037    import com.liferay.portal.kernel.util.UnicodeProperties;
038    
039    import java.util.HashMap;
040    import java.util.Map;
041    import java.util.Properties;
042    
043    import javax.servlet.Servlet;
044    
045    /**
046     * @author Brian Wing Shun Chan
047     */
048    public class PropsUtil {
049    
050            public static void addProperties(Company company, Properties properties) {
051                    Configuration configuration = _getConfiguration(company);
052    
053                    configuration.addProperties(properties);
054            }
055    
056            public static void addProperties(
057                    Company company, UnicodeProperties unicodeProperties) {
058    
059                    Configuration configuration = _getConfiguration(company);
060    
061                    Properties properties = new Properties();
062    
063                    properties.putAll(unicodeProperties);
064    
065                    configuration.addProperties(properties);
066            }
067    
068            public static void addProperties(Properties properties) {
069                    Configuration configuration = _getConfiguration();
070    
071                    configuration.addProperties(properties);
072            }
073    
074            public static void addProperties(UnicodeProperties unicodeProperties) {
075                    Configuration configuration = _getConfiguration();
076    
077                    Properties properties = new Properties();
078    
079                    properties.putAll(unicodeProperties);
080    
081                    configuration.addProperties(properties);
082            }
083    
084            public static boolean contains(Company company, String key) {
085                    Configuration configuration = _getConfiguration(company);
086    
087                    return configuration.contains(key);
088            }
089    
090            public static boolean contains(String key) {
091                    Configuration configuration = _getConfiguration();
092    
093                    return configuration.contains(key);
094            }
095    
096            public static String get(Company company, String key) {
097                    Configuration configuration = _getConfiguration(company);
098    
099                    return configuration.get(key);
100            }
101    
102            public static String get(Company company, String key, Filter filter) {
103                    Configuration configuration = _getConfiguration(company);
104    
105                    return configuration.get(key, filter);
106            }
107    
108            public static String get(String key) {
109                    Configuration configuration = _getConfiguration();
110    
111                    return configuration.get(key);
112            }
113    
114            public static String get(String key, Filter filter) {
115                    Configuration configuration = _getConfiguration();
116    
117                    return configuration.get(key, filter);
118            }
119    
120            public static String[] getArray(Company company, String key) {
121                    Configuration configuration = _getConfiguration(company);
122    
123                    return configuration.getArray(key);
124            }
125    
126            public static String[] getArray(
127                    Company company, String key, Filter filter) {
128    
129                    Configuration configuration = _getConfiguration(company);
130    
131                    return configuration.getArray(key, filter);
132            }
133    
134            public static String[] getArray(String key) {
135                    Configuration configuration = _getConfiguration();
136    
137                    return configuration.getArray(key);
138            }
139    
140            public static String[] getArray(String key, Filter filter) {
141                    Configuration configuration = _getConfiguration();
142    
143                    return configuration.getArray(key, filter);
144            }
145    
146            public static Properties getProperties() {
147                    return getProperties(false);
148            }
149    
150            public static Properties getProperties(boolean includeSystem) {
151                    Configuration configuration = _getConfiguration();
152    
153                    Properties properties = configuration.getProperties();
154    
155                    if (!includeSystem) {
156                            return properties;
157                    }
158    
159                    Properties systemCompanyProperties = _configuration.getProperties();
160    
161                    Properties mergedProperties =
162                            (Properties)systemCompanyProperties.clone();
163    
164                    mergedProperties.putAll(properties);
165    
166                    return mergedProperties;
167            }
168    
169            public static Properties getProperties(Company company) {
170                    return getProperties(company, false);
171            }
172    
173            public static Properties getProperties(
174                    Company company, boolean includeSystem) {
175    
176                    Configuration configuration = _getConfiguration(company);
177    
178                    Properties properties = configuration.getProperties();
179    
180                    if (!includeSystem) {
181                            return properties;
182                    }
183    
184                    Properties systemCompanyProperties = _configuration.getProperties();
185    
186                    Properties mergedProperties =
187                            (Properties)systemCompanyProperties.clone();
188    
189                    mergedProperties.putAll(properties);
190    
191                    return mergedProperties;
192            }
193    
194            public static Properties getProperties(
195                    Company company, String prefix, boolean removePrefix) {
196    
197                    Configuration configuration = _getConfiguration(company);
198    
199                    return configuration.getProperties(prefix, removePrefix);
200            }
201    
202            public static Properties getProperties(
203                    String prefix, boolean removePrefix) {
204    
205                    Configuration configuration = _getConfiguration();
206    
207                    return configuration.getProperties(prefix, removePrefix);
208            }
209    
210            /**
211             * @deprecated As of 7.0.0, with no direct replacement
212             */
213            @Deprecated
214            public static void reload() {
215            }
216    
217            public static void removeProperties(
218                    Company company, Properties properties) {
219    
220                    Configuration configuration = _getConfiguration(company);
221    
222                    configuration.removeProperties(properties);
223            }
224    
225            public static void removeProperties(Properties properties) {
226                    Configuration configuration = _getConfiguration();
227    
228                    configuration.removeProperties(properties);
229            }
230    
231            public static void set(Company company, String key, String value) {
232                    Configuration configuration = _getConfiguration(company);
233    
234                    configuration.set(key, value);
235            }
236    
237            public static void set(String key, String value) {
238                    Configuration configuration = _getConfiguration();
239    
240                    configuration.set(key, value);
241            }
242    
243            private static Configuration _getConfiguration() {
244                    if (_configurations == null) {
245                            return _configuration;
246                    }
247    
248                    long companyId = CompanyThreadLocal.getCompanyId();
249    
250                    if (companyId > CompanyConstants.SYSTEM) {
251                            Configuration configuration = _configurations.get(companyId);
252    
253                            if (configuration == null) {
254                                    String webId = null;
255    
256                                    try {
257                                            Company company = CompanyLocalServiceUtil.getCompany(
258                                                    companyId);
259    
260                                            webId = company.getWebId();
261                                    }
262                                    catch (PortalException pe) {
263                                            _log.error(pe, pe);
264                                    }
265    
266                                    configuration = new ConfigurationImpl(
267                                            PropsUtil.class.getClassLoader(), PropsFiles.PORTAL,
268                                            companyId, webId);
269    
270                                    _configurations.put(companyId, configuration);
271                            }
272    
273                            return configuration;
274                    }
275                    else {
276                            return _configuration;
277                    }
278            }
279    
280            private static Configuration _getConfiguration(Company company) {
281                    if (_configurations == null) {
282                            return _configuration;
283                    }
284    
285                    long companyId = company.getCompanyId();
286    
287                    Configuration configuration = _configurations.get(companyId);
288    
289                    if (configuration == null) {
290                            configuration = new ConfigurationImpl(
291                                    PropsUtil.class.getClassLoader(), PropsFiles.PORTAL, companyId,
292                                    company.getWebId());
293    
294                            _configurations.put(companyId, configuration);
295                    }
296    
297                    return configuration;
298            }
299    
300            private static String _getDefaultLiferayHome() {
301                    String defaultLiferayHome = null;
302    
303                    if (ServerDetector.isGlassfish()) {
304                            defaultLiferayHome =
305                                    SystemProperties.get("com.sun.aas.installRoot") + "/..";
306                    }
307                    else if (ServerDetector.isJBoss()) {
308                            defaultLiferayHome = SystemProperties.get("jboss.home.dir") + "/..";
309                    }
310                    else if (ServerDetector.isJOnAS()) {
311                            defaultLiferayHome = SystemProperties.get("jonas.base") + "/..";
312                    }
313                    else if (ServerDetector.isWebLogic()) {
314                            defaultLiferayHome =
315                                    SystemProperties.get("env.DOMAIN_HOME") + "/..";
316                    }
317                    else if (ServerDetector.isJetty()) {
318                            defaultLiferayHome = SystemProperties.get("jetty.home") + "/..";
319                    }
320                    else if (ServerDetector.isResin()) {
321                            defaultLiferayHome = SystemProperties.get("resin.home") + "/..";
322                    }
323                    else if (ServerDetector.isTomcat()) {
324                            defaultLiferayHome = SystemProperties.get("catalina.base") + "/..";
325                    }
326                    else {
327                            defaultLiferayHome = SystemProperties.get("user.dir") + "/liferay";
328                    }
329    
330                    defaultLiferayHome = StringUtil.replace(
331                            defaultLiferayHome, CharPool.BACK_SLASH, CharPool.SLASH);
332    
333                    defaultLiferayHome = StringUtil.replace(
334                            defaultLiferayHome, StringPool.DOUBLE_SLASH, StringPool.SLASH);
335    
336                    if (defaultLiferayHome.endsWith("/..")) {
337                            int pos = defaultLiferayHome.lastIndexOf(
338                                    CharPool.SLASH, defaultLiferayHome.length() - 4);
339    
340                            if (pos != -1) {
341                                    defaultLiferayHome = defaultLiferayHome.substring(0, pos);
342                            }
343                    }
344    
345                    if (_log.isDebugEnabled()) {
346                            _log.debug("Default Liferay home " + defaultLiferayHome);
347                    }
348    
349                    return defaultLiferayHome;
350            }
351    
352            private static String _getLibDir(Class<?> clazz) {
353                    String path = ClassUtil.getParentPath(
354                            clazz.getClassLoader(), clazz.getName());
355    
356                    int pos = path.lastIndexOf(".jar!");
357    
358                    if (pos == -1) {
359                            pos = path.lastIndexOf(".jar/");
360                    }
361    
362                    pos = path.lastIndexOf(CharPool.SLASH, pos);
363    
364                    path = path.substring(0, pos + 1);
365    
366                    return path;
367            }
368    
369            private static final Log _log = LogFactoryUtil.getLog(PropsUtil.class);
370    
371            private static final Configuration _configuration;
372            private static final Map<Long, Configuration> _configurations;
373    
374            static {
375    
376                    // Default liferay home directory
377    
378                    SystemProperties.set(
379                            PropsKeys.DEFAULT_LIFERAY_HOME, _getDefaultLiferayHome());
380    
381                    // Global shared lib directory
382    
383                    String globalSharedLibDir = _getLibDir(Servlet.class);
384    
385                    if (_log.isInfoEnabled()) {
386                            _log.info("Global shared lib directory " + globalSharedLibDir);
387                    }
388    
389                    SystemProperties.set(
390                            PropsKeys.LIFERAY_LIB_GLOBAL_SHARED_DIR, globalSharedLibDir);
391    
392                    // Global lib directory
393    
394                    String globalLibDir = _getLibDir(ReleaseInfo.class);
395    
396                    if (_log.isInfoEnabled()) {
397                            _log.info("Global lib directory " + globalLibDir);
398                    }
399    
400                    SystemProperties.set(PropsKeys.LIFERAY_LIB_GLOBAL_DIR, globalLibDir);
401    
402                    // Portal lib directory
403    
404                    ClassLoader classLoader = PropsUtil.class.getClassLoader();
405    
406                    String portalLibDir = WebDirDetector.getLibDir(classLoader);
407    
408                    String portalLibDirProperty = System.getProperty(
409                            PropsKeys.LIFERAY_LIB_PORTAL_DIR);
410    
411                    if (portalLibDirProperty != null) {
412                            if (!portalLibDirProperty.endsWith(StringPool.SLASH)) {
413                                    portalLibDirProperty += StringPool.SLASH;
414                            }
415    
416                            portalLibDir = portalLibDirProperty;
417                    }
418    
419                    if (_log.isInfoEnabled()) {
420                            _log.info("Portal lib directory " + portalLibDir);
421                    }
422    
423                    SystemProperties.set(PropsKeys.LIFERAY_LIB_PORTAL_DIR, portalLibDir);
424    
425                    // Portal web directory
426    
427                    String portalWebDir = WebDirDetector.getRootDir(portalLibDir);
428    
429                    if (_log.isDebugEnabled()) {
430                            _log.debug("Portal web directory " + portalWebDir);
431                    }
432    
433                    SystemProperties.set(PropsKeys.LIFERAY_WEB_PORTAL_DIR, portalWebDir);
434    
435                    // Liferay home directory
436    
437                    _configuration = new ConfigurationImpl(
438                            PropsUtil.class.getClassLoader(), PropsFiles.PORTAL,
439                            CompanyConstants.SYSTEM, null);
440    
441                    String liferayHome = _configuration.get(PropsKeys.LIFERAY_HOME);
442    
443                    if (_log.isDebugEnabled()) {
444                            _log.debug("Configured Liferay home " + liferayHome);
445                    }
446    
447                    SystemProperties.set(PropsKeys.LIFERAY_HOME, liferayHome);
448    
449                    // Ehcache disk directory
450    
451                    SystemProperties.set(
452                            "ehcache.disk.store.dir", liferayHome + "/data/ehcache");
453    
454                    if (GetterUtil.getBoolean(
455                                    SystemProperties.get("company-id-properties"))) {
456    
457                            _configurations = new HashMap<>();
458                    }
459                    else {
460                            _configurations = null;
461                    }
462            }
463    
464    }