1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
/*
* Copyright 2002-2004 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.
*
*/
package org.apache.tools.ant.types.resolver;
import org.apache.xml.resolver.Catalog;
import org.apache.xml.resolver.CatalogEntry;
import org.apache.xml.resolver.helpers.PublicId;
/**
* This class extends the Catalog class provided by Norman Walsh's
* resolver library in xml-commons in order to add classpath entity
* and URI resolution. Since XMLCatalog already does classpath
* resolution, we simply add all CatalogEntry instances back to the
* controlling XMLCatalog instance. This is done via a callback
* mechanism. ApacheCatalog is <em>only</em> used for external
* catalog files. Inline entries (currently <code><dtd></code>
* and <code><entity></code>) are not added to ApacheCatalog.
* See XMLCatalog.java for the details of the entity and URI
* resolution algorithms.
*
* @see org.apache.tools.ant.types.XMLCatalog.CatalogResolver
* @author <a href="mailto:cstrong@arielpartners.com">Craeg Strong</a>
* @version $Id$
* @since Ant 1.6
*/
public class ApacheCatalog extends Catalog {
/** The resolver object to callback. */
private ApacheCatalogResolver resolver = null;
/**
* <p>Create a new ApacheCatalog instance.</p>
*
* <p>This method overrides the superclass method of the same name
* in order to set the resolver object for callbacks. The reason
* we have to do this is that internally Catalog creates a new
* instance of itself for each external catalog file processed.
* That is, if two external catalog files are processed, there
* will be a total of two ApacheCatalog instances, and so on.</p>
*/
protected Catalog newCatalog() {
ApacheCatalog cat = (ApacheCatalog) super.newCatalog();
cat.setResolver(resolver);
return cat;
}
/** Set the resolver object to callback. */
public void setResolver(ApacheCatalogResolver resolver) {
this.resolver = resolver;
}
/**
* <p>This method overrides the superclass method of the same name
* in order to add catalog entries back to the controlling
* XMLCatalog instance. In this way, we can add classpath lookup
* for these entries.</p>
*
* <p>When we add an external catalog file, the entries inside it
* get parsed by this method. Therefore, we override it to add
* each of them back to the controlling XMLCatalog instance. This
* is done by performing a callback to the ApacheCatalogResolver,
* which in turn calls the XMLCatalog.</p>
*
* <p>XMLCatalog currently only understands <code>PUBLIC</code>
* and <code>URI</code> entry types, so we ignore the other types.</p>
*
* @param entry The CatalogEntry to process.
*/
public void addEntry(CatalogEntry entry) {
int type = entry.getEntryType();
if (type == PUBLIC) {
String publicid = PublicId.normalize(entry.getEntryArg(0));
String systemid = normalizeURI(entry.getEntryArg(1));
if (resolver == null) {
catalogManager.debug
.message(1, "Internal Error: null ApacheCatalogResolver");
} else {
resolver.addPublicEntry(publicid, systemid, base);
}
} else if (type == URI) {
String uri = normalizeURI(entry.getEntryArg(0));
String altURI = normalizeURI(entry.getEntryArg(1));
if (resolver == null) {
catalogManager.debug
.message(1, "Internal Error: null ApacheCatalogResolver");
} else {
resolver.addURIEntry(uri, altURI, base);
}
}
super.addEntry(entry);
}
} //- ApacheCatalog
|