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> registerRepositoryDefiner(
153 RepositoryDefiner repositoryDefiner) {
154
155 Registry registry = RegistryUtil.getRegistry();
156
157 return registry.registerService(
158 RepositoryDefiner.class, repositoryDefiner);
159 }
160
161 protected void unregisterRepositoryDefiner(String className) {
162 _externalRepositoryClassDefinitions.remove(className);
163
164 _repositoryClassDefinitions.remove(className);
165 }
166
167 private final Map<String, RepositoryClassDefinition>
168 _externalRepositoryClassDefinitions = new ConcurrentHashMap<>();
169 private RepositoryFactory _legacyExternalRepositoryFactory;
170 private final Map<String, RepositoryClassDefinition>
171 _repositoryClassDefinitions = new ConcurrentHashMap<>();
172 private List<RepositoryDefiner> _repositoryDefiners;
173 private final StringServiceRegistrationMap<RepositoryDefiner>
174 _serviceRegistrations = new StringServiceRegistrationMapImpl<>();
175 private ServiceTracker<RepositoryDefiner, RepositoryDefiner>
176 _serviceTracker;
177
178 private class RepositoryDefinerServiceTrackerCustomizer
179 implements ServiceTrackerCustomizer
180 <RepositoryDefiner, RepositoryDefiner> {
181
182 @Override
183 public RepositoryDefiner addingService(
184 ServiceReference<RepositoryDefiner> serviceReference) {
185
186 Registry registry = RegistryUtil.getRegistry();
187
188 RepositoryDefiner repositoryDefiner = registry.getService(
189 serviceReference);
190
191 String className = repositoryDefiner.getClassName();
192 RepositoryClassDefinition repositoryClassDefinition =
193 RepositoryClassDefinition.fromRepositoryDefiner(
194 repositoryDefiner);
195
196 if (repositoryDefiner.isExternalRepository()) {
197 _externalRepositoryClassDefinitions.put(
198 className, repositoryClassDefinition);
199 }
200
201 _repositoryClassDefinitions.put(
202 className, repositoryClassDefinition);
203
204 return repositoryDefiner;
205 }
206
207 @Override
208 public void modifiedService(
209 ServiceReference<RepositoryDefiner> serviceReference,
210 RepositoryDefiner repositoryDefiner) {
211
212 String className = repositoryDefiner.getClassName();
213 RepositoryClassDefinition repositoryClassDefinition =
214 RepositoryClassDefinition.fromRepositoryDefiner(
215 repositoryDefiner);
216
217 if (repositoryDefiner.isExternalRepository()) {
218 _externalRepositoryClassDefinitions.put(
219 className, repositoryClassDefinition);
220 }
221 else {
222 _externalRepositoryClassDefinitions.remove(className);
223 }
224
225 _repositoryClassDefinitions.put(
226 className, repositoryClassDefinition);
227 }
228
229 @Override
230 public void removedService(
231 ServiceReference<RepositoryDefiner> serviceReference,
232 RepositoryDefiner repositoryDefiner) {
233
234 unregisterRepositoryDefiner(repositoryDefiner.getClassName());
235 }
236
237 }
238
239 }