src/java.xml/share/classes/com/sun/org/apache/xml/internal/resolver/helpers/PublicId.java

Print this page

        

*** 1,19 **** /* ! * reserved comment block ! * DO NOT REMOVE OR ALTER! ! */ ! // PublicId.java - Information about public identifiers ! ! /* ! * Copyright 2001-2004 The Apache Software Foundation or its licensors, ! * as applicable. * - * 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. --- 1,13 ---- /* ! * Licensed to the Apache Software Foundation (ASF) under one or more ! * contributor license agreements. See the NOTICE file distributed with ! * this work for additional information regarding copyright ownership. ! * The ASF licenses this file to You 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.
*** 32,43 **** * @author Norman Walsh * <a href="mailto:Norman.Walsh@Sun.COM">Norman.Walsh@Sun.COM</a> * */ public abstract class PublicId { - protected PublicId() { } /** * Normalize a public identifier. * * <p>Public identifiers must be normalized according to the following * rules before comparisons between them can be made:</p> --- 26,38 ---- * @author Norman Walsh * <a href="mailto:Norman.Walsh@Sun.COM">Norman.Walsh@Sun.COM</a> * */ public abstract class PublicId { + protected PublicId() {} + /** * Normalize a public identifier. * * <p>Public identifiers must be normalized according to the following * rules before comparisons between them can be made:</p>
*** 66,76 **** int pos; while ((pos = normal.indexOf(" ")) >= 0) { normal = normal.substring(0, pos) + normal.substring(pos+1); } - return normal; } /** * Encode a public identifier as a "publicid" URN. --- 61,70 ----
*** 95,105 **** urn = PublicId.stringReplace(urn, "::", ";"); urn = PublicId.stringReplace(urn, ":", "%3A"); urn = PublicId.stringReplace(urn, "//", ":"); urn = PublicId.stringReplace(urn, "/", "%2F"); ! return "urn:publicid:" + urn; } /** * Decode a "publicid" URN into a public identifier. * --- 89,102 ---- urn = PublicId.stringReplace(urn, "::", ";"); urn = PublicId.stringReplace(urn, ":", "%3A"); urn = PublicId.stringReplace(urn, "//", ":"); urn = PublicId.stringReplace(urn, "/", "%2F"); ! StringBuilder buffer = new StringBuilder(13 + urn.length()); ! buffer.append("urn:publicid:"); ! buffer.append(urn); ! return buffer.toString(); } /** * Decode a "publicid" URN into a public identifier. *
*** 109,161 **** * @param urn The urn:publicid: URN * * @return The normalized identifier. */ public static String decodeURN(String urn) { ! String publicId = ""; ! if (urn.startsWith("urn:publicid:")) { publicId = urn.substring(13); ! } else { return urn; } publicId = PublicId.stringReplace(publicId, "%2F", "/"); publicId = PublicId.stringReplace(publicId, ":", "//"); publicId = PublicId.stringReplace(publicId, "%3A", ":"); publicId = PublicId.stringReplace(publicId, ";", "::"); publicId = PublicId.stringReplace(publicId, "+", " "); publicId = PublicId.stringReplace(publicId, "%2B", "+"); publicId = PublicId.stringReplace(publicId, "%23", "#"); publicId = PublicId.stringReplace(publicId, "%3F", "?"); publicId = PublicId.stringReplace(publicId, "%27", "'"); publicId = PublicId.stringReplace(publicId, "%3B", ";"); publicId = PublicId.stringReplace(publicId, "%25", "%"); return publicId; } /** * Replace one string with another. - * */ private static String stringReplace(String str, String oldStr, String newStr) { - - String result = ""; int pos = str.indexOf(oldStr); ! ! // System.out.println(str + ": " + oldStr + " => " + newStr); ! ! while (pos >= 0) { ! // System.out.println(str + " (" + pos + ")"); ! result += str.substring(0, pos); ! result += newStr; ! str = str.substring(pos+1); ! ! pos = str.indexOf(oldStr); } ! ! return result + str; } } --- 106,169 ---- * @param urn The urn:publicid: URN * * @return The normalized identifier. */ public static String decodeURN(String urn) { ! String publicId; if (urn.startsWith("urn:publicid:")) { publicId = urn.substring(13); ! } ! else { return urn; } + final boolean hasEscape = (publicId.indexOf('%') >= 0); + if (hasEscape) { publicId = PublicId.stringReplace(publicId, "%2F", "/"); + } publicId = PublicId.stringReplace(publicId, ":", "//"); + if (hasEscape) { publicId = PublicId.stringReplace(publicId, "%3A", ":"); + } publicId = PublicId.stringReplace(publicId, ";", "::"); publicId = PublicId.stringReplace(publicId, "+", " "); + if (hasEscape) { publicId = PublicId.stringReplace(publicId, "%2B", "+"); publicId = PublicId.stringReplace(publicId, "%23", "#"); publicId = PublicId.stringReplace(publicId, "%3F", "?"); publicId = PublicId.stringReplace(publicId, "%27", "'"); publicId = PublicId.stringReplace(publicId, "%3B", ";"); publicId = PublicId.stringReplace(publicId, "%25", "%"); + } return publicId; } /** * Replace one string with another. */ private static String stringReplace(String str, String oldStr, String newStr) { int pos = str.indexOf(oldStr); ! if (pos >= 0) { ! final StringBuilder buffer = new StringBuilder(); ! final int oldStrLength = oldStr.length(); ! int start = 0; ! do { ! for (int i = start; i < pos; ++i) { ! buffer.append(str.charAt(i)); } ! buffer.append(newStr); ! start = pos + oldStrLength; ! pos = str.indexOf(oldStr, start); } + while (pos >= 0); + final int strLength = str.length(); + for (int i = start; i < strLength; ++i) { + buffer.append(str.charAt(i)); + } + return buffer.toString(); + } + return str; + } }