/*
* Copyright 1999,2004,2012 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Copied from GenerationJava Core Library.
//package com.generationjava.web;
// Copied in kune from:
// http://svn.apache.org/repos/asf/jakarta/taglibs/proper/string/trunk/src/org/apache/taglibs/string/util/XmlW.java
package cc.kune.core.server.utils;
import org.apache.commons.lang.StringUtils;
// TODO: Auto-generated Javadoc
/**
* XML helping static methods.
*
* @author bayard@generationjava.com
* @version 0.4 20010812
*/
final public class XmlW {
// @PMD:REVIEWED:AvoidReassigningParameters: by vjrj on 21/05/09 14:13
/**
* Escape xml.
*
* @param str
* the str
* @return the string
*/
static public String escapeXml(String str) {
str = StringUtils.replace(str, "&", "&");
str = StringUtils.replace(str, "<", "<");
str = StringUtils.replace(str, ">", ">");
str = StringUtils.replace(str, "\"", """);
str = StringUtils.replace(str, "'", "'");
return str;
}
/**
* Gets the attribute.
*
* @param attribute
* the attribute
* @param text
* the text
* @return the attribute
*/
static public String getAttribute(final String attribute, final String text) {
return getAttribute(attribute, text, 0);
}
/**
* Gets the attribute.
*
* @param attribute
* the attribute
* @param text
* the text
* @param idx
* the idx
* @return the attribute
*/
static public String getAttribute(final String attribute, final String text, final int idx) {
final int close = text.indexOf(">", idx);
final int attrIdx = text.indexOf(attribute + "=\"", idx);
if (attrIdx == -1) {
return null;
}
if (attrIdx > close) {
return null;
}
final int attrStartIdx = attrIdx + attribute.length() + 2;
final int attrCloseIdx = text.indexOf("\"", attrStartIdx);
if (attrCloseIdx > close) {
return null;
}
return unescapeXml(text.substring(attrStartIdx, attrCloseIdx));
}
// @PMD:REVIEWED:AvoidReassigningParameters: by vjrj on 21/05/09 14:13
/**
* Gets the content.
*
* @param tag
* the tag
* @param text
* the text
* @return the content
*/
static public String getContent(final String tag, String text) {
int idx = XmlW.getIndexOpeningTag(tag, text);
if (idx == -1) {
return "";
}
text = text.substring(idx);
final int end = XmlW.getIndexClosingTag(tag, text);
idx = text.indexOf('>');
if (idx == -1) {
return "";
}
return text.substring(idx + 1, end);
}
// Pass in "para" and a string that starts with
// <para> and it will return the index of the matching </para>
// It assumes well-formed xml. Or well enough.
/**
* Gets the index closing tag.
*
* @param tag
* the tag
* @param text
* the text
* @return the index closing tag
*/
static public int getIndexClosingTag(final String tag, final String text) {
return getIndexClosingTag(tag, text, 0);
}
/**
* Gets the index closing tag.
*
* @param tag
* the tag
* @param text
* the text
* @param start
* the start
* @return the index closing tag
*/
static public int getIndexClosingTag(final String tag, final String text, final int start) {
final String open = "<" + tag;
final String close = "</" + tag + ">";
// System.err.println("OPEN: "+open);
// System.err.println("CLOSE: "+close);
final int closeSz = close.length();
int nextCloseIdx = text.indexOf(close, start);
// System.err.println("first close: "+nextCloseIdx);
if (nextCloseIdx == -1) {
return -1;
}
int count = StringUtils.countMatches(text.substring(start, nextCloseIdx), open);
// System.err.println("count: "+count);
if (count == 0) {
return -1; // tag is never opened
}
int expected = 1;
while (count != expected) {
nextCloseIdx = text.indexOf(close, nextCloseIdx + closeSz);
if (nextCloseIdx == -1) {
return -1;
}
count = StringUtils.countMatches(text.substring(start, nextCloseIdx), open);
expected++;
}
return nextCloseIdx;
}
/**
* Gets the index opening tag.
*
* @param tag
* the tag
* @param text
* the text
* @return the index opening tag
*/
static public int getIndexOpeningTag(final String tag, final String text) {
return getIndexOpeningTag(tag, text, 0);
}
/**
* Gets the index opening tag.
*
* @param tag
* the tag
* @param text
* the text
* @param start
* the start
* @return the index opening tag
*/
static private int getIndexOpeningTag(final String tag, final String text, final int start) {
// consider whitespace?
final int idx = text.indexOf("<" + tag, start);
if (idx == -1) {
return -1;
}
final char next = text.charAt(idx + 1 + tag.length());
if ((next == '>') || Character.isWhitespace(next)) {
return idx;
} else {
return getIndexOpeningTag(tag, text, idx + 1);
}
}
/**
* Remove any xml tags from a String. Same as HtmlW's method.
*
* @param str
* the str
* @return the string
*/
static public String removeXml(final String str) {
final int sz = str.length();
final StringBuffer buffer = new StringBuffer(sz);
// boolean inString = false;
boolean inTag = false;
for (int i = 0; i < sz; i++) {
final char ch = str.charAt(i);
if (ch == '<') {
inTag = true;
} else if (ch == '>') {
inTag = false;
continue;
}
if (!inTag) {
buffer.append(ch);
}
}
return buffer.toString();
}
// @PMD:REVIEWED:AvoidReassigningParameters: by vjrj on 21/05/09 14:13
/**
* Unescape xml.
*
* @param str
* the str
* @return the string
*/
static public String unescapeXml(String str) {
str = StringUtils.replace(str, "&", "&");
str = StringUtils.replace(str, "<", "<");
str = StringUtils.replace(str, ">", ">");
str = StringUtils.replace(str, """, "\"");
str = StringUtils.replace(str, "'", "'");
return str;
}
}