01: /*
02: * Licensed to the Apache Software Foundation (ASF) under one or more
03: * contributor license agreements. See the NOTICE file distributed with
04: * this work for additional information regarding copyright ownership.
05: * The ASF licenses this file to You under the Apache License, Version 2.0
06: * (the "License"); you may not use this file except in compliance with
07: * the License. You may obtain a copy of the License at
08: *
09: * http://www.apache.org/licenses/LICENSE-2.0
10: *
11: * Unless required by applicable law or agreed to in writing, software
12: * distributed under the License is distributed on an "AS IS" BASIS,
13: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14: * See the License for the specific language governing permissions and
15: * limitations under the License.
16: */
17:
18: package org.apache.xerces.xinclude;
19:
20: import org.apache.xerces.xni.NamespaceContext;
21:
22: /**
23: * This is an implementation of NamespaceContext which is intended to be used for
24: * XInclude processing. It enables each context to be marked as invalid, if necessary,
25: * to indicate that the namespaces recorded on those contexts won't be apparent in the
26: * resulting infoset.
27: *
28: * @author Peter McCracken, IBM
29: *
30: * @version $Id: XIncludeNamespaceSupport.java 447243 2006-09-18 05:15:27Z mrglavas $
31: */
32: public class XIncludeNamespaceSupport extends
33: MultipleScopeNamespaceSupport {
34:
35: /**
36: * This stores whether or not the context at the matching depth was valid.
37: */
38: private boolean[] fValidContext = new boolean[8];
39:
40: /**
41: *
42: */
43: public XIncludeNamespaceSupport() {
44: super ();
45: }
46:
47: /**
48: * @param context
49: */
50: public XIncludeNamespaceSupport(NamespaceContext context) {
51: super (context);
52: }
53:
54: /**
55: * Pushes a new context onto the stack.
56: */
57: public void pushContext() {
58: super .pushContext();
59: if (fCurrentContext + 1 == fValidContext.length) {
60: boolean[] contextarray = new boolean[fValidContext.length * 2];
61: System.arraycopy(fValidContext, 0, contextarray, 0,
62: fValidContext.length);
63: fValidContext = contextarray;
64: }
65:
66: fValidContext[fCurrentContext] = true;
67: }
68:
69: /**
70: * This method is used to set a context invalid for XInclude namespace processing.
71: * Any context defined by an <include> or <fallback> element is not
72: * valid for processing the include parent's [in-scope namespaces]. Thus, contexts
73: * defined by these elements are set to invalid by the XInclude processor using
74: * this method.
75: */
76: public void setContextInvalid() {
77: fValidContext[fCurrentContext] = false;
78: }
79:
80: /**
81: * This returns the namespace URI which was associated with the given pretext, in
82: * the context that existed at the include parent of the current element. The
83: * include parent is the last element, before the current one, which was not set
84: * to an invalid context using setContextInvalid()
85: *
86: * @param prefix the prefix of the desired URI
87: * @return the URI corresponding to the prefix in the context of the include parent
88: */
89: public String getURIFromIncludeParent(String prefix) {
90: int lastValidContext = fCurrentContext - 1;
91: while (lastValidContext > 0 && !fValidContext[lastValidContext]) {
92: lastValidContext--;
93: }
94: return getURI(prefix, lastValidContext);
95: }
96: }
|