/** * Finds the prefixes of the external variables for a given application or template. * <p> * If this list is not empty, it means this application depends on * other ones. * </p> * * @param app an application or an application template * @return a non-null application */ public static Set<String> findPrefixesForExternalImports( AbstractApplication app ) { Set<String> result = new TreeSet<> (); for( Component c : ComponentHelpers.findAllComponents( app )) { for( ImportedVariable var : ComponentHelpers.findAllImportedVariables( c ).values()) { if( ! var.isExternal()) continue; String prefix = VariableHelpers.parseVariableName( var.getName()).getKey(); result.add( prefix ); } } return result; }
/** * Builds a list of messaging contexts. * @param domain the domain * @param applicationName the name of the agent's application * @param instance the current instance * @param thoseThat whether we target "those that import" or "those that export" * @return a non-null list */ public static Collection<MessagingContext> forImportedVariables( String domain, String applicationName, Instance instance, ThoseThat thoseThat ) { Map<String,MessagingContext> result = new HashMap<> (); for( ImportedVariable var : ComponentHelpers.findAllImportedVariables( instance.getComponent()).values()) { String componentOrApplicationTemplateName = VariableHelpers.parseVariableName( var.getName()).getKey(); if( result.containsKey( componentOrApplicationTemplateName )) continue; // When we import a variable, it is either internal or external, but not both! RecipientKind kind = var.isExternal() ? RecipientKind.INTER_APP : RecipientKind.AGENTS; MessagingContext ctx = new MessagingContext( kind, domain, componentOrApplicationTemplateName, thoseThat, applicationName ); result.put( componentOrApplicationTemplateName, ctx ); } return result.values(); }
/** * Builds a list of messaging contexts. * @param domain the domain * @param applicationName the name of the agent's application * @param instance the current instance * @param thoseThat whether we target "those that import" or "those that export" * @return a non-null list */ public static Collection<MessagingContext> forImportedVariables( String domain, String applicationName, Instance instance, ThoseThat thoseThat ) { Map<String,MessagingContext> result = new HashMap<> (); for( ImportedVariable var : ComponentHelpers.findAllImportedVariables( instance.getComponent()).values()) { String componentOrApplicationTemplateName = VariableHelpers.parseVariableName( var.getName()).getKey(); if( result.containsKey( componentOrApplicationTemplateName )) continue; // When we import a variable, it is either internal or external, but not both! RecipientKind kind = var.isExternal() ? RecipientKind.INTER_APP : RecipientKind.AGENTS; MessagingContext ctx = new MessagingContext( kind, domain, componentOrApplicationTemplateName, thoseThat, applicationName ); result.put( componentOrApplicationTemplateName, ctx ); } return result.values(); }
/** * 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.isExternal()) continue;
if( var.isExternal()) { sb.append( ParsingConstants.PROPERTY_COMPONENT_EXTERNAL_IMPORT ); sb.append( " " );
@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( childComponent.importedVariables.containsKey( "VM.config" )); Assert.assertFalse( childComponent.importedVariables.get( "VM.config" ).isOptional()); Assert.assertFalse( childComponent.importedVariables.get( "VM.config" ).isExternal()); Assert.assertTrue( childComponent.importedVariables.get( "App1.test" ).isExternal());
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" ).isExternal()); Assert.assertFalse( importedVariables.get( "Tomcat.portAJP" ).isOptional()); Assert.assertFalse( importedVariables.get( "Tomcat.portAJP" ).isExternal());
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" ).isExternal()); Assert.assertFalse( importedVariables.get( "MySQL.port" ).isOptional()); Assert.assertFalse( importedVariables.get( "MySQL.port" ).isExternal()); Assert.assertFalse( importedVariables.get( "Tomcat.ip" ).isExternal()); Assert.assertFalse( importedVariables.get( "Tomcat.portAJP" ).isOptional()); Assert.assertFalse( importedVariables.get( "Tomcat.portAJP" ).isExternal());