/**
* 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.exception.PortalException;
import com.liferay.portal.kernel.repository.DocumentRepository;
import com.liferay.portal.kernel.repository.LocalRepository;
import com.liferay.portal.kernel.repository.Repository;
import com.liferay.portal.kernel.repository.RepositoryConfiguration;
import com.liferay.portal.kernel.repository.RepositoryFactory;
import com.liferay.portal.kernel.repository.capabilities.Capability;
import com.liferay.portal.kernel.repository.capabilities.ConfigurationCapability;
import com.liferay.portal.kernel.repository.capabilities.RepositoryEventTriggerCapability;
import com.liferay.portal.kernel.repository.event.RepositoryEventAware;
import com.liferay.portal.kernel.repository.event.RepositoryEventListener;
import com.liferay.portal.kernel.repository.event.RepositoryEventTrigger;
import com.liferay.portal.kernel.repository.event.RepositoryEventType;
import com.liferay.portal.kernel.repository.registry.RepositoryDefiner;
import com.liferay.portal.kernel.repository.registry.RepositoryEventRegistry;
import com.liferay.portal.kernel.repository.registry.RepositoryFactoryRegistry;
import com.liferay.portal.repository.InitializedLocalRepository;
import com.liferay.portal.repository.InitializedRepository;
import com.liferay.portal.repository.capabilities.CapabilityLocalRepository;
import com.liferay.portal.repository.capabilities.CapabilityRepository;
import com.liferay.portal.repository.capabilities.ConfigurationCapabilityImpl;
import com.liferay.portal.repository.capabilities.LiferayRepositoryEventTriggerCapability;
import com.liferay.portal.repository.capabilities.util.RepositoryServiceAdapter;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author Adolfo PĂ©rez
*/
public class RepositoryClassDefinition
implements RepositoryFactory, RepositoryFactoryRegistry {
public static final RepositoryClassDefinition fromRepositoryDefiner(
RepositoryDefiner repositoryDefiner) {
DefaultRepositoryEventRegistry defaultRepositoryEventRegistry =
new DefaultRepositoryEventRegistry(null);
RepositoryClassDefinition repositoryClassDefinition =
new RepositoryClassDefinition(
repositoryDefiner, defaultRepositoryEventRegistry);
repositoryDefiner.registerRepositoryFactory(repositoryClassDefinition);
repositoryDefiner.registerRepositoryEventListeners(
defaultRepositoryEventRegistry);
return repositoryClassDefinition;
}
@Override
public LocalRepository createLocalRepository(long repositoryId)
throws PortalException {
if (_localRepositories.containsKey(repositoryId)) {
return _localRepositories.get(repositoryId);
}
InitializedLocalRepository initializedLocalRepository =
new InitializedLocalRepository();
DefaultCapabilityRegistry defaultCapabilityRegistry =
new DefaultCapabilityRegistry(initializedLocalRepository);
_repositoryDefiner.registerCapabilities(defaultCapabilityRegistry);
DefaultRepositoryEventRegistry defaultRepositoryEventRegistry =
new DefaultRepositoryEventRegistry(_rootRepositoryEventTrigger);
setUpCommonCapabilities(
initializedLocalRepository, defaultCapabilityRegistry,
defaultRepositoryEventRegistry);
defaultCapabilityRegistry.registerCapabilityRepositoryEvents(
defaultRepositoryEventRegistry);
LocalRepository localRepository =
_repositoryFactory.createLocalRepository(repositoryId);
LocalRepository wrappedLocalRepository =
defaultCapabilityRegistry.invokeCapabilityWrappers(localRepository);
CapabilityLocalRepository capabilityLocalRepository =
new CapabilityLocalRepository(
wrappedLocalRepository, defaultCapabilityRegistry,
defaultRepositoryEventRegistry);
initializedLocalRepository.setDocumentRepository(
capabilityLocalRepository);
_localRepositories.put(repositoryId, capabilityLocalRepository);
return capabilityLocalRepository;
}
@Override
public Repository createRepository(long repositoryId)
throws PortalException {
if (_repositories.containsKey(repositoryId)) {
return _repositories.get(repositoryId);
}
InitializedRepository initializedRepository =
new InitializedRepository();
DefaultCapabilityRegistry defaultCapabilityRegistry =
new DefaultCapabilityRegistry(initializedRepository);
_repositoryDefiner.registerCapabilities(defaultCapabilityRegistry);
DefaultRepositoryEventRegistry defaultRepositoryEventRegistry =
new DefaultRepositoryEventRegistry(_rootRepositoryEventTrigger);
setUpCommonCapabilities(
initializedRepository, defaultCapabilityRegistry,
defaultRepositoryEventRegistry);
Repository repository = _repositoryFactory.createRepository(
repositoryId);
defaultCapabilityRegistry.registerCapabilityRepositoryEvents(
defaultRepositoryEventRegistry);
Repository wrappedRepository =
defaultCapabilityRegistry.invokeCapabilityWrappers(repository);
CapabilityRepository capabilityRepository = new CapabilityRepository(
wrappedRepository, defaultCapabilityRegistry,
defaultRepositoryEventRegistry);
initializedRepository.setDocumentRepository(capabilityRepository);
_repositories.put(repositoryId, capabilityRepository);
return capabilityRepository;
}
public String getClassName() {
return _repositoryDefiner.getClassName();
}
public RepositoryConfiguration getRepositoryConfiguration() {
return _repositoryDefiner.getRepositoryConfiguration();
}
public String getRepositoryTypeLabel(Locale locale) {
return _repositoryDefiner.getRepositoryTypeLabel(locale);
}
public void invalidateCache() {
_localRepositories.clear();
_repositories.clear();
}
@Override
public void setRepositoryFactory(RepositoryFactory repositoryFactory) {
if (_repositoryFactory != null) {
throw new IllegalStateException(
"Repository factory already exists");
}
_repositoryFactory = repositoryFactory;
}
protected RepositoryClassDefinition(
RepositoryDefiner repositoryDefiner,
RepositoryEventTrigger rootRepositoryEventTrigger) {
_repositoryDefiner = repositoryDefiner;
_rootRepositoryEventTrigger = rootRepositoryEventTrigger;
}
protected void invalidateCachedRepository(long repositoryId) {
_localRepositories.remove(repositoryId);
_repositories.remove(repositoryId);
}
protected void setUpCommonCapabilities(
DocumentRepository documentRepository,
DefaultCapabilityRegistry capabilityRegistry,
RepositoryEventTrigger repositoryEventTrigger) {
if (!capabilityRegistry.isCapabilityProvided(
ConfigurationCapability.class)) {
capabilityRegistry.addExportedCapability(
ConfigurationCapability.class,
new ConfigurationCapabilityImpl(
documentRepository,
RepositoryServiceAdapter.create(documentRepository)));
}
if (!capabilityRegistry.isCapabilityProvided(
RepositoryEventTriggerCapability.class)) {
capabilityRegistry.addExportedCapability(
RepositoryEventTriggerCapability.class,
new LiferayRepositoryEventTriggerCapability(
repositoryEventTrigger));
}
capabilityRegistry.addSupportedCapability(
CacheCapability.class, new CacheCapability());
}
private final Map<Long, LocalRepository> _localRepositories =
new ConcurrentHashMap<>();
private final Map<Long, Repository> _repositories =
new ConcurrentHashMap<>();
private final RepositoryDefiner _repositoryDefiner;
private RepositoryFactory _repositoryFactory;
private final RepositoryEventTrigger _rootRepositoryEventTrigger;
private class CacheCapability implements Capability, RepositoryEventAware {
@Override
public void registerRepositoryEventListeners(
RepositoryEventRegistry repositoryEventRegistry) {
repositoryEventRegistry.registerRepositoryEventListener(
RepositoryEventType.Delete.class, LocalRepository.class,
new RepositoryEventListener
<RepositoryEventType.Delete, LocalRepository>() {
@Override
public void execute(LocalRepository localRepository) {
invalidateCachedRepository(
localRepository.getRepositoryId());
}
});
}
}
}