Fixed issue #7 - see documentation for usage

This commit is contained in:
Kingsley Hendrickse 2012-05-25 22:46:57 +01:00
parent cbcc7a2d65
commit eb84479bd2
10 changed files with 194 additions and 111 deletions

View File

@ -1,10 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="gwt" name="GWT">
<configuration />
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_5" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
@ -20,6 +15,7 @@
<excludeFolder url="file://$MODULE_DIR$/target/surefire" />
<excludeFolder url="file://$MODULE_DIR$/target/surefire-reports" />
<excludeFolder url="file://$MODULE_DIR$/target/test-classes" />
<excludeFolder url="file://$MODULE_DIR$/target/work" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
@ -87,7 +83,6 @@
<orderEntry type="library" scope="PROVIDED" name="Maven: jfree:jfreechart:1.0.9" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: jfree:jcommon:1.0.12" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.ant:ant:1.8.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.ant:ant-launcher:1.8.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-digester:commons-digester:1.7" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: javax.mail:mail:1.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jvnet.hudson:activation:1.1.1-hudson-1" level="project" />
@ -102,6 +97,7 @@
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-dao:1.2.9" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-context:2.5" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.codehaus.groovy:groovy-all:1.6.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.ant:ant-launcher:1.7.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: jline:jline:0.9.94" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-web:2.5" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: aopalliance:aopalliance:1.0" level="project" />

View File

@ -0,0 +1,28 @@
package net.masterthought.jenkins;
public class ConfigurationOptions {
public static boolean skippedFailsBuildValue;
public static boolean undefinedFailsBuildValue;
private ConfigurationOptions() {
throw new AssertionError();
}
public static void setSkippedFailsBuild(boolean skippedFailsBuild) {
skippedFailsBuildValue = skippedFailsBuild;
}
public static void setUndefinedFailsBuild(boolean undefinedFailsBuild) {
undefinedFailsBuildValue = undefinedFailsBuild;
}
public static boolean skippedFailsBuild() {
return skippedFailsBuildValue;
}
public static boolean undefinedFailsBuild() {
return undefinedFailsBuildValue;
}
}

View File

