blob: 1355fe01a09437775869921cba5915f3cb23292d [file] [log] [blame]
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -07001package net.onrc.onos.ofcontroller.util.serializers;
2
3import java.util.ArrayList;
Pavlin Radoslavov2a091bf2013-10-25 21:37:12 -07004import java.util.TreeMap;
Pavlin Radoslavovaaace7f2013-10-25 19:42:00 -07005
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -07006import net.floodlightcontroller.util.MACAddress;
Jonathan Hartd3003252013-11-15 09:44:46 -08007import net.onrc.onos.ofcontroller.proxyarp.ArpMessage;
Pavlin Radoslavovaaace7f2013-10-25 19:42:00 -07008import net.onrc.onos.ofcontroller.topology.TopologyElement;
Jonathan Hartd3003252013-11-15 09:44:46 -08009import net.onrc.onos.ofcontroller.util.CallerId;
10import net.onrc.onos.ofcontroller.util.DataPath;
11import net.onrc.onos.ofcontroller.util.DataPathEndpoints;
12import net.onrc.onos.ofcontroller.util.Dpid;
13import net.onrc.onos.ofcontroller.util.FlowEntry;
14import net.onrc.onos.ofcontroller.util.FlowEntryAction;
15import net.onrc.onos.ofcontroller.util.FlowEntryActions;
16import net.onrc.onos.ofcontroller.util.FlowEntryErrorState;
17import net.onrc.onos.ofcontroller.util.FlowEntryId;
18import net.onrc.onos.ofcontroller.util.FlowEntryMatch;
19import net.onrc.onos.ofcontroller.util.FlowEntrySwitchState;
20import net.onrc.onos.ofcontroller.util.FlowEntryUserState;
21import net.onrc.onos.ofcontroller.util.FlowId;
22import net.onrc.onos.ofcontroller.util.FlowPath;
23import net.onrc.onos.ofcontroller.util.FlowPathFlags;
24import net.onrc.onos.ofcontroller.util.FlowPathType;
25import net.onrc.onos.ofcontroller.util.FlowPathUserState;
26import net.onrc.onos.ofcontroller.util.IPv4;
27import net.onrc.onos.ofcontroller.util.IPv4Net;
28import net.onrc.onos.ofcontroller.util.IPv6;
29import net.onrc.onos.ofcontroller.util.IPv6Net;
30import net.onrc.onos.ofcontroller.util.Port;
31import net.onrc.onos.ofcontroller.util.Switch;
32import net.onrc.onos.ofcontroller.util.SwitchPort;
33
34import com.esotericsoftware.kryo2.Kryo;
Pavlin Radoslavovaaace7f2013-10-25 19:42:00 -070035
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -070036/**
37 * Class factory for allocating Kryo instances for
38 * serialization/deserialization of classes.
39 */
40public class KryoFactory {
41 private ArrayList<Kryo> kryoList = new ArrayList<Kryo>();
42
43 /**
44 * Default constructor.
45 */
46 public KryoFactory() {
47 Kryo kryo;
48 // Preallocate
49 for (int i = 0; i < 100; i++) {
50 kryo = newKryoImpl();
51 kryoList.add(kryo);
52 }
53 }
54
55 /**
56 * Create and initialize a new Kryo object.
57 *
58 * @return the created Kryo object.
59 */
60 public Kryo newKryo() {
61 return newDeleteKryo(null);
62 }
63
64 /**
65 * Delete an existing Kryo object.
66 *
67 * @param deleteKryo the object to delete.
68 */
69 public void deleteKryo(Kryo deleteKryo) {
70 newDeleteKryo(deleteKryo);
71 }
72
73 /**
74 * Create or delete a Kryo object.
75 *
76 * @param deleteKryo if null, then allocate and return a new object,
77 * otherwise delete the provided object.
78 * @return a new Kryo object if needed, otherwise null.
79 */
80 synchronized private Kryo newDeleteKryo(Kryo deleteKryo) {
81 if (deleteKryo != null) {
82 // Delete an entry by moving it back to the buffer
83 kryoList.add(deleteKryo);
84 return null;
85 } else {
86 Kryo kryo = null;
87 if (kryoList.isEmpty()) {
88 // Preallocate
89 for (int i = 0; i < 100; i++) {
90 kryo = newKryoImpl();
91 kryoList.add(kryo);
92 }
93 }
94
95 kryo = kryoList.remove(kryoList.size() - 1);
96 return kryo;
97 }
98 }
99
100 /**
101 * Create and initialize a new Kryo object.
102 *
103 * @return the created Kryo object.
104 */
105 private Kryo newKryoImpl() {
106 Kryo kryo = new Kryo();
107 kryo.setRegistrationRequired(true);
108 // kryo.setReferences(false);
109 //
110 kryo.register(ArrayList.class);
Pavlin Radoslavovaaace7f2013-10-25 19:42:00 -0700111
112 // FlowPath and related classes
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700113 kryo.register(CallerId.class);
114 kryo.register(DataPath.class);
115 kryo.register(DataPathEndpoints.class);
116 kryo.register(Dpid.class);
117 kryo.register(FlowEntryAction.class);
118 kryo.register(FlowEntryAction.ActionEnqueue.class);
119 kryo.register(FlowEntryAction.ActionOutput.class);
120 kryo.register(FlowEntryAction.ActionSetEthernetAddr.class);
121 kryo.register(FlowEntryAction.ActionSetIpToS.class);
122 kryo.register(FlowEntryAction.ActionSetIPv4Addr.class);
123 kryo.register(FlowEntryAction.ActionSetTcpUdpPort.class);
124 kryo.register(FlowEntryAction.ActionSetVlanId.class);
125 kryo.register(FlowEntryAction.ActionSetVlanPriority.class);
126 kryo.register(FlowEntryAction.ActionStripVlan.class);
127 kryo.register(FlowEntryAction.ActionValues.class);
128 kryo.register(FlowEntryActions.class);
129 kryo.register(FlowEntryErrorState.class);
130 kryo.register(FlowEntryId.class);
131 kryo.register(FlowEntry.class);
132 kryo.register(FlowEntryMatch.class);
133 kryo.register(FlowEntryMatch.Field.class);
134 kryo.register(FlowEntrySwitchState.class);
135 kryo.register(FlowEntryUserState.class);
136 kryo.register(FlowId.class);
137 kryo.register(FlowPath.class);
138 kryo.register(FlowPathFlags.class);
Pavlin Radoslavovd28cf7c2013-10-26 11:27:43 -0700139 kryo.register(FlowPathType.class);
Pavlin Radoslavov7d4a40e2013-10-27 23:39:40 -0700140 kryo.register(FlowPathUserState.class);
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700141 kryo.register(IPv4.class);
142 kryo.register(IPv4Net.class);
143 kryo.register(IPv6.class);
144 kryo.register(IPv6Net.class);
145 kryo.register(byte[].class);
146 kryo.register(MACAddress.class);
147 kryo.register(Port.class);
148 kryo.register(Switch.class);
149 kryo.register(SwitchPort.class);
150
Pavlin Radoslavovaaace7f2013-10-25 19:42:00 -0700151 // Topology-related classes
152 kryo.register(TopologyElement.class);
Pavlin Radoslavov2a091bf2013-10-25 21:37:12 -0700153 kryo.register(TopologyElement.Type.class);
154 kryo.register(TreeMap.class);
Jonathan Hartd3003252013-11-15 09:44:46 -0800155
156 //ARP message
157 kryo.register(ArpMessage.class);
Pavlin Radoslavovaaace7f2013-10-25 19:42:00 -0700158
Pavlin Radoslavove0a643e2013-10-24 13:33:39 -0700159 return kryo;
160 }
161}