15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import logging
60f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)import posixpath
70f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)import traceback
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)from data_source import DataSource
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)from docs_server_utils import FormatKey
1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)from extensions_paths import (
1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    ARTICLES_TEMPLATES, INTROS_TEMPLATES, PRIVATE_TEMPLATES)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from file_system import FileNotFoundError
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from future import All
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from path_util import AssertIsDirectory
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)class TemplateDataSource(DataSource):
190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  '''Provides a DataSource interface for compiled templates.
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  '''
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  def __init__(self, server_instance, request=None):
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    self._dir = type(self)._BASE
2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    AssertIsDirectory(self._dir)
2423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    self._request = request
250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    self._template_cache = server_instance.compiled_fs_factory.ForTemplates(
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        server_instance.host_file_system_provider.GetMaster())
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._file_system = server_instance.host_file_system_provider.GetMaster()
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  def get(self, path):
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    try:
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      return self._template_cache.GetFromFile('%s%s' %
3223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)          (self._dir, FormatKey(path))).Get()
33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    except FileNotFoundError:
340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      logging.warning(traceback.format_exc())
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return None
360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def Refresh(self, path):
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    futures = []
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    for root, _, files in self._file_system.Walk(self._dir):
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      futures += [self._template_cache.GetFromFile(
410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                      posixpath.join(self._dir, root, FormatKey(f)))
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  for f in files
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  if posixpath.splitext(f)[1] == '.html']
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return All(futures)
4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class ArticleDataSource(TemplateDataSource):
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  '''Serves templates for Articles.
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  '''
5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  _BASE = ARTICLES_TEMPLATES
5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class IntroDataSource(TemplateDataSource):
5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  '''Serves templates for Intros.
5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  '''
5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  _BASE = INTROS_TEMPLATES
5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class PartialDataSource(TemplateDataSource):
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  '''Serves templates for private templates.
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  '''
6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  _BASE = PRIVATE_TEMPLATES
63