Return-Path: Delivered-To: apmail-geronimo-scm-archive@www.apache.org Received: (qmail 40491 invoked from network); 5 Oct 2007 00:09:52 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 5 Oct 2007 00:09:52 -0000 Received: (qmail 62571 invoked by uid 500); 5 Oct 2007 00:09:41 -0000 Delivered-To: apmail-geronimo-scm-archive@geronimo.apache.org Received: (qmail 62531 invoked by uid 500); 5 Oct 2007 00:09:41 -0000 Mailing-List: contact scm-help@geronimo.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: dev@geronimo.apache.org List-Id: Delivered-To: mailing list scm@geronimo.apache.org Received: (qmail 62520 invoked by uid 99); 5 Oct 2007 00:09:41 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 04 Oct 2007 17:09:41 -0700 X-ASF-Spam-Status: No, hits=-100.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 05 Oct 2007 00:09:42 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 149811A9838; Thu, 4 Oct 2007 17:08:52 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r582036 - in /geronimo/sandbox/gshell/trunk/gshell-maven-plugin: ./ src/main/java/org/apache/geronimo/gshell/maven/gshell/ Date: Fri, 05 Oct 2007 00:08:51 -0000 To: scm@geronimo.apache.org From: jdillon@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20071005000852.149811A9838@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: jdillon Date: Thu Oct 4 17:08:50 2007 New Revision: 582036 URL: http://svn.apache.org/viewvc?rev=582036&view=rev Log: Re-implement the descriptor mojo Added: geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandDescriptorExtractor.java (with props) geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandDescriptorGleaner.java (with props) geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/DescriptorMojo.java (contents, props changed) - copied, changed from r580765, geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandSetDescriptorMojo.java Removed: geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandSetDescriptorMojo.java Modified: geronimo/sandbox/gshell/trunk/gshell-maven-plugin/pom.xml Modified: geronimo/sandbox/gshell/trunk/gshell-maven-plugin/pom.xml URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-maven-plugin/pom.xml?rev=582036&r1=582035&r2=582036&view=diff ============================================================================== --- geronimo/sandbox/gshell/trunk/gshell-maven-plugin/pom.xml (original) +++ geronimo/sandbox/gshell/trunk/gshell-maven-plugin/pom.xml Thu Oct 4 17:08:50 2007 @@ -72,23 +72,13 @@ - org.apache.xbean - xbean-finder - 3.1 + org.slf4j + slf4j-api - + - asm - asm - 2.2.3 - runtime - - - - asm - asm-commons - 2.2.3 - runtime + org.slf4j + slf4j-simple Added: geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandDescriptorExtractor.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandDescriptorExtractor.java?rev=582036&view=auto ============================================================================== --- geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandDescriptorExtractor.java (added) +++ geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandDescriptorExtractor.java Thu Oct 4 17:08:50 2007 @@ -0,0 +1,157 @@ +/* + * Copyright (C) 2007 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.geronimo.gshell.maven.gshell; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.apache.geronimo.gshell.descriptor.CommandDescriptor; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.project.MavenProject; +import org.codehaus.plexus.util.DirectoryScanner; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Extracts {@link CommandDescriptor} instances from class files. + * + * @version $Id$ + */ +public class CommandDescriptorExtractor +{ + public static enum Scope + { + COMPILE, + TEST; + } + + private final Logger log = LoggerFactory.getLogger(getClass()); + + private CommandDescriptorGleaner gleaner = new CommandDescriptorGleaner(); + + public List extract(final MavenProject project, final Scope scope) throws Exception { + assert project != null; + assert scope != null; + + log.debug("Gleaner: {}, scope: {}", gleaner, scope); + + List classpath; + File classesDir; + + if (scope == Scope.COMPILE) { + classpath = project.getCompileClasspathElements(); + classesDir = new File(project.getBuild().getOutputDirectory()); + } + else if (scope == Scope.TEST) { + classpath = project.getTestClasspathElements(); + classesDir = new File(project.getBuild().getTestOutputDirectory()); + } + else { + throw new InternalError(); + } + + if (!classesDir.exists()) { + log.warn("Skipping descriptor generation; missing classes directory: {}", classesDir); + + return Collections.emptyList(); + } + + final ClassLoader prev = Thread.currentThread().getContextClassLoader(); + final ClassLoader cl = createClassLoader(classpath); + + Thread.currentThread().setContextClassLoader(cl); + + try { + return extract(classesDir, cl); + } + finally { + Thread.currentThread().setContextClassLoader(prev); + } + } + + private ClassLoader createClassLoader(final List elements) throws Exception { + List list = new ArrayList(); + + // Add the projects dependencies + for (Object element : elements) { + String filename = (String) element; + + try { + list.add(new File(filename).toURI().toURL()); + } + catch (MalformedURLException e) { + throw new MojoExecutionException("Invalid classpath entry: " + filename, e); + } + } + + URL[] urls = list.toArray(new URL[list.size()]); + + log.debug("Classpath:"); + + for (URL url : urls) { + log.debug(" " + url); + } + + return new URLClassLoader(urls, getClass().getClassLoader()); + } + + private List extract(final File classesDir, final ClassLoader cl) throws Exception { + assert classesDir != null; + assert cl != null; + + List descriptors = new ArrayList(); + + DirectoryScanner scanner = new DirectoryScanner(); + scanner.setBasedir(classesDir); + scanner.addDefaultExcludes(); + scanner.setIncludes(new String[]{ "**/*.class" }); + + log.debug("Scanning for classes in: {}", classesDir); + + scanner.scan(); + + for (String include : scanner.getIncludedFiles()) { + String className = include.substring(0, include.lastIndexOf(".class")).replace('\\', '.').replace('/', '.'); + + log.debug("Loading class: {}", className); + + try { + Class type = cl.loadClass(className); + + log.debug("Gleaning from: {}", type); + + CommandDescriptor command = gleaner.glean(type); + + if (command != null) { + descriptors.add(command); + } + } + catch (VerifyError e) { + log.error("Failed to load class: " + className + "; cause: " + e); + } + } + + log.debug("Extracted {} descriptor(s)", descriptors.size()); + + return descriptors; + } +} \ No newline at end of file Propchange: geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandDescriptorExtractor.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandDescriptorExtractor.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandDescriptorExtractor.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandDescriptorGleaner.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandDescriptorGleaner.java?rev=582036&view=auto ============================================================================== --- geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandDescriptorGleaner.java (added) +++ geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandDescriptorGleaner.java Thu Oct 4 17:08:50 2007 @@ -0,0 +1,220 @@ +/* + * Copyright (C) 2007 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.geronimo.gshell.maven.gshell; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import org.apache.geronimo.gshell.command.annotation.CommandComponent; +import org.apache.geronimo.gshell.command.annotation.Configuration; +import org.apache.geronimo.gshell.command.annotation.Requirement; +import org.apache.geronimo.gshell.descriptor.CommandConfiguration; +import org.apache.geronimo.gshell.descriptor.CommandDescriptor; +import org.apache.geronimo.gshell.descriptor.CommandRequirement; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * ???? + * + * @version $Id$ + */ +public class CommandDescriptorGleaner +{ + private static final String EMPTY_STRING = ""; + + protected final Logger log = LoggerFactory.getLogger(getClass()); + + protected String filterEmptyAsNull(final String value) { + if (value == null) { + return null; + } + else if (EMPTY_STRING.equals(value.trim())) { + return null; + } + else { + return value; + } + } + + protected boolean isRequirementListType(final Class type) { + assert type != null; + + return Collection.class.isAssignableFrom(type) || Map.class.isAssignableFrom(type); + } + + protected String deHump(final String string) { + assert string != null; + + StringBuffer buff = new StringBuffer(); + + for (int i = 0; i < string.length(); i++) { + if (i != 0 && Character.isUpperCase(string.charAt(i))) { + buff.append('-'); + } + + buff.append(string.charAt(i)); + } + + return buff.toString().trim().toLowerCase(); + } + + public CommandDescriptor glean(final Class clazz) throws Exception { + assert clazz != null; + + // Cast to so that we don't have to cast below + Class type = (Class)clazz; + + // Skip abstract classes + if (Modifier.isAbstract(type.getModifiers())) { + return null; + } + + CommandComponent anno = type.getAnnotation(CommandComponent.class); + + if (anno == null) { + return null; + } + + log.debug("Creating descriptor for: {}", type); + + CommandDescriptor command = new CommandDescriptor(); + + // + // TODO: Set the source... + // + + command.setId(anno.id()); + + command.setDescription(filterEmptyAsNull(anno.description())); + + command.setImplementation(type.getName()); + + command.setVersion(filterEmptyAsNull(anno.version())); + + for (Class t : getClasses(type)) { + for (Field field : t.getDeclaredFields()) { + CommandRequirement requirement = findRequirement(field); + + if (requirement != null) { + command.addRequirement(requirement); + } + + CommandConfiguration config = findConfiguration(field); + + if (config != null) { + command.getConfiguration().addChild(config); + } + } + + // + // TODO: Inspect methods? + // + } + + return command; + } + + /** + * Returns a list of all of the classes which the given type inherits from. + */ + private List getClasses(Class type) { + assert type != null; + + List classes = new ArrayList(); + + while (type != null) { + classes.add(type); + type = type.getSuperclass(); + + // + // TODO: See if we need to include interfaces here too? + // + } + + return classes; + } + + private CommandRequirement findRequirement(final Field field) { + assert field != null; + + Requirement anno = field.getAnnotation(Requirement.class); + + if (anno == null) { + return null; + } + + Class type = field.getType(); + + CommandRequirement requirement = new CommandRequirement(); + + if (isRequirementListType(type)) { + requirement.setCollection(true); + } + + requirement.setId(filterEmptyAsNull(anno.id())); + + if (anno.type().isAssignableFrom(Void.class)) { + requirement.setType(type.getName()); + } + else { + requirement.setType(anno.type().getName()); + } + + String name = filterEmptyAsNull(anno.name()); + + if (name == null) { + name = field.getName(); + } + + requirement.setName(name); + + return requirement; + } + + private CommandConfiguration findConfiguration(final Field field) { + assert field != null; + + Configuration anno = field.getAnnotation(Configuration.class); + + if (anno == null) { + return null; + } + + String name = filterEmptyAsNull(anno.name()); + + if (name == null) { + name = field.getName(); + } + + name = deHump(name); + + CommandConfiguration config = new CommandConfiguration(name); + + String value = filterEmptyAsNull(anno.value()); + + if (value != null) { + config.setValue(value); + } + + return config; + } +} \ No newline at end of file Propchange: geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandDescriptorGleaner.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandDescriptorGleaner.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandDescriptorGleaner.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Copied: geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/DescriptorMojo.java (from r580765, geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandSetDescriptorMojo.java) URL: http://svn.apache.org/viewvc/geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/DescriptorMojo.java?p2=geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/DescriptorMojo.java&p1=geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandSetDescriptorMojo.java&r1=580765&r2=582036&rev=582036&view=diff ============================================================================== --- geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/CommandSetDescriptorMojo.java (original) +++ geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/DescriptorMojo.java Thu Oct 4 17:08:50 2007 @@ -22,58 +22,37 @@ import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; import java.util.ArrayList; import java.util.List; -import org.apache.geronimo.gshell.command.annotation.CommandComponent; -import org.apache.geronimo.gshell.command.descriptor.CommandDescriptor; -import org.apache.geronimo.gshell.command.descriptor.CommandSetDescriptor; -import org.apache.geronimo.gshell.command.descriptor.CommandSetDescriptorWriter; +import org.apache.geronimo.gshell.descriptor.CommandDescriptor; +import org.apache.geronimo.gshell.descriptor.CommandSetDescriptor; +import org.apache.maven.artifact.handler.ArtifactHandler; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.project.MavenProject; -import org.apache.xbean.finder.ClassFinder; -import org.codehaus.plexus.component.annotations.Configuration; -import org.codehaus.plexus.component.annotations.Requirement; -import org.codehaus.plexus.component.repository.ComponentRequirement; -import org.codehaus.plexus.configuration.PlexusConfiguration; -import org.codehaus.plexus.util.DirectoryScanner; +import org.codehaus.plexus.util.FileUtils; import org.codehaus.plexus.util.IOUtil; +import org.apache.geronimo.gshell.maven.gshell.CommandDescriptorExtractor.Scope; + /** - * Generates a GShell XML commands descriptor. + * Generates a GShell commands.xml descriptor. * - * @version $Rev$ $Date$ - * @goal commands-descriptor + * @goal descriptor * @phase process-classes * @requiresDependencyResolution runtime + * + * @version $Rev$ $Date$ */ -public class CommandSetDescriptorMojo - extends AbstractMojo { - /** - * The directory where class files have been built. - * - * @parameter expression="${project.build.outputDirectory} - */ - private File classesDirectory; - - /** - * The full list of compile time dependencies. - * - * @parameter expression="${project.compileClasspathElements} - * @readonly - */ - private List classpathElements; - +public class DescriptorMojo + extends AbstractMojo +{ /** - * The location where the generated descriptor will be placed. + * The directory where the descriptor is written. * * @parameter expression="${project.build.outputDirectory}" + * @required */ private File outputDirectory; @@ -92,175 +71,73 @@ */ private MavenProject project; - // - // Mojo - // - - protected URL[] getClasspath() { - List list = new ArrayList(); - - // Add the projects dependencies - for (String filename : classpathElements) { - try { - list.add(new File(filename).toURI().toURL()); - } - catch (MalformedURLException e) { - throw new RuntimeException(e); - } - } - - getLog().debug("Classpath:"); - for (Object obj : list) { - getLog().debug(" " + obj); - } - - return list.toArray(new URL[list.size()]); - } - - private List loadClasses(final ClassLoader cl) throws MojoExecutionException { - DirectoryScanner scanner = new DirectoryScanner(); - scanner.setBasedir(classesDirectory); - scanner.setIncludes(new String[]{"**/*.class"}); - scanner.scan(); - - List classes = new ArrayList(); - - for (String file : scanner.getIncludedFiles()) { - String className = file.substring(0, file.lastIndexOf(".class")).replace('\\', '.').replace('/', '.'); - Class c; - - try { - c = cl.loadClass(className); - } - catch (ClassNotFoundException e) { - throw new MojoExecutionException("Failed to load class: " + className, e); - } + public void execute() throws MojoExecutionException { + // Only execute if the current project looks like its got Java bits in it + ArtifactHandler artifactHandler = project.getArtifact().getArtifactHandler(); - classes.add(c); + if (!"java".equals(artifactHandler.getLanguage())) { + getLog().debug("Not executing on non-Java project"); } + else { + File outputFile = new File(outputDirectory, fileName); - return classes; - } - - private List getClasses(Class type) { - assert type != null; - - List classes = new ArrayList(); - - while (type != null) { - classes.add(type); - type = type.getSuperclass(); + generateDescriptor(Scope.COMPILE, outputFile); } - - return classes; } - private CommandDescriptor createCommandDescriptor(final Class type) { - getLog().info("Found command: " + type); + protected void generateDescriptor(final Scope scope, final File outputFile) throws MojoExecutionException { + assert scope != null; + assert outputFile != null; - CommandDescriptor desc = new CommandDescriptor(); + List descriptors = new ArrayList(); - CommandComponent anno = type.getAnnotation(CommandComponent.class); + CommandDescriptorExtractor extractor = new CommandDescriptorExtractor(); - desc.setId(anno.id()); - desc.setDescription(anno.description()); - desc.setImplementation(type.getName()); + try { + List list = extractor.extract(project, scope); - // Have to look at each class in the tree to look at its declared fields - List classes = getClasses(type); - - for (Class t : classes) { - for (Field f : t.getDeclaredFields()) { - Requirement requirementAnno = f.getAnnotation(Requirement.class); - - if (requirementAnno != null) { - ComponentRequirement requirement = new ComponentRequirement(); - - if (requirementAnno.role().isAssignableFrom(Object.class)) { - requirement.setRole(f.getType().getName()); - } else { - requirement.setRole(requirementAnno.role().getName()); - } - - requirement.setRoleHint(requirementAnno.hint()); - requirement.setFieldName(f.getName()); - requirement.setFieldMappingType(f.getType().getName()); - - getLog().debug("Found requirement: " + requirement); - - desc.addRequirement(requirement); - } - - Configuration configAnno = f.getAnnotation(Configuration.class); - - if (configAnno != null) { - PlexusConfiguration config = null; // new PlexusConfiguration(); - - // - // TODO: Convert the annoation to a PlexusConfiguration - // - - getLog().debug("Found configuration: " + config); - - desc.setConfiguration(config); - } + if (list != null && !list.isEmpty()) { + descriptors.addAll(list); } } - - return desc; - } - - public void execute() throws MojoExecutionException { - getLog().debug("Attempting to discover comamnds..."); - - ClassLoader cl = new URLClassLoader(getClasspath(), getClass().getClassLoader()); - - List classes = loadClasses(cl); - - List commands = new ClassFinder(classes).findAnnotatedClasses(CommandComponent.class); - - // Stip off any commands which aren't public or are abstract - for (Class type : commands) { - int mod = type.getModifiers(); - - if (!Modifier.isPublic(mod) || Modifier.isAbstract(mod)) { - commands.remove(type); - } + catch (Exception e) { + throw new MojoExecutionException("Failed to extract descriptors", e); } - if (commands.size() > 0) { - getLog().info("Discovered " + commands.size() + " command type(s)"); + if (descriptors.size() == 0) { + getLog().debug("No commands found"); + } + else { + getLog().info("Discovered " + descriptors.size() + " command descriptors(s)"); - CommandSetDescriptor setDesc = new CommandSetDescriptor(); - setDesc.setId(project.getArtifactId()); + CommandSetDescriptor commands = new CommandSetDescriptor(project.getId()); // .getArtifactId()); + commands.setCommands(descriptors); - for (Class type : commands) { - CommandDescriptor commandDesc = createCommandDescriptor(type); - setDesc.addCommandDescriptor(commandDesc); + try { + writeDescriptor(commands, outputFile); } - - File outputFile = new File(outputDirectory, fileName); - if (!outputFile.getParentFile().exists() && !outputFile.getParentFile().mkdirs()) { - throw new MojoExecutionException("Cannot create directory: " + outputFile.getParent()); + catch (Exception e) { + throw new MojoExecutionException("Failed to write descriptor: " + outputFile, e); } + } + } - // Write the file + private void writeDescriptor(final CommandSetDescriptor commands, final File outputFile) throws Exception { + assert commands != null; + assert outputFile != null; - BufferedWriter output = null; - try { - output = new BufferedWriter(new FileWriter(outputFile)); - CommandSetDescriptorWriter writer = new CommandSetDescriptorWriter(); + FileUtils.forceMkdir(outputFile.getParentFile()); - writer.write(output, setDesc); + BufferedWriter output = new BufferedWriter(new FileWriter(outputFile)); - getLog().debug("Wrote " + outputFile); - } - catch (Exception e) { - throw new MojoExecutionException("Failed to write commands descriptor", e); - } - finally { - IOUtil.close(output); - } + try { + CommandSetDescriptor.toXML(commands, output); + output.flush(); } + finally { + IOUtil.close(output); + } + + getLog().debug("Wrote: " + outputFile); } } Propchange: geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/DescriptorMojo.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/DescriptorMojo.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: geronimo/sandbox/gshell/trunk/gshell-maven-plugin/src/main/java/org/apache/geronimo/gshell/maven/gshell/DescriptorMojo.java ------------------------------------------------------------------------------ svn:mime-type = text/plain