blob: 2cecc0fb6a6e19bdee7a628e90f59c31afaf95ad [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;
Madan Jampanie14a09c2016-02-11 10:43:21 -080025import io.atomix.variables.state.ValueCommands;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080026
27import java.io.IOException;
28import java.net.URL;
29import java.util.Arrays;
30import java.util.Enumeration;
31import java.util.Scanner;
32
33import org.onlab.util.Match;
34import org.onosproject.cluster.NodeId;
35import org.onosproject.event.Change;
Madan Jampani74da78b2016-02-09 21:18:36 -080036import org.onosproject.store.primitives.MapUpdate;
Madan Jampanicadd70b2016-02-08 13:45:43 -080037import org.onosproject.store.primitives.TransactionId;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080038import org.onosproject.store.primitives.resources.impl.AtomixConsistentMapCommands;
39import org.onosproject.store.primitives.resources.impl.AtomixConsistentMapState;
40import org.onosproject.store.primitives.resources.impl.AtomixLeaderElectorCommands;
41import org.onosproject.store.primitives.resources.impl.CommitResult;
42import org.onosproject.store.primitives.resources.impl.MapEntryUpdateResult;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080043import org.onosproject.store.primitives.resources.impl.PrepareResult;
44import org.onosproject.store.primitives.resources.impl.RollbackResult;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080045import org.onosproject.store.serializers.KryoNamespaces;
46import org.onosproject.store.service.MapEvent;
Madan Jampani74da78b2016-02-09 21:18:36 -080047import org.onosproject.store.service.MapTransaction;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080048import org.onosproject.store.service.Versioned;
49
50import com.google.common.base.Throwables;
51import com.google.common.collect.Maps;
52
53/**
54 * Serializer utility for Atomix Catalyst.
55 */
56public final class CatalystSerializers {
57
58 private CatalystSerializers() {
59 }
60
61 public static Serializer getSerializer() {
62 Serializer serializer = new Serializer();
63 TypeSerializerFactory factory =
64 new DefaultCatalystTypeSerializerFactory(
65 org.onosproject.store.service.Serializer.using(Arrays.asList((KryoNamespaces.API)),
66 MapEntryUpdateResult.class,
67 MapEntryUpdateResult.Status.class,
68 MapUpdate.class,
69 MapUpdate.Type.class,
Madan Jampani74da78b2016-02-09 21:18:36 -080070 MapTransaction.class,
Madan Jampanicadd70b2016-02-08 13:45:43 -080071 Transaction.State.class,
Madan Jampani5e5b3d62016-02-01 16:03:33 -080072 TransactionId.class,
73 PrepareResult.class,
74 CommitResult.class,
75 RollbackResult.class,
76 AtomixConsistentMapCommands.Get.class,
77 AtomixConsistentMapCommands.ContainsKey.class,
78 AtomixConsistentMapCommands.ContainsValue.class,
79 AtomixConsistentMapCommands.Size.class,
80 AtomixConsistentMapCommands.IsEmpty.class,
81 AtomixConsistentMapCommands.KeySet.class,
82 AtomixConsistentMapCommands.EntrySet.class,
83 AtomixConsistentMapCommands.Values.class,
84 AtomixConsistentMapCommands.UpdateAndGet.class,
85 AtomixConsistentMapCommands.TransactionPrepare.class,
86 AtomixConsistentMapCommands.TransactionCommit.class,
87 AtomixConsistentMapCommands.TransactionRollback.class,
88 AtomixLeaderElectorCommands.GetLeadership.class,
89 AtomixLeaderElectorCommands.GetAllLeaderships.class,
90 AtomixLeaderElectorCommands.GetElectedTopics.class,
91 AtomixLeaderElectorCommands.Run.class,
92 AtomixLeaderElectorCommands.Withdraw.class,
93 AtomixLeaderElectorCommands.Anoint.class,
94 GetResource.class,
95 GetResourceKeys.class,
96 ResourceQuery.class,
Madan Jampanie14a09c2016-02-11 10:43:21 -080097 ValueCommands.Get.class,
98 ValueCommands.Set.class,
Madan Jampani5e5b3d62016-02-01 16:03:33 -080099 Query.ConsistencyLevel.class));
100 // ONOS classes
101 serializer.register(Change.class, factory);
102 serializer.register(NodeId.class, factory);
103 serializer.register(Match.class, factory);
104 serializer.register(MapEntryUpdateResult.class, factory);
105 serializer.register(MapEntryUpdateResult.Status.class, factory);
Madan Jampani74da78b2016-02-09 21:18:36 -0800106 serializer.register(MapTransaction.class, factory);
Madan Jampanicadd70b2016-02-08 13:45:43 -0800107 serializer.register(Transaction.State.class, factory);
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800108 serializer.register(PrepareResult.class, factory);
109 serializer.register(CommitResult.class, factory);
110 serializer.register(RollbackResult.class, factory);
111 serializer.register(TransactionId.class, factory);
112 serializer.register(MapUpdate.class, factory);
113 serializer.register(Versioned.class, factory);
114 serializer.register(MapEvent.class, factory);
115 serializer.register(Maps.immutableEntry("a", "b").getClass(), factory);
116 serializer.register(AtomixConsistentMapState.class, factory);
117
118 serializer.register(ResourceQuery.class, factory);
119 serializer.register(GetResource.class, factory);
120 serializer.register(GetResourceKeys.class, factory);
Madan Jampanie14a09c2016-02-11 10:43:21 -0800121 serializer.register(ValueCommands.Get.class, factory);
122 serializer.register(ValueCommands.Set.class, factory);
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800123
124 // ConsistentMap
125 serializer.register(AtomixConsistentMapCommands.UpdateAndGet.class, factory);
126 serializer.register(AtomixConsistentMapCommands.Clear.class);
127 serializer.register(AtomixConsistentMapCommands.Listen.class);
128 serializer.register(AtomixConsistentMapCommands.Unlisten.class);
129 serializer.register(AtomixConsistentMapCommands.Get.class);
130 serializer.register(AtomixConsistentMapCommands.ContainsKey.class);
131 serializer.register(AtomixConsistentMapCommands.ContainsValue.class);
132 serializer.register(AtomixConsistentMapCommands.EntrySet.class);
133 serializer.register(AtomixConsistentMapCommands.IsEmpty.class);
134 serializer.register(AtomixConsistentMapCommands.KeySet.class);
135 serializer.register(AtomixConsistentMapCommands.Size.class);
136 serializer.register(AtomixConsistentMapCommands.Values.class);
137 serializer.register(AtomixConsistentMapCommands.TransactionPrepare.class);
138 serializer.register(AtomixConsistentMapCommands.TransactionCommit.class);
139 serializer.register(AtomixConsistentMapCommands.TransactionRollback.class);
140 // LeaderElector
141 serializer.register(AtomixLeaderElectorCommands.Run.class, factory);
142 serializer.register(AtomixLeaderElectorCommands.Withdraw.class, factory);
143 serializer.register(AtomixLeaderElectorCommands.Anoint.class, factory);
144 serializer.register(AtomixLeaderElectorCommands.GetElectedTopics.class, factory);
145 serializer.register(AtomixLeaderElectorCommands.GetElectedTopics.class, factory);
146 serializer.register(AtomixLeaderElectorCommands.GetLeadership.class, factory);
147 serializer.register(AtomixLeaderElectorCommands.GetAllLeaderships.class, factory);
148 serializer.register(AtomixLeaderElectorCommands.Listen.class);
149 serializer.register(AtomixLeaderElectorCommands.Unlisten.class);
150 // Atomix types
151 try {
152 ClassLoader cl = CatalystSerializable.class.getClassLoader();
153 Enumeration<URL> urls = cl.getResources(
154 String.format("META-INF/services/%s", CatalystSerializable.class.getName()));
155 while (urls.hasMoreElements()) {
156 URL url = urls.nextElement();
157 try (Scanner scanner = new Scanner(url.openStream(), "UTF-8")) {
158 scanner.useDelimiter("\n").forEachRemaining(line -> {
159 if (!line.trim().startsWith("#")) {
160 line = line.trim();
161 if (line.length() > 0) {
162 try {
163 serializer.register(cl.loadClass(line));
164 } catch (ClassNotFoundException e) {
165 Throwables.propagate(e);
166 }
167 }
168 }
169 });
170 }
171 }
172 } catch (IOException e) {
173 Throwables.propagate(e);
174 }
175 return serializer;
176 }
177}