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.digester; 018 019 import java.util.HashSet; 020 import java.util.Set; 021 022 import javax.xml.parsers.SAXParser; 023 024 import org.apache.commons.betwixt.XMLIntrospector; 025 import org.apache.commons.digester.Digester; 026 import org.apache.commons.logging.Log; 027 import org.apache.commons.logging.LogFactory; 028 import org.xml.sax.XMLReader; 029 030 /** <p><code>XMLBeanInfoDigester</code> is a digester of XML files 031 * containing XMLBeanInfo definitions for a JavaBean.</p> 032 * 033 * @author <a href="mailto:jstrachan@apache.org">James Strachan</a> 034 * @version $Revision: 438373 $ 035 */ 036 public class XMLBeanInfoDigester extends Digester { 037 038 /** Logger */ 039 private static final Log log = LogFactory.getLog( XMLBeanInfoDigester.class ); 040 041 /** the beans class for this XML descriptor */ 042 private Class beanClass; 043 044 /** should attributes or elements be used for primitive types */ 045 private boolean attributesForPrimitives; 046 047 /** the set of property names processed so far */ 048 private Set processedPropertyNameSet = new HashSet(); 049 050 /** the introspector that is using me */ 051 private XMLIntrospector introspector; 052 053 /** 054 * Construct a new XMLBeanInfoDigester with default properties. 055 */ 056 public XMLBeanInfoDigester() { 057 } 058 059 /** 060 * Construct a new XMLBeanInfoDigester, allowing a SAXParser to be passed in. This 061 * allows XMLBeanInfoDigester to be used in environments which are unfriendly to 062 * JAXP1.1 (such as WebLogic 6.0). Thanks for the request to change go to 063 * James House (james@interobjective.com). This may help in places where 064 * you are able to load JAXP 1.1 classes yourself. 065 * 066 * @param parser the <code>SAXParser</code> to be used to parse the xml 067 */ 068 public XMLBeanInfoDigester(SAXParser parser) { 069 super(parser); 070 } 071 072 /** 073 * Construct a new XMLBeanInfoDigester, allowing an XMLReader to be passed in. This 074 * allows XMLBeanInfoDigester to be used in environments which are unfriendly to 075 * JAXP1.1 (such as WebLogic 6.0). Note that if you use this option you 076 * have to configure namespace and validation support yourself, as these 077 * properties only affect the SAXParser and emtpy constructor. 078 * 079 * @param reader the <code>XMLReader</code> to be used to parse the xml 080 */ 081 public XMLBeanInfoDigester(XMLReader reader) { 082 super(reader); 083 } 084 085 /** 086 * Gets the class of the bean whose .betwixt file is being processed 087 * 088 * @return the beans class for this XML descriptor 089 */ 090 public Class getBeanClass() { 091 return beanClass; 092 } 093 094 /** 095 * Sets the beans class for this XML descriptor 096 * 097 * @param beanClass the <code>Class</code> of the bean being processed 098 */ 099 public void setBeanClass(Class beanClass) { 100 this.beanClass = beanClass; 101 } 102 103 104 /** 105 * Gets the property names already processed 106 * 107 * @return the set of property names that have been processed so far 108 */ 109 public Set getProcessedPropertyNameSet() { 110 return processedPropertyNameSet; 111 } 112 113 /** 114 * Should attributes (or elements) be used for primitive types? 115 * @return true if primitive properties should be written as attributes in the xml 116 */ 117 public boolean isAttributesForPrimitives() { 118 return attributesForPrimitives; 119 } 120 121 /** 122 * Set whether attributes (or elements) should be used for primitive types. 123 * @param attributesForPrimitives pass true if primitive properties should be 124 * written as attributes 125 */ 126 public void setAttributesForPrimitives(boolean attributesForPrimitives) { 127 this.attributesForPrimitives = attributesForPrimitives; 128 if ( introspector != null ) { 129 introspector.getConfiguration() 130 .setAttributesForPrimitives( attributesForPrimitives ); 131 } 132 } 133 134 /** 135 * Gets the XMLIntrospector that's using this digester. 136 * 137 * @return the introspector that is using me 138 */ 139 public XMLIntrospector getXMLIntrospector() { 140 return introspector; 141 } 142 143 /** 144 * Sets the introspector that is using me 145 * @param introspector the <code>XMLIntrospector</code> that using this for .betwixt 146 * digestion 147 */ 148 public void setXMLIntrospector(XMLIntrospector introspector) { 149 this.introspector = introspector; 150 } 151 152 // Implementation methods 153 //------------------------------------------------------------------------- 154 /** Reset configure for new digestion */ 155 protected void configure() { 156 if (! configured) { 157 configured = true; 158 159 // add the various rules 160 161 addRule( "info", new InfoRule() ); 162 addRuleSet(new CommonRuleSet()); 163 164 } 165 166 // now initialize 167 setAttributesForPrimitives(attributesForPrimitives); 168 processedPropertyNameSet.clear(); 169 } 170 171 }