diff options
author | Endi Sukma Dewata <edewata@redhat.com> | 2012-03-24 02:27:47 -0500 |
---|---|---|
committer | Endi Sukma Dewata <edewata@redhat.com> | 2012-03-26 11:43:54 -0500 |
commit | 621d9e5c413e561293d7484b93882d985b3fe15f (patch) | |
tree | 638f3d75761c121d9a8fb50b52a12a6686c5ac5c /base/common/src/com/netscape/cmscore/base/PropConfigStore.java | |
parent | 40d3643b8d91886bf210aa27f711731c81a11e49 (diff) | |
download | pki-621d9e5c413e561293d7484b93882d985b3fe15f.tar.gz pki-621d9e5c413e561293d7484b93882d985b3fe15f.tar.xz pki-621d9e5c413e561293d7484b93882d985b3fe15f.zip |
Removed unnecessary pki folder.
Previously the source code was located inside a pki folder.
This folder was created during svn migration and is no longer
needed. This folder has now been removed and the contents have
been moved up one level.
Ticket #131
Diffstat (limited to 'base/common/src/com/netscape/cmscore/base/PropConfigStore.java')
-rw-r--r-- | base/common/src/com/netscape/cmscore/base/PropConfigStore.java | 792 |
1 files changed, 792 insertions, 0 deletions
diff --git a/base/common/src/com/netscape/cmscore/base/PropConfigStore.java b/base/common/src/com/netscape/cmscore/base/PropConfigStore.java new file mode 100644 index 000000000..1e46d3ef3 --- /dev/null +++ b/base/common/src/com/netscape/cmscore/base/PropConfigStore.java @@ -0,0 +1,792 @@ +// --- BEGIN COPYRIGHT BLOCK --- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; version 2 of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// +// (C) 2007 Red Hat, Inc. +// All rights reserved. +// --- END COPYRIGHT BLOCK --- +package com.netscape.cmscore.base; + +import java.io.ByteArrayOutputStream; +import java.io.FilterOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintStream; +import java.math.BigInteger; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Vector; + +import org.mozilla.jss.util.Base64OutputStream; + +import com.netscape.certsrv.apps.CMS; +import com.netscape.certsrv.base.EBaseException; +import com.netscape.certsrv.base.EPropertyNotDefined; +import com.netscape.certsrv.base.EPropertyNotFound; +import com.netscape.certsrv.base.IConfigStore; +import com.netscape.certsrv.base.ISourceConfigStore; +import com.netscape.cmsutil.util.Utils; + +/** + * A class represents a in-memory configuration store. + * Note this class takes advantage of the recursive nature of + * property names. The current property prefix is kept in + * mStoreName and the mSource usually points back to another + * occurance of the same PropConfigStore, with longer mStoreName. IE + * + * <PRE> + * cms.ca0.http.service0 -> mSource=PropConfigStore -> + * cms.ca0.http -> mSource=PropConfigStore -> + * cms.ca0 -> mSource=PropConfigStore -> + * cms -> mSource=SourceConfigStore -> Properties + * </PRE> + * + * The chain ends when the store name is reduced down to it's original + * value. + * <P> + * + * @version $Revision$, $Date$ + */ +public class PropConfigStore implements IConfigStore, Cloneable { + + /** + * + */ + private static final long serialVersionUID = 4714108964096659077L; + + protected static final String PROP_SUBSTORES = "substores"; + + /** + * The name of this substore + */ + protected String mStoreName = null; + + /** + * The source data for this substore + */ + protected ISourceConfigStore mSource = null; + + private static String mDebugType = "CS.cfg"; + + /** + * Constructs a property configuration store. This must + * be a brand new store without properties. The subclass + * must be a ISourceConfigStore. + * <P> + * + * @param storeName property store name + * @exception EBaseException failed to create configuration + */ + public PropConfigStore(String storeName) { + mSource = new SourceConfigStore(); + mStoreName = storeName; + } + + /** + * Constructs a configuration store. The constructor is + * a helper class for substores. Source is the one + * that stores all the parameters. Each substore only + * store a substore name, and a reference to the source. + * <P> + * + * @param storeName store name + * @param prop list of properties + * @exception EBaseException failed to create configuration + */ + protected PropConfigStore(String name, ISourceConfigStore source) { + mStoreName = name; + mSource = source; + } + + /** + * Returns the name of this store. + * <P> + * + * @return store name + */ + public String getName() { + return mStoreName; + } + + /** + * Retrieves a property from the configuration file. + * <P> + * + * @param name property name + * @return property value + */ + public String get(String name) { + return mSource.get(getFullName(name)); + } + + /** + * Retrieves a property from the configuration file. Does not prepend + * the config store name to the property. + * <P> + * + * @param name property name + * @return property value + */ + private Object nakedGet(String name) { + return mSource.get(name); + } + + /** + * Puts a property into the configuration file. The + * values wont be updated to the file until save + * method is invoked. + * <P> + * + * @param name property name + * @param value property value + */ + public String put(String name, String value) { + return mSource.put(getFullName(name), value); + } + + /** + * Removes a property from the configuration file. + * + * @param name property name + */ + public void remove(String name) { + ((SourceConfigStore) mSource).remove(getFullName(name)); + } + + /** + * Returns an enumeration of the config store's keys, hidding the store + * name. + * + * @see java.util.Hashtable#elements + * @see java.util.Enumeration + */ + public Enumeration<String> keys() { + Hashtable<String, Object> h = new Hashtable<String, Object>(); + + enumerate(h); + return h.keys(); + } + + /** + * Retrieves the hashtable where all the properties are kept. + * + * @return hashtable + */ + public Hashtable<String, Object> hashtable() { + Hashtable<String, Object> h = new Hashtable<String, Object>(); + + enumerate(h); + return h; + } + + /** + * Return the number of items in this substore + */ + public int size() { + Hashtable<String, Object> h = new Hashtable<String, Object>(); + + enumerate(h); + return h.size(); + } + + /** + * Fills the given hash table with all key/value pairs in the current + * config store, removing the config store name prefix + * <P> + * + * @param h the hashtable + */ + private synchronized void enumerate(Hashtable<String, Object> h) { + Enumeration<String> e = mSource.keys(); + // We only want the keys which match the current substore name + // without the current substore prefix. This code works even + // if mStoreName is null. + String fullName = getFullName(""); + int kIndex = fullName.length(); + + while (e.hasMoreElements()) { + String key = e.nextElement(); + + if (key.startsWith(fullName)) { + h.put(key.substring(kIndex), nakedGet(key)); + } + } + } + + /** + * Reads a config store from an input stream. + * + * @param in input stream where properties are located + * @exception IOException failed to load + */ + public synchronized void load(InputStream in) throws IOException { + mSource.load(in); + } + + /** + * Stores this config store to the specified output stream. + * + * @param out outputstream where the properties are saved + * @param header optional header information to be saved + */ + public synchronized void save(OutputStream out, String header) { + mSource.save(out, header); + } + + /** + * Retrieves a property value. + * + * @param name property key + * @return property value + * @exception EBaseException failed to retrieve value + */ + public String getString(String name) throws EBaseException { + String str = get(name); + + if (str == null) { + CMS.traceHashKey(mDebugType, getFullName(name), "<notpresent>"); + throw new EPropertyNotFound(CMS.getUserMessage("CMS_BASE_GET_PROPERTY_FAILED", getName() + "." + name)); + } + // should we check for empty string ? + // if (str.length() == 0) { + // throw new EPropertyNotDefined(getName() + "." + name); + // } + String ret = null; + + try { + ret = new String(str.getBytes(), "UTF8").trim(); + } catch (java.io.UnsupportedEncodingException e) { + throw new EBaseException(CMS.getUserMessage("CMS_BASE_UTF8_NOT_SUPPORTED")); + } + CMS.traceHashKey(mDebugType, getFullName(name), ret); + return ret; + } + + /** + * Retrieves a String from the configuration file. + * <P> + * + * @param name property name + * @param defval the default object to return if name does not exist + * @return property value + */ + public String getString(String name, String defval) throws EBaseException { + String val; + + try { + val = getString(name); + } catch (EPropertyNotFound e) { + val = defval; + } + CMS.traceHashKey(mDebugType, getFullName(name), val, defval); + return val; + } + + /** + * Puts property value into this configuration store. + * + * @param name property key + * @param value property value + */ + public void putString(String name, String value) { + put(name, value); + } + + /** + * Retrieves a byte array from the configuration file. + * <P> + * + * @param name property name + * @exception IllegalArgumentException if name is not set or is null. + * + * @return property value + */ + public byte[] getByteArray(String name) throws EBaseException { + byte[] arr = getByteArray(name, new byte[0]); + + if (arr.length == 0) { + CMS.traceHashKey(mDebugType, getFullName(name), "<notpresent>"); + throw new EPropertyNotFound(CMS.getUserMessage("CMS_BASE_GET_PROPERTY_FAILED", getName() + "." + name)); + } + return arr; + } + + /** + * Retrieves a byte array from the configuration file. + * <P> + * + * @param name property name + * @param defval the default byte array to return if name does + * not exist + * + * @return property value + */ + public byte[] getByteArray(String name, byte defval[]) + throws EBaseException { + String str = (String) get(name); + + if (str == null || str.length() == 0) { + CMS.traceHashKey(mDebugType, getFullName(name), + "<notpresent>", "<bytearray>"); + return defval; + } else { + CMS.traceHashKey(mDebugType, getFullName(name), + "<bytearray>", "<bytearray>"); + return Utils.base64decode(str); + } + } + + /** + * Puts byte array into this configuration store. + * + * @param name property key + * @param value byte array + */ + public void putByteArray(String name, byte value[]) { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + Base64OutputStream b64 = new Base64OutputStream(new + PrintStream(new FilterOutputStream(output))); + + try { + b64.write(value); + b64.flush(); + + // 8859 contains all the base-64 chars, so there are no + // internationalization problems here + put(name, output.toString("8859_1")); + } catch (IOException e) { + System.out.println("Warning: base-64 encoding of configuration " + + "information failed"); + } + } + + /** + * Retrieves boolean-based property value. + * + * @param name property key + * @return boolean value + * @exception EBaseException failed to retrieve + */ + public boolean getBoolean(String name) throws EBaseException { + String value = (String) get(name); + + if (value == null) { + CMS.traceHashKey(mDebugType, getFullName(name), "<notpresent>"); + throw new EPropertyNotFound(CMS.getUserMessage("CMS_BASE_GET_PROPERTY_FAILED", getName() + "." + name)); + } + if (value.length() == 0) { + throw new EPropertyNotDefined(CMS.getUserMessage("CMS_BASE_GET_PROPERTY_NOVALUE", getName() + "." + name)); + } + + if (value.equalsIgnoreCase("true")) { + return true; + } else if (value.equalsIgnoreCase("false")) { + return false; + } else { + throw new EBaseException(CMS.getUserMessage("CMS_BASE_INVALID_PROPERTY_1", getName() + "." + name, + "boolean", "\"true\" or \"false\"")); + } + } + + /** + * Retrieves boolean-based property value. + * + * @param name property key + * @param defval default value + * @return boolean value + * @exception EBaseException failed to retrieve + */ + public boolean getBoolean(String name, boolean defval) + throws EBaseException { + boolean val; + + try { + val = getBoolean(name); + } catch (EPropertyNotFound e) { + val = defval; + } catch (EPropertyNotDefined e) { + val = defval; + } + CMS.traceHashKey(mDebugType, getFullName(name), + val ? "true" : "false", defval ? "true" : "false"); + return val; + } + + /** + * Puts boolean value into the configuration store. + * + * @param name property key + * @param value property value + */ + public void putBoolean(String name, boolean value) { + if (value) { + put(name, "true"); + } else { + put(name, "false"); + } + } + + /** + * Retrieves integer value. + * + * @param name property key + * @return property value + * @exception EBaseException failed to retrieve value + */ + public int getInteger(String name) throws EBaseException { + String value = (String) get(name); + + if (value == null) { + CMS.traceHashKey(mDebugType, getFullName(name), "<notpresent>"); + throw new EPropertyNotFound(CMS.getUserMessage("CMS_BASE_GET_PROPERTY_FAILED", getName() + "." + name)); + } + if (value.length() == 0) { + throw new EPropertyNotDefined(CMS.getUserMessage("CMS_BASE_GET_PROPERTY_NOVALUE", getName() + "." + name)); + } + try { + CMS.traceHashKey(mDebugType, getFullName(name), value); + return Integer.parseInt(value); + } catch (NumberFormatException e) { + throw new EBaseException(CMS.getUserMessage("CMS_BASE_INVALID_PROPERTY_1", getName() + "." + name, "int", + "number")); + } + } + + /** + * Retrieves integer value. + * + * @param name property key + * @param defval default value + * @return property value + * @exception EBaseException failed to retrieve value + */ + public int getInteger(String name, int defval) throws EBaseException { + int val; + + try { + val = getInteger(name); + } catch (EPropertyNotFound e) { + val = defval; + } catch (EPropertyNotDefined e) { + val = defval; + } + CMS.traceHashKey(mDebugType, getFullName(name), + "" + val, "" + defval); + return val; + } + + /** + * Puts an integer value. + * + * @param name property key + * @param val property value + * @exception EBaseException failed to retrieve value + */ + public void putInteger(String name, int val) { + put(name, Integer.toString(val)); + } + + /** + * Retrieves big integer value. + * + * @param name property key + * @return property value + * @exception EBaseException failed to retrieve value + */ + public BigInteger getBigInteger(String name) throws EBaseException { + String value = (String) get(name); + + if (value == null) { + CMS.traceHashKey(mDebugType, getFullName(name), "<notpresent>"); + throw new EPropertyNotFound(CMS.getUserMessage("CMS_BASE_GET_PROPERTY_FAILED", getName() + "." + name)); + } + if (value.length() == 0) { + throw new EPropertyNotDefined(CMS.getUserMessage("CMS_BASE_GET_PROPERTY_NOVALUE", getName() + "." + name)); + } + try { + if (value.startsWith("0x") || value.startsWith("0X")) { + String val = value.substring(2); + + return new BigInteger(val, 16); + } + return new BigInteger(value); + } catch (NumberFormatException e) { + throw new EBaseException(CMS.getUserMessage("CMS_BASE_INVALID_PROPERTY_1", getName() + "." + name, + "BigInteger", "number")); + } + } + + /** + * Retrieves integer value. + * + * @param name property key + * @param defval default value + * @return property value + * @exception EBaseException failed to retrieve value + */ + public BigInteger getBigInteger(String name, BigInteger defval) + throws EBaseException { + BigInteger val; + + try { + val = getBigInteger(name); + } catch (EPropertyNotFound e) { + val = defval; + } catch (EPropertyNotDefined e) { + val = defval; + } + return val; + } + + /** + * Puts a big integer value. + * + * @param name property key + * @param val default value + */ + public void putBigInteger(String name, BigInteger val) { + put(name, val.toString()); + } + + /** + * Creates a new sub store. + * <P> + * + * @param name substore name + * @return substore + */ + public IConfigStore makeSubStore(String name) { + + /* + String names=(String)mSource.get(getFullName(PROP_SUBSTORES)); + + if (names==null) { + names=name; + } + else { + names=names+","+name; + } + mSource.put(getFullName(PROP_SUBSTORES), name); + */ + return new PropConfigStore(getFullName(name), mSource); + } + + /** + * Removes a sub store. + * <p> + * + * @param name substore name + */ + @SuppressWarnings("unchecked") + public void removeSubStore(String name) { + // this operation is expensive!!! + + Enumeration<String> e = mSource.keys(); + // We only want the keys which match the current substore name + // without the current substore prefix. This code works even + // if mStoreName is null. + String fullName = getFullName(name); + + while (e.hasMoreElements()) { + String key = e.nextElement(); + + if (key.startsWith(fullName + ".")) { + ((Hashtable<String, String>) mSource).remove(key); + } + } + } + + /** + * Retrieves a sub store. A substore contains a list + * of properties and substores. For example, + * + * <PRE> + * cms.ldap.host=ds.netscape.com + * cms.ldap.port=389 + * </PRE> + * + * "ldap" is a substore in above example. If the + * substore property itself is set, this method + * will treat the value as a reference. For example, + * + * <PRE> + * cms.ldap = kms.ldap + * </PRE> + * <P> + * + * @param name substore name + * @return substore + */ + public IConfigStore getSubStore(String name) { + String fullname = getFullName(name); + String reference = mSource.get(fullname); + + if (reference == null) { + PropConfigStore ps = new PropConfigStore(fullname, mSource); + + return ps; + } else { + PropConfigStore ps = new PropConfigStore(reference, mSource); + + return ps; + } + } + + /** + * Retrieves a list of property names. + * + * @return a list of string-based property names + */ + public Enumeration<String> getPropertyNames() { + // XXX - this operation is expensive!!! + Hashtable<String, Object> h = new Hashtable<String, Object>(); + + enumerate(h); + Enumeration<String> e = h.keys(); + Vector<String> v = new Vector<String>(); + + while (e.hasMoreElements()) { + String pname = e.nextElement(); + int i = pname.indexOf('.'); // substores have "." + + if (i == -1) { + String n = pname; + + if (!v.contains(n)) { + v.addElement(n); + } + } + } + return v.elements(); + } + + /** + * Returns a list of sub store names. + * <P> + * + * @return list of substore names + */ + public Enumeration<String> getSubStoreNames() { + // XXX - this operation is expensive!!! + Hashtable<String, Object> h = new Hashtable<String, Object>(); + + enumerate(h); + Enumeration<String> e = h.keys(); + Vector<String> v = new Vector<String>(); + + while (e.hasMoreElements()) { + String pname = e.nextElement(); + int i = pname.indexOf('.'); // substores have "." + + if (i != -1) { + String n = pname.substring(0, i); + + if (!v.contains(n)) { + v.addElement(n); + } + } + } + return v.elements(); + } + + /** + * Retrieves the source configuration store where + * the properties are stored. + * <P> + * + * @return source configuration store + */ + public ISourceConfigStore getSourceConfigStore() { + return mSource; + } + + /** + * For debugging purposes. Prints properties of this + * substore. + */ + public void printProperties() { + Enumeration<String> keys = mSource.keys(); + + while (keys.hasMoreElements()) { + String key = keys.nextElement(); + + if (mStoreName == null) { + System.out.println(key); + } else { + if (key.startsWith(mStoreName)) + System.out.println(key); + } + } + } + + /** + * Converts the substore parameters. + * + * @param name property name + * @return fill property name + */ + private String getFullName(String name) { + if (mStoreName == null) + return name; + else + return mStoreName + "." + name; + } + + /** + * Cloning of property configuration store. + * + * @return a new configuration store + */ + public Object clone() { + try { + PropConfigStore that = (PropConfigStore) super.clone(); + + mStoreName = getName(); + mSource = new SourceConfigStore(); + Enumeration<String> subs = getSubStoreNames(); + + while (subs.hasMoreElements()) { + String name = subs.nextElement(); + + IConfigStore sub = getSubStore(name); + IConfigStore newSub = that.makeSubStore(sub.getName()); + + Enumeration<String> props = sub.getPropertyNames(); + + while (props.hasMoreElements()) { + String n = props.nextElement(); + + try { + newSub.putString(n, + sub.getString(n)); + } catch (EBaseException ex) { + } + } + } + return that; + } catch (CloneNotSupportedException e) { + return null; + } + + } + + /** + * Commits properties into the file. + * + * @param createBackup true if create backup + * @exception EBaseException failed to commit properties + */ + public void commit(boolean createBackup) throws EBaseException { + } +} |