/// <summary> /// The main production execution method /// </summary> /// <param name="production">A <see cref="Production"/> instance</param> /// <param name="productionContext">A <see cref="ProductionContext"/> instance</param> /// <returns>A ProductionResult</returns> public ProductionResult ExecuteProduction(Production production, ProductionContext productionContext) { _productionContext = productionContext; // Production could be templated, resolve its parameters using the ProductionContext parameters as context values production.ResolveParameters(_productionContext.Parameters); // now add Production parameters to ProductionContext parameters _productionContext.AddParameters(production.Parameters); _productionResult = new ProductionResult(); foreach (TransformationInfo transformationInfo in production.Transformations) { TransformationResult transformationResult = ExecuteTransformation(transformationInfo); _productionResult.AccumulateTransformationResult(transformationResult); if (transformationResult.TransformationResultType == TransformationResultType.CodeEmitter) { List<GeneratedArtifact> artifacts = transformationResult.CodeEmitter.EmitCode(_productionContext.TargetTechnologies, _productionContext); _productionResult.AddGeneratedArtifacts(artifacts); } else if (transformationResult.TransformationResultType == TransformationResultType.NewModel) { if (string.IsNullOrEmpty(transformationInfo.OutputModelKey)) throw new FactoryException("Missing OutputModelKey in a Transformation resulting in a new Model " + transformationInfo.ToString()); _productionContext.SetModel(transformationInfo.OutputModelKey, transformationResult.Model); } } return _productionResult; }
/// <summary> /// Write a <see cref="ProductionResult"/> to persistent storage. /// </summary> /// <param name="productionResult">The <see cref="ProductionResult"/></param> /// <param name="productionContext">The <see cref="ProductionContext"/></param> /// <returns>A <see cref="ProductionPersistence"/> instance</returns> public ProductionPersistence Persist(ProductionResult productionResult, ProductionContext productionContext) { ProductionPersistence retval = new ProductionPersistence(productionContext.Parameters); foreach (GeneratedArtifact generatedArtifact in productionResult.GeneratedArtifacts) { IArtifactPersister artifactPersister = FactoryHost.Instance.GetArtifactPersister(generatedArtifact.TargetLanguage, null); artifactPersister.Persist(generatedArtifact, productionContext, retval); } return retval; }
/// <summary> /// Persist a production /// </summary> /// <param name="productionResult">A <see cref="ProductionResult"/> instance</param> /// <param name="productionContext">A <see cref="ProductionContext"/> instance</param> /// <returns></returns> public ProductionPersistence PersistProduction(ProductionResult productionResult, ProductionContext productionContext) { ProductionPersister productionPersister = new ProductionPersister(); return productionPersister.Persist(productionResult, productionContext); }