71752: Reindex metadatafields on create/update/delete + tests

This commit is contained in:
Marie Verdonck
2020-07-29 16:09:25 +02:00
parent c046a1c8f3
commit 9dae6a9579
2 changed files with 197 additions and 12 deletions

View File

@@ -22,6 +22,9 @@ import org.dspace.content.service.MetadataSchemaService;
import org.dspace.content.service.MetadataValueService;
import org.dspace.core.Context;
import org.dspace.core.LogManager;
import org.dspace.discovery.IndexingService;
import org.dspace.discovery.indexobject.IndexableMetadataField;
import org.dspace.services.factory.DSpaceServicesFactory;
import org.springframework.beans.factory.annotation.Autowired;
/**
@@ -46,6 +49,7 @@ public class MetadataFieldServiceImpl implements MetadataFieldService {
protected MetadataValueService metadataValueService;
@Autowired(required = true)
protected MetadataSchemaService metadataSchemaService;
private IndexingService indexer;
protected MetadataFieldServiceImpl() {
@@ -77,6 +81,8 @@ public class MetadataFieldServiceImpl implements MetadataFieldService {
log.info(LogManager.getHeader(context, "create_metadata_field",
"metadata_field_id=" + metadataField.getID()));
// Update the index of type metadatafield
this.updateMetadataFieldIndex(context);
return metadataField;
}
@@ -149,6 +155,8 @@ public class MetadataFieldServiceImpl implements MetadataFieldService {
"metadata_field_id=" + metadataField.getID() + "element=" + metadataField
.getElement()
+ "qualifier=" + metadataField.getQualifier()));
// Update the index of type metadatafield
this.updateMetadataFieldIndex(context);
}
@Override
@@ -177,6 +185,22 @@ public class MetadataFieldServiceImpl implements MetadataFieldService {
log.info(LogManager.getHeader(context, "delete_metadata_field",
"metadata_field_id=" + metadataField.getID()));
// Update the index of type metadatafield
this.updateMetadataFieldIndex(context);
}
/**
* Updates the index of type metadatafield. Indexed metadatafields are used by the /search/byFieldName endpoint,
* see MetadataFieldRestRepository
* @param context DSpace context
*/
private void updateMetadataFieldIndex(Context context) {
if (this.indexer == null) {
this.indexer = DSpaceServicesFactory.getInstance().getServiceManager()
.getServiceByName(IndexingService.class.getName(),
IndexingService.class);
}
this.indexer.updateIndex(context, true, IndexableMetadataField.TYPE);
}
/**

View File

@@ -184,8 +184,6 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration
context.restoreAuthSystemState();
super.runDSpaceScript("index-discovery", "-b");
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("schema", schema.getName()))
.andExpect(status().isOk())
@@ -214,8 +212,6 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration
context.restoreAuthSystemState();
super.runDSpaceScript("index-discovery", "-b");
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("element", "AnElement"))
.andExpect(status().isOk())
@@ -250,8 +246,6 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration
context.restoreAuthSystemState();
super.runDSpaceScript("index-discovery", "-b");
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("element", "AnElement2")
.param("qualifier", "AQualifier"))
@@ -290,8 +284,6 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration
context.restoreAuthSystemState();
super.runDSpaceScript("index-discovery", "-b");
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("schema", schema.getName())
.param("qualifier", "AQualifier"))
@@ -310,6 +302,45 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration
.andExpect(jsonPath("$.page.totalElements", is(2)));
}
@Test
public void findByFieldName_schemaElementAndQualifier() throws Exception {
context.turnOffAuthorisationSystem();
MetadataSchema schema = MetadataSchemaBuilder.createMetadataSchema(context, "ASchema",
"http://www.dspace.org/ns/aschema").build();
MetadataSchema schema2 = MetadataSchemaBuilder.createMetadataSchema(context, "ASchema2",
"http://www.dspace.org/ns/aschema2").build();
MetadataField metadataField = MetadataFieldBuilder
.createMetadataField(context, schema, "AnElement1", "AQualifier", "AScopeNote").build();
MetadataField metadataField2 = MetadataFieldBuilder
.createMetadataField(context, schema2, "AnElement2", "AQualifier", "AScopeNote2").build();
MetadataField metadataField3 = MetadataFieldBuilder
.createMetadataField(context, schema, "AnElement3", "AQualifier", "AScopeNote3").build();
context.restoreAuthSystemState();
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("schema", schema.getName())
.param("element", metadataField3.getElement())
.param("qualifier", metadataField3.getQualifier()))
.andExpect(status().isOk())
.andExpect(content().contentType(contentType))
.andExpect(jsonPath("$._embedded.metadatafields", Matchers.not(hasItem(
MetadataFieldMatcher.matchMetadataField(metadataField))
)))
.andExpect(jsonPath("$._embedded.metadatafields", Matchers.not(hasItem(
MetadataFieldMatcher.matchMetadataField(metadataField2))
)))
.andExpect(jsonPath("$._embedded.metadatafields", Matchers.hasItem(
MetadataFieldMatcher.matchMetadataField(metadataField3))
))
.andExpect(jsonPath("$.page.size", is(20)))
.andExpect(jsonPath("$.page.totalElements", is(1)));
}
@Test
public void findByFieldName_query() throws Exception {
context.turnOffAuthorisationSystem();
@@ -330,8 +361,6 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration
context.restoreAuthSystemState();
super.runDSpaceScript("index-discovery", "-b");
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("query", schema.getName()))
.andExpect(status().isOk())
@@ -401,8 +430,6 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration
context.restoreAuthSystemState();
super.runDSpaceScript("index-discovery", "-b");
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("query", "test"))
.andExpect(status().isOk())
@@ -458,6 +485,49 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration
}
}
@Test
public void create_checkAddedToIndex() throws Exception {
MetadataFieldRest metadataFieldRest = new MetadataFieldRest();
metadataFieldRest.setElement("testElementForCreate");
metadataFieldRest.setQualifier("testQualifierForCreate");
metadataFieldRest.setScopeNote(SCOPE_NOTE);
String authToken = getAuthToken(admin.getEmail(), password);
AtomicReference<Integer> idRef = new AtomicReference<>();
try {
assertThat(metadataFieldService.findByElement(context, metadataSchema, ELEMENT, QUALIFIER), nullValue());
getClient(authToken)
.perform(post("/api/core/metadatafields")
.param("schemaId", metadataSchema.getID() + "")
.param("projection", "full")
.content(new ObjectMapper().writeValueAsBytes(metadataFieldRest))
.contentType(contentType))
.andExpect(status().isCreated())
.andDo(result -> idRef.set(read(result.getResponse().getContentAsString(), "$.id")));
getClient(authToken).perform(get("/api/core/metadatafields/" + idRef.get()))
.andExpect(status().isOk())
.andExpect(jsonPath("$", MetadataFieldMatcher.matchMetadataFieldByKeys(
metadataSchema.getName(), "testElementForCreate", "testQualifierForCreate")));
// new metadata field found in index
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("schema", metadataSchema.getName())
.param("element", metadataFieldRest.getElement())
.param("qualifier", metadataFieldRest.getQualifier()))
.andExpect(status().isOk())
.andExpect(jsonPath("$._embedded.metadatafields", Matchers.hasItem(
MetadataFieldMatcher.matchMetadataFieldByKeys(metadataSchema.getName(),
metadataFieldRest.getElement(), metadataFieldRest.getQualifier()))
))
.andExpect(jsonPath("$.page.totalElements", is(1)));
} finally {
MetadataFieldBuilder.deleteMetadataField(idRef.get());
}
}
@Test
public void createUnauthorized() throws Exception {
@@ -574,6 +644,44 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration
.andExpect(status().isNotFound());
}
@Test
public void delete_checkDeletedFromIndex() throws Exception {
context.turnOffAuthorisationSystem();
MetadataSchema schema = MetadataSchemaBuilder.createMetadataSchema(context, "ASchema",
"http://www.dspace.org/ns/aschema").build();
MetadataField metadataField = MetadataFieldBuilder.createMetadataField(context, schema, ELEMENT, QUALIFIER,
SCOPE_NOTE).build();
context.restoreAuthSystemState();
Integer id = metadataField.getID();
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("schema", schema.getName())
.param("element", metadataField.getElement())
.param("qualifier", metadataField.getQualifier()))
.andExpect(status().isOk())
.andExpect(jsonPath("$._embedded.metadatafields", Matchers.hasItem(
MetadataFieldMatcher.matchMetadataField(metadataField))
));
getClient(getAuthToken(admin.getEmail(), password))
.perform(delete("/api/core/metadatafields/" + id))
.andExpect(status().isNoContent());
assertThat(metadataFieldService.find(context, id), nullValue());
// deleted metadata field not found in index
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("schema", schema.getName())
.param("element", metadataField.getElement())
.param("qualifier", metadataField.getQualifier()))
.andExpect(status().isOk())
.andExpect(jsonPath("$.page.totalElements", is(0)));
}
@Test
public void update() throws Exception {
context.turnOffAuthorisationSystem();
@@ -602,6 +710,59 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration
));
}
@Test
public void update_checkUpdatedInIndex() throws Exception {
context.turnOffAuthorisationSystem();
MetadataField metadataField = MetadataFieldBuilder.createMetadataField(context, ELEMENT, QUALIFIER, SCOPE_NOTE)
.build();
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("schema", metadataSchema.getName())
.param("element", metadataField.getElement())
.param("qualifier", metadataField.getQualifier()))
.andExpect(status().isOk())
.andExpect(jsonPath("$._embedded.metadatafields", Matchers.hasItem(
MetadataFieldMatcher.matchMetadataFieldByKeys(metadataSchema.getName(),
metadataField.getElement(), metadataField.getQualifier()))
))
.andExpect(jsonPath("$.page.totalElements", is(1)));
context.restoreAuthSystemState();
MetadataFieldRest metadataFieldRest = new MetadataFieldRest();
metadataFieldRest.setId(metadataField.getID());
metadataFieldRest.setElement(ELEMENT_UPDATED);
metadataFieldRest.setQualifier(QUALIFIER_UPDATED);
metadataFieldRest.setScopeNote(SCOPE_NOTE_UPDATED);
getClient(getAuthToken(admin.getEmail(), password))
.perform(put("/api/core/metadatafields/" + metadataField.getID())
.content(new ObjectMapper().writeValueAsBytes(metadataFieldRest))
.contentType(contentType))
.andExpect(status().isOk());
// new metadata field found in index
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("schema", metadataSchema.getName())
.param("element", ELEMENT_UPDATED)
.param("qualifier", QUALIFIER_UPDATED))
.andExpect(status().isOk())
.andExpect(jsonPath("$._embedded.metadatafields", Matchers.hasItem(
MetadataFieldMatcher.matchMetadataFieldByKeys(metadataSchema.getName(),
ELEMENT_UPDATED, QUALIFIER_UPDATED))
))
.andExpect(jsonPath("$.page.totalElements", is(1)));
// original metadata field not found in index
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("schema", metadataSchema.getName())
.param("element", metadataField.getElement())
.param("qualifier", metadataField.getQualifier()))
.andExpect(status().isOk())
.andExpect(jsonPath("$.page.totalElements", is(0)));
}
@Test
public void updateUnauthorized() throws Exception {
context.turnOffAuthorisationSystem();