User:Duesentrieb/Fix interwiki

This page describes the evil master plan to get rid of the Interwiki class (or at least render it harmless).

Purpose:
 * allow us to use the more flexible Sites system instead of the crusty Interwiki system
 * allow us to use Sites and Interwiki side by side, based on the same data
 * Preserve the legacy interface for interwiki links (static methods in Interwiki)
 * make Sites (at least as) performant as the current multi-cache hodge-podge implementation of Interwiki.
 * Maintain interwiki mappings / site definitions in files, not in the database. It's configuration, not state.

Outline:
 * Create a new interfacfe InterwikiLookup with all the public methods from Interwiki
 * Create HodgePodgeInterwiki implements InterwikiLookup; implement it using the code currently in Interwiki. "hodge-podge" because is implements several storage backends (sql, cdb, ...). The code should be changed as little as possible, only removing replacing access to global state with injection.
 * Make the public static methods in Interwiki delegate to a singleton instance of InterwikiLookup, remove everything else from the class.
 * Create an adapter, SiteLookupInterwikiLookup, implementing InterwikiLookup based on a SiteLookup.
 * Migrate usages of SiteStore to SiteLookup. Drop all code that modifies site definitions. Site definitions are config, and config is not mutable by the application.
 * FileSiteLookup implements a SiteLookup that will simply load site definitions from a list of local files
 * support at least JSON (easy to maintain) and PHP (code, not serialized data; fast with accelerator cache). Go by file extension.
 * Add methods for fetching Site objecvts for a group to SiteLookup
 * Make CachingSiteStore (resp CachingSiteLookup) cache individual groups. Use "siblings" group for sister projects of the same language.
 * Drop SiteStore (in favor of SiteLookup), deprecate SiteSQLStore (we need it in read-only mode at least, for B/C).
 * Make an export script that can generate JSON site definition files:
 * Export from a SiteLookup or InterwikiLookup (needs an adapter that implements a SiteLookup based on an InterwikiLookup)
 * Export all, or a list of groups
 * Export only the ones that differ from the ones defined in a list of given files. This can be used to generate files that contain only the local overrides / additions to a common list of site definitions.


 * Make a maintenance script that generates a PHP file with site definitions from a list of JSON (and PHP) files.

Configuration:
 * InterwikiLookup implementation to use. Default: SiteLookupInterwikiLookup
 * For HodgePodgeInterwiki, use the old interwiki settings controlling CDB usage etc.
 * SiteLookup implementation to use. Default: FileSiteLookup
 * per default, read DefaultInterwiki.json (maintained in git) and LocalInterwiki.json (shipped empty).
 * on the Wikimedia cluster, use PHP files for speed. One common file, one per group, and one for local overrides per wiki.
 * Caching:
 * which cache (possibly none for PHP files)
 * duration
 * groups to cache separately (all?)