Commit 1d8479c9 authored by Sonia Zorba's avatar Sonia Zorba
Browse files

Customized Jackson configuration for JobInfo class; Added tests

parent af27a456
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
target/**
target/**
/nbproject/
+45 −0
Original line number Original line Diff line number Diff line
@@ -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
+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;
    }
}
+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());
        }
    }
}
+11 −0
Original line number Original line Diff line number Diff line
@@ -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;
@@ -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;




@@ -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)
@@ -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