fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major/**
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major *
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * Copyright (c) 2006 Sun Microsystems Inc. All Rights Reserved
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major *
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * The contents of this file are subject to the terms
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * of the Common Development and Distribution License
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * (the License). You may not use this file except in
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * compliance with the License.
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major *
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * You can obtain a copy of the License at
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * https://opensso.dev.java.net/public/CDDLv1.0.html or
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * opensso/legal/CDDLv1.0.txt
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * See the License for the specific language governing
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * permission and limitations under the License.
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major *
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * When distributing Covered Code, include this CDDL
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * Header Notice in each file and include the License file
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * at opensso/legal/CDDLv1.0.txt.
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * If applicable, add the following below the CDDL Header,
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * with the fields enclosed by brackets [] replaced by
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * your own identifying information:
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * "Portions Copyrighted [year] [name of copyright owner]"
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major *
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * $Id: XMLParser.java,v 1.2 2008/06/25 05:51:32 qcheng Exp $
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major *
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major */
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Majorpackage com.sun.identity.install.tools.util.xml;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Majorimport java.io.BufferedReader;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Majorimport java.io.Reader;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Majorimport java.util.ArrayList;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major/**
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * This is a simple parser that can be used to parse and create in-memory
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * DOM-like representation of an xml document. The logic for this parser is
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * based on an adhoc implementation which requires that the XML document be
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * well formed syntactically and does not do any further validation of any
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * type.
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major */
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Majorpublic class XMLParser implements IXMLUtilsConstants {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major /**
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * This method returns an ordered colloection of tokens that can together
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * represent the entire XML document. This method is used as the first
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * phase parsing or scanning of the XML document.
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major *
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * @param isreader
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * the reader attached to the source of the document.
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major *
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * @return an ordered collection of <code>Token</code>s that together
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * represent the entire XML document.
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major *
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * @throws Exception
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * if the parse was not successful
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major */
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major ArrayList parse(Reader isreader) throws Exception {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major ArrayList result = new ArrayList();
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major StringBuffer buff = new StringBuffer();
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major int boundCount = 0;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major boolean inComment = false;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major boolean inCompoundToken = false;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major boolean inQuotes = false;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major int length;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major char[] cbuf = new char[1];
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major BufferedReader in = new BufferedReader(isreader);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major while ((length = in.read(cbuf, 0, 1)) != -1) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major char ch = cbuf[0];
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (ch == '"') {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if ((buff.length() != 0) && buff.toString().endsWith("\\")) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.append(ch);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major continue;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major } else {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major inQuotes = !inQuotes;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.append(ch);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major continue;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (inQuotes) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.append(ch);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major continue;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (ch == '<') {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (inComment) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.append(ch);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major } else if (boundCount == 0) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (buff.length() > 0) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major result.add(getXMLTokenFactory().getToken(
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.toString()));
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.delete(0, buff.length());
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.append(ch);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major boundCount++;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major } else if (boundCount > 0) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.append(ch);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major boundCount++;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major } else {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major throw new Exception("Invalid boundCount: " + boundCount);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major } else if (ch == '>') {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (buff.length() >= 1) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (!inComment) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.append(ch);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major boundCount--;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (boundCount == 0) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major result.add(getXMLTokenFactory().getToken(
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.toString()));
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.delete(0, buff.length());
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major continue;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (buff.length() > 1
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major && buff.substring(buff.length() - 2, buff.length())
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major .equals("--")) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.append(ch);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (inComment) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major boundCount--;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major inComment = false;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (boundCount == 0) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major result.add(getXMLTokenFactory().getToken(
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.toString()));
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.delete(0, buff.length());
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major } else {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.append(ch);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major } else {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major throw new Exception("Char > in begining of token");
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major } else if (ch == '-') {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (buff.length() > 2 && buff.toString().startsWith("<!-")) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (!inComment) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major inComment = true;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.append(ch);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major } else {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.append(ch);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (inQuotes) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major throw new Exception("unbalanced quote encountered");
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (boundCount > 0) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major throw new Exception("unbalanced token encountered: boundCount = "
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major + boundCount);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major } else if (boundCount < 0) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major throw new Exception(" invalid boundCount: " + boundCount);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (buff.length() > 0) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major result.add(getXMLTokenFactory().getToken(buff.toString()));
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major in.close();
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major return result;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major /**
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * This method is used as the second phase parser to create an ordered
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * collection of attributes from a given attribute string.
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major *
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * @param attributeString
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * the attribute string fragment to be parsed
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * @return an ordered collection of attributes
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major *
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * @throws Exception
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major * if the parse was not successful
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major */
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major ArrayList parseAttributes(String attributeString) throws Exception {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major ArrayList result = null;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (attributeString != null && attributeString.trim().length() > 0) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major result = new ArrayList();
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major boolean inQuotes = false;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major boolean inName = true;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major boolean inValue = false;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major StringBuffer buff = new StringBuffer();
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major String name = null;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major String value = null;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major for (int i = 0; i < attributeString.length(); i++) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major char ch = attributeString.charAt(i);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (ch == '"') {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if ((buff.length() != 0) && buff.toString().endsWith("\\"))
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.append(ch);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major continue;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major } else {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major inQuotes = !inQuotes;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.append(ch);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major continue;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (inQuotes) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.append(ch);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major continue;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (ch == ' ') {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (inValue) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major value = buff.toString().trim();
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.delete(0, buff.length());
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (name == null || name.trim().length() == 0) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major throw new Exception("Failed to parse attribute: "
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major + attributeString);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major result.add(new XMLElementAttribute(name, value));
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major name = null;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major value = null;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major inValue = false;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major inName = true;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major continue;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (inName) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major continue;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (ch == '=') {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (inName) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major name = buff.toString();
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.delete(0, buff.length());
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major inName = false;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major inValue = true;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major continue;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major buff.append(ch);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (buff.length() > 0) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (!inValue) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major throw new Exception("Failed to parse attributes: "
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major + attributeString);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major if (name == null || name.trim().length() == 0) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major throw new Exception("Failed to parse attribute: "
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major + attributeString);
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major value = buff.toString().trim();
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major result.add(new XMLElementAttribute(name, value));
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major return result;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major XMLParser() {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major setXMLTokenFactory(new XMLTokenFactory());
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major int getNextTokenIndex() {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major return this.getXMLTokenFactory().getNextTokenIndex();
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major private void setXMLTokenFactory(XMLTokenFactory xmlTokenFactory) {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major this.xmlTokenFactory = xmlTokenFactory;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major private XMLTokenFactory getXMLTokenFactory() {
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major return xmlTokenFactory;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major }
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major private XMLTokenFactory xmlTokenFactory;
fb379c70e3fd8a537f311b99be4759ae41e02750Peter Major}