001: /* -*- Mode: java; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
002: *
003: * ***** BEGIN LICENSE BLOCK *****
004: * Version: MPL 1.1/GPL 2.0
005: *
006: * The contents of this file are subject to the Mozilla Public License Version
007: * 1.1 (the "License"); you may not use this file except in compliance with
008: * the License. You may obtain a copy of the License at
009: * http://www.mozilla.org/MPL/
010: *
011: * Software distributed under the License is distributed on an "AS IS" basis,
012: * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
013: * for the specific language governing rights and limitations under the
014: * License.
015: *
016: * The Original Code is Rhino code, released
017: * May 6, 1999.
018: *
019: * The Initial Developer of the Original Code is
020: * Netscape Communications Corporation.
021: * Portions created by the Initial Developer are Copyright (C) 1997-2000
022: * the Initial Developer. All Rights Reserved.
023: *
024: * Contributor(s):
025: * Igor Bukanov
026: *
027: * Alternatively, the contents of this file may be used under the terms of
028: * the GNU General Public License Version 2 or later (the "GPL"), in which
029: * case the provisions of the GPL are applicable instead of those above. If
030: * you wish to allow use of your version of this file only under the terms of
031: * the GPL and not to allow others to use your version of this file under the
032: * MPL, indicate your decision by deleting the provisions above and replacing
033: * them with the notice and other provisions required by the GPL. If you do
034: * not delete the provisions above, a recipient may use your version of this
035: * file under either the MPL or the GPL.
036: *
037: * ***** END LICENSE BLOCK ***** */
038:
039: package org.mozilla.javascript.xml;
040:
041: import org.mozilla.javascript.*;
042:
043: public abstract class XMLLib {
044: private static final Object XML_LIB_KEY = new Object();
045:
046: /**
047: An object which specifies an XMLLib implementation to be used at runtime.
048:
049: This interface should be considered experimental. It may be better
050: (and certainly more flexible) to write an interface that returns an
051: XMLLib object rather than a class name, for example. But that would
052: cause many more ripple effects in the code, all the way back to
053: {@link ScriptRuntime}.
054: */
055: public static abstract class Factory {
056: public static Factory create(final String className) {
057: return new Factory() {
058: public String getImplementationClassName() {
059: return className;
060: }
061: };
062: }
063:
064: public abstract String getImplementationClassName();
065: }
066:
067: public static XMLLib extractFromScopeOrNull(Scriptable scope) {
068: ScriptableObject so = ScriptRuntime
069: .getLibraryScopeOrNull(scope);
070: if (so == null) {
071: // If library is not yet initialized, return null
072: return null;
073: }
074:
075: // Ensure lazily initialization of real XML library instance
076: // which is done on first access to XML property
077: ScriptableObject.getProperty(so, "XML");
078:
079: return (XMLLib) so.getAssociatedValue(XML_LIB_KEY);
080: }
081:
082: public static XMLLib extractFromScope(Scriptable scope) {
083: XMLLib lib = extractFromScopeOrNull(scope);
084: if (lib != null) {
085: return lib;
086: }
087: String msg = ScriptRuntime.getMessage0("msg.XML.not.available");
088: throw Context.reportRuntimeError(msg);
089: }
090:
091: protected final XMLLib bindToScope(Scriptable scope) {
092: ScriptableObject so = ScriptRuntime
093: .getLibraryScopeOrNull(scope);
094: if (so == null) {
095: // standard library should be initialized at this point
096: throw new IllegalStateException();
097: }
098: return (XMLLib) so.associateValue(XML_LIB_KEY, this );
099: }
100:
101: public abstract boolean isXMLName(Context cx, Object name);
102:
103: public abstract Ref nameRef(Context cx, Object name,
104: Scriptable scope, int memberTypeFlags);
105:
106: public abstract Ref nameRef(Context cx, Object namespace,
107: Object name, Scriptable scope, int memberTypeFlags);
108:
109: /**
110: * Escapes the reserved characters in a value of an attribute.
111: *
112: * @param value Unescaped text
113: * @return The escaped text
114: */
115: public abstract String escapeAttributeValue(Object value);
116:
117: /**
118: * Escapes the reserved characters in a value of a text node.
119: *
120: * @param value Unescaped text
121: * @return The escaped text
122: */
123: public abstract String escapeTextValue(Object value);
124:
125: /**
126: * Construct namespace for default xml statement.
127: */
128: public abstract Object toDefaultXmlNamespace(Context cx,
129: Object uriValue);
130: }
|