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