Skip to content

Commit 8ba2530

Browse files
committed
Updated SettingsPortRange to work on generic Object so that the constructor can coerce on values offered for default value. Fixed failing test trasforming Ruby rage to newly introduced Java Range class
1 parent f36a55e commit 8ba2530

File tree

5 files changed

+49
-22
lines changed

5 files changed

+49
-22
lines changed

logstash-core/spec/logstash/runner_spec.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@
321321
it "creates an Agent whose `api.http.port` uses the default value" do
322322
expect(LogStash::Agent).to receive(:new) do |settings|
323323
expect(settings.set?("api.http.port")).to be_falsey
324-
expect(settings.get("api.http.port")).to eq(9600..9700)
324+
expect(settings.get("api.http.port")).to eq(::LogStash.as_java_range(9600..9700))
325325
end
326326

327327
subject.run("bin/logstash", args)
@@ -335,7 +335,7 @@
335335
it "creates an Agent whose `api.http.port` is an appropriate single-element range" do
336336
expect(LogStash::Agent).to receive(:new) do |settings|
337337
expect(settings.set?("api.http.port")).to be(true)
338-
expect(settings.get("api.http.port")).to eq(10000..10000)
338+
expect(settings.get("api.http.port")).to eq(::LogStash.as_java_range(10000..10000))
339339
end
340340

341341
subject.run("bin/logstash", args)
@@ -346,7 +346,7 @@
346346
it "creates an Agent whose `api.http.port` uses the appropriate inclusive-end range" do
347347
expect(LogStash::Agent).to receive(:new) do |settings|
348348
expect(settings.set?("api.http.port")).to be(true)
349-
expect(settings.get("api.http.port")).to eq(10000..20000)
349+
expect(settings.get("api.http.port")).to eq(::LogStash.as_java_range(10000..20000))
350350
end
351351

352352
subject.run("bin/logstash", args)

logstash-core/spec/logstash/settings/port_range_spec.rb

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@
2727
end
2828

2929
it "returns a range" do
30-
expect(subject.value).to eq(9000..9000)
30+
expect(subject.value).to eq(::LogStash.as_java_range(9000..9000))
3131
end
3232

3333
it "can update the range" do
3434
subject.set(10000)
35-
expect(subject.value).to eq(10000..10000)
35+
expect(subject.value).to eq(::LogStash.as_java_range(10000..10000))
3636
end
3737
end
3838

@@ -48,12 +48,12 @@
4848
end
4949

5050
it "returns a range" do
51-
expect(subject.value).to eq(9000..10000)
51+
expect(subject.value).to eq(::LogStash.as_java_range(9000..10000))
5252
end
5353

5454
it "can update the range" do
5555
subject.set("500-1000")
56-
expect(subject.value).to eq(500..1000)
56+
expect(subject.value).to eq(::LogStash.as_java_range(500..1000))
5757
end
5858
end
5959

@@ -82,23 +82,23 @@
8282
end
8383

8484
context "When value is a range" do
85-
subject { LogStash::Setting::PortRange.new("mynewtest", 9000..10000) }
85+
subject { LogStash::Setting::PortRange.new("mynewtest", ::LogStash.as_java_range(9000..10000)) }
8686

8787
it "accepts a ruby range as the default value" do
8888
expect { subject }.not_to raise_error
8989
end
9090

9191
it "can update the range" do
92-
subject.set(500..1000)
93-
expect(subject.value).to eq(500..1000)
92+
subject.set(::LogStash.as_java_range(500..1000))
93+
expect(subject.value).to eq(::LogStash.as_java_range(500..1000))
9494
end
9595

9696
it "refuses when then upper port is out of range" do
97-
expect { LogStash::Setting::PortRange.new("mynewtest", 9000..1000000) }.to raise_error
97+
expect { LogStash::Setting::PortRange.new("mynewtest", ::LogStash.as_java_range(9000..1000000)) }.to raise_error
9898
end
9999

100100
it "raise an exception on when port are out of range" do
101-
expect { LogStash::Setting::PortRange.new("mynewtest", -1000..1000) }.to raise_error
101+
expect { LogStash::Setting::PortRange.new("mynewtest", ::LogStash.as_java_range(-1000..1000)) }.to raise_error
102102
end
103103
end
104104
end

