blob: f8e111b5e5440f9361d668b93ddbe1e26b4f56d8 [file] [log] [blame]
Madan Jampani5e5b3d62016-02-01 16:03:33 -08001/*
2 * Copyright 2016 Open Networking Laboratory
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.store.primitives.impl;
17
18import io.atomix.catalyst.serializer.CatalystSerializable;
19import io.atomix.catalyst.serializer.Serializer;
20import io.atomix.catalyst.serializer.TypeSerializerFactory;
21import io.atomix.copycat.client.Query;
22import io.atomix.manager.state.GetResource;
23import io.atomix.manager.state.GetResourceKeys;
24import io.atomix.resource.ResourceQuery;
25
26import java.io.IOException;
27import java.net.URL;
28import java.util.Arrays;
29import java.util.Enumeration;
30import java.util.Scanner;
31
32import org.onlab.util.Match;
33import org.onosproject.cluster.NodeId;
34import org.onosproject.event.Change;
35import org.onosproject.store.primitives.resources.impl.AtomixConsistentMapCommands;
36import org.onosproject.store.primitives.resources.impl.AtomixConsistentMapState;
37import org.onosproject.store.primitives.resources.impl.AtomixLeaderElectorCommands;
38import org.onosproject.store.primitives.resources.impl.CommitResult;
39import org.onosproject.store.primitives.resources.impl.MapEntryUpdateResult;
40import org.onosproject.store.primitives.resources.impl.MapUpdate;
41import org.onosproject.store.primitives.resources.impl.PrepareResult;
42import org.onosproject.store.primitives.resources.impl.RollbackResult;
43import org.onosproject.store.primitives.resources.impl.TransactionId;
44import org.onosproject.store.primitives.resources.impl.TransactionalMapUpdate;
45import org.onosproject.store.serializers.KryoNamespaces;
46import org.onosproject.store.service.MapEvent;
47import org.onosproject.store.service.Versioned;
48
49import com.google.common.base.Throwables;
50import com.google.common.collect.Maps;
51
52/**
53 * Serializer utility for Atomix Catalyst.
54 */
55public final class CatalystSerializers {
56
57 private CatalystSerializers() {
58 }
59
60 public static Serializer getSerializer() {
61 Serializer serializer = new Serializer();
62 TypeSerializerFactory factory =
63 new DefaultCatalystTypeSerializerFactory(
64 org.onosproject.store.service.Serializer.using(Arrays.asList((KryoNamespaces.API)),
65 MapEntryUpdateResult.class,
66 MapEntryUpdateResult.Status.class,
67 MapUpdate.class,
68 MapUpdate.Type.class,
69 TransactionalMapUpdate.class,
70 TransactionId.class,
71 PrepareResult.class,
72 CommitResult.class,
73 RollbackResult.class,
74 AtomixConsistentMapCommands.Get.class,
75 AtomixConsistentMapCommands.ContainsKey.class,
76 AtomixConsistentMapCommands.ContainsValue.class,
77 AtomixConsistentMapCommands.Size.class,
78 AtomixConsistentMapCommands.IsEmpty.class,
79 AtomixConsistentMapCommands.KeySet.class,
80 AtomixConsistentMapCommands.EntrySet.class,
81 AtomixConsistentMapCommands.Values.class,
82 AtomixConsistentMapCommands.UpdateAndGet.class,
83 AtomixConsistentMapCommands.TransactionPrepare.class,
84 AtomixConsistentMapCommands.TransactionCommit.class,
85 AtomixConsistentMapCommands.TransactionRollback.class,
86 AtomixLeaderElectorCommands.GetLeadership.class,
87 AtomixLeaderElectorCommands.GetAllLeaderships.class,
88 AtomixLeaderElectorCommands.GetElectedTopics.class,
89 AtomixLeaderElectorCommands.Run.class,
90 AtomixLeaderElectorCommands.Withdraw.class,
91 AtomixLeaderElectorCommands.Anoint.class,
92 GetResource.class,
93 GetResourceKeys.class,
94 ResourceQuery.class,
95 Query.ConsistencyLevel.class));
96 // ONOS classes
97 serializer.register(Change.class, factory);
98 serializer.register(NodeId.class, factory);
99 serializer.register(Match.class, factory);
100 serializer.register(MapEntryUpdateResult.class, factory);
101 serializer.register(MapEntryUpdateResult.Status.class, factory);
102 serializer.register(TransactionalMapUpdate.class, factory);
103 serializer.register(PrepareResult.class, factory);
104 serializer.register(CommitResult.class, factory);
105 serializer.register(RollbackResult.class, factory);
106 serializer.register(TransactionId.class, factory);
107 serializer.register(MapUpdate.class, factory);
108 serializer.register(Versioned.class, factory);
109 serializer.register(MapEvent.class, factory);
110 serializer.register(Maps.immutableEntry("a", "b").getClass(), factory);
111 serializer.register(AtomixConsistentMapState.class, factory);
112
113 serializer.register(ResourceQuery.class, factory);
114 serializer.register(GetResource.class, factory);
115 serializer.register(GetResourceKeys.class, factory);
116
117 // ConsistentMap
118 serializer.register(AtomixConsistentMapCommands.UpdateAndGet.class, factory);
119 serializer.register(AtomixConsistentMapCommands.Clear.class);
120 serializer.register(AtomixConsistentMapCommands.Listen.class);
121 serializer.register(AtomixConsistentMapCommands.Unlisten.class);
122 serializer.register(AtomixConsistentMapCommands.Get.class);
123 serializer.register(AtomixConsistentMapCommands.ContainsKey.class);
124 serializer.register(AtomixConsistentMapCommands.ContainsValue.class);
125 serializer.register(AtomixConsistentMapCommands.EntrySet.class);
126 serializer.register(AtomixConsistentMapCommands.IsEmpty.class);
127 serializer.register(AtomixConsistentMapCommands.KeySet.class);
128 serializer.register(AtomixConsistentMapCommands.Size.class);
129 serializer.register(AtomixConsistentMapCommands.Values.class);
130 serializer.register(AtomixConsistentMapCommands.TransactionPrepare.class);
131 serializer.register(AtomixConsistentMapCommands.TransactionCommit.class);
132 serializer.register(AtomixConsistentMapCommands.TransactionRollback.class);
133 // LeaderElector
134 serializer.register(AtomixLeaderElectorCommands.Run.class, factory);
135 serializer.register(AtomixLeaderElectorCommands.Withdraw.class, factory);
136 serializer.register(AtomixLeaderElectorCommands.Anoint.class, factory);
137 serializer.register(AtomixLeaderElectorCommands.GetElectedTopics.class, factory);
138 serializer.register(AtomixLeaderElectorCommands.GetElectedTopics.class, factory);
139 serializer.register(AtomixLeaderElectorCommands.GetLeadership.class, factory);
140 serializer.register(AtomixLeaderElectorCommands.GetAllLeaderships.class, factory);
141 serializer.register(AtomixLeaderElectorCommands.Listen.class);
142 serializer.register(AtomixLeaderElectorCommands.Unlisten.class);
143 // Atomix types
144 try {
145 ClassLoader cl = CatalystSerializable.class.getClassLoader();
146 Enumeration<URL> urls = cl.getResources(
147 String.format("META-INF/services/%s", CatalystSerializable.class.getName()));
148 while (urls.hasMoreElements()) {
149 URL url = urls.nextElement();
150 try (Scanner scanner = new Scanner(url.openStream(), "UTF-8")) {
151 scanner.useDelimiter("\n").forEachRemaining(line -> {
152 if (!line.trim().startsWith("#")) {
153 line = line.trim();
154 if (line.length() > 0) {
155 try {
156 serializer.register(cl.loadClass(line));
157 } catch (ClassNotFoundException e) {
158 Throwables.propagate(e);
159 }
160 }
161 }
162 });
163 }
164 }
165 } catch (IOException e) {
166 Throwables.propagate(e);
167 }
168 return serializer;
169 }
170}