| <!-- |
| 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. |
| --> |
| <jqa:jqassistant-rules xmlns:jqa="http://www.buschmais.com/jqassistant/core/analysis/rules/schema/v1.0"> |
| |
| <concept id="serviceLoader:SPI"> |
| <description>Labels all .spi packages as "SPI".</description> |
| <cypher><![CDATA[ |
| MATCH |
| (package:Package)-->(type:Type:Java) |
| |
| WHERE |
| package.name = "spi" |
| |
| SET |
| type:SPI |
| |
| RETURN |
| type |
| ]]></cypher> |
| </concept> |
| |
| <constraint id="serviceLoader:correctServiceLoaderNaming"> |
| <requiresConcept refId="serviceLoader:SPI"/> |
| <description>A service provider must be contained in a service provider configuration file with the full qualified binary name of the service's type.</description> |
| <cypher><![CDATA[ |
| MATCH |
| (sl:ServiceLoader)-[:CONTAINS]->(impl:Type)-[:IMPLEMENTS]->(spi:SPI) |
| |
| WHERE |
| NOT split(sl.fileName, '/')[-1] = spi.fqn |
| |
| RETURN |
| impl.fqn AS impl, spi.fqn as spi, sl.fileName AS spiConfig |
| ]]></cypher> |
| </constraint> |
| |
| <constraint id="serviceLoader:ServiceImplementationsMustBeListedInServiceConfigurations" |
| severity="info"> |
| <requiresConcept refId="java:AnonymousInnerType"/> |
| <requiresConcept refId="serviceLoader:SPI"/> |
| <description>All property converter implementations must be declared in a service loader file.</description> |
| <cypher><![CDATA[ |
| MATCH |
| (impl)-[:IMPLEMENTS*]->(spi:SPI) |
| |
| WHERE |
| NOT (:ServiceLoader)-[:CONTAINS]->(impl) |
| AND NOT impl:Anonymous:Inner |
| AND (impl.abstract=false OR impl.abstract IS NULL) |
| |
| // Ignore SPI implementations without a default constructor |
| // We assume that the developer of this class had to implement for some reason |
| // this interface but not intended it to be used as service provider |
| AND NOT (impl)-[:DECLARES]->(:Constructor)-[:HAS]->(:Parameter) |
| |
| // Do not pay attention to test utilities. We rely on the name of the class |
| AND NOT (impl.name =~ 'Test.*' OR impl.name =~ '.*\\$Test.*' |
| OR impl.name =~'.*Test\\$.*') |
| |
| AND NOT impl.fqn IN [// All classes of the builder MUST not use the SPI mechanism |
| 'org.apache.tamaya.builder.ProgrammaticConfigurationContext' |
| // See TAMAYA-77 and TAMAYA-78, Oliver B. Fischer, 2015-04-25 |
| // 'org.apache.tamaya.core.internal.DefaultConfigurationContextBuilder' |
| ] |
| |
| RETURN |
| impl.fqn AS undeclaredService |
| ]]></cypher> |
| </constraint> |
| |
| <constraint id="serviceLoader:serviceConfigurationsMustNotBeEmpty"> |
| <requiresConcept refId="serviceLoader:SPI"/> |
| <description>Empty service configurations must not be provided.</description> |
| <cypher><![CDATA[ |
| MATCH |
| (sc:ServiceLoader) |
| |
| WHERE |
| NOT (sc)-[:CONTAINS]->() |
| |
| RETURN |
| sc.fileName AS emptyServiceConfiguration |
| ]]></cypher> |
| </constraint> |
| |
| <constraint id="serviceLoader:serviceConfigurationsMustNotContainNonExistingClasses"> |
| <requiresConcept refId="serviceLoader:SPI"/> |
| <description>Service configurations must contain only existing classes.</description> |
| <cypher><![CDATA[ |
| MATCH |
| (sl:ServiceLoader)-[:CONTAINS]->(entry) |
| |
| WHERE |
| NOT entry:Class |
| |
| // Have to exclude these files as jQAssistant cannot handle inner classes in |
| // service configurations in version 1.0.0. |
| // I reported this problem already to the project |
| // Oliver B. Fischer, 15.5.5 |
| AND NOT sl.fileName IN ['/META-INF/services/org.apache.tamaya.core.internal.DefaultServiceContextTest$MultiImplsInterface', |
| '/META-INF/services/org.apache.tamaya.core.internal.DefaultServiceContextTest$InvalidPriorityInterface', |
| '/META-INF/services/org.apache.tamaya.core.internal.DefaultServiceContextTest$InvalidPriorityInterface'] |
| |
| RETURN |
| sl.fileName AS serviceConfiguration, entry.name AS class |
| ]]></cypher> |
| </constraint> |
| |
| </jqa:jqassistant-rules> |