Remove setter of SpanContext, because it should be immutable

This commit is contained in:
Sebastian Sdorra
2020-11-04 08:20:29 +01:00
parent 0a01cb058a
commit 8e4b1e40c2
2 changed files with 75 additions and 15 deletions

View File

@@ -26,9 +26,9 @@ package sonia.scm.trace;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import sonia.scm.xml.XmlInstantAdapter;
import javax.xml.bind.annotation.XmlAccessType;
@@ -44,21 +44,30 @@ import java.util.Map;
*
* @since 2.9.0
*/
@Getter
@XmlRootElement
@EqualsAndHashCode
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
@NoArgsConstructor(access = AccessLevel.PACKAGE)
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@Getter
@Setter
public class SpanContext {
String kind;
Map<String, String> labels;
private String kind;
private Map<String, String> labels;
@XmlJavaTypeAdapter(XmlInstantAdapter.class)
Instant opened;
private Instant opened;
@XmlJavaTypeAdapter(XmlInstantAdapter.class)
Instant closed;
boolean failed;
private Instant closed;
private boolean failed;
/**
* Returns the label with the given key or {@code null}.
* @param key key of label
* @return label or {@code null}
*/
public String label(String key) {
return labels.get(key);
}
/**
* Calculates the duration of the span.
@@ -68,10 +77,4 @@ public class SpanContext {
public Duration duration() {
return Duration.between(opened, closed);
}
// For testing
public static SpanContext create(String kind, Map<String, String> labels, Instant opened, Instant closed, boolean failed) {
return new SpanContext(kind, labels, opened, closed, failed);
}
}

View File

@@ -0,0 +1,57 @@
/*
* MIT License
*
* Copyright (c) 2020-present Cloudogu GmbH and Contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package sonia.scm.trace;
import com.google.common.collect.ImmutableMap;
import org.junit.jupiter.api.Test;
import javax.xml.bind.JAXB;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.time.Instant;
import static org.assertj.core.api.Assertions.assertThat;
class SpanContextTest {
@Test
void shouldMarshalAndUnmarshal() {
Instant now = Instant.now();
SpanContext span = new SpanContext(
"jenkins", ImmutableMap.of("one", "1"), now, now, true
);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
JAXB.marshal(span, baos);
span = JAXB.unmarshal(new ByteArrayInputStream(baos.toByteArray()), SpanContext.class);
assertThat(span.getKind()).isEqualTo("jenkins");
assertThat(span.label("one")).isEqualTo("1");
assertThat(span.getOpened()).isEqualTo(now);
assertThat(span.getClosed()).isEqualTo(now);
assertThat(span.isFailed()).isTrue();
}
}