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