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 }