From acc1d1391540fe25bd02df321163fbabb89c90ae Mon Sep 17 00:00:00 2001 From: Tom Copeland Date: Thu, 2 Jun 2005 02:21:13 +0000 Subject: [PATCH] A much-improved implementation of asXML(); thx to Wim Deblauwe for coordinating and coding this up! git-svn-id: https://pmd.svn.sourceforge.net/svnroot/pmd/trunk@3531 51baf565-9d33-0410-a72c-fc3788e3496d --- pmd/etc/changelog.txt | 4 +- .../pmd/ast/DiscardableNodeCleanerTest.java | 8 +- .../sourceforge/pmd/ast/SimpleNodeTest.java | 192 ++++++++++-------- .../net/sourceforge/pmd/ast/SimpleNode.java | 80 ++++---- .../pmd/util/designer/CodeEditorTextPane.java | 1 + .../pmd/util/designer/Designer.java | 37 +++- pmd/xdocs/credits.xml | 2 +- 7 files changed, 192 insertions(+), 132 deletions(-) diff --git a/pmd/etc/changelog.txt b/pmd/etc/changelog.txt index f676bc44bf..6a51b7c36a 100644 --- a/pmd/etc/changelog.txt +++ b/pmd/etc/changelog.txt @@ -394,6 +394,4 @@ Moved Ant task to the net.sourceforge.pmd.ant package Added new HTML report format June 25 2002 - 0.1: -Initial release - - +Initial release \ No newline at end of file diff --git a/pmd/regress/test/net/sourceforge/pmd/ast/DiscardableNodeCleanerTest.java b/pmd/regress/test/net/sourceforge/pmd/ast/DiscardableNodeCleanerTest.java index 67aa69f884..d75fc8f563 100644 --- a/pmd/regress/test/net/sourceforge/pmd/ast/DiscardableNodeCleanerTest.java +++ b/pmd/regress/test/net/sourceforge/pmd/ast/DiscardableNodeCleanerTest.java @@ -1,7 +1,5 @@ package test.net.sourceforge.pmd.ast; -import net.sourceforge.pmd.ast.ASTAnnotation; -import net.sourceforge.pmd.ast.ASTAnnotationTypeDeclaration; import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration; import net.sourceforge.pmd.ast.ASTCompilationUnit; import net.sourceforge.pmd.ast.ASTEqualityExpression; @@ -10,8 +8,14 @@ import net.sourceforge.pmd.ast.ASTModifiers; import net.sourceforge.pmd.ast.ASTRelationalExpression; import net.sourceforge.pmd.ast.ASTTypeDeclaration; import net.sourceforge.pmd.ast.DiscardableNodeCleaner; +import net.sourceforge.pmd.ast.ASTImplementsList; +import net.sourceforge.pmd.ast.ASTAnnotation; +import net.sourceforge.pmd.ast.ASTAnnotationTypeDeclaration; +import net.sourceforge.pmd.PMD; import test.net.sourceforge.pmd.testframework.ParserTst; +import java.util.List; + public class DiscardableNodeCleanerTest extends ParserTst { public void testRemoveDiscardNodes() throws Throwable { diff --git a/pmd/regress/test/net/sourceforge/pmd/ast/SimpleNodeTest.java b/pmd/regress/test/net/sourceforge/pmd/ast/SimpleNodeTest.java index b23d0fc91c..842d530165 100644 --- a/pmd/regress/test/net/sourceforge/pmd/ast/SimpleNodeTest.java +++ b/pmd/regress/test/net/sourceforge/pmd/ast/SimpleNodeTest.java @@ -1,30 +1,17 @@ /** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html -*/ + */ package test.net.sourceforge.pmd.ast; import net.sourceforge.pmd.PMD; -import net.sourceforge.pmd.ast.ASTAssignmentOperator; -import net.sourceforge.pmd.ast.ASTBlock; -import net.sourceforge.pmd.ast.ASTBlockStatement; -import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration; -import net.sourceforge.pmd.ast.ASTCompilationUnit; -import net.sourceforge.pmd.ast.ASTEqualityExpression; -import net.sourceforge.pmd.ast.ASTExpression; -import net.sourceforge.pmd.ast.ASTExtendsList; -import net.sourceforge.pmd.ast.ASTFieldDeclaration; -import net.sourceforge.pmd.ast.ASTImplementsList; -import net.sourceforge.pmd.ast.ASTInstanceOfExpression; -import net.sourceforge.pmd.ast.ASTMethodDeclaration; -import net.sourceforge.pmd.ast.ASTName; -import net.sourceforge.pmd.ast.ASTRelationalExpression; -import net.sourceforge.pmd.ast.ASTReturnStatement; -import net.sourceforge.pmd.ast.ASTStatement; -import net.sourceforge.pmd.ast.ASTVariableInitializer; -import net.sourceforge.pmd.ast.Node; -import net.sourceforge.pmd.ast.SimpleNode; +import net.sourceforge.pmd.ast.*; +import org.apache.xml.serialize.OutputFormat; +import org.apache.xml.serialize.XMLSerializer; +import org.w3c.dom.Document; import test.net.sourceforge.pmd.testframework.ParserTst; +import java.io.IOException; +import java.io.StringWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -51,25 +38,25 @@ public class SimpleNodeTest extends ParserTst { public void testHasExplicitExtends() throws Throwable { String code = HAS_EXPLICIT_EXTENDS; - ASTClassOrInterfaceDeclaration ucd = (ASTClassOrInterfaceDeclaration)(getNodes(ASTClassOrInterfaceDeclaration.class, code).iterator().next()); + ASTClassOrInterfaceDeclaration ucd = (ASTClassOrInterfaceDeclaration) (getNodes(ASTClassOrInterfaceDeclaration.class, code).iterator().next()); assertTrue(ucd.jjtGetChild(0) instanceof ASTExtendsList); } public void testNoExplicitExtends() throws Throwable { String code = NO_EXPLICIT_EXTENDS; - ASTClassOrInterfaceDeclaration ucd = (ASTClassOrInterfaceDeclaration)(getNodes(ASTClassOrInterfaceDeclaration.class, code).iterator().next()); + ASTClassOrInterfaceDeclaration ucd = (ASTClassOrInterfaceDeclaration) (getNodes(ASTClassOrInterfaceDeclaration.class, code).iterator().next()); assertFalse(ucd.jjtGetChild(0) instanceof ASTExtendsList); } public void testHasExplicitImplements() throws Throwable { String code = HAS_EXPLICIT_IMPLEMENTS; - ASTClassOrInterfaceDeclaration ucd = (ASTClassOrInterfaceDeclaration)(getNodes(ASTClassOrInterfaceDeclaration.class, code).iterator().next()); + ASTClassOrInterfaceDeclaration ucd = (ASTClassOrInterfaceDeclaration) (getNodes(ASTClassOrInterfaceDeclaration.class, code).iterator().next()); assertTrue(ucd.jjtGetChild(0) instanceof ASTImplementsList); } public void testNoExplicitImplements() throws Throwable { String code = NO_EXPLICIT_IMPLEMENTS; - ASTClassOrInterfaceDeclaration ucd = (ASTClassOrInterfaceDeclaration)(getNodes(ASTClassOrInterfaceDeclaration.class, code).iterator().next()); + ASTClassOrInterfaceDeclaration ucd = (ASTClassOrInterfaceDeclaration) (getNodes(ASTClassOrInterfaceDeclaration.class, code).iterator().next()); assertFalse(ucd.jjtGetChild(0) instanceof ASTImplementsList); } @@ -102,19 +89,19 @@ public class SimpleNodeTest extends ParserTst { Set blocks = getNodes(ASTBlock.class, LINE_NUMBERS_ON_SIBLINGS); Iterator i = blocks.iterator(); while (i.hasNext()) { - ASTBlock b = (ASTBlock)i.next(); + ASTBlock b = (ASTBlock) i.next(); assertTrue(b.getBeginLine() > 0); } blocks = getNodes(ASTVariableInitializer.class, LINE_NUMBERS_ON_SIBLINGS); i = blocks.iterator(); while (i.hasNext()) { - ASTVariableInitializer b = (ASTVariableInitializer)i.next(); + ASTVariableInitializer b = (ASTVariableInitializer) i.next(); assertTrue(b.getBeginLine() > 0); } blocks = getNodes(ASTExpression.class, LINE_NUMBERS_ON_SIBLINGS); i = blocks.iterator(); while (i.hasNext()) { - ASTExpression b = (ASTExpression)i.next(); + ASTExpression b = (ASTExpression) i.next(); assertTrue(b.getBeginLine() > 0); } } @@ -162,13 +149,13 @@ public class SimpleNodeTest extends ParserTst { ASTStatement x = new ASTStatement(2); block.jjtAddChild(x, 0); block.jjtAddChild(new ASTStatement(3), 1); - + Node n = block.getFirstChildOfType(ASTStatement.class); assertNotNull(n); assertTrue(n instanceof ASTStatement); assertEquals(x, n); } - + public void testGetFirstChildNested() { ASTBlock block = new ASTBlock(1); ASTStatement x = new ASTStatement(2); @@ -176,57 +163,71 @@ public class SimpleNodeTest extends ParserTst { x.jjtAddChild(x1, 1); block.jjtAddChild(x, 0); block.jjtAddChild(new ASTStatement(3), 1); - + Node n = block.getFirstChildOfType(ASTAssignmentOperator.class); assertNotNull(n); assertTrue(n instanceof ASTAssignmentOperator); assertEquals(x1, n); } - + public void testGetFirstChildNestedDeeper() { ASTBlock block = new ASTBlock(1); ASTStatement x = new ASTStatement(2); ASTAssignmentOperator x1 = new ASTAssignmentOperator(4); ASTName x2 = new ASTName(5); - + x.jjtAddChild(x1, 1); x1.jjtAddChild(x2, 0); block.jjtAddChild(x, 0); block.jjtAddChild(new ASTStatement(3), 1); - + Node n = block.getFirstChildOfType(ASTName.class); assertNotNull(n); assertTrue(n instanceof ASTName); assertEquals(x2, n); } - - public void testAsXml() { - ASTBlock b = new ASTBlock(1); - String x = b.asXml(); - assertEquals("", x); - } public void testContainsNoInner() throws Throwable { - ASTCompilationUnit c = (ASTCompilationUnit)getNodes(ASTCompilationUnit.class, CONTAINS_NO_INNER).iterator().next(); + ASTCompilationUnit c = (ASTCompilationUnit) getNodes(ASTCompilationUnit.class, CONTAINS_NO_INNER).iterator().next(); List res = new ArrayList(); c.findChildrenOfType(ASTFieldDeclaration.class, res, false); assertTrue(res.isEmpty()); + String expectedXml = "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""; + assertEquals( expectedXml, getXmlString( c ) ); } public void testContainsNoInnerWithAnonInner() throws Throwable { - ASTCompilationUnit c = (ASTCompilationUnit)getNodes(ASTCompilationUnit.class, CONTAINS_NO_INNER_WITH_ANON_INNER).iterator().next(); + ASTCompilationUnit c = (ASTCompilationUnit) getNodes(ASTCompilationUnit.class, CONTAINS_NO_INNER_WITH_ANON_INNER).iterator().next(); List res = new ArrayList(); c.findChildrenOfType(ASTFieldDeclaration.class, res, false); assertTrue(res.isEmpty()); } public void testContainsChildOfType() throws Throwable { - ASTClassOrInterfaceDeclaration c = (ASTClassOrInterfaceDeclaration)getNodes(ASTClassOrInterfaceDeclaration.class, CONTAINS_CHILDREN_OF_TYPE).iterator().next(); + ASTClassOrInterfaceDeclaration c = (ASTClassOrInterfaceDeclaration) getNodes(ASTClassOrInterfaceDeclaration.class, CONTAINS_CHILDREN_OF_TYPE).iterator().next(); assertTrue(c.containsChildOfType(ASTFieldDeclaration.class)); } public void testXPathNodeSelect() throws Throwable { - ASTClassOrInterfaceDeclaration c = (ASTClassOrInterfaceDeclaration)getNodes(ASTClassOrInterfaceDeclaration.class, TEST_XPATH).iterator().next(); + ASTClassOrInterfaceDeclaration c = (ASTClassOrInterfaceDeclaration) getNodes(ASTClassOrInterfaceDeclaration.class, TEST_XPATH).iterator().next(); List nodes = c.findChildNodesWithXPath("//FieldDeclaration"); assertEquals(2, nodes.size()); assertTrue(nodes.get(0) instanceof ASTFieldDeclaration); @@ -239,75 +240,94 @@ public class SimpleNodeTest extends ParserTst { assertEquals("Unexpected ending column:", endCol, node.getEndColumn()); } + /** + * Returns an unformatted xml string (without the declaration) + * + * @param node + * @return + * @throws IOException + */ + private String getXmlString(SimpleNode node) throws IOException { + Document document = node.asXml(); + StringWriter writer = new StringWriter(); + OutputFormat outputFormat = new OutputFormat("XML", "UTF-8", false); + outputFormat.setOmitXMLDeclaration( true ); + XMLSerializer xmlSerializer = new XMLSerializer(writer, outputFormat); + xmlSerializer.asDOMSerializer(); + xmlSerializer.serialize(document); + String xmlString = writer.toString(); + return xmlString; + } + private static final String HAS_EXPLICIT_EXTENDS = - "public class Test extends Foo {}"; + "public class Test extends Foo {}"; private static final String NO_EXPLICIT_EXTENDS = - "public class Test {}"; + "public class Test {}"; private static final String HAS_EXPLICIT_IMPLEMENTS = - "public class Test implements Foo {}"; + "public class Test implements Foo {}"; private static final String NO_EXPLICIT_IMPLEMENTS = - "public class Test {}"; + "public class Test {}"; private static final String METHOD_SAME_LINE = - "public class Test {" + PMD.EOL + - " public void foo() {}" + PMD.EOL + - "}"; + "public class Test {" + PMD.EOL + + " public void foo() {}" + PMD.EOL + + "}"; private static final String QUALIFIED_NAME = - "import java.io.File;" + PMD.EOL + - "public class Foo{}"; + "import java.io.File;" + PMD.EOL + + "public class Foo{}"; private static final String BROKEN_LINE_IN_NAME = - "import java.io." + PMD.EOL + - "File;" + PMD.EOL + - "public class Foo{}"; + "import java.io." + PMD.EOL + + "File;" + PMD.EOL + + "public class Foo{}"; private static final String LINE_NUMBERS_ON_SIBLINGS = - "public class Foo {" + PMD.EOL + - " void bar() {" + PMD.EOL + - " try {" + PMD.EOL + - " } catch (Exception1 e) {" + PMD.EOL + - " int x =2;" + PMD.EOL + - " }" + PMD.EOL + - " if (x != null) {}" + PMD.EOL + - " }" + PMD.EOL + - "}"; + "public class Foo {" + PMD.EOL + + " void bar() {" + PMD.EOL + + " try {" + PMD.EOL + + " } catch (Exception1 e) {" + PMD.EOL + + " int x =2;" + PMD.EOL + + " }" + PMD.EOL + + " if (x != null) {}" + PMD.EOL + + " }" + PMD.EOL + + "}"; private static final String NO_LOOKAHEAD = "public class Foo { }"; private static final String METHOD_DIFF_LINES = - "public class Test {" + PMD.EOL + - " public void foo() {" + PMD.EOL + - " int x;" + PMD.EOL + - " }" + PMD.EOL + - "}"; + "public class Test {" + PMD.EOL + + " public void foo() {" + PMD.EOL + + " int x;" + PMD.EOL + + " }" + PMD.EOL + + "}"; private static final String CONTAINS_CHILDREN_OF_TYPE = - "public class Test {" + PMD.EOL + - " int x;" + PMD.EOL + - "}"; + "public class Test {" + PMD.EOL + + " int x;" + PMD.EOL + + "}"; private static final String CONTAINS_NO_INNER = - "public class Test {" + PMD.EOL + - " public class Inner {" + PMD.EOL + - " int foo;" + PMD.EOL + - " }" + PMD.EOL + - "}"; + "public class Test {" + PMD.EOL + + " public class Inner {" + PMD.EOL + + " int foo;" + PMD.EOL + + " }" + PMD.EOL + + "}"; private static final String CONTAINS_NO_INNER_WITH_ANON_INNER = - "public class Test {" + PMD.EOL + - " void bar() {" + PMD.EOL + - " foo(new Fuz() { int x = 2;});" + PMD.EOL + - " }" + PMD.EOL + - "}"; + "public class Test {" + PMD.EOL + + " void bar() {" + PMD.EOL + + " foo(new Fuz() { int x = 2;});" + PMD.EOL + + " }" + PMD.EOL + + "}"; private static final String TEST_XPATH = - "public class Test {" + PMD.EOL + - " int x = 2;" + PMD.EOL + - " int y = 42;" + PMD.EOL + - "}"; + "public class Test {" + PMD.EOL + + " int x = 2;" + PMD.EOL + + " int y = 42;" + PMD.EOL + + "}"; } diff --git a/pmd/src/net/sourceforge/pmd/ast/SimpleNode.java b/pmd/src/net/sourceforge/pmd/ast/SimpleNode.java index d49c38003e..4cc7d2ff83 100644 --- a/pmd/src/net/sourceforge/pmd/ast/SimpleNode.java +++ b/pmd/src/net/sourceforge/pmd/ast/SimpleNode.java @@ -3,15 +3,20 @@ package net.sourceforge.pmd.ast; import net.sourceforge.pmd.IPositionProvider; import net.sourceforge.pmd.dfa.IDataFlowNode; +import net.sourceforge.pmd.jaxen.Attribute; import net.sourceforge.pmd.jaxen.DocumentNavigator; import net.sourceforge.pmd.symboltable.Scope; +import org.apache.xerces.dom.DocumentImpl; import org.jaxen.BaseXPath; import org.jaxen.JaxenException; +import org.w3c.dom.Document; +import org.w3c.dom.Element; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; -public class SimpleNode implements Node , IPositionProvider { +public class SimpleNode implements Node, IPositionProvider { protected Node parent; protected Node[] children; protected int id; @@ -38,7 +43,7 @@ public class SimpleNode implements Node , IPositionProvider { public void discardIfNecessary() { if (discardable) { - SimpleNode parent = (SimpleNode)this.jjtGetParent(); + SimpleNode parent = (SimpleNode) this.jjtGetParent(); SimpleNode kid = (SimpleNode) this.jjtGetChild(0); kid.jjtSetParent(parent); parent.jjtReplaceChild(this, kid); @@ -187,11 +192,11 @@ public class SimpleNode implements Node , IPositionProvider { } if (!descendIntoNestedClasses) { - if (node instanceof ASTClassOrInterfaceDeclaration && ((ASTClassOrInterfaceDeclaration)node).isNested()) { + if (node instanceof ASTClassOrInterfaceDeclaration && ((ASTClassOrInterfaceDeclaration) node).isNested()) { return; } - if (node instanceof ASTClassOrInterfaceBodyDeclaration && ((ASTClassOrInterfaceBodyDeclaration)node).isAnonymousInnerClass()) { + if (node instanceof ASTClassOrInterfaceBodyDeclaration && ((ASTClassOrInterfaceBodyDeclaration) node).isAnonymousInnerClass()) { return; } } @@ -278,34 +283,33 @@ public class SimpleNode implements Node , IPositionProvider { return prefix + toString(); } - /** - * - * @return a String with an XML representation of this node and its children - */ - public String asXml() { - String cn = getClass().getName(); - if (cn.indexOf('.') != -1) { - cn = cn.substring(cn.lastIndexOf('.')+1); - } - - final StringBuffer sb = new StringBuffer(); - - sb.append('<'); - sb.append(cn); - sb.append(" id=\""); - sb.append(id); - sb.append("\">"); - if (children!=null) { - for (int i=0;i'); - return sb.toString(); + public Document asXml() { + Document document = new DocumentImpl(); + appendElement(document); + return document; } - + + protected void appendElement(org.w3c.dom.Node parentNode) { + DocumentNavigator docNav = new DocumentNavigator(); + Document ownerDocument = parentNode.getOwnerDocument(); + if( ownerDocument == null ) + { + //If the parentNode is a Document itself, it's ownerDocument is null + ownerDocument = (Document) parentNode; + } + String elementName = docNav.getElementName(this); + Element element = ownerDocument.createElement(elementName); + parentNode.appendChild( element ); + for (Iterator iter = docNav.getAttributeAxisIterator(this); iter.hasNext();) { + Attribute attr = (Attribute) iter.next(); + element.setAttribute(attr.getName(), attr.getValue()); + } + for (Iterator iter = docNav.getChildAxisIterator(this); iter.hasNext();) { + SimpleNode child = (SimpleNode) iter.next(); + child.appendElement(element); + } + } + /* Override this method if you want to customize how the node dumps out its children. */ public void dump(String prefix) { @@ -326,7 +330,7 @@ public class SimpleNode implements Node , IPositionProvider { /** - *Traverses down the tree to find the first child instance of type childType + * Traverses down the tree to find the first child instance of type childType * * @param childType class which you want to find. * @return Node of type childType. Returns null if none found. @@ -336,23 +340,23 @@ public class SimpleNode implements Node , IPositionProvider { } private Node getFirstChildOfType(Class childType, Node node) { - for (int i=0;itrue if there is at lease on child of the given type and false in any other case */ diff --git a/pmd/src/net/sourceforge/pmd/util/designer/CodeEditorTextPane.java b/pmd/src/net/sourceforge/pmd/util/designer/CodeEditorTextPane.java index fe3d641b36..908c5fd5b3 100644 --- a/pmd/src/net/sourceforge/pmd/util/designer/CodeEditorTextPane.java +++ b/pmd/src/net/sourceforge/pmd/util/designer/CodeEditorTextPane.java @@ -45,6 +45,7 @@ public class CodeEditorTextPane extends JTextPane implements HasLines, ActionLis if (fw != null) fw.close(); } catch (IOException ioe) { + ioe.printStackTrace(); } } } diff --git a/pmd/src/net/sourceforge/pmd/util/designer/Designer.java b/pmd/src/net/sourceforge/pmd/util/designer/Designer.java index 41bb35a2ee..fa2bf31def 100644 --- a/pmd/src/net/sourceforge/pmd/util/designer/Designer.java +++ b/pmd/src/net/sourceforge/pmd/util/designer/Designer.java @@ -17,6 +17,9 @@ import net.sourceforge.pmd.jaxen.DocumentNavigator; import org.jaxen.BaseXPath; import org.jaxen.JaxenException; import org.jaxen.XPath; +import org.w3c.dom.Document; +import org.apache.xml.serialize.OutputFormat; +import org.apache.xml.serialize.XMLSerializer; import javax.swing.*; import java.awt.BorderLayout; @@ -32,6 +35,8 @@ import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.StringReader; +import java.io.IOException; +import java.io.StringWriter; import java.util.Iterator; import java.util.List; @@ -293,10 +298,38 @@ public class Designer implements ClipboardOwner { private String getXml() { ASTCompilationUnit cu = createParser().CompilationUnit(); + String result; if (cu!=null) { - return cu.asXml(); + try { + result = getXmlString( cu ); + } catch (IOException e) { + e.printStackTrace(); + result = "Error trying to construct XML representation"; + } } - return ""; + else + { + result = ""; + } + return result; + } + + /** + * Returns an unformatted xml string (without the declaration) + * + * @param node + * @return + * @throws java.io.IOException + */ + private String getXmlString(SimpleNode node) throws IOException { + Document document = node.asXml(); + StringWriter writer = new StringWriter(); + OutputFormat outputFormat = new OutputFormat("XML", "UTF-8", true); + XMLSerializer xmlSerializer = new XMLSerializer(writer, outputFormat); + xmlSerializer.asDOMSerializer(); + xmlSerializer.serialize(document); + String xmlString = writer.toString(); + return xmlString; } public void lostOwnership(Clipboard clipboard, Transferable contents) { diff --git a/pmd/xdocs/credits.xml b/pmd/xdocs/credits.xml index 57b332eb52..c2c23c9763 100644 --- a/pmd/xdocs/credits.xml +++ b/pmd/xdocs/credits.xml @@ -43,8 +43,8 @@
    +
  • Wim Deblauwe - Coordinated and coded a much nicer asXML() implementation, suggested cleanup of UnusedFormalParameter, Javadoc patch, SystemPrintln bug report, helped get Ant task and CLI squared away with JDK 1.5 params, JDK 1.5-specific bug reports, suggested improvements for ExceptionSignatureDeclaration
  • Tom Parker - Found missed case in NullAssignment, suggested addition to UnnecessaryBooleanAssertion, suggested splitting up AvoidThrowingCertainExceptionTypes, AvoidInstantiatingObjectsInLoops bug report, AtLeastOneConstructor bug report
  • -
  • Wim Deblauwe - suggested cleanup of UnusedFormalParameter, Javadoc patch, SystemPrintln bug report, helped get Ant task and CLI squared away with JDK 1.5 params, JDK 1.5-specific bug reports, suggested improvements for ExceptionSignatureDeclaration
  • Glen Cordrey - Reported bug involved JavaCC string handling
  • Dave Brosius - a couple of nice patches to clean up some string handling inefficiencies, non-static class usages, and unclosed streams/readers - found with Findbugs, I daresay :-)
  • Oto 'tapik' Buchta - Patched XMLRenderer for UTF8 support