/*------------------------------------------------------------------------------
* PACKAGE: com.freeware.inifiles
* FILE : iniFile.java
* CREATED: Jun 30, 2004
* AUTHOR : Prasad P. Khandekar
*------------------------------------------------------------------------------
* Change Log:
* 05/07/2004 - Added support for date time formats.
* Added support for environment variables.
* 07/07/2004 - Added support for data type specific getters and setters.
* Updated main method to reflect above changes.
* 26/08/2004 - Added support for section level and property level comments.
* Introduction of seperate class for property values.
* Added addSection method.
* Sections and properties now retail their order (LinkedHashMap)
* Method implementation changes.
*-----------------------------------------------------------------------------*/
//package com.freeware.inifiles;
package testejavadesktop;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.Writer;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Properties;
import java.util.Set;
/**
* INIFile class provides methods for manipulating (Read/Write) windows ini files.
*
* @author Prasad P. Khandekar
* @version 1.0
* @since 1.0
*/
public final class INIFile
{
/** Variable to represent the date format */
private String mstrDateFmt = "yyyy-MM-dd";
/** Variable to represent the timestamp format */
private String mstrTimeStampFmt = "yyyy-MM-dd HH:mm:ss";
/** Variable to denote the successfull load operation. */
private boolean mblnLoaded = false;
/** Variable to hold the ini file name and full path */
private String mstrFile;
/** Variable to hold the sections in an ini file. */
private LinkedHashMap mhmapSections;
/** Variable to hold environment variables **/
private Properties mpropEnv;
/**
* Create a iniFile object from the file named in the parameter.
* @param pstrPathAndName The full path and name of the ini file to be used.
*/
public INIFile(String pstrPathAndName)
{
this.mpropEnv = getEnvVars();
this.mhmapSections = new LinkedHashMap();
this.mstrFile = pstrPathAndName;
// Load the specified INI file.
if (checkFile(pstrPathAndName)) loadFile();
}
/*------------------------------------------------------------------------------
* Getters
------------------------------------------------------------------------------*/
/**
* Returns the ini file name being used.
* @return the INI file name.
*/
public String getFileName()
{
return this.mstrFile;
}
/**
* Returns the specified string property from the specified section.
* @param pstrSection the INI section name.
* @param pstrProp the property to be retrieved.
* @return the string property value.
*/
public String getStringProperty(String pstrSection, String pstrProp)
{
String strRet = null;
INIProperty objProp = null;
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec != null)
{
objProp = objSec.getProperty(pstrProp);
if (objProp != null)
{
strRet = objProp.getPropValue();
objProp = null;
}
objSec = null;
}
return strRet;
}
/**
* Returns the specified boolean property from the specified section.
* This method considers the following values as boolean values.
* <ol>
* <li>YES/yes/Yes - boolean true</li>
* <li>NO/no/No - boolean false</li>
* <li>1 - boolean true</li>
* <li>0 - boolean false</li>
* <li>TRUE/True/true - boolean true</li>
* <li>FALSE/False/false - boolean false</li>
* </ol>
* @param pstrSection the INI section name.
* @param pstrProp the property to be retrieved.
* @return the boolean value
*/
public Boolean getBooleanProperty(String pstrSection, String pstrProp)
{
boolean blnRet = false;
String strVal = null;
INIProperty objProp = null;
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec != null)
{
objProp = objSec.getProperty(pstrProp);
if (objProp != null)
{
strVal = objProp.getPropValue().toUpperCase();
if (strVal.equals("YES") || strVal.equals("TRUE") ||
strVal.equals("1"))
{
blnRet = true;
}
objProp = null;
}
objSec = null;
}
return new Boolean(blnRet);
}
/**
* Returns the specified integer property from the specified section.
* @param pstrSection the INI section name.
* @param pstrProp the property to be retrieved.
* @return the integer property value.
*/
public Integer getIntegerProperty(String pstrSection, String pstrProp)
{
Integer intRet = null;
String strVal = null;
INIProperty objProp = null;
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec != null)
{
objProp = objSec.getProperty(pstrProp);
try
{
if (objProp != null)
{
strVal = objProp.getPropValue();
if (strVal != null) intRet = new Integer(strVal);
}
}
catch (NumberFormatException NFExIgnore)
{
}
finally
{
if (objProp != null) objProp = null;
}
objSec = null;
}
return intRet;
}
/**
* Returns the specified long property from the specified section.
* @param pstrSection the INI section name.
* @param pstrProp the property to be retrieved.
* @return the long property value.
*/
public Long getLongProperty(String pstrSection, String pstrProp)
{
Long lngRet = null;
String strVal = null;
INIProperty objProp = null;
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec != null)
{
objProp = objSec.getProperty(pstrProp);
try
{
if (objProp != null)
{
strVal = objProp.getPropValue();
if (strVal != null) lngRet = new Long(strVal);
}
}
catch (NumberFormatException NFExIgnore)
{
}
finally
{
if (objProp != null) objProp = null;
}
objSec = null;
}
return lngRet;
}
/**
* Returns the specified double property from the specified section.
* @param pstrSection the INI section name.
* @param pstrProp the property to be retrieved.
* @return the double property value.
*/
public Double getDoubleProperty(String pstrSection, String pstrProp)
{
Double dblRet = null;
String strVal = null;
INIProperty objProp = null;
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec != null)
{
objProp = objSec.getProperty(pstrProp);
try
{
if (objProp != null)
{
strVal = objProp.getPropValue();
if (strVal != null) dblRet = new Double(strVal);
}
}
catch (NumberFormatException NFExIgnore)
{
}
finally
{
if (objProp != null) objProp = null;
}
objSec = null;
}
return dblRet;
}
/**
* Returns the specified date property from the specified section.
* @param pstrSection the INI section name.
* @param pstrProp the property to be retrieved.
* @return the date property value.
*/
public Date getDateProperty(String pstrSection, String pstrProp)
{
Date dtRet = null;
String strVal = null;
DateFormat dtFmt = null;
INIProperty objProp = null;
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec != null)
{
objProp = objSec.getProperty(pstrProp);
try
{
if (objProp != null) strVal = objProp.getPropValue();
if (strVal != null)
{
dtFmt = new SimpleDateFormat(this.mstrDateFmt);
dtRet = dtFmt.parse(strVal);
}
}
catch (ParseException PExIgnore)
{
}
catch (IllegalArgumentException IAEx)
{
}
finally
{
if (objProp != null) objProp = null;
}
objSec = null;
}
return dtRet;
}
/**
* Returns the specified date property from the specified section.
* @param pstrSection the INI section name.
* @param pstrProp the property to be retrieved.
* @return the date property value.
*/
public Date getTimestampProperty(String pstrSection, String pstrProp)
{
Timestamp tsRet = null;
Date dtTmp = null;
String strVal = null;
DateFormat dtFmt = null;
INIProperty objProp = null;
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec != null)
{
objProp = objSec.getProperty(pstrProp);
try
{
if (objProp != null) strVal = objProp.getPropValue();
if (strVal != null)
{
dtFmt = new SimpleDateFormat(this.mstrDateFmt);
dtTmp = dtFmt.parse(strVal);
tsRet = new Timestamp(dtTmp.getTime());
}
}
catch (ParseException PExIgnore)
{
}
catch (IllegalArgumentException IAEx)
{
}
finally
{
if (objProp != null) objProp = null;
}
objSec = null;
}
return tsRet;
}
/*------------------------------------------------------------------------------
* Setters
------------------------------------------------------------------------------*/
/**
* Sets the comments associated with a section.
* @param pstrSection the section name
* @param pstrComments the comments.
*/
public void addSection(String pstrSection, String pstrComments)
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec == null)
{
objSec = new INISection(pstrSection);
this.mhmapSections.put(pstrSection, objSec);
}
objSec.setSecComments(delRemChars(pstrComments));
objSec = null;
}
/**
* Sets the specified string property.
* @param pstrSection the INI section name.
* @param pstrProp the property to be set.
* @pstrVal the string value to be persisted
*/
public void setStringProperty(String pstrSection, String pstrProp,
String pstrVal, String pstrComments)
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec == null)
{
objSec = new INISection(pstrSection);
this.mhmapSections.put(pstrSection, objSec);
}
objSec.setProperty(pstrProp, pstrVal, pstrComments);
}
/**
* Sets the specified boolean property.
* @param pstrSection the INI section name.
* @param pstrProp the property to be set.
* @param pblnVal the boolean value to be persisted
*/
public void setBooleanProperty(String pstrSection, String pstrProp,
boolean pblnVal, String pstrComments)
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec == null)
{
objSec = new INISection(pstrSection);
this.mhmapSections.put(pstrSection, objSec);
}
if (pblnVal)
objSec.setProperty(pstrProp, "TRUE", pstrComments);
else
objSec.setProperty(pstrProp, "FALSE", pstrComments);
}
/**
* Sets the specified integer property.
* @param pstrSection the INI section name.
* @param pstrProp the property to be set.
* @param pintVal the int property to be persisted.
*/
public void setIntegerProperty(String pstrSection, String pstrProp,
int pintVal, String pstrComments)
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec == null)
{
objSec = new INISection(pstrSection);
this.mhmapSections.put(pstrSection, objSec);
}
objSec.setProperty(pstrProp, Integer.toString(pintVal), pstrComments);
}
/**
* Sets the specified long property.
* @param pstrSection the INI section name.
* @param pstrProp the property to be set.
* @param plngVal the long value to be persisted.
*/
public void setLongProperty(String pstrSection, String pstrProp,
long plngVal, String pstrComments)
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec == null)
{
objSec = new INISection(pstrSection);
this.mhmapSections.put(pstrSection, objSec);
}
objSec.setProperty(pstrProp, Long.toString(plngVal), pstrComments);
}
/**
* Sets the specified double property.
* @param pstrSection the INI section name.
* @param pstrProp the property to be set.
* @param pdblVal the double value to be persisted.
*/
public void setDoubleProperty(String pstrSection, String pstrProp,
double pdblVal, String pstrComments)
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec == null)
{
objSec = new INISection(pstrSection);
this.mhmapSections.put(pstrSection, objSec);
}
objSec.setProperty(pstrProp, Double.toString(pdblVal), pstrComments);
}
/**
* Sets the specified java.util.Date property.
* @param pstrSection the INI section name.
* @param pstrProp the property to be set.
* @param pdtVal the date value to be persisted.
*/
public void setDateProperty(String pstrSection, String pstrProp,
Date pdtVal, String pstrComments)
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec == null)
{
objSec = new INISection(pstrSection);
this.mhmapSections.put(pstrSection, objSec);
}
objSec.setProperty(pstrProp, utilDateToStr(pdtVal, this.mstrDateFmt),
pstrComments);
}
/**
* Sets the specified java.sql.Timestamp property.
* @param pstrSection the INI section name.
* @param pstrProp the property to be set.
* @param ptsVal the timestamp value to be persisted.
*/
public void setTimestampProperty(String pstrSection, String pstrProp,
Timestamp ptsVal, String pstrComments)
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec == null)
{
objSec = new INISection(pstrSection);
this.mhmapSections.put(pstrSection, objSec);
}
objSec.setProperty(pstrProp, timeToStr(ptsVal, this.mstrTimeStampFmt),
pstrComments);
}
/**
* Sets the format to be used to interpreat date values.
* @param pstrDtFmt the format string
* @throws IllegalArgumentException if the if the given pattern is invalid
*/
public void setDateFormat(String pstrDtFmt) throws IllegalArgumentException
{
if (!checkDateTimeFormat(pstrDtFmt))
throw new IllegalArgumentException("The specified date pattern is invalid!");
this.mstrDateFmt = pstrDtFmt;
}
/**
* Sets the format to be used to interpreat timestamp values.
* @param pstrTSFmt the format string
* @throws IllegalArgumentException if the if the given pattern is invalid
*/
public void setTimeStampFormat(String pstrTSFmt)
{
if (!checkDateTimeFormat(pstrTSFmt))
throw new IllegalArgumentException("The specified timestamp pattern is invalid!");
this.mstrTimeStampFmt = pstrTSFmt;
}
/*------------------------------------------------------------------------------
* Public methods
------------------------------------------------------------------------------*/
public int getTotalSections()
{
return this.mhmapSections.size();
}
/**
* Returns a string array containing names of all sections in INI file.
* @return the string array of section names
*/
public String[] getAllSectionNames()
{
int iCntr = 0;
Iterator iter = null;
String[] arrRet = null;
try
{
if (this.mhmapSections.size() > 0)
{
arrRet = new String[this.mhmapSections.size()];
for (iter = this.mhmapSections.keySet().iterator();;iter.hasNext())
{
arrRet[iCntr] = (String) iter.next();
iCntr++;
}
}
}
catch (NoSuchElementException NSEExIgnore)
{
}
finally
{
if (iter != null) iter = null;
}
return arrRet;
}
/**
* Returns a string array containing names of all the properties under specified section.
* @param pstrSection the name of the section for which names of properties is to be retrieved.
* @return the string array of property names.
*/
public String[] getPropertyNames(String pstrSection)
{
String[] arrRet = null;
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec != null)
{
arrRet = objSec.getPropNames();
objSec = null;
}
return arrRet;
}
/**
* Returns a map containing all the properties under specified section.
* @param pstrSection the name of the section for which properties are to be retrieved.
* @return the map of properties.
*/
public Map getProperties(String pstrSection)
{
Map hmRet = null;
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec != null)
{
hmRet = objSec.getProperties();
objSec = null;
}
return hmRet;
}
/**
* Removed specified property from the specified section. If the specified
* section or the property does not exist, does nothing.
* @param pstrSection the section name.
* @param pstrProp the name of the property to be removed.
*/
public void removeProperty(String pstrSection, String pstrProp)
{
INISection objSec = null;
objSec = (INISection) this.mhmapSections.get(pstrSection);
if (objSec != null)
{
objSec.removeProperty(pstrProp);
objSec = null;
}
}
/**
* Removes the specified section if one exists, otherwise does nothing.
* @param pstrSection the name of the section to be removed.
*/
public void removeSection(String pstrSection)
{
if (this.mhmapSections.containsKey(pstrSection))
this.mhmapSections.remove(pstrSection);
}
/**
* Flush changes back to the disk file. If the disk file does not exists then
* creates the new one.
*/
public boolean save()
{
boolean blnRet = false;
File objFile = null;
String strName = null;
String strTemp = null;
Iterator itrSec = null;
INISection objSec = null;
FileWriter objWriter = null;
try
{
if (this.mhmapSections.size() == 0) return false;
objFile = new File(this.mstrFile);
if (objFile.exists()) objFile.delete();
objWriter = new FileWriter(objFile);
itrSec = this.mhmapSections.keySet().iterator();
while (itrSec.hasNext())
{
strName = (String) itrSec.next();
objSec = (INISection) this.mhmapSections.get(strName);
strTemp = objSec.toString();
objWriter.write(strTemp);
objWriter.write("\r\n");
objSec = null;
}
blnRet = true;
}
catch (IOException IOExIgnore)
{
}
finally
{
if (objWriter != null)
{
closeWriter(objWriter);
objWriter = null;
}
if (objFile != null) objFile = null;
if (itrSec != null) itrSec = null;
}
return blnRet;
}
/*------------------------------------------------------------------------------
* Helper functions
*----------------------------------------------------------------------------*/
/**
* Procedure to read environment variables.
* Thanx to http://www.rgagnon.com/howto.html for this implementation.
*/
private Properties getEnvVars()
{
Process p = null;
Properties envVars = new Properties();
try
{
Runtime r = Runtime.getRuntime();
String OS = System.getProperty("os.name").toLowerCase();
if (OS.indexOf("windows 9") > -1)
{
p = r.exec("command.com /c set");
}
else if ((OS.indexOf("nt") > -1) ||
(OS.indexOf("windows 2000") > -1) ||
(OS.indexOf("windows xp") > -1))
{
p = r.exec("cmd.exe /c set");
}
else
{
// our last hope, we assume Unix (thanks to H. Ware for the fix)
p = r.exec("env");
}
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while((line = br.readLine()) != null)
{
int idx = line.indexOf('=');
String key = line.substring(0, idx);
String value = line.substring(idx + 1);
envVars.setProperty(key, value);
}
}
catch (Exception ExIgnore)
{
}
return envVars;
}
/**
* Helper function to check the date time formats.
* @param pstrDtFmt the date time format string to be checked.
* @return true for valid date/time format, false otherwise.
*/
private boolean checkDateTimeFormat(String pstrDtFmt)
{
boolean blnRet = false;
DateFormat objFmt = null;
try
{
objFmt = new SimpleDateFormat(pstrDtFmt);
blnRet = true;
}
catch (NullPointerException NPExIgnore)
{
}
catch (IllegalArgumentException IAExIgnore)
{
}
finally
{
if (objFmt != null) objFmt = null;
}
return blnRet;
}
/**
* Reads the INI file and load its contentens into a section collection after
* parsing the file line by line.
*/
private void loadFile()
{
int iPos = -1;
String strLine = null;
String strSection = null;
String strRemarks = null;
BufferedReader objBRdr = null;
FileReader objFRdr = null;
INISection objSec = null;
try
{
objFRdr = new FileReader(this.mstrFile);
if (objFRdr != null)
{
objBRdr = new BufferedReader(objFRdr);
if (objBRdr != null)
{
while (objBRdr.ready())
{
iPos = -1;
strLine = null;
strLine = objBRdr.readLine().trim();
if (strLine == null)
{
}
else if (strLine.length() == 0)
{
}
else if (strLine.substring(0, 1).equals(";"))
{
if (strRemarks == null)
strRemarks = strLine.substring(1);
else if (strRemarks.length() == 0)
strRemarks = strLine.substring(1);
else
strRemarks = strRemarks + "\r\n" + strLine.substring(1);
}
else if (strLine.startsWith("[") && strLine.endsWith("]"))
{
// Section start reached create new section
if (objSec != null)
this.mhmapSections.put(strSection.trim(), objSec);
objSec = null;
strSection = strLine.substring(1, strLine.length() - 1);
objSec = new INISection(strSection.trim(), strRemarks);
strRemarks = null;
}
else if ((iPos = strLine.indexOf("=")) > 0 && objSec != null)
{
// read the key value pair 012345=789
objSec.setProperty(strLine.substring(0, iPos).trim(),
strLine.substring(iPos + 1).trim(),
strRemarks);
strRemarks = null;
}
}
if (objSec != null)
this.mhmapSections.put(strSection.trim(), objSec);
this.mblnLoaded = true;
}
}
}
catch (FileNotFoundException FNFExIgnore)
{
this.mhmapSections.clear();
}
catch (IOException IOExIgnore)
{
this.mhmapSections.clear();
}
catch (NullPointerException NPExIgnore)
{
this.mhmapSections.clear();
}
finally
{
if (objBRdr != null)
{
closeReader(objBRdr);
objBRdr = null;
}
if (objFRdr != null)
{
closeReader(objFRdr);
objFRdr = null;
}
if (objSec != null) objSec = null;
}
}
/**
* Helper function to close a reader object.
* @param pobjRdr the reader to be closed.
*/
private void closeReader(Reader pobjRdr)
{
if (pobjRdr == null) return;
try
{
pobjRdr.close();
}
catch (IOException IOExIgnore)
{
}
}
/**
* Helper function to close a writer object.
* @param pobjWriter the writer to be closed.
*/
private void closeWriter(Writer pobjWriter)
{
if (pobjWriter == null) return;
try
{
pobjWriter.close();
}
catch (IOException IOExIgnore)
{
}
}
/**
* Helper method to check the existance of a file.
* @param the full path and name of the file to be checked.
* @return true if file exists, false otherwise.
*/
private boolean checkFile(String pstrFile)
{
boolean blnRet = false;
File objFile = null;
try
{
objFile = new File(pstrFile);
blnRet = (objFile.exists() && objFile.isFile());
}
catch (Exception e)
{
blnRet = false;
}
finally
{
if (objFile != null) objFile = null;
}
return blnRet;
}
/**
* Converts a java.util.date into String
* @param pd Date that need to be converted to String
* @param pstrFmt The date format pattern.
* @return String
*/
private String utilDateToStr(Date pdt, String pstrFmt)
{
String strRet = null;
SimpleDateFormat dtFmt = null;
try
{
dtFmt = new SimpleDateFormat(pstrFmt);
strRet = dtFmt.format(pdt);
}
catch (Exception e)
{
strRet = null;
}
finally
{
if (dtFmt != null) dtFmt = null;
}
return strRet;
}
/**
* Converts the given sql timestamp object to a string representation. The format
* to be used is to be obtained from the configuration file.
*
* @param pobjTS the sql timestamp object to be converted.
* @param pblnGMT If true formats the string using GMT timezone
* otherwise using local timezone.
* @return the formatted string representation of the timestamp.
*/
private String timeToStr(Timestamp pobjTS, String pstrFmt)
{
String strRet = null;
SimpleDateFormat dtFmt = null;
try
{
dtFmt = new SimpleDateFormat(pstrFmt);
strRet = dtFmt.format(pobjTS);
}
catch (IllegalArgumentException iae)
{
strRet = "";
}
catch (NullPointerException npe)
{
strRet = "";
}
finally
{
if (dtFmt != null) dtFmt = null;
}
return strRet;
}
/**
* This function deletes the remark characters ';' from source string
* @param pstrSrc the source string
* @return the converted string
*/
private String delRemChars(String pstrSrc)
{
int intPos = 0;
if (pstrSrc == null) return null;
while ((intPos = pstrSrc.indexOf(";")) >= 0)
{
if (intPos == 0)
pstrSrc = pstrSrc.substring(intPos + 1);
else if (intPos > 0)
pstrSrc = pstrSrc.substring(0, intPos) + pstrSrc.substring(intPos + 1);
}
return pstrSrc;
}
/**
* This function adds a remark character ';' in source string.
* @param pstrSrc source string
* @return converted string.
*/
private String addRemChars(String pstrSrc)
{
int intLen = 2;
int intPos = 0;
int intPrev = 0;
String strLeft = null;
String strRight = null;
if (pstrSrc == null) return null;
while (intPos >= 0)
{
intLen = 2;
intPos = pstrSrc.indexOf("\r\n", intPrev);
if (intPos < 0)
{
intLen = 1;
intPos = pstrSrc.indexOf("\n", intPrev);
if (intPos < 0) intPos = pstrSrc.indexOf("\r", intPrev);
}
if (intPos == 0)
{
pstrSrc = ";\r\n" + pstrSrc.substring(intPos + intLen);
intPrev = intPos + intLen + 1;
}
else if (intPos > 0)
{
strLeft = pstrSrc.substring(0, intPos);
strRight = pstrSrc.substring(intPos + intLen);
if (strRight == null)
pstrSrc = strLeft;
else if (strRight.length() == 0)
pstrSrc = strLeft;
else
pstrSrc = strLeft + "\r\n;" + strRight;
intPrev = intPos + intLen + 1;
}
}
if (!pstrSrc.substring(0, 1).equals(";"))
pstrSrc = ";" + pstrSrc;
pstrSrc = pstrSrc + "\r\n";
return pstrSrc;
}
/*------------------------------------------------------------------------------
* Main entry point to test the functionality.
*----------------------------------------------------------------------------*/
/**
* The main entry point for testing.
* @param pstrArgs the command line arguments array if any.
*/
public static void main(String[] pstrArgs)
{
INIFile objINI = null;
String strFile = null;
if (pstrArgs.length == 0) return;
strFile = pstrArgs[0];
// Following call will load the strFile if one exists.
objINI = new INIFile(strFile);
// objINI.addSection("QADatabase", "QA database connection details\nUsed for QA Testing");
// objINI.setStringProperty("QADatabase", "SID", "ORCL", null);
// objINI.setStringProperty("QADatabase", "UserId", "System", null);
// objINI.setStringProperty("QADatabase", "Password", "Manager", null);
// objINI.setStringProperty("QADatabase", "HostName", "DBServer", null);
// objINI.setIntegerProperty("QADatabase", "Port", 1521, null);
// objINI.setStringProperty("QADatabase", "OracleHome", "%ORACLE_HOME%", null);
//
//objINI.setSectionComments("Folders", "Directories where generated files are stored");
objINI.setStringProperty("Folders", "folder1", "G:\\Temp", null);
objINI.setStringProperty("Folders", "folder2", "G:\\Temp\\Backup", null);
// Save changes back to strFile.
objINI.save();
objINI = null;
}
/*------------------------------------------------------------------------------
* Private class representing the INI Section.
*----------------------------------------------------------------------------*/
/**
* Class to represent the individual ini file section.
* @author Prasad P. Khandekar
* @version 1.0
* @since 1.0
*/
private class INISection
{
/** Variable to hold any comments associated with this section */
private String mstrComment;
/** Variable to hold the section name. */
private String mstrName;
/** Variable to hold the properties falling under this section. */
private LinkedHashMap mhmapProps;
/**
* Construct a new section object identified by the name specified in
* parameter.
* @param pstrSection The new sections name.
*/
public INISection(String pstrSection)
{
this.mstrName = pstrSection;
this.mhmapProps = new LinkedHashMap();
}
/**
* Construct a new section object identified by the name specified in
* parameter and associated comments.
* @param pstrSection The new sections name.
* @param pstrComments the comments associated with this section.
*/
public INISection(String pstrSection, String pstrComments)
{
this.mstrName = pstrSection;
this.mstrComment = delRemChars(pstrComments);
this.mhmapProps = new LinkedHashMap();
}
/**
* Returns any comments associated with this section
* @return the comments
*/
public String getSecComments()
{
return this.mstrComment;
}
/**
* Returns name of the section.
* @return Name of the section.
*/
public String getSecName()
{
return this.mstrName;
}
/**
* Sets the comments associated with this section.
* @param pstrComments the comments
*/
public void setSecComments(String pstrComments)
{
this.mstrComment = delRemChars(pstrComments);
}
/**
* Sets the section name.
* @param pstrName the section name.
*/
public void setSecName(String pstrName)
{
this.mstrName = pstrName;
}
/**
* Removes specified property value from this section.
* @param pstrProp The name of the property to be removed.
*/
public void removeProperty(String pstrProp)
{
if (this.mhmapProps.containsKey(pstrProp))
this.mhmapProps.remove(pstrProp);
}
/**
* Creates or modifies the specified property value.
* @param pstrProp The name of the property to be created or modified.
* @param pstrValue The new value for the property.
* @param pstrComments the associated comments
*/
public void setProperty(String pstrProp, String pstrValue, String pstrComments)
{
this.mhmapProps.put(pstrProp, new INIProperty(pstrProp, pstrValue, pstrComments));
}
/**
* Returns a map of all properties.
* @return a map of all properties
*/
public Map getProperties()
{
return Collections.unmodifiableMap(this.mhmapProps);
}
/**
* Returns a string array containing names of all the properties under
* this section.
* @return the string array of property names.
*/
public String[] getPropNames()
{
int iCntr = 0;
String[] arrRet = null;
Iterator iter = null;
try
{
if (this.mhmapProps.size() > 0)
{
arrRet = new String[this.mhmapProps.size()];
for (iter = this.mhmapProps.keySet().iterator();iter.hasNext();)
{
arrRet[iCntr] = (String) iter.next();
iCntr++;
}
}
}
catch (NoSuchElementException NSEExIgnore)
{
arrRet = null;
}
return arrRet;
}
/**
* Returns underlying value of the specified property.
* @param pstrProp the property whose underlying value is to be etrieved.
* @return the property value.
*/
public INIProperty getProperty(String pstrProp)
{
INIProperty objRet = null;
if (this.mhmapProps.containsKey(pstrProp))
objRet = (INIProperty) this.mhmapProps.get(pstrProp);
return objRet;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString()
{
Set colKeys = null;
String strRet = "";
Iterator iter = null;
INIProperty objProp = null;
StringBuffer objBuf = new StringBuffer();
if (this.mstrComment != null)
objBuf.append(addRemChars(this.mstrComment));
objBuf.append("[" + this.mstrName + "]\r\n");
colKeys = this.mhmapProps.keySet();
if (colKeys != null)
{
iter = colKeys.iterator();
if (iter != null)
{
while (iter.hasNext())
{
objProp = (INIProperty) this.mhmapProps.get(iter.next());
objBuf.append(objProp.toString());
objBuf.append("\r\n");
objProp = null;
}
}
}
strRet = objBuf.toString();
objBuf = null;
iter = null;
colKeys = null;
return strRet;
}
}
/*------------------------------------------------------------------------------
* Private class representing the INI Property.
*----------------------------------------------------------------------------*/
/**
* This class represents a key value pair called property in an INI file.
* @author Prasad P. Khandekar
* @version 1.0
* @since 1.0
*/
private class INIProperty
{
/** Variable to hold name of this property */
private String mstrName;
/** Variable to hold value of this property */
private String mstrValue;
/** Variable to hold comments associated with this property */
private String mstrComments;
/**
* Constructor
* @param pstrName the name of this property.
* @param pstrValue the value of this property.
*/
public INIProperty(String pstrName, String pstrValue)
{
this.mstrName = pstrName;
this.mstrValue = pstrValue;
}
/**
* Constructor
* @param pstrName the name of this property.
* @param pstrValue the value of this property.
* @param pstrComments the comments associated with this property.
*/
public INIProperty(String pstrName, String pstrValue, String pstrComments)
{
this.mstrName = pstrName;
this.mstrValue = pstrValue;
this.mstrComments = delRemChars(pstrComments);
}
/**
* Returns the string identifier (key part) of this property.
* @return the string identifier of this property.
*/
public String getPropName()
{
return this.mstrName;
}
/**
* Returns value of this property. If value contains a reference to
* environment avriable then this reference is replaced by actual value
* before the value is returned.
* @return the value of this property.
*/
public String getPropValue()
{
int intStart = 0;
int intEnd = 0;
String strVal = null;
String strVar = null;
String strRet = null;
strRet = this.mstrValue;
intStart = strRet.indexOf("%");
if (intStart >= 0)
{
intEnd = strRet.indexOf("%", intStart + 1);
strVar = strRet.substring(intStart + 1, intEnd);
strVal = mpropEnv.getProperty(strVar);
if (strVal != null)
{
strRet = strRet.substring(0, intStart) + strVal +
strRet.substring(intEnd + 1);
}
}
return strRet;
}
/**
* Returns comments associated with this property.
* @return the associated comments if any.
*/
public String getPropComments()
{
return this.mstrComments;
}
/**
* Sets the string identifier (key part) of a property
* @param pstrName the string identifier of a property
*/
public void setPropName(String pstrName)
{
this.mstrName = pstrName;
}
/**
* Sets the property value
* @param pstrValue the value for the property
*/
public void setPropValue(String pstrValue)
{
this.mstrValue = pstrValue;
}
/**
* Sets the comments for a property
* @param pstrComments the comments
*/
public void setPropComments(String pstrComments)
{
this.mstrComments = delRemChars(pstrComments);
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString()
{
String strRet = "";
if (this.mstrComments != null)
strRet = addRemChars(mstrComments);
strRet = strRet + this.mstrName + " = " + this.mstrValue;
return strRet;
}
}
}