001/*
002 * jPOS Project [http://jpos.org]
003 * Copyright (C) 2000-2026 jPOS Software SRL
004 *
005 * This program is free software: you can redistribute it and/or modify
006 * it under the terms of the GNU Affero General Public License as
007 * published by the Free Software Foundation, either version 3 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
013 * GNU Affero General Public License for more details.
014 *
015 * You should have received a copy of the GNU Affero General Public License
016 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
017 */
018
019package org.jpos.core;
020
021import java.util.HashSet;
022import java.util.Set;
023
024/**
025 * SubConfiguration objects lets childs objects access attributes
026 * in its parent object with a given prefix, for example "child.".
027 * Child objects can access properties with their prefix removed.
028 *
029 * @author <a href="mailto:alcarraz@iie.edu.uy">Andr?s Alcarraz</a>
030 * @version $Id$
031 */
032public class SubConfiguration implements Configuration {
033    /** Parent Configuration */
034    protected Configuration cfg;
035    /** prefix identifying the child parameters */
036    protected String prefix;
037    /** Creates a new empty SubConfiguration object */
038    public SubConfiguration() {
039        super();
040    }
041    /**
042     * Creates a new SubConfiguration from its parent's Configuration 
043     * and the a given <code>prefix</code>.
044     * @param cfg Parent's Configuration 
045     * @param prefix prefix identifying child parameters.
046     */
047    public SubConfiguration(Configuration cfg, String prefix) {
048        super ();
049        this.cfg = cfg;
050        this.prefix = prefix;
051    }
052    /**
053     * Sets the container configuration.
054     * @param newCfg New container configuration.
055     */
056    public void setConfiguration(Configuration newCfg){
057        cfg=newCfg;
058    }
059    /**
060     * Sets the prefix that identifies the parameters of the child object
061     * inside the parent configuration.
062     * @param newPrefix New prefix
063     */
064    public void setPrefix(String newPrefix){
065        prefix = newPrefix;
066    }
067    public String get(String propertyName){
068        return cfg.get(prefix + propertyName);
069    }
070    public String[] getAll(String propertyName){
071        return cfg.getAll(prefix + propertyName);
072    }
073    public int[] getInts (String propertyName) {
074        return cfg.getInts (prefix + propertyName);
075    }
076    public long[] getLongs (String propertyName) {
077        return cfg.getLongs (prefix + propertyName);
078    }
079    public double[] getDoubles (String propertyName) {
080        return cfg.getDoubles (prefix + propertyName);
081    }
082    public boolean[] getBooleans (String propertyName) {
083        return cfg.getBooleans(prefix + propertyName);
084    }
085    public String get(String propertyName, String defaultValue){
086        return cfg.get(prefix + propertyName, defaultValue);
087    }
088    public boolean getBoolean(String propertyName){
089        return cfg.getBoolean(prefix + propertyName);
090    }
091    public boolean getBoolean(String propertyName, boolean defaultValue){
092        return cfg.getBoolean(prefix + propertyName, defaultValue);
093    }
094    public double getDouble(String propertyName){
095        return cfg.getDouble(prefix + propertyName);
096    }
097    public double getDouble(String propertyName, double defaultValue){
098        return cfg.getDouble(prefix + propertyName, defaultValue);
099    }
100    public long getLong(String propertyName){
101        return cfg.getLong(prefix + propertyName);
102    }
103    public long getLong(String propertyName, long defaultValue){
104        return cfg.getLong(prefix + propertyName, defaultValue);
105    }
106    public int getInt(String propertyName){
107        return cfg.getInt(prefix + propertyName);
108    }
109    public int getInt(String propertyName, int defaultValue){
110        return cfg.getInt(prefix + propertyName, defaultValue);
111    }
112    public void put (String name, Object value) {
113        cfg.put(prefix + name, value);
114    }
115    /**
116     * Creates a new object, it takes the class from the value of the property
117     * <code>propertyName</code>
118     * @param propertyName Property whose value is the class name of  
119     * the object being created.
120     */
121    public Object getObject (String propertyName) throws ConfigurationException{
122        try{
123            Object ret = 
124                Class.forName (get (propertyName)).newInstance();
125            if(ret instanceof Configurable) 
126                ((Configurable)ret).setConfiguration(this);
127            return ret;
128        } catch (Exception e){
129            throw new ConfigurationException ("Error trying to create an " 
130                                             + "object from property " 
131                                             + prefix + propertyName, e
132                                             );
133        }
134    }
135    @Override
136    public Set<String> keySet() {
137        Set<String> keys = new HashSet<String>();
138        for (String k : cfg.keySet())
139            if (k.startsWith(prefix))
140                keys.add(k);
141
142        return keys;
143    }
144}