Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 1 | /* |
Brian O'Connor | 5ab426f | 2016-04-09 01:19:45 -0700 | [diff] [blame] | 2 | * Copyright 2015-present Open Networking Laboratory |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 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 | */ |
Brian O'Connor | abafb50 | 2014-12-02 22:26:20 -0800 | [diff] [blame] | 16 | package org.onosproject.codec.impl; |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 17 | |
Jian Li | 7231515 | 2015-12-10 17:20:43 -0800 | [diff] [blame] | 18 | import com.codahale.metrics.Metric; |
Thomas Vachuska | de563cf | 2015-04-01 00:28:50 -0700 | [diff] [blame] | 19 | import com.google.common.collect.ImmutableSet; |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 20 | import org.apache.felix.scr.annotations.Activate; |
| 21 | import org.apache.felix.scr.annotations.Component; |
| 22 | import org.apache.felix.scr.annotations.Deactivate; |
| 23 | import org.apache.felix.scr.annotations.Service; |
Ray Milkey | c95bb9d | 2015-01-06 10:28:24 -0800 | [diff] [blame] | 24 | import org.onlab.packet.Ethernet; |
Thomas Vachuska | de563cf | 2015-04-01 00:28:50 -0700 | [diff] [blame] | 25 | import org.onosproject.cluster.ControllerNode; |
Jian Li | b68a2b0 | 2016-05-02 11:23:32 -0700 | [diff] [blame] | 26 | import org.onosproject.cluster.RoleInfo; |
Brian O'Connor | abafb50 | 2014-12-02 22:26:20 -0800 | [diff] [blame] | 27 | import org.onosproject.codec.CodecService; |
| 28 | import org.onosproject.codec.JsonCodec; |
Thomas Vachuska | 02aeb03 | 2015-01-06 22:36:30 -0800 | [diff] [blame] | 29 | import org.onosproject.core.Application; |
Jian Li | e1c1c8d | 2016-05-09 16:24:40 -0700 | [diff] [blame] | 30 | import org.onosproject.core.ApplicationId; |
Sangsik Yoon | f0b3ad8 | 2016-08-19 18:47:59 +0900 | [diff] [blame] | 31 | import org.onosproject.incubator.net.dpi.DpiStatInfo; |
| 32 | import org.onosproject.incubator.net.dpi.DpiStatInfoCodec; |
| 33 | import org.onosproject.incubator.net.dpi.DpiStatistics; |
| 34 | import org.onosproject.incubator.net.dpi.DpiStatisticsCodec; |
| 35 | import org.onosproject.incubator.net.dpi.FlowStatInfo; |
| 36 | import org.onosproject.incubator.net.dpi.FlowStatInfoCodec; |
| 37 | import org.onosproject.incubator.net.dpi.ProtocolStatInfo; |
| 38 | import org.onosproject.incubator.net.dpi.ProtocolStatInfoCodec; |
| 39 | import org.onosproject.incubator.net.dpi.TrafficStatInfo; |
| 40 | import org.onosproject.incubator.net.dpi.TrafficStatInfoCodec; |
Claudine Chiu | fb8b816 | 2016-04-01 23:50:51 +0000 | [diff] [blame] | 41 | import org.onosproject.incubator.net.virtual.TenantId; |
| 42 | import org.onosproject.incubator.net.virtual.VirtualDevice; |
Claudine Chiu | 25f07be | 2016-06-27 16:21:21 +0000 | [diff] [blame] | 43 | import org.onosproject.incubator.net.virtual.VirtualHost; |
Claudine Chiu | f6bf8d5 | 2016-04-08 01:31:54 +0000 | [diff] [blame] | 44 | import org.onosproject.incubator.net.virtual.VirtualLink; |
Claudine Chiu | fb8b816 | 2016-04-01 23:50:51 +0000 | [diff] [blame] | 45 | import org.onosproject.incubator.net.virtual.VirtualNetwork; |
| 46 | import org.onosproject.incubator.net.virtual.VirtualPort; |
Jian Li | b68a2b0 | 2016-05-02 11:23:32 -0700 | [diff] [blame] | 47 | import org.onosproject.mastership.MastershipTerm; |
Brian O'Connor | abafb50 | 2014-12-02 22:26:20 -0800 | [diff] [blame] | 48 | import org.onosproject.net.Annotations; |
| 49 | import org.onosproject.net.ConnectPoint; |
| 50 | import org.onosproject.net.Device; |
Ray Milkey | 1f95bd3 | 2014-12-10 11:11:00 -0800 | [diff] [blame] | 51 | import org.onosproject.net.Host; |
| 52 | import org.onosproject.net.HostLocation; |
Brian O'Connor | abafb50 | 2014-12-02 22:26:20 -0800 | [diff] [blame] | 53 | import org.onosproject.net.Link; |
Jian Li | b68a2b0 | 2016-05-02 11:23:32 -0700 | [diff] [blame] | 54 | import org.onosproject.net.MastershipRole; |
Ray Milkey | 19ffea3 | 2015-01-28 10:03:06 -0800 | [diff] [blame] | 55 | import org.onosproject.net.Path; |
Jayasree Ghosh | d3ff540 | 2016-08-17 18:41:19 +0530 | [diff] [blame] | 56 | import org.onosproject.net.DisjointPath; |
Yuta HIGUCHI | 776f074 | 2016-11-03 15:51:14 -0700 | [diff] [blame] | 57 | import org.onosproject.net.FilteredConnectPoint; |
Brian O'Connor | abafb50 | 2014-12-02 22:26:20 -0800 | [diff] [blame] | 58 | import org.onosproject.net.Port; |
Jian Li | ecb3c0f | 2015-12-15 10:07:49 -0800 | [diff] [blame] | 59 | import org.onosproject.net.device.PortStatistics; |
Ray Milkey | 39616f3 | 2015-05-14 15:43:00 -0700 | [diff] [blame] | 60 | import org.onosproject.net.driver.Driver; |
Ray Milkey | 4f5de00 | 2014-12-17 19:26:11 -0800 | [diff] [blame] | 61 | import org.onosproject.net.flow.FlowEntry; |
Ray Milkey | d43fe45 | 2015-05-29 09:35:12 -0700 | [diff] [blame] | 62 | import org.onosproject.net.flow.FlowRule; |
Srikanth Vavilapalli | 95810f5 | 2015-09-14 15:49:56 -0700 | [diff] [blame] | 63 | import org.onosproject.net.flow.TableStatisticsEntry; |
Ray Milkey | 4f5de00 | 2014-12-17 19:26:11 -0800 | [diff] [blame] | 64 | import org.onosproject.net.flow.TrafficSelector; |
| 65 | import org.onosproject.net.flow.TrafficTreatment; |
Ray Milkey | c95bb9d | 2015-01-06 10:28:24 -0800 | [diff] [blame] | 66 | import org.onosproject.net.flow.criteria.Criterion; |
| 67 | import org.onosproject.net.flow.instructions.Instruction; |
Jian Li | 8bcef8b | 2016-01-06 11:35:53 -0800 | [diff] [blame] | 68 | import org.onosproject.net.flowobjective.FilteringObjective; |
| 69 | import org.onosproject.net.flowobjective.ForwardingObjective; |
| 70 | import org.onosproject.net.flowobjective.NextObjective; |
Ray Milkey | 39616f3 | 2015-05-14 15:43:00 -0700 | [diff] [blame] | 71 | import org.onosproject.net.group.Group; |
| 72 | import org.onosproject.net.group.GroupBucket; |
Ray Milkey | c95bb9d | 2015-01-06 10:28:24 -0800 | [diff] [blame] | 73 | import org.onosproject.net.intent.ConnectivityIntent; |
Ray Milkey | b9a8a18 | 2015-01-20 14:15:35 -0800 | [diff] [blame] | 74 | import org.onosproject.net.intent.Constraint; |
Ray Milkey | c95bb9d | 2015-01-06 10:28:24 -0800 | [diff] [blame] | 75 | import org.onosproject.net.intent.HostToHostIntent; |
Ray Milkey | 2b21714 | 2014-12-15 09:24:24 -0800 | [diff] [blame] | 76 | import org.onosproject.net.intent.Intent; |
Ray Milkey | c95bb9d | 2015-01-06 10:28:24 -0800 | [diff] [blame] | 77 | import org.onosproject.net.intent.PointToPointIntent; |
Chiara Contoli | a8f69ff | 2016-07-28 01:06:07 +0900 | [diff] [blame] | 78 | import org.onosproject.net.intent.SinglePointToMultiPointIntent; |
Brian Stanke | b9170d9 | 2016-02-19 14:18:42 -0500 | [diff] [blame] | 79 | import org.onosproject.net.key.DeviceKey; |
Jonathan Hart | 07eb041 | 2016-02-08 16:42:29 -0800 | [diff] [blame] | 80 | import org.onosproject.net.mcast.McastRoute; |
Jian Li | 5c41123 | 2015-12-16 15:29:16 -0800 | [diff] [blame] | 81 | import org.onosproject.net.meter.Band; |
| 82 | import org.onosproject.net.meter.Meter; |
Jian Li | 9567896 | 2016-01-26 17:17:52 -0800 | [diff] [blame] | 83 | import org.onosproject.net.meter.MeterRequest; |
Jian Li | b68b9a8 | 2016-02-23 10:25:54 +0900 | [diff] [blame] | 84 | import org.onosproject.net.region.Region; |
Ray Milkey | b9af946 | 2015-07-17 11:12:09 -0700 | [diff] [blame] | 85 | import org.onosproject.net.statistic.Load; |
Ray Milkey | 82e5031 | 2015-01-22 17:01:42 -0800 | [diff] [blame] | 86 | import org.onosproject.net.topology.Topology; |
| 87 | import org.onosproject.net.topology.TopologyCluster; |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 88 | import org.slf4j.Logger; |
| 89 | import org.slf4j.LoggerFactory; |
| 90 | |
Thomas Vachuska | de563cf | 2015-04-01 00:28:50 -0700 | [diff] [blame] | 91 | import java.util.Map; |
| 92 | import java.util.Set; |
| 93 | import java.util.concurrent.ConcurrentHashMap; |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 94 | |
Heedo Kang | 4a47a30 | 2016-02-29 17:40:23 +0900 | [diff] [blame] | 95 | import static org.onosproject.security.AppGuard.checkPermission; |
| 96 | import static org.onosproject.security.AppPermission.Type.*; |
| 97 | |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 98 | /** |
| 99 | * Implementation of the JSON codec brokering service. |
| 100 | */ |
| 101 | @Component(immediate = true) |
| 102 | @Service |
| 103 | public class CodecManager implements CodecService { |
| 104 | |
| 105 | private static Logger log = LoggerFactory.getLogger(CodecManager.class); |
| 106 | |
| 107 | private final Map<Class<?>, JsonCodec> codecs = new ConcurrentHashMap<>(); |
| 108 | |
| 109 | @Activate |
| 110 | public void activate() { |
| 111 | codecs.clear(); |
Thomas Vachuska | 02aeb03 | 2015-01-06 22:36:30 -0800 | [diff] [blame] | 112 | registerCodec(Application.class, new ApplicationCodec()); |
Jian Li | e1c1c8d | 2016-05-09 16:24:40 -0700 | [diff] [blame] | 113 | registerCodec(ApplicationId.class, new ApplicationIdCodec()); |
Thomas Vachuska | de563cf | 2015-04-01 00:28:50 -0700 | [diff] [blame] | 114 | registerCodec(ControllerNode.class, new ControllerNodeCodec()); |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 115 | registerCodec(Annotations.class, new AnnotationsCodec()); |
| 116 | registerCodec(Device.class, new DeviceCodec()); |
| 117 | registerCodec(Port.class, new PortCodec()); |
| 118 | registerCodec(ConnectPoint.class, new ConnectPointCodec()); |
| 119 | registerCodec(Link.class, new LinkCodec()); |
Ray Milkey | 1f95bd3 | 2014-12-10 11:11:00 -0800 | [diff] [blame] | 120 | registerCodec(Host.class, new HostCodec()); |
| 121 | registerCodec(HostLocation.class, new HostLocationCodec()); |
Ray Milkey | c95bb9d | 2015-01-06 10:28:24 -0800 | [diff] [blame] | 122 | registerCodec(HostToHostIntent.class, new HostToHostIntentCodec()); |
| 123 | registerCodec(PointToPointIntent.class, new PointToPointIntentCodec()); |
Chiara Contoli | a8f69ff | 2016-07-28 01:06:07 +0900 | [diff] [blame] | 124 | registerCodec(SinglePointToMultiPointIntent.class, new SinglePointToMultiPointIntentCodec()); |
Ray Milkey | 2b21714 | 2014-12-15 09:24:24 -0800 | [diff] [blame] | 125 | registerCodec(Intent.class, new IntentCodec()); |
Ray Milkey | c95bb9d | 2015-01-06 10:28:24 -0800 | [diff] [blame] | 126 | registerCodec(ConnectivityIntent.class, new ConnectivityIntentCodec()); |
Ray Milkey | 4f5de00 | 2014-12-17 19:26:11 -0800 | [diff] [blame] | 127 | registerCodec(FlowEntry.class, new FlowEntryCodec()); |
Ray Milkey | d43fe45 | 2015-05-29 09:35:12 -0700 | [diff] [blame] | 128 | registerCodec(FlowRule.class, new FlowRuleCodec()); |
Ray Milkey | 4f5de00 | 2014-12-17 19:26:11 -0800 | [diff] [blame] | 129 | registerCodec(TrafficTreatment.class, new TrafficTreatmentCodec()); |
| 130 | registerCodec(TrafficSelector.class, new TrafficSelectorCodec()); |
Ray Milkey | c95bb9d | 2015-01-06 10:28:24 -0800 | [diff] [blame] | 131 | registerCodec(Instruction.class, new InstructionCodec()); |
| 132 | registerCodec(Criterion.class, new CriterionCodec()); |
| 133 | registerCodec(Ethernet.class, new EthernetCodec()); |
Ray Milkey | b9a8a18 | 2015-01-20 14:15:35 -0800 | [diff] [blame] | 134 | registerCodec(Constraint.class, new ConstraintCodec()); |
Ray Milkey | 82e5031 | 2015-01-22 17:01:42 -0800 | [diff] [blame] | 135 | registerCodec(Topology.class, new TopologyCodec()); |
| 136 | registerCodec(TopologyCluster.class, new TopologyClusterCodec()); |
Ray Milkey | 19ffea3 | 2015-01-28 10:03:06 -0800 | [diff] [blame] | 137 | registerCodec(Path.class, new PathCodec()); |
Jayasree Ghosh | d3ff540 | 2016-08-17 18:41:19 +0530 | [diff] [blame] | 138 | registerCodec(DisjointPath.class, new DisjointPathCodec()); |
Ray Milkey | 39616f3 | 2015-05-14 15:43:00 -0700 | [diff] [blame] | 139 | registerCodec(Group.class, new GroupCodec()); |
| 140 | registerCodec(Driver.class, new DriverCodec()); |
| 141 | registerCodec(GroupBucket.class, new GroupBucketCodec()); |
Ray Milkey | b9af946 | 2015-07-17 11:12:09 -0700 | [diff] [blame] | 142 | registerCodec(Load.class, new LoadCodec()); |
Jian Li | 9567896 | 2016-01-26 17:17:52 -0800 | [diff] [blame] | 143 | registerCodec(MeterRequest.class, new MeterRequestCodec()); |
Jian Li | 5c41123 | 2015-12-16 15:29:16 -0800 | [diff] [blame] | 144 | registerCodec(Meter.class, new MeterCodec()); |
| 145 | registerCodec(Band.class, new MeterBandCodec()); |
Srikanth Vavilapalli | 95810f5 | 2015-09-14 15:49:56 -0700 | [diff] [blame] | 146 | registerCodec(TableStatisticsEntry.class, new TableStatisticsEntryCodec()); |
Srikanth Vavilapalli | d120f5c | 2015-11-24 14:15:01 -0800 | [diff] [blame] | 147 | registerCodec(PortStatistics.class, new PortStatisticsCodec()); |
Jian Li | 7231515 | 2015-12-10 17:20:43 -0800 | [diff] [blame] | 148 | registerCodec(Metric.class, new MetricCodec()); |
Jian Li | 8bcef8b | 2016-01-06 11:35:53 -0800 | [diff] [blame] | 149 | registerCodec(FilteringObjective.class, new FilteringObjectiveCodec()); |
| 150 | registerCodec(ForwardingObjective.class, new ForwardingObjectiveCodec()); |
| 151 | registerCodec(NextObjective.class, new NextObjectiveCodec()); |
Jonathan Hart | 07eb041 | 2016-02-08 16:42:29 -0800 | [diff] [blame] | 152 | registerCodec(McastRoute.class, new McastRouteCodec()); |
Brian Stanke | b9170d9 | 2016-02-19 14:18:42 -0500 | [diff] [blame] | 153 | registerCodec(DeviceKey.class, new DeviceKeyCodec()); |
Jian Li | b68b9a8 | 2016-02-23 10:25:54 +0900 | [diff] [blame] | 154 | registerCodec(Region.class, new RegionCodec()); |
Claudine Chiu | fb8b816 | 2016-04-01 23:50:51 +0000 | [diff] [blame] | 155 | registerCodec(TenantId.class, new TenantIdCodec()); |
| 156 | registerCodec(VirtualNetwork.class, new VirtualNetworkCodec()); |
| 157 | registerCodec(VirtualDevice.class, new VirtualDeviceCodec()); |
| 158 | registerCodec(VirtualPort.class, new VirtualPortCodec()); |
Claudine Chiu | f6bf8d5 | 2016-04-08 01:31:54 +0000 | [diff] [blame] | 159 | registerCodec(VirtualLink.class, new VirtualLinkCodec()); |
Claudine Chiu | 25f07be | 2016-06-27 16:21:21 +0000 | [diff] [blame] | 160 | registerCodec(VirtualHost.class, new VirtualHostCodec()); |
Jian Li | b68a2b0 | 2016-05-02 11:23:32 -0700 | [diff] [blame] | 161 | registerCodec(MastershipTerm.class, new MastershipTermCodec()); |
| 162 | registerCodec(MastershipRole.class, new MastershipRoleCodec()); |
| 163 | registerCodec(RoleInfo.class, new RoleInfoCodec()); |
Sangsik Yoon | f0b3ad8 | 2016-08-19 18:47:59 +0900 | [diff] [blame] | 164 | registerCodec(DpiStatistics.class, new DpiStatisticsCodec()); |
| 165 | registerCodec(DpiStatInfo.class, new DpiStatInfoCodec()); |
| 166 | registerCodec(TrafficStatInfo.class, new TrafficStatInfoCodec()); |
| 167 | registerCodec(ProtocolStatInfo.class, new ProtocolStatInfoCodec()); |
| 168 | registerCodec(FlowStatInfo.class, new FlowStatInfoCodec()); |
Yuta HIGUCHI | 776f074 | 2016-11-03 15:51:14 -0700 | [diff] [blame] | 169 | registerCodec(FilteredConnectPoint.class, new FilteredConnectPointCodec()); |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 170 | log.info("Started"); |
| 171 | } |
| 172 | |
| 173 | @Deactivate |
Ray Milkey | 1f95bd3 | 2014-12-10 11:11:00 -0800 | [diff] [blame] | 174 | public void deactivate() { |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 175 | codecs.clear(); |
| 176 | log.info("Stopped"); |
| 177 | } |
| 178 | |
| 179 | @Override |
| 180 | public Set<Class<?>> getCodecs() { |
Heedo Kang | 4a47a30 | 2016-02-29 17:40:23 +0900 | [diff] [blame] | 181 | checkPermission(CODEC_READ); |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 182 | return ImmutableSet.copyOf(codecs.keySet()); |
| 183 | } |
| 184 | |
| 185 | @Override |
| 186 | @SuppressWarnings("unchecked") |
| 187 | public <T> JsonCodec<T> getCodec(Class<T> entityClass) { |
Heedo Kang | 4a47a30 | 2016-02-29 17:40:23 +0900 | [diff] [blame] | 188 | checkPermission(CODEC_READ); |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 189 | return codecs.get(entityClass); |
| 190 | } |
| 191 | |
| 192 | @Override |
| 193 | public <T> void registerCodec(Class<T> entityClass, JsonCodec<T> codec) { |
Heedo Kang | 4a47a30 | 2016-02-29 17:40:23 +0900 | [diff] [blame] | 194 | checkPermission(CODEC_WRITE); |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 195 | codecs.putIfAbsent(entityClass, codec); |
| 196 | } |
| 197 | |
| 198 | @Override |
| 199 | public void unregisterCodec(Class<?> entityClass) { |
Heedo Kang | 4a47a30 | 2016-02-29 17:40:23 +0900 | [diff] [blame] | 200 | checkPermission(CODEC_WRITE); |
Thomas Vachuska | ca60f2b | 2014-11-06 01:34:28 -0800 | [diff] [blame] | 201 | codecs.remove(entityClass); |
| 202 | } |
| 203 | |
| 204 | } |