I’m currently working on switching my application (trailrouter.com) to use mainline GraphHopper. My hope is to end up with a small shim layer over GH, with just my extra additional classes (mostly weightings and extra storages), and then include an unmodified GH 2.3 JAR file as a library.
This is working pretty well so far, but I’m finding that some classes in GH are quite hard to extend due methods being marked as private rather than protected.
Would a PR to change specific instances of private methods to protected (with examples for why it is useful) be welcome?
I’ll give you an example: I’d like to add a feature for avoiding repetition in running routes. So if you have multiple legs in your route, then we should try not to cover the same edges twice. GH already has a nice class called AvoidEdgesWeighting that is used in round trip mode. I’d like to use this in normal (“Via”) routing mode. To make this work, I’d need to add all edges from the previous leg to the AvoidEdgesWeighting before the path for the next leg is calculated. This seems possible in Router.routeVia, specifically by overriding createPathCalculator and returning a custom path calculator that also injects the edges into the AvoidEdgesWeighting inside algoOpts. However, createPathCalculator is private, so we end up overriding routeVia instead, which in turn requires a whole bunch of other things to be duplicated/overridden too. If createPathCalculator was marked as protected then I could trim hundreds of lines of duplicated code.