Reputation: 915
I have two separate packages:
mycomp.sales
- Order
- OrderPlaced
mycom.delivery
- Delivery
- OrderPlacedListener (depends on mycomp.sales.OrderPlaced)
I want to set a rule which checks that the package mycom.delivery
has only a dependency on OrderPlaced
and no other classes in the package mycomp.sales
.
So far I came up with this:
JavaClasses importedClasses = new ClassFileImporter().importPackages("mycomp.delivery");
ArchRule rule = classes()
.should().onlyDependOnClassesThat().resideOutsideOfPackages("mycomp.sales..")
.orShould().onlyDependOnClassesThat().areAssignableTo(OrderPlaced.class);
rule.check(importedClasses);
But this fails on the OrderPlacedListener
(which has a dependency to mycomp.sales.OrderPlaced
).
How to do this?
Upvotes: 1
Views: 2504
Reputation: 10882
In your code both OR clauses are evaluated separately, it means either 1. all dependencies must be outside mycomp.sales..
(which is not) or 2. all dependencies must be assignable to OrderPlaced
(which is obviously not).
You have to define a compound rule like that:
ArchRule rule = classes()
.should().onlyDependOnClassesThat(
resideOutsideOfPackages("mycomp.sales..")
.or(type(OrderPlaced.class)));
Upvotes: 3