/** * Finds the component dependencies for a given component. * @param component a component * @return a non-null map (key = component name, value = true if the dependency is optional, false otherwise) */ public static Map<String,Boolean> findComponentDependenciesFor( Component component ) { Map<String,Boolean> map = new HashMap<> (); for( ImportedVariable var : findAllImportedVariables( component ).values()) { String componentOrFacet = VariableHelpers.parseVariableName( var.getName()).getKey(); Boolean b = map.get( componentOrFacet ); if( b == null || b ) map.put( componentOrFacet, var.isOptional()); } return map; }
/** * Finds the component and facet names that prefix the variables an instance requires. * <p> * Only the mandatory variables are returned. Optional imports are not considered by this method. * </p> * * @param instance an instance * @return a non-null set with all the component and facet names this instance imports */ public static Set<String> findPrefixesForMandatoryImportedVariables( Instance instance ) { Set<String> result = new HashSet<> (); for( ImportedVariable var : ComponentHelpers.findAllImportedVariables( instance.getComponent()).values()) { if( ! var.isOptional()) result.add( VariableHelpers.parseVariableName( var.getName()).getKey()); } return result; }
/** * Converts imports to a human-readable text. * @param importedVariables a non-null set of imported variables * @return a non-null list of string, one entry per import */ private List<String> convertImports( Collection<ImportedVariable> importedVariables ) { List<String> result = new ArrayList<> (); for( ImportedVariable var : importedVariables ) { String componentOrFacet = VariableHelpers.parseVariableName( var.getName()).getKey(); String s = applyLink( var.getName(), componentOrFacet ); s += var.isOptional() ? this.messages.get( "optional" ) : this.messages.get( "required" ); //$NON-NLS-1$ //$NON-NLS-2$ if( var.isExternal()) s += this.messages.get( "external" ); //$NON-NLS-1$ result.add( s ); } return result; }
/** * Converts imports to a human-readable text. * @param importedVariables a non-null set of imported variables * @return a non-null list of string, one entry per import */ private List<String> convertImports( Collection<ImportedVariable> importedVariables ) { List<String> result = new ArrayList<> (); for( ImportedVariable var : importedVariables ) { String componentOrFacet = VariableHelpers.parseVariableName( var.getName()).getKey(); String s = applyLink( var.getName(), componentOrFacet ); s += var.isOptional() ? this.messages.get( "optional" ) : this.messages.get( "required" ); //$NON-NLS-1$ //$NON-NLS-2$ if( var.isExternal()) s += this.messages.get( "external" ); //$NON-NLS-1$ result.add( s ); } return result; }
if( var.isOptional()) { sb.append( " " ); sb.append( ParsingConstants.PROPERTY_COMPONENT_OPTIONAL_IMPORT );
if( var.isOptional()) continue;
@Test public void testSelfOptionalImports() throws Exception { File f = TestUtils.findTestFile( "/configurations/valid/component-optional-imports.graph" ); FromGraphDefinition fromDef = new FromGraphDefinition( f.getParentFile()); Graphs graphs = fromDef.buildGraphs( f ); Assert.assertEquals( 0, fromDef.getErrors().size()); Component componentA = ComponentHelpers.findComponent( graphs, "A" ); Assert.assertTrue( componentA.exportedVariables.containsKey( "port" )); Assert.assertTrue( componentA.exportedVariables.containsKey( "ip" )); Map<String,String> exportedVariables = ComponentHelpers.findAllExportedVariables( componentA ); Assert.assertTrue( exportedVariables.containsKey( "A.port" )); Assert.assertTrue( exportedVariables.containsKey( "A.ip" )); ImportedVariable var = componentA.importedVariables.get( "A.port" ); Assert.assertNotNull( var ); Assert.assertTrue( var.isOptional()); var = componentA.importedVariables.get( "A.ip" ); Assert.assertNotNull( var ); Assert.assertTrue( var.isOptional()); }
Assert.assertTrue( serverComponent.importedVariables.get( "db.ip" ).isOptional()); Assert.assertNotNull( serverComponent.importedVariables.get( "db.port" )); Assert.assertTrue( serverComponent.importedVariables.get( "db.port" ).isOptional()); Assert.assertTrue( imports.get( "db.ip" ).isOptional()); Assert.assertNotNull( imports.get( "db.port" )); Assert.assertTrue( imports.get( "db.port" ).isOptional()); Assert.assertFalse( myServerComponent.importedVariables.get( "db.ip" ).isOptional()); Assert.assertNull( myServerComponent.importedVariables.get( "db.port" )); Assert.assertEquals( 2, imports.size()); Assert.assertNotNull( imports.get( "db.ip" )); Assert.assertFalse( imports.get( "db.ip" ).isOptional()); Assert.assertNotNull( imports.get( "db.port" )); Assert.assertTrue( imports.get( "db.port" ).isOptional());
@Test public void testExplodedExportsAndImports() throws Exception { File f = TestUtils.findTestFile( "/configurations/valid/only-component-4.graph" ); FromGraphDefinition fromDef = new FromGraphDefinition( f.getParentFile()); Graphs g = fromDef.buildGraphs( f ); Assert.assertEquals( 0, fromDef.getErrors().size()); Component tomcat = ComponentHelpers.findComponent( g, "tomcat" ); Assert.assertNotNull( tomcat ); Assert.assertEquals( 2, tomcat.exportedVariables.size()); Assert.assertNotNull( tomcat.exportedVariables.get( "db.port" )); Assert.assertEquals( "8080", tomcat.exportedVariables.get( "db.port" ).getValue()); Assert.assertNotNull( tomcat.exportedVariables.get( "db.ip" )); Assert.assertNull( tomcat.exportedVariables.get( "db.ip" ).getValue()); Component apache = ComponentHelpers.findComponent( g, "apache" ); Assert.assertNotNull( apache ); Assert.assertEquals( 2, apache.importedVariables.size()); Assert.assertNotNull( apache.importedVariables.get( "tomcat.port" )); Assert.assertTrue( apache.importedVariables.get( "tomcat.port" ).isOptional()); Assert.assertNotNull( apache.importedVariables.get( "tomcat.ip" )); Assert.assertFalse( apache.importedVariables.get( "tomcat.ip" ).isOptional()); }
@Test public void testWildcardImports() throws Exception { File f = TestUtils.findTestFile( "/configurations/valid/graph-with-wildcards.graph" ); FromGraphDefinition fromDef = new FromGraphDefinition( f.getParentFile()); Graphs graphs = fromDef.buildGraphs( f ); Assert.assertEquals( 0, fromDef.getErrors().size()); Collection<ModelError> errors = RuntimeModelValidator.validate( graphs ); Assert.assertEquals( 0, errors.size()); Component component = ComponentHelpers.findComponent( graphs, "app" ); Assert.assertNotNull( component ); Map<String,String> exports = ComponentHelpers.findAllExportedVariables( component ); Assert.assertEquals( 2, exports.size()); Assert.assertNull( exports.get( "app.ip" )); Assert.assertEquals( "toto", exports.get( "app.port" )); Map<String,ImportedVariable> imports = ComponentHelpers.findAllImportedVariables( component ); Assert.assertEquals( 2, imports.size()); Assert.assertNotNull( imports.get( "database.*" )); Assert.assertFalse( imports.get( "database.*" ).isOptional()); Assert.assertNotNull( imports.get( "f-messaging-2.*" )); Assert.assertFalse( imports.get( "f-messaging-2.*" ).isOptional()); }
@Test public void testExternalImport() throws Exception { File f = TestUtils.findTestFile( "/configurations/valid/component-external-imports.graph" ); FromGraphDefinition fromDef = new FromGraphDefinition( f.getParentFile()); Graphs graphs = fromDef.buildGraphs( f ); Assert.assertEquals( 0, fromDef.getErrors().size()); Component componentA = ComponentHelpers.findComponent( graphs, "A" ); Assert.assertTrue( componentA.exportedVariables.containsKey( "port" )); Assert.assertTrue( componentA.exportedVariables.containsKey( "ip" )); Map<String,String> exportedVariables = ComponentHelpers.findAllExportedVariables( componentA ); Assert.assertTrue( exportedVariables.containsKey( "A.port" )); Assert.assertTrue( exportedVariables.containsKey( "A.ip" )); ImportedVariable var = componentA.importedVariables.get( "A.port" ); Assert.assertNotNull( var ); Assert.assertTrue( var.isOptional()); Assert.assertFalse( var.isExternal()); var = componentA.importedVariables.get( "A.ip" ); Assert.assertNotNull( var ); Assert.assertTrue( var.isOptional()); Assert.assertFalse( var.isExternal()); var = componentA.importedVariables.get( "App.toto" ); Assert.assertNotNull( var ); Assert.assertFalse( var.isOptional()); Assert.assertTrue( var.isExternal()); var = componentA.importedVariables.get( "App2.ip" ); Assert.assertNotNull( var ); Assert.assertTrue( var.isOptional()); Assert.assertTrue( var.isExternal()); }
Assert.assertTrue( imports.containsKey( "database.ip" )); Assert.assertTrue( imports.containsKey( "database.port" )); Assert.assertTrue( imports.get( "database.port" ).isOptional()); Assert.assertFalse( imports.get( "database.ip" ).isOptional()); Assert.assertTrue( imports.containsKey( "database.port" )); Assert.assertTrue( imports.containsKey( "whatever" )); Assert.assertFalse( imports.get( "database.ip" ).isOptional()); Assert.assertFalse( imports.get( "database.port" ).isOptional()); Assert.assertFalse( imports.get( "whatever" ).isOptional());
Assert.assertFalse( childComponent.importedVariables.get( "VM.config" ).isOptional()); Assert.assertFalse( childComponent.importedVariables.get( "VM.config" ).isExternal()); Assert.assertFalse( childComponent.importedVariables.get( "App1.test" ).isOptional()); Assert.assertTrue( childComponent.importedVariables.get( "App1.test" ).isExternal());
Assert.assertFalse( importedVariables.get( "MySQL.ip" ).isOptional()); Assert.assertFalse( importedVariables.get( "MySQL.ip" ).isExternal()); Assert.assertFalse( importedVariables.get( "MySQL.port" ).isOptional()); Assert.assertFalse( importedVariables.get( "MySQL.port" ).isExternal()); Assert.assertFalse( importedVariables.get( "Tomcat.ip" ).isOptional()); Assert.assertFalse( importedVariables.get( "Tomcat.ip" ).isExternal()); Assert.assertFalse( importedVariables.get( "Tomcat.portAJP" ).isOptional()); Assert.assertFalse( importedVariables.get( "Tomcat.portAJP" ).isExternal());
ImportedVariable originalVar = originalComponent.importedVariables.get( var.getName()); Assert.assertNotNull( "Imports did not match for " + junitMsg, originalVar ); Assert.assertEquals( junitMsg, originalVar.isOptional(), var.isOptional()); Assert.assertEquals( junitMsg, originalVar.isExternal(), var.isExternal());
Assert.assertFalse( importedVariables.get( "MySQL.ip" ).isOptional()); Assert.assertFalse( importedVariables.get( "MySQL.ip" ).isExternal()); Assert.assertFalse( importedVariables.get( "MySQL.port" ).isOptional()); Assert.assertFalse( importedVariables.get( "MySQL.port" ).isExternal()); Assert.assertFalse( importedVariables.get( "Tomcat.ip" ).isOptional()); Assert.assertFalse( importedVariables.get( "Tomcat.ip" ).isExternal()); Assert.assertFalse( importedVariables.get( "Tomcat.portAJP" ).isOptional()); Assert.assertFalse( importedVariables.get( "Tomcat.portAJP" ).isExternal());