Skip to content

Commit

Permalink
[SHRINKDESC-105] Adding test cases for all filter classes
Browse files Browse the repository at this point in the history
  • Loading branch information
ralfbattenfeld authored and ALRubinger committed May 6, 2012
1 parent c4a44a2 commit 12bfedc
Show file tree
Hide file tree
Showing 25 changed files with 1,160 additions and 221 deletions.
11 changes: 10 additions & 1 deletion metadata-parser/pom.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<!-- Parent -->
<parent>
Expand Down Expand Up @@ -124,6 +125,14 @@
<artifactId>dtd-parser</artifactId>
<version>1.1</version>
</dependency>

<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
<scope>test</scope>
</dependency>

</dependencies>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
package org.jboss.shrinkwrap.descriptor.metadata;

import java.util.ArrayList;
import java.util.List;

import org.jboss.shrinkwrap.descriptor.metadata.filter.AttributeFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.AttributeGroupFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.ComplexTypeFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.ElementFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.EnumFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.ExtensionFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.Filter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.GroupFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.ListFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.RestrictionFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.SimpleContentFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.UnionFilter;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.traversal.TreeWalker;

/**
* Class that allows to traverse a DOM document by using a TreeWalker.
* <p>
* This class is refactored from the MetadataParser in order to test
* the filtering of w3c elements in isolation.
*
* @author <a href="mailto:ralf.battenfeld@bluewin.ch">Ralf Battenfeld</a>
*
*/
public class FilterChain {

private final static String ELEMENT_LOG = "%s- %s name: %s";

private final List<Filter> filterList = new ArrayList<Filter>();

public FilterChain() {
filterList.add(new GroupFilter());
filterList.add(new ElementFilter());
filterList.add(new EnumFilter());
filterList.add(new AttributeFilter());
filterList.add(new AttributeGroupFilter());
filterList.add(new RestrictionFilter());
filterList.add(new ComplexTypeFilter());
// filterList.add(new SimpleContentFilter()); // simpleContent used for text only types are not supported currently
filterList.add(new ExtensionFilter());
filterList.add(new UnionFilter());
filterList.add(new ListFilter());
}

/**
* Traverses the DOM and applies the filters for each visited node.
*
* @param walker
* @param indent
* @param sb
* Optional {@link StringBuilder} used to track progress for
* logging purposes.
*/
public void traverseAndFilter(final TreeWalker walker, final String indent,
final Metadata metadata, final StringBuilder sb) {

final Node parend = walker.getCurrentNode();

final boolean isLogged = appendText(indent, (Element) parend, sb);

for (final Filter filter : filterList) {
if (filter.filter(metadata, walker)) {
appendText(" catched by: " + filter.getClass().getSimpleName(), sb);
break;
}
}

if (isLogged) {
appendText("\n", sb);
}

for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) {
traverseAndFilter(walker, indent + " ", metadata, sb);
}

walker.setCurrentNode(parend);
}

// --------------------------------------------------------------------------------------||
// -- Private Methods -------------------------------------------------------------------||
// --------------------------------------------------------------------------------------||

/**
* Appends the given text.
*/
private boolean appendText(final String text, final StringBuilder sb) {
if (sb != null) {
if (text != null && text.indexOf(":annotation") < 0 && text.indexOf(":documentation") < 0) {
sb.append(text);
return true;
}
}
return false;
}


