Skip to content

Commit 77afdff

Browse files
committed
Polish Code and reduce duplicate code
Signed-off-by: Alex Alzate <aalzate@sonatype.com>
1 parent a3d7a1f commit 77afdff

17 files changed

+178
-139
lines changed

src/main/java/org/cyclonedx/model/ExtensibleElement.java

-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
3030
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
3131
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
32-
import org.apache.commons.lang3.StringUtils;
3332
import org.cyclonedx.util.serializer.ExtensibleTypesSerializer;
3433
import org.cyclonedx.util.deserializer.ExtensionDeserializer;
3534

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* This file is part of CycloneDX Core (Java).
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+
*
16+
* SPDX-License-Identifier: Apache-2.0
17+
* Copyright (c) OWASP Foundation. All Rights Reserved.
18+
*/
19+
package org.cyclonedx.util.deserializer;
20+
21+
import java.util.ArrayList;
22+
import java.util.List;
23+
24+
import com.fasterxml.jackson.core.JsonProcessingException;
25+
import com.fasterxml.jackson.databind.JsonDeserializer;
26+
import com.fasterxml.jackson.databind.JsonNode;
27+
import com.fasterxml.jackson.databind.ObjectMapper;
28+
import com.fasterxml.jackson.databind.node.ArrayNode;
29+
import org.cyclonedx.model.formulation.common.AbstractType;
30+
import org.cyclonedx.model.formulation.common.EnvVariableChoice;
31+
import org.cyclonedx.model.formulation.common.ResourceReferenceChoice;
32+
33+
public abstract class AbstractDataTypeDeserializer<T extends AbstractType>
34+
extends JsonDeserializer<T> {
35+
36+
protected final ObjectMapper objectMapper = new ObjectMapper();
37+
38+
protected void setEnvironmentVars(final JsonNode node, AbstractType data) throws JsonProcessingException {
39+
JsonNode nodes = node.get("environmentVars");
40+
List<EnvVariableChoice> environmentVars = new ArrayList<>();
41+
42+
ArrayNode environmentVarsNode = (nodes.isArray() ? (ArrayNode) nodes : new ArrayNode(null).add(nodes));
43+
44+
for (JsonNode envVarNode : environmentVarsNode) {
45+
EnvVariableChoice envVar = objectMapper.treeToValue(envVarNode, EnvVariableChoice.class);
46+
environmentVars.add(envVar);
47+
}
48+
data.setEnvironmentVars(environmentVars);
49+
}
50+
51+
protected void setReference(JsonNode node, String fieldName, AbstractType type)
52+
throws JsonProcessingException
53+
{
54+
if (node.has(fieldName)) {
55+
JsonNode fieldNode = node.get(fieldName);
56+
ResourceReferenceChoice reference = objectMapper.treeToValue(fieldNode, ResourceReferenceChoice.class);
57+
58+
if ("source".equals(fieldName)) {
59+
type.setSource(reference);
60+
} else if ("target".equals(fieldName)) {
61+
type.setTarget(reference);
62+
}
63+
}
64+
}
65+
}

src/main/java/org/cyclonedx/util/deserializer/InputTypeDeserializer.java

+4-28
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,20 @@
1919
package org.cyclonedx.util.deserializer;
2020

2121
import java.io.IOException;
22-
import java.util.ArrayList;
2322
import java.util.List;
2423

2524
import com.fasterxml.jackson.core.JsonParser;
2625
import com.fasterxml.jackson.core.type.TypeReference;
2726
import com.fasterxml.jackson.core.JsonProcessingException;
2827
import com.fasterxml.jackson.databind.DeserializationContext;
29-
import com.fasterxml.jackson.databind.JsonDeserializer;
3028
import com.fasterxml.jackson.databind.JsonNode;
31-
import com.fasterxml.jackson.databind.ObjectMapper;
32-
import com.fasterxml.jackson.databind.node.ArrayNode;
3329
import org.cyclonedx.model.AttachmentText;
3430
import org.cyclonedx.model.Property;
35-
import org.cyclonedx.model.formulation.common.EnvVariableChoice;
3631
import org.cyclonedx.model.formulation.common.InputType;
3732
import org.cyclonedx.model.formulation.common.InputType.Parameter;
3833
import org.cyclonedx.model.formulation.common.ResourceReferenceChoice;
3934