logstash-core/spec/logstash/settings_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464

6565
describe "#to_hash" do
6666
let(:java_deprecated_alias) { LogStash::Setting::Boolean.new("java.actual", true).with_deprecated_alias("java.deprecated") }
67-
let(:ruby_deprecated_alias) { LogStash::Setting::PortRange.new("ruby.actual", 9600..9700).with_deprecated_alias("ruby.deprecated") }
67+
let(:ruby_deprecated_alias) { LogStash::Setting::PortRange.new("ruby.actual", ::LogStash.as_java_range(9600..9700)).with_deprecated_alias("ruby.deprecated") }
6868
let(:non_deprecated) { LogStash::Setting::Boolean.new("plain_setting", false) }
6969

7070
before :each do

logstash-core/src/main/java/org/logstash/settings/Range.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.logstash.settings;
22

3+
import java.util.Objects;
34
import java.util.function.BiConsumer;
45

56
public class Range<T extends Integer> {
@@ -40,4 +41,25 @@ public void eachWithIndex(BiConsumer<Integer, Integer> consumer) {
4041
public int count() {
4142
return last.intValue() - first.intValue() + 1;
4243
}
44+
45+
@Override
46+
public String toString() {
47+
return this.getClass().getName() +
48+
"{first=" + first +
49+
", last=" + last +
50+
'}';
51+
}
52+
53+
@Override
54+
public boolean equals(Object o) {
55+
if (this == o) return true;
56+
if (o == null || getClass() != o.getClass()) return false;
57+
Range<?> range = (Range<?>) o;
58+
return Objects.equals(first, range.first) && Objects.equals(last, range.last);
59+
}
60+
61+
@Override
62+
public int hashCode() {
63+
return Objects.hash(first, last);
64+
}
4365
}

logstash-core/src/main/java/org/logstash/settings/SettingPortRange.java

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
11
package org.logstash.settings;
22

3-
import java.util.function.Predicate;
4-
3+
// Ideally would be a Coercible<Range<Integer>>, but given the fact that
4+
// values can be effectively coerced into the constructor, it needs instances
5+
// of Objects to represent Integer, String, Long to be later coerced into Range<Integer>.
56
@SuppressWarnings({"rawtypes", "unchecked"})
6-
public class SettingPortRange extends Coercible<Range<Integer>> {
7+
public class SettingPortRange extends Coercible<Object> {
78

89
private static final Range<Integer> VALID_PORT_RANGE = new Range<>(1, 65535);
910
public static final String PORT_SEPARATOR = "-";
1011

11-
public SettingPortRange(String name, Range<Integer> defaultValue) {
12+
public SettingPortRange(String name, Object defaultValue) {
1213
super(name, defaultValue, true, SettingPortRange::isValid);
1314
}
1415

15-
public static boolean isValid(Range<Integer> range) {
16-
return VALID_PORT_RANGE.contains(range);
16+
public static boolean isValid(Object range) {
17+
if (!(range instanceof Range)) {
18+
return false;
19+
}
20+
21+
return VALID_PORT_RANGE.contains((Range<Integer>) range);
1722
}
1823

1924
// TODO cover with tests
@@ -55,10 +60,10 @@ public Range<Integer> coerce(Object obj) {
5560
}
5661

5762
@Override
58-
public void validate(Range<Integer> value) throws IllegalArgumentException {
63+
public void validate(Object value) throws IllegalArgumentException {
5964
if (!isValid(value)) {
60-
final String msg = String.format("Invalid value \"{}: {}}\", valid options are within the range of {}-{}",
61-
getName(), value, VALID_PORT_RANGE, VALID_PORT_RANGE.getFirst(), VALID_PORT_RANGE.getLast());
65+
final String msg = String.format("Invalid value \"%s: %s\", valid options are within the range of %d-%d",
66+
getName(), value, VALID_PORT_RANGE.getFirst(), VALID_PORT_RANGE.getLast());
6267

6368
throw new IllegalArgumentException(msg);
6469
}

0 commit comments

Comments
 (0)