schema_registry.h revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef COMPONENTS_POLICY_CORE_COMMON_SCHEMA_REGISTRY_H_ 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define COMPONENTS_POLICY_CORE_COMMON_SCHEMA_REGISTRY_H_ 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <set> 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/basictypes.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/compiler_specific.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/ref_counted.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/observer_list.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/threading/non_thread_safe.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_namespace.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/schema.h" 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/schema_map.h" 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/policy_export.h" 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace policy { 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class SchemaMap; 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Holds the main reference to the current SchemaMap, and allows a list of 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// observers to get notified whenever it is updated. 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// This object is not thread safe and must be used from the owner's thread, 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// usually UI. 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class POLICY_EXPORT SchemaRegistry : public base::NonThreadSafe { 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) class POLICY_EXPORT Observer { 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Invoked whenever schemas are registered or unregistered. 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |has_new_schemas| is true if a new component has been registered since 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the last update; this allows observers to ignore updates when 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // components are unregistered but still get a handle to the current map 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // (e.g. for periodic reloads). 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnSchemaRegistryUpdated(bool has_new_schemas) = 0; 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Invoked when all policy domains become ready. 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnSchemaRegistryReady() = 0; 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~Observer(); 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) }; 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SchemaRegistry(); 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~SchemaRegistry(); 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const scoped_refptr<SchemaMap>& schema_map() const { return schema_map_; } 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Register a single component. 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void RegisterComponent(const PolicyNamespace& ns, 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const Schema& schema); 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Register a list of components for a given domain. 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void RegisterComponents(PolicyDomain domain, 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const ComponentMap& components); 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void UnregisterComponent(const PolicyNamespace& ns); 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns true if all domains have registered the initial components. 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool IsReady() const; 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This indicates that the initial components for |domain| have all been 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // registered. It must be invoked at least once for each policy domain; 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // subsequent calls for the same domain are ignored. 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SetReady(PolicyDomain domain); 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void AddObserver(Observer* observer); 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void RemoveObserver(Observer* observer); 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool HasObservers() const; 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Notify(bool has_new_schemas); 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<SchemaMap> schema_map_; 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ObserverList<Observer, true> observers_; 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool domains_ready_[POLICY_DOMAIN_SIZE]; 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SchemaRegistry); 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// A registry that combines the maps of other registries. 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class POLICY_EXPORT CombinedSchemaRegistry : public SchemaRegistry, 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public SchemaRegistry::Observer { 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CombinedSchemaRegistry(); 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~CombinedSchemaRegistry(); 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Track(SchemaRegistry* registry); 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Untrack(SchemaRegistry* registry); 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void RegisterComponents(PolicyDomain domain, 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const ComponentMap& components) OVERRIDE; 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void UnregisterComponent(const PolicyNamespace& ns) OVERRIDE; 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnSchemaRegistryUpdated(bool has_new_schemas) OVERRIDE; 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnSchemaRegistryReady() OVERRIDE; 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Combine(bool has_new_schemas); 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::set<SchemaRegistry*> registries_; 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<SchemaMap> own_schema_map_; 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CombinedSchemaRegistry); 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace policy 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif // COMPONENTS_POLICY_CORE_COMMON_SCHEMA_REGISTRY_H_ 117