Skip to content

Commit

Permalink
refactor(Iris) use usual methods to serialize pseudo iris
Browse files Browse the repository at this point in the history
  • Loading branch information
Fabrice Bibonne committed Feb 12, 2024
1 parent fc3351a commit 76c36b4
Show file tree
Hide file tree
Showing 7 changed files with 155 additions and 236 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

import io.swagger.v3.oas.annotations.extensions.Extension;
import io.swagger.v3.oas.annotations.extensions.ExtensionProperty;
import org.apache.commons.lang3.StringUtils;

import fr.insee.rmes.api.AbstractMetadataApi;
Expand All @@ -37,8 +39,7 @@
@Tag(name = "nomenclatures", description = "Nomenclatures API")
public class ClassificationApi extends AbstractMetadataApi {


@Hidden

@GET
@Path("/{code}/postes")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
Expand Down
112 changes: 37 additions & 75 deletions src/main/java/fr/insee/rmes/api/geo/territoire/IrisApi.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,13 @@
package fr.insee.rmes.api.geo.territoire;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import fr.insee.rmes.api.geo.AbstractGeoApi;
import fr.insee.rmes.api.geo.ConstGeoApi;
import fr.insee.rmes.modeles.geo.territoire.Commune;
import fr.insee.rmes.modeles.geo.territoire.Iris;
import fr.insee.rmes.modeles.geo.territoire.PseudoIris;
import fr.insee.rmes.modeles.geo.territoire.Territoire;
import fr.insee.rmes.modeles.geo.territoires.Territoires;
import fr.insee.rmes.queries.geo.GeoQueries;
import fr.insee.rmes.utils.CSVUtils;
import fr.insee.rmes.utils.Constants;
import fr.insee.rmes.utils.ResponseUtils;
import fr.insee.rmes.utils.SparqlUtils;
import fr.insee.rmes.utils.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
Expand All @@ -26,12 +19,6 @@
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.StringWriter;
import java.util.Collections;
import java.util.List;


@Path(ConstGeoApi.PATH_GEO)
Expand All @@ -49,13 +36,18 @@ public class IrisApi extends AbstractGeoApi {
"Informations sur un Iris identifié par son code (neuf chiffres pour la métropole ou 2A/2B plus 7 chiffres pour la Corse)";


private final IrisUtils irisUtils;

public IrisApi() {
// Constructeur par défaut
this.irisUtils = new IrisUtils();
}

protected IrisApi(SparqlUtils sparqlUtils, CSVUtils csvUtils, ResponseUtils responseUtils) {
protected IrisApi(SparqlUtils sparqlUtils, CSVUtils csvUtils, ResponseUtils responseUtils, IrisUtils irisUtils) {
super(sparqlUtils, csvUtils, responseUtils);
this.irisUtils = irisUtils;
}

@Path(ConstGeoApi.PATH_IRIS + CODE_PATTERN)
@GET
@Produces({
Expand All @@ -73,7 +65,7 @@ public Response getByCode(
required = true,
schema = @Schema(
pattern = ConstGeoApi.PATTERN_IRIS,
type = Constants.TYPE_STRING, example=LITTERAL_CODE_EXAMPLE)) @PathParam(Constants.CODE) String code,
type = Constants.TYPE_STRING, example = LITTERAL_CODE_EXAMPLE)) @PathParam(Constants.CODE) String code,
@Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header,
@Parameter(
description = LITTERAL_PARAMETER_DATE_DESCRIPTION,
Expand All @@ -96,57 +88,29 @@ public Response getByCode(
}

private Response getResponseForIrisOrPseudoIris(String code, String header, String date) {
String codeCommune = code.substring(0, 5);
boolean hasIrisDescendant = false;
String sparqlQuery = String.format(
"SELECT DISTINCT ?type\n"
+ "FROM <http://rdf.insee.fr/graphes/geo/cog>\n"
+ "WHERE {\n"
+ " {\n"
+ " ?origine a igeo:Commune ;\n"
+ " igeo:codeINSEE \"%s\" .\n"
+ " }\n"
+ " UNION\n"
+ " {\n"
+ " ?origine a igeo:ArrondissementMunicipal ;\n"
+ " igeo:codeINSEE \"%s\" .\n"
+ " }\n"
+ " ?uri igeo:subdivisionDirecteDe+ ?origine .\n"
+ " ?uri a ?type .\n"
+ "}\n"
+ "ORDER BY ?type", codeCommune, codeCommune);

List<String> resultTypes = Collections.singletonList(sparqlUtils.executeSparqlQuery(sparqlQuery));

for (String type : resultTypes) {
if (type.endsWith("#Iris\r\n")) {
hasIrisDescendant = true;
break;
}
}
boolean hasIrisDescendant = irisUtils.hasIrisDescendant(code.substring(0, 5));

Territoire territoire;
if (code.endsWith("0000") && hasIrisDescendant) {
return Response.status(Response.Status.NOT_FOUND).entity("").build();
}
else if (hasIrisDescendant) {
} else if (hasIrisDescendant) {
territoire = new Iris(code);
return this.generateResponseATerritoireByCode(
sparqlUtils.executeSparqlQuery(
GeoQueries.getIrisByCodeAndDate(code, this.formatValidParameterDateIfIsNull(date))),
header,
territoire);
} else if (code.matches("^(?=.{9}$)(?!.*0000$).*$") ) {
} else if (code.matches("^(?=.{9}$)(?!.*0000$).*$")) {
return Response.status(Response.Status.NOT_FOUND).entity("").build();
} else {
territoire = new Commune(code);
try {
this.generateResponseATerritoireByCode(
sparqlUtils.executeSparqlQuery(
GeoQueries.getIrisByCodeAndDate(code, this.formatValidParameterDateIfIsNull(date))),
header,
territoire);

return this.generateResponseATerritoireByCode(
sparqlUtils.executeSparqlQuery(
GeoQueries.getIrisByCodeAndDate(code, this.formatValidParameterDateIfIsNull(date))),
header,
new PseudoIris(code));

/*
if (header.contains(MediaType.APPLICATION_JSON)) {
return getResponseJson(code, territoire);
Expand All @@ -155,38 +119,38 @@ else if (hasIrisDescendant) {
} else {
return Response.status(Response.Status.UNSUPPORTED_MEDIA_TYPE).build();
}
} catch (Exception e) {
e.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
}
*/

}
}

protected static Response getResponseXml(String code, Territoire territoire) throws JAXBException {
PseudoIris territoireFinal;
territoireFinal = new PseudoIris(territoire.getCode(), territoire.getUri(), territoire.getIntitule(),
territoire.getType(), territoire.getDateCreation(), territoire.getDateSuppression(),
territoire.getIntituleSansArticle());
/* protected static Response getResponseXml(String code, Territoire territoire) throws JAXBException {
PseudoIris territoireFinal = getTerritoireFinal(code, territoire);
JAXBContext jaxbContext = JAXBContext.newInstance(PseudoIris.class);
territoireFinal.setCode(code);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
StringWriter writer = new StringWriter();
marshaller.marshal(territoireFinal, writer);
return Response.ok(writer.toString(), MediaType.APPLICATION_XML_TYPE).build();
}
protected static Response getResponseJson(String code, Territoire territoire) throws JsonProcessingException {
private static PseudoIris getTerritoireFinal(String code, Territoire territoire) {
PseudoIris territoireFinal;
territoireFinal = new PseudoIris(territoire.getCode(), territoire.getUri(), territoire.getIntitule(),
territoire.getType(), territoire.getDateCreation(), territoire.getDateSuppression(),
territoire.getIntituleSansArticle());
territoireFinal.setCode(code);
return territoireFinal;
}
protected static Response getResponseJson(String code, Territoire territoire) throws JsonProcessingException {
PseudoIris territoireFinal = getTerritoireFinal(code, territoire);
ObjectMapper objectMapper = new ObjectMapper();
JsonNode Node = objectMapper.valueToTree(territoireFinal);
String jsonModifie = objectMapper.writeValueAsString(Node);
return Response.ok(jsonModifie, MediaType.APPLICATION_JSON_TYPE).build();
}
}*/


@Path(ConstGeoApi.PATH_LISTE_IRIS)
Expand All @@ -210,19 +174,18 @@ public Response getListe(
value = Constants.PARAMETER_DATE) String date,
@Parameter(description = "les Iris (et pseudo-iris) des collectivités d'outre-mer",
required = true,
schema = @Schema(type = Constants.TYPE_BOOLEAN, allowableValues = {"true","false"},example="false", defaultValue = "false"))
schema = @Schema(type = Constants.TYPE_BOOLEAN, allowableValues = {"true", "false"}, example = "false", defaultValue = "false"))
@QueryParam(
value = Constants.PARAMETER_STRING) Boolean com
) {

if ( ! this.verifyParameterDateIsRightWithHistory(date)) {
if (!this.verifyParameterDateIsRightWithHistory(date)) {
return this.generateBadRequestResponse();
}
else {
} else {
return this
.generateResponseListOfTerritoire(
sparqlUtils
.executeSparqlQuery(GeoQueries.getListIris(this.formatValidParameterDateIfIsNull(date),this.formatValidParameterBooleanIfIsNull(com))),
.executeSparqlQuery(GeoQueries.getListIris(this.formatValidParameterDateIfIsNull(date), this.formatValidParameterBooleanIfIsNull(com))),
header,
Territoires.class,
Territoire.class);
Expand All @@ -249,7 +212,7 @@ public Response getAscendants(
required = true,
schema = @Schema(
pattern = ConstGeoApi.PATTERN_IRIS,
type = Constants.TYPE_STRING, example=LITTERAL_CODE_EXAMPLE)) @PathParam(Constants.CODE) String code,
type = Constants.TYPE_STRING, example = LITTERAL_CODE_EXAMPLE)) @PathParam(Constants.CODE) String code,
@Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header,
@Parameter(
description = "Filtre pour renvoyer les territoires contenant l'iris actif à la date donnée. Par défaut, c’est la date courante. (Format : 'AAAA-MM-JJ')",
Expand All @@ -260,10 +223,9 @@ public Response getAscendants(
schema = @Schema(type = Constants.TYPE_STRING)) @QueryParam(
value = Constants.PARAMETER_TYPE) String typeTerritoire) {

if ( ! this.verifyParametersTypeAndDateAreValid(typeTerritoire, date)) {
if (!this.verifyParametersTypeAndDateAreValid(typeTerritoire, date)) {
return this.generateBadRequestResponse();
}
else {
} else {
return this
.generateResponseListOfTerritoire(
sparqlUtils
Expand Down
32 changes: 21 additions & 11 deletions src/main/java/fr/insee/rmes/modeles/geo/territoire/Iris.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,29 @@
@Schema(description = "Objet représentant un Iris")
public class Iris extends Territoire {

private final TypeDIris typeDIris;

public Iris(
TypeDIris typeDIris,
String code,
String uri,
String intitule,
String dateCreation,
String dateSuppression,
IntituleSansArticle intituleSansArticle) {
super(code, uri, intitule, EnumTypeGeographie.IRIS.getTypeObjetGeo(), dateCreation, dateSuppression, intituleSansArticle);
this.typeDIris=typeDIris;
}

public Iris() {
this.type = EnumTypeGeographie.IRIS.getTypeObjetGeo();
this.intituleSansArticle = new IntituleSansArticle();
this.typeDIris=null;
this(null);
}

public Iris(String code) {
this.type = EnumTypeGeographie.IRIS.getTypeObjetGeo();
this.code = code;
this.intituleSansArticle = new IntituleSansArticle();
this.typeDIris=null;
this(null, code, null, null, null, null, new IntituleSansArticle());
}
private final TypeDIris typeDIris;


@Override
@JacksonXmlProperty(localName = "Type")
@Schema(example = "http://rdf.insee.fr/def/geo#Iris")
Expand All @@ -47,23 +57,23 @@ public String getCode() {

@Override
@JacksonXmlProperty(isAttribute = true)
@Schema(description = "URI de l'Iris ",example = "http://id.insee.fr/geo/iris/b8c772de-9551-4f13-81c5-eca5bb0f2f7d")
@Schema(description = "URI de l'Iris ", example = "http://id.insee.fr/geo/iris/b8c772de-9551-4f13-81c5-eca5bb0f2f7d")
public String getUri() {
return uri;
}

@Override
@JacksonXmlProperty(localName = "Intitule")
@JsonProperty(value = "intitule")
@Schema(description = "Nom de l'Iris (avec article)",example = "Les Pérouses-Triangle d'Activités")
@Schema(description = "Nom de l'Iris (avec article)", example = "Les Pérouses-Triangle d'Activités")
public String getIntitule() {
return intitule;
}

@Override
@JacksonXmlProperty(localName = "IntituleSansArticle")
@JsonProperty(value = "intituleSansArticle")
@Schema(description = "Nom de l'Iris sans article",example = "Pérouses-Triangle d'Activité")
@Schema(description = "Nom de l'Iris sans article", example = "Pérouses-Triangle d'Activité")
public IntituleSansArticle getIntituleSansArticle() {
return intituleSansArticle;
}
Expand Down
Loading

0 comments on commit 76c36b4

Please sign in to comment.