1 /*
2  * reserved comment block
3  * DO NOT REMOVE OR ALTER!
4  */
5 /*
6  * Licensed to the Apache Software Foundation (ASF) under one or more
7  * contributor license agreements.  See the NOTICE file distributed with
8  * this work for additional information regarding copyright ownership.
9  * The ASF licenses this file to You under the Apache License, Version 2.0
10  * (the "License"); you may not use this file except in compliance with
11  * the License.  You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  */
21 
22 package com.sun.org.apache.xalan.internal.xsltc.runtime;
23 
24 import org.xml.sax.SAXException;
25 
26 import com.sun.org.apache.xml.internal.serializer.EmptySerializer;
27 
28 /**
29  * @author Jacek Ambroziak
30  * @author Santiago Pericas-Geertsen
31  * @author Morten Jorgensen
32  */
33 public final class StringValueHandler extends EmptySerializer {
34 
35     private StringBuilder _buffer = new StringBuilder();
36     private String _str = null;
37     private static final String EMPTY_STR = "";
38     private boolean m_escaping = false;
39     private int _nestedLevel = 0;
40 
characters(char[] ch, int off, int len)41     public void characters(char[] ch, int off, int len)
42         throws SAXException
43     {
44         if (_nestedLevel > 0)
45             return;
46 
47         if (_str != null) {
48             _buffer.append(_str);
49             _str = null;
50         }
51         _buffer.append(ch, off, len);
52     }
53 
getValue()54     public String getValue() {
55         if (_buffer.length() != 0) {
56             String result = _buffer.toString();
57             _buffer.setLength(0);
58             return result;
59         }
60         else {
61             String result = _str;
62             _str = null;
63             return (result != null) ? result : EMPTY_STR;
64         }
65     }
66 
characters(String characters)67     public void characters(String characters) throws SAXException {
68         if (_nestedLevel > 0)
69             return;
70 
71         if (_str == null && _buffer.length() == 0) {
72             _str = characters;
73         }
74         else {
75             if (_str != null) {
76                 _buffer.append(_str);
77                 _str = null;
78             }
79 
80             _buffer.append(characters);
81         }
82     }
83 
startElement(String qname)84     public void startElement(String qname) throws SAXException {
85         _nestedLevel++;
86     }
87 
endElement(String qname)88     public void endElement(String qname) throws SAXException {
89         _nestedLevel--;
90     }
91 
92     // Override the setEscaping method just to indicate that this class is
93     // aware that that method might be called.
setEscaping(boolean bool)94     public boolean setEscaping(boolean bool) {
95         boolean oldEscaping = m_escaping;
96         m_escaping = bool;
97 
98         return bool;
99     }
100 
101     /**
102      * The value of a PI must not contain the substring "?>". Should
103      * that substring be present, replace it by "? >".
104      */
getValueOfPI()105     public String getValueOfPI() {
106         final String value = getValue();
107 
108         if (value.indexOf("?>") > 0) {
109             final int n = value.length();
110             final StringBuilder valueOfPI = new StringBuilder();
111 
112             for (int i = 0; i < n;) {
113                 final char ch = value.charAt(i++);
114                 if (ch == '?' && value.charAt(i) == '>') {
115                     valueOfPI.append("? >"); i++;
116                 }
117                 else {
118                     valueOfPI.append(ch);
119                 }
120             }
121             return valueOfPI.toString();
122         }
123         return value;
124     }
125 }
126