001: package org.apache.commons.betwixt.digester;
002:
003: /*
004: * Licensed to the Apache Software Foundation (ASF) under one or more
005: * contributor license agreements. See the NOTICE file distributed with
006: * this work for additional information regarding copyright ownership.
007: * The ASF licenses this file to You under the Apache License, Version 2.0
008: * (the "License"); you may not use this file except in compliance with
009: * the License. You may obtain a copy of the License at
010: *
011: * http://www.apache.org/licenses/LICENSE-2.0
012: *
013: * Unless required by applicable law or agreed to in writing, software
014: * distributed under the License is distributed on an "AS IS" BASIS,
015: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016: * See the License for the specific language governing permissions and
017: * limitations under the License.
018: */
019:
020: import java.beans.PropertyDescriptor;
021: import java.lang.reflect.Method;
022:
023: import org.apache.commons.betwixt.ElementDescriptor;
024: import org.apache.commons.betwixt.TextDescriptor;
025: import org.apache.commons.betwixt.XMLBeanInfo;
026: import org.apache.commons.betwixt.expression.ConstantExpression;
027: import org.apache.commons.betwixt.expression.MethodExpression;
028: import org.apache.commons.betwixt.expression.MethodUpdater;
029: import org.apache.commons.logging.Log;
030: import org.apache.commons.logging.LogFactory;
031: import org.xml.sax.Attributes;
032: import org.xml.sax.SAXException;
033:
034: /**
035: * <p>Rule for parsing <text> elements.
036: * These allow mixed content text to be specified.
037: * A mixed content element example:
038: * <pre>
039: * <foo>text<bar/></foo>
040: * </pre>
041: * </p>
042: *
043: * @author Robert Burrell Donkin
044: * @version $Id: TextRule.java 438373 2006-08-30 05:17:21Z bayard $
045: */
046: public class TextRule extends MappedPropertyRule {
047:
048: /** Logger */
049: private static final Log log = LogFactory.getLog(TextRule.class);
050:
051: /** Base constructor */
052: public TextRule() {
053: }
054:
055: // Rule interface
056: //-------------------------------------------------------------------------
057:
058: /**
059: * Process the beginning of this element.
060: *
061: * @param attributes The attribute list of this element
062: * @throws SAXException 1. If this tag's parent is not an element tag.
063: * 2. If this tag has a value attribute together with either a property
064: * or type attribute.
065: */
066: public void begin(String name, String namespace,
067: Attributes attributes) throws SAXException {
068:
069: TextDescriptor descriptor = new TextDescriptor();
070:
071: String value = attributes.getValue("value");
072: String propertyName = attributes.getValue("property");
073: String propertyType = attributes.getValue("type");
074:
075: if (value != null) {
076: if (propertyName != null || propertyType != null) {
077: // not allowed
078: throw new SAXException(
079: "You cannot specify attribute 'value' together with either "
080: + " the 'property' or 'type' attributes");
081: }
082: // fixed value text
083: descriptor.setTextExpression(new ConstantExpression(value));
084:
085: } else {
086: // property based text
087: descriptor.setPropertyName(propertyName);
088:
089: Class beanClass = getBeanClass();
090:
091: // set the property type using reflection
092: descriptor.setPropertyType(getPropertyType(propertyType,
093: beanClass, propertyName));
094:
095: if (beanClass != null) {
096: String descriptorPropertyName = descriptor
097: .getPropertyName();
098: PropertyDescriptor propertyDescriptor = getPropertyDescriptor(
099: beanClass, descriptorPropertyName);
100: if (propertyDescriptor != null) {
101: Method readMethod = propertyDescriptor
102: .getReadMethod();
103: descriptor.setTextExpression(new MethodExpression(
104: readMethod));
105: Method writeMethod = propertyDescriptor
106: .getWriteMethod();
107: if (writeMethod != null) {
108: descriptor.setUpdater(new MethodUpdater(
109: writeMethod));
110: }
111: getProcessedPropertyNameSet().add(
112: descriptorPropertyName);
113: }
114: }
115: }
116:
117: Object top = digester.peek();
118: if (top instanceof XMLBeanInfo) {
119: XMLBeanInfo beanInfo = (XMLBeanInfo) top;
120: ElementDescriptor elementDescriptor = beanInfo
121: .getElementDescriptor();
122: if (elementDescriptor != null) {
123: elementDescriptor.addContentDescriptor(descriptor);
124: }
125:
126: } else if (top instanceof ElementDescriptor) {
127: ElementDescriptor parent = (ElementDescriptor) top;
128: parent.addContentDescriptor(descriptor);
129:
130: } else {
131: throw new SAXException("Invalid use of <text>. It should "
132: + "be nested <text> nodes");
133: }
134: }
135: }
|