001
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
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 }