cocoon-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jer...@apache.org
Subject cvs commit: xml-cocoon2/src/scratchpad/src/org/apache/cocoon/transformation FileWritingTransformer.java
Date Fri, 22 Feb 2002 21:49:54 GMT
jeremy      02/02/22 13:49:54

  Modified:    src/scratchpad/src/org/apache/cocoon/transformation
                        FileWritingTransformer.java
  Log:
  
  
  Revision  Changes    Path
  1.6       +102 -42   xml-cocoon2/src/scratchpad/src/org/apache/cocoon/transformation/FileWritingTransformer.java
  
  Index: FileWritingTransformer.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/transformation/FileWritingTransformer.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- FileWritingTransformer.java	22 Feb 2002 06:58:03 -0000	1.5
  +++ FileWritingTransformer.java	22 Feb 2002 21:49:54 -0000	1.6
  @@ -137,6 +137,7 @@
       private static String FRT_DEFAULT_SERIALIZER = "xml";
       private static String FRT_PROTOCOL = "file:";
       private static String FRT_ACTION_OVERWRITE = "overwrite";
  +    private static String FRT_ACTION_NONE = "none";
       private static String FRT_ACTION_NEW = "new";
   
   
  @@ -170,6 +171,12 @@
       /** Current error message. */
       private String action = null;
   
  +    /** Target file's final destination. */
  +    private File target_file = null;
  +
  +    /** Temporary target file. */
  +    private File temp_target_file = null;
  +
   
       /** True when inside <write> element. */
       private boolean processing;
  @@ -258,7 +265,7 @@
                       this.failed = false;
                       this.message = null;
                       this.target = "";
  -                    this.action = FRT_ACTION_OVERWRITE;
  +                    this.action = FRT_ACTION_NONE;
   
                       // look for the Source
                       String src = a.getValue("",FRT_SRC_ATTRIBUTE);
  @@ -274,40 +281,8 @@
                           source.recycle();
                       }
   
  -                    // open the file
  -                    if (!this.failed) {
  -                        if (!this.target.startsWith(FRT_PROTOCOL)) {
  -                            getLogger().error("FileWritingTransformer failed, the src parameter
 did not resolve to a file:");
  -                            this.failed = true;
  -                            this.message = "the src parameter did not resolve to a file:";
  -                        }
  -                        File file = new File (this.target.substring(5));
  -                        try {
  -                            if (!file.exists()) {
  -                                File dir = file.getParentFile();
  -                                if (!dir.exists() && dir.mkdirs() == true) {
  -                                    getLogger().warn("FileWritingTransformer: made new
directories: " + dir.toString());
  -                                }
  -                                file = new File (this.target.substring(5));
  -                                this.action = FRT_ACTION_NEW;
  -                            } else if (file.isDirectory()) {
  -                                getLogger().error("FileWritingTransformer failed, the src
parameter cannot point to a directory");
  -                                this.failed = true;
  -                                this.message = "the src parameter pointed to a directory";
  -                            }
  -                        } catch (SecurityException se) {
  -                            getLogger().error("FileWritingTransformer failed, did not have
the required file permissions for writing", se);
  -                            this.failed = true;
  -                            this.message = "could not open the file for writing";
  -                        }
  -                        try {
  -                            this.fos = new java.io.FileOutputStream(file);
  -                        } catch (IOException ioe) {
  -                            getLogger().error("FileWritingTransformer failed, could not
open the file for writing", ioe);
  -                            this.failed = true;
  -                            this.message = "could not open the file for writing";
  -                        }
  -                    }
  +										// open the file
  +										if (!this.failed) openFos();
   
                       // which Serializer?
                       String local_serializer = a.getValue("",FRT_SERIALIZER_ATTRIBUTE);
  @@ -371,13 +346,8 @@
                       this.processing = false;
                       getLogger().debug("FileWritingTransformer: Processing Ended");
                       this.manager.release(this.serializer);
  -                    try {
  -                        this.fos.close();
  -                        this.fos = null;
  -                    } catch (IOException e) {
  -                        getLogger().error("FileWritingTransformer failed, could not close
the file", e);
  -                        this.failed = true;
  -                    }
  +                    // close the file
  +                    closeFos();
                       // Report result
                       String result = (this.failed) ? "failed" : "success";
                       AttributesImpl attrs = new AttributesImpl();
  @@ -549,4 +519,94 @@
        */
       public void dispose() {
       }
  +
  +
  +
  +    /**
  +     * cloase the file output stream
  +     */
  +    private void closeFos() {
  +			try {
  +				this.fos.close();
  +				this.fos = null;
  +				if (!this.failed) {
  +					if (target_file.exists()) {
  +						target_file.delete();
  +						this.action = FRT_ACTION_OVERWRITE;
  +					} else {
  +						this.action = FRT_ACTION_NEW;
  +					}
  +					temp_target_file.renameTo(target_file);
  +				} else {
  +					if (temp_target_file.exists()) {
  +						temp_target_file.delete();
  +					}
  +				}
  +			} catch (Exception e) {
  +				getLogger().error("FileWritingTransformer failed, could not close the file", e);
  +				this.failed = true;
  +				this.message = "could not close the file";
  +				try {
  +					temp_target_file.delete();
  +				} catch (SecurityException se) {
  +					getLogger().error("FileWritingTransformer failed, could not delete the temp file:
" + temp_target_file.toString(), e);
  +				}
  +			}
  +		}
  +
  +    /**
  +     * open a file output stream
  +     *
  +     * Implementation:
  +     * Attempts to avoid writing a broken file by writing to a temporary file, 
  +     * then exchanging the temporary for the target on successful completion.
  +     * Attempts to avoid writing while another thread is using the same file, 
  +     * by not overwriting the temporary file.
  +     */
  +    private void openFos() {
  +
  +			// open the file
  +			if (!this.target.startsWith(FRT_PROTOCOL)) {
  +				getLogger().error("FileWritingTransformer failed, the src parameter  did not resolve
to a file:");
  +				this.failed = true;
  +				this.message = "the src parameter did not resolve to a file";
  +			} else {
  +				try {
  +					target_file = new File (this.target.substring(5));
  +					temp_target_file = new File (this.target.substring(5) + ".tmp");
  +					if (!target_file.exists()) {
  +						File dir = target_file.getParentFile();
  +						if (!dir.exists() && dir.mkdirs() == true) {
  +								getLogger().warn("FileWritingTransformer: made new directories: " + dir.toString());
  +						}
  +					} else if (target_file.isDirectory()) {
  +						getLogger().error("FileWritingTransformer failed, the src parameter cannot point
to a directory");
  +						this.failed = true;
  +						this.message = "the src parameter pointed to a directory";
  +					}				
  +					if (!this.failed) {
  +						if (temp_target_file.createNewFile() == true) {
  +							this.fos = new java.io.FileOutputStream(temp_target_file);
  +						} else {
  +							getLogger().error("FileWritingTransformer failed, the file was busy");
  +							this.failed = true;
  +							this.message = "the file was busy";
  +						}
  +					}
  +				} catch (SecurityException se) {
  +					getLogger().error("FileWritingTransformer failed, did not have the required file permissions
for writing", se);
  +					this.failed = true;
  +					this.message = "could not open the file for writing";
  +				} catch (IOException ioe) {
  +					getLogger().error("FileWritingTransformer failed, could not open the file for writing",
ioe);
  +					this.failed = true;
  +					this.message = "could not open the file for writing";
  +				} catch (NullPointerException npe) {
  +					getLogger().error("FileWritingTransformer failed, could not resolve the target", npe);
  +					this.failed = true;
  +					this.message = "could not resolve the target";
  +				}
  +			}
  +    }
  +
   }
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     webmaster@xml.apache.org
To unsubscribe, e-mail:          cocoon-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: cocoon-cvs-help@xml.apache.org


Mime
View raw message