public function getPreprocessedTemplate($force = false)
{
// Gather dependencies and create blueprint references
$this->getStackName();
$this->getProfile();
$this->getParameters();
$this->getTags();
// convert templates paths to template objects
$templates = [];
foreach ($this->getTemplates() as $key => $templateFile) {
$templateFile = $this->getBasePath() . '/' . $this->valueResolver->resolvePlaceholders($templateFile, $this, 'template');
$realTemplateFile = realpath($templateFile);
if ($realTemplateFile === false || !is_file($realTemplateFile) || !is_readable($realTemplateFile)) {
throw new \Exception('Could not find template file ' . $templateFile . ' referenced in blueprint ' . $this->name);
}
$templates[] = is_int($key) ? new Template($realTemplateFile) : new PrefixedTemplate($key, $realTemplateFile);
}
foreach ($this->getOptionalTemplates() as $key => $templateFile) {
$templateFile = $this->getBasePath() . '/' . $this->valueResolver->resolvePlaceholders($templateFile, $this, 'optionalTemplates');
$realTemplateFiles = glob($templateFile);
foreach ($realTemplateFiles as $realTemplateFile) {
if ($realTemplateFile && is_file($realTemplateFile) && is_readable($realTemplateFile)) {
$templates[] = is_int($key) ? new Template($realTemplateFile) : new PrefixedTemplate($key, $realTemplateFile);
}
}
}
if (count($templates) === 0) {
throw new \Exception('No template(s) found');
}
$additionalData = ['Metadata' => [Stack::METADATA_KEY => $this->getBlueprintReference()]];
if ($force) {
$additionalData['Resources'] = ['Force' . time() => ['Type' => 'AWS::CloudFormation::WaitConditionHandle']];
}
$description = null;
if (!empty($this->blueprintConfig['description'])) {
$description = $this->valueResolver->resolvePlaceholders($this->blueprintConfig['description'], $this, 'description');
}
$templateMerger = new TemplateMerger();
return $templateMerger->merge($templates, $description, $additionalData);
}