- From: Francois Daoust <fd@w3.org>
- Date: Thu, 19 Mar 2009 18:01:00 +0100
- To: public-mobileok-checker <public-mobileok-checker@w3.org>
Hi guys, Context ----- I took ACTION-916 last week to identify the changes that would be required to keep a clean mobileOK Checker library while still making it possible to extend it using a restricted set of subclasses to add support for the "file" scheme. Here are a few thoughts. What do you think? In short ----- - It is possible, neither hard nor trivial. - It cannot be backward compatible (e.g. some class names need to be changed to do it properly), but would require limited updates from external projects that may already use the library - It would come with the added benefits that the library could be truly used as a generic checking library on URIs, with a default mobileOK profile that does just what it's supposed to do. Why changes are needed ----- The mobileOK Checker Java library is to remain a reference implementation of the mobileOK Basic Tests 1.0 specification. As such, introducing new test outcomes, new tests and/or new ways of retrieving resources should not be part of it. It should be implemented as an optional plugin. The library was already implemented with extensibility in mind, but not to the point that a mere derivation of a couple of classes is enough to build on top of the reference implementation. For instance, adding/completing/removing a test to the list of tests run by the checker cannot be done without modifying the list in the TestType.java file. This should be doable without having to modify a single line of code in the library, simply by plugging new classes. The library was also designed with the mobileOK spec in mind, and is sometimes correctly but unnecessarily restricted to the HTTP/HTTPS schemes Flexibility in the list of schemes supported ----- The main thing to do, IMHO, is to separate the representation of a resource from the way it is retrieved. We currently have: HTTPResource |_ HTTPImageResource |_ HTTPObjectResource |_ HTTPTextResource |_ HTTPCSSResource |_ HTTPXHTMLResource HTTPResourceComparator HTTPRedirect I suggest we drop the "HTTP" prefix in the above class names, use them to store the representation of the resource and move the code used to retrieve the resource to some derivative of a new ResourceRetriever class. This would lead to: Resource |_ ImageResource |_ ObjectResource |_ TextResource |_ CSSResource |_ XHTMLResource ResourceComparator RetrievalElement (was HTTPRedirect) |_ HttpRetrievalElement |_ HttpsRetrievalElement (not sure we need to make a distinction) |_ FileRetrievalElement |_ ... (think "ftp" or whatever) ResourceRetriever |_ HttpResourceRetriever |_ HttpsResourceRetriever (not sure we need to make a distinction) |_ FileResourceRetriever |_ ... (think "ftp" or whatever) Flexibility in the moki representation ----- The HTTPRequest/HTTPResponse elements in the moki representation take for granted that resources are HTTP/HTTPS resources. We may either live with that and fill out the parts that can be filled when a file is retrieved, update the schema for a more generic one. The clean solution is indeed to re-engineer these sections in a more generic way. Nothing too complicated, but it means updating XPath expressions in almost all the tests. In the code, it means the output of this section should be handled by the corresponding resource class (i.e. PreprocessorResults->addRetrievalElement should call a similar method on HttpRetrievalElement, FileRetrievalElement, ...) I would do the changes for HTTP/HTTPS representations at the end, so that we may use the existing test suite without any modification to validate all the other changes before updating the moki results. Flexibility in the enumerations ----- It is not possible to extend an enumeration in Java. We need to switch our enum declarations to some class implementation of an extensible enumeration (a quick search reveals as many ways to do it as there are developers around, it just cannot be as simple as a mere enum), so that someone may derive TestOutcome for instance and add a CANNOTTELL test outcome. The other enumerations that needs to be re-written are: - TestType to be able to change the list of tests being run, and/or provide modified versions of the tests. - HTTPErrorsType (I would drop the "HTTP" prefix as well), to add errors that are specific to the resource scheme. Notion of profile ----- The mobileOK profile could then be defined as: - the list of tests and implementations of the tests defined in the library - a restriction to the HTTP/HTTPS schemes where retrieval is to be made using a specific User-Agent, Accept, Accept-Charset. I can think of various ways to define such a profile, one of them could be simply to complete the existing TesterConfiguration class. Minor other changes ----- A few minor other changes are probably required. Adding file scheme support ----- Once the above is done (sic!), adding file support could be done easily by implementing: - the FileResourceRetriever class - the FileRetrievalElement class - a derived TestOutcome class that adds the CANNOTTELL outcome - derived classes for tests that need to be amended and associated XSLT - a new profile that allows the file scheme and associate the tests with the derived classes. ... and that should not require any change in the core library. Did I forget something that would make all of the above complete non-sense? Is it unclear? Francois.
Received on Thursday, 19 March 2009 17:01:37 UTC