Loading .gitignore +1 −0 Original line number Original line Diff line number Diff line target/** target/** /nbproject/ pom.xml +45 −0 Original line number Original line Diff line number Diff line Loading @@ -29,5 +29,50 @@ <artifactId>jackson-module-jaxb-annotations</artifactId> <artifactId>jackson-module-jaxb-annotations</artifactId> <version>2.10.3</version> <version>2.10.3</version> </dependency> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.6.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <version>5.6.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.6.0</version> <scope>test</scope> </dependency> </dependencies> </dependencies> <build> <plugins> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> </plugin> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.6</version> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>report</id> <phase>test</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project> </project> No newline at end of file src/main/java/it/inaf/oats/vospace/datamodel/JobInfoDeserializer.java 0 → 100644 +58 −0 Original line number Original line Diff line number Diff line package it.inaf.oats.vospace.datamodel; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import java.io.IOException; import java.util.Map; import net.ivoa.xml.uws.v1.JobSummary.JobInfo; import net.ivoa.xml.vospace.v2.Transfer; public class JobInfoDeserializer extends StdDeserializer<JobInfo> { private static final ObjectMapper MAPPER = new ObjectMapper(); public JobInfoDeserializer() { super(JobInfo.class); } @Override public JobInfo deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException { Object content = jp.getCodec().readValue(jp, Object.class); if (content == null) { return null; } if (!(content instanceof Map)) { throw new UnsupportedOperationException("JobInfo contains an instance of " + content.getClass().getCanonicalName()); } Map<String, Object> map = (Map<String, Object>) content; if (map.isEmpty()) { return null; } if (map.keySet().size() > 1) { throw new UnsupportedOperationException("Multiple keys found in JobInfo content"); } String name = map.keySet().toArray(String[]::new)[0]; JobInfo jobInfo = new JobInfo(); switch (name) { case "transfer": String transferJson = MAPPER.writeValueAsString(map.get(name)); Transfer transfer = MAPPER.readValue(transferJson, Transfer.class); jobInfo.getAny().add(transfer); break; default: throw new UnsupportedOperationException("JobInfo map key is " + name); } return jobInfo; } } src/main/java/it/inaf/oats/vospace/datamodel/JobInfoSerializer.java 0 → 100644 +39 −0 Original line number Original line Diff line number Diff line package it.inaf.oats.vospace.datamodel; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import net.ivoa.xml.uws.v1.JobSummary.JobInfo; public class JobInfoSerializer extends StdSerializer<JobInfo> { public JobInfoSerializer() { super(JobInfo.class); } @Override public void serialize(JobInfo jobInfo, JsonGenerator jg, SerializerProvider sp) throws IOException { List<Object> any = jobInfo.getAny(); if (any == null || any.isEmpty()) { jg.getCodec().writeValue(jg, null); return; } if (jobInfo.getAny().size() == 1) { Object content = jobInfo.getAny().get(0); Map<String, Object> map = new HashMap<>(); String name = content.getClass().getSimpleName().toLowerCase(); map.put(name, content); jg.getCodec().writeValue(jg, map); } else { jg.getCodec().writeValue(jg, jobInfo.getAny()); } } } src/main/java/net/ivoa/xml/uws/v1/JobSummary.java +11 −0 Original line number Original line Diff line number Diff line Loading @@ -8,6 +8,10 @@ package net.ivoa.xml.uws.v1; package net.ivoa.xml.uws.v1; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import it.inaf.oats.vospace.datamodel.JobInfoDeserializer; import it.inaf.oats.vospace.datamodel.JobInfoSerializer; import java.util.ArrayList; import java.util.ArrayList; import java.util.List; import java.util.List; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBElement; Loading @@ -17,9 +21,12 @@ import javax.xml.bind.annotation.XmlAnyElement; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlSchemaType; import javax.xml.bind.annotation.XmlSchemaType; import javax.xml.bind.annotation.XmlSeeAlso; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.XmlType; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.datatype.XMLGregorianCalendar; import net.ivoa.xml.vospace.v2.Transfer; import org.w3c.dom.Element; import org.w3c.dom.Element; Loading Loading @@ -87,6 +94,8 @@ import org.w3c.dom.Element; "errorSummary", "errorSummary", "jobInfo" "jobInfo" }) }) @XmlSeeAlso({Transfer.class}) // Necessary for setting a Transfer inside the jobInfo property. @XmlRootElement(name = "job") public class JobSummary { public class JobSummary { @XmlElement(required = true) @XmlElement(required = true) Loading Loading @@ -501,6 +510,8 @@ public class JobSummary { @XmlType(name = "", propOrder = { @XmlType(name = "", propOrder = { "any" "any" }) }) @JsonSerialize(using = JobInfoSerializer.class) @JsonDeserialize(using = JobInfoDeserializer.class) public static class JobInfo { public static class JobInfo { @XmlAnyElement(lax = true) @XmlAnyElement(lax = true) Loading Loading
.gitignore +1 −0 Original line number Original line Diff line number Diff line target/** target/** /nbproject/
pom.xml +45 −0 Original line number Original line Diff line number Diff line Loading @@ -29,5 +29,50 @@ <artifactId>jackson-module-jaxb-annotations</artifactId> <artifactId>jackson-module-jaxb-annotations</artifactId> <version>2.10.3</version> <version>2.10.3</version> </dependency> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.6.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <version>5.6.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.6.0</version> <scope>test</scope> </dependency> </dependencies> </dependencies> <build> <plugins> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> </plugin> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.6</version> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>report</id> <phase>test</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project> </project> No newline at end of file
src/main/java/it/inaf/oats/vospace/datamodel/JobInfoDeserializer.java 0 → 100644 +58 −0 Original line number Original line Diff line number Diff line package it.inaf.oats.vospace.datamodel; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import java.io.IOException; import java.util.Map; import net.ivoa.xml.uws.v1.JobSummary.JobInfo; import net.ivoa.xml.vospace.v2.Transfer; public class JobInfoDeserializer extends StdDeserializer<JobInfo> { private static final ObjectMapper MAPPER = new ObjectMapper(); public JobInfoDeserializer() { super(JobInfo.class); } @Override public JobInfo deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException { Object content = jp.getCodec().readValue(jp, Object.class); if (content == null) { return null; } if (!(content instanceof Map)) { throw new UnsupportedOperationException("JobInfo contains an instance of " + content.getClass().getCanonicalName()); } Map<String, Object> map = (Map<String, Object>) content; if (map.isEmpty()) { return null; } if (map.keySet().size() > 1) { throw new UnsupportedOperationException("Multiple keys found in JobInfo content"); } String name = map.keySet().toArray(String[]::new)[0]; JobInfo jobInfo = new JobInfo(); switch (name) { case "transfer": String transferJson = MAPPER.writeValueAsString(map.get(name)); Transfer transfer = MAPPER.readValue(transferJson, Transfer.class); jobInfo.getAny().add(transfer); break; default: throw new UnsupportedOperationException("JobInfo map key is " + name); } return jobInfo; } }
src/main/java/it/inaf/oats/vospace/datamodel/JobInfoSerializer.java 0 → 100644 +39 −0 Original line number Original line Diff line number Diff line package it.inaf.oats.vospace.datamodel; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdSerializer; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import net.ivoa.xml.uws.v1.JobSummary.JobInfo; public class JobInfoSerializer extends StdSerializer<JobInfo> { public JobInfoSerializer() { super(JobInfo.class); } @Override public void serialize(JobInfo jobInfo, JsonGenerator jg, SerializerProvider sp) throws IOException { List<Object> any = jobInfo.getAny(); if (any == null || any.isEmpty()) { jg.getCodec().writeValue(jg, null); return; } if (jobInfo.getAny().size() == 1) { Object content = jobInfo.getAny().get(0); Map<String, Object> map = new HashMap<>(); String name = content.getClass().getSimpleName().toLowerCase(); map.put(name, content); jg.getCodec().writeValue(jg, map); } else { jg.getCodec().writeValue(jg, jobInfo.getAny()); } } }
src/main/java/net/ivoa/xml/uws/v1/JobSummary.java +11 −0 Original line number Original line Diff line number Diff line Loading @@ -8,6 +8,10 @@ package net.ivoa.xml.uws.v1; package net.ivoa.xml.uws.v1; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import it.inaf.oats.vospace.datamodel.JobInfoDeserializer; import it.inaf.oats.vospace.datamodel.JobInfoSerializer; import java.util.ArrayList; import java.util.ArrayList; import java.util.List; import java.util.List; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBElement; Loading @@ -17,9 +21,12 @@ import javax.xml.bind.annotation.XmlAnyElement; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlElementRef; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlSchemaType; import javax.xml.bind.annotation.XmlSchemaType; import javax.xml.bind.annotation.XmlSeeAlso; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.XmlType; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.datatype.XMLGregorianCalendar; import net.ivoa.xml.vospace.v2.Transfer; import org.w3c.dom.Element; import org.w3c.dom.Element; Loading Loading @@ -87,6 +94,8 @@ import org.w3c.dom.Element; "errorSummary", "errorSummary", "jobInfo" "jobInfo" }) }) @XmlSeeAlso({Transfer.class}) // Necessary for setting a Transfer inside the jobInfo property. @XmlRootElement(name = "job") public class JobSummary { public class JobSummary { @XmlElement(required = true) @XmlElement(required = true) Loading Loading @@ -501,6 +510,8 @@ public class JobSummary { @XmlType(name = "", propOrder = { @XmlType(name = "", propOrder = { "any" "any" }) }) @JsonSerialize(using = JobInfoSerializer.class) @JsonDeserialize(using = JobInfoDeserializer.class) public static class JobInfo { public static class JobInfo { @XmlAnyElement(lax = true) @XmlAnyElement(lax = true) Loading