/** * A shortcut method to add a new exported variable. * @param var a non-null variable to add */ public void addExportedVariable( ExportedVariable var ) { this.exportedVariables.put( var.getName(), var ); } }
/** * A trick to validate instances with random variables. * @param instance a non-null instance * @param set true to setup the trick, false to tear it down */ private static void randomVariablesTrickForValidation( Instance instance, boolean set ) { final String trickValue = "@# --- #@"; Map<String,ExportedVariable> exportedVariables = instance.getComponent() != null ? instance.getComponent().exportedVariables : new HashMap<String,ExportedVariable>( 0 ); for( ExportedVariable var : exportedVariables.values()) { if( ! var.isRandom()) continue; String overriddenExport = instance.overriddenExports.get( var.getName()); // Set and no export? => Set it. if( set && overriddenExport == null ) instance.overriddenExports.put( var.getName(), trickValue ); // Unset and trick value? => Unset it. else if( ! set && Objects.equals( trickValue, overriddenExport )) instance.overriddenExports.remove( var.getName()); } } }
@Override public synchronized void releaseRandomValues( Application application, Instance instance ) { // Only used for random ports. // We only remove the ports used by this instance. List<Integer> portsToRelease = new ArrayList<> (); for( ExportedVariable var : instance.getComponent().exportedVariables.values()) { if( ! var.isRandom() || var.getRandomKind() != RandomKind.PORT ) continue; String value = instance.overriddenExports.get( var.getName()); if( value != null ) portsToRelease.add( Integer.parseInt( value )); } // Update the cache InstanceContext ctx = findAgentContext( application, instance ); List<Integer> ports = this.agentToRandomPorts.get( ctx ); if( ports != null ) { ports.removeAll( portsToRelease ); if( ports.isEmpty()) this.agentToRandomPorts.remove( ctx ); } }
@Override public void restoreRandomValuesCache( Application application ) { // Only used for random ports. for( Instance instance : InstanceHelpers.getAllInstances( application )) { // Restore ALL the variables List<ExportedVariable> variablesToRegenerate = new ArrayList<> (); for( ExportedVariable var : instance.getComponent().exportedVariables.values()) { // We only care about random ports if( ! var.isRandom() || var.getRandomKind() != RandomKind.PORT ) continue; // Find the overridden value. // If it exists, restore it. String value = instance.overriddenExports.get( var.getName()); if( value != null && ! acknowledgePort( application, instance, var.getName())) variablesToRegenerate.add( var ); } // Restoration may have failed for some. Regenerate new ports for( ExportedVariable var : variablesToRegenerate ) { this.logger.warning( "Generating a new random port for " + var.getName() + " in instance " + instance + " of " + application ); generateRandomPort( application, instance, var.getName()); } // Save the updated model? if( ! variablesToRegenerate.isEmpty()) ConfigurationUtils.saveInstances( application ); } }
var.setValue( value ); result.put( var.getName(), var );
@Override public synchronized void generateRandomValues( Application application, Instance instance ) { // Exported variables that are random will be set a value for( ExportedVariable var : instance.getComponent().exportedVariables.values()) { // Not random? if( ! var.isRandom()) continue; // Port if( var.getRandomKind() == RandomKind.PORT ) { // Acknowledge: verify a random value was not already set on it. // Otherwise, generate a random port and associate it. if( ! acknowledgePort( application, instance, var.getName())) generateRandomPort( application, instance, var.getName()); } } // Save the updated model ConfigurationUtils.saveInstances( application ); }
result.put( var.getName(), var );
for( ExportedVariable var : ModelUtils.findExportedVariables( value, block.getFile(), line ).values()) { String exportKey = var.getName(); if( Utils.isEmptyOrWhitespaces( exportKey )) result.add( new ParsingError( ErrorCode.PM_EMPTY_VARIABLE_NAME, block.getFile(), line ));
String exportedVarName = exportedVariable.getName(); if( Utils.isEmptyOrWhitespaces( exportedVarName )) errors.add( new ModelError( RM_EMPTY_VARIABLE_NAME, component, variable( exportedVarName )));
ExportedVariable originalVar = originalComponent.exportedVariables.get( entry.getKey()); Assert.assertEquals( readComponent.getName(), entry.getValue().getName(), originalVar.getName()); Assert.assertEquals( readComponent.getName(), entry.getValue().getValue(), originalVar.getValue()); Assert.assertEquals( readComponent.getName(), entry.getValue().getRandomKind(), originalVar.getRandomKind());