/* $Id: ConfigParams.java 988245 2010-08-23 18:39:35Z kwright $ */
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.manifoldcf.core.interfaces;
import org.apache.manifoldcf.core.interfaces.*;
import java.util.*;
import java.io.*;
import org.apache.manifoldcf.core.system.ManifoldCF;
/** This class represents a set of configuration parameters, with structure, which is a generalized hierarchy of nodes that
* can be interpreted by a repository or authority connector in an appropriate way.
*/
public class ConfigParams extends Configuration
{
public static final String _rcsid = "@(#)$Id: ConfigParams.java 988245 2010-08-23 18:39:35Z kwright $";
/** The parameter type node */
protected final static String PARAMETER_TYPE = "_PARAMETER_";
protected final static String ATTR_NAME = "name";
// The parameter map (which stores name/value pairs also listed in the children)
protected Map<String,String> params = new HashMap<String,String>();
/** Constructor.
*/
public ConfigParams()
{
super("configuration");
}
/** Constructor.
*@param map is the initialized (mutable) map describing the name/value configuration parameters.
* This method of setting up a ConfigParams object will go away when the parameters are all in XML.
*/
public ConfigParams(Map<String,String> map)
{
super("configuration");
Iterator<String> iter = map.keySet().iterator();
while (iter.hasNext())
{
String key = iter.next();
String value = map.get(key);
ConfigNode cn = new ConfigNode(PARAMETER_TYPE);
cn.setAttribute(ATTR_NAME,key);
cn.setValue(value);
addChild(getChildCount(),cn);
}
}
/** Construct from XML.
*@param xml is the input XML.
*/
public ConfigParams(String xml)
throws ManifoldCFException
{
super("configuration");
fromXML(xml);
}
/** Construct from XML.
*@param xmlstream is the input XML stream. Does NOT close the stream.
*/
public ConfigParams(InputStream xmlstream)
throws ManifoldCFException
{
super("configuration");
fromXML(xmlstream);
}
/** Create a new object of the appropriate class.
*/
protected Configuration createNew()
{
return new ConfigParams();
}
/** Create a new child node of the appropriate type and class.
*/
protected ConfigurationNode createNewNode(String type)
{
return new ConfigNode(type);
}
/** Note the removal of all outer nodes.
*/
protected void clearOuterNodes()
{
params.clear();
}
/** Note the addition of a new outer node.
*@param node is the node that was just read.
*/
protected void addOuterNode(ConfigurationNode node)
{
if (node.getType().equals(PARAMETER_TYPE))
{
String name = node.getAttributeValue(ATTR_NAME);
String value = node.getValue();
if (name != null && value != null)
params.put(name,value);
}
}
/** Note the removal of an outer node.
*@param node is the node that was just removed.
*/
protected void removeOuterNode(ConfigurationNode node)
{
if (node.getType().equals(PARAMETER_TYPE))
{
String name = node.getAttributeValue(ATTR_NAME);
if (name != null)
params.remove(name);
}
}
/** Get a parameter value.
*@param key is the name of the parameter.
*@return the value.
*/
public String getParameter(String key)
{
return params.get(key);
}
/** Get an obfuscated parameter value.
*@param key is the name of the parameter.
*@return the unobfuscated value.
*/
public String getObfuscatedParameter(String key)
{
String rval = getParameter(key);
if (rval == null)
return rval;
try
{
return ManifoldCF.deobfuscate(rval);
}
catch (ManifoldCFException e)
{
// Ignore this exception, and return an empty string.
return "";
}
}
/** Set a parameter value.
*@param key is the name of the parameter.
*@param value is the new value, or null if we should
* delete the value.
*/
public void setParameter(String key, String value)
{
// See if we've got it
if (params.get(key) != null)
{
// Linear scan. This is ugly, but this method is deprecated and it will go away shortly.
int i = 0;
while (i < children.size())
{
ConfigNode node = (ConfigNode)children.get(i);
if (node.getType().equals(PARAMETER_TYPE))
{
String name = node.getAttributeValue(ATTR_NAME);
if (name.equals(key))
{
removeChild(i);
break;
}
}
i++;
}
}
if (value != null)
{
ConfigNode cn = new ConfigNode(PARAMETER_TYPE);
cn.setAttribute(ATTR_NAME,key);
cn.setValue(value);
addChild(getChildCount(),cn);
}
}
/** Set an obfuscated parameter.
*@param key is the name of the parameter.
*@param value is the unobfuscated new value, or null if delete request.
*/
public void setObfuscatedParameter(String key, String value)
{
if (value != null)
{
try
{
value = ManifoldCF.obfuscate(value);
}
catch (ManifoldCFException e)
{
// Ignore this exception, and set "" to be the value
value = "";
}
}
setParameter(key,value);
}
/** List parameters.
*/
public Iterator listParameters()
{
return params.keySet().iterator();
}
/** Duplicate.
*@return an exact duplicate
*/
public ConfigParams duplicate()
{
return (ConfigParams)createDuplicate(false);
}
/** Get child node.
*@param index is the node number.
*@return the node.
*/
public ConfigNode getChild(int index)
{
return (ConfigNode)findChild(index);
}
}