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