@Override protected Set<Component> doFindComponents() { Set<Component> components = new HashSet<>(); Set<Class<?>> types = getTypeRepository().getAllTypes(); for (Class type : types) { for (TypeMatcher typeMatcher : typeMatchers) { if (typeMatcher.matches(type)) { final Container container = getComponentFinder().getContainer(); Component newComponent = addComponent( container, type.getSimpleName(), type.getCanonicalName(), typeMatcher.getDescription(), typeMatcher.getTechnology()); if (newComponent != null) { components.add(newComponent); } } } } return components; }
@Test public void test_addPackageName_ThrowsAnException_WhenAnEmptyPackageNameIsSpecified() { try { Container container = model.addSoftwareSystem("Software System", "").addContainer("Container", "", ""); ComponentFinder componentFinder = new ComponentFinder(container, "com.mycompany.myapp", new TypeMatcherComponentFinderStrategy(new NameSuffixTypeMatcher("Component", "", ""))); componentFinder.addPackageName(" "); fail(); } catch (IllegalArgumentException iae) { assertEquals("A package name must be specified.", iae.getMessage()); } }
@Test public void test_addPackageName_ThrowsAnException_WhenANullPackageNameIsSpecified() { try { Container container = model.addSoftwareSystem("Software System", "").addContainer("Container", "", ""); ComponentFinder componentFinder = new ComponentFinder(container, "com.mycompany.myapp", new TypeMatcherComponentFinderStrategy(new NameSuffixTypeMatcher("Component", "", ""))); componentFinder.addPackageName(null); fail(); } catch (IllegalArgumentException iae) { assertEquals("A package name must be specified.", iae.getMessage()); } }
@Test public void test_findComponents_CorrectlyFindsDependenciesBetweenComponentsFoundByDifferentComponentFinders_WhenPackage1IsScannedFirst() throws Exception { ComponentFinder componentFinder1 = new ComponentFinder( webApplication, "com.structurizr.analysis.reflections.multipleComponentFinders.package1", new TypeMatcherComponentFinderStrategy( new NameSuffixTypeMatcher("Controller", "", "") ) ); ComponentFinder componentFinder2 = new ComponentFinder( webApplication, "com.structurizr.analysis.reflections.multipleComponentFinders.package2", new TypeMatcherComponentFinderStrategy( new NameSuffixTypeMatcher("Repository", "", "") ) ); componentFinder1.findComponents(); componentFinder2.findComponents(); assertEquals(2, webApplication.getComponents().size()); Component myController = webApplication.getComponentWithName("MyController"); Component myRepository = webApplication.getComponentWithName("MyRepository"); assertEquals(1, myController.getRelationships().size()); assertNotNull(myController.getRelationships().stream().filter(r -> r.getDestination() == myRepository).findFirst().get()); }
@Test public void test_findComponents_CorrectlyFindsDependenciesBetweenComponentsFoundByDifferentComponentFinders_WhenPackage2IsScannedFirst() throws Exception { ComponentFinder componentFinder1 = new ComponentFinder( webApplication, "com.structurizr.analysis.reflections.multipleComponentFinders.package1", new TypeMatcherComponentFinderStrategy( new NameSuffixTypeMatcher("Controller", "", "") ) ); ComponentFinder componentFinder2 = new ComponentFinder( webApplication, "com.structurizr.analysis.reflections.multipleComponentFinders.package2", new TypeMatcherComponentFinderStrategy( new NameSuffixTypeMatcher("Repository", "", "") ) ); componentFinder2.findComponents(); componentFinder1.findComponents(); assertEquals(2, webApplication.getComponents().size()); Component myController = webApplication.getComponentWithName("MyController"); Component myRepository = webApplication.getComponentWithName("MyRepository"); assertEquals(1, myController.getRelationships().size()); assertNotNull(myController.getRelationships().stream().filter(r -> r.getDestination() == myRepository).findFirst().get()); }
@Test public void test_findComponents_DoesNotBreak_WhenThereIsACyclicDependency() throws Exception { ComponentFinder componentFinder = new ComponentFinder( webApplication, "com.structurizr.analysis.reflections.cyclicDependency", new TypeMatcherComponentFinderStrategy( new NameSuffixTypeMatcher("Component", "", "") ) ); componentFinder.findComponents(); assertEquals(2, webApplication.getComponents().size()); Component aComponent = webApplication.getComponentWithName("AComponent"); assertNotNull(aComponent); assertEquals("AComponent", aComponent.getName()); assertEquals("com.structurizr.analysis.reflections.cyclicDependency.AComponent", aComponent.getType().getType()); Component bComponent = webApplication.getComponentWithName("BComponent"); assertNotNull(bComponent); assertEquals("BComponent", bComponent.getName()); assertEquals("com.structurizr.analysis.reflections.cyclicDependency.BComponent", bComponent.getType().getType()); assertEquals(1, aComponent.getRelationships().size()); assertNotNull(aComponent.getRelationships().stream().filter(r -> r.getDestination() == bComponent).findFirst().get()); assertEquals(1, bComponent.getRelationships().size()); assertNotNull(bComponent.getRelationships().stream().filter(r -> r.getDestination() == aComponent).findFirst().get()); }
@Before public void setUp() throws Exception { Workspace workspace = new Workspace("Name", "Description"); Model model = workspace.getModel(); SoftwareSystem softwareSystem = model.addSoftwareSystem("Name", "Description"); container = softwareSystem.addContainer("Name", "Description", "Technology"); componentFinder = new ComponentFinder( container, "test.TypeMatcherComponentFinderStrategy", new TypeMatcherComponentFinderStrategy( new NameSuffixTypeMatcher("Controller", "Controller description", "Controller technology"), new NameSuffixTypeMatcher("Repository", "Repository description", "Repository technology") ) ); componentFinder.findComponents(); }
@Test public void test_findComponents_CorrectlyFindsDependenciesFromSuperclass() throws Exception { ComponentFinder componentFinder = new ComponentFinder( webApplication, "com.structurizr.analysis.reflections.dependenciesFromSuperClass", new TypeMatcherComponentFinderStrategy( new NameSuffixTypeMatcher("Component", "", "") ) ); componentFinder.findComponents(); assertEquals(2, webApplication.getComponents().size()); Component someComponent = webApplication.getComponentWithName("SomeComponent"); assertNotNull(someComponent); assertEquals("SomeComponent", someComponent.getName()); assertEquals("com.structurizr.analysis.reflections.dependenciesFromSuperClass.SomeComponent", someComponent.getType().getType()); Component loggingComponent = webApplication.getComponentWithName("LoggingComponent"); assertNotNull(loggingComponent); assertEquals("LoggingComponent", loggingComponent.getName()); assertEquals("com.structurizr.analysis.reflections.dependenciesFromSuperClass.LoggingComponent", loggingComponent.getType().getType()); assertEquals(1, someComponent.getRelationships().size()); assertNotNull(someComponent.getRelationships().stream().filter(r -> r.getDestination() == loggingComponent).findFirst().get()); }
@Test public void test_findComponents_CorrectlyFindsNoDependenciesWhenTwoComponentsImplementTheSameInterface() throws Exception { ComponentFinder componentFinder = new ComponentFinder( webApplication, "com.structurizr.analysis.reflections.featureinterface", new TypeMatcherComponentFinderStrategy( new NameSuffixTypeMatcher("Component", "", "") ) ); componentFinder.findComponents(); assertEquals(2, webApplication.getComponents().size()); Component someComponent = webApplication.getComponentWithName("SomeComponent"); assertNotNull(someComponent); assertEquals("SomeComponent", someComponent.getName()); assertEquals("com.structurizr.analysis.reflections.featureinterface.SomeComponent", someComponent.getType().getType()); Component otherComponent = webApplication.getComponentWithName("OtherComponent"); assertNotNull(otherComponent); assertEquals("OtherComponent", otherComponent.getName()); assertEquals("com.structurizr.analysis.reflections.featureinterface.OtherComponent", otherComponent.getType().getType()); assertEquals(0, someComponent.getRelationships().size()); assertEquals(0, otherComponent.getRelationships().size()); }