blob: 92f68705a234b7251808db0fd038a42d7a97113f [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;
Madan Jampani74da78b2016-02-09 21:18:36 -080035import org.onosproject.store.primitives.MapUpdate;
Madan Jampanicadd70b2016-02-08 13:45:43 -080036import org.onosproject.store.primitives.TransactionId;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080037import org.onosproject.store.primitives.resources.impl.AtomixConsistentMapCommands;
38import org.onosproject.store.primitives.resources.impl.AtomixConsistentMapState;
39import org.onosproject.store.primitives.resources.impl.AtomixLeaderElectorCommands;
40import org.onosproject.store.primitives.resources.impl.CommitResult;
41import org.onosproject.store.primitives.resources.impl.MapEntryUpdateResult;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080042import org.onosproject.store.primitives.resources.impl.PrepareResult;
43import org.onosproject.store.primitives.resources.impl.RollbackResult;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080044import org.onosproject.store.serializers.KryoNamespaces;
45import org.onosproject.store.service.MapEvent;
Madan Jampani74da78b2016-02-09 21:18:36 -080046import org.onosproject.store.service.MapTransaction;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080047import 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,
Madan Jampani74da78b2016-02-09 21:18:36 -080069 MapTransaction.class,
Madan Jampanicadd70b2016-02-08 13:45:43 -080070 Transaction.State.class,
Madan Jampani5e5b3d62016-02-01 16:03:33 -080071 TransactionId.class,
72 PrepareResult.class,
73 CommitResult.class,
74 RollbackResult.class,
75 AtomixConsistentMapCommands.Get.class,
76 AtomixConsistentMapCommands.ContainsKey.class,
77 AtomixConsistentMapCommands.ContainsValue.class,
78 AtomixConsistentMapCommands.Size.class,
79 AtomixConsistentMapCommands.IsEmpty.class,
80 AtomixConsistentMapCommands.KeySet.class,
81 AtomixConsistentMapCommands.EntrySet.class,
82 AtomixConsistentMapCommands.Values.class,
83 AtomixConsistentMapCommands.UpdateAndGet.class,
84 AtomixConsistentMapCommands.TransactionPrepare.class,
85 AtomixConsistentMapCommands.TransactionCommit.class,
86 AtomixConsistentMapCommands.TransactionRollback.class,
87 AtomixLeaderElectorCommands.GetLeadership.class,
88 AtomixLeaderElectorCommands.GetAllLeaderships.class,
89 AtomixLeaderElectorCommands.GetElectedTopics.class,
90 AtomixLeaderElectorCommands.Run.class,
91 AtomixLeaderElectorCommands.Withdraw.class,
92 AtomixLeaderElectorCommands.Anoint.class,
93 GetResource.class,
94 GetResourceKeys.class,
95 ResourceQuery.class,
96 Query.ConsistencyLevel.class));
97 // ONOS classes
98 serializer.register(Change.class, factory);
99 serializer.register(NodeId.class, factory);
100 serializer.register(Match.class, factory);
101 serializer.register(MapEntryUpdateResult.class, factory);
102 serializer.register(MapEntryUpdateResult.Status.class, factory);
Madan Jampani74da78b2016-02-09 21:18:36 -0800103 serializer.register(MapTransaction.class, factory);
Madan Jampanicadd70b2016-02-08 13:45:43 -0800104 serializer.register(Transaction.State.class, factory);
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800105 serializer.register(PrepareResult.class, factory);
106 serializer.register(CommitResult.class, factory);
107 serializer.register(RollbackResult.class, factory);
108 serializer.register(TransactionId.class, factory);
109 serializer.register(MapUpdate.class, factory);
110 serializer.register(Versioned.class, factory);
111 serializer.register(MapEvent.class, factory);
112 serializer.register(Maps.immutableEntry("a", "b").getClass(), factory);
113 serializer.register(AtomixConsistentMapState.class, factory);
114
115 serializer.register(ResourceQuery.class, factory);
116 serializer.register(GetResource.class, factory);
117 serializer.register(GetResourceKeys.class, factory);
118
119 // ConsistentMap
120 serializer.register(AtomixConsistentMapCommands.UpdateAndGet.class, factory);
121 serializer.register(AtomixConsistentMapCommands.Clear.class);
122 serializer.register(AtomixConsistentMapCommands.Listen.class);
123 serializer.register(AtomixConsistentMapCommands.Unlisten.class);
124 serializer.register(AtomixConsistentMapCommands.Get.class);
125 serializer.register(AtomixConsistentMapCommands.ContainsKey.class);
126 serializer.register(AtomixConsistentMapCommands.ContainsValue.class);
127 serializer.register(AtomixConsistentMapCommands.EntrySet.class);
128 serializer.register(AtomixConsistentMapCommands.IsEmpty.class);
129 serializer.register(AtomixConsistentMapCommands.KeySet.class);
130 serializer.register(AtomixConsistentMapCommands.Size.class);
131 serializer.register(AtomixConsistentMapCommands.Values.class);
132 serializer.register(AtomixConsistentMapCommands.TransactionPrepare.class);
133 serializer.register(AtomixConsistentMapCommands.TransactionCommit.class);
134 serializer.register(AtomixConsistentMapCommands.TransactionRollback.class);
135 // LeaderElector
136 serializer.register(AtomixLeaderElectorCommands.Run.class, factory);
137 serializer.register(AtomixLeaderElectorCommands.Withdraw.class, factory);
138 serializer.register(AtomixLeaderElectorCommands.Anoint.class, factory);
139 serializer.register(AtomixLeaderElectorCommands.GetElectedTopics.class, factory);
140 serializer.register(AtomixLeaderElectorCommands.GetElectedTopics.class, factory);
141 serializer.register(AtomixLeaderElectorCommands.GetLeadership.class, factory);
142 serializer.register(AtomixLeaderElectorCommands.GetAllLeaderships.class, factory);
143 serializer.register(AtomixLeaderElectorCommands.Listen.class);
144 serializer.register(AtomixLeaderElectorCommands.Unlisten.class);
145 // Atomix types
146 try {
147 ClassLoader cl = CatalystSerializable.class.getClassLoader();
148 Enumeration<URL> urls = cl.getResources(
149 String.format("META-INF/services/%s", CatalystSerializable.class.getName()));
150 while (urls.hasMoreElements()) {
151 URL url = urls.nextElement();
152 try (Scanner scanner = new Scanner(url.openStream(), "UTF-8")) {
153 scanner.useDelimiter("\n").forEachRemaining(line -> {
154 if (!line.trim().startsWith("#")) {
155 line = line.trim();
156 if (line.length() > 0) {
157 try {
158 serializer.register(cl.loadClass(line));
159 } catch (ClassNotFoundException e) {
160 Throwables.propagate(e);
161 }
162 }
163 }
164 });
165 }
166 }
167 } catch (IOException e) {
168 Throwables.propagate(e);
169 }
170 return serializer;
171 }
172}