policy_error_map.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com// Copyright 2013 The Chromium Authors. All rights reserved.
2cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com// Use of this source code is governed by a BSD-style license that can be
3cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com// found in the LICENSE file.
4cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com
5cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com#include "components/policy/core/browser/policy_error_map.h"
6cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com
7cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com#include <utility>
8cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com
9cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com#include "base/strings/string_number_conversions.h"
10cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com#include "base/strings/string_util.h"
11cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com#include "base/strings/utf_string_conversions.h"
12cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com#include "grit/components_strings.h"
13cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com#include "ui/base/l10n/l10n_util.h"
14cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com#include "ui/base/resource/resource_bundle.h"
15cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com
16a61ba109bf1a60c6de8f9ebea043e782497b88ccdjsollen@google.comnamespace policy {
17cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com
18cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.comclass PolicyErrorMap::PendingError {
19cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com public:
20cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com  explicit PendingError(const std::string& policy_name)
21cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com      : policy_name_(policy_name) {}
22cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com  virtual ~PendingError() {}
237507276d8626a6d4a4073b3f93bd2eaa9f21f111commit-bot@chromium.org
247507276d8626a6d4a4073b3f93bd2eaa9f21f111commit-bot@chromium.org  const std::string& policy_name() const { return policy_name_; }
257507276d8626a6d4a4073b3f93bd2eaa9f21f111commit-bot@chromium.org
26cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com  virtual base::string16 GetMessage() const = 0;
27cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com
287507276d8626a6d4a4073b3f93bd2eaa9f21f111commit-bot@chromium.org private:
29cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com  std::string policy_name_;
30cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com
31cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com  DISALLOW_COPY_AND_ASSIGN(PendingError);
327507276d8626a6d4a4073b3f93bd2eaa9f21f111commit-bot@chromium.org};
33cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com
34cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.comnamespace {
35cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com
367507276d8626a6d4a4073b3f93bd2eaa9f21f111commit-bot@chromium.orgclass SimplePendingError : public PolicyErrorMap::PendingError {
37cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com public:
38cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com  SimplePendingError(const std::string& policy_name,
39cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com                     int message_id,
40cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com                     const std::string& replacement)
41cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com      : PendingError(policy_name),
42cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com        message_id_(message_id),
43cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com        replacement_(replacement) {}
44cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com  virtual ~SimplePendingError() {}
45cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com
46cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com  virtual base::string16 GetMessage() const OVERRIDE {
47cc95b1aeb8cbb9201712c9982d12149b0e0027f0djsollen@google.com    if (message_id_ >= 0) {
48c1dc0d486ff1f537378205a2d1698ce2044e7735commit-bot@chromium.org      if (replacement_.empty())
49c1dc0d486ff1f537378205a2d1698ce2044e7735commit-bot@chromium.org        return l10n_util::GetStringUTF16(message_id_);
50      return l10n_util::GetStringFUTF16(message_id_,
51                                        base::ASCIIToUTF16(replacement_));
52    }
53    return base::ASCIIToUTF16(replacement_);
54  }
55
56 private:
57  int message_id_;
58  std::string replacement_;
59
60  DISALLOW_COPY_AND_ASSIGN(SimplePendingError);
61};
62
63class DictSubkeyPendingError : public SimplePendingError {
64 public:
65  DictSubkeyPendingError(const std::string& policy_name,
66                         const std::string& subkey,
67                         int message_id,
68                         const std::string& replacement)
69      : SimplePendingError(policy_name, message_id, replacement),
70        subkey_(subkey) {}
71  virtual ~DictSubkeyPendingError() {}
72
73  virtual base::string16 GetMessage() const OVERRIDE {
74    return l10n_util::GetStringFUTF16(IDS_POLICY_SUBKEY_ERROR,
75                                      base::ASCIIToUTF16(subkey_),
76                                      SimplePendingError::GetMessage());
77  }
78
79 private:
80  std::string subkey_;
81
82  DISALLOW_COPY_AND_ASSIGN(DictSubkeyPendingError);
83};
84
85class ListItemPendingError : public SimplePendingError {
86 public:
87  ListItemPendingError(const std::string& policy_name,
88                       int index,
89                       int message_id,
90                       const std::string& replacement)
91      : SimplePendingError(policy_name, message_id, replacement),
92        index_(index) {}
93  virtual ~ListItemPendingError() {}
94
95  virtual base::string16 GetMessage() const OVERRIDE {
96    return l10n_util::GetStringFUTF16(IDS_POLICY_LIST_ENTRY_ERROR,
97                                      base::IntToString16(index_),
98                                      SimplePendingError::GetMessage());
99  }
100
101 private:
102  int index_;
103
104  DISALLOW_COPY_AND_ASSIGN(ListItemPendingError);
105};
106
107class SchemaValidatingPendingError : public SimplePendingError {
108 public:
109  SchemaValidatingPendingError(const std::string& policy_name,
110                               const std::string& error_path,
111                               const std::string& replacement)
112      : SimplePendingError(policy_name, -1, replacement),
113        error_path_(error_path) {};
114  virtual ~SchemaValidatingPendingError() {}
115
116  virtual base::string16 GetMessage() const OVERRIDE {
117    return l10n_util::GetStringFUTF16(IDS_POLICY_SCHEMA_VALIDATION_ERROR,
118                                      base::ASCIIToUTF16(error_path_),
119                                      SimplePendingError::GetMessage());
120  }
121
122 private:
123  std::string error_path_;
124
125  DISALLOW_COPY_AND_ASSIGN(SchemaValidatingPendingError);
126};
127
128}  // namespace
129
130PolicyErrorMap::PolicyErrorMap() {
131}
132
133PolicyErrorMap::~PolicyErrorMap() {
134}
135
136bool PolicyErrorMap::IsReady() const {
137  return ui::ResourceBundle::HasSharedInstance();
138}
139
140void PolicyErrorMap::AddError(const std::string& policy, int message_id) {
141  AddError(new SimplePendingError(policy, message_id, std::string()));
142}
143
144void PolicyErrorMap::AddError(const std::string& policy,
145                              const std::string& subkey,
146                              int message_id) {
147  AddError(
148      new DictSubkeyPendingError(policy, subkey, message_id, std::string()));
149}
150
151void PolicyErrorMap::AddError(const std::string& policy,
152                              int index,
153                              int message_id) {
154  AddError(new ListItemPendingError(policy, index, message_id, std::string()));
155}
156
157void PolicyErrorMap::AddError(const std::string& policy,
158                              int message_id,
159                              const std::string& replacement) {
160  AddError(new SimplePendingError(policy, message_id, replacement));
161}
162
163void PolicyErrorMap::AddError(const std::string& policy,
164                              const std::string& subkey,
165                              int message_id,
166                              const std::string& replacement) {
167  AddError(new DictSubkeyPendingError(policy, subkey, message_id, replacement));
168}
169
170void PolicyErrorMap::AddError(const std::string& policy,
171                              int index,
172                              int message_id,
173                              const std::string& replacement) {
174  AddError(new ListItemPendingError(policy, index, message_id, replacement));
175}
176
177void PolicyErrorMap::AddError(const std::string& policy,
178                              const std::string& error_path,
179                              const std::string& message) {
180  AddError(new SchemaValidatingPendingError(policy, error_path, message));
181}
182
183base::string16 PolicyErrorMap::GetErrors(const std::string& policy) {
184  CheckReadyAndConvert();
185  std::pair<const_iterator, const_iterator> range = map_.equal_range(policy);
186  std::vector<base::string16> list;
187  for (const_iterator it = range.first; it != range.second; ++it)
188    list.push_back(it->second);
189  return JoinString(list, '\n');
190}
191
192bool PolicyErrorMap::empty() {
193  CheckReadyAndConvert();
194  return map_.empty();
195}
196
197size_t PolicyErrorMap::size() {
198  CheckReadyAndConvert();
199  return map_.size();
200}
201
202PolicyErrorMap::const_iterator PolicyErrorMap::begin() {
203  CheckReadyAndConvert();
204  return map_.begin();
205}
206
207PolicyErrorMap::const_iterator PolicyErrorMap::end() {
208  CheckReadyAndConvert();
209  return map_.end();
210}
211
212void PolicyErrorMap::Clear() {
213  CheckReadyAndConvert();
214  map_.clear();
215}
216
217void PolicyErrorMap::AddError(PendingError* error) {
218  if (IsReady()) {
219    Convert(error);
220    delete error;
221  } else {
222    pending_.push_back(error);
223  }
224}
225
226void PolicyErrorMap::Convert(PendingError* error) {
227  map_.insert(std::make_pair(error->policy_name(), error->GetMessage()));
228}
229
230void PolicyErrorMap::CheckReadyAndConvert() {
231  DCHECK(IsReady());
232  for (size_t i = 0; i < pending_.size(); ++i) {
233    Convert(pending_[i]);
234  }
235  pending_.clear();
236}
237
238}  // namespace policy
239