/** * Resolves a list of {@link URI}s to actual {@link JobTemplate}s. This pattern is necessary to detect loops in * inheritance and prevent them from causing a stack overflow. */ private synchronized void ensureTemplatesResolved() throws SpecNotFoundException, TemplateException{ if (this.resolved) { return; } Map<URI, JobTemplate> loadedTemplates = Maps.newHashMap(); loadedTemplates.put(getUri(), this); resolveTemplates(loadedTemplates); }
private void resolveTemplates(Map<URI, JobTemplate> loadedTemplates) throws SpecNotFoundException, TemplateException { if (this.resolved) { return; } this.superTemplates = Lists.newArrayList(); for (URI uri : this.superTemplateUris) { if (!loadedTemplates.containsKey(uri)) { JobTemplate newTemplate = this.catalog.getTemplate(uri); loadedTemplates.put(uri, newTemplate); if (newTemplate instanceof InheritingJobTemplate) { ((InheritingJobTemplate) newTemplate).resolveTemplates(loadedTemplates); } } this.superTemplates.add(loadedTemplates.get(uri)); } this.resolved = true; }
/** * Resolves a list of {@link URI}s to actual {@link JobTemplate}s. This pattern is necessary to detect loops in * inheritance and prevent them from causing a stack overflow. */ private synchronized void ensureTemplatesResolved() throws SpecNotFoundException, TemplateException{ if (this.resolved) { return; } Map<URI, JobTemplate> loadedTemplates = Maps.newHashMap(); loadedTemplates.put(getUri(), this); resolveTemplates(loadedTemplates); }
private void resolveTemplates(Map<URI, JobTemplate> loadedTemplates) throws SpecNotFoundException, TemplateException { if (this.resolved) { return; } this.superTemplates = Lists.newArrayList(); for (URI uri : this.superTemplateUris) { if (!loadedTemplates.containsKey(uri)) { JobTemplate newTemplate = this.catalog.getTemplate(uri); loadedTemplates.put(uri, newTemplate); if (newTemplate instanceof InheritingJobTemplate) { ((InheritingJobTemplate) newTemplate).resolveTemplates(loadedTemplates); } } this.superTemplates.add(loadedTemplates.get(uri)); } this.resolved = true; }