From 790954df7b3959af479a71bae0905c1c11a56fb7 Mon Sep 17 00:00:00 2001
From: knut <>
Date: Thu, 23 Feb 2006 18:49:14 +0000
Subject: Created an XmlLintTask to validate configuration against XML Schema
 Definitions and a new target lint-demos to check both syntax of demo
 configuration and PHP source files

---
 buildscripts/phing/tasks/PhpLintTask.php |   9 ++-
 buildscripts/phing/tasks/XmlLintTask.php | 102 +++++++++++++++++++++++++++++++
 2 files changed, 109 insertions(+), 2 deletions(-)
 create mode 100644 buildscripts/phing/tasks/XmlLintTask.php

(limited to 'buildscripts/phing')

diff --git a/buildscripts/phing/tasks/PhpLintTask.php b/buildscripts/phing/tasks/PhpLintTask.php
index 63ae6dde..2fd89fc3 100644
--- a/buildscripts/phing/tasks/PhpLintTask.php
+++ b/buildscripts/phing/tasks/PhpLintTask.php
@@ -34,6 +34,10 @@ class PhpLintTask extends Task {
    * Execute lint check against PhingFile or a FileSet
    */
   public function main() {
+    if(!isset($this->file) and count($this->filesets) == 0) {
+      throw new BuildException("Missing either a nested fileset or attribute 'file' set");
+    }
+
     if($this->file instanceof PhingFile) {
       $this->lint($this->file->getPath());
     } else { // process filesets
@@ -47,7 +51,6 @@ class PhpLintTask extends Task {
 	}
       }
     }
-    $this->log('No syntax errors detected');
   }
 
   /**
@@ -63,7 +66,9 @@ class PhpLintTask extends Task {
 	$message = array();
 	exec($command.$file, $message);
 	if(!preg_match('/^No syntax errors detected/', $message[0])) {
-	  throw new BuildException($message[1]);
+	  $this->log($message[1], PROJECT_MSG_ERR);
+	} else {
+	  $this->log($file.': No syntax errors detected', PROJECT_MSG_INFO);
 	}
       } else {
 	throw new BuildException('Permission denied: '.$file);
diff --git a/buildscripts/phing/tasks/XmlLintTask.php b/buildscripts/phing/tasks/XmlLintTask.php
new file mode 100644
index 00000000..96f58234
--- /dev/null
+++ b/buildscripts/phing/tasks/XmlLintTask.php
@@ -0,0 +1,102 @@
+<?php
+require_once 'phing/Task.php';
+
+/**
+ * A XML lint task. Checking syntax of one or more XML source file against an XML Schema using the DOM extension.
+ *
+ * @author   Knut Urdalen <knut.urdalen@telio.no>
+ * @package  phing.tasks.ext
+ */
+class XmlLintTask extends Task {
+
+  protected $file;  // the source file (from xml attribute)
+  protected $schema; // the schema file (from xml attribute)
+  protected $filesets = array(); // all fileset objects assigned to this task
+
+  /**
+   * File to be performed syntax check on
+   * @param PhingFile $file
+   */
+  public function setFile(PhingFile $file) {
+    $this->file = $file;
+  }
+
+  public function setSchema(PhingFile $schema) {
+    $this->schema = $schema;
+  }
+  
+  /**
+   * Nested creator, creates a FileSet for this task
+   *
+   * @return FileSet The created fileset object
+   */
+  function createFileSet() {
+    $num = array_push($this->filesets, new FileSet());
+    return $this->filesets[$num-1];
+  }
+
+  /**
+   * Execute lint check against PhingFile or a FileSet
+   */
+  public function main() {
+    if(!isset($this->schema)) {
+      throw new BuildException("Missing attribute 'schema'");
+    }
+    $schema = $this->schema->getPath();
+    if(!file_exists($schema)) {
+      throw new BuildException("File not found: ".$schema);
+    }
+    if(!isset($this->file) and count($this->filesets) == 0) {
+      throw new BuildException("Missing either a nested fileset or attribute 'file' set");
+    }
+
+    set_error_handler(array($this, 'errorHandler'));
+    if($this->file instanceof PhingFile) {
+      $this->lint($this->file->getPath());
+    } else { // process filesets
+      $project = $this->getProject();
+      foreach($this->filesets as $fs) {
+	$ds = $fs->getDirectoryScanner($project);
+	$files = $ds->getIncludedFiles();
+	$dir = $fs->getDir($this->project)->getPath();
+	foreach($files as $file) {
+	  $this->lint($dir.DIRECTORY_SEPARATOR.$file);
+	}
+      }
+    }
+    restore_error_handler();
+  }
+
+  /**
+   * Performs validation
+   *
+   * @param string $file
+   * @return void
+   */
+  protected function lint($file) {
+    if(file_exists($file)) {
+      if(is_readable($file)) {
+	$dom = new DOMDocument();
+	$dom->load($file);
+	if($dom->schemaValidate($this->schema->getPath())) {
+	  $this->log($file.' validated', PROJECT_MSG_INFO);
+	} else {
+	  $this->log($file.' fails to validate (See messages above)', PROJECT_MSG_ERR);
+	}
+      } else {
+	throw new BuildException('Permission denied: '.$file);
+      }
+    } else {
+      throw new BuildException('File not found: '.$file);
+    }
+  }
+
+  public function errorHandler($level, $message, $file, $line, $context) {
+    $matches = array();
+    preg_match('/^.*\(\): (.*)$/', $message, $matches);
+    $this->log($matches[1], PROJECT_MSG_ERR);
+  }
+
+}
+
+?>
\ No newline at end of file
-- 
cgit v1.2.3