diff --git a/src/main/java/org/cyclonedx/model/OrganizationalEntity.java b/src/main/java/org/cyclonedx/model/OrganizationalEntity.java index a5e83f7737..3f65764e44 100644 --- a/src/main/java/org/cyclonedx/model/OrganizationalEntity.java +++ b/src/main/java/org/cyclonedx/model/OrganizationalEntity.java @@ -31,11 +31,12 @@ import java.util.Objects; import org.cyclonedx.Version; +import org.cyclonedx.model.organization.PostalAddress; import org.cyclonedx.util.deserializer.OrganizationalEntityDeserializer; @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_EMPTY) -@JsonPropertyOrder({"name", "url", "contact"}) +@JsonPropertyOrder({"name", "address", "url", "contact"}) @JsonDeserialize(using = OrganizationalEntityDeserializer.class) public class OrganizationalEntity { @@ -46,6 +47,9 @@ public class OrganizationalEntity { private String name; + @VersionFilter(Version.VERSION_16) + private PostalAddress address; + private List url; @JsonProperty("contact") private List contact; @@ -95,6 +99,14 @@ public void setBomRef(final String bomRef) { this.bomRef = bomRef; } + public PostalAddress getAddress() { + return address; + } + + public void setAddress(final PostalAddress address) { + this.address = address; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -103,11 +115,12 @@ public boolean equals(Object o) { return Objects.equals(name, that.name) && Objects.equals(url, that.url) && Objects.equals(contact, that.contact) && + Objects.equals(address, that.address) && Objects.equals(bomRef, that.bomRef); } @Override public int hashCode() { - return Objects.hash(name, url, contact, bomRef); + return Objects.hash(name, url, contact, bomRef, address); } } diff --git a/src/main/java/org/cyclonedx/model/component/modelCard/Considerations.java b/src/main/java/org/cyclonedx/model/component/modelCard/Considerations.java index e8f02bc7f3..14514b5bc8 100644 --- a/src/main/java/org/cyclonedx/model/component/modelCard/Considerations.java +++ b/src/main/java/org/cyclonedx/model/component/modelCard/Considerations.java @@ -6,7 +6,10 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import org.cyclonedx.Version; import org.cyclonedx.model.ExtensibleElement; +import org.cyclonedx.model.VersionFilter; +import org.cyclonedx.model.component.modelCard.consideration.EnvironmentalConsideration; import org.cyclonedx.model.component.modelCard.consideration.FairnessAssessment; import org.cyclonedx.model.component.modelCard.consideration.Risk; @@ -24,6 +27,8 @@ public class Considerations extends ExtensibleElement private List ethicalConsiderations; + @VersionFilter(Version.VERSION_16) + private EnvironmentalConsideration environmentalConsiderations; private List fairnessAssessments; @@ -86,4 +91,12 @@ public List getFairnessAssessments() { public void setFairnessAssessments(final List fairnessAssessments) { this.fairnessAssessments = fairnessAssessments; } + + public EnvironmentalConsideration getEnvironmentalConsiderations() { + return environmentalConsiderations; + } + + public void setEnvironmentalConsiderations(final EnvironmentalConsideration environmentalConsiderations) { + this.environmentalConsiderations = environmentalConsiderations; + } } diff --git a/src/main/java/org/cyclonedx/model/component/modelCard/consideration/EnvironmentalConsideration.java b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/EnvironmentalConsideration.java new file mode 100644 index 0000000000..1dab7b9ab6 --- /dev/null +++ b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/EnvironmentalConsideration.java @@ -0,0 +1,37 @@ +package org.cyclonedx.model.component.modelCard.consideration; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import org.cyclonedx.model.Property; +import org.cyclonedx.model.component.modelCard.consideration.consumption.EnergyConsumption; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class EnvironmentalConsideration +{ + private List energyConsumptions; + + private List properties; + + public List getEnergyConsumptions() { + return energyConsumptions; + } + + public void setEnergyConsumptions(final List energyConsumptions) { + this.energyConsumptions = energyConsumptions; + } + + @JacksonXmlElementWrapper(localName = "properties") + @JacksonXmlProperty(localName = "property") + public List getProperties() { + return properties; + } + + public void setProperties(final List properties) { + this.properties = properties; + } +} diff --git a/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/Activity.java b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/Activity.java new file mode 100644 index 0000000000..547abfd04c --- /dev/null +++ b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/Activity.java @@ -0,0 +1,35 @@ +package org.cyclonedx.model.component.modelCard.consideration.consumption; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public enum Activity +{ + @JsonProperty("design") + DESIGN("design"), + @JsonProperty("data-collection") + DATA_COLLECTION("data-collection"), + @JsonProperty("data-preparation") + DATA_PREPARATION("data-preparation"), + @JsonProperty("training") + TRAINING("training"), + @JsonProperty("fine-tuning") + FINE_TUNING("fine-tuning"), + @JsonProperty("validation") + VALIDATION("validation"), + @JsonProperty("deployment") + DEPLOYMENT("deployment"), + @JsonProperty("inference") + INFERENCE("inference"), + @JsonProperty("other") + OTHER("other"); + + private final String name; + + Activity(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/EnergyConsumption.java b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/EnergyConsumption.java new file mode 100644 index 0000000000..35c400dbaa --- /dev/null +++ b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/EnergyConsumption.java @@ -0,0 +1,75 @@ +package org.cyclonedx.model.component.modelCard.consideration.consumption; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import org.cyclonedx.model.Property; +import org.cyclonedx.model.component.modelCard.consideration.consumption.co2.CO2Measure; +import org.cyclonedx.model.component.modelCard.consideration.consumption.energy.EnergyMeasure; +import org.cyclonedx.model.component.modelCard.consideration.consumption.energy.EnergyProvider; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class EnergyConsumption +{ + private Activity activity; + private List energyProviders; + private EnergyMeasure activityEnergyCost; + private CO2Measure co2CostEquivalent; + private CO2Measure co2CostOffset; + private List properties; + + public Activity getActivity() { + return activity; + } + + public void setActivity(final Activity activity) { + this.activity = activity; + } + + @JacksonXmlElementWrapper(useWrapping = false) + public List getEnergyProviders() { + return energyProviders; + } + + public void setEnergyProviders(final List energyProviders) { + this.energyProviders = energyProviders; + } + + public EnergyMeasure getActivityEnergyCost() { + return activityEnergyCost; + } + + public void setActivityEnergyCost(final EnergyMeasure activityEnergyCost) { + this.activityEnergyCost = activityEnergyCost; + } + + public CO2Measure getCo2CostEquivalent() { + return co2CostEquivalent; + } + + public void setCo2CostEquivalent(final CO2Measure co2CostEquivalent) { + this.co2CostEquivalent = co2CostEquivalent; + } + + public CO2Measure getCo2CostOffset() { + return co2CostOffset; + } + + public void setCo2CostOffset(final CO2Measure co2CostOffset) { + this.co2CostOffset = co2CostOffset; + } + + @JacksonXmlElementWrapper(localName = "properties") + @JacksonXmlProperty(localName = "property") + public List getProperties() { + return properties; + } + + public void setProperties(final List properties) { + this.properties = properties; + } +} diff --git a/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/co2/CO2Measure.java b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/co2/CO2Measure.java new file mode 100644 index 0000000000..3e7c3e8a4c --- /dev/null +++ b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/co2/CO2Measure.java @@ -0,0 +1,28 @@ +package org.cyclonedx.model.component.modelCard.consideration.consumption.co2; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class CO2Measure +{ + private double value; + private Unit unit; + + public double getValue() { + return value; + } + + public void setValue(final double value) { + this.value = value; + } + + public Unit getUnit() { + return unit; + } + + public void setUnit(final Unit unit) { + this.unit = unit; + } +} diff --git a/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/co2/Unit.java b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/co2/Unit.java new file mode 100644 index 0000000000..bc2ccb88ac --- /dev/null +++ b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/co2/Unit.java @@ -0,0 +1,19 @@ +package org.cyclonedx.model.component.modelCard.consideration.consumption.co2; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public enum Unit +{ + @JsonProperty("tCO2eq") + TCO2EQ("tCO2eq"); + + private final String name; + + Unit(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/energy/EnergyMeasure.java b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/energy/EnergyMeasure.java new file mode 100644 index 0000000000..946f1f3a4a --- /dev/null +++ b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/energy/EnergyMeasure.java @@ -0,0 +1,28 @@ +package org.cyclonedx.model.component.modelCard.consideration.consumption.energy; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class EnergyMeasure +{ + private double value; + private Unit unit; + + public double getValue() { + return value; + } + + public void setValue(final double value) { + this.value = value; + } + + public Unit getUnit() { + return unit; + } + + public void setUnit(final Unit unit) { + this.unit = unit; + } +} diff --git a/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/energy/EnergyProvider.java b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/energy/EnergyProvider.java new file mode 100644 index 0000000000..08f200196e --- /dev/null +++ b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/energy/EnergyProvider.java @@ -0,0 +1,78 @@ +package org.cyclonedx.model.component.modelCard.consideration.consumption.energy; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import org.cyclonedx.model.ExternalReference; +import org.cyclonedx.model.OrganizationalEntity; +import org.cyclonedx.util.deserializer.ExternalReferencesDeserializer; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class EnergyProvider +{ + @JacksonXmlProperty(isAttribute = true, localName = "bom-ref") + @JsonProperty("bom-ref") + private String bomRef; + private String description; + private OrganizationalEntity organization; + private EnergySource energySource; + private EnergyMeasure energyProvided; + private List externalReferences; + + public String getBomRef() { + return bomRef; + } + + public void setBomRef(final String bomRef) { + this.bomRef = bomRef; + } + + public String getDescription() { + return description; + } + + public void setDescription(final String description) { + this.description = description; + } + + public OrganizationalEntity getOrganization() { + return organization; + } + + public void setOrganization(final OrganizationalEntity organization) { + this.organization = organization; + } + + public EnergySource getEnergySource() { + return energySource; + } + + public void setEnergySource(final EnergySource energySource) { + this.energySource = energySource; + } + + public EnergyMeasure getEnergyProvided() { + return energyProvided; + } + + public void setEnergyProvided(final EnergyMeasure energyProvided) { + this.energyProvided = energyProvided; + } + + @JacksonXmlElementWrapper(localName = "externalReferences") + @JacksonXmlProperty(localName = "reference") + @JsonDeserialize(using = ExternalReferencesDeserializer.class) + public List getExternalReferences() { + return externalReferences; + } + + public void setExternalReferences(final List externalReferences) { + this.externalReferences = externalReferences; + } +} diff --git a/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/energy/EnergySource.java b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/energy/EnergySource.java new file mode 100644 index 0000000000..c7b690bccd --- /dev/null +++ b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/energy/EnergySource.java @@ -0,0 +1,39 @@ +package org.cyclonedx.model.component.modelCard.consideration.consumption.energy; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public enum EnergySource +{ + @JsonProperty("coal") + COAL("coal"), + @JsonProperty("oil") + OIL("oil"), + @JsonProperty("natural-gas") + NATURAL_GAS("natural-gas"), + @JsonProperty("nuclear") + NUCLEAR("nuclear"), + @JsonProperty("wind") + WIND("wind"), + @JsonProperty("solar") + SOLAR("solar"), + @JsonProperty("geothermal") + GEOTHERMAL("geothermal"), + @JsonProperty("hydropower") + HYDROPOWER("hydropower"), + @JsonProperty("biofuel") + BIOFUEL("biofuel"), + @JsonProperty("unknown") + UNKNOWN("unknown"), + @JsonProperty("other") + OTHER("other"); + + private final String name; + + EnergySource(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/energy/Unit.java b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/energy/Unit.java new file mode 100644 index 0000000000..ad2ff3c21c --- /dev/null +++ b/src/main/java/org/cyclonedx/model/component/modelCard/consideration/consumption/energy/Unit.java @@ -0,0 +1,19 @@ +package org.cyclonedx.model.component.modelCard.consideration.consumption.energy; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public enum Unit +{ + @JsonProperty("kWh") + KWH("kWh"); + + private final String name; + + Unit(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/org/cyclonedx/model/organization/PostalAddress.java b/src/main/java/org/cyclonedx/model/organization/PostalAddress.java new file mode 100644 index 0000000000..f7063b71b0 --- /dev/null +++ b/src/main/java/org/cyclonedx/model/organization/PostalAddress.java @@ -0,0 +1,85 @@ +package org.cyclonedx.model.organization; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_EMPTY) +@JsonPropertyOrder({"country", "region", "locality", "postOfficeBoxNumber", "postalCode", "streetAddress"}) +public class PostalAddress +{ + @JacksonXmlProperty(isAttribute = true, localName = "bom-ref") + @JsonProperty("bom-ref") + private String bomRef; + + private String country; + + private String region; + + private String locality; + + private String postOfficeBoxNumber; + + private String postalCode; + + private String streetAddress; + + public String getBomRef() { + return bomRef; + } + + public void setBomRef(final String bomRef) { + this.bomRef = bomRef; + } + + public String getCountry() { + return country; + } + + public void setCountry(final String country) { + this.country = country; + } + + public String getRegion() { + return region; + } + + public void setRegion(final String region) { + this.region = region; + } + + public String getLocality() { + return locality; + } + + public void setLocality(final String locality) { + this.locality = locality; + } + + public String getPostOfficeBoxNumber() { + return postOfficeBoxNumber; + } + + public void setPostOfficeBoxNumber(final String postOfficeBoxNumber) { + this.postOfficeBoxNumber = postOfficeBoxNumber; + } + + public String getPostalCode() { + return postalCode; + } + + public void setPostalCode(final String postalCode) { + this.postalCode = postalCode; + } + + public String getStreetAddress() { + return streetAddress; + } + + public void setStreetAddress(final String streetAddress) { + this.streetAddress = streetAddress; + } +} diff --git a/src/main/java/org/cyclonedx/util/deserializer/OrganizationalEntityDeserializer.java b/src/main/java/org/cyclonedx/util/deserializer/OrganizationalEntityDeserializer.java index 56247e8aef..515a2d5f8f 100644 --- a/src/main/java/org/cyclonedx/util/deserializer/OrganizationalEntityDeserializer.java +++ b/src/main/java/org/cyclonedx/util/deserializer/OrganizationalEntityDeserializer.java @@ -6,12 +6,14 @@ import com.fasterxml.jackson.core.ObjectCodec; import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.cyclonedx.model.OrganizationalContact; import org.cyclonedx.model.OrganizationalEntity; +import org.cyclonedx.model.organization.PostalAddress; public class OrganizationalEntityDeserializer extends JsonDeserializer @@ -42,14 +44,24 @@ else if (urlNode.isTextual()) { OrganizationalEntity entity = new OrganizationalEntity(); entity.setBomRef(bomRef); entity.setName(name); - entity.setUrls(url); - JsonNode contactNode = node.get("contact"); + if (!url.isEmpty()) { + entity.setUrls(url); + } + + JsonNode contactNode = node.get("contact"); if (contactNode != null) { List contacts = MetadataDeserializer.deserializerOrganizationalContact(contactNode, mapper); entity.setContacts(contacts); } + + JsonNode addressNode = node.get("address"); + if (addressNode != null) { + PostalAddress address = mapper.convertValue(addressNode, new TypeReference() {}); + entity.setAddress(address); + } + return entity; } } diff --git a/src/main/resources/bom-1.6.schema.json b/src/main/resources/bom-1.6.schema.json index 5149d13f3e..a1a6e206d3 100644 --- a/src/main/resources/bom-1.6.schema.json +++ b/src/main/resources/bom-1.6.schema.json @@ -3795,7 +3795,7 @@ "description": "The locality or city within the country.", "examples": [ "Austin" ] }, - "postOfficeBoxNumber ": { + "postOfficeBoxNumber": { "type": "string", "title": "Post Office Box Number", "description": "The post office box number.",