diff --git a/src/main/java/org/gcube/application/geoportal/service/rest/Concessioni.java b/src/main/java/org/gcube/application/geoportal/service/rest/Concessioni.java index 3970bc2..02bf585 100644 --- a/src/main/java/org/gcube/application/geoportal/service/rest/Concessioni.java +++ b/src/main/java/org/gcube/application/geoportal/service/rest/Concessioni.java @@ -1,4 +1,4 @@ -package org.gcube.application.geoportal.service.rest; + package org.gcube.application.geoportal.service.rest; import java.util.Collection; @@ -10,6 +10,7 @@ import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response.Status; import org.gcube.application.geoportal.common.rest.InterfaceConstants; import org.gcube.application.geoportal.managers.ConcessioneManager; @@ -67,8 +68,10 @@ public class Concessioni { try { log.info("Loading Concessione by id {} ",id); Concessione toReturn=(Concessione) ConcessioneManager.getByID(Long.parseLong(id)); + if(toReturn==null) + throw new WebApplicationException("Concessione non trovata",Status.NOT_FOUND); log.debug("Loaded object {} ",toReturn); - return toReturn.asJson(); + return Serialization.write(toReturn); }catch(WebApplicationException e){ log.warn("Unable to serve request",e); throw e; @@ -87,7 +90,7 @@ public class Concessioni { Concessione conc=Serialization.read(toRegister, Concessione.class); ConcessioneManager manager=ManagerFactory.registerNew(conc); manager.commitSafely(false); - return manager.getRecord().asJson(); + return Serialization.write(manager.getRecord()); }catch(WebApplicationException e){ log.warn("Unable to serve request",e); throw e; @@ -134,7 +137,7 @@ public class Concessioni { // PublicationReport report=manager.commitSafely(false); Concessione c=manager.commit(false); - log.debug("Published "+c.asJson()); + log.debug("Published "+Serialization.write(c)); return c.validate().prettyPrint(); }catch(WebApplicationException e){ log.warn("Unable to serve request",e); @@ -156,7 +159,7 @@ public class Concessioni { log.debug("Found "+toReturn.size()+" elements.."); JSONArray array=new JSONArray(); for(Concessione found:toReturn) { - array.put(found.asJson()); + array.put(Serialization.write(found)); } return array.toString(); }catch(WebApplicationException e){ diff --git a/src/main/java/org/gcube/application/geoportal/service/utils/Serialization.java b/src/main/java/org/gcube/application/geoportal/service/utils/Serialization.java index d9317a2..66c9013 100644 --- a/src/main/java/org/gcube/application/geoportal/service/utils/Serialization.java +++ b/src/main/java/org/gcube/application/geoportal/service/utils/Serialization.java @@ -2,6 +2,14 @@ package org.gcube.application.geoportal.service.utils; import java.io.IOException; +import org.gcube.application.geoportal.model.Record; +import org.gcube.application.geoportal.model.concessioni.Concessione; +import org.gcube.application.geoportal.model.concessioni.LayerConcessione; +import org.gcube.application.geoportal.model.content.AssociatedContent; +import org.gcube.application.geoportal.model.content.OtherContent; +import org.gcube.application.geoportal.model.content.PersistedContent; +import org.gcube.application.geoportal.model.content.UploadedImage; + import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; @@ -14,13 +22,69 @@ public class Serialization { static { mapper=new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false); - mapper.registerModule(new JavaTimeModule()); + mapper.registerModule(new JavaTimeModule()); } public static T read(String jsonString,Class clazz) throws JsonProcessingException, IOException { return mapper.readerFor(clazz).readValue(jsonString); } + public static String write(Object toWrite) throws JsonProcessingException { - return mapper.writeValueAsString(toWrite); + if(toWrite instanceof Concessione) + detach((Concessione) toWrite); + + + + String toReturn= mapper.writeValueAsString(toWrite); + + if(toWrite instanceof Concessione) + reattach((Concessione) toWrite); + return toReturn; + } + + + + // Avoid infiniteLoop in JPA + private static void detach(Concessione c) { + if (c!=null) { + detach(c.getRelazioneScavo()); + detach(c.getPosizionamentoScavo()); + if(c.getPianteFineScavo()!=null) + c.getPianteFineScavo().forEach((LayerConcessione l)->{detach(l);}); + if(c.getImmaginiRappresentative()!=null) + c.getImmaginiRappresentative().forEach(((UploadedImage u)->{detach(u);})); + if(c.getGenericContent()!=null) + c.getGenericContent().forEach(((OtherContent u)->{detach(u);})); + } + } + + private static void detach(AssociatedContent a) { + if(a!=null) { + a.setRecord(null); + if(a.getActualContent()!=null) + a.getActualContent().forEach((PersistedContent p)->{p.setAssociated(null);}); + } + } + + + private static void reattach(Concessione c) { + if(c!=null) { + reattach(c.getRelazioneScavo(),c); + reattach(c.getPosizionamentoScavo(),c); + if(c.getPianteFineScavo()!=null) + c.getPianteFineScavo().forEach((LayerConcessione l)->{reattach(l,c);}); + if(c.getImmaginiRappresentative()!=null) + c.getImmaginiRappresentative().forEach(((UploadedImage u)->{reattach(u,c);})); + if(c.getGenericContent()!=null) + c.getGenericContent().forEach(((OtherContent u)->{reattach(u,c);})); + } + } + + private static void reattach(AssociatedContent a,Record r) { + if(a!=null) { + a.setRecord(r); + if(a.getActualContent()!=null) + a.getActualContent().forEach((PersistedContent p)->{p.setAssociated(a);}); + } } } diff --git a/src/test/java/org/gcube/application/geoportal/service/legacy/ConcessioniTest.java b/src/test/java/org/gcube/application/geoportal/service/legacy/ConcessioniTest.java index 735afcd..0685d14 100644 --- a/src/test/java/org/gcube/application/geoportal/service/legacy/ConcessioniTest.java +++ b/src/test/java/org/gcube/application/geoportal/service/legacy/ConcessioniTest.java @@ -9,6 +9,7 @@ import java.io.IOException; import java.util.Collection; import javax.persistence.EntityManagerFactory; +import javax.ws.rs.WebApplicationException; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Application; @@ -17,6 +18,7 @@ import javax.ws.rs.core.Response; import org.gcube.application.geoportal.common.rest.InterfaceConstants; import org.gcube.application.geoportal.common.utils.Files; +import org.gcube.application.geoportal.managers.AbstractRecordManager; import org.gcube.application.geoportal.model.concessioni.Concessione; import org.gcube.application.geoportal.model.concessioni.LayerConcessione; import org.gcube.application.geoportal.model.content.AssociatedContent; @@ -55,7 +57,9 @@ public class ConcessioniTest extends JerseyTest { @BeforeClass public static void init() { String scope="/gcube/devsec/devVRE"; - ImplementationProvider.get().setEmfProvider(new ScopedEMFProvider(){ + AbstractRecordManager.setDefaultProvider( + + new ScopedEMFProvider(){ @Override public EntityManagerFactory getFactory() { @@ -75,6 +79,18 @@ public class ConcessioniTest extends JerseyTest { } + @Test + public void readId() { + WebTarget target=target(InterfaceConstants.Methods.CONCESSIONI); + try{ + System.out.println(target.path("1").request(MediaType.APPLICATION_JSON).get(String.class)); + }catch(WebApplicationException e) { + if(e.getResponse().getStatus()==404) + System.out.println("Object not found"); + else throw e; + } + } + @Test public void list() throws JsonProcessingException, IOException{ WebTarget target=target(InterfaceConstants.Methods.CONCESSIONI); @@ -86,7 +102,7 @@ public class ConcessioniTest extends JerseyTest { for(Object o:coll) { System.out.println("Object class is "+o.getClass()); Concessione c=Serialization.read(o.toString(), Concessione.class); - System.out.println("Concessione is : "+c.asJson()); + System.out.println("Concessione is : "+Serialization.write(c)); } } @@ -112,7 +128,7 @@ public class ConcessioniTest extends JerseyTest { public void publishNew() throws IOException, RemoteBackendException, ConfigurationException { Concessione toCreate=TestModel.prepareEmptyConcessione(); Concessione registered = pushConcessione(toCreate); - System.out.println("Registered at "+registered.asJson()); + System.out.println("Registered at "+Serialization.write(registered)); Concessione fullTemplate=TestModel.prepareConcessione(); //Push Relazione @@ -138,7 +154,7 @@ public class ConcessioniTest extends JerseyTest { Concessione reloaded = getById(registered.getId()+""); - System.out.println("Goind to publish "+reloaded.asJson()); + System.out.println("Goind to publish "+Serialization.write(reloaded)); PublicationReport report=publish(registered.getId()+""); System.out.println("REPORT IS "+report.prettyPrint()+""); // System.out.println("Concessione is "+report.getTheRecord().asJson()); @@ -188,7 +204,7 @@ public class ConcessioniTest extends JerseyTest { private Concessione pushConcessione(Concessione c) throws com.fasterxml.jackson.core.JsonProcessingException, IOException { WebTarget target=target(InterfaceConstants.Methods.CONCESSIONI); - Response resp=target.request(MediaType.APPLICATION_JSON).put(Entity.entity(c.asJson(), MediaType.APPLICATION_JSON)); + Response resp=target.request(MediaType.APPLICATION_JSON).put(Entity.entity(Serialization.write(c), MediaType.APPLICATION_JSON)); String resString=resp.readEntity(String.class); System.out.println("Resp String is "+resString); Concessione registered=Serialization.read(resString, Concessione.class);