OLD | NEW |
| (Empty) |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 package org.chromium.sync; | |
6 | |
7 import com.google.ipc.invalidation.external.client.types.ObjectId; | |
8 import com.google.protos.ipc.invalidation.Types; | |
9 | |
10 import org.chromium.base.VisibleForTesting; | |
11 import org.chromium.base.annotations.JNINamespace; | |
12 | |
13 import java.util.Collection; | |
14 import java.util.HashSet; | |
15 import java.util.Set; | |
16 | |
17 /** | |
18 * Helper methods for dealing with ModelTypes. | |
19 * | |
20 * This class deals primarily with converting ModelTypes into notification types
(string | |
21 * representations that are used to register for invalidations) and converting n
otification | |
22 * types into the actual ObjectIds used for invalidations. | |
23 * | |
24 */ | |
25 @JNINamespace("syncer") | |
26 public class ModelTypeHelper { | |
27 /** | |
28 * Implement this class to override the behavior of | |
29 * {@link ModelTypeHelper#toNotificationType()} for tests. | |
30 */ | |
31 public interface TestDelegate { | |
32 public String toNotificationType(int modelType); | |
33 } | |
34 | |
35 private static final String TAG = "ModelTypeHelper"; | |
36 | |
37 private static final Object sLock = new Object(); | |
38 | |
39 private static final int[] NON_INVALIDATION_TYPES_ARRAY = new int[] { | |
40 ModelType.PROXY_TABS | |
41 }; | |
42 | |
43 private static TestDelegate sDelegate = null; | |
44 | |
45 // Convenience sets for checking whether a type can have invalidations. Some
ModelTypes | |
46 // such as PROXY_TABS are not real types and can't be registered. Initializi
ng these | |
47 // once reduces toNotificationType() calls in the isInvalidationType() metho
d. | |
48 private static Set<String> sNonInvalidationTypes = null; | |
49 | |
50 /** | |
51 * Initializes the non-invalidation sets. Called lazily the first time they'
re needed. | |
52 */ | |
53 private static void initNonInvalidationTypes() { | |
54 synchronized (sLock) { | |
55 if (sNonInvalidationTypes != null) return; | |
56 | |
57 sNonInvalidationTypes = new HashSet<String>(); | |
58 for (int i = 0; i < NON_INVALIDATION_TYPES_ARRAY.length; i++) { | |
59 sNonInvalidationTypes.add(toNotificationType(NON_INVALIDATION_TY
PES_ARRAY[i])); | |
60 } | |
61 } | |
62 } | |
63 | |
64 /** | |
65 * Checks whether a type is allowed to register for invalidations. | |
66 */ | |
67 private static boolean isInvalidationType(String notificationType) { | |
68 initNonInvalidationTypes(); | |
69 return !sNonInvalidationTypes.contains(notificationType); | |
70 } | |
71 | |
72 /** | |
73 * Converts a notification type into an ObjectId. | |
74 * | |
75 * If the model type is not an invalidation type, this function uses the str
ing "NULL". | |
76 */ | |
77 private static ObjectId toObjectId(String notificationType) { | |
78 String objectIdString = isInvalidationType(notificationType) ? notificat
ionType : "NULL"; | |
79 return ObjectId.newInstance(Types.ObjectSource.CHROME_SYNC, objectIdStri
ng.getBytes()); | |
80 } | |
81 | |
82 @VisibleForTesting | |
83 public static ObjectId toObjectId(int modelType) { | |
84 return toObjectId(toNotificationType(modelType)); | |
85 } | |
86 | |
87 /** | |
88 * Converts a model type to its notification type representation using JNI. | |
89 * | |
90 * This is the value that is stored in the invalidation preferences and used
to | |
91 * register for invalidations. | |
92 * | |
93 * @param modelType the model type to convert to a string. | |
94 * @return the string representation of the model type constant. | |
95 */ | |
96 public static String toNotificationType(int modelType) { | |
97 if (sDelegate != null) return sDelegate.toNotificationType(modelType); | |
98 | |
99 // Because PROXY_TABS isn't an invalidation type, it doesn't have a stri
ng from native, | |
100 // but for backwards compatibility we need to keep its pref value the sa
me as the old | |
101 // ModelType enum name value. | |
102 if (modelType == ModelType.PROXY_TABS) { | |
103 return "PROXY_TABS"; | |
104 } | |
105 return nativeModelTypeToNotificationType(modelType); | |
106 } | |
107 | |
108 /** | |
109 * Converts a set of {@link String} notification types to a set of {@link Ob
jectId}. | |
110 * | |
111 * This function assumes that all the strings passed in were generated with | |
112 * ModelTypeHelper.toNotificationType. Any notification types that are nonIn
validationTypes | |
113 * are filtered out. | |
114 */ | |
115 public static Set<ObjectId> notificationTypesToObjectIds(Collection<String>
notificationTypes) { | |
116 Set<ObjectId> objectIds = new HashSet<ObjectId>(); | |
117 for (String notificationType : notificationTypes) { | |
118 if (isInvalidationType(notificationType)) { | |
119 objectIds.add(toObjectId(notificationType)); | |
120 } | |
121 } | |
122 return objectIds; | |
123 } | |
124 | |
125 @VisibleForTesting | |
126 public static void setTestDelegate(TestDelegate delegate) { | |
127 sDelegate = delegate; | |
128 } | |
129 | |
130 private static native String nativeModelTypeToNotificationType(int modelType
); | |
131 } | |
OLD | NEW |