Richard Kennard wrote:
Alan,

I read some distinct 'themes' into your last e-mail. Please permit me to respond to the 'themes', rather than your exact points:

1. java.net.URL

You said:

'I would suggest ignoring java.net.URL completely... is parse(URL) needed? ... is apply(URL) needed? ... I believe naming conventions would suggest this be should Url* instead'

I actually encounter java.net.URL quite often in my daily work - many APIs seem to use it, and don't seem to offer a java.net.URI alternative? I think it is still quite active and shouldn't be ignored?
You've pulled comments from different contexts here but no matter. The URL class has many problems and unfortunately they cannot be fixed for compatibility reasons. This is why the spec has a recommendation to use URI over URL. There are toURL and toURI methods to convert between the classes. We should encourage developers to use URI for new code (and I agree there is a large body of existing code that uses URL).

For the static factory methods that construct the object by parsing an existing query string then you a number of choices. The proposed parse(CharSequence) looks good to me. If there is code using java.net.URL then it can be simply invoked using parse(url.getQuery()) and I don't see a problem with that. There is more argument for a parse(URI) method as developers can get confused as to if the query component, in string form, should be decoded or not.

The "apply" methods could benefit from some discussion. As I mentioned, it may be worth seeing if we should have more general methods to construct URIs by combining an existing URI and other components. Michael may have views on this.

As regards the name of the class, then Josh Bloch's Effective Java book has a good section on this. To follow those guidelines the class would be named UrlEncodedQueryString rather than URLEncodedQueryString. I just mention it as something to think about (and yes, we have lots of naming inconsistencies in the platform).


2. Servlet API

You said:

'it's not clear to me why any of the method names need the word "Parameter" in them... It's not clear to me that we have to be consistent with the Servlet API.'

I think consistency with the Servlet API is important because it is the only example in the JDK (well, Java EE DK) of an API that deals specifically with www-form-urlencoded query strings: it is mature and very familiar to many developers?

It also has some naming quirks around returning String versus String[] for getParameter and getParameterValues. Those quirks are the necessary because of the HTML spec, so I'd rather match the Servlet API's naming quirks than introduce a brand of quirks of our own?
My only concern with copying the method names from the Servlet spec is that it makes it awkward when constructing one of these objects by chaining a sequence of method invocations. If the method names are shorter then the syntax can be neater, eg:
 UrlQueryString qs = UrlQueryString().create().set(n1,v1).set(n2,v2);
works well in my mind.

Whether the map value is String[] or List<String> isn't a major issue. I just suggested thinking about List<String> as it may be more useful in the long term.


3. Separators

You said:

'Is this enum needed? ... maybe the create method can specify the separator? ... what if [the query string to be parsed] uses a different separator? ... Do you have examples in mind where a query would be parsed using one separator but then converted to use a different separator?

I'm afraid I thought I'd explained this already? It's also in the JavaDoc:

"ALL separators are recognised when parsing query strings. ONE separator may be passed to 'getQuery' and 'apply' when outputting query strings"
Ah, those words are in the spec for the ParameterSeparator enum and so didn't appear in the javadoc that you appended. In that case, I would suggest making this clear in the spec for the parse spec. Should the parse spec also say anything about the non-default separators - if they can appear in values then I assume they must be escaped prior to parsing


I agree on your point around removing 'getQuery' and just having 'toString'.
Did you decide on the method to construct a string with the non-default separator? Naming it toString(seperator) would be consistent.

-Alan.

Reply via email to