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;
+ }
}