Sho SHIMIZU
Committed by Gerrit Code Review

Define valueAs() to get the enclosed value and remove volume()

volume() is replaced by valueAs()

Change-Id: I3dbcbd6a0b8fcd28f0064272fe1fa6d7259e0a87
...@@ -115,7 +115,7 @@ public class AllocationsCommand extends AbstractShellCommand { ...@@ -115,7 +115,7 @@ public class AllocationsCommand extends AbstractShellCommand {
115 115
116 for (ResourceAllocation a : allocations) { 116 for (ResourceAllocation a : allocations) {
117 print("%s%s allocated by %s", Strings.repeat(" ", level + 1), 117 print("%s%s allocated by %s", Strings.repeat(" ", level + 1),
118 - a.resource().last(), asVerboseString(a.consumer())); 118 + a.resource().valueAs(Object.class).orElse(""), asVerboseString(a.consumer()));
119 } 119 }
120 } 120 }
121 } 121 }
......
...@@ -128,7 +128,7 @@ public class ResourcesCommand extends AbstractShellCommand { ...@@ -128,7 +128,7 @@ public class ResourcesCommand extends AbstractShellCommand {
128 } else { 128 } else {
129 String resourceName = resource.last().getClass().getSimpleName(); 129 String resourceName = resource.last().getClass().getSimpleName();
130 130
131 - String toString = String.valueOf(resource.last()); 131 + String toString = String.valueOf(resource.valueAs(Object.class).orElse(""));
132 if (toString.startsWith(resourceName)) { 132 if (toString.startsWith(resourceName)) {
133 print("%s%s", Strings.repeat(" ", level), 133 print("%s%s", Strings.repeat(" ", level),
134 toString); 134 toString);
...@@ -178,14 +178,13 @@ public class ResourcesCommand extends AbstractShellCommand { ...@@ -178,14 +178,13 @@ public class ResourcesCommand extends AbstractShellCommand {
178 178
179 // aggregate into RangeSet 179 // aggregate into RangeSet
180 e.getValue().stream() 180 e.getValue().stream()
181 - .map(Resource::last)
182 .map(res -> { 181 .map(res -> {
183 - if (res instanceof VlanId) { 182 + if (res.isTypeOf(VlanId.class)) {
184 - return (long) ((VlanId) res).toShort(); 183 + return (long) res.valueAs(VlanId.class).get().toShort();
185 - } else if (res instanceof MplsLabel) { 184 + } else if (res.isTypeOf(MplsLabel.class)) {
186 - return (long) ((MplsLabel) res).toInt(); 185 + return (long) res.valueAs(MplsLabel.class).get().toInt();
187 - } else if (res instanceof TributarySlot) { 186 + } else if (res.isTypeOf(TributarySlot.class)) {
188 - return ((TributarySlot) res).index(); 187 + return res.valueAs(TributarySlot.class).get().index();
189 } 188 }
190 // TODO support Lambda (OchSignal types) 189 // TODO support Lambda (OchSignal types)
191 return 0L; 190 return 0L;
......
...@@ -57,24 +57,10 @@ public final class ContinuousResource implements Resource { ...@@ -57,24 +57,10 @@ public final class ContinuousResource implements Resource {
57 } 57 }
58 58
59 /** 59 /**
60 - * The user of this methods must receive the return value as Double or double.
61 - * Otherwise, this methods throws an exception.
62 - *
63 - * @param <T> type of the return value
64 - * @return the volume of this resource
65 - */
66 - @SuppressWarnings("unchecked")
67 - @Override
68 - public <T> T volume() {
69 - return (T) Double.valueOf(value);
70 - }
71 -
72 - /**
73 * Returns the value of the resource amount. 60 * Returns the value of the resource amount.
74 * 61 *
75 * @return the value of the resource amount 62 * @return the value of the resource amount
76 */ 63 */
77 - // FIXME: overlapping a purpose with volume()
78 public double value() { 64 public double value() {
79 return value; 65 return value;
80 } 66 }
...@@ -93,6 +79,24 @@ public final class ContinuousResource implements Resource { ...@@ -93,6 +79,24 @@ public final class ContinuousResource implements Resource {
93 return foundInAncestor || foundInLeaf; 79 return foundInAncestor || foundInLeaf;
94 } 80 }
95 81
82 + /**
83 + * {@inheritDoc}
84 + *
85 + * A user must specify Double.class or double.class to avoid an empty value.
86 + */
87 + @Override
88 + public <T> Optional<T> valueAs(Class<T> type) {
89 + checkNotNull(type);
90 +
91 + if (type == Object.class || type == double.class || type == Double.class) {
92 + @SuppressWarnings("unchecked")
93 + T value = (T) Double.valueOf(this.value);
94 + return Optional.of(value);
95 + }
96 +
97 + return Optional.empty();
98 + }
99 +
96 @Override 100 @Override
97 public Object last() { 101 public Object last() {
98 if (id.components().isEmpty()) { 102 if (id.components().isEmpty()) {
...@@ -138,7 +142,7 @@ public final class ContinuousResource implements Resource { ...@@ -138,7 +142,7 @@ public final class ContinuousResource implements Resource {
138 public String toString() { 142 public String toString() {
139 return MoreObjects.toStringHelper(this) 143 return MoreObjects.toStringHelper(this)
140 .add("id", id) 144 .add("id", id)
141 - .add("volume", value) 145 + .add("value", value)
142 .toString(); 146 .toString();
143 } 147 }
144 } 148 }
......
...@@ -56,20 +56,6 @@ public final class DiscreteResource implements Resource { ...@@ -56,20 +56,6 @@ public final class DiscreteResource implements Resource {
56 return type.isAssignableFrom(id.components().get(id.components().size() - 1).getClass()); 56 return type.isAssignableFrom(id.components().get(id.components().size() - 1).getClass());
57 } 57 }
58 58
59 - /**
60 - * The user of this methods must receive the return value as the correct type.
61 - * Otherwise, this methods throws an exception.
62 - *
63 - * @param <T> type of the return value
64 - * @return the volume of this resource
65 - */
66 - @SuppressWarnings("unchecked")
67 - @Override
68 - // TODO: consider receiving Class<T> as an argument. Which approach is convenient?
69 - public <T> T volume() {
70 - return (T) last();
71 - }
72 -
73 @Override 59 @Override
74 public boolean isSubTypeOf(Class<?> ancestor) { 60 public boolean isSubTypeOf(Class<?> ancestor) {
75 checkNotNull(ancestor); 61 checkNotNull(ancestor);
...@@ -82,6 +68,19 @@ public final class DiscreteResource implements Resource { ...@@ -82,6 +68,19 @@ public final class DiscreteResource implements Resource {
82 } 68 }
83 69
84 @Override 70 @Override
71 + public <T> Optional<T> valueAs(Class<T> type) {
72 + checkNotNull(type);
73 +
74 + if (!isTypeOf(type)) {
75 + return Optional.empty();
76 + }
77 +
78 + @SuppressWarnings("unchecked")
79 + T value = (T) id.components().get(id.components().size() - 1);
80 + return Optional.of(value);
81 + }
82 +
83 + @Override
85 public Object last() { 84 public Object last() {
86 if (id.components().isEmpty()) { 85 if (id.components().isEmpty()) {
87 return null; 86 return null;
...@@ -133,7 +132,6 @@ public final class DiscreteResource implements Resource { ...@@ -133,7 +132,6 @@ public final class DiscreteResource implements Resource {
133 public String toString() { 132 public String toString() {
134 return MoreObjects.toStringHelper(this) 133 return MoreObjects.toStringHelper(this)
135 .add("id", id) 134 .add("id", id)
136 - .add("volume", volume())
137 .toString(); 135 .toString();
138 } 136 }
139 } 137 }
......
...@@ -64,13 +64,15 @@ public interface Resource { ...@@ -64,13 +64,15 @@ public interface Resource {
64 boolean isSubTypeOf(Class<?> ancestor); 64 boolean isSubTypeOf(Class<?> ancestor);
65 65
66 /** 66 /**
67 - * Returns the volume of this resource. 67 + * Returns value interpreted as the specified type. If the specified type is
68 + * incompatible with the underlying value, an empty instance is returned.
68 * 69 *
69 - * @param <T> type of return value 70 + * @param type class instance specifying the type of return value
70 - * @return the volume of this resource 71 + * @param <T> type of the return value
72 + * @return the value of this resource as the specified type. If type mismatches,
73 + * returns an empty instance.
71 */ 74 */
72 - // TODO: think about other naming possibilities. amount? quantity? 75 + <T> Optional<T> valueAs(Class<T> type);
73 - <T> T volume();
74 76
75 /** 77 /**
76 * Returns the last component of this instance. 78 * Returns the last component of this instance.
......
...@@ -126,18 +126,25 @@ public class ResourceTest { ...@@ -126,18 +126,25 @@ public class ResourceTest {
126 } 126 }
127 127
128 @Test 128 @Test
129 - public void testVolumeOfDiscrete() { 129 + public void testValueOfDiscrete() {
130 Resource resource = Resources.discrete(D1).resource(); 130 Resource resource = Resources.discrete(D1).resource();
131 131
132 - DeviceId volume = resource.volume(); 132 + Optional<DeviceId> volume = resource.valueAs(DeviceId.class);
133 - assertThat(volume, is(D1)); 133 + assertThat(volume.get(), is(D1));
134 } 134 }
135 135
136 @Test 136 @Test
137 - public void testVolumeOfContinuous() { 137 + public void testValueOfRoot() {
138 + Resource resource = Resource.ROOT;
139 +
140 + assertThat(resource.valueAs(Object.class), is(Optional.empty()));
141 + }
142 +
143 + @Test
144 + public void testValueOfContinuous() {
138 Resource resource = Resources.continuous(D1, P1, Bandwidth.class).resource(BW1.bps()); 145 Resource resource = Resources.continuous(D1, P1, Bandwidth.class).resource(BW1.bps());
139 146
140 - double volume = resource.volume(); 147 + Optional<Double> volume = resource.valueAs(double.class);
141 - assertThat(volume, is(BW1.bps())); 148 + assertThat(volume.get(), is(BW1.bps()));
142 } 149 }
143 } 150 }
......
...@@ -27,6 +27,7 @@ import org.onlab.packet.EthType; ...@@ -27,6 +27,7 @@ import org.onlab.packet.EthType;
27 import org.onlab.packet.Ethernet; 27 import org.onlab.packet.Ethernet;
28 import org.onlab.packet.MplsLabel; 28 import org.onlab.packet.MplsLabel;
29 import org.onlab.packet.VlanId; 29 import org.onlab.packet.VlanId;
30 +import org.onlab.util.Tools;
30 import org.onosproject.core.ApplicationId; 31 import org.onosproject.core.ApplicationId;
31 import org.onosproject.core.CoreService; 32 import org.onosproject.core.CoreService;
32 import org.onosproject.net.ConnectPoint; 33 import org.onosproject.net.ConnectPoint;
...@@ -158,8 +159,7 @@ public class MplsPathIntentCompiler implements IntentCompiler<MplsPathIntent> { ...@@ -158,8 +159,7 @@ public class MplsPathIntentCompiler implements IntentCompiler<MplsPathIntent> {
158 159
159 private Set<MplsLabel> findMplsLabel(ConnectPoint cp) { 160 private Set<MplsLabel> findMplsLabel(ConnectPoint cp) {
160 return resourceService.getAvailableResources(Resources.discrete(cp.deviceId(), cp.port()).id()).stream() 161 return resourceService.getAvailableResources(Resources.discrete(cp.deviceId(), cp.port()).id()).stream()
161 - .filter(x -> x.last() instanceof MplsLabel) 162 + .flatMap(x -> Tools.stream(x.valueAs(MplsLabel.class)))
162 - .map(x -> (MplsLabel) x.last())
163 .collect(Collectors.toSet()); 163 .collect(Collectors.toSet());
164 } 164 }
165 165
......
...@@ -17,7 +17,6 @@ package org.onosproject.net.intent.impl.compiler; ...@@ -17,7 +17,6 @@ package org.onosproject.net.intent.impl.compiler;
17 17
18 import com.google.common.collect.ImmutableList; 18 import com.google.common.collect.ImmutableList;
19 import com.google.common.collect.ImmutableSet; 19 import com.google.common.collect.ImmutableSet;
20 -import com.google.common.collect.Iterables;
21 import com.google.common.collect.Sets; 20 import com.google.common.collect.Sets;
22 import org.apache.felix.scr.annotations.Activate; 21 import org.apache.felix.scr.annotations.Activate;
23 import org.apache.felix.scr.annotations.Component; 22 import org.apache.felix.scr.annotations.Component;
...@@ -25,6 +24,7 @@ import org.apache.felix.scr.annotations.Deactivate; ...@@ -25,6 +24,7 @@ import org.apache.felix.scr.annotations.Deactivate;
25 import org.apache.felix.scr.annotations.Reference; 24 import org.apache.felix.scr.annotations.Reference;
26 import org.apache.felix.scr.annotations.ReferenceCardinality; 25 import org.apache.felix.scr.annotations.ReferenceCardinality;
27 import org.onlab.util.Frequency; 26 import org.onlab.util.Frequency;
27 +import org.onlab.util.Tools;
28 import org.onosproject.net.AnnotationKeys; 28 import org.onosproject.net.AnnotationKeys;
29 import org.onosproject.net.ChannelSpacing; 29 import org.onosproject.net.ChannelSpacing;
30 import org.onosproject.net.ConnectPoint; 30 import org.onosproject.net.ConnectPoint;
...@@ -218,8 +218,8 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical ...@@ -218,8 +218,8 @@ public class OpticalConnectivityIntentCompiler implements IntentCompiler<Optical
218 Resources.discrete(x.dst().deviceId(), x.dst().port()).id() 218 Resources.discrete(x.dst().deviceId(), x.dst().port()).id()
219 )) 219 ))
220 .map(resourceService::getAvailableResources) 220 .map(resourceService::getAvailableResources)
221 - .map(x -> Iterables.filter(x, r -> r.last() instanceof OchSignal)) 221 + .map(x -> x.stream()
222 - .map(x -> Iterables.transform(x, r -> (OchSignal) r.last())) 222 + .flatMap(r -> Tools.stream(r.valueAs(OchSignal.class))).collect(Collectors.toList()))
223 .map(x -> (Set<OchSignal>) ImmutableSet.copyOf(x)) 223 .map(x -> (Set<OchSignal>) ImmutableSet.copyOf(x))
224 .reduce(Sets::intersection) 224 .reduce(Sets::intersection)
225 .orElse(Collections.emptySet()); 225 .orElse(Collections.emptySet());
......
...@@ -23,6 +23,7 @@ import org.apache.felix.scr.annotations.Deactivate; ...@@ -23,6 +23,7 @@ import org.apache.felix.scr.annotations.Deactivate;
23 import org.apache.felix.scr.annotations.Reference; 23 import org.apache.felix.scr.annotations.Reference;
24 import org.apache.felix.scr.annotations.ReferenceCardinality; 24 import org.apache.felix.scr.annotations.ReferenceCardinality;
25 import org.onlab.packet.VlanId; 25 import org.onlab.packet.VlanId;
26 +import org.onlab.util.Tools;
26 import org.onosproject.core.ApplicationId; 27 import org.onosproject.core.ApplicationId;
27 import org.onosproject.core.CoreService; 28 import org.onosproject.core.CoreService;
28 import org.onosproject.net.ConnectPoint; 29 import org.onosproject.net.ConnectPoint;
...@@ -286,8 +287,7 @@ public class PathIntentCompiler implements IntentCompiler<PathIntent> { ...@@ -286,8 +287,7 @@ public class PathIntentCompiler implements IntentCompiler<PathIntent> {
286 287
287 private Set<VlanId> findVlanId(ConnectPoint cp) { 288 private Set<VlanId> findVlanId(ConnectPoint cp) {
288 return resourceService.getAvailableResources(Resources.discrete(cp.deviceId(), cp.port()).id()).stream() 289 return resourceService.getAvailableResources(Resources.discrete(cp.deviceId(), cp.port()).id()).stream()
289 - .filter(x -> x.last() instanceof VlanId) 290 + .flatMap(x -> Tools.stream(x.valueAs(VlanId.class)))
290 - .map(x -> (VlanId) x.last())
291 .collect(Collectors.toSet()); 291 .collect(Collectors.toSet());
292 } 292 }
293 293
......