package org.codehaus.mojo.dita; /* * Copyright 2000-2006 The Apache Software Foundation * * 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. */ import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Iterator; import org.apache.maven.plugin.MojoExecutionException; import org.codehaus.plexus.util.IOUtil; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentFactory; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; /** * Generate <a href="DITA Open Platform">http://www.dita-op.org</a>'s Eclipse configuration * to allow editing, previewing DITA under Eclipse IDE. * * @goal eclipse * @requiresProject false */ public class DitaEclipseMojo extends AbstractProjectMojo { /** * If given, will be added to Ant command line * * @parameter expression="${dita.projectName}" default-value="${project.artifactId}" * @since since 1.0-beta-1 * */ private String projectName; public void execute() throws MojoExecutionException { if ( skip ) { this.getLog().info( "Skipped" ); return; } File eclipseProjectFile = new File( this.project.getBasedir(), ".project" ); if ( !eclipseProjectFile.exists() ) { generateBrandNewEclipseProjectFile( eclipseProjectFile ); return; } this.addDitaOpenPlatformToCurrentEclipseProject( eclipseProjectFile ); } private void addDitaOpenPlatformToCurrentEclipseProject( File eclipseProjectFile ) throws MojoExecutionException { Document doc = DocumentFactory.getInstance().createDocument(); try { SAXReader saxReader = new SAXReader(); doc = saxReader.read( eclipseProjectFile ); this.addDitaBuildCommand( doc ); this.addDitaBuildNature( doc ); } catch ( DocumentException e ) { throw new MojoExecutionException( e.getMessage(), e ); } this.writeOutEclipseProject( doc, eclipseProjectFile ); } private void addDitaBuildCommand( Document doc ) { Element buildSpec = (Element) doc.selectSingleNode( "//projectDescription/buildSpec" ); boolean foundDitaBuildCommand = false; for ( Iterator i = buildSpec.elementIterator(); i.hasNext(); ) { Element element = (Element) i.next(); if ( "buildCommand".equals( element.getName() ) ) { for ( Iterator j = element.elementIterator(); j.hasNext(); ) { Element buildCommandChildElement = (Element) j.next(); if ( "name".equals( buildCommandChildElement.getName() ) ) { if ( "org.dita_op.editor.DITAFileValidator".equals( buildCommandChildElement.getText() ) ) { foundDitaBuildCommand = true; } } } } } if ( !foundDitaBuildCommand ) { addDitaBuildCommand( buildSpec ); } } private void addDitaBuildCommand( Element buildSpec ) { Element buildCommand = buildSpec.addElement( "buildCommand" ); buildCommand.addElement( "name" ).setText( "org.dita_op.editor.DITAFileValidator" ); buildCommand.addElement( "arguments" ); } private void addDitaBuildNature( Document doc ) { Element natures = (Element) doc.selectSingleNode( "//projectDescription/natures" ); boolean foundDitaBuildNature = false; for ( Iterator i = natures.elementIterator(); i.hasNext(); ) { Element element = (Element) i.next(); if ( "nature".equals( element.getName() ) ) { if ( "org.dita_op.editor.DITAProjectNature".equals( element.getText() ) ) { foundDitaBuildNature = true; } } } if ( !foundDitaBuildNature ) { addDitaBuildNature( natures ); } } private void generateBrandNewEclipseProjectFile( File eclipseProjectFile ) throws MojoExecutionException { Document doc = DocumentFactory.getInstance().createDocument(); Element root = doc.addElement( "projectDescription" ); root.addElement( "name" ).setText( projectName ); root.addElement( "comment" ); root.addElement( "projects" ); addDitaBuildCommand( root.addElement( "buildSpec" ) ); addDitaBuildNature ( root.addElement( "natures" ) ); writeOutEclipseProject( doc, eclipseProjectFile ); } private void addDitaBuildNature( Element natures ) { natures.addElement( "nature" ).setText( "org.dita_op.editor.DITAProjectNature" ); } private void writeOutEclipseProject( Document doc, File file ) throws MojoExecutionException { FileWriter fileWriter = null; try { OutputFormat outformat = OutputFormat.createPrettyPrint(); fileWriter = new FileWriter( file ); XMLWriter writer = new XMLWriter( fileWriter, outformat ); writer.write( doc ); writer.flush(); } catch ( IOException e ) { throw new MojoExecutionException( e.getMessage(), e ); } finally { IOUtil.close( fileWriter ); } } }