JDK-8019345 & 8294241: Deprecate URL public constructors
Peter Firmstone
peter.firmstone at zeus.net.au
Sun Nov 10 07:26:06 UTC 2024
Our code addresses compatibility:
/** Fixes windows file URI string by converting back slashes to forward
* slashes and inserting a forward slash before the drive letter if
it is
* missing. No normalisation or modification of case is performed.
* @param uri String representation of URI
* @return fixed URI String
*/
public static String fixWindowsURI(String uri) {
if (uri == null) return null;
if (File.separatorChar != '\\') return uri;
if ( uri.startsWith("file:") || uri.startsWith("FILE:")){
char [] u = uri.toCharArray();
int l = u.length;
StringBuilder sb = new StringBuilder(uri.length()+1);
for (int i=0; i<l; i++){
// Ensure we use forward slashes
if (u[i] == File.separatorChar) {
sb.append('/');
continue;
}
if (i == 5 && uri.startsWith(":", 6 )) {
// Windows drive letter without leading slashes
doesn't comply
// with URI spec, fix it here
sb.append("/");
}
sb.append(u[i]);
}
return sb.toString();
}
return uri;
}
<SNIP>
public static Uri filePathToUri(String path) throws URISyntaxException{
String forwardSlash = "/";
if (path == null || path.length() == 0) {
// codebase is "file:"
path = "*";
}
// Ensure compatibility with URLClassLoader, when directory
// character is dropped by File.
boolean directory = false;
if (path.endsWith(forwardSlash)) directory = true;
path = new File(path).getAbsolutePath();
if (directory) {
if (!(path.endsWith(File.separator))){
path = path + File.separator;
}
}
if (File.separatorChar == '\\') {
path = path.replace(File.separatorChar, '/');
}
path = fixWindowsURI("file:" + path);
return Uri.escapeAndCreate(path); //$NON-NLS-1$
}
--
Regards,
Peter
On 10/11/2024 5:05 pm, Peter Firmstone wrote:
> So we have an RFC3986 compliant URI implementation, that's not
> compatible with Java's RFC2396 URI and now we use deprecated URL
> public constructors...
>
> But I guess they're only deprecated, not going to be removed, we can't
> change our code to use RFC2396 URI without unintended
> consequences... Having said that, I would discourage developers from
> writing any new code that uses RFC2396 URI.
>
> My understanding is Java's RFC2396 cannot be changed for backward
> compatibility reasons, it's not strictly compliant with RFC2396 and
> varies from the spec with a larger allowed character set (unescaped)...
>
> Perhaps a new RFC3986 URI implementation could utilise a provider
> mechanism, with some static methods that allow the developer to select
> which RFC compliant URI version they want to use?
>
> We haven't used Java's URI class for a long time, as there are
> significant performance benefits to using RFC3986 et al, such as not
> relying on DNS lookup for identity.
>
> Javadoc from our RFC3986 Uri implementation (AL2.0):
>
> /**
> * This class represents an immutable instance of a URI as defined by
> RFC 3986.
> * <p>
> * This class replaces java.net.URI functionality.
> * <p>
> * Unlike java.net.URI this class is not Serializable and hashCode and
> * equality is governed by strict RFC3986 normalisation. In addition
> "other"
> * characters allowed in java.net.URI as specified by javadoc, not
> specifically
> * allowed by RFC3986 are illegal and must be escaped. This strict
> adherence
> * is essential to eliminate false negative or positive matches.
> * <p>
> * In addition to RFC3896 normalisation, on OS platforms with a \ file
> separator
> * the path is converted to UPPER CASE for comparison for file:
> schema, during
> * equals and hashCode calls.
> * <p>
> * IPv6 and IPvFuture host addresses must be enclosed in square
> brackets as per
> * RFC3986. A zone delimiter %, if present, must be represented in
> escaped %25
> * form as per RFC6874.
> * <p>
> * In addition to RFC3986 normalization, IPv6 host addresses will be
> normalized
> * to comply with RFC 5952 A Recommendation for IPv6 Address Text
> Representation.
> * This is to ensure consistent equality between identical IPv6
> addresses.
> *
> * @since 3.0.0
> */
> public final class Uri implements Comparable<Uri> {
>
More information about the core-libs-dev
mailing list