The CubeService example is odd because it is not self-contained (it uses a dataset that it does not create). We can refactor as follows:
- Deprecate AbstractCubeHttpHandler
- Replace it with a CubeHttpHandler that has /cube/<dataset name> as path prefix
- Use the new Handler in the CubeService. This is still not self-contained, because it relies on other apps to create the cube datasets. But at least it will succeed to start and dynamically serve any existing cube.