@ -27,11 +27,15 @@ public class CucumberReportPublisher extends Recorder {
public final String jsonReportDirectory;
public final String pluginUrlPath;
public final boolean skippedFails;
public final boolean undefinedFails;
@DataBoundConstructor
public CucumberReportPublisher(String jsonReportDirectory, String pluginUrlPath) {
public CucumberReportPublisher(String jsonReportDirectory, String pluginUrlPath, boolean skippedFails, boolean undefinedFails) {
this.jsonReportDirectory = jsonReportDirectory;
this.pluginUrlPath = pluginUrlPath;
this.skippedFails = skippedFails;
this.undefinedFails = undefinedFails;
}
private String[] findJsonFiles(File targetDirectory) {
@ -60,6 +64,8 @@ public class CucumberReportPublisher extends Recorder {
String[] files = findJsonFiles(workspaceJsonReportDirectory);
boolean buildResult = true;
if (files.length != 0) {
listener.getLogger().println("[CucumberReportPublisher] copying json to reports directory: " + targetBuildDirectory);
for (String file : files) {
@ -68,9 +74,10 @@ public class CucumberReportPublisher extends Recorder {
String[] jsonReportFiles = findJsonFiles(targetBuildDirectory);
listener.getLogger().println("[CucumberReportPublisher] Generating HTML reports");
FeatureReportGenerator featureReportGenerator = new FeatureReportGenerator(fullPathToJsonFiles(jsonReportFiles, targetBuildDirectory), targetBuildDirectory, pluginUrlPath, buildNumber, buildProject);
FeatureReportGenerator featureReportGenerator = new FeatureReportGenerator(fullPathToJsonFiles(jsonReportFiles, targetBuildDirectory), targetBuildDirectory, pluginUrlPath, buildNumber, buildProject, skippedFails, undefinedFails);
try {
featureReportGenerator.generateReports();
buildResult = featureReportGenerator.getBuildStatus();
} catch (Exception e) {
e.printStackTrace();
}
@ -80,7 +87,7 @@ public class CucumberReportPublisher extends Recorder {
}
build.addAction(new CucumberReportBuildAction(build));
return true;
return buildResult;
}
private List<String> fullPathToJsonFiles(String[] jsonFiles, File targetBuildDirectory){

View File

@ -30,7 +30,9 @@ public class FeatureReportGenerator {
private List<TagObject> allTags;
private static final String charEncoding = "UTF-8";
public FeatureReportGenerator(List<String> jsonResultFiles, File reportDirectory, String pluginUrlPath, String buildNumber, String buildProject) throws IOException {
public FeatureReportGenerator(List<String> jsonResultFiles, File reportDirectory, String pluginUrlPath, String buildNumber, String buildProject, boolean skippedFails, boolean undefinedFails) throws IOException {
ConfigurationOptions.setSkippedFailsBuild(skippedFails);
ConfigurationOptions.setUndefinedFailsBuild(undefinedFails);
this.jsonResultFiles = parseJsonResults(jsonResultFiles);
this.allFeatures = listAllFeatures();
this.totalSteps = getAllStepStatuses();
@ -41,6 +43,10 @@ public class FeatureReportGenerator {
this.allTags = findTagsInFeatures();
}
public boolean getBuildStatus() {
return !(getTotalFails() > 0);
}
private Map<String, List<Feature>> parseJsonResults(List<String> jsonResultFiles) throws IOException {
Map<String, List<Feature>> featureResults = new HashMap<String, List<Feature>>();
for (String jsonFile : jsonResultFiles) {
@ -103,7 +109,7 @@ public class FeatureReportGenerator {
}
public void generateTagReports() throws Exception {
for(TagObject tagObject : allTags) {
for (TagObject tagObject : allTags) {
VelocityEngine ve = new VelocityEngine();
ve.init(getProperties());
Template featureResult = ve.getTemplate("templates/tagReport.vm");
@ -140,7 +146,7 @@ public class FeatureReportGenerator {
generateReport("tag-overview.html", featureOverview, context);
}
private List<TagObject> findTagsInFeatures() {
private List<TagObject> findTagsInFeatures() {
List<TagObject> tagMap = new ArrayList<TagObject>();
for (Feature feature : allFeatures) {
List<ScenarioTag> scenarioList = new ArrayList<ScenarioTag>();
@ -159,18 +165,18 @@ public class FeatureReportGenerator {
}
}
return tagMap;
}
}
private List<ScenarioTag> addScenarioUnlessExists(List<ScenarioTag> scenarioList, ScenarioTag scenarioTag) {
boolean exists = false;
for(ScenarioTag scenario : scenarioList){
if(scenario.getParentFeatureUri().equalsIgnoreCase(scenarioTag.getParentFeatureUri())
&& scenario.getScenario().getName().equalsIgnoreCase(scenarioTag.getScenario().getName())){
exists = true;
break;
}
for (ScenarioTag scenario : scenarioList) {
if (scenario.getParentFeatureUri().equalsIgnoreCase(scenarioTag.getParentFeatureUri())
&& scenario.getScenario().getName().equalsIgnoreCase(scenarioTag.getScenario().getName())) {
exists = true;
break;
}
}
if (!exists) {
scenarioList.add(scenarioTag);
}
@ -181,8 +187,8 @@ public class FeatureReportGenerator {
for (String tag : tagList) {
boolean exists = false;
TagObject tagObj = null;
for(TagObject tagObject : tagMap){
if(tagObject.getTagName().equalsIgnoreCase(tag)){
for (TagObject tagObject : tagMap) {
if (tagObject.getTagName().equalsIgnoreCase(tag)) {
exists = true;
tagObj = tagObject;
break;
@ -190,8 +196,8 @@ public class FeatureReportGenerator {
}
if (exists) {
List<ScenarioTag> existingTagList = tagObj.getScenarios();
for(ScenarioTag scenarioTag : scenarioList){
existingTagList = addScenarioUnlessExists(existingTagList, scenarioTag);
for (ScenarioTag scenarioTag : scenarioList) {
existingTagList = addScenarioUnlessExists(existingTagList, scenarioTag);
}
tagMap.remove(tagObj);
tagObj.setScenarios(existingTagList);
@ -236,12 +242,12 @@ public class FeatureReportGenerator {
}
private int getTotalTagSteps() {
int steps = 0;
for(TagObject tag : allTags){
for(ScenarioTag scenarioTag : tag.getScenarios()){
steps += scenarioTag.getScenario().getSteps().length;
}
}
int steps = 0;
for (TagObject tag : allTags) {
for (ScenarioTag scenarioTag : tag.getScenarios()) {
steps += scenarioTag.getScenario().getSteps().length;
}
}
return steps;
}
@ -283,15 +289,15 @@ public class FeatureReportGenerator {
private int getTotalTagPasses() {
int passes = 0;
for(TagObject tag : allTags){
passes += tag.getNumberOfPasses();
}
for (TagObject tag : allTags) {
passes += tag.getNumberOfPasses();
}
return passes;
}
private int getTotalTagFails() {
int failed = 0;
for(TagObject tag : allTags){
for (TagObject tag : allTags) {
failed += tag.getNumberOfFailures();
}
return failed;
@ -299,7 +305,7 @@ public class FeatureReportGenerator {
private int getTotalTagSkipped() {
int skipped = 0;
for(TagObject tag : allTags){
for (TagObject tag : allTags) {
skipped += tag.getNumberOfSkipped();
}
return skipped;
@ -320,8 +326,8 @@ public class FeatureReportGenerator {
private int getTotalFeatures() {
return allFeatures.size();
}
private int getTotalTags(){
private int getTotalTags() {
return allTags.size();
}
@ -332,13 +338,13 @@ public class FeatureReportGenerator {
}
return scenarios;
}
private int getTotalTagScenarios(){
private int getTotalTagScenarios() {
int scenarios = 0;
for (TagObject tag : allTags) {
scenarios = scenarios + tag.getScenarios().size();
}
return scenarios;
return scenarios;
}
private void generateReport(String fileName, Template featureResult, VelocityContext context) throws Exception {

View File

@ -8,16 +8,18 @@ import java.util.List;
public class Runner {
public static void main(String[] args) throws Exception {
File rd = new File("/Users/kings/.jenkins/jobs/aaaaa/builds/15/cucumber-html-reports");
File rd = new File("/Users/kings/.jenkins/jobs/cucumber-jvm/builds/7/cucumber-html-reports");
List<String> list = new ArrayList<String>();
// list.add("/Users/kings/.jenkins/jobs/aaaaa/builds/15/cucumber-html-reports/french.json");
// list.add("/Users/kings/.jenkins/jobs/aaaaa/builds/15/cucumber-html-reports/co_cucumber.json");
// list.add("/Users/kings/.jenkins/jobs/aaaaa/builds/15/cucumber-html-reports/ccp_cucumber.json");
// list.add("/Users/kings/.jenkins/jobs/aaaaa/builds/15/cucumber-html-reports/ss_cucumber.json");
list.add("/Users/kings/.jenkins/jobs/aaaaa/builds/15/cucumber-html-reports/local.json");
list.add("/Users/kings/.jenkins/jobs/cucumber-jvm/builds/7/cucumber-html-reports/cucumber.json");
FeatureReportGenerator featureReportGenerator = new FeatureReportGenerator(list,rd,"","15","aaaaa");
FeatureReportGenerator featureReportGenerator = new FeatureReportGenerator(list,rd,"","7","cucumber-jvm",true,true);
featureReportGenerator.generateReports();
boolean result = featureReportGenerator.getBuildStatus();
System.out.println("status: " + result);
}
}

View File

@ -1,5 +1,6 @@
package net.masterthought.jenkins.json;
import net.masterthought.jenkins.ConfigurationOptions;
import org.apache.commons.lang.StringUtils;
import java.util.ArrayList;
@ -47,15 +48,15 @@ public class Element {
return Util.itemExists(contentString) ? Util.result(getStatus()) + StringUtils.join(contentString.toArray(), " ") + Util.closeDiv() : "";
}
public List<String> getTagList(){
public List<String> getTagList() {
return processTags();
}
public boolean hasTags(){
public boolean hasTags() {
return Util.itemExists(tags);
}
private List<String> processTags(){
private List<String> processTags() {
List<String> results = new ArrayList<String>();
if (Util.itemExists(tags)) {
StringClosure<String, Tag> scenarioTags = new StringClosure<String, Tag>() {
@ -63,11 +64,11 @@ public class Element {
return tag.getName();
}
};
results = Util.collectTags(tags, scenarioTags);
}
results = Util.collectTags(tags, scenarioTags);
}
return results;
}
public String getTags() {
String result = "<div class=\"feature-tags\"></div>";
if (Util.itemExists(tags)) {

View File

@ -93,12 +93,12 @@ public class Feature {
public String getFileName() {
List<String> matches = new ArrayList<String>();
for (String line : Splitter.onPattern("/|\\\\").split(uri)) {
String modified = line.replaceAll("\\)|\\(","");
String modified = line.replaceAll("\\)|\\(", "");
modified = StringUtils.deleteWhitespace(modified).trim();
matches.add(modified);
}
matches = matches.subList(1,matches.size());
matches = matches.subList(1, matches.size());
String fileName = Joiner.on("-").join(matches) + ".html";
return fileName;
}

View File

@ -1,5 +1,7 @@
package net.masterthought.jenkins.json;
import net.masterthought.jenkins.ConfigurationOptions;
import java.util.Arrays;
import java.util.List;
@ -15,48 +17,80 @@ public class Step {
this.keyword = keyword;
}
public Row[] getRows(){
public Row[] getRows() {
return rows;
}
public boolean hasRows(){
boolean result = false;
if(rows != null){
if(rows.length > 0){
result = true;
}
}
public boolean hasRows() {
boolean result = false;
if (rows != null) {
if (rows.length > 0) {
result = true;
}
}
return result;
}
public Long getDuration(){
public Long getDuration() {
return result.getDuration();
}
public Util.Status getStatus() {
private Util.Status getInternalStatus() {
return Util.resultMap.get(result.getStatus());
}
public String getDataTableClass(){
String content = "";
Util.Status status = getStatus();
if(status == Util.Status.FAILED){
content = "failed";
} else if(status == Util.Status.PASSED){
content = "passed";
} else if(status == Util.Status.SKIPPED){
content = "skipped";
} else {
content = "";
public Util.Status getStatus() {
// return Util.resultMap.get(result.getStatus());
Util.Status status = getInternalStatus();
Util.Status result = status;
if (ConfigurationOptions.skippedFailsBuild()) {
if (status == Util.Status.SKIPPED || status == Util.Status.FAILED) {
result = Util.Status.FAILED;
}
}
return content;
if (ConfigurationOptions.undefinedFailsBuild()) {
if (status == Util.Status.UNDEFINED || status == Util.Status.FAILED) {
result = Util.Status.FAILED;
}
}
if (status == Util.Status.FAILED) {
result = Util.Status.FAILED;
}
return result;
}
public String getName(){
public String getDataTableClass() {
String content = "";
if(getStatus() == Util.Status.FAILED){
content = Util.result(getStatus()) + "<span class=\"step-keyword\">" + keyword + " </span><span class=\"step-name\">" + name + "</span>" + "<div class=\"step-error-message\"><pre>" + result.getErrorMessage() + "</pre></div>" + Util.closeDiv();
Util.Status status = getStatus();
if (status == Util.Status.FAILED) {
content = "failed";
} else if (status == Util.Status.PASSED) {
content = "passed";
} else if (status == Util.Status.SKIPPED) {
content = "skipped";
} else {
content = "";
}
return content;
}
public String getName() {
String content = "";
if (getStatus() == Util.Status.FAILED) {
String errorMessage = result.getErrorMessage();
if (getInternalStatus() == Util.Status.SKIPPED) {
errorMessage = "Mode: Skipped causes Failure<br/><span class=\"skipped\">This step was skipped</span>";
}
if (getInternalStatus() == Util.Status.UNDEFINED) {
errorMessage = "Mode: Not Implemented causes Failure<br/><span class=\"undefined\">This step is not yet implemented</span>";
}
content = Util.result(getStatus()) + "<span class=\"step-keyword\">" + keyword + " </span><span class=\"step-name\">" + name + "</span>" + "<div class=\"step-error-message\"><pre>" + errorMessage + "</pre></div>" + Util.closeDiv();
} else {
content = Util.result(getStatus()) + "<span class=\"step-keyword\">" + keyword + " </span><span class=\"step-name\">" + name + "</span>" + Util.closeDiv();
}

View File

@ -12,8 +12,17 @@
<f:entry title="Json Reports Path" field="jsonReportDirectory" description="The path relative to the workspace of the json reports generated by cucumber-jvm e.g. target/cucumber">
<f:textbox />
</f:entry>
<f:advanced>
<f:entry title="Plugin Url Path" field="pluginUrlPath" description="The path to the jenkins user content url e.g. http://host:port[/jenkins/]plugin - leave empty if jenkins url root is host:port">
<f:textbox />
</f:entry>
<f:entry title="Skipped Steps Fail the Build" field="skippedFails" description="Tick this if you want skipped steps to cause the build to fail">
<f:checkbox />
</f:entry>
<f:entry title="Pending Steps Fail the Build" field="undefinedFails" description="Tick this if you want pending steps to cause the build to fail">
<f:checkbox />
</f:entry>
</f:advanced>
</j:jelly>

View File

@ -1,28 +1,28 @@
Fri May 25 15:35:24 BST 2012 [debug] AvalonLogChute initialized using file 'velocity.log'
Fri May 25 15:35:24 BST 2012 [trace] *******************************************************************
Fri May 25 15:35:24 BST 2012 [debug] Starting Jakarta Velocity v1.5-SNAPSHOT (compiled: 2006-07-21 06:25:35)
Fri May 25 15:35:24 BST 2012 [trace] RuntimeInstance initializing.
Fri May 25 15:35:24 BST 2012 [debug] Default Properties File: org/apache/velocity/runtime/defaults/velocity.properties
Fri May 25 15:35:24 BST 2012 [debug] Trying to use logger class org.apache.velocity.runtime.log.AvalonLogChute
Fri May 25 15:35:24 BST 2012 [debug] Using logger class org.apache.velocity.runtime.log.AvalonLogChute
Fri May 25 15:35:24 BST 2012 [debug] Default ResourceManager initializing. (class org.apache.velocity.runtime.resource.ResourceManagerImpl)
Fri May 25 15:35:24 BST 2012 [debug] ResourceLoader instantiated: org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
Fri May 25 15:35:24 BST 2012 [trace] ClasspathResourceLoader : initialization complete.
Fri May 25 15:35:24 BST 2012 [debug] ResourceCache: initialized (class org.apache.velocity.runtime.resource.ResourceCacheImpl)
Fri May 25 15:35:24 BST 2012 [trace] Default ResourceManager initialization complete.
Fri May 25 15:35:24 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Literal
Fri May 25 15:35:24 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Macro
Fri May 25 15:35:24 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Parse
Fri May 25 15:35:24 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Include
Fri May 25 15:35:24 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Foreach
Fri May 25 15:35:24 BST 2012 [debug] Created '20' parsers.
Fri May 25 15:35:24 BST 2012 [trace] Velocimacro : initialization starting.
Fri May 25 15:35:24 BST 2012 [debug] Velocimacro : "velocimacro.library" is not set. Trying default library: VM_global_library.vm
Fri May 25 15:35:24 BST 2012 [debug] Velocimacro : Default library not found.
Fri May 25 15:35:24 BST 2012 [debug] Velocimacro : allowInline = true : VMs can be defined inline in templates
Fri May 25 15:35:24 BST 2012 [debug] Velocimacro : allowInlineToOverride = false : VMs defined inline may NOT replace previous VM definitions
Fri May 25 15:35:24 BST 2012 [debug] Velocimacro : allowInlineLocal = false : VMs defined inline will be global in scope if allowed.
Fri May 25 15:35:24 BST 2012 [debug] Velocimacro : autoload off : VM system will not automatically reload global library macros
Fri May 25 15:35:24 BST 2012 [trace] Velocimacro : initialization complete.
Fri May 25 15:35:24 BST 2012 [trace] RuntimeInstance successfully initialized.
Fri May 25 15:35:24 BST 2012 [debug] ResourceManager : found templates/tagOverview.vm with loader org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
Fri May 25 22:39:04 BST 2012 [debug] AvalonLogChute initialized using file 'velocity.log'
Fri May 25 22:39:04 BST 2012 [trace] *******************************************************************
Fri May 25 22:39:04 BST 2012 [debug] Starting Jakarta Velocity v1.5-SNAPSHOT (compiled: 2006-07-21 06:25:35)
Fri May 25 22:39:04 BST 2012 [trace] RuntimeInstance initializing.
Fri May 25 22:39:04 BST 2012 [debug] Default Properties File: org/apache/velocity/runtime/defaults/velocity.properties
Fri May 25 22:39:04 BST 2012 [debug] Trying to use logger class org.apache.velocity.runtime.log.AvalonLogChute
Fri May 25 22:39:04 BST 2012 [debug] Using logger class org.apache.velocity.runtime.log.AvalonLogChute
Fri May 25 22:39:04 BST 2012 [debug] Default ResourceManager initializing. (class org.apache.velocity.runtime.resource.ResourceManagerImpl)
Fri May 25 22:39:04 BST 2012 [debug] ResourceLoader instantiated: org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
Fri May 25 22:39:04 BST 2012 [trace] ClasspathResourceLoader : initialization complete.
Fri May 25 22:39:04 BST 2012 [debug] ResourceCache: initialized (class org.apache.velocity.runtime.resource.ResourceCacheImpl)
Fri May 25 22:39:04 BST 2012 [trace] Default ResourceManager initialization complete.
Fri May 25 22:39:04 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Literal
Fri May 25 22:39:04 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Macro
Fri May 25 22:39:04 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Parse
Fri May 25 22:39:04 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Include
Fri May 25 22:39:04 BST 2012 [debug] Loaded System Directive: org.apache.velocity.runtime.directive.Foreach
Fri May 25 22:39:04 BST 2012 [debug] Created '20' parsers.
Fri May 25 22:39:04 BST 2012 [trace] Velocimacro : initialization starting.
Fri May 25 22:39:04 BST 2012 [debug] Velocimacro : "velocimacro.library" is not set. Trying default library: VM_global_library.vm
Fri May 25 22:39:04 BST 2012 [debug] Velocimacro : Default library not found.
Fri May 25 22:39:04 BST 2012 [debug] Velocimacro : allowInline = true : VMs can be defined inline in templates
Fri May 25 22:39:04 BST 2012 [debug] Velocimacro : allowInlineToOverride = false : VMs defined inline may NOT replace previous VM definitions
Fri May 25 22:39:04 BST 2012 [debug] Velocimacro : allowInlineLocal = false : VMs defined inline will be global in scope if allowed.
Fri May 25 22:39:04 BST 2012 [debug] Velocimacro : autoload off : VM system will not automatically reload global library macros
Fri May 25 22:39:04 BST 2012 [trace] Velocimacro : initialization complete.
Fri May 25 22:39:04 BST 2012 [trace] RuntimeInstance successfully initialized.
Fri May 25 22:39:04 BST 2012 [debug] ResourceManager : found templates/tagOverview.vm with loader org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader