001    /**
002     * Copyright (c) 2000-2012 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.kernel.dao.orm;
016    
017    import com.liferay.portal.kernel.cache.key.CacheKeyGenerator;
018    import com.liferay.portal.kernel.cache.key.CacheKeyGeneratorUtil;
019    import com.liferay.portal.kernel.dao.shard.ShardUtil;
020    import com.liferay.portal.kernel.util.StringBundler;
021    import com.liferay.portal.kernel.util.StringPool;
022    import com.liferay.portal.kernel.util.StringUtil;
023    import com.liferay.portal.model.BaseModel;
024    
025    import java.io.Serializable;
026    
027    /**
028     * @author Brian Wing Shun Chan
029     * @author Shuyang Zhou
030     */
031    public class FinderPath {
032    
033            public FinderPath(
034                    boolean entityCacheEnabled, boolean finderCacheEnabled,
035                    Class<?> resultClass, String cacheName, String methodName,
036                    String[] params) {
037    
038                    this(
039                            entityCacheEnabled, finderCacheEnabled, resultClass, cacheName,
040                            methodName, params, -1);
041            }
042    
043            public FinderPath(
044                    boolean entityCacheEnabled, boolean finderCacheEnabled,
045                    Class<?> resultClass, String cacheName, String methodName,
046                    String[] params, long columnBitmask) {
047    
048                    _entityCacheEnabled = entityCacheEnabled;
049                    _finderCacheEnabled = finderCacheEnabled;
050                    _resultClass = resultClass;
051                    _cacheName = cacheName;
052                    _methodName = methodName;
053                    _params = params;
054                    _columnBitmask = columnBitmask;
055    
056                    if (BaseModel.class.isAssignableFrom(_resultClass)) {
057                            _cacheKeyGeneratorCacheName =
058                                    FinderCache.class.getName() + "#BaseModel";
059                    }
060                    else {
061                            _cacheKeyGeneratorCacheName = FinderCache.class.getName();
062                    }
063    
064                    CacheKeyGenerator cacheKeyGenerator =
065                            CacheKeyGeneratorUtil.getCacheKeyGenerator(
066                                    _cacheKeyGeneratorCacheName);
067    
068                    if (cacheKeyGenerator.isCallingGetCacheKeyThreadSafe()) {
069                            _cacheKeyGenerator = cacheKeyGenerator;
070                    }
071    
072                    _initCacheKeyPrefix();
073                    _initLocalCacheKeyPrefix();
074            }
075    
076            public Serializable encodeCacheKey(Object[] arguments) {
077                    StringBundler sb = new StringBundler(arguments.length * 2 + 3);
078    
079                    sb.append(ShardUtil.getCurrentShardName());
080                    sb.append(StringPool.PERIOD);
081                    sb.append(_cacheKeyPrefix);
082    
083                    for (Object arg : arguments) {
084                            sb.append(StringPool.PERIOD);
085                            sb.append(StringUtil.toHexString(arg));
086                    }
087    
088                    return _getCacheKey(sb);
089            }
090    
091            public Serializable encodeLocalCacheKey(Object[] arguments) {
092                    StringBundler sb = new StringBundler(arguments.length * 2 + 3);
093    
094                    sb.append(ShardUtil.getCurrentShardName());
095                    sb.append(StringPool.PERIOD);
096                    sb.append(_localCacheKeyPrefix);
097    
098                    for (Object arg : arguments) {
099                            sb.append(StringPool.PERIOD);
100                            sb.append(StringUtil.toHexString(arg));
101                    }
102    
103                    return _getCacheKey(sb);
104            }
105    
106            public String getCacheName() {
107                    return _cacheName;
108            }
109    
110            public long getColumnBitmask() {
111                    return _columnBitmask;
112            }
113    
114            public String getMethodName() {
115                    return _methodName;
116            }
117    
118            public String[] getParams() {
119                    return _params;
120            }
121    
122            public Class<?> getResultClass() {
123                    return _resultClass;
124            }
125    
126            public boolean isEntityCacheEnabled() {
127                    return _entityCacheEnabled;
128            }
129    
130            public boolean isFinderCacheEnabled() {
131                    return _finderCacheEnabled;
132            }
133    
134            public void setCacheKeyGeneratorCacheName(
135                    String cacheKeyGeneratorCacheName) {
136    
137                    if (cacheKeyGeneratorCacheName == null) {
138                            cacheKeyGeneratorCacheName = FinderCache.class.getName();
139                    }
140    
141                    _cacheKeyGeneratorCacheName = cacheKeyGeneratorCacheName;
142    
143                    CacheKeyGenerator cacheKeyGenerator =
144                            CacheKeyGeneratorUtil.getCacheKeyGenerator(
145                                    cacheKeyGeneratorCacheName);
146    
147                    if (cacheKeyGenerator.isCallingGetCacheKeyThreadSafe()) {
148                            _cacheKeyGenerator = cacheKeyGenerator;
149                    }
150                    else {
151                            _cacheKeyGenerator = null;
152                    }
153            }
154    
155            private Serializable _getCacheKey(StringBundler sb) {
156                    CacheKeyGenerator cacheKeyGenerator = _cacheKeyGenerator;
157    
158                    if (cacheKeyGenerator == null) {
159                            cacheKeyGenerator = CacheKeyGeneratorUtil.getCacheKeyGenerator(
160                                    _cacheKeyGeneratorCacheName);
161                    }
162    
163                    return cacheKeyGenerator.getCacheKey(sb);
164            }
165    
166            private void _initCacheKeyPrefix() {
167                    StringBundler sb = new StringBundler(_params.length * 2 + 3);
168    
169                    sb.append(_methodName);
170                    sb.append(_PARAMS_SEPARATOR);
171    
172                    for (String param : _params) {
173                            sb.append(StringPool.PERIOD);
174                            sb.append(param);
175                    }
176    
177                    sb.append(_ARGS_SEPARATOR);
178    
179                    _cacheKeyPrefix = sb.toString();
180            }
181    
182            private void _initLocalCacheKeyPrefix() {
183                    _localCacheKeyPrefix = _cacheName.concat(StringPool.PERIOD).concat(
184                            _cacheKeyPrefix);
185            }
186    
187            private static final String _ARGS_SEPARATOR = "_A_";
188    
189            private static final String _PARAMS_SEPARATOR = "_P_";
190    
191            private CacheKeyGenerator _cacheKeyGenerator;
192            private String _cacheKeyGeneratorCacheName;
193            private String _cacheKeyPrefix;
194            private String _cacheName;
195            private long _columnBitmask;
196            private boolean _entityCacheEnabled;
197            private boolean _finderCacheEnabled;
198            private String _localCacheKeyPrefix;
199            private String _methodName;
200            private String[] _params;
201            private Class<?> _resultClass;
202    
203    }