2017-09-18 6 views
2

Nous essayons de créer une application pour fournir l'édition en bloc des métadonnées d'éléments ingérées dans DSpace, en utilisant l'API REST. Les opérations de mise à jour sont reflétées dans l'interface utilisateur DSpace. Cependant, les métadonnées restent inchangées dans Solr, sauf si nous exécutons la découverte d'index. Puisque nous avons l'intention de travailler avec une grande quantité de données, exécuter la découverte d'index chaque fois qu'une métadonnée est éditée, serait coûteux. Quelqu'un pourrait-il suggérer une solution de contournement/solution pour cela?Ré-indexer les éléments dans DSpace 6.2 après la mise à jour via REST

Répondre

2

Vous pouvez déclencher une mise à jour d'élément dans la classe Java du point de terminaison REST.

Par exemple: Dans la méthode addItemMetadata de org.dspace.rest.ItemsResource classe java qui représente les éléments/REST point final, vous pouvez ajouter la ligne suivante après les métadonnées de l'article a été modifié:

itemService.update(context, dspaceItem); 

Cette ligne de code déclenche une mise à jour d'index pour cet élément spécifique.

C'est ce que la méthode de addItemMetadata complète ressemblera après le changement ci-dessus:

@POST 
@Path("/{item_id}/metadata") 
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) 
public Response addItemMetadata(@PathParam("item_id") String itemId, List<org.dspace.rest.common.MetadataEntry> metadata, 
     @QueryParam("userIP") String user_ip, @QueryParam("userAgent") String user_agent, 
     @QueryParam("xforwardedfor") String xforwardedfor, @Context HttpHeaders headers, @Context HttpServletRequest request) 
     throws WebApplicationException 
{ 

    log.info("Adding metadata to item(id=" + itemId + ")."); 
    org.dspace.core.Context context = null; 

    try 
    { 
     context = createContext(); 
     org.dspace.content.Item dspaceItem = findItem(context, itemId, org.dspace.core.Constants.WRITE); 

     writeStats(dspaceItem, UsageEvent.Action.UPDATE, user_ip, user_agent, xforwardedfor, headers, request, context); 

     for (MetadataEntry entry : metadata) 
     { 
      // TODO Test with Java split 
      String data[] = mySplit(entry.getKey()); // Done by my split, because of java split was not function. 
      if ((data.length >= 2) && (data.length <= 3)) 
      { 
       itemService.addMetadata(context, dspaceItem, data[0], data[1], data[2], entry.getLanguage(), entry.getValue()); 
      } 
     } 

     itemService.update(context, dspaceItem); 
     context.complete(); 

    } 
    catch (SQLException e) 
    { 
     processException("Could not write metadata to item(id=" + itemId + "), SQLException. Message: " + e, context); 
    } 
    catch (ContextException e) 
    { 
     processException("Could not write metadata to item(id=" + itemId + "), ContextException. Message: " + e.getMessage(), 
       context); 
    } catch (AuthorizeException e) { 
     processException("Could not update item(id=" + itemId + "), AuthorizeException. Message: " + e.getMessage(), 
       context); 
    } finally 
    { 
     processFinally(context); 
    } 

    log.info("Metadata to item(id=" + itemId + ") were successfully added."); 
    return Response.status(Status.OK).build(); 
} 
+0

En fait, nous revenions à une ancienne version de DSpace (5,6), parce que nous ne voulions pas vraiment faire un niveau de code modifications dans DSpace. Espérons que ce problème est corrigé dans les versions suivantes –