40-
public class InputTypeDeserializer extends JsonDeserializer<InputType> {
41-
private final ObjectMapper objectMapper = new ObjectMapper();
35+
public class InputTypeDeserializer extends AbstractDataTypeDeserializer<InputType> {
4236

4337
@Override
4438
public InputType deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
@@ -47,17 +41,8 @@ public InputType deserialize(JsonParser jsonParser, DeserializationContext deser
4741
JsonNode node = jsonParser.getCodec().readTree(jsonParser);
4842
InputType inputType = new InputType();
4943

50-
if(node.has("source")) {
51-
JsonNode sourceNode = node.get("source");
52-
ResourceReferenceChoice source = objectMapper.treeToValue(sourceNode, ResourceReferenceChoice.class);
53-
inputType.setSource(source);
54-
}
55-
56-
if(node.has("target")) {
57-
JsonNode targetNode = node.get("target");
58-
ResourceReferenceChoice target = objectMapper.treeToValue(targetNode, ResourceReferenceChoice.class);
59-
inputType.setTarget(target);
60-
}
44+
setReference(node, "source", inputType);
45+
setReference(node, "target", inputType);
6146

6247
createInputDataInfo(node, inputType);
6348

@@ -80,16 +65,7 @@ private void createInputDataInfo(JsonNode node, InputType inputType ) throws Jso
8065
List<Parameter> parameters = objectMapper.convertValue(parametersNode, new TypeReference<List<Parameter>>() {});
8166
inputType.setParameters(parameters);
8267
} else if (node.has("environmentVars")) {
83-
JsonNode nodes = node.get("environmentVars");
84-
List<EnvVariableChoice> environmentVars = new ArrayList<>();
85-
86-
ArrayNode environmentVarsNode = (nodes.isArray() ? (ArrayNode) nodes : new ArrayNode(null).add(nodes));
87-
88-
for (JsonNode envVarNode : environmentVarsNode) {
89-
EnvVariableChoice envVar = objectMapper.treeToValue(envVarNode, EnvVariableChoice.class);
90-
environmentVars.add(envVar);
91-
}
92-
inputType.setEnvironmentVars(environmentVars);
68+
setEnvironmentVars(node, inputType);
9369
} else if (node.has("data")) {
9470
JsonNode dataNode = node.get("data");
9571
AttachmentText data = objectMapper.treeToValue(dataNode, AttachmentText.class);

src/main/java/org/cyclonedx/util/deserializer/OutputTypeDeserializer.java

+8-30
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,21 @@
1919
package org.cyclonedx.util.deserializer;
2020

2121
import java.io.IOException;
22-
import java.util.ArrayList;
2322
import java.util.List;
2423

2524
import com.fasterxml.jackson.core.JsonParser;
2625
import com.fasterxml.jackson.core.JsonProcessingException;
2726
import com.fasterxml.jackson.core.type.TypeReference;
2827
import com.fasterxml.jackson.databind.DeserializationContext;
29-
import com.fasterxml.jackson.databind.JsonDeserializer;
3028
import com.fasterxml.jackson.databind.JsonNode;
31-
import com.fasterxml.jackson.databind.ObjectMapper;
32-
import com.fasterxml.jackson.databind.node.ArrayNode;
3329
import org.cyclonedx.model.AttachmentText;
3430
import org.cyclonedx.model.Property;
35-
import org.cyclonedx.model.formulation.common.EnvVariableChoice;
3631
import org.cyclonedx.model.formulation.common.OutputType;
3732
import org.cyclonedx.model.formulation.common.OutputType.OutputTypeEnum;
3833
import org.cyclonedx.model.formulation.common.ResourceReferenceChoice;
3934

4035
public class OutputTypeDeserializer
41-
extends JsonDeserializer<OutputType> {
42-
private final ObjectMapper objectMapper = new ObjectMapper();
36+
extends AbstractDataTypeDeserializer<OutputType> {
4337

4438
@Override
4539
public OutputType deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
@@ -48,17 +42,8 @@ public OutputType deserialize(JsonParser jsonParser, DeserializationContext dese
4842
JsonNode node = jsonParser.getCodec().readTree(jsonParser);
4943
OutputType outputType = new OutputType();
5044

51-
if(node.has("source")) {
52-
JsonNode sourceNode = node.get("source");
53-
ResourceReferenceChoice source = objectMapper.treeToValue(sourceNode, ResourceReferenceChoice.class);
54-
outputType.setSource(source);
55-
}
56-
57-
if(node.has("target")) {
58-
JsonNode targetNode = node.get("target");
59-
ResourceReferenceChoice target = objectMapper.treeToValue(targetNode, ResourceReferenceChoice.class);
60-
outputType.setTarget(target);
61-
}
45+
setReference(node, "source", outputType);
46+
setReference(node, "target", outputType);
6247

6348
createOutputDataInfo(node, outputType);
6449

@@ -82,18 +67,11 @@ private void createOutputDataInfo(JsonNode node, OutputType outputType) throws J
8267
JsonNode resourceNode = node.get("resource");
8368
ResourceReferenceChoice resource = objectMapper.treeToValue(resourceNode, ResourceReferenceChoice.class);
8469
outputType.setResource(resource);
85-
} else if (node.has("environmentVars")) {
86-
JsonNode nodes = node.get("environmentVars");
87-
List<EnvVariableChoice> environmentVars = new ArrayList<>();
88-
89-
ArrayNode environmentVarsNode = (nodes.isArray() ? (ArrayNode) nodes : new ArrayNode(null).add(nodes));
90-
91-
for (JsonNode envVarNode : environmentVarsNode) {
92-
EnvVariableChoice envVar = objectMapper.treeToValue(envVarNode, EnvVariableChoice.class);
93-
environmentVars.add(envVar);
94-
}
95-
outputType.setEnvironmentVars(environmentVars);
96-
} else if (node.has("data")) {
70+
}
71+
else if (node.has("environmentVars")) {
72+
setEnvironmentVars(node, outputType);
73+
}
74+
else if (node.has("data")) {
9775
JsonNode dataNode = node.get("data");
9876
AttachmentText data = objectMapper.treeToValue(dataNode, AttachmentText.class);
9977
outputType.setData(data);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package org.cyclonedx.util.serializer;
2+
3+
import java.io.IOException;
4+
import java.util.List;
5+
6+
import com.fasterxml.jackson.core.JsonGenerator;
7+
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
8+
import org.cyclonedx.model.formulation.common.AbstractType;
9+
import org.cyclonedx.model.formulation.common.EnvVariableChoice;
10+
11+
12+
public abstract class AbstractDataTypeSerializer<T extends AbstractType> extends StdSerializer<T>
13+
{
14+
15+
public AbstractDataTypeSerializer(Class<T> t) {
16+
super(t);
17+
}
18+
19+
protected void parseEnvironmentVars(final JsonGenerator jsonGenerator, final List<EnvVariableChoice> vars)
20+
throws IOException
21+
{
22+
jsonGenerator.writeArrayFieldStart("environmentVars");
23+
for (EnvVariableChoice envVarChoice : vars) {
24+
if (envVarChoice.getEnvironmentVar() != null) {
25+
jsonGenerator.writeStartObject();
26+
jsonGenerator.writeObjectField("environmentVar", envVarChoice.getEnvironmentVar());
27+
jsonGenerator.writeEndObject();
28+
}
29+
else if (envVarChoice.getValue() != null) {
30+
jsonGenerator.writeStartObject();
31+
jsonGenerator.writeObjectField("value", envVarChoice.getValue());
32+
jsonGenerator.writeEndObject();
33+
}
34+
}
35+
jsonGenerator.writeEndArray();
36+
}
37+
38+
}

src/main/java/org/cyclonedx/util/serializer/InputTypeSerializer.java

+13-28
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@
44

55
import com.fasterxml.jackson.core.JsonGenerator;
66
import com.fasterxml.jackson.databind.SerializerProvider;
7-
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
87
import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator;
9-
import org.cyclonedx.model.formulation.common.EnvVariableChoice;
108
import org.cyclonedx.model.formulation.common.InputType;
119

1210
public class InputTypeSerializer
13-
extends StdSerializer<InputType>
11+
extends AbstractDataTypeSerializer<InputType>
1412
{
1513
private final boolean isXml;
1614

@@ -48,40 +46,27 @@ else if (input.getParameters() != null && !input.getParameters().isEmpty()) {
4846
jsonGenerator.writeObject( input.getParameters());
4947
}
5048
else if (input.getEnvironmentVars() != null && !input.getEnvironmentVars().isEmpty()) {
51-
jsonGenerator.writeArrayFieldStart("environmentVars");
52-
for (EnvVariableChoice envVarChoice : input.getEnvironmentVars()) {
53-
if (envVarChoice.getEnvironmentVar() != null) {
54-
jsonGenerator.writeStartObject();
55-
jsonGenerator.writeObjectField("environmentVar", envVarChoice.getEnvironmentVar());
56-
jsonGenerator.writeEndObject();
57-
} else if (envVarChoice.getValue() != null) {
58-
jsonGenerator.writeStartObject();
59-
jsonGenerator.writeObjectField("value", envVarChoice.getValue());
60-
jsonGenerator.writeEndObject();
61-
}
62-
}
63-
jsonGenerator.writeEndArray();
49+
parseEnvironmentVars(jsonGenerator, input.getEnvironmentVars());
6450
}
6551
else if (input.getData() != null) {
6652
jsonGenerator.writeFieldName("data");
6753
jsonGenerator.writeObject( input.getData());
6854
}
6955

70-
if (input.getSource() != null) {
71-
jsonGenerator.writeFieldName("source");
72-
jsonGenerator.writeObject(input.getSource());
73-
}
74-
if (input.getTarget() != null) {
75-
jsonGenerator.writeFieldName("target");
76-
jsonGenerator.writeObject(input.getTarget());
77-
}
78-
if (input.getProperties() != null) {
79-
jsonGenerator.writeFieldName("properties");
80-
jsonGenerator.writeObject( input.getProperties());
81-
}
56+
writeField(jsonGenerator, "source", input.getSource());
57+
writeField(jsonGenerator, "target", input.getTarget());
58+
writeField(jsonGenerator, "properties", input.getProperties());
59+
8260
jsonGenerator.writeEndObject();
8361
}
8462

63+
private void writeField(JsonGenerator jsonGenerator, String fieldName, Object fieldValue) throws IOException {
64+
if (fieldValue != null) {
65+
jsonGenerator.writeFieldName(fieldName);
66+
jsonGenerator.writeObject(fieldValue);
67+
}
68+
}
69+
8570
@Override
8671
public Class<InputType> handledType() {
8772
return InputType.class;

src/main/java/org/cyclonedx/util/serializer/LicenseChoiceSerializer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public LicenseChoiceSerializer() {
3232
this(LicenseChoice.class);
3333
}
3434

35-
public LicenseChoiceSerializer(final Class t) {
35+
public LicenseChoiceSerializer(final Class<LicenseChoice> t) {
3636
super(t);
3737
}
3838

0 commit comments

Comments
 (0)