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 }