package com.tngtech.archunit.integration; import java.util.ArrayList; import java.util.Collection; import java.util.List; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableSet; import com.tngtech.archunit.example.ClassViolatingSessionBeanRules; import com.tngtech.archunit.example.OtherClassViolatingSessionBeanRules; import com.tngtech.archunit.example.SecondBeanImplementingSomeBusinessInterface; import com.tngtech.archunit.example.SomeBusinessInterface; import com.tngtech.archunit.exampletest.SessionBeanRulesTest; import com.tngtech.archunit.junit.ExpectedViolation; import com.tngtech.archunit.junit.MessageAssertionChain; import org.junit.Rule; import org.junit.Test; import static com.google.common.base.Predicates.containsPattern; import static com.google.common.collect.Collections2.filter; import static com.tngtech.archunit.example.OtherClassViolatingSessionBeanRules.init; import static com.tngtech.archunit.junit.ExpectedViolation.from; public class SessionBeanRulesIntegrationTest extends SessionBeanRulesTest { @Rule public final ExpectedViolation expectedViolation = ExpectedViolation.none(); @Test @Override public void stateless_session_beans_should_not_have_state() { expectedViolation.ofRule("No Stateless Session Bean should have state") .byAccess(from(ClassViolatingSessionBeanRules.class, "setState", String.class) .setting().field(ClassViolatingSessionBeanRules.class, "state") .inLine(25)) .byAccess(from(OtherClassViolatingSessionBeanRules.class, init) .setting().field(ClassViolatingSessionBeanRules.class, "state") .inLine(13)); super.stateless_session_beans_should_not_have_state(); } @Test @Override public void business_interface_implementations_should_be_unique() { expectedViolation.ofRule("classes that are business interfaces should have an unique implementation") .by(SOME_BUSINESS_INTERFACE_IS_IMPLEMENTED_BY_TWO_BEANS); super.business_interface_implementations_should_be_unique(); } private static final MessageAssertionChain.Link SOME_BUSINESS_INTERFACE_IS_IMPLEMENTED_BY_TWO_BEANS = new MessageAssertionChain.Link() { @Override public Result filterMatching(List<String> lines) { Collection<String> interesting = filter(lines, containsPattern(" is implemented by ")); if (interesting.size() != 1) { return new Result(false, lines); } String[] parts = interesting.iterator().next().split(" is implemented by "); if (parts.length != 2) { return new Result(false, lines); } if (partsMatchExpectedViolation(parts)) { List<String> resultLines = new ArrayList<>(lines); resultLines.removeAll(interesting); return new Result(true, resultLines); } else { return new Result(false, lines); } } private boolean partsMatchExpectedViolation(String[] parts) { ImmutableSet<String> violations = ImmutableSet.copyOf(parts[1].split(", ")); return parts[0].equals(SomeBusinessInterface.class.getSimpleName()) && violations.equals(ImmutableSet.of( ClassViolatingSessionBeanRules.class.getSimpleName(), SecondBeanImplementingSomeBusinessInterface.class.getSimpleName())); } @Override public String getDescription() { String violatingImplementations = Joiner.on(", ").join( ClassViolatingSessionBeanRules.class.getSimpleName(), SecondBeanImplementingSomeBusinessInterface.class.getSimpleName()); return String.format("Message contains: %s is implemented by {%s}", SomeBusinessInterface.class.getSimpleName(), violatingImplementations); } }; }