001
014
015 package com.liferay.portal.repository.registry;
016
017 import com.liferay.portal.kernel.cache.CacheRegistryItem;
018 import com.liferay.portal.kernel.language.LanguageUtil;
019 import com.liferay.portal.kernel.repository.RepositoryFactory;
020 import com.liferay.portal.kernel.repository.registry.RepositoryDefiner;
021 import com.liferay.portal.kernel.util.PortalClassLoaderUtil;
022 import com.liferay.portal.kernel.util.ResourceBundleLoader;
023 import com.liferay.portal.repository.external.LegacyExternalRepositoryDefiner;
024 import com.liferay.portal.repository.util.ExternalRepositoryFactory;
025 import com.liferay.portal.repository.util.ExternalRepositoryFactoryImpl;
026 import com.liferay.portal.repository.util.ExternalRepositoryFactoryUtil;
027 import com.liferay.portal.util.PropsValues;
028 import com.liferay.registry.Registry;
029 import com.liferay.registry.RegistryUtil;
030 import com.liferay.registry.ServiceReference;
031 import com.liferay.registry.ServiceRegistration;
032 import com.liferay.registry.ServiceTracker;
033 import com.liferay.registry.ServiceTrackerCustomizer;
034 import com.liferay.registry.collections.StringServiceRegistrationMap;
035 import com.liferay.registry.collections.StringServiceRegistrationMapImpl;
036
037 import java.util.Collection;
038 import java.util.List;
039 import java.util.Map;
040 import java.util.concurrent.ConcurrentHashMap;
041
042
045 public class RepositoryClassDefinitionCatalogImpl
046 implements CacheRegistryItem, RepositoryClassDefinitionCatalog {
047
048 @Override
049 public Iterable<RepositoryClassDefinition>
050 getExternalRepositoryClassDefinitions() {
051
052 return _externalRepositoryClassDefinitions.values();
053 }
054
055 @Override
056 public Collection<String> getExternalRepositoryClassNames() {
057 return _externalRepositoryClassDefinitions.keySet();
058 }
059
060 @Override
061 public String getRegistryName() {
062 Class<?> clazz = getClass();
063
064 return clazz.getName();
065 }
066
067 @Override
068 public RepositoryClassDefinition getRepositoryClassDefinition(
069 String className) {
070
071 return _repositoryClassDefinitions.get(className);
072 }
073
074 @Override
075 public void invalidate() {
076 for (RepositoryClassDefinition repositoryClassDefinition :
077 _repositoryClassDefinitions.values()) {
078
079 repositoryClassDefinition.invalidateCache();
080 }
081 }
082
083 public void loadDefaultRepositoryDefiners() {
084 Registry registry = RegistryUtil.getRegistry();
085
086 _serviceTracker = registry.trackServices(
087 RepositoryDefiner.class,
088 new RepositoryDefinerServiceTrackerCustomizer());
089
090 _serviceTracker.open();
091
092 for (RepositoryDefiner repositoryDefiner : _repositoryDefiners) {
093 registerRepositoryDefiner(repositoryDefiner);
094 }
095
096 ClassLoader classLoader = PortalClassLoaderUtil.getClassLoader();
097
098 for (String className : PropsValues.DL_REPOSITORY_IMPL) {
099 ExternalRepositoryFactory externalRepositoryFactory =
100 new ExternalRepositoryFactoryImpl(className, classLoader);
101
102 registerLegacyExternalRepositoryFactory(
103 className, externalRepositoryFactory,
104 LanguageUtil.getPortalResourceBundleLoader());
105 }
106 }
107
108 @Override
109 public void registerLegacyExternalRepositoryFactory(
110 String className, ExternalRepositoryFactory externalRepositoryFactory,
111 ResourceBundleLoader resourceBundleLoader) {
112
113 ExternalRepositoryFactoryUtil.registerExternalRepositoryFactory(
114 className, externalRepositoryFactory);
115
116 RepositoryDefiner repositoryDefiner =
117 new LegacyExternalRepositoryDefiner(
118 className, _legacyExternalRepositoryFactory,
119 resourceBundleLoader);
120
121 ServiceRegistration<RepositoryDefiner> serviceRegistration =
122 registerRepositoryDefiner(repositoryDefiner);
123
124 _serviceRegistrations.put(className, serviceRegistration);
125 }
126
127 public void setLegacyExternalRepositoryFactory(
128 RepositoryFactory legacyExternalRepositoryFactory) {
129
130 _legacyExternalRepositoryFactory = legacyExternalRepositoryFactory;
131 }
132
133 public void setRepositoryDefiners(
134 List<RepositoryDefiner> repositoryDefiners) {
135
136 _repositoryDefiners = repositoryDefiners;
137 }
138
139 @Override
140 public void unregisterLegacyExternalRepositoryFactory(String className) {
141 ExternalRepositoryFactoryUtil.unregisterExternalRepositoryFactory(
142 className);
143
144 ServiceRegistration<RepositoryDefiner> serviceRegistration =
145 _serviceRegistrations.remove(className);
146
147 serviceRegistration.unregister();
148
149 unregisterRepositoryDefiner(className);
150 }
151
152 protected ServiceRegistration<RepositoryDefiner>
153 registerRepositoryDefiner(
154 RepositoryDefiner repositoryDefiner) {
155
156 Registry registry = RegistryUtil.getRegistry();
157
158 return registry.registerService(
159 RepositoryDefiner.class, repositoryDefiner);
160 }
161
162 protected void unregisterRepositoryDefiner(String className) {
163 _externalRepositoryClassDefinitions.remove(className);
164
165 _repositoryClassDefinitions.remove(className);
166 }
167
168 private final Map<String, RepositoryClassDefinition>
169 _externalRepositoryClassDefinitions = new ConcurrentHashMap<>();
170 private RepositoryFactory _legacyExternalRepositoryFactory;
171 private final Map<String, RepositoryClassDefinition>
172 _repositoryClassDefinitions = new ConcurrentHashMap<>();
173 private List<RepositoryDefiner> _repositoryDefiners;
174 private final StringServiceRegistrationMap<RepositoryDefiner>
175 _serviceRegistrations = new StringServiceRegistrationMapImpl<>();
176 private ServiceTracker<RepositoryDefiner, RepositoryDefiner>
177 _serviceTracker;
178
179 private class RepositoryDefinerServiceTrackerCustomizer
180 implements ServiceTrackerCustomizer
181 <RepositoryDefiner, RepositoryDefiner> {
182
183 @Override
184 public RepositoryDefiner addingService(
185 ServiceReference<RepositoryDefiner> serviceReference) {
186
187 Registry registry = RegistryUtil.getRegistry();
188
189 RepositoryDefiner repositoryDefiner = registry.getService(
190 serviceReference);
191
192 String className = repositoryDefiner.getClassName();
193 RepositoryClassDefinition repositoryClassDefinition =
194 RepositoryClassDefinition.fromRepositoryDefiner(
195 repositoryDefiner);
196
197 if (repositoryDefiner.isExternalRepository()) {
198 _externalRepositoryClassDefinitions.put(
199 className, repositoryClassDefinition);
200 }
201
202 _repositoryClassDefinitions.put(
203 className, repositoryClassDefinition);
204
205 return repositoryDefiner;
206 }
207
208 @Override
209 public void modifiedService(
210 ServiceReference<RepositoryDefiner> serviceReference,
211 RepositoryDefiner repositoryDefiner) {
212
213 String className = repositoryDefiner.getClassName();
214 RepositoryClassDefinition repositoryClassDefinition =
215 RepositoryClassDefinition.fromRepositoryDefiner(
216 repositoryDefiner);
217
218 if (repositoryDefiner.isExternalRepository()) {
219 _externalRepositoryClassDefinitions.put(
220 className, repositoryClassDefinition);
221 }
222 else {
223 _externalRepositoryClassDefinitions.remove(className);
224 }
225
226 _repositoryClassDefinitions.put(
227 className, repositoryClassDefinition);
228 }
229
230 @Override
231 public void removedService(
232 ServiceReference<RepositoryDefiner> serviceReference,
233 RepositoryDefiner repositoryDefiner) {
234
235 unregisterRepositoryDefiner(repositoryDefiner.getClassName());
236 }
237
238 }
239
240 }