| 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 in common/src/test/ and common/src/testFixtures/.
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 have public static final int LENGTH:
public class ProfileIdentifier extends Identifier
{
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:
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:
fileChooser.setInitialDirectory(path);
ChooserUtils.
setInitialDirectory(fileChooser, path);
No Field Injection
Same rule as app module.