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;
016    
017    import com.liferay.portal.kernel.bean.BeanReference;
018    import com.liferay.portal.kernel.bean.ClassLoaderBeanHandler;
019    import com.liferay.portal.kernel.exception.PortalException;
020    import com.liferay.portal.kernel.repository.LocalRepository;
021    import com.liferay.portal.kernel.repository.Repository;
022    import com.liferay.portal.kernel.repository.RepositoryFactory;
023    import com.liferay.portal.kernel.repository.UndeployedExternalRepositoryException;
024    import com.liferay.portal.kernel.repository.capabilities.ConfigurationCapability;
025    import com.liferay.portal.kernel.repository.capabilities.RepositoryEventTriggerCapability;
026    import com.liferay.portal.kernel.repository.cmis.CMISRepositoryHandler;
027    import com.liferay.portal.kernel.util.ProxyUtil;
028    import com.liferay.portal.model.ClassName;
029    import com.liferay.portal.repository.capabilities.BaseCapabilityRepository;
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.liferayrepository.LiferayRepository;
035    import com.liferay.portal.repository.proxy.BaseRepositoryProxyBean;
036    import com.liferay.portal.repository.registry.RepositoryClassDefinition;
037    import com.liferay.portal.repository.registry.RepositoryClassDefinitionCatalog;
038    import com.liferay.portal.service.ClassNameLocalService;
039    import com.liferay.portal.service.RepositoryLocalService;
040    import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalService;
041    import com.liferay.portlet.documentlibrary.service.DLFileEntryService;
042    import com.liferay.portlet.documentlibrary.service.DLFileVersionLocalService;
043    import com.liferay.portlet.documentlibrary.service.DLFileVersionService;
044    import com.liferay.portlet.documentlibrary.service.DLFolderLocalService;
045    import com.liferay.portlet.documentlibrary.service.DLFolderService;
046    
047    /**
048     * @author Adolfo P??rez
049     */
050    public class RepositoryFactoryImpl implements RepositoryFactory {
051    
052            @Override
053            public LocalRepository createLocalRepository(long repositoryId)
054                    throws PortalException {
055    
056                    long classNameId = getRepositoryClassNameId(repositoryId);
057    
058                    RepositoryClassDefinition repositoryClassDefinition =
059                            getRepositoryClassDefinition(classNameId);
060    
061                    CapabilityLocalRepository capabilityLocalRepository =
062                            repositoryClassDefinition.createCapabilityLocalRepository(
063                                    repositoryId);
064    
065                    setupCommonCapabilities(
066                            capabilityLocalRepository, repositoryClassDefinition);
067    
068                    return capabilityLocalRepository;
069            }
070    
071            @Override
072            public Repository createRepository(long repositoryId)
073                    throws PortalException {
074    
075                    long classNameId = getRepositoryClassNameId(repositoryId);
076    
077                    RepositoryClassDefinition repositoryClassDefinition =
078                            getRepositoryClassDefinition(classNameId);
079    
080                    CapabilityRepository capabilityRepository =
081                            repositoryClassDefinition.createCapabilityRepository(repositoryId);
082    
083                    setupCommonCapabilities(
084                            capabilityRepository, repositoryClassDefinition);
085    
086                    setupCapabilityRepositoryCapabilities(capabilityRepository);
087    
088                    return capabilityRepository;
089            }
090    
091            protected CMISRepositoryHandler getCMISRepositoryHandler(
092                    Repository repository) {
093    
094                    if (repository instanceof BaseRepositoryProxyBean) {
095                            BaseRepositoryProxyBean baseRepositoryProxyBean =
096                                    (BaseRepositoryProxyBean)repository;
097    
098                            ClassLoaderBeanHandler classLoaderBeanHandler =
099                                    (ClassLoaderBeanHandler)ProxyUtil.getInvocationHandler(
100                                            baseRepositoryProxyBean.getProxyBean());
101    
102                            Object bean = classLoaderBeanHandler.getBean();
103    
104                            if (bean instanceof CMISRepositoryHandler) {
105                                    return (CMISRepositoryHandler)bean;
106                            }
107                    }
108    
109                    return null;
110            }
111    
112            protected DLFileEntryLocalService getDlFileEntryLocalService() {
113                    return _dlFileEntryLocalService;
114            }
115    
116            protected DLFileEntryService getDlFileEntryService() {
117                    return _dlFileEntryService;
118            }
119    
120            protected DLFileVersionLocalService getDlFileVersionLocalService() {
121                    return _dlFileVersionLocalService;
122            }
123    
124            protected DLFileVersionService getDlFileVersionService() {
125                    return _dlFileVersionService;
126            }
127    
128            protected DLFolderLocalService getDlFolderLocalService() {
129                    return _dlFolderLocalService;
130            }
131    
132            protected DLFolderService getDlFolderService() {
133                    return _dlFolderService;
134            }
135    
136            protected com.liferay.portal.model.Repository getRepository(
137                    long repositoryId) {
138    
139                    RepositoryLocalService repositoryLocalService =
140                            getRepositoryLocalService();
141    
142                    return repositoryLocalService.fetchRepository(repositoryId);
143            }
144    
145            protected RepositoryClassDefinition getRepositoryClassDefinition(
146                            long classNameId)
147                    throws PortalException {
148    
149                    ClassName className = _classNameLocalService.getClassName(classNameId);
150    
151                    RepositoryClassDefinition repositoryDefinition =
152                            _repositoryClassDefinitionCatalog.getRepositoryClassDefinition(
153                                    className.getClassName());
154    
155                    if (repositoryDefinition == null) {
156                            throw new UndeployedExternalRepositoryException(className);
157                    }
158    
159                    return repositoryDefinition;
160            }
161    
162            protected long getRepositoryClassNameId(long repositoryId) {
163                    com.liferay.portal.model.Repository repository =
164                            _repositoryLocalService.fetchRepository(repositoryId);
165    
166                    if (repository != null) {
167                            return repository.getClassNameId();
168                    }
169    
170                    return _classNameLocalService.getClassNameId(
171                            LiferayRepository.class.getName());
172            }
173    
174            protected RepositoryLocalService getRepositoryLocalService() {
175                    return _repositoryLocalService;
176            }
177    
178            protected void setupCapabilityRepositoryCapabilities(
179                    CapabilityRepository capabilityRepository) {
180    
181                    Repository repository = capabilityRepository.getRepository();
182    
183                    CMISRepositoryHandler cmisRepositoryHandler = getCMISRepositoryHandler(
184                            repository);
185    
186                    if (cmisRepositoryHandler != null) {
187                            capabilityRepository.addExportedCapability(
188                                    CMISRepositoryHandler.class, cmisRepositoryHandler);
189                    }
190            }
191    
192            protected void setupCommonCapabilities(
193                    BaseCapabilityRepository<?> baseCapabilityRepository,
194                    RepositoryClassDefinition repositoryClassDefinition) {
195    
196                    if (!baseCapabilityRepository.isCapabilityProvided(
197                                    ConfigurationCapability.class)) {
198    
199                            baseCapabilityRepository.addExportedCapability(
200                                    ConfigurationCapability.class,
201                                    new ConfigurationCapabilityImpl(baseCapabilityRepository));
202                    }
203    
204                    if (!baseCapabilityRepository.isCapabilityProvided(
205                                    RepositoryEventTriggerCapability.class)) {
206    
207                            baseCapabilityRepository.addExportedCapability(
208                                    RepositoryEventTriggerCapability.class,
209                                    new LiferayRepositoryEventTriggerCapability(
210                                            repositoryClassDefinition.getRepositoryEventTrigger()));
211                    }
212            }
213    
214            @BeanReference(type = ClassNameLocalService.class)
215            private ClassNameLocalService _classNameLocalService;
216    
217            @BeanReference(type = DLFileEntryLocalService.class)
218            private DLFileEntryLocalService _dlFileEntryLocalService;
219    
220            @BeanReference(type = DLFileEntryService.class)
221            private DLFileEntryService _dlFileEntryService;
222    
223            @BeanReference(type = DLFileVersionLocalService.class)
224            private DLFileVersionLocalService _dlFileVersionLocalService;
225    
226            @BeanReference(type = DLFileVersionService.class)
227            private DLFileVersionService _dlFileVersionService;
228    
229            @BeanReference(type = DLFolderLocalService.class)
230            private DLFolderLocalService _dlFolderLocalService;
231    
232            @BeanReference(type = DLFolderService.class)
233            private DLFolderService _dlFolderService;
234    
235            @BeanReference(type = RepositoryClassDefinitionCatalog.class)
236            private RepositoryClassDefinitionCatalog _repositoryClassDefinitionCatalog;
237    
238            @BeanReference(type = RepositoryLocalService.class)
239            private RepositoryLocalService _repositoryLocalService;
240    
241    }