blob: f65a830f1245085cdbb23ed5fbdc5a698e9c356e [file] [log] [blame]
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -07001package net.onrc.onos.ofcontroller.util.serializers;
2
Pavlin Radoslavov45ec04b2014-02-14 23:29:33 -08003import java.net.InetAddress;
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -07004import java.util.ArrayList;
Pavlin Radoslavov2a091bf2013-10-25 21:37:12 -07005import java.util.TreeMap;
Pavlin Radoslavovaaace7f2013-10-25 19:42:00 -07006
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -07007import net.floodlightcontroller.util.MACAddress;
Toshio Koideeb90d912014-02-18 21:30:22 -08008import net.onrc.onos.intent.ConstrainedShortestPathIntent;
9import net.onrc.onos.intent.Intent;
10import net.onrc.onos.intent.IntentOperation;
11import net.onrc.onos.intent.IntentOperationList;
12import net.onrc.onos.intent.PathIntent;
13import net.onrc.onos.intent.ShortestPathIntent;
Pavlin Radoslavov45ec04b2014-02-14 23:29:33 -080014import net.onrc.onos.ofcontroller.networkgraph.DeviceEvent;
15import net.onrc.onos.ofcontroller.networkgraph.LinkEvent;
Toshio Koidebc116be2014-02-19 23:56:48 -080016import net.onrc.onos.ofcontroller.networkgraph.Path;
Pavlin Radoslavov45ec04b2014-02-14 23:29:33 -080017import net.onrc.onos.ofcontroller.networkgraph.PortEvent;
Pavlin Radoslavov45ec04b2014-02-14 23:29:33 -080018import net.onrc.onos.ofcontroller.networkgraph.SwitchEvent;
19import net.onrc.onos.ofcontroller.networkgraph.TopologyEvent;
Pavlin Radoslavovaaace7f2013-10-25 19:42:00 -070020import net.onrc.onos.ofcontroller.topology.TopologyElement;
Jonathan Hartd3003252013-11-15 09:44:46 -080021import net.onrc.onos.ofcontroller.util.CallerId;
22import net.onrc.onos.ofcontroller.util.DataPath;
23import net.onrc.onos.ofcontroller.util.DataPathEndpoints;
24import net.onrc.onos.ofcontroller.util.Dpid;
25import net.onrc.onos.ofcontroller.util.FlowEntry;
26import net.onrc.onos.ofcontroller.util.FlowEntryAction;
27import net.onrc.onos.ofcontroller.util.FlowEntryActions;
28import net.onrc.onos.ofcontroller.util.FlowEntryErrorState;
29import net.onrc.onos.ofcontroller.util.FlowEntryId;
30import net.onrc.onos.ofcontroller.util.FlowEntryMatch;
31import net.onrc.onos.ofcontroller.util.FlowEntrySwitchState;
32import net.onrc.onos.ofcontroller.util.FlowEntryUserState;
33import net.onrc.onos.ofcontroller.util.FlowId;
34import net.onrc.onos.ofcontroller.util.FlowPath;
35import net.onrc.onos.ofcontroller.util.FlowPathFlags;
36import net.onrc.onos.ofcontroller.util.FlowPathType;
37import net.onrc.onos.ofcontroller.util.FlowPathUserState;
38import net.onrc.onos.ofcontroller.util.IPv4;
39import net.onrc.onos.ofcontroller.util.IPv4Net;
40import net.onrc.onos.ofcontroller.util.IPv6;
41import net.onrc.onos.ofcontroller.util.IPv6Net;
42import net.onrc.onos.ofcontroller.util.Port;
43import net.onrc.onos.ofcontroller.util.Switch;
Pavlin Radoslavov45ec04b2014-02-14 23:29:33 -080044// import net.onrc.onos.ofcontroller.util.SwitchPort;
Jonathan Hartd3003252013-11-15 09:44:46 -080045
Yuta HIGUCHI2d5ac522014-01-22 10:21:41 -080046import com.esotericsoftware.kryo.Kryo;
Pavlin Radoslavovaaace7f2013-10-25 19:42:00 -070047
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -070048/**
49 * Class factory for allocating Kryo instances for
50 * serialization/deserialization of classes.
51 */
52public class KryoFactory {
53 private ArrayList<Kryo> kryoList = new ArrayList<Kryo>();
54
55 /**
56 * Default constructor.
57 */
58 public KryoFactory() {
59 Kryo kryo;
60 // Preallocate
61 for (int i = 0; i < 100; i++) {
62 kryo = newKryoImpl();
63 kryoList.add(kryo);
64 }
65 }
66
67 /**
68 * Create and initialize a new Kryo object.
69 *
70 * @return the created Kryo object.
71 */
72 public Kryo newKryo() {
73 return newDeleteKryo(null);
74 }
75
76 /**
77 * Delete an existing Kryo object.
78 *
79 * @param deleteKryo the object to delete.
80 */
81 public void deleteKryo(Kryo deleteKryo) {
82 newDeleteKryo(deleteKryo);
83 }
84
85 /**
86 * Create or delete a Kryo object.
87 *
88 * @param deleteKryo if null, then allocate and return a new object,
89 * otherwise delete the provided object.
90 * @return a new Kryo object if needed, otherwise null.
91 */
92 synchronized private Kryo newDeleteKryo(Kryo deleteKryo) {
93 if (deleteKryo != null) {
94 // Delete an entry by moving it back to the buffer
95 kryoList.add(deleteKryo);
96 return null;
97 } else {
98 Kryo kryo = null;
99 if (kryoList.isEmpty()) {
100 // Preallocate
101 for (int i = 0; i < 100; i++) {
102 kryo = newKryoImpl();
103 kryoList.add(kryo);
104 }
105 }
106
107 kryo = kryoList.remove(kryoList.size() - 1);
108 return kryo;
109 }
110 }
111
112 /**
113 * Create and initialize a new Kryo object.
114 *
115 * @return the created Kryo object.
116 */
117 private Kryo newKryoImpl() {
118 Kryo kryo = new Kryo();
119 kryo.setRegistrationRequired(true);
120 // kryo.setReferences(false);
121 //
122 kryo.register(ArrayList.class);
Pavlin Radoslavovaaace7f2013-10-25 19:42:00 -0700123
124 // FlowPath and related classes
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700125 kryo.register(CallerId.class);
126 kryo.register(DataPath.class);
127 kryo.register(DataPathEndpoints.class);
128 kryo.register(Dpid.class);
129 kryo.register(FlowEntryAction.class);
130 kryo.register(FlowEntryAction.ActionEnqueue.class);
131 kryo.register(FlowEntryAction.ActionOutput.class);
132 kryo.register(FlowEntryAction.ActionSetEthernetAddr.class);
133 kryo.register(FlowEntryAction.ActionSetIpToS.class);
134 kryo.register(FlowEntryAction.ActionSetIPv4Addr.class);
135 kryo.register(FlowEntryAction.ActionSetTcpUdpPort.class);
136 kryo.register(FlowEntryAction.ActionSetVlanId.class);
137 kryo.register(FlowEntryAction.ActionSetVlanPriority.class);
138 kryo.register(FlowEntryAction.ActionStripVlan.class);
139 kryo.register(FlowEntryAction.ActionValues.class);
140 kryo.register(FlowEntryActions.class);
141 kryo.register(FlowEntryErrorState.class);
142 kryo.register(FlowEntryId.class);
143 kryo.register(FlowEntry.class);
144 kryo.register(FlowEntryMatch.class);
145 kryo.register(FlowEntryMatch.Field.class);
146 kryo.register(FlowEntrySwitchState.class);
147 kryo.register(FlowEntryUserState.class);
148 kryo.register(FlowId.class);
149 kryo.register(FlowPath.class);
150 kryo.register(FlowPathFlags.class);
Pavlin Radoslavovd28cf7c2013-10-26 11:27:43 -0700151 kryo.register(FlowPathType.class);
Pavlin Radoslavov7d4a40e2013-10-27 23:39:40 -0700152 kryo.register(FlowPathUserState.class);
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700153 kryo.register(IPv4.class);
154 kryo.register(IPv4Net.class);
155 kryo.register(IPv6.class);
156 kryo.register(IPv6Net.class);
157 kryo.register(byte[].class);
158 kryo.register(MACAddress.class);
159 kryo.register(Port.class);
160 kryo.register(Switch.class);
Pavlin Radoslavov45ec04b2014-02-14 23:29:33 -0800161 // kryo.register(SwitchPort.class);
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700162
Pavlin Radoslavovaaace7f2013-10-25 19:42:00 -0700163 // Topology-related classes
164 kryo.register(TopologyElement.class);
Pavlin Radoslavov2a091bf2013-10-25 21:37:12 -0700165 kryo.register(TopologyElement.Type.class);
166 kryo.register(TreeMap.class);
Pavlin Radoslavovaaace7f2013-10-25 19:42:00 -0700167
Pavlin Radoslavov45ec04b2014-02-14 23:29:33 -0800168 // New data model-related classes
169 kryo.register(DeviceEvent.class);
170 kryo.register(InetAddress.class);
171 kryo.register(LinkEvent.class);
172 kryo.register(PortEvent.class);
173 kryo.register(PortEvent.SwitchPort.class);
174 kryo.register(SwitchEvent.class);
175 kryo.register(TopologyEvent.class);
176
Toshio Koideeb90d912014-02-18 21:30:22 -0800177 // Intent-related classes
178 kryo.register(IntentOperationList.class);
179 kryo.register(IntentOperation.class);
180 kryo.register(PathIntent.class);
Toshio Koideb39c9d32014-02-20 01:21:47 -0800181 kryo.register(Intent.class);
Toshio Koideeb90d912014-02-18 21:30:22 -0800182 kryo.register(ShortestPathIntent.class);
183 kryo.register(ConstrainedShortestPathIntent.class);
184 kryo.register(Intent.IntentState.class);
Toshio Koidebc116be2014-02-19 23:56:48 -0800185 kryo.register(Path.class);
Toshio Koideeb90d912014-02-18 21:30:22 -0800186 kryo.register(IntentOperation.Operator.class);
187
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700188 return kryo;
189 }
190}