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 ServiceRegistration<RepositoryDefiner>
125 registerRepositoryDefiner(
126 RepositoryDefiner repositoryDefiner) {
127
128 Registry registry = RegistryUtil.getRegistry();
129
130 return registry.registerService(
131 RepositoryDefiner.class, repositoryDefiner);
132 }
133
134 protected void unregisterRepositoryDefiner(String className) {
135 _externalRepositoriesClassNames.remove(className);
136
137 _repositoryClassDefinitions.remove(className);
138 }
139
140 private final Set<String> _externalRepositoriesClassNames =
141 new ConcurrentHashSet<String>();
142 private RepositoryFactory _legacyExternalRepositoryFactory;
143 private final Map<String, RepositoryClassDefinition>
144 _repositoryClassDefinitions =
145 new ConcurrentHashMap<String, RepositoryClassDefinition>();
146 private List<RepositoryDefiner> _repositoryDefiners;
147 private final StringServiceRegistrationMap<RepositoryDefiner>
148 _serviceRegistrations =
149 new StringServiceRegistrationMap<RepositoryDefiner>();
150 private ServiceTracker<RepositoryDefiner, RepositoryDefiner>
151 _serviceTracker;
152
153 private class RepositoryDefinerServiceTrackerCustomizer
154 implements ServiceTrackerCustomizer
155 <RepositoryDefiner, RepositoryDefiner> {
156
157 @Override
158 public RepositoryDefiner addingService(
159 ServiceReference<RepositoryDefiner> serviceReference) {
160
161 Registry registry = RegistryUtil.getRegistry();
162
163 RepositoryDefiner repositoryDefiner = registry.getService(
164 serviceReference);
165
166 String className = repositoryDefiner.getClassName();
167
168 if (repositoryDefiner.isExternalRepository()) {
169 _externalRepositoriesClassNames.add(className);
170 }
171
172 _repositoryClassDefinitions.put(
173 className,
174 RepositoryClassDefinition.fromRepositoryDefiner(
175 repositoryDefiner));
176
177 return repositoryDefiner;
178 }
179
180 @Override
181 public void modifiedService(
182 ServiceReference<RepositoryDefiner> serviceReference,
183 RepositoryDefiner repositoryDefiner) {
184
185 String className = repositoryDefiner.getClassName();
186
187 if (repositoryDefiner.isExternalRepository()) {
188 _externalRepositoriesClassNames.add(className);
189 }
190 else {
191 _externalRepositoriesClassNames.remove(className);
192 }
193
194 _repositoryClassDefinitions.put(
195 repositoryDefiner.getClassName(),
196 RepositoryClassDefinition.fromRepositoryDefiner(
197 repositoryDefiner));
198 }
199
200 @Override
201 public void removedService(
202 ServiceReference<RepositoryDefiner> serviceReference,
203 RepositoryDefiner repositoryDefiner) {
204
205 unregisterRepositoryDefiner(repositoryDefiner.getClassName());
206 }
207
208 }
209
210 }