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.LocalRepository;
019    import com.liferay.portal.kernel.repository.Repository;
020    import com.liferay.portal.kernel.repository.RepositoryFactory;
021    import com.liferay.portal.kernel.repository.event.RepositoryEventListener;
022    import com.liferay.portal.kernel.repository.event.RepositoryEventTrigger;
023    import com.liferay.portal.kernel.repository.event.RepositoryEventType;
024    import com.liferay.portal.kernel.repository.registry.RepositoryDefiner;
025    import com.liferay.portal.kernel.repository.registry.RepositoryEventRegistry;
026    import com.liferay.portal.kernel.repository.registry.RepositoryFactoryRegistry;
027    import com.liferay.portal.kernel.util.Tuple;
028    import com.liferay.portal.repository.capabilities.CapabilityLocalRepository;
029    import com.liferay.portal.repository.capabilities.CapabilityRepository;
030    
031    import java.util.ArrayList;
032    import java.util.Collection;
033    import java.util.HashMap;
034    import java.util.Map;
035    
036    /**
037     * @author Adolfo P??rez
038     */
039    public class RepositoryClassDefinition
040            implements RepositoryEventRegistry, RepositoryEventTrigger,
041                    RepositoryFactoryRegistry {
042    
043            public RepositoryClassDefinition(RepositoryDefiner repositoryDefiner) {
044                    _repositoryDefiner = repositoryDefiner;
045            }
046    
047            public CapabilityLocalRepository createCapabilityLocalRepository(
048                            long repositoryId)
049                    throws PortalException {
050    
051                    LocalRepository localRepository =
052                            _repositoryFactory.createLocalRepository(repositoryId);
053    
054                    CapabilityLocalRepository capabilityLocalRepository =
055                            new CapabilityLocalRepository(localRepository, this);
056    
057                    _repositoryDefiner.registerCapabilities(capabilityLocalRepository);
058    
059                    return capabilityLocalRepository;
060            }
061    
062            public CapabilityRepository createCapabilityRepository(long repositoryId)
063                    throws PortalException {
064    
065                    Repository repository = _repositoryFactory.createRepository(
066                            repositoryId);
067    
068                    CapabilityRepository capabilityRepository = new CapabilityRepository(
069                            repository, this);
070    
071                    _repositoryDefiner.registerCapabilities(capabilityRepository);
072    
073                    return capabilityRepository;
074            }
075    
076            public RepositoryEventTrigger getRepositoryEventTrigger() {
077                    return this;
078            }
079    
080            public RepositoryFactory getRepositoryFactory() {
081                    return _repositoryFactory;
082            }
083    
084            @Override
085            public <S extends RepositoryEventType, T>
086                    void registerRepositoryEventListener(
087                            Class<S> repositoryEventTypeClass, Class<T> modelClass,
088                            RepositoryEventListener<S, T> repositoryEventListener) {
089    
090                    Tuple key = new Tuple(repositoryEventTypeClass, modelClass);
091    
092                    Collection<RepositoryEventListener<?, ?>> repositoryEventListeners =
093                            _repositoryEventListeners.get(key);
094    
095                    if (repositoryEventListeners == null) {
096                            repositoryEventListeners =
097                                    new ArrayList<RepositoryEventListener<?, ?>>();
098    
099                            _repositoryEventListeners.put(key, repositoryEventListeners);
100                    }
101    
102                    repositoryEventListeners.add(repositoryEventListener);
103            }
104    
105            @Override
106            public void setRepositoryFactory(RepositoryFactory repositoryFactory) {
107                    if (_repositoryFactory != null) {
108                            throw new IllegalStateException(
109                                    "Repository factory already exists");
110                    }
111    
112                    _repositoryFactory = repositoryFactory;
113            }
114    
115            @Override
116            public <S extends RepositoryEventType, T> void trigger(
117                            Class<S> repositoryEventTypeClass, Class<T> modelClass, T payload)
118                    throws PortalException {
119    
120                    Tuple key = new Tuple(repositoryEventTypeClass, modelClass);
121    
122                    @SuppressWarnings("rawtypes")
123                    Collection<RepositoryEventListener<S, T>> repositoryEventListeners =
124                            (Collection)_repositoryEventListeners.get(key);
125    
126                    if (repositoryEventListeners != null) {
127                            for (RepositoryEventListener<S, T> repositoryEventListener :
128                                            repositoryEventListeners) {
129    
130                                    repositoryEventListener.execute(payload);
131                            }
132                    }
133            }
134    
135            private final RepositoryDefiner _repositoryDefiner;
136            private final Map<Tuple, Collection<RepositoryEventListener<?, ?>>>
137                    _repositoryEventListeners =
138                            new HashMap<Tuple, Collection<RepositoryEventListener<?, ?>>>();
139            private RepositoryFactory _repositoryFactory;
140    
141    }