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