001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *  http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing,
013     * software distributed under the License is distributed on an
014     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015     * KIND, either express or implied.  See the License for the
016     * specific language governing permissions and limitations
017     * under the License.
018     */
019    
020    package org.apache.geronimo.mavenplugins.car;
021    
022    import java.io.File;
023    import java.io.FileWriter;
024    import java.io.IOException;
025    import java.io.InputStream;
026    import java.io.Writer;
027    import java.util.HashMap;
028    import java.util.Map;
029    import java.util.SortedSet;
030    import java.util.jar.JarFile;
031    import java.util.zip.ZipEntry;
032    import java.util.zip.ZipException;
033    
034    import javax.xml.bind.JAXBException;
035    import javax.xml.stream.XMLStreamException;
036    
037    import org.apache.geronimo.kernel.config.NoSuchStoreException;
038    import org.apache.geronimo.kernel.repository.Artifact;
039    import org.apache.geronimo.kernel.repository.ListableRepository;
040    import org.apache.geronimo.kernel.repository.Maven2Repository;
041    import org.apache.geronimo.system.plugin.PluginInstallerGBean;
042    import org.apache.geronimo.system.plugin.PluginXmlUtil;
043    import org.apache.geronimo.system.plugin.model.PluginListType;
044    import org.apache.geronimo.system.plugin.model.PluginType;
045    import org.xml.sax.SAXException;
046    
047    /**
048     * Creates or replaces a geronimo-plugins.xml catalog of geronimo plugins in the local maven repository.  Although geronimo-plugins.xml is
049     * maintained automatically when you build geronimo plugins locally, this is useful if you have downloaded plugins from elsewhere or
050     * corrupted the geronimo-plugins.xml file.  This must be run explcitly using the command line
051     * mvn org.apache.geronimo.buildsupport:car-maven-plugin:create-pluginlist
052     *
053     * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
054     * @goal create-pluginlist
055     */
056    public class CreatePluginListMojo extends AbstractCarMojo {
057    
058        protected void doExecute() throws Exception {
059            String path = getArtifactRepository().getBasedir();
060            File baseDir = new File(path);
061    
062            ListableRepository repository = new Maven2Repository(baseDir);
063            PluginListType pluginList = createPluginListForRepositories(repository,  path);
064            File outFile = new File(baseDir, "geronimo-plugins.xml");
065            Writer out = new FileWriter(outFile, false);
066            try {
067                PluginXmlUtil.writePluginList(pluginList, out);
068            } finally {
069                out.close();
070            }
071        }
072    
073        public PluginListType createPluginListForRepositories(ListableRepository repository, String repoName) throws NoSuchStoreException {
074            Map<PluginType, PluginType> pluginMap = new HashMap<PluginType, PluginType>();
075            SortedSet<Artifact> configs = repository.list();
076            for (Artifact configId : configs) {
077                PluginType data = getPluginMetadata(repository, configId);
078    
079                if (data != null) {
080                    PluginType key = PluginInstallerGBean.toKey(data);
081                    PluginType existing = pluginMap.get(key);
082                    if (existing == null) {
083                        pluginMap.put(key, data);
084                    } else {
085                        existing.getPluginArtifact().addAll(data.getPluginArtifact());
086                    }
087                }
088            }
089            PluginListType pluginList = new PluginListType();
090            pluginList.getPlugin().addAll(pluginMap.values());
091            pluginList.getDefaultRepository().add(repoName);
092            return pluginList;
093        }
094    
095        private PluginType getPluginMetadata(ListableRepository repository, Artifact configId) {
096            File dir = repository.getLocation(configId);
097            if (!dir.isFile() || !dir.canRead()) {
098                log.error("Cannot read artifact dir " + dir.getAbsolutePath());
099                throw new IllegalStateException("Cannot read artifact dir " + dir.getAbsolutePath());
100            }
101            if (dir.toString().endsWith(".pom")) {
102                return null;
103            }
104            try {
105                JarFile jar = new JarFile(dir);
106                try {
107                    ZipEntry entry = jar.getEntry("META-INF/geronimo-plugin.xml");
108                    if (entry == null) {
109                        return null;
110                    }
111                    InputStream in = jar.getInputStream(entry);
112                    try {
113                        PluginType pluginType = PluginXmlUtil.loadPluginMetadata(in);
114                        if (pluginType.getPluginArtifact().isEmpty()) {
115                            return null;
116                        }
117                        return pluginType;
118                    } finally {
119                        in.close();
120                    }
121                } finally {
122                    jar.close();
123                }
124            } catch (ZipException e) {
125                //not a zip file, ignore
126            } catch (SAXException e) {
127                log.error("Unable to read JAR file " + dir.getAbsolutePath(), e);
128            } catch (XMLStreamException e) {
129                log.error("Unable to read JAR file " + dir.getAbsolutePath(), e);
130            } catch (JAXBException e) {
131                log.error("Unable to read JAR file " + dir.getAbsolutePath(), e);
132            } catch (IOException e) {
133                log.error("Unable to read JAR file " + dir.getAbsolutePath(), e);
134            }
135            return null;
136        }
137    
138    
139    }