package org.gcube.application.cms.usecases; import com.fasterxml.jackson.core.JsonProcessingException; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.gcube.application.cms.custom.gna.concessioni.model.ProfiledConcessione; import org.gcube.application.cms.serialization.Serialization; import org.gcube.application.cms.tests.TokenSetter; import org.gcube.application.cms.usecases.legacyConcessioni.ConcessioniManagementUtils; import org.gcube.application.geoportal.common.model.configuration.Configuration; import org.gcube.application.geoportal.common.model.document.Project; import org.gcube.application.geoportal.common.model.document.access.Access; import org.gcube.application.geoportal.common.model.document.access.AccessPolicy; import org.gcube.application.geoportal.common.model.document.lifecycle.LifecycleInformation; import org.gcube.application.geoportal.common.model.legacy.*; import org.gcube.application.geoportal.common.model.rest.CreateRelationshipRequest; import org.gcube.application.geoportal.common.model.rest.QueryRequest; import org.gcube.application.geoportal.common.model.rest.StepExecutionRequest; 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.tests.GCubeTest; import java.io.File; import java.io.IOException; import java.rmi.RemoteException; import java.sql.SQLOutput; import java.time.Instant; import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; import java.util.regex.Matcher; 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, IOException { // read from imported folder File dir= new File("/Users/fabioisti/git/gcube-cms-suite/import1668778302348"); // select only cluster // dir = new File(dir,"cluster_1"); File errorDir=new File(dir,"errors_"+ Instant.now().toString()); Boolean pushProjects=true; // File dir= new File("test-data/test-packages/related_concessioni"); // File dir = new File("/Users/fabioisti/Documents/Work/GNA DATA/Bug_23378"); //String targetContext="/gcube/devsec/devVRE"; // String targetContext="/pred4s/preprod/preVRE"; Projects client=projects("profiledConcessioni").build();; Integer totalCount = 0; // Title - > Time ordered list ConcessioniManagementUtils.ImportFolder importFolder = ConcessioniManagementUtils.loadImportFolder(dir); Files.saveString(importFolder.sort(),new File(dir,"relationships.csv").toPath()); TokenSetter.set(GCubeTest.getContext()); if(!pushProjects){ System.out.println("PUSH PROJECTS FLAG IS FALSE.. CLOSING."); StringBuilder reportBuilder = new StringBuilder(); StringBuilder concReportBuilder = new StringBuilder(); importFolder.getRelationshipMap().forEach((s,l)->{ l.forEach(c->concReportBuilder.append(c.getReport().getStatus()+","+c.getReport().getWarningMessages()+","+c.getMongo_id()+","+c.getNome()+"\n")); try { // reportBuilder.append(getExisting(l.get(0),client).size()+","+s+"\n"); } catch (Throwable e) { log.error("Unable to get count for {} ",s,e); throw new RuntimeException(e); } }); Files.saveString(reportBuilder.toString(),new File(dir,"found.csv").toPath()); Files.saveString(concReportBuilder.toString(),new File(dir,"originalStatuses.csv").toPath()); System.exit(0); } // StorageUtils storage = new StorageUtils(); AtomicLong count = new AtomicLong(0); AtomicLong warnCount = new AtomicLong(0); AtomicLong errCount = new AtomicLong(0); ExecutorService service = Executors.newFixedThreadPool(1); long startProcess = System.currentTimeMillis(); importFolder.getRelationshipMap().forEach((s,l)->{ AtomicReference publish = new AtomicReference<>(true); AtomicReference delete = new AtomicReference<>(false); // Check if exists Concessione c = l.get(0); try { List existing= getExisting(c,client); if(existing.isEmpty()) log.info("Not Found {}",c.getNome()); else { // found projects, check status existing.forEach(project -> { if (!project.getLifecycleInformation().getLastOperationStatus().equals(LifecycleInformation.Status.OK)) delete.set(true); }); if(delete.get()){ log.debug("Deleting error set for {}",c.getNome()); for (Project project : existing) { client.deleteById(project.getId(),true); } }else publish.set(false); } }catch(NullPointerException e){} catch (Throwable t){throw new RuntimeException("Unexpected Exception while checking for "+c.getNome());} log.info("Project name {} publish : {}",s,publish); if(publish.get()) { String relationshipTarget = null; for (Concessione concessione : l) { String finalRelationshipTarget = relationshipTarget; CompletableFuture lastPublished = CompletableFuture.supplyAsync(new Supplier() { @Override public String get() { return publish(concessione, client, errCount, count, finalRelationshipTarget, errorDir); } }, service); try { relationshipTarget = lastPublished.get(); } catch (InterruptedException e) { throw new RuntimeException(e); } catch (ExecutionException e) { throw new RuntimeException(e); } } } }); while (!service.awaitTermination(1, TimeUnit.MINUTES)) { log.info("Waiting .. completed {}, out of {} ",count.get(),importFolder.getLoadedCount()); if(importFolder.getLoadedCount().get()==count.get()) service.shutdown(); } System.out.println("Completed "+count.get()+" [elapsedTime = "+(System.currentTimeMillis()-startProcess)/1000+" sec] [warn : "+warnCount.get()+", err : "+errCount.get()+"]"); Configuration conf = client.getConfiguration(); conf.getArchives().stream().forEach(archive -> { if (archive.getType().equals("DOCUMENT-STORE-COLLECTION")){ archive.forEach((s, o) ->{ System.out.println(s+"\t:\t"+o); }); } }); } private static String publish(Concessione c, Projects client, AtomicLong errCount, AtomicLong count, String relationshipTarget, File errorDir){ Project project = null; 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 = client.createNew(doc); // set Access Access toSetAccess = new Access(); toSetAccess.setPolicy(AccessPolicy.valueOf(c.getPolicy().toString())); toSetAccess.setLicense(c.getLicenzaID()); project = client.setAccessPolicy(project.getId(),toSetAccess); // 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(convertFiles(content)); req.setAccess(getAccess(rel)); 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(convertFiles(content)); req.setAccess(getAccess(img)); 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(convertFiles(content)); req.setAccess(getAccess(l)); 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 layerConcessione=c.getPianteFineScavo().get(i); List content=layerConcessione.getActualContent(); if(content!=null && !content.isEmpty()) { req = FileSets.build("$." + ProfiledConcessione.PIANTE_FINE_SCAVO+"["+i+"]", "fileset", "$." + ProfiledConcessione.PIANTE_FINE_SCAVO + "." + Field.CHILDREN + "[?(@.fileset)]"); req.addAll(convertFiles(content)); req.setAccess(getAccess(layerConcessione)); project = client.registerFileSet(project.getId(),req.getTheRequest()); } } } // Relationship if(relationshipTarget!=null){ CreateRelationshipRequest relReq = new CreateRelationshipRequest(); relReq.setProjectId(project.getId()); relReq.setRelationshipId("follows"); relReq.setTargetId(relationshipTarget); client.setRelation(relReq); } // Submit for review project = client.performStep(project.getId(),step()); System.out.println("Done "+c.getId()+" in "+(System.currentTimeMillis()-startTime)/1000+" sec"); } catch (Throwable throwable) { System.err.println(throwable); errCount.incrementAndGet(); String ser = null; File destFile=null; //if(relationshipTarget!=null) Files.saveString(); if(project!=null) { ser = org.gcube.application.cms.serialization.Serialization.write(project); destFile = new File(errorDir,"project_"+ project.getId()); }else{ ser = org.gcube.application.cms.serialization.Serialization.write(c); destFile = new File(errorDir,"conc_"+ c.getMongo_id()); } Files.saveString(ser, destFile.toPath()); } finally { count.incrementAndGet(); return project!=null? project.getId() : null; } } private static final List convertFiles(List content){ return content.stream(). filter(p -> p instanceof WorkspaceContent) .map(p -> new TempFile(null, ((WorkspaceContent) p).getLink(), ((WorkspaceContent) p).getName())) .collect(Collectors.toList()); } private static final Access getAccess(AssociatedContent content){ Access toReturn = new Access(); toReturn.setLicense(content.getLicenseID()); toReturn.setPolicy(AccessPolicy.valueOf(content.getPolicy().toString())); return toReturn; } private static final StepExecutionRequest step(){ StepExecutionRequest toReturn = new StepExecutionRequest(); toReturn.setStepID("SUBMIT-FOR-REVIEW"); return toReturn; } private static List getExisting(Concessione c,Projects client) throws RemoteException, JsonProcessingException, NullPointerException { try { QueryRequest req = new QueryRequest(); String queryString = String.format("{\"_theDocument.nome\" :{\"$eq\" : %1$s}}", quote(c.getNome())); log.debug("Query String is {}", queryString); req.setFilter(Document.parse(queryString)); AtomicInteger count = new AtomicInteger(0); StringBuilder msg = new StringBuilder(); ArrayList toReturn = new ArrayList<>(); client.query(req).forEachRemaining(p -> { Project proj = (Project) p; count.incrementAndGet(); toReturn.add(proj); msg.append(proj.getId() + ","); }); log.debug("Found {} for {}", count.get(), c.getNome()); return toReturn; }catch(Throwable t){ log.warn("ERROR while querying ",t); throw t; } } public static String quote(String string) { if(string!=null) // return "\""+string.replaceAll("\"","\"")+"\""; return "\""+string.replaceAll("\"",Matcher.quoteReplacement("\\\""))+"\""; else return "\"\""; // if (string == null || string.length() == 0) { // return "\"\""; // } // // char c = 0; // int i; // int len = string.length(); // StringBuilder sb = new StringBuilder(len + 4); // String t; // // sb.append('"'); // for (i = 0; i < len; i += 1) { // c = string.charAt(i); // switch (c) { // case '\\': // case '"': // sb.append('\\'); // sb.append(c); // break; // case '/': // // if (b == '<') { // sb.append('\\'); // // } // sb.append(c); // break; // case '\b': // sb.append("\\b"); // break; // case '\t': // sb.append("\\t"); // break; // case '\n': // sb.append("\\n"); // break; // case '\f': // sb.append("\\f"); // break; // case '\r': // sb.append("\\r"); // break; // default: // if (c < ' ') { // t = "000" + Integer.toHexString(c); // sb.append("\\u" + t.substring(t.length() - 4)); // } else { // sb.append(c); // } // } // } // sb.append('"'); // return sb.toString(); } }