This is an automated email from the ASF dual-hosted git repository. kwin pushed a commit to branch provider-type-check-bnd-plugin in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git
The following commit(s) were added to refs/heads/provider-type-check-bnd-plugin by this push: new ca37ee66 Cleanup and allow to ignore certain provider types ca37ee66 is described below commit ca37ee661a6a3e2b4c81916cbad55c2af0f3f08f Author: Konrad Windszus <k...@apache.org> AuthorDate: Thu Nov 30 19:34:15 2023 +0100 Cleanup and allow to ignore certain provider types --- org.apache.sling.bnd.providertype/pom.xml | 6 +++ org.apache.sling.bnd.providertype/readme.md | 8 +++- .../bnd/providertype/ProviderTypeScanner.java | 51 ++++++++++++++++++++-- .../bnd/providertype/BndBuilderExtension.java | 2 - .../bnd/providertype/ProviderTypeScannerTest.java | 8 ++-- .../org/apache/sling/bnd/providertype/TypeA.java | 18 ++++++++ .../apache/sling/bnd/providertype/TypeAImpl.java | 18 ++++++++ .../org/apache/sling/bnd/providertype/TypeB.java | 18 ++++++++ .../sling/bnd/providertype/TypeBExtension.java | 18 ++++++++ 9 files changed, 137 insertions(+), 10 deletions(-) diff --git a/org.apache.sling.bnd.providertype/pom.xml b/org.apache.sling.bnd.providertype/pom.xml index 3e8a3ebe..c451eebb 100644 --- a/org.apache.sling.bnd.providertype/pom.xml +++ b/org.apache.sling.bnd.providertype/pom.xml @@ -35,6 +35,7 @@ <properties> <sling.java.version>11</sling.java.version> + <minimalJavaBuildVersion>${sling.java.version}</minimalJavaBuildVersion> <project.build.outputTimestamp>1675867676</project.build.outputTimestamp> <bnd.version>6.0.0</bnd.version> </properties> @@ -76,5 +77,10 @@ <version>5.6.0</version> <scope>test</scope> </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-simple</artifactId> + <scope>test</scope> + </dependency> </dependencies> </project> \ No newline at end of file diff --git a/org.apache.sling.bnd.providertype/readme.md b/org.apache.sling.bnd.providertype/readme.md index 54538124..87507ddf 100644 --- a/org.apache.sling.bnd.providertype/readme.md +++ b/org.apache.sling.bnd.providertype/readme.md @@ -28,7 +28,13 @@ For usage with Maven the Bnd plugin has to be added to the plugin dependencies o In addition the `bnd.bnd` file needs to register the Bnd plugin with the [plugin instruction](https://bnd.bndtools.org/instructions/plugin.html) ``` --plugin.providertype=org.apache.sling.bnd.providertype.ProviderTypeScanner +-plugin.providertype:org.apache.sling.bnd.providertype.ProviderTypeScanner +``` + +To explicitly ignore certain provider types (i.e. don't fail when these are extended/implemented) one can use the attribute `ignored` with one or multiple comma-separated fully qualified provider type names. For example + +``` +-plugin.providertype:org.apache.sling.bnd.providertype.ProviderTypeScanner;ignored=org.apache.jackrabbit.api.security.user.User ``` ## Prerequisites diff --git a/org.apache.sling.bnd.providertype/src/main/java/org/apache/sling/bnd/providertype/ProviderTypeScanner.java b/org.apache.sling.bnd.providertype/src/main/java/org/apache/sling/bnd/providertype/ProviderTypeScanner.java index 8f5cb7e2..dfc90dac 100644 --- a/org.apache.sling.bnd.providertype/src/main/java/org/apache/sling/bnd/providertype/ProviderTypeScanner.java +++ b/org.apache.sling.bnd.providertype/src/main/java/org/apache/sling/bnd/providertype/ProviderTypeScanner.java @@ -1,8 +1,28 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.apache.sling.bnd.providertype; import java.io.InputStream; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -14,6 +34,7 @@ import aQute.bnd.osgi.Clazz; import aQute.bnd.osgi.Descriptors.TypeRef; import aQute.bnd.osgi.Resource; import aQute.bnd.service.AnalyzerPlugin; +import aQute.bnd.service.Plugin; import aQute.lib.json.Decoder; import aQute.lib.json.JSONCodec; import aQute.service.reporter.Reporter; @@ -23,11 +44,26 @@ import aQute.service.reporter.Reporter; * Provider types are retrieved from the resource "META-INF/api-info.json" which is expected to be provided * in the class path. */ -public class ProviderTypeScanner implements AnalyzerPlugin { +public class ProviderTypeScanner implements AnalyzerPlugin, Plugin { private static final String API_INFO_JSON_RESOURCE_PATH = "META-INF/api-info.json"; private static final String FIELD_PROVIDER_TYPES = "providerTypes"; private static final String MESSAGE = "Type \"%s\" %s provider type \"%s\". This is not allowed!"; + private static final String ATTRIBUTE_IGNORED_PROVIDER_TYPES = "ignored"; + + private Map<String,String> parameters = new HashMap<>(); + + @Override + public void setProperties(Map<String, String> map) throws Exception { + // https://docs.osgi.org/specification/osgi.core/8.0.0/framework.module.html#framework.common.header.syntax + parameters.clear(); + parameters.putAll(map); + } + + @Override + public void setReporter(Reporter processor) { + // no need to store it as passed in analyzeJar(...) as well + } @Override public boolean analyzeJar(Analyzer analyzer) throws Exception { @@ -43,6 +79,14 @@ public class ProviderTypeScanner implements AnalyzerPlugin { throw new IllegalStateException("Could not parse JSON from resource " + apiInfoJsonResource, e); } } + // remove ignored provider types + Arrays.stream(parameters.getOrDefault(ATTRIBUTE_IGNORED_PROVIDER_TYPES, "").split(",")).filter(s -> !s.isBlank()).forEach(ignored -> { + if (providerTypes.remove(ignored)) { + analyzer.trace("Ignore extensions of provider type \"%s\" due to plugin configuration", ignored); + } else { + analyzer.warning("Ignored class \"%s\" is not defined as provider type at all, you can safely remove the according plugin parameter", ignored); + } + }); checkIfExtendingType(analyzer, analyzer.getClassspace().values(), providerTypes); } return false; @@ -51,11 +95,11 @@ public class ProviderTypeScanner implements AnalyzerPlugin { private void checkIfExtendingType(Reporter reporter, Collection<Clazz> clazzes, Set<String> providerTypes) { for (Clazz clazz : clazzes) { if (clazz.getSuper() != null && (providerTypes.contains(clazz.getSuper().getFQN()))) { - reporter.error(MESSAGE, clazz.getFQN(), "extends", clazz.getSuper().getFQN()); + reporter.error(MESSAGE, clazz.getFQN(), "extends", clazz.getSuper().getFQN()).file(clazz.getSourceFile()); } for (TypeRef interfaceType : clazz.interfaces()) { if (providerTypes.contains(interfaceType.getFQN())) { - reporter.error(MESSAGE, clazz.getFQN(), "implements", interfaceType.getFQN()); + reporter.error(MESSAGE, clazz.getFQN(), "implements", interfaceType.getFQN()).file(clazz.getSourceFile()); } } } @@ -79,4 +123,5 @@ public class ProviderTypeScanner implements AnalyzerPlugin { return Collections.emptySet(); } + } \ No newline at end of file diff --git a/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/BndBuilderExtension.java b/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/BndBuilderExtension.java index 8c72decd..e21ee713 100644 --- a/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/BndBuilderExtension.java +++ b/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/BndBuilderExtension.java @@ -18,8 +18,6 @@ */ package org.apache.sling.bnd.providertype; -import static org.junit.jupiter.api.Assertions.fail; - import java.io.File; import java.io.IOException; import java.util.Arrays; diff --git a/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/ProviderTypeScannerTest.java b/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/ProviderTypeScannerTest.java index 7089ae58..b1319d20 100644 --- a/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/ProviderTypeScannerTest.java +++ b/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/ProviderTypeScannerTest.java @@ -19,6 +19,7 @@ package org.apache.sling.bnd.providertype; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; import java.io.File; @@ -79,16 +80,15 @@ class ProviderTypeScannerTest { } } } - + @Test void testBuildWithInvalidProviderTypeMetadata2() throws Exception { Builder builder = bndBuilderExtension.builder; // add classpath entry with api-info.json builder.setClasspath(new File[] { new File("src/test/resources3") }); try (Jar jar = builder.build()) { - List<String> expectedErrors = Arrays.asList( - "Resource \"META-INF/api-info.json\" does not contain a field named \"providerTypes\""); - assertEquals(expectedErrors, builder.getErrors()); + assertEquals(2, builder.getErrors().size()); + assertTrue(builder.getErrors().get(0).startsWith("Exception: java.lang.IllegalStateException: Could not parse JSON from resource")); if (!builder.getWarnings().isEmpty()) { fail(String.join("\n", builder.getWarnings())); } diff --git a/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/TypeA.java b/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/TypeA.java index e958bdb0..84c0e806 100644 --- a/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/TypeA.java +++ b/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/TypeA.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.apache.sling.bnd.providertype; public interface TypeA { diff --git a/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/TypeAImpl.java b/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/TypeAImpl.java index 5fbe0eb5..afcc422a 100644 --- a/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/TypeAImpl.java +++ b/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/TypeAImpl.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.apache.sling.bnd.providertype; public class TypeAImpl implements TypeA { diff --git a/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/TypeB.java b/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/TypeB.java index 31ac1938..013c3235 100644 --- a/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/TypeB.java +++ b/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/TypeB.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.apache.sling.bnd.providertype; public class TypeB { diff --git a/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/TypeBExtension.java b/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/TypeBExtension.java index 228d5013..5b81b6f6 100644 --- a/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/TypeBExtension.java +++ b/org.apache.sling.bnd.providertype/src/test/java/org/apache/sling/bnd/providertype/TypeBExtension.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ package org.apache.sling.bnd.providertype; public class TypeBExtension extends TypeB {