001/*
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements.  See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License.  You may obtain a copy of the License at
008 *
009 *      http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018
019package org.apache.commons.beanutils;
020
021
022/**
023 * <p>A <strong>DynaBean</strong> is a Java object that supports properties
024 * whose names and data types, as well as values, may be dynamically modified.
025 * To the maximum degree feasible, other components of the BeanUtils package
026 * will recognize such beans and treat them as standard JavaBeans for the
027 * purpose of retrieving and setting property values.</p>
028 *
029 * @version $Id$
030 */
031
032public interface DynaBean {
033
034
035    /**
036     * Does the specified mapped property contain a value for the specified
037     * key value?
038     *
039     * @param name Name of the property to check
040     * @param key Name of the key to check
041     * @return {@code true} if the mapped property contains a value for
042     * the specified key, otherwise {@code false}
043     *
044     * @throws IllegalArgumentException if there is no property
045     *  of the specified name
046     */
047    public boolean contains(String name, String key);
048
049
050    /**
051     * Return the value of a simple property with the specified name.
052     *
053     * @param name Name of the property whose value is to be retrieved
054     * @return The property's value
055     *
056     * @throws IllegalArgumentException if there is no property
057     *  of the specified name
058     */
059    public Object get(String name);
060
061
062    /**
063     * Return the value of an indexed property with the specified name.
064     *
065     * @param name Name of the property whose value is to be retrieved
066     * @param index Index of the value to be retrieved
067     * @return The indexed property's value
068     *
069     * @throws IllegalArgumentException if there is no property
070     *  of the specified name
071     * @throws IllegalArgumentException if the specified property
072     *  exists, but is not indexed
073     * @throws IndexOutOfBoundsException if the specified index
074     *  is outside the range of the underlying property
075     * @throws NullPointerException if no array or List has been
076     *  initialized for this property
077     */
078    public Object get(String name, int index);
079
080
081    /**
082     * Return the value of a mapped property with the specified name,
083     * or <code>null</code> if there is no value for the specified key.
084     *
085     * @param name Name of the property whose value is to be retrieved
086     * @param key Key of the value to be retrieved
087     * @return The mapped property's value
088     *
089     * @throws IllegalArgumentException if there is no property
090     *  of the specified name
091     * @throws IllegalArgumentException if the specified property
092     *  exists, but is not mapped
093     */
094    public Object get(String name, String key);
095
096
097    /**
098     * Return the <code>DynaClass</code> instance that describes the set of
099     * properties available for this DynaBean.
100     *
101     * @return The associated DynaClass
102     */
103    public DynaClass getDynaClass();
104
105
106    /**
107     * Remove any existing value for the specified key on the
108     * specified mapped property.
109     *
110     * @param name Name of the property for which a value is to
111     *  be removed
112     * @param key Key of the value to be removed
113     *
114     * @throws IllegalArgumentException if there is no property
115     *  of the specified name
116     */
117    public void remove(String name, String key);
118
119
120    /**
121     * Set the value of a simple property with the specified name.
122     *
123     * @param name Name of the property whose value is to be set
124     * @param value Value to which this property is to be set
125     *
126     * @throws ConversionException if the specified value cannot be
127     *  converted to the type required for this property
128     * @throws IllegalArgumentException if there is no property
129     *  of the specified name
130     * @throws NullPointerException if an attempt is made to set a
131     *  primitive property to null
132     */
133    public void set(String name, Object value);
134
135
136    /**
137     * Set the value of an indexed property with the specified name.
138     *
139     * @param name Name of the property whose value is to be set
140     * @param index Index of the property to be set
141     * @param value Value to which this property is to be set
142     *
143     * @throws ConversionException if the specified value cannot be
144     *  converted to the type required for this property
145     * @throws IllegalArgumentException if there is no property
146     *  of the specified name
147     * @throws IllegalArgumentException if the specified property
148     *  exists, but is not indexed
149     * @throws IndexOutOfBoundsException if the specified index
150     *  is outside the range of the underlying property
151     */
152    public void set(String name, int index, Object value);
153
154
155    /**
156     * Set the value of a mapped property with the specified name.
157     *
158     * @param name Name of the property whose value is to be set
159     * @param key Key of the property to be set
160     * @param value Value to which this property is to be set
161     *
162     * @throws ConversionException if the specified value cannot be
163     *  converted to the type required for this property
164     * @throws IllegalArgumentException if there is no property
165     *  of the specified name
166     * @throws IllegalArgumentException if the specified property
167     *  exists, but is not mapped
168     */
169    public void set(String name, String key, Object value);
170
171
172}