| name | archunit-rules |
| description | ArchUnit architecture rules enforced in Xeres including common module rules (logging, utility classes), app module rules (no field injection, RsService naming), and UI module rules (WindowController naming). |
ArchUnit Rules for Xeres
Architecture rules are enforced via ArchUnit tests:
common/src/testFixtures/ - shared rules (CodingRulesTest)
common/src/test/ - common module rules (CommonCodingRulesTest)
app/src/test/ - app module rules (AppCodingRulesTest)
ui/src/test/ - UI module rules (UiCodingRulesTest)
Running Rules
./gradlew test --tests "*CodingRulesTest"
Common Module Rules (CommonCodingRulesTest)
Logging
- No
java.util.logging allowed
- Use SLF4J only
Logger Declaration
private static final Logger log;
Logger logger;
Utility Classes
public final class FooUtils
{
private FooUtils()
{
throw new UnsupportedOperationException("Utility class");
}
}
Identifier Classes
Must implement Identifier and have public static final int LENGTH:
public class ProfileFingerprint implements Identifier, Comparable<ProfileFingerprint>
{
public static final int LENGTH = 32;
}
App Module Rules (AppCodingRulesTest)
No Field Injection
private final ProfileService profileService;
public Service(ProfileService profileService)
{
}
@Autowired
private ProfileService profileService;
RsService Naming
Service subclasses must end with RsService:
public class AvatarRsService extends RsService
{
}
public class AvatarService extends RsService
{
}
JPA Entities
Must have public or protected no-arg constructor:
@Entity
public class Profile
{
protected Profile() { }
}
Item Classes
- Public no-arg constructor
clone() method implemented
- Meaningful
toString() method
No UI Access
app module cannot access ui module packages:
@Test
void archUnit()
{
noClasses()
.that()
.resideInPackage("io.xeres.app..")
.should()
.accessClassesThat()
.resideInPackage("io.xeres.ui..");
}
UI Module Rules (UiCodingRulesTest)
WindowController Naming
public class SettingsWindowController
{
}
public class SettingsController
{
}
No FileChooser Initial Directory
Use ChooserUtils instead:
void test()
{
fileChooser.setInitialDirectory(path);
ChooserUtils.setInitialDirectory(fileChooser, path);
}
No Field Injection
Same rule as app module.