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