Hi,
latest version of the Jrefactory integration after feedback from maven-dev.
all modified files are as patch files. All new files are for
jakarta-turbine-maven/src/java/org/apache/maven/sourcedef/
jrefactory.jar can be obtained from here and needs placing in lib.repo
http://prdownloads.sourceforge.net/jrefactory/jrefactory-2.6.36-binary.zip
FYI, running the maven:pretty-print target reduces checksource errors from 5K to 1K.
Outstanding issues:
when methods have static and final modifiers, Jrefactory orders them in a way
that generates a checksource error. bug has been logged with jrefactory
What should the default brace location be? turbine-style or sun-style?
Should we be autogenerating javadoc? whilst reduces checkstyle errors, doesn't
neccessarily improve the code?
Should we autogenerate @author tags? If a file is missing the @author tag, the
user who runs the pretty-print task will have their username inserted as the
author. Only a problem if there is a significant number of files missing the
@author tag.
Cheers
Nathan
Index: jakarta-turbine-maven/build.xml
===================================================================
RCS file: /home/cvspublic/jakarta-turbine-maven/build.xml,v
retrieving revision 1.37
diff -r1.37 build.xml
149a150,153
>
> <target name="maven:pretty-print">
> <ant antfile="${maven.home}/plugins/core/build.xml" target="pretty-print"/>
> </target>
Index: jakarta-turbine-maven/src/templates/build/plugins/core/build.xml
===================================================================
RCS file:
/home/cvspublic/jakarta-turbine-maven/src/templates/build/plugins/core/build.xml,v
retrieving revision 1.4
diff -r1.4 build.xml
331a332,374
>
> <!-- ================================================================== -->
> <!-- JRefactory Pretty Print -->
> <!-- ================================================================== -->
>
> <target
> name="pretty-print"
> depends="local-init, env"
> description="modify code according to maven source definition">
>
> <taskdef
> name="prettyprintconfig"
> classname="org.apache.maven.sourcedef.PrettyPrintConfigTask">
> <classpath refid="maven-classpath"/>
> </taskdef>
>
> <prettyprintconfig/>
>
> <taskdef name="filesetfrompath"
> classname="org.apache.maven.ant.FileSetFromPath">
> <classpath>
> <path refid="maven-classpath"/>
> </classpath>
> </taskdef>
>
> <filesetfrompath pathid="maven.src.set"
> filesetid="maven.sourceDirectories.fileset"
> includes="${maven.jrefactory.includes}"
> excludes="${maven.jrefactory.excludes}"/>
>
> <taskdef
> name="prettyprint"
> classname="org.acm.seguin.ant.Pretty">
> <classpath refid="maven-classpath"/>
> </taskdef>
>
> <prettyprint settingsDir="${maven.build.dir}">
> <fileset refid="maven.sourceDirectories.fileset" />
> </prettyprint>
>
> </target>
>
>
341a385,391
> <taskdef
> name="checkstyleconfig"
> classname="org.apache.maven.sourcedef.CheckStyleConfigTask">
> <classpath refid="maven-classpath"/>
> </taskdef>
>
>
366,403c416,420
< <checkstyle
< lcurlyType="${maven.checkstyle.lcurly.type}"
< lcurlyMethod="${maven.checkstyle.lcurly.method}"
< lcurlyOther="${maven.checkstyle.lcurly.other}"
< rcurly="${maven.checkstyle.rcurly}"
< parenPad="${maven.checkstyle.paren.pad}"
< allowTabs="${maven.checkstyle.allow.tabs}"
< allowProtected="${maven.checkstyle.allow.protected}"
< allowPackage="${maven.checkstyle.allow.package}"
< allowNoAuthor="${maven.checkstyle.allow.no.author}"
< maxLineLen="${maven.checkstyle.max.line.len}"
< tabWidth="${maven.checkstyle.tab.width}"
< ignoreLineLengthPattern="${maven.checkstyle.ignore.line.len.pattern}"
< maxMethodLen="${maven.checkstyle.max.method.len}"
< maxConstructorLen="${maven.checkstyle.max.constructor.len}"
< maxFileLen="${maven.checkstyle.max.file.len}"
< ignoreImportLen="${maven.checkstyle.ignore.import.len}"
< memberPattern="${maven.checkstyle.member.pattern}"
< publicMemberPattern="${maven.checkstyle.public.member.pattern}"
< paramPattern="${maven.checkstyle.param.pattern}"
< constPattern="${maven.checkstyle.const.pattern}"
< staticPattern="${maven.checkstyle.static.pattern}"
< typePattern="${maven.checkstyle.type.pattern}"
< methodPattern="${maven.checkstyle.method.pattern}"
< localVarPattern="${maven.checkstyle.local.var.pattern}"
< headerFile="${maven.checkstyle.header.file}"
< headerLinesRegexp="${maven.checkstyle.header.lines.regexp}"
< headerIgnoreLine="${maven.checkstyle.header.ignore.line}"
< javadocScope="${maven.checkstyle.javadoc.scope}"
< requirePackageHtml="${maven.checkstyle.require.package.html}"
< ignoreImports="${maven.checkstyle.ignore.imports}"
< illegalImports="${maven.checkstyle.illegal.imports}"
< ignoreWhitespace="${maven.checkstyle.ignore.whitespace}"
< ignoreCastWhitespace="${maven.checkstyle.ignore.cast.whitespace}"
< ignoreBraces="${maven.checkstyle.ignore.braces}"
< ignorePublicInInterface="${maven.checkstyle.ignore.public.in.interface}"
< failOnViolation="${maven.checkstyle.fail.on.violation}"
< cacheFile="${maven.checkstyle.cache.file}" >
---
> <checkstyleconfig/>
>
> <checkstyle
> properties="${maven.checkstyle.dir}/CheckStyleConfig.properties"
> failOnViolation="${maven.checkstyle.fail.on.violation}">
405,406c422,423
< <formatter type="xml" toFile="${maven.build.dir}/checkstyle-raw-report.xml"/>
< <formatter type="plain" toFile="${maven.build.dir}/checkstyle-raw-report.txt"/>
---
> <formatter type="xml"
>toFile="${maven.checkstyle.dir}/checkstyle-raw-report.xml"/>
> <formatter type="plain"
>toFile="${maven.checkstyle.dir}/checkstyle-raw-report.txt"/>
413,414c430,431
< in="${maven.build.dir}/checkstyle-raw-report.xml"
< out="${maven.gen.docs}/checkstyle-report.xml">
---
> in="${maven.checkstyle.dir}/checkstyle-raw-report.xml"
> out="${maven.checkstyle.dir}/checkstyle-report.xml">
Index: jakarta-turbine-maven/src/templates/build/plugins/core/default.properties
===================================================================
RCS file:
/home/cvspublic/jakarta-turbine-maven/src/templates/build/plugins/core/default.properties,v
retrieving revision 1.4
diff -r1.4 default.properties
77a78,90
> # source definition properties. if not set, default values below are
> # set by org.apache.maven.sourcedef.SourceDefinition
> #
>
> #maven.sourcedef.class.brace.style=PASCAL
> #maven.sourcedef.method.brace.style=PASCAL
> #maven.sourcedef.block.brace.style=PASCAL
> #maven.sourcedef.keyword.location.right.brace=alone
> #maven.sourcedef.max.line.len=80
> #maven.sourcedef.header.file=LICENSE.txt
> #maven.sourcedef.allow.tabs=false
>
> #
80a94
> maven.checkstyle.dir=${maven.build.dir}/checkstyle
83,86d96
< maven.checkstyle.lcurly.type = nl
< maven.checkstyle.lcurly.method = nl
< maven.checkstyle.lcurly.other = nl
< maven.checkstyle.rcurly = alone
88d97
< maven.checkstyle.allow.tabs = false
92d100
< maven.checkstyle.max.line.len = 80
107d114
< maven.checkstyle.header.file = LICENSE.txt
109c116
< maven.checkstyle.header.ignore.line = 1,6
---
> maven.checkstyle.header.ignore.line=
119c126,213
< maven.checkstyle.cache.file = ${maven.build.dir}/checkstyle-cachefile
---
> maven.checkstyle.cache.file = ${maven.checkstyle.dir}/checkstyle-cachefile
>
> #
> # jrefactroy properties
> #
>
> maven.jrefactory.includes=**/*.java
> maven.jrefactory.excludes=
> maven.jrefactory.version=3.8
> maven.jrefactory.indent=4
> maven.jrefactory.indent.char=space
> maven.jrefactory.expr.space=false
> maven.jrefactory.lines.between=2
> maven.jrefactory.cast.space=true
> maven.jrefactory.cast.force.nospace=false
> maven.jrefactory.surprise.return=double
> maven.jrefactory.throws.newline=false
> maven.jrefactory.field.name.indent=-1
> maven.jrefactory.end.line=CRNL
> maven.jrefactory.variable.spacing=single
> maven.jrefactory.dynamic.variable.spacing=1
> maven.jrefactory.variable.align.with.block=false
> maven.jrefactory.case.indent=4
> maven.jrefactory.keyword.space=true
> maven.jrefactory.insert.space.around.local.variables=false
> maven.jrefactory.lines.after.package=1
> maven.jrefactory.maintain.newlines.around.imports=true
> maven.jrefactory.lines.before.class=0
> maven.jrefactory.indent.in.initializer=false
> maven.jrefactory.bang.space=false
> maven.jrefactory.method.space=false
> maven.jrefactory.cast.inside.space=false
> maven.jrefactory.space.around.ops=true
> maven.jrefactory.force.block=true
> maven.jrefactory.empty.block.single.line=true
> maven.jrefactory.remove.excess.blocks=false
> maven.jrefactory.singleline.comment.ownline=true
> maven.jrefactory.singleline.comment.absoluteindent=0
> maven.jrefactory.singleline.comment.incrementalindent=0
> maven.jrefactory.singleline.comment.indentstyle.shared=incremental
> maven.jrefactory.singleline.comment.indentstyle.ownline=code
> maven.jrefactory.c.style.format=align.star
> maven.jrefactory.c.style.indent=2
> maven.jrefactory.method.minimum=all
> maven.jrefactory.field.minimum=protected
> maven.jrefactory.class.minimum=all
> maven.jrefactory.javadoc.star=2
> maven.jrefactory.javadoc.wordwrap.min=40
> maven.jrefactory.space.before.javadoc=true
> maven.jrefactory.javadoc.id.lineup=true
> maven.jrefactory.javadoc.indent=2
> maven.jrefactory.reformat.comments=true
> maven.jrefactory.exception.tag.name=@exception
> maven.jrefactory.document.nested.classes=true
> maven.jrefactory.allow.singleline.javadoc=false
> maven.jrefactory.keep.all.javadoc=false
> maven.jrefactory.class.descr=Description of the Class
> maven.jrefactory.interface.descr=Description of the Interface
> maven.jrefactory.constructor.descr=Constructor for the {0} object
> maven.jrefactory.method.descr=Description of the Method
> maven.jrefactory.getter.descr=Gets the {3} attribute of the {1} {2}
> maven.jrefactory.getter.return.descr=The {3} value
> maven.jrefactory.setter.descr=Sets the {3} attribute of the {1} {2}
> maven.jrefactory.setter.param.descr=The new {3} value
> maven.jrefactory.field.descr=Description of the Field
> maven.jrefactory.run.descr=Main processing method for the {1} {2}
> maven.jrefactory.main.descr=The main program for the {1} {2}
> maven.jrefactory.main.param.descr=The command line arguments
> maven.jrefactory.adder.descr=Adds a feature to the {0} attribute of the {1} {2}
> maven.jrefactory.adder.param.descr=The feature to be added to the {0} attribute
> maven.jrefactory.junit.setUp.descr=The JUnit setup method
> maven.jrefactory.junit.test.descr=A unit test for JUnit
> maven.jrefactory.junit.tearDown.descr=The teardown method for JUnit
> maven.jrefactory.junit.suite.descr=A unit test suite for JUnit
> maven.jrefactory.junit.suite.return.descr=The test suite
> maven.jrefactory.author.descr={0}
> maven.jrefactory.created.descr={1}
> maven.jrefactory.param.descr=Description of the Parameter
> maven.jrefactory.return.descr=Description of the Return Value
> maven.jrefactory.exception.descr=Description of the Exception
> maven.jrefactory.class.tags=created
> maven.jrefactory.method.tags=param,return,exception
> maven.jrefactory.field.tags=
> maven.jrefactory.char.stream.type=1
> maven.jrefactory.pretty.printer.backup.ext=
> maven.jrefactory.sort.top=false
> maven.jrefactory.import.sort.important=
> maven.jrefactory.import.sort.neighbourhood=0
Index: jakarta-turbine-maven/jars.list
===================================================================
RCS file: /home/cvspublic/jakarta-turbine-maven/jars.list,v
retrieving revision 1.9
diff -r1.9 jars.list
41a42
> jrefactory.jar
Index: jakarta-turbine-maven/project.xml
===================================================================
RCS file: /home/cvspublic/jakarta-turbine-maven/project.xml,v
retrieving revision 1.80
diff -r1.80 project.xml
329a330,338
> <dependency>
> <name>jrefactory</name>
> <type>required</type>
> <version>2.6.36</version>
> <jar>jrefactory.jar</jar>
> <url>http://jrefactory.sourceforge.net/chrissoft.html</url>
> </dependency>
>
>
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
package org.apache.maven.sourcedef;
import java.io.File;
import com.puppycrawl.tools.checkstyle.CheckStyleTask;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.Project;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Properties;
import java.util.Iterator;
/**
* task responsible for writing the checkstyle config file by combining
* properties with these prefixes maven.sourcedef and maven.checkstyle. generic
* maven.sourcedef properties are converted to checkstyle counterpart. For
* allowed properties and conversions see the {@link org.apache.maven.sourcedef
* package description}.
*
* @created 28 May 2002
* @author Nathan Coast ([EMAIL PROTECTED])
*/
public class CheckStyleConfigTask extends Task {
/**
* checkstyle property name for the class brace style property
*/
private final static String CLASS_BRACE_STYLE_KEY = "checkstyle.lcurly.type";
/**
* checkstyle property name for the method brace style property
*/
private final static String METHOD_BRACE_STYLE_KEY = "checkstyle.lcurly.method";
/**
* checkstyle property name for the all other brace styles
*/
private final static String OTHER_BRACE_STYLE_KEY = "checkstyle.lcurly.other";
/**
* checkstyle property name for the location of keyword relative to right
* brace.
*/
private final static String RIGHT_BRACE_KEYWORD_LOCATION_KEY =
"checkstyle.rcurly";
/**
* checkstyle property name for allow tabs property
*/
private final static String ALLOW_TABS_KEY = "checkstyle.allow.tabs";
/**
* checkstyle property name for max line lenght property
*/
private final static String MAX_LINE_LENGTH_KEY = "checkstyle.maxlinelen";
/**
* checkstyle property name for header file property
*/
private final static String HEADER_FILE_KEY = "checkstyle.header.file";
/**
* eol left brace style value
*/
private final static String LEFT_CURLY_EOL = "eol";
/**
* nl left brace style value
*/
private final static String LEFT_CURLY_NL = "nl";
/**
* name of the generated checkstyle config file
*/
private final static String CONFIG_FILENAME = "CheckStyleConfig.properties";
/**
* prefix for checkstyle properties in default.properties
*/
private final static String CHECKSTYLE_PROP_PREFIX = "maven.checkstyle.";
/**
* execute method to combine the maven.checkstyle properties with converted
* maven.sourcedef properties and write them to
* ${maven.checkstyle.dir}/CheckStyleConfig.properties
*
* @exception BuildException Description of the Exception
*/
public void execute() throws BuildException {
Project project = getProject();
Hashtable props = project.getProperties();
String checkstyleDirStr = (String) props.get("maven.checkstyle.dir");
File checkstyleDir = new File(checkstyleDirStr);
if (!checkstyleDir.exists()) {
if (!checkstyleDir.mkdir()) {
throw new BuildException("unable to create checkstyle directory: "
+ checkstyleDir);
}
}
File configFile = new File(checkstyleDir, CONFIG_FILENAME);
Properties config = new Properties();
Iterator it = props.keySet().iterator();
while (it.hasNext()) {
String key = (String) it.next();
if (key.startsWith(CHECKSTYLE_PROP_PREFIX)) {
config.put(key.substring(6), props.get(key));
}
}
SourceDefinition.setProjectProperties(getProject().getProperties());
String classBraceStyle = SourceDefinition.getClassBraceStyle();
classBraceStyle = convertLeftBraceType(classBraceStyle);
config.put(CLASS_BRACE_STYLE_KEY, classBraceStyle);
String methodBraceStyle = SourceDefinition.getMethodBraceStyle();
methodBraceStyle = convertLeftBraceType(methodBraceStyle);
config.put(METHOD_BRACE_STYLE_KEY, methodBraceStyle);
String blockBraceStyle = SourceDefinition.getBlockBraceStyle();
blockBraceStyle = convertLeftBraceType(blockBraceStyle);
config.put(OTHER_BRACE_STYLE_KEY, blockBraceStyle);
config.put(RIGHT_BRACE_KEYWORD_LOCATION_KEY,
SourceDefinition.getKeywordLocationRightBrace());
config.put(ALLOW_TABS_KEY, "" + SourceDefinition.getAllowTabs());
config.put(MAX_LINE_LENGTH_KEY, "" + SourceDefinition.getMaxLineLength());
File headerFile = SourceDefinition.getHeaderFile();
if (headerFile.exists() && headerFile.canRead() && headerFile.isFile()) {
config.put(HEADER_FILE_KEY, headerFile.toString());
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(configFile);
config.store(fos, "this is a generated file do not edit");
} catch (IOException e) {
throw new BuildException(e);
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* utility to convert between maven.sourcedef properties and checkstyle.
* properties for the left brace style.
*
* @param type the maven.sourcedef property to convert
* @return the maven.sourcedef property converted to checkstyle
* property.
*/
private static String convertLeftBraceType(String type) {
String convertedType = null;
if (SourceDefinition.BRACE_STYLE_C.equals(type)) {
convertedType = LEFT_CURLY_EOL;
} else if (SourceDefinition.BRACE_STYLE_PASCAL.equals(type)) {
convertedType = LEFT_CURLY_NL;
} else {
throw new BuildException("Unknown left brace type " + type);
}
return convertedType;
}
}
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
package org.apache.maven.sourcedef;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import java.util.Properties;
import java.util.Iterator;
import java.util.Set;
import java.util.Hashtable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.FileReader;
/**
* task responsible for writing the Jrefactory pretty print config file by
* combining properties with these prefixes maven.sourcedef and
* maven.jrefactory. Generic maven.sourcedef properties are converted to their
* jrefactory counterparts. For allowed properties and conversions see the
* {@link org.apache.maven.sourcedef package description}.
*
* @created 28 May 2002
* @author Nathan Coast ([EMAIL PROTECTED])
*/
public class PrettyPrintConfigTask extends Task {
/**
* jrefactory property name for the catch start line property
*/
private final static String CATCH_START_LINE = "catch.start.line";
/**
* jrefactory property name for the else start line property
*/
private final static String ELSE_START_LINE = "else.start.line";
/**
* jrefactory property name for the block property
*/
private final static String BLOCK_STYLE = "block.style";
/**
* jrefactory property name for the method block style property
*/
private final static String METHOD_BLOCK_STYLE = "method.block.style";
/**
* jrefactory property name for the class block style property
*/
private final static String CLASS_BLOCK_STYLE = "class.block.style";
/**
* jrefactory property name for the javadoc wordwrap property
*/
private final static String JAVADOC_WORDWRAP_MAX = "javadoc.wordwrap.max";
/**
* allowed 'space' value for the indent char property
*/
private final static String SPACE = "space";
/**
* allowed 'tab' value for the indent char property
*/
private final static String TAB = "tab";
/**
* jrefactory property name for the indent char property
*/
private final static String INDENT_CHAR = "indent.char";
/**
* prefix for jrefactory specific propeties
*/
private final static String JREFACTORY_PROP_PREFIX = "maven.jrefactory.";
/**
* execute method to combine the maven.jrefactory properties with converted
* maven.sourcedef properties and write them to the file
* ${maven.build.dir}/.Refactory/pretty.settings
*
* @exception BuildException Description of the Exception
*/
public void execute() throws BuildException {
Hashtable props = getProject().getProperties();
SourceDefinition.setProjectProperties(props);
Properties config = new Properties();
Iterator it = props.keySet().iterator();
while (it.hasNext()) {
String key = (String) it.next();
if (key.startsWith(JREFACTORY_PROP_PREFIX)) {
config.put(key.substring(JREFACTORY_PROP_PREFIX.length()),
props.get(key));
}
}
String buildDirStr = (String) props.get("maven.build.dir");
File buildDir = new File(buildDirStr);
File prettyDir = new File(buildDir, ".Refactory");
if (!prettyDir.exists()) {
if (!prettyDir.mkdir()) {
throw new BuildException(
"unable to create jrefactory pretty print config directory: "
+ prettyDir);
}
}
File prettySettings = new File(prettyDir, "pretty.settings");
if (prettySettings.exists()) {
prettySettings.delete();
}
FileOutputStream fos = null;
try {
String classBlockStyle = SourceDefinition.getClassBraceStyle();
config.put(CLASS_BLOCK_STYLE, classBlockStyle);
String methodBlockStyle = SourceDefinition.getMethodBraceStyle();
config.put(METHOD_BLOCK_STYLE, methodBlockStyle);
String blockStyle = SourceDefinition.getBlockBraceStyle();
config.put(BLOCK_STYLE, blockStyle);
String keyLoc = SourceDefinition.getKeywordLocationRightBrace();
String catchStartLine = convertKeywordLocationRightBrace(keyLoc);
config.put(CATCH_START_LINE, catchStartLine);
config.put(ELSE_START_LINE, catchStartLine);
File headerFile = SourceDefinition.getHeaderFile();
populateHeaderFile(headerFile, config);
int javadocWordwrapMax = SourceDefinition.getMaxLineLength();
config.put(JAVADOC_WORDWRAP_MAX, "" + javadocWordwrapMax);
boolean allowTabs = SourceDefinition.getAllowTabs();
String indentChar = convertAllowTabs(allowTabs);
config.put(INDENT_CHAR, indentChar);
/*
* if(SourceDefinition.getFollowJlsOrder()){
*
config.put("sort.1","Type(Field,Constructor,Method,NestedClass,NestedInterface,Initializer)");
* config.put("sort.2","Class(Instance,Static)");
* config.put("sort.3","Method(setter,getter,other)");
* config.put("sort.4","Final(top)");
* config.put("sort.5","Protection(public)");
* config.put("sort.6","Bean()");
* config.put("sort.7","Alphabetical()");
* config.put("sort.8","FieldInitializers()");
* }
*/
//File tmpPrettyProps = new File("tmpPrettyProps.settings");
fos = new FileOutputStream(prettySettings);
config.store(fos, "this is a generated file do not edit");
} catch (IOException e) {
throw new BuildException(e);
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* method to convert property from maven.sourcedef.keyword.location.right.brace
* to jrefactory property values.
*
* @param location the maven.sourcdef property
* @return the property converted to a jrefactory property
*/
private static String convertKeywordLocationRightBrace(String location) {
String convertedLocation = null;
if (SourceDefinition.KEYWORD_LOCATION_RIGHT_BRACE_SAME.equals(location)) {
convertedLocation = "false";
} else if
(SourceDefinition.KEYWORD_LOCATION_RIGHT_BRACE_ALONE.equals(location)) {
convertedLocation = "true";
} else {
throw new BuildException("Unrecognised keyword location " + location);
}
return convertedLocation;
}
/**
* method to read the header file and populate the contents of the file
* into the properties using the property names 'header.[line_num]'
*
* @param headerFile the headerFile
* @param props the properties to load the header file into.
* @exception IOException Description of the Exception
*/
private static void populateHeaderFile(File headerFile, Properties props)
throws IOException {
FileReader fr = new FileReader(headerFile);
BufferedReader br = new BufferedReader(fr);
String str = null;
int count = 0;
while ((str = br.readLine()) != null) {
count++;
String headerLine = "header." + count;
props.put(headerLine, str);
}
}
/**
* method to convert the maven.sourcedef.allow.tabs property to the
* appropriate jrefactory property
*
* @param allowTabs the maven.sourcedef.allow.tabs property
* @return allow tabs property converted to jrefactory property
*/
private static String convertAllowTabs(boolean allowTabs) {
String indentChar = null;
if (allowTabs) {
indentChar = TAB;
} else {
indentChar = SPACE;
}
return indentChar;
}
}
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Maven" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Maven", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
* ====================================================================
*/
package org.apache.maven.sourcedef;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Hashtable;
import org.apache.tools.ant.BuildException;
/**
* Utility class to provide access to the maven.sourcedef properties. If a
* property exisits in the project properties, it is against allowed values for
* that property (if there are any). If the property isn't set, a default is
* returned.
*
* @created 28 May 2002
* @author Nathan Coast ([EMAIL PROTECTED])
*/
class SourceDefinition {
/**
* value for 'C' brace style
*/
public final static String BRACE_STYLE_C = "C";
/**
* value for 'pascal' brace style
*/
public final static String BRACE_STYLE_PASCAL = "PASCAL";
/**
* allowed brace styles 'C' or 'PASCAL'
*/
private final static String[] BRACE_STYLE_ALLOWED = {BRACE_STYLE_C,
BRACE_STYLE_PASCAL};
/**
* property name for block brace style
*/
private final static String BLOCK_BRACE_STYLE_KEY =
"maven.sourcedef.block.brace.style";
/**
* default value for block brace style
*/
private final static String BLOCK_BRACE_STYLE_DEFAULT = BRACE_STYLE_C;
private final static String METHOD_BRACE_STYLE_KEY =
"maven.sourcedef.method.brace.style";
private final static String METHOD_BRACE_STYLE_DEFAULT = BRACE_STYLE_C;
private final static String CLASS_BRACE_STYLE_KEY =
"maven.sourcedef.class.brace.style";
private final static String CLASS_BRACE_STYLE_DEFAULT = BRACE_STYLE_C;
/**
* Description of the Field
*/
public final static String KEYWORD_LOCATION_RIGHT_BRACE_SAME = "same";
/**
* Description of the Field
*/
public final static String KEYWORD_LOCATION_RIGHT_BRACE_ALONE = "alone";
private final static String[] KEYWORD_LOCATION_RIGHT_BRACE_ALLOWED =
{KEYWORD_LOCATION_RIGHT_BRACE_SAME,
KEYWORD_LOCATION_RIGHT_BRACE_ALONE};
private final static String KEYWORD_LOCATION_RIGHT_BRACE_KEY =
"maven.sourcedef.keyword.location.right.brace";
private final static String KEYWORD_LOCATION_RIGHT_BRACE_DEFAULT =
KEYWORD_LOCATION_RIGHT_BRACE_SAME;
private final static String MAX_LINE_LENGTH_KEY = "maven.sourcedef.max.line.len";
private final static int MAX_LINE_LENGTH_DEFAULT = 80;
private final static String HEADER_FILE_KEY = "maven.sourcedef.header.file";
private final static String HEADER_FILE_DEFAULT = "LICENSE.txt";
private final static String ALLOW_TABS_KEY = "maven.sourcedef.allow.tabs";
private final static boolean ALLOW_TABS_DEFAULT = false;
private final static String FOLLOW_JLS_ORDER_KEY =
"maven.sourcedef.follow.jls.order";
private final static boolean FOLLOW_JLS_ORDER_DEFAULT = true;
private static Hashtable projectProps = null;
/**
* provides SourceDefinition with access to the ant properties
*
* @param props the hashtable of the ant properties.
*/
public final static void setProjectProperties(Hashtable props) {
projectProps = props;
}
/**
* @return the block brace style
*/
public final static String getBlockBraceStyle() {
return getStringProperty(BLOCK_BRACE_STYLE_KEY,
BLOCK_BRACE_STYLE_DEFAULT,
BRACE_STYLE_ALLOWED);
}
/**
* Gets the methodBraceStyle attribute of the SourceDefinition class
*
* @return The methodBraceStyle value
*/
public final static String getMethodBraceStyle() {
return getStringProperty(METHOD_BRACE_STYLE_KEY,
METHOD_BRACE_STYLE_DEFAULT,
BRACE_STYLE_ALLOWED);
}
/**
* Gets the classBraceStyle attribute of the SourceDefinition class
*
* @return The classBraceStyle value
*/
public final static String getClassBraceStyle() {
return getStringProperty(CLASS_BRACE_STYLE_KEY,
CLASS_BRACE_STYLE_DEFAULT,
BRACE_STYLE_ALLOWED);
}
/**
* Gets the keywordLocationRightBrace attribute of the SourceDefinition
* class
*
* @return The keywordLocationRightBrace value
*/
public final static String getKeywordLocationRightBrace() {
return getStringProperty(KEYWORD_LOCATION_RIGHT_BRACE_KEY,
KEYWORD_LOCATION_RIGHT_BRACE_DEFAULT,
KEYWORD_LOCATION_RIGHT_BRACE_ALLOWED);
}
/**
* Gets the allowTabs attribute of the SourceDefinition class
*
* @return The allowTabs value
*/
public final static boolean getAllowTabs() {
return getBooleanProperty(ALLOW_TABS_KEY, ALLOW_TABS_DEFAULT);
}
/**
* Gets the maxLineLength attribute of the SourceDefinition class
*
* @return The maxLineLength value
*/
public final static int getMaxLineLength() {
return getIntProperty(MAX_LINE_LENGTH_KEY, MAX_LINE_LENGTH_DEFAULT);
}
/**
* Gets the headerFile attribute of the SourceDefinition class
*
* @return The headerFile value
*/
public final static File getHeaderFile() {
return getFileProperty(HEADER_FILE_KEY, HEADER_FILE_DEFAULT);
}
/**
* Gets the followJlsOrder attribute of the SourceDefinition class
*
* @return The followJlsOrder value
*/
public final static boolean getFollowJlsOrder() {
return getBooleanProperty(FOLLOW_JLS_ORDER_KEY,
FOLLOW_JLS_ORDER_DEFAULT);
}
/**
* Gets the intProperty attribute of the SourceDefinition class
*
* @param key Description of the Parameter
* @param defaultValue Description of the Parameter
* @return The intProperty value
*/
public final static int getIntProperty(String key, int defaultValue) {
String propStr = (String) projectProps.get(key);
int prop = 0;
if (propStr != null) {
prop = Integer.parseInt(propStr);
} else {
prop = defaultValue;
}
return prop;
}
/**
* Gets the booleanProperty attribute of the SourceDefinition class
*
* @param key Description of the Parameter
* @param defaultValue Description of the Parameter
* @return The booleanProperty value
*/
private final static boolean getBooleanProperty(String key, boolean defaultValue) {
String propStr = (String) projectProps.get(key);
boolean prop = false;
if (propStr != null) {
prop = new Boolean(propStr).booleanValue();
} else {
prop = defaultValue;
}
return prop;
}
/**
* Gets the stringProperty attribute of the SourceDefinition class
*
* @param key Description of the Parameter
* @param defaultValue Description of the Parameter
* @param allowedValues Description of the Parameter
* @return The stringProperty value
*/
private final static String getStringProperty(String key, String defaultValue,
String[] allowedValues) {
String prop = (String) projectProps.get(key);
//String prop = (String) projectProps.get(key,defaultValue);
System.out.println("key = " + key + " val = " + prop + " default " +
defaultValue + " allowed = " + allowedValues);
if (prop == null) {
prop = defaultValue;
}
if (allowedValues != null) {
List list = Arrays.asList(allowedValues);
if (!list.contains(prop)) {
StringBuffer sb = new StringBuffer("unrecognised value: ");
sb.append(prop);
sb.append(" for property: ");
sb.append(key);
sb.append(" allowed values are: ");
for (int i = 0; i < allowedValues.length; i++) {
sb.append(allowedValues[i]);
if (i < (allowedValues.length - 1)) {
sb.append(",");
}
}
throw new BuildException(sb.toString());
}
}
return prop;
}
/**
* Gets the fileProperty attribute of the SourceDefinition class
*
* @param key Description of the Parameter
* @param defaultValue Description of the Parameter
* @return The fileProperty value
*/
private final static File getFileProperty(String key, String defaultValue) {
String prop = (String) projectProps.get(key);
if (prop == null) {
prop = defaultValue;
}
return new File(prop);
}
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>