Source for org.jfree.report.modules.preferences.base.ConfigFactory

   1: /**
   2:  * ========================================
   3:  * JFreeReport : a free Java report library
   4:  * ========================================
   5:  *
   6:  * Project Info:  http://reporting.pentaho.org/
   7:  *
   8:  * (C) Copyright 2000-2007, by Object Refinery Limited, Pentaho Corporation and Contributors.
   9:  *
  10:  * This library is free software; you can redistribute it and/or modify it under the terms
  11:  * of the GNU Lesser General Public License as published by the Free Software Foundation;
  12:  * either version 2.1 of the License, or (at your option) any later version.
  13:  *
  14:  * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
  15:  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  16:  * See the GNU Lesser General Public License for more details.
  17:  *
  18:  * You should have received a copy of the GNU Lesser General Public License along with this
  19:  * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  20:  * Boston, MA 02111-1307, USA.
  21:  *
  22:  * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
  23:  * in the United States and other countries.]
  24:  *
  25:  * ------------
  26:  * $Id: ConfigFactory.java 3525 2007-10-16 11:43:48Z tmorgner $
  27:  * ------------
  28:  * (C) Copyright 2000-2005, by Object Refinery Limited.
  29:  * (C) Copyright 2005-2007, by Pentaho Corporation.
  30:  */
  31: 
  32: package org.jfree.report.modules.preferences.base;
  33: 
  34: 
  35: /**
  36:  * The config factory is used to access the currently active config storage
  37:  * implementation. The implementation itself allows to read or store a set of properties
  38:  * stored under a certain path.
  39:  *
  40:  * @author Thomas Morgner
  41:  */
  42: public final class ConfigFactory
  43: {
  44:   /**
  45:    * The selector configuration key that defines the active config storage
  46:    * implementation.
  47:    */
  48:   public static final String CONFIG_TARGET_KEY = "org.jfree.report.ConfigStore";
  49: 
  50:   /**
  51:    * The singleton instance of the config factory.
  52:    */
  53:   private static ConfigFactory factory;
  54:   /**
  55:    * The user storage is used to store user dependend settings.
  56:    */
  57:   private ConfigStorage userStorage;
  58:   /**
  59:    * The system storage is used to store system wide settings.
  60:    */
  61:   private ConfigStorage systemStorage;
  62: 
  63:   /**
  64:    * Returns the singleton instance of the config factory.
  65:    *
  66:    * @return the config factory
  67:    */
  68:   public static synchronized ConfigFactory getInstance ()
  69:   {
  70:     if (factory == null)
  71:     {
  72:       factory = new ConfigFactory();
  73:       factory.defineSystemStorage(new NullConfigStorage());
  74:       factory.defineUserStorage(new NullConfigStorage());
  75:     }
  76:     return factory;
  77:   }
  78: 
  79:   /**
  80:    * DefaultConstructor.
  81:    */
  82:   private ConfigFactory ()
  83:   {
  84:   }
  85: 
  86:   /**
  87:    * Defines the user storage implementation that should be used. This method should only
  88:    * be called by the module initialization methods.
  89:    *
  90:    * @param storage the user settings storage implementation.
  91:    */
  92:   public void defineUserStorage (final ConfigStorage storage)
  93:   {
  94:     if (storage == null)
  95:     {
  96:       throw new NullPointerException();
  97:     }
  98:     this.userStorage = storage;
  99:   }
 100: 
 101:   /**
 102:    * Defines the system storage implementation that should be used. This method should
 103:    * only be called by the module initialization methods.
 104:    *
 105:    * @param storage the system settings storage implementation.
 106:    */
 107:   public void defineSystemStorage (final ConfigStorage storage)
 108:   {
 109:     if (storage == null)
 110:     {
 111:       throw new NullPointerException();
 112:     }
 113:     this.systemStorage = storage;
 114:   }
 115: 
 116:   /**
 117:    * Returns the user settings storage implementation used in the config subsystem.
 118:    *
 119:    * @return the user settingsstorage provider.
 120:    */
 121:   public ConfigStorage getUserStorage ()
 122:   {
 123:     return userStorage;
 124:   }
 125: 
 126:   /**
 127:    * Returns the system settings storage implementation used in the config subsystem.
 128:    *
 129:    * @return the system settings storage provider.
 130:    */
 131:   public ConfigStorage getSystemStorage ()
 132:   {
 133:     return systemStorage;
 134:   }
 135: 
 136:   /**
 137:    * Checks, whether the given string denotes a valid config storage path. Such an path
 138:    * must not contain whitespaces or non-alphanumeric characters.
 139:    *
 140:    * @param path the path that should be tested.
 141:    * @return true, if the path is valid, false otherwise.
 142:    */
 143:   public static boolean isValidPath (final String path)
 144:   {
 145:     final char[] data = path.toCharArray();
 146:     for (int i = 0; i < data.length; i++)
 147:     {
 148:       if (Character.isJavaIdentifierPart(data[i]) == false)
 149:       {
 150:         return false;
 151:       }
 152:     }
 153:     return true;
 154:   }
 155: 
 156:   /**
 157:    * Encodes the given configuration path. All non-ascii characters get
 158:    * replaced by an escape sequence.
 159:    *
 160:    * @param path the path.
 161:    * @return the translated path.
 162:    */
 163:   public static String encodePath (final String path)
 164:   {
 165:     final char[] data = path.toCharArray();
 166:     final StringBuffer encoded = new StringBuffer();
 167:     for (int i = 0; i < data.length; i++)
 168:     {
 169:       if (data[i] == '$')
 170:       {
 171:         // double quote
 172:         encoded.append('$');
 173:         encoded.append('$');
 174:       }
 175:       else if (Character.isJavaIdentifierPart(data[i]) == false)
 176:       {
 177:         // padded hex string
 178:         encoded.append('$');
 179:         final String hex = Integer.toHexString(data[i]);
 180:         for (int x = hex.length(); x < 4; x++)
 181:         {
 182:           encoded.append('0');
 183:         }
 184:         encoded.append(hex);
 185:       }
 186:       else
 187:       {
 188:         encoded.append(data[i]);
 189:       }
 190:     }
 191:     return encoded.toString();
 192: 
 193:   }
 194: }