vgritsenko 2002/06/19 21:24:31
Modified: src/java/org/apache/cocoon/components/xscript
StringBufferContentHandler.java
Log:
Escape reserved XML symbols: <, >, & with entities < > &
Revision Changes Path
1.5 +53 -17
xml-cocoon2/src/java/org/apache/cocoon/components/xscript/StringBufferContentHandler.java
Index: StringBufferContentHandler.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/xscript/StringBufferContentHandler.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- StringBufferContentHandler.java 22 Feb 2002 07:00:15 -0000 1.4
+++ StringBufferContentHandler.java 20 Jun 2002 04:24:31 -0000 1.5
@@ -67,6 +67,7 @@
* a <code>StringBuffer</code> object.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Ovidiu Predescu</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Vadim Gritsenko</a>
* @version CVS $Id$
* @since August 30, 2001
*/
@@ -75,7 +76,7 @@
private Stack namespaces = new Stack();
ContentHandler contentHandler;
StringBuffer stringBuffer;
- static Marker marker = new Marker();
+ static Object marker = new Object();
public StringBufferContentHandler(StringBuffer stringBuffer)
{
@@ -106,13 +107,15 @@
lastNamespaceIndex = namespaces.size() - 1;
while(lastNamespaceIndex >= 0
- && namespaces.elementAt(lastNamespaceIndex) != marker)
+ && namespaces.elementAt(lastNamespaceIndex) != marker) {
lastNamespaceIndex--;
+ }
- if (lastNamespaceIndex < 0)
+ if (lastNamespaceIndex < 0) {
lastNamespaceIndex = 0;
- else if (namespaces.elementAt(lastNamespaceIndex) == marker)
+ } else if (namespaces.elementAt(lastNamespaceIndex) == marker) {
lastNamespaceIndex++;
+ }
namespaces.push(marker);
@@ -135,8 +138,9 @@
j >= lastNamespaceIndex;
j--) {
Object obj = namespaces.elementAt(j);
- if (obj == marker)
+ if (obj == marker) {
continue;
+ }
NPU npu = (NPU)obj;
if (name.equals(npu.prefix)) {
@@ -148,19 +152,20 @@
if (!found) {
namespaces.push(new NPU(name, a.getValue(i)));
}
- }
- else {
+ } else {
// Normal attribute
- stringBuffer.append(" ").append(a.getQName(i))
-
.append("=\"").append(a.getValue(i)).append("\"");
+ stringBuffer.append(" ").append(a.getQName(i)).append("=\"");
+ escape(stringBuffer, a.getValue(i));
+ stringBuffer.append("\"");
}
}
if (namespaces.size() != 0) {
for (int i = namespaces.size() - 1; i >= lastNamespaceIndex; i--) {
Object obj = namespaces.elementAt(i);
- if (obj == marker)
+ if (obj == marker) {
continue;
+ }
NPU npu = (NPU)obj;
stringBuffer.append("
xmlns:").append(npu.prefix).append("=\"").append(npu.uri).append("\"");
}
@@ -182,8 +187,43 @@
public void characters(char ch[], int start, int len)
throws SAXException
{
- stringBuffer.append(ch, start, len);
+ escape(stringBuffer, ch, start, len);
}
+
+
+ /**
+ * Copies string into buffer and
+ * escapes all '<', '&' and '>' chars in the string with
+ * corresponding entities.
+ */
+ private static void escape(StringBuffer buffer, String s) {
+ char[] ch = s.toCharArray();
+ escape(buffer, ch, 0, ch.length);
+ }
+
+ /**
+ * Copies characters from the char array into buffer and
+ * escapes all '<', '&' and '>' chars with corresponding
+ * entities.
+ */
+ private static void escape(StringBuffer buffer, char ch[], int start,
int len) {
+ for (int i = start; i < start + len; i++) {
+ switch (ch[i]) {
+ case '<':
+ buffer.append("<");
+ break;
+ case '&':
+ buffer.append("&");
+ break;
+ case '>':
+ buffer.append(">");
+ break;
+ default:
+ buffer.append(ch[i]);
+ break;
+ }
+ }
+ }
}
class NPU
@@ -199,10 +239,6 @@
public String toString()
{
- return new
StringBuffer(this.prefix).append("=").append(this.uri).toString();
+ return this.prefix + "=" + this.uri;
}
-}
-
-class Marker
-{
}
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]