--- fop/xml-fop/src/org/apache/fop/tools/anttasks/Fop.java	Mon Nov 18 15:37:46 2002
+++ projekte/infotakt/vdp/fop/src/org/apache/fop/tools/anttasks/Fop.java	Thu Feb 13 17:21:48 2003
@@ -34,6 +34,7 @@
 // Avalon
 import org.apache.avalon.framework.logger.ConsoleLogger;
 import org.apache.avalon.framework.logger.Logger;
+import org.apache.tools.ant.util.GlobPatternMapper;
 
 /**
  * Wrapper for Fop which allows it to be accessed from within an Ant task.
@@ -44,7 +45,8 @@
  * <li>outfile -> output filename</li>
  * <li>baseDir -> directory to work from</li>
  * <li>userconfig -> file with user configuration (same as the "-c" command line option)</li>
- * <li>messagelevel -> (info | verbose | debug) level to output non-error messages</li>
+ * <li>messagelevel -> (error | warn | info | verbose | debug) level to output non-error messages</li>
+ * <li>logFiles -> Controls whether the names of the files that are processed are logged or not</li>
  * </ul>
  */
 public class Fop extends Task {
@@ -56,7 +58,8 @@
     File baseDir;
     File userConfig;
     int messageType = Project.MSG_VERBOSE;
-
+    boolean logFiles = true;
+    
     /**
      * Sets the input file
      * @param File to input from
@@ -142,6 +145,10 @@
             messageType = Project.MSG_VERBOSE;
         } else if (messageLevel.equalsIgnoreCase("debug")) {
             messageType = Project.MSG_DEBUG;
+        } else if (messageLevel.equalsIgnoreCase("err") || messageLevel.equalsIgnoreCase("error")) {
+            messageType = Project.MSG_ERR;
+        } else if (messageLevel.equalsIgnoreCase("warn")) {
+            messageType = Project.MSG_WARN;
         } else {
             log("messagelevel set to unknown value \"" + messageLevel +
                 "\"", Project.MSG_ERR);
@@ -173,11 +180,33 @@
     }
 
     /**
+     * Controls whether the filenames of the files that are processed are logged
+     * or not.
+     */
+    public void setLogFiles(boolean aBoolean) {
+      logFiles = aBoolean;
+    }
+    
+    public boolean getLogFiles() {
+      return logFiles;
+    }
+    
+    /**
      * Starts execution of this task
      */
     public void execute() throws BuildException {
+        int logLevel = ConsoleLogger.LEVEL_INFO;
+        switch (getMessageType()) {
+          case Project.MSG_DEBUG  : logLevel = ConsoleLogger.LEVEL_DEBUG; break;
+          case Project.MSG_INFO   : logLevel = ConsoleLogger.LEVEL_INFO; break;
+          case Project.MSG_WARN   : logLevel = ConsoleLogger.LEVEL_WARN; break;
+          case Project.MSG_ERR    : logLevel = ConsoleLogger.LEVEL_ERROR; break;
+          case Project.MSG_VERBOSE: logLevel = ConsoleLogger.LEVEL_DEBUG; break;
+        }
+        Logger log = new ConsoleLogger(logLevel);
+        MessageHandler.setScreenLogger(log);
         try {
-            Starter starter = new FOPTaskStarter(this);
+            Starter starter = new FOPTaskStarter(this, log, logFiles);
             starter.run();
         } catch (FOPException ex) {
             throw new BuildException(ex);
@@ -190,12 +219,12 @@
 class FOPTaskStarter extends Starter {
     Fop task;
     Logger log;
-
-    FOPTaskStarter(Fop task) throws FOPException {
+    boolean logFiles;
+    
+    FOPTaskStarter(Fop task, Logger aLogger, boolean aLogFiles) throws FOPException {
         this.task = task;
-
-    log = new ConsoleLogger(ConsoleLogger.LEVEL_INFO);
-    MessageHandler.setScreenLogger(log);
+        log = aLogger;
+        logFiles = aLogFiles;
     }
 
     private int determineRenderer(String format) {
@@ -221,7 +250,6 @@
             return Driver.RENDER_XML;
         } else {
             String err = "Couldn't determine renderer to use: "+format;
-            log.error(err);
             throw new BuildException(err);
         }
     }
@@ -242,7 +270,6 @@
                 return ".xml";
             default:
                 String err = "Unknown renderer: "+renderer;
-                log.error(err);
                 throw new BuildException(err);
         }
     }
@@ -277,7 +304,8 @@
             task.log("Using base directory: " +
                      Configuration.getValue("baseDir"), Project.MSG_DEBUG);
         } catch (Exception e) {
-            log.error("Error setting base directory",e);
+          
+            task.log("Error setting base directory: " + e, Project.MSG_ERR);
         }
 
         int rint = determineRenderer(task.getFormat());
@@ -300,17 +328,28 @@
             }
         }
 
+        GlobPatternMapper mapper = new GlobPatternMapper();
+        mapper.setFrom("*.fo");
+        mapper.setTo("*" + newExtension);
+        
         // deal with the filesets
         for (int i = 0; i < task.filesets.size(); i++) {
             FileSet fs = (FileSet) task.filesets.get(i);
             DirectoryScanner ds = fs.getDirectoryScanner(task.getProject());
             String[] files = ds.getIncludedFiles();
 
+            
             for (int j = 0; j < files.length; j++) {
                 File f = new File(fs.getDir(task.getProject()), files[j]);
-                File outf = replaceExtension(f, ".fo", newExtension);
-                if (task.getOutdir() != null) {
-                    outf = new File(task.getOutdir(), outf.getName());
+                File outf = null;
+                if (task.getOutdir() != null && files[j].endsWith(".fo")) {
+                  String[] sa = mapper.mapFileName(files[j]);
+                  outf = new File(task.getOutdir(), sa[0]);
+                } else {
+                  outf = replaceExtension(f, ".fo", newExtension);
+                  if (task.getOutdir() != null) {
+                      outf = new File(task.getOutdir(), outf.getName());
+                  }
                 }
                 try {
                     if (task.getBasedir() != null) {
@@ -325,7 +364,7 @@
                     task.log("Using base directory: " +
                              Configuration.getValue("baseDir"), Project.MSG_DEBUG);
                 } catch (Exception e) {
-                    log.error("Error setting base directory", e);
+                    task.log("Error setting base directory: " + e, Project.MSG_ERR);
                 }
 
                 render(f, outf, rint);
@@ -347,13 +386,14 @@
 
         FileOutputStream out = null;
         try {
+            File dir = outFile.getParentFile();
+            dir.mkdirs();
             out = new FileOutputStream(outFile);
         } catch (Exception ex) {
-            log.error("Failed to open " + outFile);
             throw new BuildException(ex);
         }
 
-        task.log(foFile + " -> " + outFile, Project.MSG_INFO);
+        if (logFiles) task.log(foFile + " -> " + outFile, Project.MSG_INFO);
 
         try {
             Driver driver = new Driver(inputHandler.getInputSource(), out);
@@ -368,7 +408,6 @@
             driver.run();
             out.close();
         } catch (Exception ex) {
-            log.error("Couldn't render file: " + ex.getMessage());
             throw new BuildException(ex);
         }
     }