/**
* Appends the given element.
*/
private boolean appendText(final String indent, final Element element, final StringBuilder sb) {
if (sb != null) {
if (element.getTagName().indexOf(":annotation") < 0 &&
element.getTagName().indexOf(":documentation") < 0) {
sb.append(String.format(ELEMENT_LOG, indent,
element.getTagName(), element.getAttribute("name")));
return true;
}
}
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@

package org.jboss.shrinkwrap.descriptor.metadata;

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand All @@ -33,22 +32,8 @@

import org.jboss.shrinkwrap.descriptor.metadata.dom.DomWriter;
import org.jboss.shrinkwrap.descriptor.metadata.dtd.MetadataDtdEventListener;
import org.jboss.shrinkwrap.descriptor.metadata.filter.AttributeFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.AttributeGroupFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.ComplexTypeFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.ElementFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.EnumFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.ExtensionFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.Filter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.GroupFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.ListFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.RestrictionFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.SimpleContentFilter;
import org.jboss.shrinkwrap.descriptor.metadata.filter.UnionFilter;
import org.jboss.shrinkwrap.descriptor.metadata.xslt.XsltTransformer;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.traversal.DocumentTraversal;
import org.w3c.dom.traversal.NodeFilter;
import org.w3c.dom.traversal.TreeWalker;
Expand All @@ -69,8 +54,8 @@ public class MetadataParser
{
private static final Logger log = Logger.getLogger(MetadataParser.class.getName());

private final List<Filter> filterList = new ArrayList<Filter>();

private final FilterChain filterChain = new FilterChain();
private final Metadata metadata = new Metadata();

private String pathToMetadata;
Expand Down Expand Up @@ -116,16 +101,16 @@ public void parse(final MetadataParserPath path, final List<?> confList, final b
metadata.setCurrentPackageApi(metadataConf.getPackageApi());
metadata.setCurrentPackageImpl(metadataConf.getPackageImpl());

final MetadataDescriptor metadataDescriptor = new MetadataDescriptor(metadataConf.getDescriptorName());
metadataDescriptor.setRootElementName(metadataConf.getElementName());
metadataDescriptor.setRootElementType(metadataConf.getElementType());
metadataDescriptor.setSchemaName(metadataConf.getPathToXsd());
metadataDescriptor.setPackageApi(metadataConf.getPackageApi());
metadataDescriptor.setPackageImpl(metadataConf.getPackageImpl());
metadataDescriptor.setNamespace(metadataConf.getNameSpace());
metadataDescriptor.setNamespaces(metadataConf.getNamespaces());
metadataDescriptor.setGenerateClasses(metadataConf.generateClasses);
metadata.getMetadataDescriptorList().add(metadataDescriptor);
final MetadataDescriptor metadataDescriptor = new MetadataDescriptor(metadataConf.getDescriptorName());
metadataDescriptor.setRootElementName(metadataConf.getElementName());
metadataDescriptor.setRootElementType(metadataConf.getElementType());
metadataDescriptor.setSchemaName(metadataConf.getPathToXsd());
metadataDescriptor.setPackageApi(metadataConf.getPackageApi());
metadataDescriptor.setPackageImpl(metadataConf.getPackageImpl());
metadataDescriptor.setNamespace(metadataConf.getNameSpace());
metadataDescriptor.setNamespaces(metadataConf.getNamespaces());
metadataDescriptor.setGenerateClasses(metadataConf.generateClasses);
metadata.getMetadataDescriptorList().add(metadataDescriptor);

if (metadataConf.getPathToXsd().endsWith(".dtd"))
{
Expand All @@ -141,23 +126,13 @@ public void parse(final MetadataParserPath path, final List<?> confList, final b
final DocumentBuilder loader = factory.newDocumentBuilder();
final Document document = loader.parse(metadataConf.getPathToXsd());

filterList.add(new GroupFilter());
filterList.add(new ElementFilter());
filterList.add(new EnumFilter());
filterList.add(new AttributeFilter());
filterList.add(new AttributeGroupFilter());
filterList.add(new RestrictionFilter());
filterList.add(new ComplexTypeFilter());
filterList.add(new SimpleContentFilter());
filterList.add(new ExtensionFilter());
filterList.add(new UnionFilter());
filterList.add(new ListFilter());

final DocumentTraversal traversal = (DocumentTraversal) document;
final TreeWalker walker = traversal.createTreeWalker(document.getDocumentElement(),
NodeFilter.SHOW_ELEMENT, null, true);
final StringBuilder sb = verbose ? new StringBuilder() : null;
traverseLevel(walker, "", sb);

filterChain.traverseAndFilter(walker, "", metadata, sb);

if(sb!=null){
log.info(sb.toString());
}
Expand Down Expand Up @@ -186,38 +161,6 @@ public void parse(final MetadataParserPath path, final List<?> confList, final b
}
}

/**
* Traverses the DOM and applies the filters for each visited node.
* @param walker
* @param indent
* @param sb Optional {@link StringBuilder} used to track progress for logging purposes
*/
private void traverseLevel(final TreeWalker walker, final String indent, final StringBuilder sb)
{
final Node parend = walker.getCurrentNode();

if (sb!=null)
{
sb.append(indent + "- " + ((Element) parend).getTagName());
sb.append('\n');
}

for (final Filter filter : filterList)
{
if (filter.filter(metadata, walker))
{
break;
}
}

for (Node n = walker.firstChild(); n != null; n = walker.nextSibling())
{
traverseLevel(walker, indent + '\t', sb);
}

walker.setCurrentNode(parend);
}

/**
* Generates source code by applying the <code>ddJavaAll.xsl</code> XSLT extracted from the resource stream.
* @throws TransformerException
Expand All @@ -237,14 +180,19 @@ public void generateCode(final MetadataParserPath path) throws TransformerExcept
XsltTransformer.simpleTransform(pathToMetadata, is, new File("./tempddJava.xml"), xsltParameters);
}

// -------------------------------------------------------------------------------------------------||
// -- Private Methods ------------------------------------------------------------------------------||
// -------------------------------------------------------------------------------------------------||

/**
* Creates a temporary file.
* @return
* @return absolute path of the temporary file.
* @throws IOException
*/
private String createTempFile() throws IOException
{
File tempFile = File.createTempFile("tempMetadata", ".xml");
return tempFile.getAbsolutePath();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@

package org.jboss.shrinkwrap.descriptor.metadata;

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,37 @@ public static boolean hasChildOf(final Element parentElement, XsdElementEnum chi
return false;
}

/**
* Checks the existence of a w3c child element.
* @param parentElement the element from which the search starts.
* @param child the <code>XsdElementEnum</code> specifying the child element.
* @return true, if found, otherwise false.
*/
public static boolean hasChildsOf(final Element parentElement, XsdElementEnum child )
{
NodeList nodeList = parentElement.getChildNodes();
for (int i=0; i<nodeList.getLength(); i++)
{
final Node childNode = nodeList.item(i);
if (childNode.getNodeType() == Node.ELEMENT_NODE)
{
final Element childElement = (Element) childNode;
if (child.isTagNameEqual(childElement.getTagName()))
{
return true;
}

if (childElement.hasChildNodes())
{
if (hasChildsOf(childElement, child)) {
return true;
}
}
}
}
return false;
}

/**
* Logs out metadata information.
* @param metadata
Expand Down Expand Up @@ -134,6 +165,7 @@ public void log(final Metadata metadata)
sb.append(NEWLINE);
sb.append(" IsAttr : " + element.getIsAttribute());
sb.append(NEWLINE);
sb.append(NEWLINE);
}

for (MetadataElement element : item.getReferences())
Expand Down Expand Up @@ -177,6 +209,7 @@ public void log(final Metadata metadata)
sb.append(NEWLINE);
sb.append(" IsAttr : " + element.getIsAttribute());
sb.append(NEWLINE);
sb.append(NEWLINE);
}

for (MetadataElement element : item.getReferences())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,6 @@
package org.jboss.shrinkwrap.descriptor.metadata.dom;

import java.io.File;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Logger;

import javax.xml.parsers.DocumentBuilder;
Expand Down

0 comments on commit 12bfedc

Please sign in to comment.