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.content.service.MetadataValueService;
import org.dspace.core.Context; import org.dspace.core.Context;
import org.dspace.core.LogManager; 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; import org.springframework.beans.factory.annotation.Autowired;
/** /**
@@ -46,6 +49,7 @@ public class MetadataFieldServiceImpl implements MetadataFieldService {
protected MetadataValueService metadataValueService; protected MetadataValueService metadataValueService;
@Autowired(required = true) @Autowired(required = true)
protected MetadataSchemaService metadataSchemaService; protected MetadataSchemaService metadataSchemaService;
private IndexingService indexer;
protected MetadataFieldServiceImpl() { protected MetadataFieldServiceImpl() {
@@ -77,6 +81,8 @@ public class MetadataFieldServiceImpl implements MetadataFieldService {
log.info(LogManager.getHeader(context, "create_metadata_field", log.info(LogManager.getHeader(context, "create_metadata_field",
"metadata_field_id=" + metadataField.getID())); "metadata_field_id=" + metadataField.getID()));
// Update the index of type metadatafield
this.updateMetadataFieldIndex(context);
return metadataField; return metadataField;
} }
@@ -149,6 +155,8 @@ public class MetadataFieldServiceImpl implements MetadataFieldService {
"metadata_field_id=" + metadataField.getID() + "element=" + metadataField "metadata_field_id=" + metadataField.getID() + "element=" + metadataField
.getElement() .getElement()
+ "qualifier=" + metadataField.getQualifier())); + "qualifier=" + metadataField.getQualifier()));
// Update the index of type metadatafield
this.updateMetadataFieldIndex(context);
} }
@Override @Override
@@ -177,6 +185,22 @@ public class MetadataFieldServiceImpl implements MetadataFieldService {
log.info(LogManager.getHeader(context, "delete_metadata_field", log.info(LogManager.getHeader(context, "delete_metadata_field",
"metadata_field_id=" + metadataField.getID())); "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(); context.restoreAuthSystemState();
super.runDSpaceScript("index-discovery", "-b");
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT) getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("schema", schema.getName())) .param("schema", schema.getName()))
.andExpect(status().isOk()) .andExpect(status().isOk())
@@ -214,8 +212,6 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration
context.restoreAuthSystemState(); context.restoreAuthSystemState();
super.runDSpaceScript("index-discovery", "-b");
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT) getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("element", "AnElement")) .param("element", "AnElement"))
.andExpect(status().isOk()) .andExpect(status().isOk())
@@ -250,8 +246,6 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration
context.restoreAuthSystemState(); context.restoreAuthSystemState();
super.runDSpaceScript("index-discovery", "-b");
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT) getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("element", "AnElement2") .param("element", "AnElement2")
.param("qualifier", "AQualifier")) .param("qualifier", "AQualifier"))
@@ -290,8 +284,6 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration
context.restoreAuthSystemState(); context.restoreAuthSystemState();
super.runDSpaceScript("index-discovery", "-b");
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT) getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("schema", schema.getName()) .param("schema", schema.getName())
.param("qualifier", "AQualifier")) .param("qualifier", "AQualifier"))
@@ -310,6 +302,45 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration
.andExpect(jsonPath("$.page.totalElements", is(2))); .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 @Test
public void findByFieldName_query() throws Exception { public void findByFieldName_query() throws Exception {
context.turnOffAuthorisationSystem(); context.turnOffAuthorisationSystem();
@@ -330,8 +361,6 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration
context.restoreAuthSystemState(); context.restoreAuthSystemState();
super.runDSpaceScript("index-discovery", "-b");
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT) getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("query", schema.getName())) .param("query", schema.getName()))
.andExpect(status().isOk()) .andExpect(status().isOk())
@@ -401,8 +430,6 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration
context.restoreAuthSystemState(); context.restoreAuthSystemState();
super.runDSpaceScript("index-discovery", "-b");
getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT) getClient().perform(get(SEARCH_BYFIELDNAME_ENDPOINT)
.param("query", "test")) .param("query", "test"))
.andExpect(status().isOk()) .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 @Test
public void createUnauthorized() throws Exception { public void createUnauthorized() throws Exception {
@@ -574,6 +644,44 @@ public class MetadatafieldRestRepositoryIT extends AbstractControllerIntegration
.andExpect(status().isNotFound()); .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 @Test
public void update() throws Exception { public void update() throws Exception {
context.turnOffAuthorisationSystem(); 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 @Test
public void updateUnauthorized() throws Exception { public void updateUnauthorized() throws Exception {
context.turnOffAuthorisationSystem(); context.turnOffAuthorisationSystem();