blob: 7d9dd283f827c8d1fc9e3d984e223418cb457380 [file] [log] [blame]
Carmelo Cascone07d72712017-07-14 15:57:47 -04001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2017-present Open Networking Foundation
Carmelo Cascone07d72712017-07-14 15:57:47 -04003 *
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 */
16
17package org.onosproject.net.pi.model;
18
19import com.google.common.collect.ImmutableMap;
20import org.onosproject.net.driver.Behaviour;
21
Carmelo Cascone31d3e442017-07-18 16:58:51 -040022import java.io.IOException;
Carmelo Cascone07d72712017-07-14 15:57:47 -040023import java.io.InputStream;
Carmelo Cascone31d3e442017-07-18 16:58:51 -040024import java.net.URL;
Carmelo Cascone07d72712017-07-14 15:57:47 -040025import java.util.Collection;
26import java.util.Map;
27import java.util.Optional;
28
Carmelo Cascone31d3e442017-07-18 16:58:51 -040029import static com.google.common.base.Preconditions.checkArgument;
Carmelo Cascone07d72712017-07-14 15:57:47 -040030import static com.google.common.base.Preconditions.checkNotNull;
Carmelo Cascone31d3e442017-07-18 16:58:51 -040031import static java.lang.String.format;
Carmelo Cascone07d72712017-07-14 15:57:47 -040032
33/**
34 * Default pipeconf implementation.
35 */
36public final class DefaultPiPipeconf implements PiPipeconf {
37
38 private final PiPipeconfId id;
39 private final PiPipelineModel pipelineModel;
40 private final Map<Class<? extends Behaviour>, Class<? extends Behaviour>> behaviours;
Carmelo Cascone31d3e442017-07-18 16:58:51 -040041 private final Map<ExtensionType, URL> extensions;
Carmelo Cascone07d72712017-07-14 15:57:47 -040042
43 private DefaultPiPipeconf(PiPipeconfId id, PiPipelineModel pipelineModel,
44 Map<Class<? extends Behaviour>, Class<? extends Behaviour>> behaviours,
Carmelo Cascone31d3e442017-07-18 16:58:51 -040045 Map<ExtensionType, URL> extensions) {
Carmelo Cascone07d72712017-07-14 15:57:47 -040046 this.id = id;
47 this.pipelineModel = pipelineModel;
48 this.behaviours = behaviours;
49 this.extensions = extensions;
50 }
51
52 @Override
53 public PiPipeconfId id() {
54 return id;
55 }
56
57 @Override
58 public PiPipelineModel pipelineModel() {
59 return pipelineModel;
60 }
61
62 @Override
63 public Collection<Class<? extends Behaviour>> behaviours() {
64 return behaviours.keySet();
65 }
66
67 @Override
68 public Optional<Class<? extends Behaviour>> implementation(Class<? extends Behaviour> behaviour) {
69 return Optional.ofNullable(behaviours.get(behaviour));
70 }
71
72 @Override
73 public boolean hasBehaviour(Class<? extends Behaviour> behaviourClass) {
74 return behaviours.containsKey(behaviourClass);
75 }
76
77 @Override
78 public Optional<InputStream> extension(ExtensionType type) {
Carmelo Cascone31d3e442017-07-18 16:58:51 -040079 if (extensions.containsKey(type)) {
80 try {
81 return Optional.of(extensions.get(type).openStream());
82 } catch (IOException e) {
Ray Milkey986a47a2018-01-25 11:38:51 -080083 throw new IllegalStateException(e);
Carmelo Cascone31d3e442017-07-18 16:58:51 -040084 }
85 } else {
86 return Optional.empty();
87 }
Carmelo Cascone07d72712017-07-14 15:57:47 -040088 }
89
90 /**
91 * Returns a new pipeconf builder.
92 *
93 * @return pipeconf builder
94 */
95 public static Builder builder() {
96 return new Builder();
97 }
98
99 /**
100 * Builder of pipeconf implementations.
101 */
102 public static class Builder {
103
104 private PiPipeconfId id;
105 private PiPipelineModel pipelineModel;
106 private ImmutableMap.Builder<Class<? extends Behaviour>, Class<? extends Behaviour>> behaviourMapBuilder
107 = ImmutableMap.builder();
Carmelo Cascone31d3e442017-07-18 16:58:51 -0400108 private ImmutableMap.Builder<ExtensionType, URL> extensionMapBuilder = ImmutableMap.builder();
Carmelo Cascone07d72712017-07-14 15:57:47 -0400109
110 /**
111 * Sets the identifier of this pipeconf.
112 *
113 * @param id pipeconf identifier
114 * @return this
115 */
116 public Builder withId(PiPipeconfId id) {
117 this.id = id;
118 return this;
119 }
120
121 /**
122 * Sets the pipeline model of this pipeconf.
123 *
124 * @param model pipeline model
125 * @return this
126 */
127 public Builder withPipelineModel(PiPipelineModel model) {
128 this.pipelineModel = model;
129 return this;
130 }
131
132 /**
133 * Adds a behaviour to this pipeconf.
134 *
135 * @param clazz behavior interface class
136 * @param implementation behavior implementation class
137 * @return this
138 */
139 public Builder addBehaviour(Class<? extends Behaviour> clazz, Class<? extends Behaviour> implementation) {
140 checkNotNull(clazz);
141 checkNotNull(implementation);
142 behaviourMapBuilder.put(clazz, implementation);
143 return this;
144 }
145
146 /**
147 * Adds an extension to this pipeconf.
148 *
Carmelo Cascone31d3e442017-07-18 16:58:51 -0400149 * @param type extension type
150 * @param url url pointing at the extension file
Carmelo Cascone07d72712017-07-14 15:57:47 -0400151 * @return this
152 */
Carmelo Cascone31d3e442017-07-18 16:58:51 -0400153 public Builder addExtension(ExtensionType type, URL url) {
Carmelo Cascone07d72712017-07-14 15:57:47 -0400154 checkNotNull(type);
Carmelo Cascone31d3e442017-07-18 16:58:51 -0400155 checkNotNull(url);
156 checkArgument(checkUrl(url), format("Extension url %s seems to be empty/non existent", url.toString()));
157 extensionMapBuilder.put(type, url);
Carmelo Cascone07d72712017-07-14 15:57:47 -0400158 return this;
159 }
160
Carmelo Cascone31d3e442017-07-18 16:58:51 -0400161 private boolean checkUrl(URL url) {
162 try {
163 int byteCount = url.openStream().available();
164 return byteCount > 0;
165 } catch (IOException e) {
166 return false;
167 }
168 }
169
Carmelo Cascone07d72712017-07-14 15:57:47 -0400170 /**
171 * Creates a new pipeconf.
172 *
173 * @return pipeconf instance
174 */
175 public PiPipeconf build() {
176 checkNotNull(id);
177 checkNotNull(pipelineModel);
178 return new DefaultPiPipeconf(id, pipelineModel, behaviourMapBuilder.build(), extensionMapBuilder.build());
179 }
180
181 }
182}