RewriteSystem.java revision 863:56972d2827cb
1/*
2 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25package javax.xml.catalog;
26
27import java.net.URL;
28
29/**
30 * Represents a rewriteSystem entry.
31 *
32 * @since 9
33 */
34final class RewriteSystem extends BaseEntry {
35    String systemIdStartString;
36    URL rewritePrefix;
37
38    /**
39     * Construct a rewriteSystem entry.
40     *
41     * @param systemIdStartString The systemIdStartString attribute.
42     * @param rewritePrefix The rewritePrefix attribute.
43     */
44    public RewriteSystem(String base, String systemIdStartString, String rewritePrefix) {
45        super(CatalogEntryType.REWRITESYSTEM, base);
46        setSystemIdStartString (systemIdStartString);
47        setRewritePrefix(rewritePrefix);
48    }
49
50    /**
51     * Set the systemIdStartString attribute.
52     * @param systemIdStartString The systemIdStartString attribute value.
53     */
54    public void setSystemIdStartString (String systemIdStartString) {
55        CatalogMessages.reportNPEOnNull("systemIdStartString", systemIdStartString);
56        this.systemIdStartString = Normalizer.normalizeURI(systemIdStartString);
57    }
58
59    /**
60     * Set the rewritePrefix attribute. If the value of the rewritePrefix attribute
61     * is relative, it must be made absolute with respect to the base URI currently in effect.
62     * @param rewritePrefix The rewritePrefix attribute value.
63     */
64    public void setRewritePrefix(String rewritePrefix) {
65        this.rewritePrefix = verifyURI("setRewritePrefix", baseURI, rewritePrefix);
66    }
67
68    /**
69     * Get the systemIdStartString attribute.
70     * @return The systemIdStartString
71     */
72    public String getSystemIdStartString () {
73        return systemIdStartString;
74    }
75
76    /**
77     * Get the rewritePrefix attribute.
78     * @return The rewritePrefix attribute value.
79     */
80    public URL getRewritePrefix() {
81        return rewritePrefix;
82    }
83
84    /**
85     * Try to match the specified systemId with the entry. Return the match if it
86     * is successful and the length of the systemIdStartString is longer than the
87     * longest of any previous match.
88     *
89     * @param systemId The systemId to be matched.
90     * @param currentMatch The length of systemIdStartString of previous match if any.
91     * @return The replacement URI if the match is successful, null if not.
92     */
93    public String match(String systemId, int currentMatch) {
94        if (systemIdStartString.length() < systemId.length() &&
95                systemIdStartString.equals(systemId.substring(0, systemIdStartString.length()))) {
96            if (currentMatch < systemIdStartString.length()) {
97                String prefix = rewritePrefix.toExternalForm();
98                String sysId;
99                if (systemIdStartString.endsWith(SLASH)) {
100                    sysId = systemId.substring(systemIdStartString.length());
101                } else {
102                    sysId = systemId.substring(systemIdStartString.length() + 1);
103                }
104                if (prefix.endsWith(SLASH)) {
105                    return prefix + sysId;
106                } else {
107                    return prefix + SLASH + sysId;
108                }
109            }
110        }
111        return null;
112    }
113
114    /**
115     * Try to match the specified systemId with the entry.
116     *
117     * @param systemId The systemId to be matched.
118     * @return The replacement URI if the match is successful, null if not.
119     */
120    @Override
121    public String match(String systemId) {
122        return match(systemId, 0);
123    }
124}
125