package org.hibernate.tool.ant; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; import org.apache.tools.ant.types.FileSet; import org.hibernate.tool.hbm2x.ExporterException; import org.hibernate.tool.ide.formatting.JavaFormatter; public class JavaFormatterTask extends Task { private List<FileSet> fileSets = new ArrayList<FileSet>(); private boolean failOnError; private File configurationFile; public void addConfiguredFileSet(FileSet fileSet) { fileSets.add(fileSet); } public void setConfigurationFile(File configurationFile) { this.configurationFile = configurationFile; } private Properties readConfig(File cfgfile) throws IOException { BufferedInputStream stream = null; try { stream = new BufferedInputStream(new FileInputStream(cfgfile)); final Properties settings = new Properties(); settings.load(stream); return settings; } catch (IOException e) { throw e; } finally { if (stream != null) { try { stream.close(); } catch (IOException e) { } } } } public void execute() throws BuildException { Map<Object, Object> settings = null; if(configurationFile!=null) { try { settings = readConfig( configurationFile ); } catch (IOException e) { throw new BuildException("Could not read configurationfile " + configurationFile, e); } } File[] files = getFiles(); int failed = 0; if(files.length>0) { JavaFormatter formatter = new JavaFormatter(settings); for (int i = 0; i < files.length; i++) { File file = files[i]; try { boolean ok = formatter.formatFile( file ); if(!ok) { failed++; getProject().log(this, "Formatting failed - skipping " + file, Project.MSG_WARN); } else { getProject().log(this, "Formatted " + file, Project.MSG_VERBOSE); } } catch(ExporterException ee) { failed++; if(failOnError) { throw new BuildException("Java formatting failed on " + file, ee); } else { getProject().log(this, "Java formatting failed on " + file + ", " + ee.getLocalizedMessage(), Project.MSG_ERR); } } } } getProject().log( this, "Java formatting of " + files.length + " files completed. Skipped " + failed + " file(s).", Project.MSG_INFO ); } private File[] getFiles() { List<File> files = new LinkedList<File>(); for ( Iterator<FileSet> i = fileSets.iterator(); i.hasNext(); ) { FileSet fs = i.next(); DirectoryScanner ds = fs.getDirectoryScanner( getProject() ); String[] dsFiles = ds.getIncludedFiles(); for (int j = 0; j < dsFiles.length; j++) { File f = new File(dsFiles[j]); if ( !f.isFile() ) { f = new File( ds.getBasedir(), dsFiles[j] ); } files.add( f ); } } return (File[]) files.toArray(new File[files.size()]); } }