/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.repository.registry;
import com.liferay.portal.kernel.cache.CacheRegistryItem;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.repository.RepositoryFactory;
import com.liferay.portal.kernel.repository.registry.RepositoryDefiner;
import com.liferay.portal.kernel.util.PortalClassLoaderUtil;
import com.liferay.portal.kernel.util.ResourceBundleLoader;
import com.liferay.portal.repository.external.LegacyExternalRepositoryDefiner;
import com.liferay.portal.repository.util.ExternalRepositoryFactory;
import com.liferay.portal.repository.util.ExternalRepositoryFactoryImpl;
import com.liferay.portal.repository.util.ExternalRepositoryFactoryUtil;
import com.liferay.portal.util.PropsValues;
import com.liferay.registry.Registry;
import com.liferay.registry.RegistryUtil;
import com.liferay.registry.ServiceReference;
import com.liferay.registry.ServiceRegistration;
import com.liferay.registry.ServiceTracker;
import com.liferay.registry.ServiceTrackerCustomizer;
import com.liferay.registry.collections.StringServiceRegistrationMap;
import com.liferay.registry.collections.StringServiceRegistrationMapImpl;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author Adolfo PĂ©rez
*/
public class RepositoryClassDefinitionCatalogImpl
implements CacheRegistryItem, RepositoryClassDefinitionCatalog {
@Override
public Iterable<RepositoryClassDefinition>
getExternalRepositoryClassDefinitions() {
return _externalRepositoryClassDefinitions.values();
}
@Override
public Collection<String> getExternalRepositoryClassNames() {
return _externalRepositoryClassDefinitions.keySet();
}
@Override
public String getRegistryName() {
Class<?> clazz = getClass();
return clazz.getName();
}
@Override
public RepositoryClassDefinition getRepositoryClassDefinition(
String className) {
return _repositoryClassDefinitions.get(className);
}
@Override
public void invalidate() {
for (RepositoryClassDefinition repositoryClassDefinition :
_repositoryClassDefinitions.values()) {
repositoryClassDefinition.invalidateCache();
}
}
public void loadDefaultRepositoryDefiners() {
Registry registry = RegistryUtil.getRegistry();
_serviceTracker = registry.trackServices(
RepositoryDefiner.class,
new RepositoryDefinerServiceTrackerCustomizer());
_serviceTracker.open();
for (RepositoryDefiner repositoryDefiner : _repositoryDefiners) {
registerRepositoryDefiner(repositoryDefiner);
}
ClassLoader classLoader = PortalClassLoaderUtil.getClassLoader();
for (String className : PropsValues.DL_REPOSITORY_IMPL) {
ExternalRepositoryFactory externalRepositoryFactory =
new ExternalRepositoryFactoryImpl(className, classLoader);
registerLegacyExternalRepositoryFactory(
className, externalRepositoryFactory,
LanguageUtil.getPortalResourceBundleLoader());
}
}
@Override
public void registerLegacyExternalRepositoryFactory(
String className, ExternalRepositoryFactory externalRepositoryFactory,
ResourceBundleLoader resourceBundleLoader) {
ExternalRepositoryFactoryUtil.registerExternalRepositoryFactory(
className, externalRepositoryFactory);
RepositoryDefiner repositoryDefiner =
new LegacyExternalRepositoryDefiner(
className, _legacyExternalRepositoryFactory,
resourceBundleLoader);
ServiceRegistration<RepositoryDefiner> serviceRegistration =
registerRepositoryDefiner(repositoryDefiner);
_serviceRegistrations.put(className, serviceRegistration);
}
public void setLegacyExternalRepositoryFactory(
RepositoryFactory legacyExternalRepositoryFactory) {
_legacyExternalRepositoryFactory = legacyExternalRepositoryFactory;
}
public void setRepositoryDefiners(
List<RepositoryDefiner> repositoryDefiners) {
_repositoryDefiners = repositoryDefiners;
}
@Override
public void unregisterLegacyExternalRepositoryFactory(String className) {
ExternalRepositoryFactoryUtil.unregisterExternalRepositoryFactory(
className);
ServiceRegistration<RepositoryDefiner> serviceRegistration =
_serviceRegistrations.remove(className);
serviceRegistration.unregister();
unregisterRepositoryDefiner(className);
}
protected ServiceRegistration<RepositoryDefiner> registerRepositoryDefiner(
RepositoryDefiner repositoryDefiner) {
Registry registry = RegistryUtil.getRegistry();
return registry.registerService(
RepositoryDefiner.class, repositoryDefiner);
}
protected void unregisterRepositoryDefiner(String className) {
_externalRepositoryClassDefinitions.remove(className);
_repositoryClassDefinitions.remove(className);
}
private final Map<String, RepositoryClassDefinition>
_externalRepositoryClassDefinitions = new ConcurrentHashMap<>();
private RepositoryFactory _legacyExternalRepositoryFactory;
private final Map<String, RepositoryClassDefinition>
_repositoryClassDefinitions = new ConcurrentHashMap<>();
private List<RepositoryDefiner> _repositoryDefiners;
private final StringServiceRegistrationMap<RepositoryDefiner>
_serviceRegistrations = new StringServiceRegistrationMapImpl<>();
private ServiceTracker<RepositoryDefiner, RepositoryDefiner>
_serviceTracker;
private class RepositoryDefinerServiceTrackerCustomizer
implements ServiceTrackerCustomizer
<RepositoryDefiner, RepositoryDefiner> {
@Override
public RepositoryDefiner addingService(
ServiceReference<RepositoryDefiner> serviceReference) {
Registry registry = RegistryUtil.getRegistry();
RepositoryDefiner repositoryDefiner = registry.getService(
serviceReference);
String className = repositoryDefiner.getClassName();
RepositoryClassDefinition repositoryClassDefinition =
RepositoryClassDefinition.fromRepositoryDefiner(
repositoryDefiner);
if (repositoryDefiner.isExternalRepository()) {
_externalRepositoryClassDefinitions.put(
className, repositoryClassDefinition);
}
_repositoryClassDefinitions.put(
className, repositoryClassDefinition);
return repositoryDefiner;
}
@Override
public void modifiedService(
ServiceReference<RepositoryDefiner> serviceReference,
RepositoryDefiner repositoryDefiner) {
String className = repositoryDefiner.getClassName();
RepositoryClassDefinition repositoryClassDefinition =
RepositoryClassDefinition.fromRepositoryDefiner(
repositoryDefiner);
if (repositoryDefiner.isExternalRepository()) {
_externalRepositoryClassDefinitions.put(
className, repositoryClassDefinition);
}
else {
_externalRepositoryClassDefinitions.remove(className);
}
_repositoryClassDefinitions.put(
className, repositoryClassDefinition);
}
@Override
public void removedService(
ServiceReference<RepositoryDefiner> serviceReference,
RepositoryDefiner repositoryDefiner) {
unregisterRepositoryDefiner(repositoryDefiner.getClassName());
}
}
}