Class PropertyParser

java.lang.Object
com.randomnoun.common.PropertyParser

public class PropertyParser extends Object
The PropertyParser class parses a property definition text file into a Properties object.

This parser differs from the standard Properties parser in that sections can be marked off for particular regions (e.g. properties that only take effect in development, or when run on certain machines). The current region is specified by the com.randomnoun.common.mode system property set on the VM commandline. If this system property is not set, the region defaults to the value "localhost-dev-unknown". An alternate constructor exists if you wish to specify the region manually.

Environments are specified in 'machine-release-subsystem' format, with each segment set as follows:

  • machine - the hostname of the system (in lowercase)
  • release - the development phase of the system (either set to dev, xpt, prd for development, acceptance or production
  • subsystem - the subsystem that this VM represents.

Properties are specified in the standard "propertyName=propertyValue" method. Whitespace is removed from either side of the '=' character. New-lines can be specified in the property value by using the escape sequence '\n'. Lines can be continued over a single line by placing the character '\' at at the end of the line to be continued; e.g.

   property1=value1
   property2=this is a very long value for property2, which spans \
             over a single line.
 

Properties that are specific to a particular region should be surrounded by the lines "STARTENVIRONMENT environmentMask" and "ENDENVIRONMENT environmentMask". Individual properties can be defined for a region by prefixing the line with "ENV environmentMask"; e.g.

   property1=all regions

   STARTENVIRONMENT *-xpt-*
     property2=this property only set in acceptance region
     property3=same for this property
   ENDENVIRONMENT

   STARTENVIRONMENT dtp11523-dev-*
     property2=these properties only set in the development region
     property3=running on the host dtp11523
   ENDENVIRONMENT

   ENV *-prd-* property4=this property only visible in production
 

As shown above, the '*' character can be used to specify a property across multiple regions. The keywords 'STARTENVIRONMENT', 'ENDENVIRONMENT' and 'ENV' are case-insensitive

You can now also specify environments based on the values of previously-defined properties; this allows a simple #ifdef style facility. There are two types of syntax, which use regex matching or simple string matching; e.g.

   enable.fileAct=true
   compound.property=123-456-789
 
   STARTENVIRONMENT enable.fileAct = true
     # these properties are only set when enable.fileAct is set to true
   ENDENVIRONMENT
   STARTENVIRONMENT compound.property =~ *-789
     # these properties are only set when compound.property ends with -789
   ENDENVIRONMENT
 

Property files can contain any number of blank lines, or comments (lines starting with the '#' character), which will be ignored by the parser.

Any occurences of the string "\n" in a property value will be replaced by a newline character.

A property make also contain a List, rather than a string, by including the index of the list item in square brackets in the property key; e.g.

   listname[1]=first element
   listname[3]=third element
 

This implementation returns an ArrayList of Strings for these types of declarations. Undeclared array elements that appear before the last index will return null.

If you want to create a list, but the index of the elements is unknown (they are dependant on other properties, for example), then you can use a "*" to denote the next available list index, or leave it empty to denote the last used list index; e.g.

 testList[0].a=a-value 0
 testList[0].b=b-value 0
 testList[0].c=a-value 0
  
 testList[1].a=a-value 1
 testList[1].b=b-value 1
 testList[1].c=a-value 1
  
 testList[*].a=a-value 2
 testList[].b=b-value 2
 testList[].c=a-value 2
 
will generate a three-element list, each of which contains a map with three key/value pairs.

Properties that appear multiple times will take the value of the last-specified value.

Author:
knoxg
  • Field Details

    • logger

      public static final org.apache.log4j.Logger logger
      Logger instance for this class
  • Constructor Details

    • PropertyParser

      public PropertyParser(Reader reader, String environmentID)
      Create a new Parser object. Note that parsing does not begin until the Parse method is called on this object.
      Parameters:
      reader - The source of the site definition text.
      environmentID - The environment ID in which to parse this text.
    • PropertyParser

      public PropertyParser(Reader reader)
      Create a new Parser object. Note that parsing does not begin until the Parse method is called on this object. Assumes a DEV environment
      Parameters:
      reader - The source of the site definition text.
  • Method Details

    • parse

      Generates a Properties object from the input stream.
      Returns:
      A valid Properties object.
      Throws:
      IOException
      ParseException
    • restrict

      public static Map<? extends Object,? extends Object> restrict(Map<Object,Object> properties, String prefix, boolean removePrefix)
      Returns a subset of a Properties object. The subset is determined by only returning those key/value pairs whose keys begin with a set prefix. e.g. if 'a' contains the properties
         customer.1.name=fish
         customer.1.description=Patagonian toothfish
         customer.2.name=hunter
         customer.2.description=Patagonian toothfish hunter
         customer.11.name=spear
         customer.11.description=Patagonian toothfish hunter's spear
       

      then calling restrict(a, "customer.1", false) will return:

         customer.1.name=fish
         customer.1.description=Patagonian toothfish
       

      setting the 'removePrefix' to true will remove the initial prefix from the returned property list; restrict(a, "customer.1", true) in this case will then return:

         name=fish
         description=Patagonian toothfish
       

      Note that the prefix passed in to this method has no trailing period, but each property must contain that period (to prevent customer.11 from being returned in the example above).

      If 'properties' is set to null, then this method will return null. If 'prefix' is set to null, then this method will return the entire property list.

      Parameters:
      properties - The initial property list that we wish to restrict
      prefix - The prefix used to restrict the property list
      removePrefix - If set to true, the result keys will be stripped of the initial prefix text
      Returns:
      A restricted property list.
    • main

      public static void main(String[] args) throws IOException, ParseException
      Method used to test the parser from the command line. The file to parse is specified on the command line; if missing, then it uses 'test.properties' as the default.
      Parameters:
      args -
      Throws:
      IOException
      ParseException