Hi everybody,

we have the following override.properties:

mvn:com.seeburger.portal/portal-backend-sdk/2.69.0-SNAPSHOT;range="[0,99999)"
mvn:com.seeburger.portal/portal-backend-sdk/2.69.0-SNAPSHOT/jar/karaf-migration;range="[0,99999)"

which are supposed to do the following replacements:

portal-backend-sdk/2.68.3 -> portal-backend-sdk/2.69.0-SNAPSHOT

and

portal-backend-sdk/2.68.3/jar/karaf-migration ->
portal-backend-sdk/2.69.0-SNAPSHOT/jar/karaf-migration

But the method
org.apache.karaf.features.internal.service.FeaturesProcessorImpl.staticOverrideBundle(Bundle)
<https://github.com/apache/karaf/blob/master/features/core/src/main/java/org/apache/karaf/features/internal/service/FeaturesProcessorImpl.java#L225>
replaces portal-backend-sdk/2.68.3/jar/karaf-migration with
mvn:com.seeburger.portal/portal-backend-sdk/2.69.0-SNAPSHOT, i.e. a
classified artifact gets replaced with an artifact without classifier. This
happens because the implementation of
org.apache.karaf.features.LocationPattern
<https://github.com/apache/karaf/blob/master/features/core/src/main/java/org/apache/karaf/features/LocationPattern.java#L151>
allows matching of classified URI by a non-classified pattern. The
LocationPatternTest indicates that this is an intentional behavior: see
line 112
<https://github.com/apache/karaf/blob/master/features/core/src/test/java/org/apache/karaf/features/internal/service/LocationPatternTest.java#L112>,
115
<https://github.com/apache/karaf/blob/master/features/core/src/test/java/org/apache/karaf/features/internal/service/LocationPatternTest.java#L115>,
116
<https://github.com/apache/karaf/blob/master/features/core/src/test/java/org/apache/karaf/features/internal/service/LocationPatternTest.java#L116>
.

I can understand why LocationPattern is implemented like that. But then my
guess is that FeaturesProcessorImpl is incorrect. By the way an interesting
comment there: *TOCHECK: last rule wins - no break!!!* Last rule doesn't
work for us so looks like now the time has come to check it. I think what
is crucial there, is that we shouldn't rely on the order of overrides, but
rather on their quality. I.e. not the first/last match is appropriate, but
the best one. I propose to collect candidates to match and then determine
the best one using simply the length as criterion.

My proposal is already implemented in our fork and tested on my local
system (for now). Here you can see it:
https://github.com/seeburger-ag/karaf/commit/940911e8a8ccdb97d5cebf976e41747f1e7716a4

I would appreciate to receive any feedback on this.

Regards,
Daniel

Reply via email to