All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jpos.util.XmlHelper Maven / Gradle / Ivy

There is a newer version: 4.0.0
Show newest version
package jpos.util;

///////////////////////////////////////////////////////////////////////////////
//
// This software is provided "AS IS".  The JavaPOS working group (including
// each of the Corporate members, contributors and individuals)  MAKES NO
// REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE SOFTWARE,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED 
// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
// NON-INFRINGEMENT. The JavaPOS working group shall not be liable for
// any damages suffered as a result of using, modifying or distributing this
// software or its derivatives. Permission to use, copy, modify, and distribute
// the software and its documentation for any purpose is hereby granted. 
//
// The JavaPOS Config/Loader (aka JCL) is now under the CPL license, which 
// is an OSS Apache-like license.  The complete license is located at:
//    http://www.ibm.com/developerworks/library/os-cpl.html
//
///////////////////////////////////////////////////////////////////////////////

import java.io.*;
import java.util.*;

import jpos.util.tracing.Tracer;
import jpos.util.tracing.TracerFactory;

/**
 * Simple helper class for XML related activities
 * @since 1.3 (SF 2K meeting)
 * @author E. Michael Maximilien ([email protected])
 */
public class XmlHelper extends Object
{
    //-------------------------------------------------------------------------
    // Public methods
    //

	/** @return the current DTD file name */
	public String getDtdFileName() { return dtdFileName; }

	/** @return the current DTD file path */
	public String getDtdFilePath() { return dtdFilePath; }

	/**
	 * Sets the DTD file name that should be extracted by this helper
	 * @param fileName the XML file name
	 */
	public void setDtdFileName( String fileName ) { dtdFileName = fileName; }

	/**
	 * Sets the DTD file path that should be extracted by this helper
	 * @param filePath the XML file name
	 */
	public void setDtdFilePath( String filePath ) 
	{ 
		dtdFilePath = ( filePath.endsWith( File.separator ) ?
						filePath :
						filePath + File.separator ); 
	}

    /**
     * Checks if the dtdFile is available in the DTD path specified if not 
	 * then creates it extracting it from the JAR file
     */
    public void checkAndCreateTempDtd()
    {
        createdTempDTD = false;
        createdTempDir = false;
        InputStream is = null;

		dtdJarFullFileName = dtdFilePath + dtdFileName;

        try
        {
            File dtdPath = new File( dtdFilePath );
            File dtdFile = new File( dtdJarFullFileName );

            if( dtdFile.exists() )
				return;            
            
            if( !dtdPath.exists() )
            {
                dtdPath.mkdirs();

                createdTempDir = true;

				tracer.println( "DTD file PATH does not exist.  Created path " + 
								dtdFilePath );
            }
            
            is = ClassLoader.getSystemClassLoader().getResourceAsStream( dtdJarFullFileName );

			tracer.println( "Got DTD InputStream from current ClassLoader" );

            if( is != null )
				readAndCreateTempDtdFile( is );
        }
        catch( IOException ioe )
        { 
        	tracer.println( "Error creating DTD file: Exception.message = " + 
        	  			    ioe.getMessage() ); 
        }
        finally
        {
            try{ if( is != null ) is.close(); }
            catch( IOException ioe ) 
            {
	        	tracer.println( "Error while closing streams:" +
	        					" Exception.message = " + 
    	    	  			    ioe.getMessage() );             	
            }
        }
    }

    /** Removes the DTD path if it was created */
    public void removeTempDtd()
    {			
        try
        {
            if( createdTempDTD )
            {
                File dtdFile = new File( dtdJarFullFileName );
                dtdFile.delete();

				if( createdTempDir )
					removeDirs( dtdFilePath );
					
				tracer.println( "Removed temp directory with DTD OK" );
            }
        }
        catch( Exception e )
        { 
        	tracer.println( "Error removing temporary DTD file: " +
        	  				"Exception.msg = " + e.getMessage() ); 
       	}
    }

    //-------------------------------------------------------------------------
    // Private methods
    //

	/**
	 * Reads the DTD file from the InputStream provided and creates a temp
	 * @exception java.io.IOException if anything goes wrong
	 */
	private void readAndCreateTempDtdFile( InputStream is ) throws IOException
	{
		File dtdFile = new File( dtdJarFullFileName );
		
		FileOutputStream fos = new FileOutputStream( dtdFile );
		OutputStreamWriter osw = new OutputStreamWriter( fos );

		StringBuffer sb = new StringBuffer();

		while( is.available() > 0 )
		{
			byte[] buffer = new byte[ is.available() ];

			is.read( buffer );

			sb.append( new String( buffer ) );
		}

		osw.write( sb.toString().trim() );

		createdTempDTD = true;

		try
		{ 
			if( osw != null ) osw.close(); 
			if( fos != null ) fos.close(); 
		}
		catch( IOException ioe ) 
		{
			tracer.println( "Error while closing streams: IOExeption.msg=" +
							ioe.getMessage() );
		}

		tracer.println( "Read and created temp " + dtdFilePath + dtdFileName );
	}

	/**
	 * @return a Vector of the different directories from a directory string
	 * @param originalDirName the full directory name
	 */
	private Vector getSubdirNames( String originalDirName )
	{
		String dirName = originalDirName.
						 replace( "\\".charAt( 0 ), "/".charAt( 0 ) );

		if( !dirName.endsWith( "/" ) ) dirName = dirName + "/";

		Vector dirs = new Vector();
		String s = dirName;

		while( s.indexOf( "/" ) != -1 )
		{
			dirs.add( s.substring( 0, s.indexOf( "/" ) ) );
			s = s.substring( s.indexOf( "/" ) + 1 );
		}

		return dirs;
	}

    //-------------------------------------------------------------------------
    // Package methods
    //

	/**
	 * Removes the directory specified by this dirName (including any sub-dirs)
	 * @param dirName the directory name to remove
	 * @exception java.io.IOException if something goes wrong
	 */
	void removeDirs( String dirName ) throws IOException
	{
		Vector subdirNames = getSubdirNames( dirName );

		while( subdirNames.size() > 0 )
		{
			Vector v = (Vector)subdirNames.clone();

			String subdirName = "";
			for( int i = 0; i < subdirNames.size(); ++i )
				subdirName += (String)subdirNames.elementAt( i ) + 
							  File.separator;
		
			File subdirFile = new File( subdirName );
			
			if( subdirFile.list() != null &&
				subdirFile.list().length == 0 )
				subdirFile.delete();

			if( subdirNames.size() > 0 )
				subdirNames.removeElementAt( subdirNames.size() - 1 );
		}
	}

    //-------------------------------------------------------------------------
    // Private instance variables
    //

	private String dtdFileName = DEFAULT_DTD_FILE_NAME;
	private String dtdFilePath = DEFAULT_DTD_FILE_PATH;
	private String dtdJarFullFileName = dtdFilePath + File.separator + 
										 dtdFileName;
    
	private boolean createdTempDTD = false;
    private boolean createdTempDir = false;

	private Tracer tracer = TracerFactory.getInstance().
							 createTracer( "XmlHelper" );

	//-------------------------------------------------------------------------
	// Class constants
	//

	public static final String DEFAULT_DTD_FILE_NAME = "jcl.dtd";
    public static final String DEFAULT_DTD_FILE_PATH = "jpos" + 
    													 File.separator + 
    													 "res" + File.separator;
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy