#24754 first patched version
This commit is contained in:
parent
ed3fe284c1
commit
23dae96c83
|
@ -1,5 +1,8 @@
|
||||||
# Changelog for org.gcube.application.cms.concessioni-lifecycle
|
# Changelog for org.gcube.application.cms.concessioni-lifecycle
|
||||||
|
|
||||||
|
## [v1.1.0-SNAPSHOT] - 2023-03-13
|
||||||
|
- [#24754] Fixed hide/show project ids on the latest node of the relation chain
|
||||||
|
|
||||||
## [v1.0.4] - 2023-03-06
|
## [v1.0.4] - 2023-03-06
|
||||||
- [#24702] Fixed the default-lc-managers dependency
|
- [#24702] Fixed the default-lc-managers dependency
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>concessioni-lifecycle</artifactId>
|
<artifactId>concessioni-lifecycle</artifactId>
|
||||||
<version>1.0.4</version>
|
<version>1.1.0-SNAPSHOT</version>
|
||||||
<name>GNA Concessioni Lifecycle</name>
|
<name>GNA Concessioni Lifecycle</name>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
package org.gcube.application.cms.concessioni.plugins;
|
package org.gcube.application.cms.concessioni.plugins;
|
||||||
|
|
||||||
import com.vdurmont.semver4j.Semver;
|
import java.io.IOException;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import org.bson.Document;
|
import org.bson.Document;
|
||||||
import org.gcube.application.cms.custom.gna.concessioni.model.ProfiledConcessione;
|
import org.gcube.application.cms.custom.gna.concessioni.model.ProfiledConcessione;
|
||||||
import org.gcube.application.cms.implementations.ImplementationProvider;
|
import org.gcube.application.cms.implementations.ImplementationProvider;
|
||||||
|
@ -15,219 +19,382 @@ import org.gcube.application.cms.plugins.requests.IndexDocumentRequest;
|
||||||
import org.gcube.application.cms.serialization.Serialization;
|
import org.gcube.application.cms.serialization.Serialization;
|
||||||
import org.gcube.application.geoportal.common.model.JSONPathWrapper;
|
import org.gcube.application.geoportal.common.model.JSONPathWrapper;
|
||||||
import org.gcube.application.geoportal.common.model.document.Project;
|
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.relationships.Relationship;
|
||||||
import org.gcube.application.geoportal.common.model.document.access.AccessPolicy;
|
|
||||||
import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFileSet;
|
|
||||||
import org.gcube.application.geoportal.common.model.document.relationships.RelationshipNavigationObject;
|
import org.gcube.application.geoportal.common.model.document.relationships.RelationshipNavigationObject;
|
||||||
import org.gcube.application.geoportal.common.model.legacy.report.ConstraintCheck;
|
import org.gcube.application.geoportal.common.model.legacy.report.ConstraintCheck;
|
||||||
|
|
||||||
import java.io.IOException;
|
import com.vdurmont.semver4j.Semver;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
/** Overrides 3 Phases lifecycle with override of default values
|
/**
|
||||||
|
* Overrides 3 Phases lifecycle with override of default values
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class ConcessioniLifeCycleManager extends Default3PhaseManager implements LifecycleManager {
|
public class ConcessioniLifeCycleManager extends Default3PhaseManager implements LifecycleManager {
|
||||||
|
|
||||||
|
private static final String FOLLOWS = "follows";
|
||||||
|
private static final String PRECEDES = "precedes";
|
||||||
|
|
||||||
private static final String FOLLOWS="follows";
|
public ConcessioniLifeCycleManager() {
|
||||||
private static final String PRECEDES="precedes";
|
DESCRIPTOR.setId("GNA-CONCESSIONI-LC");
|
||||||
|
DESCRIPTOR.setDescription(
|
||||||
|
"GNA Concessioni. This plugin supports custom lifecycle management for the GNA Concessioni UseCase.");
|
||||||
|
DESCRIPTOR.setVersion(new Semver("1.0.0"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EventExecutionReport setDefault(EventExecutionReport currentReport) {
|
||||||
|
EventExecutionReport report = super.setDefault(currentReport);
|
||||||
|
try {
|
||||||
|
report.setResultingDocument(setDefaults(report.getTheRequest().getDocument()).getTheDocument());
|
||||||
|
} catch (Throwable t) {
|
||||||
|
log.error("Unable to evaluate defaults for concessione "
|
||||||
|
+ currentReport.getTheRequest().getDocument().getId(), t);
|
||||||
|
log.debug("Object was {} ", report.getTheRequest().getDocument());
|
||||||
|
report.setStatus(Report.Status.ERROR);
|
||||||
|
report.getMessages().add("Unable to evaluate defaults : " + t.getMessage());
|
||||||
|
}
|
||||||
|
return report;
|
||||||
|
}
|
||||||
|
|
||||||
public ConcessioniLifeCycleManager() {
|
// STATIC ROUTINES
|
||||||
DESCRIPTOR.setId("GNA-CONCESSIONI-LC");
|
|
||||||
DESCRIPTOR.setDescription("GNA Concessioni. This plugin supports custom lifecycle management for the GNA Concessioni UseCase.");
|
|
||||||
DESCRIPTOR.setVersion(new Semver("1.0.0"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
static final Project setDefaults(Project document) throws IOException {
|
||||||
public EventExecutionReport setDefault(EventExecutionReport currentReport) {
|
log.info("Concessione ID {}, setting defaults..", document.getId());
|
||||||
EventExecutionReport report = super.setDefault(currentReport);
|
log.debug("Full concessione is {}", document);
|
||||||
try{
|
ProfiledConcessione c = Serialization.convert(document, ProfiledConcessione.class);
|
||||||
report.setResultingDocument(setDefaults(report.getTheRequest().getDocument()).getTheDocument());
|
Document doc = c.getTheDocument();
|
||||||
}catch (Throwable t){
|
doc.putIfAbsent(ProfiledConcessione.SOGGETTO, new String[] { "Research Excavation", "Archaeology" });
|
||||||
log.error("Unable to evaluate defaults for concessione "+currentReport.getTheRequest().getDocument().getId(),t);
|
|
||||||
log.debug("Object was {} ",report.getTheRequest().getDocument());
|
|
||||||
report.setStatus(Report.Status.ERROR );
|
|
||||||
report.getMessages().add("Unable to evaluate defaults : "+t.getMessage());
|
|
||||||
}
|
|
||||||
return report;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
doc.putIfAbsent(ProfiledConcessione.DESCRIZIONE_CONTENUTO,
|
||||||
|
"Relazione di fine scavo e relativo abstract; selezione di immagini rappresentative;"
|
||||||
|
+ " posizionamento topografico dell'area indagata, pianta di fine scavo.");
|
||||||
|
|
||||||
// STATIC ROUTINES
|
// Super Section
|
||||||
|
// TODO read from UCD
|
||||||
|
c.getInfo().getAccess()
|
||||||
|
.setLicense(ConstraintCheck.defaultFor(c.getInfo().getAccess().getLicense(), "CC0-1.0").evaluate());
|
||||||
|
|
||||||
static final Project setDefaults(Project document) throws IOException {
|
// RELAZIONE
|
||||||
log.info("Concessione ID {}, setting defaults..",document.getId());
|
Document rel = doc.containsKey(ProfiledConcessione.RELAZIONE_SCAVO)
|
||||||
log.debug("Full concessione is {}",document);
|
? Serialization.convert(doc.get(ProfiledConcessione.RELAZIONE_SCAVO), Document.class)
|
||||||
ProfiledConcessione c=Serialization.convert(document,ProfiledConcessione.class);
|
: new Document();
|
||||||
Document doc=c.getTheDocument();
|
log.debug("Concessione {}, managing relazione {}", document.getId(), rel);
|
||||||
doc.putIfAbsent(ProfiledConcessione.SOGGETTO,new String[]{"Research Excavation","Archaeology"});
|
rel.putIfAbsent(ProfiledConcessione.Sections.TITOLO,
|
||||||
|
doc.getString(ProfiledConcessione.NOME) + " relazione di scavo");
|
||||||
|
rel.putIfAbsent(ProfiledConcessione.SOGGETTO, doc.get(ProfiledConcessione.SOGGETTO));
|
||||||
|
doc.put(ProfiledConcessione.RELAZIONE_SCAVO, rel);
|
||||||
|
|
||||||
doc.putIfAbsent(ProfiledConcessione.DESCRIZIONE_CONTENUTO,"Relazione di fine scavo e relativo abstract; selezione di immagini rappresentative;"
|
// ABSTRACT Relazione
|
||||||
+ " posizionamento topografico dell'area indagata, pianta di fine scavo.");
|
Document abs = doc.containsKey(ProfiledConcessione.ABSTRACT_RELAZIONE)
|
||||||
|
? Serialization.convert(doc.get(ProfiledConcessione.ABSTRACT_RELAZIONE), Document.class)
|
||||||
|
: new Document();
|
||||||
|
log.debug("Concessione {}, managing abstract relazione {}", document.getId(), abs);
|
||||||
|
abs.putIfAbsent(ProfiledConcessione.Sections.TITOLO,
|
||||||
|
doc.getString(ProfiledConcessione.NOME) + " abstract relazione di scavo");
|
||||||
|
doc.put(ProfiledConcessione.ABSTRACT_RELAZIONE, abs);
|
||||||
|
|
||||||
// Super Section
|
// Posizionamento scavo
|
||||||
// TODO read from UCD
|
if (doc.containsKey(ProfiledConcessione.POSIZIONAMENTO_SCAVO)) {
|
||||||
c.getInfo().getAccess().setLicense(
|
Document pos = Serialization.convert(doc.get(ProfiledConcessione.POSIZIONAMENTO_SCAVO), Document.class);
|
||||||
ConstraintCheck.defaultFor(c.getInfo().getAccess().getLicense(), "CC0-1.0").evaluate());
|
log.debug("Concessione {}, managing posizionamento scavo {}", document.getId(), pos);
|
||||||
|
pos.putIfAbsent(ProfiledConcessione.Sections.TITOLO,
|
||||||
|
doc.getString(ProfiledConcessione.NOME) + " posizionamento scavo");
|
||||||
|
pos.putIfAbsent(ProfiledConcessione.Sections.ABSTRACT,
|
||||||
|
"Posizionamento topografico georeferenziato dell’area interessata dalle indagini");
|
||||||
|
pos.putIfAbsent(ProfiledConcessione.Layers.TOPIC, "Society");
|
||||||
|
pos.putIfAbsent(ProfiledConcessione.Layers.SUB_TOPIC, "Archeology");
|
||||||
|
|
||||||
|
pos.putIfAbsent(ProfiledConcessione.PAROLE_CHIAVE_LIBERE,
|
||||||
|
doc.get(ProfiledConcessione.PAROLE_CHIAVE_LIBERE));
|
||||||
|
pos.putIfAbsent(ProfiledConcessione.PAREOLE_CHIAVE_ICCD, doc.get(ProfiledConcessione.PAREOLE_CHIAVE_ICCD));
|
||||||
|
|
||||||
|
// BBOX in registered filesets
|
||||||
|
|
||||||
//RELAZIONE
|
pos.put(ProfiledConcessione.RESPONSABILE, doc.get(ProfiledConcessione.RESPONSABILE));
|
||||||
Document rel = doc.containsKey(ProfiledConcessione.RELAZIONE_SCAVO)?
|
doc.put(ProfiledConcessione.POSIZIONAMENTO_SCAVO, pos);
|
||||||
Serialization.convert(doc.get(ProfiledConcessione.RELAZIONE_SCAVO), Document.class):new Document();
|
}
|
||||||
log.debug("Concessione {}, managing relazione {}",document.getId(),rel);
|
|
||||||
rel.putIfAbsent(ProfiledConcessione.Sections.TITOLO,doc.getString(ProfiledConcessione.NOME)+" relazione di scavo");
|
|
||||||
rel.putIfAbsent(ProfiledConcessione.SOGGETTO,doc.get(ProfiledConcessione.SOGGETTO));
|
|
||||||
doc.put(ProfiledConcessione.RELAZIONE_SCAVO,rel);
|
|
||||||
|
|
||||||
|
// IMMAGINI RAPPRESENTATIVE
|
||||||
|
|
||||||
//ABSTRACT Relazione
|
JSONPathWrapper wrapper = new JSONPathWrapper(Serialization.write(doc));
|
||||||
Document abs=doc.containsKey(ProfiledConcessione.ABSTRACT_RELAZIONE)?
|
if (doc.containsKey(ProfiledConcessione.IMMAGINI_RAPPRESENTATIVE)) {
|
||||||
Serialization.convert(doc.get(ProfiledConcessione.ABSTRACT_RELAZIONE), Document.class):new Document();
|
List imgs = wrapper.getByPath("$." + ProfiledConcessione.IMMAGINI_RAPPRESENTATIVE, List.class).get(0);
|
||||||
log.debug("Concessione {}, managing abstract relazione {}",document.getId(),abs);
|
log.debug("Concessione {}, found imgs {}", document.getId(), imgs.size());
|
||||||
abs.putIfAbsent(ProfiledConcessione.Sections.TITOLO,doc.getString(ProfiledConcessione.NOME)+" abstract relazione di scavo");
|
for (int i = 0; i < imgs.size(); i++) {
|
||||||
doc.put(ProfiledConcessione.ABSTRACT_RELAZIONE,abs);
|
Document imgDoc = Serialization.asDocument(imgs.get(i));
|
||||||
|
imgDoc.putIfAbsent(ProfiledConcessione.SOGGETTO, doc.get(ProfiledConcessione.SOGGETTO));
|
||||||
|
|
||||||
|
wrapper.setElement("$." + ProfiledConcessione.IMMAGINI_RAPPRESENTATIVE + "[" + i + "]", imgDoc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//Posizionamento scavo
|
// Layers
|
||||||
if(doc.containsKey(ProfiledConcessione.POSIZIONAMENTO_SCAVO)){
|
if (doc.containsKey(ProfiledConcessione.PIANTE_FINE_SCAVO)) {
|
||||||
Document pos = Serialization.convert(doc.get(ProfiledConcessione.POSIZIONAMENTO_SCAVO), Document.class);
|
List piante = wrapper.getByPath("$." + ProfiledConcessione.PIANTE_FINE_SCAVO, List.class).get(0);
|
||||||
log.debug("Concessione {}, managing posizionamento scavo {}",document.getId(),pos);
|
log.debug("Concessione {}, found piante {}", document.getId(), piante.size());
|
||||||
pos.putIfAbsent(ProfiledConcessione.Sections.TITOLO,doc.getString(ProfiledConcessione.NOME)+" posizionamento scavo");
|
for (int i = 0; i < piante.size(); i++) {
|
||||||
pos.putIfAbsent(ProfiledConcessione.Sections.ABSTRACT,"Posizionamento topografico georeferenziato dell’area interessata dalle indagini");
|
Document piantaDoc = Serialization.asDocument(piante.get(i));
|
||||||
pos.putIfAbsent(ProfiledConcessione.Layers.TOPIC,"Society");
|
log.debug("Concessione {}, managing pianta {}", document.getId(), piantaDoc);
|
||||||
pos.putIfAbsent(ProfiledConcessione.Layers.SUB_TOPIC,"Archeology");
|
piantaDoc.putIfAbsent(ProfiledConcessione.Sections.TITOLO,
|
||||||
|
doc.getString(ProfiledConcessione.NOME) + " pianta fine scavo");
|
||||||
|
piantaDoc.putIfAbsent(ProfiledConcessione.Sections.ABSTRACT,
|
||||||
|
"Planimetria georeferenziata dell'area indagata al termine delle attività");
|
||||||
|
piantaDoc.putIfAbsent(ProfiledConcessione.Layers.TOPIC, "Society");
|
||||||
|
piantaDoc.putIfAbsent(ProfiledConcessione.Layers.SUB_TOPIC, "Archeology");
|
||||||
|
|
||||||
pos.putIfAbsent(ProfiledConcessione.PAROLE_CHIAVE_LIBERE,doc.get(ProfiledConcessione.PAROLE_CHIAVE_LIBERE));
|
piantaDoc.putIfAbsent(ProfiledConcessione.PAROLE_CHIAVE_LIBERE,
|
||||||
pos.putIfAbsent(ProfiledConcessione.PAREOLE_CHIAVE_ICCD,doc.get(ProfiledConcessione.PAREOLE_CHIAVE_ICCD));
|
doc.get(ProfiledConcessione.PAROLE_CHIAVE_LIBERE));
|
||||||
|
piantaDoc.putIfAbsent(ProfiledConcessione.PAREOLE_CHIAVE_ICCD,
|
||||||
|
doc.get(ProfiledConcessione.PAREOLE_CHIAVE_ICCD));
|
||||||
|
|
||||||
// BBOX in registered filesets
|
// BBOX in registered filesets
|
||||||
|
|
||||||
pos.put(ProfiledConcessione.RESPONSABILE,doc.get(ProfiledConcessione.RESPONSABILE));
|
piantaDoc.put(ProfiledConcessione.RESPONSABILE, doc.get(ProfiledConcessione.RESPONSABILE));
|
||||||
doc.put(ProfiledConcessione.POSIZIONAMENTO_SCAVO,pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
//IMMAGINI RAPPRESENTATIVE
|
wrapper.setElement("$." + ProfiledConcessione.PIANTE_FINE_SCAVO + "[" + i + "]", piantaDoc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
JSONPathWrapper wrapper=new JSONPathWrapper(Serialization.write(doc));
|
c.setTheDocument(Serialization.read(wrapper.getValueCTX().jsonString(), Document.class));
|
||||||
if(doc.containsKey(ProfiledConcessione.IMMAGINI_RAPPRESENTATIVE)) {
|
return c;
|
||||||
List imgs=wrapper.getByPath("$." + ProfiledConcessione.IMMAGINI_RAPPRESENTATIVE, List.class).get(0);
|
}
|
||||||
log.debug("Concessione {}, found imgs {}",document.getId(),imgs.size());
|
|
||||||
for (int i = 0; i <imgs.size() ; i++) {
|
|
||||||
Document imgDoc=Serialization.asDocument(imgs.get(i));
|
|
||||||
imgDoc.putIfAbsent(ProfiledConcessione.SOGGETTO,doc.get(ProfiledConcessione.SOGGETTO));
|
|
||||||
|
|
||||||
wrapper.setElement("$."+ProfiledConcessione.IMMAGINI_RAPPRESENTATIVE+"["+i+"]",imgDoc);
|
/**
|
||||||
}
|
* OLD METHOD
|
||||||
}
|
*
|
||||||
|
* @param request
|
||||||
|
* @return
|
||||||
|
* @throws IndexingException
|
||||||
|
*/
|
||||||
|
protected Document evaluateAdditionalIndexParameters2(IndexDocumentRequest request) throws IndexingException {
|
||||||
|
Document toReturn = super.evaluateAdditionalIndexParameters(request);
|
||||||
|
if (toReturn == null)
|
||||||
|
toReturn = new Document();
|
||||||
|
Project indexingProject = request.getDocument();
|
||||||
|
|
||||||
// Layers
|
// Evaluate to display project IDs
|
||||||
if(doc.containsKey(ProfiledConcessione.PIANTE_FINE_SCAVO)) {
|
log.info("Evaluating Last ID in relationship chain. Current Concessione ID is {}", indexingProject.getId());
|
||||||
List piante=wrapper.getByPath("$." + ProfiledConcessione.PIANTE_FINE_SCAVO, List.class).get(0);
|
try {
|
||||||
log.debug("Concessione {}, found piante {}",document.getId(),piante.size());
|
ArrayList<Project> projects = new ArrayList<>();
|
||||||
for (int i = 0; i <piante.size() ; i++) {
|
ProjectAccess access = ImplementationProvider.get().getProvidedObjectByClass(ProjectAccess.class);
|
||||||
Document piantaDoc=Serialization.asDocument(piante.get(i));
|
// get Last ID in relation chain
|
||||||
log.debug("Concessione {}, managing pianta {}",document.getId(),piantaDoc);
|
projects.add(indexingProject);
|
||||||
piantaDoc.putIfAbsent(ProfiledConcessione.Sections.TITOLO,doc.getString(ProfiledConcessione.NOME)+" pianta fine scavo");
|
if (!indexingProject.getRelationshipsByName(PRECEDES).isEmpty())
|
||||||
piantaDoc.putIfAbsent(ProfiledConcessione.Sections.ABSTRACT,"Planimetria georeferenziata dell'area indagata al termine delle attività");
|
scanRelation(projects, access
|
||||||
piantaDoc.putIfAbsent(ProfiledConcessione.Layers.TOPIC,"Society");
|
.getRelations(indexingProject.getProfileID(), indexingProject.getId(), PRECEDES, true).get(0),
|
||||||
piantaDoc.putIfAbsent(ProfiledConcessione.Layers.SUB_TOPIC,"Archeology");
|
false);
|
||||||
|
if (!indexingProject.getRelationshipsByName(FOLLOWS).isEmpty())
|
||||||
|
scanRelation(projects, access
|
||||||
|
.getRelations(indexingProject.getProfileID(), indexingProject.getId(), FOLLOWS, true).get(0),
|
||||||
|
false);
|
||||||
|
|
||||||
piantaDoc.putIfAbsent(ProfiledConcessione.PAROLE_CHIAVE_LIBERE,doc.get(ProfiledConcessione.PAROLE_CHIAVE_LIBERE));
|
log.debug("Produced full chain [size : {}] from {}, evaluating last available for PHASE {} ",
|
||||||
piantaDoc.putIfAbsent(ProfiledConcessione.PAREOLE_CHIAVE_ICCD,doc.get(ProfiledConcessione.PAREOLE_CHIAVE_ICCD));
|
projects.size(), indexingProject.getId(), indexingProject.getLifecycleInformation().getPhase());
|
||||||
|
|
||||||
// BBOX in registered filesets
|
List<String> toDisplayId = new ArrayList<>();
|
||||||
|
List<String> toHideIds = new ArrayList<>();
|
||||||
|
|
||||||
piantaDoc.put(ProfiledConcessione.RESPONSABILE,doc.get(ProfiledConcessione.RESPONSABILE));
|
log.trace("Checking from LAST.. ");
|
||||||
|
// Projects is time -ordered so we scan from last
|
||||||
|
for (int i = projects.size() - 1; i >= 0; i--) {
|
||||||
|
Project p = projects.get(i);
|
||||||
|
log.debug("Currently checking {} : {}", p.getId(), p.getTheDocument().get("nome"));
|
||||||
|
if (!toDisplayId.isEmpty())
|
||||||
|
toHideIds.add(p.getId());
|
||||||
|
else {
|
||||||
|
// Still need to find candidate for displaying feature
|
||||||
|
|
||||||
wrapper.setElement("$."+ProfiledConcessione.PIANTE_FINE_SCAVO+"["+i+"]",piantaDoc);
|
// Our currently indexing project is always a good candidate
|
||||||
}
|
if (p.getId().equals(indexingProject.getId()))
|
||||||
}
|
toDisplayId.add(p.getId());
|
||||||
|
// We check PHASE in order to skip projects not yet in the PHASE we are indexing
|
||||||
|
else
|
||||||
|
switch (indexingProject.getLifecycleInformation().getPhase()) {
|
||||||
|
case Phases.PENDING_APPROVAL: {
|
||||||
|
if ((p.getLifecycleInformation().getPhase().equals(Phases.PENDING_APPROVAL)
|
||||||
|
|| p.getLifecycleInformation().getPhase().equals(Phases.PUBLISHED)))
|
||||||
|
toDisplayId.add(p.getId());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Phases.PUBLISHED: {
|
||||||
|
if (p.getLifecycleInformation().getPhase().equals(Phases.PUBLISHED))
|
||||||
|
toDisplayId.add(p.getId());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
c.setTheDocument(Serialization.read(wrapper.getValueCTX().jsonString(),Document.class));
|
if (!toDisplayId.isEmpty())
|
||||||
return c;
|
log.debug("Found last concessioni candidate for displaying. ID {}, PHASE {} ", toDisplayId,
|
||||||
}
|
p.getLifecycleInformation().getPhase());
|
||||||
|
else
|
||||||
|
toHideIds.add(p.getId()); // Still not found
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toReturn.put("_toHideIds", toHideIds);
|
||||||
|
toReturn.put("_toDisplayIds", toDisplayId);
|
||||||
|
|
||||||
@Override
|
log.info("Indexing request for Concessione [ID {}] with to HIDE {} and toDisplay {} ",
|
||||||
protected Document evaluateAdditionalIndexParameters(IndexDocumentRequest request) throws IndexingException {
|
indexingProject.getId(), toHideIds, toDisplayId);
|
||||||
Document toReturn = super.evaluateAdditionalIndexParameters(request);
|
return toReturn;
|
||||||
if(toReturn == null) toReturn = new Document();
|
} catch (Exception e) {
|
||||||
Project indexingProject = request.getDocument();
|
log.error("Unable to evaluate to Hide and Display Ids ", e);
|
||||||
|
throw new IndexingException("Unable to evaluate chain ids to hide / display", e);
|
||||||
|
}
|
||||||
|
|
||||||
// Evaluate to display project IDs
|
}
|
||||||
log.info("Evaluating Last ID in relationship chain. Current Concessione ID is {}",indexingProject.getId());
|
|
||||||
try {
|
|
||||||
ArrayList<Project> projects = new ArrayList<>();
|
|
||||||
ProjectAccess access = ImplementationProvider.get().getProvidedObjectByClass(ProjectAccess.class);
|
|
||||||
// get Last ID in relation chain
|
|
||||||
projects.add(indexingProject);
|
|
||||||
if(!indexingProject.getRelationshipsByName(PRECEDES).isEmpty())
|
|
||||||
scanRelation(projects,access.getRelations(indexingProject.getProfileID(), indexingProject.getId(), PRECEDES,true).get(0),false);
|
|
||||||
if(!indexingProject.getRelationshipsByName(FOLLOWS).isEmpty())
|
|
||||||
scanRelation(projects,access.getRelations(indexingProject.getProfileID(), indexingProject.getId(), FOLLOWS,true).get(0),false);
|
|
||||||
|
|
||||||
log.debug("Produced full chain [size : {}] from {}, evaluating last available for PHASE {} ",projects.size(),indexingProject.getId(),
|
/**
|
||||||
indexingProject.getLifecycleInformation().getPhase());
|
* New method implemented by Francesco
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected Document evaluateAdditionalIndexParameters(IndexDocumentRequest request) throws IndexingException {
|
||||||
|
Document toReturn = super.evaluateAdditionalIndexParameters(request);
|
||||||
|
if (toReturn == null)
|
||||||
|
toReturn = new Document();
|
||||||
|
Project indexingProject = request.getDocument();
|
||||||
|
|
||||||
List<String> toDisplayId = new ArrayList<>();
|
// Evaluate to display project IDs
|
||||||
List<String> toHideIds = new ArrayList<>();
|
log.debug("Evaluating Last ID in relationship chain. Current Concessione ID is {}", indexingProject.getId());
|
||||||
|
try {
|
||||||
|
ArrayList<Project> projects = new ArrayList<>();
|
||||||
|
ProjectAccess access = ImplementationProvider.get().getProvidedObjectByClass(ProjectAccess.class);
|
||||||
|
// get Last ID in relation chain
|
||||||
|
projects.add(indexingProject);
|
||||||
|
if (!indexingProject.getRelationshipsByName(PRECEDES).isEmpty())
|
||||||
|
scanRelation(projects, access
|
||||||
|
.getRelations(indexingProject.getProfileID(), indexingProject.getId(), PRECEDES, true).get(0),
|
||||||
|
false);
|
||||||
|
if (!indexingProject.getRelationshipsByName(FOLLOWS).isEmpty())
|
||||||
|
scanRelation(projects, access
|
||||||
|
.getRelations(indexingProject.getProfileID(), indexingProject.getId(), FOLLOWS, true).get(0),
|
||||||
|
false);
|
||||||
|
|
||||||
log.trace("Checking from LAST.. ");
|
log.debug("Produced full chain [size : {}] from {}, evaluating last available for PHASE {} ",
|
||||||
// Projects is time -ordered so we scan from last
|
projects.size(), indexingProject.getId(), indexingProject.getLifecycleInformation().getPhase());
|
||||||
for(int i = projects.size()-1;i>=0;i--) {
|
|
||||||
Project p = projects.get(i);
|
|
||||||
log.debug("Currently checking {} : {}",p.getId(),p.getTheDocument().get("nome"));
|
|
||||||
if(!toDisplayId.isEmpty())
|
|
||||||
toHideIds.add(p.getId());
|
|
||||||
else {
|
|
||||||
//Still need to find candidate for displaying feature
|
|
||||||
|
|
||||||
//Our currently indexing project is always a good candidate
|
log.info("projects are: " + projects.size());
|
||||||
if(p.getId().equals(indexingProject.getId()))
|
|
||||||
toDisplayId.add(p.getId());
|
|
||||||
//We check PHASE in order to skip projects not yet in the PHASE we are indexing
|
|
||||||
else switch(indexingProject.getLifecycleInformation().getPhase()){
|
|
||||||
case Phases.PENDING_APPROVAL:{
|
|
||||||
if ((p.getLifecycleInformation().getPhase().equals(Phases.PENDING_APPROVAL)||
|
|
||||||
p.getLifecycleInformation().getPhase().equals(Phases.PUBLISHED)))
|
|
||||||
toDisplayId.add(p.getId());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case Phases.PUBLISHED:{
|
|
||||||
if (p.getLifecycleInformation().getPhase().equals(Phases.PUBLISHED))
|
|
||||||
toDisplayId.add(p.getId());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!toDisplayId.isEmpty())
|
List<String> toDisplayId = new ArrayList<>();
|
||||||
log.debug("Found last concessioni candidate for displaying. ID {}, PHASE {} ",toDisplayId,p.getLifecycleInformation().getPhase());
|
List<String> toHideIds = new ArrayList<>();
|
||||||
else toHideIds.add(p.getId()); // Still not found
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
toReturn.put("_toHideIds",toHideIds);
|
// Reverse Order means from the last FOLLOW to the first one (temporal reverse
|
||||||
toReturn.put("_toDisplayIds",toDisplayId);
|
// order)
|
||||||
|
Collections.sort(projects, Collections.reverseOrder(new ProjectRelationComparator()));
|
||||||
|
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
int j = 0;
|
||||||
|
log.debug("Printing project reverse order....");
|
||||||
|
for (Project theProject : projects) {
|
||||||
|
log.debug(++j + ") " + theProject.getId() + " data inizio: "
|
||||||
|
+ theProject.getTheDocument().get("dataInizioProgetto"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
log.info("Indexing request for Concessione [ID {}] with to HIDE {} and toDisplay {} ",indexingProject.getId(),toHideIds,toDisplayId);
|
log.trace("Checking from LAST.. ");
|
||||||
return toReturn;
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.error("Unable to evaluate to Hide and Display Ids ",e);
|
|
||||||
throw new IndexingException("Unable to evaluate chain ids to hide / display",e);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
for (int i = 0; i < projects.size(); i++) {
|
||||||
|
|
||||||
private static void scanRelation(ArrayList chain,RelationshipNavigationObject obj, boolean putBefore){
|
Project p = projects.get(i);
|
||||||
if(putBefore)chain.add(0,obj.getTarget());
|
String phase = p.getLifecycleInformation().getPhase();
|
||||||
else chain.add(obj.getTarget());
|
|
||||||
if(obj.getChildren()!=null)
|
// IS TO DISPLAY EMPTY? Step into only once
|
||||||
obj.getChildren().forEach(r-> scanRelation(chain,r,putBefore));
|
if (toDisplayId.isEmpty()) {
|
||||||
}
|
// IF PHASE IS PENDING APPROVAL OR PUBLISHED adding toDisplayId
|
||||||
|
if ((phase.equals(Phases.PENDING_APPROVAL) || phase.equals(Phases.PUBLISHED))) {
|
||||||
|
toDisplayId.add(p.getId());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// IF PHASE IS PENDING APPROVAL OR PUBLISHED adding (the remaining) toHideIds
|
||||||
|
switch (phase) {
|
||||||
|
case Phases.PENDING_APPROVAL:
|
||||||
|
case Phases.PUBLISHED: {
|
||||||
|
toHideIds.add(p.getId());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toReturn.put("_toHideIds", toHideIds);
|
||||||
|
toReturn.put("_toDisplayIds", toDisplayId);
|
||||||
|
|
||||||
|
log.info("Indexing request for Concessione [ID {}] with to HIDE {} and toDisplay {} ",
|
||||||
|
indexingProject.getId(), toHideIds, toDisplayId);
|
||||||
|
return toReturn;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("Unable to evaluate to Hide and Display Ids ", e);
|
||||||
|
throw new IndexingException("Unable to evaluate chain ids to hide / display", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void scanRelation(ArrayList chain, RelationshipNavigationObject obj, boolean putBefore) {
|
||||||
|
if (putBefore)
|
||||||
|
chain.add(0, obj.getTarget());
|
||||||
|
else
|
||||||
|
chain.add(obj.getTarget());
|
||||||
|
if (obj.getChildren() != null)
|
||||||
|
obj.getChildren().forEach(r -> scanRelation(chain, r, putBefore));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ProjectRelationComparator implements Comparator<Project> {
|
||||||
|
@Override
|
||||||
|
public int compare(Project p1, Project p2) {
|
||||||
|
|
||||||
|
if (p1 == null)
|
||||||
|
return 1;
|
||||||
|
if (p2 == null)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
Integer compareResult = null;
|
||||||
|
compareResult = compareProjectAgainstRelations(p1, p2);
|
||||||
|
log.trace("p1 & p2, comparator result: {}", compareResult);
|
||||||
|
if (compareResult == null) {
|
||||||
|
log.debug("No relations beetween p1 & p2, checking inverted relations");
|
||||||
|
compareResult = compareProjectAgainstRelations(p2, p1);
|
||||||
|
log.trace("p2 & p1, comparator result: {}", compareResult);
|
||||||
|
|
||||||
|
if (compareResult == null) {
|
||||||
|
log.trace("p1 & p2, are not comparable, returning 0");
|
||||||
|
compareResult = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.debug("p1 & p2, comparator result, returns: {}", compareResult);
|
||||||
|
return compareResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Integer compareProjectAgainstRelations(Project source, Project target) {
|
||||||
|
log.debug("comparing source {} and target {}", source.getId(), target.getId());
|
||||||
|
List<Relationship> listRel = source.getRelationships();
|
||||||
|
log.debug("relationships of {} are : {}", source.getId(), listRel);
|
||||||
|
if (listRel != null) {
|
||||||
|
String targetId = target.getId();
|
||||||
|
for (Relationship relationship : listRel) {
|
||||||
|
String relTargetId = relationship.getTargetID();
|
||||||
|
if (targetId.compareTo(relTargetId) == 0) {
|
||||||
|
String relationName = relationship.getRelationshipName();
|
||||||
|
if (relationName.equals(PRECEDES)) {
|
||||||
|
log.debug("source {} [rel {} ] target {}, so source < target ", source.getId(), PRECEDES,
|
||||||
|
target.getId());
|
||||||
|
// source < target
|
||||||
|
return -1;
|
||||||
|
} else if (relationName.equals(FOLLOWS)) {
|
||||||
|
log.debug("source {} [rel {} ] target {}, so source > target ", source.getId(), FOLLOWS,
|
||||||
|
target.getId());
|
||||||
|
// source > target
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.debug("No relations beetween a & b");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,12 +2,18 @@ package org.gcube.application.cms.concessioni.plugins;
|
||||||
|
|
||||||
import org.bson.Document;
|
import org.bson.Document;
|
||||||
import org.gcube.application.cms.custom.gna.concessioni.model.ProfiledConcessione;
|
import org.gcube.application.cms.custom.gna.concessioni.model.ProfiledConcessione;
|
||||||
|
import org.gcube.application.cms.plugins.faults.IndexingException;
|
||||||
|
import org.gcube.application.cms.plugins.requests.IndexDocumentRequest;
|
||||||
|
import org.gcube.application.cms.plugins.requests.StepExecutionRequest;
|
||||||
import org.gcube.application.cms.serialization.Serialization;
|
import org.gcube.application.cms.serialization.Serialization;
|
||||||
import org.gcube.application.cms.tests.TestDocuments;
|
import org.gcube.application.cms.tests.TestDocuments;
|
||||||
import org.gcube.application.cms.tests.plugins.BasicPluginTest;
|
import org.gcube.application.cms.tests.plugins.BasicPluginTest;
|
||||||
import org.gcube.application.geoportal.common.model.JSONPathWrapper;
|
import org.gcube.application.geoportal.common.model.JSONPathWrapper;
|
||||||
import org.gcube.application.geoportal.common.model.document.Project;
|
import org.gcube.application.geoportal.common.model.document.Project;
|
||||||
|
import org.gcube.application.geoportal.common.model.document.accounting.Context;
|
||||||
|
import org.gcube.application.geoportal.common.model.document.accounting.User;
|
||||||
import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFileSet;
|
import org.gcube.application.geoportal.common.model.document.filesets.RegisteredFileSet;
|
||||||
|
import org.gcube.application.geoportal.common.model.useCaseDescriptor.UseCaseDescriptor;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@ -19,6 +25,10 @@ import static junit.framework.TestCase.*;
|
||||||
|
|
||||||
public class ConcessioniPluginTests extends BasicPluginTest {
|
public class ConcessioniPluginTests extends BasicPluginTest {
|
||||||
|
|
||||||
|
public static final String SCOPE_TEST = "/gcube/devsec/devVRE";
|
||||||
|
public static final String USERNAME = "francesco.mangiacrapa";
|
||||||
|
public static final String UCD_ID = "concessioni-estere";
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLoad(){
|
public void testLoad(){
|
||||||
Assert.assertTrue(true);
|
Assert.assertTrue(true);
|
||||||
|
@ -104,4 +114,36 @@ public class ConcessioniPluginTests extends BasicPluginTest {
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testEvaluateAdditionalIndexParameters() throws IOException {
|
||||||
|
UseCaseDescriptor ucd = getUCD();
|
||||||
|
ucd.setId(UCD_ID);
|
||||||
|
|
||||||
|
User user = getCurrentUser();
|
||||||
|
user.setUsername(USERNAME);
|
||||||
|
|
||||||
|
Context context = getContextObject();
|
||||||
|
context.setId(SCOPE_TEST);
|
||||||
|
context.setName(SCOPE_TEST);
|
||||||
|
|
||||||
|
|
||||||
|
// Project document = TestDocuments.documentMap.get("dummy.json");
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// StepExecutionRequest req = new StepExecutionRequest(ucd, user, context,document, "PUBLISH");
|
||||||
|
//
|
||||||
|
// IndexDocumentRequest indexRequest = new IndexDocumentRequest(
|
||||||
|
// req.getUseCaseDescriptor(),req.getCaller(), req.getContext(),req.getDocument());
|
||||||
|
//
|
||||||
|
// ConcessioniLifeCycleManager clfM = new ConcessioniLifeCycleManager();
|
||||||
|
//
|
||||||
|
// try {
|
||||||
|
// clfM.evaluateAdditionalIndexParameters(indexRequest);
|
||||||
|
// } catch (IndexingException e) {
|
||||||
|
// // TODO Auto-generated catch block
|
||||||
|
// e.printStackTrace();
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue