001    /* $Id: ObjectCreateRule.java 992060 2010-09-02 19:09:47Z simonetripodi $
002     *
003     * Licensed to the Apache Software Foundation (ASF) under one or more
004     * contributor license agreements.  See the NOTICE file distributed with
005     * this work for additional information regarding copyright ownership.
006     * The ASF licenses this file to You under the Apache License, Version 2.0
007     * (the "License"); you may not use this file except in compliance with
008     * the License.  You may obtain a copy of the License at
009     *
010     *      http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing, software
013     * distributed under the License is distributed on an "AS IS" BASIS,
014     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    
019    
020    package org.apache.commons.digester;
021    
022    
023    import org.xml.sax.Attributes;
024    
025    
026    /**
027     * Rule implementation that creates a new object and pushes it
028     * onto the object stack.  When the element is complete, the
029     * object will be popped
030     */
031    
032    public class ObjectCreateRule extends Rule {
033    
034    
035        // ----------------------------------------------------------- Constructors
036    
037    
038        /**
039         * Construct an object create rule with the specified class name.
040         *
041         * @param digester The associated Digester
042         * @param className Java class name of the object to be created
043         *
044         * @deprecated The digester instance is now set in the {@link Digester#addRule} method. 
045         * Use {@link #ObjectCreateRule(String className)} instead.
046         */
047        @Deprecated
048        public ObjectCreateRule(Digester digester, String className) {
049    
050            this(className);
051    
052        }
053    
054    
055        /**
056         * Construct an object create rule with the specified class.
057         *
058         * @param digester The associated Digester
059         * @param clazz Java class name of the object to be created
060         *
061         * @deprecated The digester instance is now set in the {@link Digester#addRule} method. 
062         * Use {@link #ObjectCreateRule(Class clazz)} instead.
063         */
064        @Deprecated
065        public ObjectCreateRule(Digester digester, Class<?> clazz) {
066    
067            this(clazz);
068    
069        }
070    
071    
072        /**
073         * Construct an object create rule with the specified class name and an
074         * optional attribute name containing an override.
075         *
076         * @param digester The associated Digester
077         * @param className Java class name of the object to be created
078         * @param attributeName Attribute name which, if present, contains an
079         *  override of the class name to create
080         *
081         * @deprecated The digester instance is now set in the {@link Digester#addRule} method. 
082         * Use {@link #ObjectCreateRule(String className, String attributeName)} instead.
083         */
084        @Deprecated
085        public ObjectCreateRule(Digester digester, String className,
086                                String attributeName) {
087    
088            this (className, attributeName);
089    
090        }
091    
092    
093        /**
094         * Construct an object create rule with the specified class and an
095         * optional attribute name containing an override.
096         *
097         * @param digester The associated Digester
098         * @param attributeName Attribute name which, if present, contains an
099         * @param clazz Java class name of the object to be created
100         *  override of the class name to create
101         *
102         * @deprecated The digester instance is now set in the {@link Digester#addRule} method. 
103         * Use {@link #ObjectCreateRule(String attributeName, Class clazz)} instead.
104         */
105        @Deprecated
106        public ObjectCreateRule(Digester digester,
107                                String attributeName,
108                                Class<?> clazz) {
109    
110            this(attributeName, clazz);
111    
112        }
113    
114        /**
115         * Construct an object create rule with the specified class name.
116         *
117         * @param className Java class name of the object to be created
118         */
119        public ObjectCreateRule(String className) {
120    
121            this(className, (String) null);
122    
123        }
124    
125    
126        /**
127         * Construct an object create rule with the specified class.
128         *
129         * @param clazz Java class name of the object to be created
130         */
131        public ObjectCreateRule(Class<?> clazz) {
132    
133            this(clazz.getName(), (String) null);
134    
135        }
136    
137    
138        /**
139         * Construct an object create rule with the specified class name and an
140         * optional attribute name containing an override.
141         *
142         * @param className Java class name of the object to be created
143         * @param attributeName Attribute name which, if present, contains an
144         *  override of the class name to create
145         */
146        public ObjectCreateRule(String className,
147                                String attributeName) {
148    
149            this.className = className;
150            this.attributeName = attributeName;
151    
152        }
153    
154    
155        /**
156         * Construct an object create rule with the specified class and an
157         * optional attribute name containing an override.
158         *
159         * @param attributeName Attribute name which, if present, contains an
160         * @param clazz Java class name of the object to be created
161         *  override of the class name to create
162         */
163        public ObjectCreateRule(String attributeName,
164                                Class<?> clazz) {
165    
166            this(clazz.getName(), attributeName);
167    
168        }
169    
170        // ----------------------------------------------------- Instance Variables
171    
172    
173        /**
174         * The attribute containing an override class name if it is present.
175         */
176        protected String attributeName = null;
177    
178    
179        /**
180         * The Java class name of the object to be created.
181         */
182        protected String className = null;
183    
184    
185        // --------------------------------------------------------- Public Methods
186    
187    
188        /**
189         * Process the beginning of this element.
190         *
191         * @param attributes The attribute list of this element
192         */
193        @Override
194        public void begin(Attributes attributes) throws Exception {
195    
196            // Identify the name of the class to instantiate
197            String realClassName = className;
198            if (attributeName != null) {
199                String value = attributes.getValue(attributeName);
200                if (value != null) {
201                    realClassName = value;
202                }
203            }
204            if (digester.log.isDebugEnabled()) {
205                digester.log.debug("[ObjectCreateRule]{" + digester.match +
206                        "}New " + realClassName);
207            }
208    
209            // Instantiate the new object and push it on the context stack
210            Class<?> clazz = digester.getClassLoader().loadClass(realClassName);
211            Object instance = clazz.newInstance();
212            digester.push(instance);
213    
214        }
215    
216    
217        /**
218         * Process the end of this element.
219         */
220        @Override
221        public void end() throws Exception {
222    
223            Object top = digester.pop();
224            if (digester.log.isDebugEnabled()) {
225                digester.log.debug("[ObjectCreateRule]{" + digester.match +
226                        "} Pop " + top.getClass().getName());
227            }
228    
229        }
230    
231    
232        /**
233         * Render a printable version of this Rule.
234         */
235        @Override
236        public String toString() {
237    
238            StringBuffer sb = new StringBuffer("ObjectCreateRule[");
239            sb.append("className=");
240            sb.append(className);
241            sb.append(", attributeName=");
242            sb.append(attributeName);
243            sb.append("]");
244            return (sb.toString());
245    
246        }
247    
248    
249    }