Source code for everest.resources.repository

"""
Resource repository.

This file is part of the everest project. 
See LICENSE.txt for licensing, CONTRIBUTORS.txt for contributor information.

Created on Jan 13, 2012.
"""
from everest.entities.aggregates import MemoryAggregate
from everest.entities.aggregates import OrmAggregate
from everest.entities.repository import EntityRepository
from everest.orm import map_system_entities
from everest.repository import REPOSITORIES
from everest.repository import Repository
from everest.resources.entitystores import CachingEntityStore
from everest.resources.entitystores import FileSystemEntityStore
from everest.resources.entitystores import OrmEntityStore
from everest.resources.io import load_collection_from_url
from everest.resources.utils import get_collection_class
from everest.utils import id_generator

__docformat__ = 'reStructuredText en'
__all__ = ['RepositoryManager',
           'ResourceRepository',
           ]


[docs]class ResourceRepository(Repository): """ The resource repository manages resource accessors (collections). """ def __init__(self, entity_repository): Repository.__init__(self) self.__managed_collections = set() self.__entity_repository = entity_repository def clear(self, rc): Repository.clear(self, rc) self.__entity_repository.clear(rc) def clear_all(self): Repository.clear_all(self) self.__entity_repository.clear_all() def load_representation(self, rc, url, content_type=None, resolve_urls=True): coll = self.get(rc) load_collection_from_url(coll, url, content_type=content_type, resolve_urls=resolve_urls) def manage(self, collection_class): self.__managed_collections.add(collection_class) @property def managed_collections(self): return self.__managed_collections.copy() def configure(self, **config): self.__entity_repository.configure(**config) def _initialize(self): self.__entity_repository.initialize() def _new(self, rc): agg = self.__entity_repository.new(rc) coll_cls = get_collection_class(rc) return coll_cls.create_from_aggregate(agg) @property def is_initialized(self): return self.__entity_repository.is_initialized @property def name(self): return self.__entity_repository.name @property def configuration(self): return self.__entity_repository.configuration def _make_key(self, rc): return get_collection_class(rc)
class RepositoryManager(object): __repo_id_gen = id_generator() def __init__(self): self.__repositories = {} self.__default_repo = None self.__messaging_repo = None self.__messaging_reset_on_start = None def get(self, name): return self.__repositories.get(name) def set(self, repo, make_default=False): name = repo.name if name in self.__repositories \ and self.__repositories[name].is_initialized: raise ValueError('Can not replace repositories that have been ' 'initialized.') self.__repositories[name] = repo if make_default: self.__default_repo = repo def get_default(self): return self.__default_repo def new(self, repo_type, name=None, entity_store_class=None, aggregate_class=None): if name == repo_type: # This is a root repository. is_root_repository = True else: is_root_repository = False if name is None: name = "%s%d" % (repo_type, self.__repo_id_gen.next()) if repo_type == REPOSITORIES.MEMORY: if entity_store_class is None: entity_store_class = CachingEntityStore if aggregate_class is None: aggregate_class = MemoryAggregate elif repo_type == REPOSITORIES.ORM: if entity_store_class is None: entity_store_class = OrmEntityStore if aggregate_class is None: aggregate_class = OrmAggregate elif repo_type == REPOSITORIES.FILE_SYSTEM: if entity_store_class is None: entity_store_class = FileSystemEntityStore if aggregate_class is None: aggregate_class = MemoryAggregate else: raise ValueError('Unknown repository type.') ent_store = entity_store_class(name, join_transaction=is_root_repository) ent_repo = EntityRepository(ent_store, aggregate_class=aggregate_class) return ResourceRepository(ent_repo) def setup_messaging(self, repository, reset_on_start): """ Sets up messaging for the given repository. :param str repository: Name of the repository to use to store user messages. :param bool reset_on_start: Flag to indicate whether stored user messsages should be discarded on startup. """ self.__messaging_repo = repository self.__messaging_reset_on_start = reset_on_start def initialize_all(self): """ Convenience method to initialize all repositories that have not been initialized yet. """ for repo in self.__repositories.itervalues(): if not repo.is_initialized: # If this repo is the one configured for messaging, initialize # the message resource. if repo.name == self.__messaging_repo: self.__initialize_messaging() repo.initialize() def __initialize_messaging(self): if self.__messaging_repo == REPOSITORIES.ORM: # Wrap the metadata callback to also call the mapping function # for system entities. repo = self.get(self.__messaging_repo) md_fac = repo.configuration['metadata_factory'] def wrapper(engine, reset_on_start=self.__messaging_reset_on_start): metadata = md_fac(engine) map_system_entities(engine, reset_on_start) return metadata repo.configure(metadata_factory=wrapper)

Project Versions