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    
019    package org.apache.commons.modeler.modules;
020    
021    import java.io.InputStream;
022    import java.net.URL;
023    import java.util.ArrayList;
024    import java.util.List;
025    
026    import org.apache.commons.digester.Digester;
027    import org.apache.commons.logging.Log;
028    import org.apache.commons.logging.LogFactory;
029    import org.apache.commons.modeler.Registry;
030    
031    public class MbeansDescriptorsDigesterSource extends ModelerSource
032    {
033        private static Log log =
034                LogFactory.getLog(MbeansDescriptorsDigesterSource.class);
035    
036        Registry registry;
037        String location;
038        String type;
039        Object source;
040        List mbeans=new ArrayList();
041    
042        public void setRegistry(Registry reg) {
043            this.registry=reg;
044        }
045    
046        public void setLocation( String loc ) {
047            this.location=loc;
048        }
049    
050        /** Used if a single component is loaded
051         *
052         * @param type
053         */
054        public void setType( String type ) {
055           this.type=type;
056        }
057    
058        public void setSource( Object source ) {
059            this.source=source;
060        }
061    
062        public List loadDescriptors( Registry registry, String location,
063                                     String type, Object source)
064                throws Exception
065        {
066            setRegistry(registry);
067            setLocation(location);
068            setType(type);
069            setSource(source);
070            execute();
071            return mbeans;
072        }
073    
074        public void execute() throws Exception {
075            if( registry==null ) registry=Registry.getRegistry();
076    
077            InputStream stream=(InputStream)source;
078    
079            long t1=System.currentTimeMillis();
080    
081            Digester digester = new Digester();
082            digester.setNamespaceAware(false);
083            digester.setValidating(false);
084            URL url = registry.getClass().getResource
085                    ("/org/apache/commons/modeler/mbeans-descriptors.dtd");
086            digester.register
087                    ("-//Apache Software Foundation//DTD Model MBeans Configuration File",
088                            url.toString());
089    
090            // Push our registry object onto the stack
091            digester.push(mbeans);
092    
093            // Configure the parsing rules
094            digester.addObjectCreate
095                    ("mbeans-descriptors/mbean",
096                            "org.apache.commons.modeler.ManagedBean");
097            digester.addSetProperties
098                    ("mbeans-descriptors/mbean");
099            digester.addSetNext
100                    ("mbeans-descriptors/mbean",
101                            "add",
102                            "java.lang.Object");
103    
104            digester.addObjectCreate
105                    ("mbeans-descriptors/mbean/attribute",
106                            "org.apache.commons.modeler.AttributeInfo");
107            digester.addSetProperties
108                    ("mbeans-descriptors/mbean/attribute");
109            digester.addSetNext
110                    ("mbeans-descriptors/mbean/attribute",
111                            "addAttribute",
112                            "org.apache.commons.modeler.AttributeInfo");
113    
114            digester.addObjectCreate
115                ("mbeans-descriptors/mbean/attribute/descriptor/field",
116                 "org.apache.commons.modeler.FieldInfo");
117            digester.addSetProperties
118                ("mbeans-descriptors/mbean/attribute/descriptor/field");
119            digester.addSetNext
120                ("mbeans-descriptors/mbean/attribute/descriptor/field",
121                 "addField",
122                 "org.apache.commons.modeler.FieldInfo");
123    
124            digester.addObjectCreate
125                    ("mbeans-descriptors/mbean/constructor",
126                            "org.apache.commons.modeler.ConstructorInfo");
127            digester.addSetProperties
128                    ("mbeans-descriptors/mbean/constructor");
129            digester.addSetNext
130                    ("mbeans-descriptors/mbean/constructor",
131                            "addConstructor",
132                            "org.apache.commons.modeler.ConstructorInfo");
133    
134            digester.addObjectCreate
135                ("mbeans-descriptors/mbean/constructor/descriptor/field",
136                 "org.apache.commons.modeler.FieldInfo");
137            digester.addSetProperties
138                ("mbeans-descriptors/mbean/constructor/descriptor/field");
139            digester.addSetNext
140                ("mbeans-descriptors/mbean/constructor/descriptor/field",
141                 "addField",
142                 "org.apache.commons.modeler.FieldInfo");
143    
144            digester.addObjectCreate
145                    ("mbeans-descriptors/mbean/constructor/parameter",
146                            "org.apache.commons.modeler.ParameterInfo");
147            digester.addSetProperties
148                    ("mbeans-descriptors/mbean/constructor/parameter");
149            digester.addSetNext
150                    ("mbeans-descriptors/mbean/constructor/parameter",
151                            "addParameter",
152                            "org.apache.commons.modeler.ParameterInfo");
153    
154            digester.addObjectCreate
155                ("mbeans-descriptors/mbean/descriptor/field",
156                 "org.apache.commons.modeler.FieldInfo");
157            digester.addSetProperties
158                ("mbeans-descriptors/mbean/descriptor/field");
159            digester.addSetNext
160                ("mbeans-descriptors/mbean/descriptor/field",
161                 "addField",
162                 "org.apache.commons.modeler.FieldInfo");
163    
164            digester.addObjectCreate
165                    ("mbeans-descriptors/mbean/notification",
166                            "org.apache.commons.modeler.NotificationInfo");
167            digester.addSetProperties
168                    ("mbeans-descriptors/mbean/notification");
169            digester.addSetNext
170                    ("mbeans-descriptors/mbean/notification",
171                            "addNotification",
172                            "org.apache.commons.modeler.NotificationInfo");
173    
174            digester.addObjectCreate
175                ("mbeans-descriptors/mbean/notification/descriptor/field",
176                 "org.apache.commons.modeler.FieldInfo");
177            digester.addSetProperties
178                ("mbeans-descriptors/mbean/notification/descriptor/field");
179            digester.addSetNext
180                ("mbeans-descriptors/mbean/notification/descriptor/field",
181                 "addField",
182                 "org.apache.commons.modeler.FieldInfo");
183    
184            digester.addCallMethod
185                    ("mbeans-descriptors/mbean/notification/notification-type",
186                            "addNotifType", 0);
187    
188            digester.addObjectCreate
189                    ("mbeans-descriptors/mbean/operation",
190                            "org.apache.commons.modeler.OperationInfo");
191            digester.addSetProperties
192                    ("mbeans-descriptors/mbean/operation");
193            digester.addSetNext
194                    ("mbeans-descriptors/mbean/operation",
195                            "addOperation",
196                            "org.apache.commons.modeler.OperationInfo");
197    
198            digester.addObjectCreate
199                ("mbeans-descriptors/mbean/operation/descriptor/field",
200                 "org.apache.commons.modeler.FieldInfo");
201            digester.addSetProperties
202                ("mbeans-descriptors/mbean/operation/descriptor/field");
203            digester.addSetNext
204                ("mbeans-descriptors/mbean/operation/descriptor/field",
205                 "addField",
206                 "org.apache.commons.modeler.FieldInfo");
207    
208            digester.addObjectCreate
209                    ("mbeans-descriptors/mbean/operation/parameter",
210                            "org.apache.commons.modeler.ParameterInfo");
211            digester.addSetProperties
212                    ("mbeans-descriptors/mbean/operation/parameter");
213            digester.addSetNext
214                    ("mbeans-descriptors/mbean/operation/parameter",
215                            "addParameter",
216                            "org.apache.commons.modeler.ParameterInfo");
217    
218            // Process the input file to configure our registry
219            try {
220                digester.parse(stream);
221            } catch (Exception e) {
222                log.error("Error digesting Registry data", e);
223                throw e;
224            }
225            long t2=System.currentTimeMillis();
226    //        if( t2-t1 > 500 )
227            log.info("Loaded registry information (digester) " + ( t2 - t1 ) + " ms");
228        }
229    }