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    package org.apache.commons.betwixt;
018    
019    import java.io.Serializable;
020    
021    import org.apache.commons.betwixt.strategy.DefaultObjectStringConverter;
022    import org.apache.commons.betwixt.strategy.IdStoringStrategy;
023    import org.apache.commons.betwixt.strategy.ObjectStringConverter;
024    import org.apache.commons.betwixt.strategy.ValueSuppressionStrategy;
025    
026    /** <p>Stores mapping phase binding configuration.</p>
027      *
028      * <p>There are two phase in Betwixt's processing.
029      * The first phase is the introspection of the bean.
030      * Strutural configuration settings effect this phase.
031      * The second phase comes when Betwixt dynamically uses
032      * reflection to execute the mapping.
033      * This object stores configuration settings pertaining 
034      * to the second phase.</p>
035      *
036      * <p>These common settings have been collected into one class
037      * to make round tripping easier since the same <code>BindingConfiguration</code>
038      * can be shared.</p> 
039      *
040      * @author <a href="mailto:rdonkin@apache.org">Robert Burrell Donkin</a>
041      * @since 0.5
042      */
043    public class BindingConfiguration implements Serializable {
044    
045        /** Should <code>ID</code>'s and <code>IDREF</code> be used cross-reference matching objects? */
046        private boolean mapIDs = true;
047        /** Converts objects &lt-&gt; strings */
048        private ObjectStringConverter objectStringConverter;
049        /** The name of the classname attribute used when creating derived beans */
050        private String classNameAttribute = "className";
051        /** Strategy for suppressing attributes with certain values when writing */
052        private ValueSuppressionStrategy valueSuppressionStrategy  = ValueSuppressionStrategy.DEFAULT;
053        /** Strategy for storing and accessing ID values */
054        private IdStoringStrategy idStoringStrategy = IdStoringStrategy.createDefault();
055        
056        /**
057         * Constructs a BindingConfiguration with default properties.
058         */
059        public BindingConfiguration() {
060            this(new DefaultObjectStringConverter(), true);
061        }
062        
063        /** 
064         * Constructs a BindingConfiguration
065         * @param objectStringConverter the <code>ObjectStringConverter</code>
066         * to be used to convert Objects &lt;-&gt; Strings
067         * @param mapIDs should <code>ID</code>'s and <code>IDREF</code> be used to cross-reference
068         */ 
069        public BindingConfiguration(ObjectStringConverter objectStringConverter, boolean mapIDs) {
070            setObjectStringConverter(objectStringConverter);
071            setMapIDs(mapIDs);
072        }
073        
074        /**
075          * Gets the Object &lt;-&gt; String converter.
076          * @return the ObjectStringConverter to use, not null
077          */
078        public ObjectStringConverter getObjectStringConverter() {
079            return objectStringConverter;
080        }
081        
082        /**
083          * Sets the Object &lt;-&gt; String converter.
084          * @param objectStringConverter the ObjectStringConverter to be used, not null
085          */
086        public void setObjectStringConverter(ObjectStringConverter objectStringConverter) {
087            this.objectStringConverter = objectStringConverter;
088        }
089        
090        /** 
091         * Should <code>ID</code>'s and <code>IDREF</code> attributes 
092         * be used to cross-reference matching objects? 
093         *
094         * @return true if <code>ID</code> and <code>IDREF</code> 
095         * attributes should be used to cross-reference instances
096         */
097        public boolean getMapIDs() {
098            return mapIDs;
099        }
100        
101        /**
102         *Should <code>ID</code>'s and <code>IDREF</code> attributes 
103         * be used to cross-reference matching objects? 
104         *
105         * @param mapIDs pass true if <code>ID</code>'s should be used to cross-reference
106         */
107        public void setMapIDs(boolean mapIDs) {
108            this.mapIDs = mapIDs;
109        }        
110        
111        /**
112         * The name of the attribute which can be specified in the XML to override the
113         * type of a bean used at a certain point in the schema.
114         *
115         * <p>The default value is 'className'.</p>
116         * 
117         * @return The name of the attribute used to overload the class name of a bean
118         */
119        public String getClassNameAttribute() {
120            return classNameAttribute;
121        }
122    
123        /**
124         * Sets the name of the attribute which can be specified in 
125         * the XML to override the type of a bean used at a certain 
126         * point in the schema.
127         *
128         * <p>The default value is 'className'.</p>
129         * 
130         * @param classNameAttribute The name of the attribute used to overload the class name of a bean
131         */
132        public void setClassNameAttribute(String classNameAttribute) {
133            this.classNameAttribute = classNameAttribute;
134        }
135        
136        
137        /**
138         * Gets the <code>ValueSuppressionStrategy</code>.
139         * This is used to control the expression of attributes with certain values.
140         * @since 0.7
141         * @return <code>ValueSuppressionStrategy</code>, not null
142         */
143        public ValueSuppressionStrategy getValueSuppressionStrategy() {
144            return valueSuppressionStrategy;
145        }
146        
147        /**
148         * Sets the <code>ValueSuppressionStrategy</code>.
149         * This is used to control the expression of attributes with certain values.
150         * @since 0.7
151         * @param valueSuppressionStrategy <code>ValueSuppressionStrategy</code>, not null
152         */
153        public void setValueSuppressionStrategy(
154                ValueSuppressionStrategy valueSuppressionStrategy) {
155            this.valueSuppressionStrategy = valueSuppressionStrategy;
156        }
157        
158        /**
159         * Gets the strategy used to manage storage and retrieval of id's.
160         * 
161         * @since 0.7
162         * @return Returns the <code>IdStoringStrategy</code>, not null
163         */
164        public IdStoringStrategy getIdMappingStrategy() {
165            return idStoringStrategy;
166        }
167    
168        /**
169         * Sets the strategy used to manage storage and retrieval of id's.
170         * 
171         * @since 0.7
172         * @param idMappingStrategy
173         *            <code>IdStoringStrategy</code> to be set, not null
174         */
175        public void setIdMappingStrategy(IdStoringStrategy idMappingStrategy) {
176            this.idStoringStrategy = idMappingStrategy;
177        }
178    }