001: /*
002: * JavuX - Java Component Set
003: * Copyright (c) 2005-2007 Krzysztof A. Sadlocha
004: * e-mail: ksadlocha@programics.com
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation; either
009: * version 2.1 of the License, or (at your option) any later version.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: * You should have received a copy of the GNU Lesser General Public
017: * License along with this library; if not, write to the Free Software
018: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
019: */
020:
021: package com.javujavu.javux.proptree;
022:
023: /**
024: * This class contains methods encoding, decoding String values
025: * for property tree document readers and writers
026: * <br>
027: * <b>This class is thread safe.</b>
028: **/
029: public class PropTreeDocCoder {
030:
031: public static String decode(String in) {
032: if (in.indexOf('&') == -1)
033: return in;
034: int len = in.length();
035: StringBuffer out = new StringBuffer(len);
036: char c;
037: int wasAmp = 0;
038: int ampPos = 0;
039: int ampVal = 0;
040: for (int i = 0; i < len; i++) {
041: c = in.charAt(i);
042: if (wasAmp == 0) {
043: if (c == '&') {
044: wasAmp = 100;
045: ampPos = i;
046: } else
047: out.append(c);
048: } else if (wasAmp == 100) {
049: wasAmp = (c == '#') ? 200 : 5000;
050: } else if (wasAmp == 200) {
051: if (c >= '0' && c <= '9') {
052: wasAmp = 300;
053: ampVal = c - '0';
054: } else if (c == 'x' || c == 'X') {
055: wasAmp = 400;
056: ampVal = 0;
057: } else
058: wasAmp = 5000;
059: } else if (c == ';') {
060: out.append((char) ampVal);
061: wasAmp = 0;
062: } else if (wasAmp == 300) {
063: if (c >= '0' && c <= '9') {
064: ampVal = ampVal * 10 + c - '0';
065: } else
066: wasAmp = 5000;
067: } else// if(wasAmp==400)
068: {
069: if (c >= '0' && c <= '9') {
070: ampVal = ampVal * 16 + c - '0';
071: } else if (c >= 'a' && c <= 'f') {
072: ampVal = ampVal * 16 + c - 'a' + 10;
073: }
074: if (c >= 'A' && c <= 'F') {
075: ampVal = ampVal * 16 + c - 'A' + 10;
076: } else
077: wasAmp = 5000;
078: }
079: if (wasAmp == 5000) {
080: out.append('&');
081: i = ampPos;
082: wasAmp = 0;
083: }
084: }
085: return out.toString();
086: }
087:
088: public static String encode(String in, boolean isUnicode) {
089: int l = in.length();
090: char c;
091: StringBuffer out = new StringBuffer(l * 2);
092: for (int i = 0; i < l; i++) {
093: c = in.charAt(i);
094: if (c == '&' && i + 1 < l && in.charAt(i + 1) == '#') {
095: out.append("&");
096: } else if ((c < 32 && c != '\t')
097: || (c >= 127 && !isUnicode)) {
098: out.append("&#");
099: out.append((int) c);
100: out.append(';');
101: } else
102: out.append(c);
103: }
104: return out.toString();
105: }
106:
107: }
|