package org.gcube.application.cms.usecases; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.gcube.application.cms.custom.gna.concessioni.model.ProfiledConcessione; import org.gcube.application.cms.tests.TokenSetter; import org.gcube.application.geoportal.client.utils.Serialization; import org.gcube.application.geoportal.common.model.document.Project; import org.gcube.application.geoportal.common.model.legacy.*; import org.gcube.application.geoportal.common.model.rest.TempFile; import org.gcube.application.geoportal.common.model.useCaseDescriptor.Field; import org.gcube.application.geoportal.common.rest.Projects; import org.gcube.application.geoportal.common.utils.FileSets; import org.gcube.application.geoportal.common.utils.Files; import org.gcube.application.geoportal.common.utils.StorageUtils; import org.gcube.common.storagehub.client.dsl.StorageHubClient; import java.io.File; import java.io.IOException; import java.net.URL; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; import static org.gcube.application.geoportal.client.plugins.GeoportalAbstractPlugin.projects; @Slf4j public class ExportConcessioniAsProjects { public static void main(String[] args) throws InterruptedException { // read from imported folder File dir= new File("/Users/fabioisti/git/gcube-cms-suite/import1652276569045"); String targetContext="/gcube/devsec/devVRE"; Projects client=projects("profiledConcessioni").build();; ArrayList found=new ArrayList<>(); for(File elementFolder:dir.listFiles()) for(File jsonFile:elementFolder.listFiles((dir1, name) -> {return name.endsWith(".json");})) try { log.info("Reading "+jsonFile.getAbsolutePath()); String json= Files.readFileAsString(jsonFile.getAbsolutePath(), Charset.defaultCharset()); found.add(Serialization.read(json,Concessione.class)); } catch (IOException e) { e.printStackTrace(); } System.out.println("Loaded "+found.size()+" elements from "+dir.getAbsolutePath()); TokenSetter.set(targetContext); // StorageUtils storage = new StorageUtils(); AtomicLong count = new AtomicLong(0); AtomicLong warnCount = new AtomicLong(0); AtomicLong errCount = new AtomicLong(0); ExecutorService service = Executors.newFixedThreadPool(3); long startProcess = System.currentTimeMillis(); found.forEach(c -> { service.submit(new Runnable(){ @Override public void run() { publish(c,client,errCount,count); } } ); }); while (!service.awaitTermination(1, TimeUnit.MINUTES)) { log.info("Waiting .. completed {}, out of {} ",count.get(),found.size()); if(found.size()==count.get()) service.shutdown(); } System.out.println("Completed "+count.get()+" [elapsedTime = "+(System.currentTimeMillis()-startProcess)/1000+" sec] [warn : "+warnCount.get()+", err : "+errCount.get()+"]"); } // public static List upload(List contents,StorageUtils storage) throws IOException { // ArrayList toReturn = new ArrayList(); // for (PersistedContent content : contents) // if (content instanceof WorkspaceContent) { // WorkspaceContent wc = (WorkspaceContent) content; // toReturn.add(storage.putOntoStorage(new URL(wc.getLink()).openStream(), wc.getName())); // } // return toReturn; // } private static void publish(Concessione c, Projects client, AtomicLong errCount,AtomicLong count){ try { long startTime = System.currentTimeMillis(); FileSets.RequestBuilder req=null; log.info("Using {} {}",c.getNome(),c.getMongo_id()); //Copy core fields Document doc=new Document(); doc.put(ProfiledConcessione.NOME,c.getNome()); doc.put(ProfiledConcessione.INTRODUZIONE,c.getIntroduzione()); doc.put(ProfiledConcessione.DESCRIZIONE_CONTENUTO,c.getDescrizioneContenuto()); doc.put(ProfiledConcessione.AUTHORS,c.getAuthors()); doc.put(ProfiledConcessione.CONTRIBUTORE,c.getContributore()); doc.put(ProfiledConcessione.TITOLARI,c.getTitolari()); doc.put(ProfiledConcessione.RESPONSABILE,c.getResponsabile()); doc.put(ProfiledConcessione.EDITORS,c.getEditore()); doc.put(ProfiledConcessione.FONTI_FINANZIAMENTO,c.getFontiFinanziamento()); doc.put(ProfiledConcessione.SOGGETTO,c.getSoggetto()); doc.put(ProfiledConcessione.RISORSE_CORRELATE,c.getRisorseCorrelate()); doc.put(ProfiledConcessione.DATA_INZIO_PROGETTO,c.getDataInizioProgetto()); doc.put(ProfiledConcessione.DATA_FINE_PROGETTO,c.getDataFineProgetto()); doc.put(ProfiledConcessione.TITOLARE_LICENZA,c.getTitolareLicenza()); doc.put(ProfiledConcessione.TITOLARE_COPYRIGHT,c.getTitolareCopyright()); doc.put(ProfiledConcessione.PAROLE_CHIAVE_LIBERE,c.getParoleChiaveLibere()); doc.put(ProfiledConcessione.PAREOLE_CHIAVE_ICCD,c.getParoleChiaveICCD()); // CREATE Project Project project = client.createNew(doc); // Relazione if(c.getRelazioneScavo()!=null) { RelazioneScavo rel=c.getRelazioneScavo(); Document relDoc= new Document(); relDoc.put(ProfiledConcessione.Sections.TITOLO,rel.getTitolo()); relDoc.put(ProfiledConcessione.Relazione.RESPONSABILI,rel.getResponsabili()); relDoc.put(ProfiledConcessione.SOGGETTO,rel.getSoggetto()); Document updated =project.getTheDocument(); updated.put(ProfiledConcessione.RELAZIONE_SCAVO,relDoc); project = client.updateDocument(project.getId(),updated); List content=rel.getActualContent(); if(content!=null && !content.isEmpty()) { req = FileSets.build("$." + ProfiledConcessione.RELAZIONE_SCAVO, "fileset", "$." + ProfiledConcessione.RELAZIONE_SCAVO + "." + Field.CHILDREN + "[?(@.fileset)]"); req.addAll(content.stream(). filter(p -> p instanceof WorkspaceContent) .map(p -> new TempFile(null, ((WorkspaceContent) p).getLink(), ((WorkspaceContent) p).getName())) .collect(Collectors.toList())); project = client.registerFileSet(project.getId(),req.getTheRequest()); } // upload fileset } if(c.getAbstractRelazione()!=null) { AbstractRelazione abs=c.getAbstractRelazione(); Document absDoc= new Document(); absDoc.put(ProfiledConcessione.Sections.TITOLO,abs.getTitolo()); absDoc.put(ProfiledConcessione.AbstractRelazione.ABSTRACT_ENG,abs.getAbstractEng()); absDoc.put(ProfiledConcessione.AbstractRelazione.ABSTRACT_ITA,abs.getAbstractIta()); Document updated =project.getTheDocument(); updated.put(ProfiledConcessione.ABSTRACT_RELAZIONE,absDoc); project = client.updateDocument(project.getId(),updated); //TODO ask Fra about mapping // list persited content -> absIta, absEng // List content=abs.getActualContent(); // if(content!=null && !content.isEmpty()) { // req = FileSets.build("$." + ProfiledConcessione.RELAZIONE_SCAVO, "fileset", // "$." + ProfiledConcessione.RELAZIONE_SCAVO + "." + Field.CHILDREN // + "[?(@.fileset)]"); // content.forEach(uploader); // project = client.registerFileSet(project.getId(),req.getTheRequest()); // } } //Immagini rappresentative if(c.getImmaginiRappresentative()!=null){ List imgs=new ArrayList<>(); for (int i = 0; i < c.getImmaginiRappresentative().size(); i++) { UploadedImage img=c.getImmaginiRappresentative().get(i); Document imgDoc=new Document(); imgDoc.put(ProfiledConcessione.Sections.TITOLO,img.getTitolo()); imgDoc.put(ProfiledConcessione.Immagini.DIDASCALIA,img.getDidascalia()); imgDoc.put(ProfiledConcessione.Relazione.RESPONSABILI,img.getResponsabili()); imgDoc.put(ProfiledConcessione.SOGGETTO,img.getSoggetto()); imgs.add(imgDoc); } Document updated =project.getTheDocument(); updated.put(ProfiledConcessione.IMMAGINI_RAPPRESENTATIVE,imgs); project = client.updateDocument(project.getId(),updated); // FileSets for (int i = 0; i < c.getImmaginiRappresentative().size(); i++) { UploadedImage img=c.getImmaginiRappresentative().get(i); List content=img.getActualContent(); if(content!=null && !content.isEmpty()) { req = FileSets.build("$." + ProfiledConcessione.IMMAGINI_RAPPRESENTATIVE+"["+i+"]", "fileset", "$." + ProfiledConcessione.IMMAGINI_RAPPRESENTATIVE + "." + Field.CHILDREN + "[?(@.fileset)]"); req.addAll(content.stream(). filter(p -> p instanceof WorkspaceContent) .map(p -> new TempFile(null, ((WorkspaceContent) p).getLink(), ((WorkspaceContent) p).getName())) .collect(Collectors.toList())); project = client.registerFileSet(project.getId(),req.getTheRequest()); } } } // POS if(c.getPosizionamentoScavo()!=null) { LayerConcessione l=c.getPosizionamentoScavo(); Document lDoc= new Document(); lDoc.put(ProfiledConcessione.Sections.TITOLO,l.getTitolo()); lDoc.put(ProfiledConcessione.RESPONSABILE,l.getResponsabile()); lDoc.put(ProfiledConcessione.AUTHORS,l.getAuthors()); lDoc.put(ProfiledConcessione.PAREOLE_CHIAVE_ICCD,l.getParoleChiaveICCD()); lDoc.put(ProfiledConcessione.PAROLE_CHIAVE_LIBERE,l.getParoleChiaveLibere()); lDoc.put(ProfiledConcessione.Layers.TOPIC,l.getTopicCategory()); lDoc.put(ProfiledConcessione.Layers.SUB_TOPIC,l.getSubTopic()); lDoc.put(ProfiledConcessione.Layers.METODO_RACCOLTA,l.getMetodoRaccoltaDati()); lDoc.put(ProfiledConcessione.Layers.SCALA_ACQUISIZIONE,l.getScalaAcquisizione()); lDoc.put(ProfiledConcessione.Layers.VALUTAZIONE_QUALITA,l.getValutazioneQualita()); lDoc.put(ProfiledConcessione.Sections.ABSTRACT,l.getAbstractSection()); Document updated =project.getTheDocument(); updated.put(ProfiledConcessione.POSIZIONAMENTO_SCAVO,lDoc); project = client.updateDocument(project.getId(),updated); List content=l.getActualContent(); if(content!=null && !content.isEmpty()) { req = FileSets.build("$." + ProfiledConcessione.POSIZIONAMENTO_SCAVO, "fileset", "$." + ProfiledConcessione.POSIZIONAMENTO_SCAVO + "." + Field.CHILDREN + "[?(@.fileset)]"); req.addAll(content.stream(). filter(p -> p instanceof WorkspaceContent) .map(p -> new TempFile(null, ((WorkspaceContent) p).getLink(), ((WorkspaceContent) p).getName())) .collect(Collectors.toList())); project = client.registerFileSet(project.getId(),req.getTheRequest()); } // upload fileset } // Piante if(c.getPianteFineScavo()!=null){ List piante=new ArrayList<>(); for (int i = 0; i < c.getPianteFineScavo().size(); i++) { LayerConcessione l=c.getPianteFineScavo().get(i); Document lDoc= new Document(); lDoc.put(ProfiledConcessione.Sections.TITOLO,l.getTitolo()); lDoc.put(ProfiledConcessione.RESPONSABILE,l.getResponsabile()); lDoc.put(ProfiledConcessione.AUTHORS,l.getAuthors()); lDoc.put(ProfiledConcessione.PAREOLE_CHIAVE_ICCD,l.getParoleChiaveICCD()); lDoc.put(ProfiledConcessione.PAROLE_CHIAVE_LIBERE,l.getParoleChiaveLibere()); lDoc.put(ProfiledConcessione.Layers.TOPIC,l.getTopicCategory()); lDoc.put(ProfiledConcessione.Layers.SUB_TOPIC,l.getSubTopic()); lDoc.put(ProfiledConcessione.Layers.METODO_RACCOLTA,l.getMetodoRaccoltaDati()); lDoc.put(ProfiledConcessione.Layers.SCALA_ACQUISIZIONE,l.getScalaAcquisizione()); lDoc.put(ProfiledConcessione.Layers.VALUTAZIONE_QUALITA,l.getValutazioneQualita()); lDoc.put(ProfiledConcessione.Sections.ABSTRACT,l.getAbstractSection()); piante.add(lDoc); } Document updated =project.getTheDocument(); updated.put(ProfiledConcessione.PIANTE_FINE_SCAVO,piante); project = client.updateDocument(project.getId(),updated); // FileSets for (int i = 0; i < c.getPianteFineScavo().size(); i++) { LayerConcessione img=c.getPianteFineScavo().get(i); List content=img.getActualContent(); if(content!=null && !content.isEmpty()) { req = FileSets.build("$." + ProfiledConcessione.PIANTE_FINE_SCAVO+"["+i+"]", "fileset", "$." + ProfiledConcessione.PIANTE_FINE_SCAVO + "." + Field.CHILDREN + "[?(@.fileset)]"); req.addAll(content.stream(). filter(p -> p instanceof WorkspaceContent) .map(p -> new TempFile(null, ((WorkspaceContent) p).getLink(), ((WorkspaceContent) p).getName())) .collect(Collectors.toList())); project = client.registerFileSet(project.getId(),req.getTheRequest()); } } } System.out.println("Done "+c.getId()+" in "+(System.currentTimeMillis()-startTime)/1000+" sec"); } catch (Throwable throwable) { System.err.println(throwable); errCount.incrementAndGet(); } finally { count.incrementAndGet(); } } }