001    /*
002     * Copyright (C) 2006-2007 the original author or authors.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    package org.codehaus.gmaven.plugin.tools;
018    
019    import org.codehaus.gmaven.feature.Feature;
020    import org.codehaus.gmaven.feature.Provider;
021    import org.codehaus.gmaven.feature.ProviderManager;
022    import org.codehaus.gmaven.feature.ProviderRegistry;
023    import org.codehaus.gmaven.feature.ProviderSelector;
024    import org.codehaus.gmaven.plugin.ProviderMojoSupport;
025    
026    import java.net.URL;
027    import java.net.URLClassLoader;
028    import java.util.Collection;
029    import java.util.Iterator;
030    import java.util.Map;
031    
032    /**
033     * Displays information about the Groovy runtime providers which are configured and selected.
034     *
035     * @goal providers
036     * @requiresProject false
037     * @since 1.0-beta-3
038     *
039     * @author <a href="mailto:jason@planet57.com">Jason Dillon</a>
040     * @version $Id: ProvidersMojo.java 9 2009-07-16 09:22:08Z user57 $
041     */
042    public class ProvidersMojo
043        extends ProviderMojoSupport
044    {
045        protected void doExecute() throws Exception {
046            if (log.isTraceEnabled()) {
047                logEnvironment();
048            }
049    
050            ProviderManager manager = getProviderManager();
051            log.debug("Provider manager: {}", manager);
052    
053            ProviderRegistry registry = manager.getRegistry();
054            log.debug("Provider registry: {}", registry);
055    
056            ProviderSelector selector = manager.getSelector();
057            log.debug("Provider selector: {}", selector);
058    
059            // Before we can get the list of registered providers, we need to select one first,
060            // so pick the default and save any failure for later inspection
061    
062            Provider selected = null;
063            Throwable selectFailure = null;
064            try {
065                selected = provider();
066                log.debug("Selected: {}", selected);
067            }
068            catch (Throwable t) {
069                log.debug("Selection failure: " + t, t);
070                selectFailure = t;
071            }
072    
073            log.info("");
074    
075            log.info("Provider selection: {}", getProviderSelection());
076            log.info("");
077            
078            Map providers = registry.providers();
079            if (providers == null || providers.isEmpty()) {
080                log.info("No providers registered");
081            }
082            else {
083                log.info("Found {} registered providers:", String.valueOf(providers.size()));
084    
085                for (Iterator iter = providers.keySet().iterator(); iter.hasNext();) {
086                    String key = (String) iter.next();
087                    Provider provider = (Provider) providers.get(key);
088    
089                    logProvider(provider, "    ");
090    
091                    log.info("");
092                }
093    
094                if (selected != null) {
095                    log.info("Selected provider:");
096                    log.info("    {}", selected);
097                }
098                else if (selectFailure != null) {
099                    log.info("No provider was selected; Failures occured while selecting: {}", selectFailure.toString());
100                }
101                else {
102                    log.info("No provider was selected and no failure was detected; The gods must be crazy...");
103                }
104            }
105    
106            log.info("");
107        }
108    
109        protected void logEnvironment() {
110            log.trace("ClassLoader '{}' Class-Path:", getClass().getClassLoader());
111    
112            URL[] urls = ((URLClassLoader)getClass().getClassLoader()).getURLs();
113            
114            for (int i=0; i<urls.length; i++) {
115                log.trace("    {}", urls[i]);
116            }
117    
118            log.debug("Plugin Artifacts:");
119    
120            for (Iterator iter = pluginArtifactMap.keySet().iterator(); iter.hasNext();) {
121                log.trace("    {}", iter.next());
122            }
123        }
124    
125        private void logProvider(final Provider provider, final String pad) {
126            assert provider != null;
127            assert pad != null;
128    
129            log.info("{}{}", pad, provider);
130    
131            logFeatures(provider, pad + "    ");
132        }
133    
134        private void logFeatures(final Provider provider, final String pad) {
135            assert provider != null;
136            assert pad != null;
137    
138            Collection features = provider.features();
139    
140            if (features.isEmpty()) {
141                log.info("{}No features", pad);
142            }
143            else {
144                log.info("{}Features:", pad);
145    
146                for (Iterator iter = features.iterator(); iter.hasNext();) {
147                    Feature feature = (Feature) iter.next();
148                    log.info("{}    {}", pad, feature.key());
149                }
150            }
151        }
152    }