001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portal.plugin;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.log.Log;
019    import com.liferay.portal.kernel.log.LogFactoryUtil;
020    import com.liferay.portal.kernel.plugin.PluginPackage;
021    import com.liferay.portal.kernel.plugin.PluginPackageNameAndContextComparator;
022    import com.liferay.portal.kernel.plugin.Version;
023    import com.liferay.portal.kernel.search.Indexer;
024    import com.liferay.portal.kernel.search.IndexerRegistryUtil;
025    import com.liferay.portal.kernel.util.ListUtil;
026    import com.liferay.portal.kernel.util.StringPool;
027    
028    import java.util.ArrayList;
029    import java.util.HashMap;
030    import java.util.List;
031    import java.util.Map;
032    
033    /**
034     * @author Jorge Ferrer
035     */
036    public class LocalPluginPackageRepository {
037    
038            public LocalPluginPackageRepository() {
039            }
040    
041            public void addPluginPackage(PluginPackage pluginPackage) {
042                    if (pluginPackage.getContext() == null) {
043                            if (_log.isDebugEnabled()) {
044                                    _log.debug(
045                                            "Plugin package cannot be registered because it does not " +
046                                                    "have an installation context");
047                            }
048    
049                            return;
050                    }
051    
052                    _pendingPackages.remove(pluginPackage.getContext());
053                    _pendingPackages.remove(pluginPackage.getModuleId());
054    
055                    _pluginPackages.remove(pluginPackage.getContext());
056                    _pluginPackages.put(pluginPackage.getContext(), pluginPackage);
057            }
058    
059            public PluginPackage getInstallingPluginPackage(String context) {
060                    return _pendingPackages.get(context);
061            }
062    
063            public PluginPackage getLatestPluginPackage(
064                    String groupId, String artifactId) {
065    
066                    PluginPackage latestPluginPackage = null;
067    
068                    for (PluginPackage pluginPackage : _pluginPackages.values()) {
069                            if ((pluginPackage.getGroupId().equals(groupId)) &&
070                                    (pluginPackage.getArtifactId().equals(artifactId)) &&
071                                    ((latestPluginPackage == null) ||
072                                            pluginPackage.isLaterVersionThan(latestPluginPackage))) {
073    
074                                    latestPluginPackage = pluginPackage;
075                            }
076                    }
077    
078                    return latestPluginPackage;
079            }
080    
081            public PluginPackage getPluginPackage(String context) {
082                    return _pluginPackages.get(context);
083            }
084    
085            public List<PluginPackage> getPluginPackages() {
086                    return new ArrayList<PluginPackage>(_pluginPackages.values());
087            }
088    
089            public List<PluginPackage> getPluginPackages(
090                    String groupId, String artifactId) {
091    
092                    List<PluginPackage> pluginPackages = new ArrayList<PluginPackage>();
093    
094                    for (PluginPackage pluginPackage : _pluginPackages.values()) {
095                            if (pluginPackage.getGroupId().equals(groupId) &&
096                                    pluginPackage.getArtifactId().equals(artifactId)) {
097    
098                                    pluginPackages.add(pluginPackage);
099                            }
100                    }
101    
102                    return pluginPackages;
103            }
104    
105            public List<PluginPackage> getSortedPluginPackages() {
106                    List<PluginPackage> pluginPackages = new ArrayList<PluginPackage>();
107    
108                    pluginPackages.addAll(_pluginPackages.values());
109    
110                    return ListUtil.sort(
111                            pluginPackages, new PluginPackageNameAndContextComparator());
112            }
113    
114            public void removePluginPackage(PluginPackage pluginPackage)
115                    throws PortalException {
116    
117                    _pluginPackages.remove(pluginPackage.getContext());
118    
119                    Indexer indexer = IndexerRegistryUtil.getIndexer(PluginPackage.class);
120    
121                    indexer.delete(pluginPackage);
122            }
123    
124            public void removePluginPackage(String context) {
125                    _pluginPackages.remove(context);
126            }
127    
128            public void registerPluginPackageInstallation(PluginPackage pluginPackage) {
129                    if (pluginPackage.getContext() != null) {
130                            PluginPackage previousPluginPackage = _pluginPackages.get(
131                                    pluginPackage.getContext());
132    
133                            if (previousPluginPackage == null) {
134                                    addPluginPackage(pluginPackage);
135                            }
136                    }
137    
138                    String key = pluginPackage.getContext();
139    
140                    if (key == null) {
141                            key = pluginPackage.getModuleId();
142                    }
143    
144                    _pendingPackages.put(key, pluginPackage);
145            }
146    
147            public void registerPluginPackageInstallation(String deploymentContext) {
148                    PluginPackage pluginPackage = getPluginPackage(deploymentContext);
149    
150                    if (pluginPackage == null) {
151                            String moduleId =
152                                    deploymentContext + StringPool.SLASH + deploymentContext +
153                                            StringPool.SLASH + Version.UNKNOWN + StringPool.SLASH +
154                                                    "war";
155    
156                            pluginPackage = new PluginPackageImpl(moduleId);
157    
158                            pluginPackage.setName(deploymentContext);
159                            pluginPackage.setContext(deploymentContext);
160                    }
161    
162                    registerPluginPackageInstallation(pluginPackage);
163            }
164    
165            public void unregisterPluginPackageInstallation(String context) {
166                    _pluginPackages.remove(context);
167                    _pendingPackages.remove(context);
168            }
169    
170            private static Log _log = LogFactoryUtil.getLog(
171                    LocalPluginPackageRepository.class);
172    
173            private Map<String, PluginPackage> _pluginPackages =
174                    new HashMap<String, PluginPackage>();
175            private Map<String, PluginPackage> _pendingPackages =
176                    new HashMap<String, PluginPackage>();
177    
178    }