001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.repository.registry;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.repository.DocumentRepository;
019    import com.liferay.portal.kernel.repository.LocalRepository;
020    import com.liferay.portal.kernel.repository.Repository;
021    import com.liferay.portal.kernel.repository.RepositoryConfiguration;
022    import com.liferay.portal.kernel.repository.RepositoryFactory;
023    import com.liferay.portal.kernel.repository.capabilities.ConfigurationCapability;
024    import com.liferay.portal.kernel.repository.capabilities.RepositoryEventTriggerCapability;
025    import com.liferay.portal.kernel.repository.event.RepositoryEventTrigger;
026    import com.liferay.portal.kernel.repository.registry.RepositoryDefiner;
027    import com.liferay.portal.kernel.repository.registry.RepositoryFactoryRegistry;
028    import com.liferay.portal.repository.InitializedLocalRepository;
029    import com.liferay.portal.repository.InitializedRepository;
030    import com.liferay.portal.repository.capabilities.CapabilityLocalRepository;
031    import com.liferay.portal.repository.capabilities.CapabilityRepository;
032    import com.liferay.portal.repository.capabilities.ConfigurationCapabilityImpl;
033    import com.liferay.portal.repository.capabilities.LiferayRepositoryEventTriggerCapability;
034    import com.liferay.portal.repository.capabilities.util.RepositoryServiceAdapter;
035    
036    import java.util.Locale;
037    
038    /**
039     * @author Adolfo P??rez
040     */
041    public class RepositoryClassDefinition
042            implements RepositoryConfiguration, RepositoryFactory,
043                               RepositoryFactoryRegistry {
044    
045            public static final RepositoryClassDefinition fromRepositoryDefiner(
046                    RepositoryDefiner repositoryDefiner) {
047    
048                    DefaultRepositoryEventRegistry defaultRepositoryEventRegistry =
049                            new DefaultRepositoryEventRegistry(null);
050    
051                    RepositoryClassDefinition repositoryClassDefinition =
052                            new RepositoryClassDefinition(
053                                    repositoryDefiner, defaultRepositoryEventRegistry);
054    
055                    repositoryDefiner.registerRepositoryFactory(repositoryClassDefinition);
056                    repositoryDefiner.registerRepositoryEventListeners(
057                            defaultRepositoryEventRegistry);
058    
059                    return repositoryClassDefinition;
060            }
061    
062            @Override
063            public LocalRepository createLocalRepository(long repositoryId)
064                    throws PortalException {
065    
066                    InitializedLocalRepository initializedLocalRepository =
067                            new InitializedLocalRepository();
068    
069                    DefaultCapabilityRegistry defaultCapabilityRegistry =
070                            new DefaultCapabilityRegistry(initializedLocalRepository);
071    
072                    _repositoryDefiner.registerCapabilities(defaultCapabilityRegistry);
073    
074                    DefaultRepositoryEventRegistry defaultRepositoryEventRegistry =
075                            new DefaultRepositoryEventRegistry(_rootRepositoryEventTrigger);
076    
077                    setUpCommonCapabilities(
078                            initializedLocalRepository, defaultCapabilityRegistry,
079                            defaultRepositoryEventRegistry);
080    
081                    defaultCapabilityRegistry.registerCapabilityRepositoryEvents(
082                            defaultRepositoryEventRegistry);
083    
084                    LocalRepository localRepository =
085                            _repositoryFactory.createLocalRepository(repositoryId);
086    
087                    LocalRepository wrappedLocalRepository =
088                            defaultCapabilityRegistry.invokeCapabilityWrappers(localRepository);
089    
090                    CapabilityLocalRepository capabilityLocalRepository =
091                            new CapabilityLocalRepository(
092                                    wrappedLocalRepository, defaultCapabilityRegistry,
093                                    defaultRepositoryEventRegistry);
094    
095                    initializedLocalRepository.setDocumentRepository(
096                            capabilityLocalRepository);
097    
098                    return capabilityLocalRepository;
099            }
100    
101            @Override
102            public Repository createRepository(long repositoryId)
103                    throws PortalException {
104    
105                    InitializedRepository initializedRepository =
106                            new InitializedRepository();
107    
108                    DefaultCapabilityRegistry defaultCapabilityRegistry =
109                            new DefaultCapabilityRegistry(initializedRepository);
110    
111                    _repositoryDefiner.registerCapabilities(defaultCapabilityRegistry);
112    
113                    DefaultRepositoryEventRegistry defaultRepositoryEventRegistry =
114                            new DefaultRepositoryEventRegistry(_rootRepositoryEventTrigger);
115    
116                    setUpCommonCapabilities(
117                            initializedRepository, defaultCapabilityRegistry,
118                            defaultRepositoryEventRegistry);
119    
120                    Repository repository = _repositoryFactory.createRepository(
121                            repositoryId);
122    
123                    defaultCapabilityRegistry.registerCapabilityRepositoryEvents(
124                            defaultRepositoryEventRegistry);
125    
126                    Repository wrappedRepository =
127                            defaultCapabilityRegistry.invokeCapabilityWrappers(repository);
128    
129                    CapabilityRepository capabilityRepository = new CapabilityRepository(
130                            wrappedRepository, defaultCapabilityRegistry,
131                            defaultRepositoryEventRegistry);
132    
133                    initializedRepository.setDocumentRepository(capabilityRepository);
134    
135                    return capabilityRepository;
136            }
137    
138            public String getClassName() {
139                    return _repositoryDefiner.getClassName();
140            }
141    
142            public String getRepositoryTypeLabel(Locale locale) {
143                    return _repositoryDefiner.getRepositoryTypeLabel(locale);
144            }
145    
146            @Override
147            public String[] getSupportedConfigurations() {
148                    return _repositoryDefiner.getSupportedConfigurations();
149            }
150    
151            @Override
152            public String[][] getSupportedParameters() {
153                    return _repositoryDefiner.getSupportedParameters();
154            }
155    
156            @Override
157            public void setRepositoryFactory(RepositoryFactory repositoryFactory) {
158                    if (_repositoryFactory != null) {
159                            throw new IllegalStateException(
160                                    "Repository factory already exists");
161                    }
162    
163                    _repositoryFactory = repositoryFactory;
164            }
165    
166            protected RepositoryClassDefinition(
167                    RepositoryDefiner repositoryDefiner,
168                    RepositoryEventTrigger rootRepositoryEventTrigger) {
169    
170                    _repositoryDefiner = repositoryDefiner;
171                    _rootRepositoryEventTrigger = rootRepositoryEventTrigger;
172            }
173    
174            protected void setUpCommonCapabilities(
175                    DocumentRepository documentRepository,
176                    DefaultCapabilityRegistry capabilityRegistry,
177                    RepositoryEventTrigger repositoryEventTrigger) {
178    
179                    if (!capabilityRegistry.isCapabilityProvided(
180                                    ConfigurationCapability.class)) {
181    
182                            capabilityRegistry.addExportedCapability(
183                                    ConfigurationCapability.class,
184                                    new ConfigurationCapabilityImpl(
185                                            documentRepository,
186                                            RepositoryServiceAdapter.create(documentRepository)));
187                    }
188    
189                    if (!capabilityRegistry.isCapabilityProvided(
190                                    RepositoryEventTriggerCapability.class)) {
191    
192                            capabilityRegistry.addExportedCapability(
193                                    RepositoryEventTriggerCapability.class,
194                                    new LiferayRepositoryEventTriggerCapability(
195                                            repositoryEventTrigger));
196                    }
197            }
198    
199            private final RepositoryDefiner _repositoryDefiner;
200            private RepositoryFactory _repositoryFactory;
201            private final RepositoryEventTrigger _rootRepositoryEventTrigger;
202    
203    }