Search in sources :

Example 1 with UpdateResponseImpl

use of ddf.catalog.operation.impl.UpdateResponseImpl in project ddf by codice.

the class SolrCatalogProvider method update.

@Override
public UpdateResponse update(UpdateRequest updateRequest) throws IngestException {
    if (updateRequest == null) {
        throw new IngestException(REQUEST_MUST_NOT_BE_NULL_MESSAGE);
    }
    List<Entry<Serializable, Metacard>> updates = updateRequest.getUpdates();
    // the list of updates, both new and old metacards
    ArrayList<Update> updateList = new ArrayList<>();
    String attributeName = updateRequest.getAttributeName();
    // need an attribute name in order to do query
    if (attributeName == null) {
        throw new IngestException("Attribute name cannot be null. " + "Please provide the name of the attribute.");
    }
    List<String> identifiers = new ArrayList<>();
    // if we have nothing to update, send the empty list
    if (updates == null || updates.size() == 0) {
        return new UpdateResponseImpl(updateRequest, null, new ArrayList<>());
    }
    // Loop to get all identifiers
    for (Entry<Serializable, Metacard> updateEntry : updates) {
        identifiers.add(updateEntry.getKey().toString());
    }
    /* 1a. Create the old Metacard Query */
    String attributeQuery = getQuery(attributeName, identifiers);
    SolrQuery query = new SolrQuery(attributeQuery);
    // Set number of rows to the result size + 1.  The default row size in Solr is 10, so this
    // needs to be set in situations where the number of metacards to update is > 10.  Since there
    // could be more results in the query response than the number of metacards in the update request,
    // 1 is added to the row size, so we can still determine whether we found more metacards than
    // updated metacards provided
    query.setRows(updates.size() + 1);
    QueryResponse idResults = null;
    /* 1b. Execute Query */
    try {
        idResults = solr.query(query, METHOD.POST);
    } catch (SolrServerException | IOException e) {
        LOGGER.info("Failed to query for metacard(s) before update.", e);
    }
    // map of old metacards to be populated
    Map<Serializable, Metacard> idToMetacardMap = new HashMap<>();
    /* 1c. Populate list of old metacards */
    if (idResults != null && idResults.getResults() != null && idResults.getResults().size() != 0) {
        LOGGER.debug("Found {} current metacard(s).", idResults.getResults().size());
        // CHECK updates size assertion
        if (idResults.getResults().size() > updates.size()) {
            throw new IngestException("Found more metacards than updated metacards provided. Please ensure your attribute values match unique records.");
        }
        for (SolrDocument doc : idResults.getResults()) {
            Metacard old;
            try {
                old = client.createMetacard(doc);
            } catch (MetacardCreationException e) {
                LOGGER.info("Unable to create metacard(s) from Solr responses during update.", e);
                throw new IngestException("Could not create metacard(s).");
            }
            if (!idToMetacardMap.containsKey(old.getAttribute(attributeName).getValue())) {
                idToMetacardMap.put(old.getAttribute(attributeName).getValue(), old);
            } else {
                throw new IngestException("The attribute value given [" + old.getAttribute(attributeName).getValue() + "] matched multiple records. Attribute values must at most match only one unique Metacard.");
            }
        }
    }
    if (Metacard.ID.equals(attributeName)) {
        idToMetacardMap.putAll(pendingNrtIndex.getAllPresent(identifiers));
    }
    if (idToMetacardMap.size() == 0) {
        LOGGER.debug("No results found for given attribute values.");
        // return an empty list
        return new UpdateResponseImpl(updateRequest, null, new ArrayList<>());
    }
    /* 2. Update the cards */
    List<Metacard> newMetacards = new ArrayList<>();
    for (Entry<Serializable, Metacard> updateEntry : updates) {
        String localKey = updateEntry.getKey().toString();
        /* 2a. Prepare new Metacard */
        MetacardImpl newMetacard = new MetacardImpl(updateEntry.getValue());
        // Find the exact oldMetacard that corresponds with this newMetacard
        Metacard oldMetacard = idToMetacardMap.get(localKey);
        // matched but another did not
        if (oldMetacard != null) {
            // overwrite the id, in case it has not been done properly/already
            newMetacard.setId(oldMetacard.getId());
            newMetacard.setSourceId(getId());
            newMetacards.add(newMetacard);
            updateList.add(new UpdateImpl(newMetacard, oldMetacard));
        }
    }
    try {
        client.add(newMetacards, isForcedAutoCommit());
    } catch (SolrServerException | SolrException | IOException | MetacardCreationException e) {
        LOGGER.info("Failed to update metacard(s) with Solr.", e);
        throw new IngestException("Failed to update metacard(s).");
    }
    pendingNrtIndex.putAll(updateList.stream().collect(Collectors.toMap(u -> u.getNewMetacard().getId(), u -> copyMetacard(u.getNewMetacard()))));
    return new UpdateResponseImpl(updateRequest, updateRequest.getProperties(), updateList);
}
Also used : UpdateImpl(ddf.catalog.operation.impl.UpdateImpl) Serializable(java.io.Serializable) HashMap(java.util.HashMap) SolrServerException(org.apache.solr.client.solrj.SolrServerException) ArrayList(java.util.ArrayList) Update(ddf.catalog.operation.Update) SolrQuery(org.apache.solr.client.solrj.SolrQuery) Entry(java.util.Map.Entry) SolrDocument(org.apache.solr.common.SolrDocument) UpdateResponseImpl(ddf.catalog.operation.impl.UpdateResponseImpl) IngestException(ddf.catalog.source.IngestException) SolrException(org.apache.solr.common.SolrException) MetacardCreationException(ddf.catalog.data.MetacardCreationException) IOException(java.io.IOException) MetacardImpl(ddf.catalog.data.impl.MetacardImpl) Metacard(ddf.catalog.data.Metacard) QueryResponse(org.apache.solr.client.solrj.response.QueryResponse)

Example 2 with UpdateResponseImpl

use of ddf.catalog.operation.impl.UpdateResponseImpl in project ddf by codice.

the class TestPlugin method testUpdate.

@Test
@Ignore
public void testUpdate() throws PluginExecutionException, IngestException, SourceUnavailableException {
    // given
    UpdateResponse updateResponse = new UpdateResponseImpl(new UpdateRequestImpl("23", metacard), null, Arrays.asList(metacard), Arrays.asList(metacard));
    // when
    UpdateResponse response = plugin.process(updateResponse);
    // then
    verify(endpoint).updateDocument(argThat(is("23")), isA(HttpHeaders.class), isA(InputStream.class));
    assertThat(response, sameInstance(updateResponse));
}
Also used : UpdateResponse(ddf.catalog.operation.UpdateResponse) HttpHeaders(javax.ws.rs.core.HttpHeaders) UpdateResponseImpl(ddf.catalog.operation.impl.UpdateResponseImpl) InputStream(java.io.InputStream) UpdateRequestImpl(ddf.catalog.operation.impl.UpdateRequestImpl) Ignore(org.junit.Ignore) Test(org.junit.Test)

Example 3 with UpdateResponseImpl

use of ddf.catalog.operation.impl.UpdateResponseImpl in project ddf by codice.

the class TestCswEndpoint method testUpdateTransactionWithNewRecord.

@Test
public void testUpdateTransactionWithNewRecord() throws CswException, FederationException, IngestException, SourceUnavailableException, UnsupportedQueryException {
    List<Update> updatedMetacards = new ArrayList<>();
    updatedMetacards.add(new UpdateImpl(new MetacardImpl(), new MetacardImpl()));
    UpdateResponse updateResponse = new UpdateResponseImpl(null, null, updatedMetacards);
    doReturn(updateResponse).when(catalogFramework).update(any(UpdateRequest.class));
    MetacardImpl updatedMetacard = new MetacardImpl();
    updatedMetacard.setId("123");
    UpdateAction updateAction = new UpdateAction(updatedMetacard, CswConstants.CSW_RECORD, "");
    CswTransactionRequest transactionRequest = new CswTransactionRequest();
    transactionRequest.getUpdateActions().add(updateAction);
    transactionRequest.setVersion(CswConstants.VERSION_2_0_2);
    transactionRequest.setService(CswConstants.CSW);
    transactionRequest.setVerbose(false);
    TransactionResponseType response = csw.transaction(transactionRequest);
    assertThat(response, notNullValue());
    TransactionSummaryType summary = response.getTransactionSummary();
    assertThat(summary, notNullValue());
    assertThat(summary.getTotalDeleted().intValue(), is(0));
    assertThat(summary.getTotalInserted().intValue(), is(0));
    assertThat(summary.getTotalUpdated().intValue(), is(1));
    verifyMarshalResponse(response, "net.opengis.cat.csw.v_2_0_2:net.opengis.filter.v_1_1_0:net.opengis.gml.v_3_1_1", cswQnameOutPutSchema);
    ArgumentCaptor<UpdateRequest> updateRequestArgumentCaptor = ArgumentCaptor.forClass(UpdateRequest.class);
    verify(catalogFramework, times(1)).update(updateRequestArgumentCaptor.capture());
    UpdateRequest actualUpdateRequest = updateRequestArgumentCaptor.getValue();
    assertThat(actualUpdateRequest.getUpdates().size(), is(1));
    assertThat(actualUpdateRequest.getUpdates().get(0).getValue().getId(), is("123"));
}
Also used : UpdateImpl(ddf.catalog.operation.impl.UpdateImpl) UpdateRequest(ddf.catalog.operation.UpdateRequest) UpdateAction(org.codice.ddf.spatial.ogc.csw.catalog.common.transaction.UpdateAction) ArrayList(java.util.ArrayList) Update(ddf.catalog.operation.Update) TransactionSummaryType(net.opengis.cat.csw.v_2_0_2.TransactionSummaryType) MetacardImpl(ddf.catalog.data.impl.MetacardImpl) TransactionResponseType(net.opengis.cat.csw.v_2_0_2.TransactionResponseType) UpdateResponse(ddf.catalog.operation.UpdateResponse) UpdateResponseImpl(ddf.catalog.operation.impl.UpdateResponseImpl) CswTransactionRequest(org.codice.ddf.spatial.ogc.csw.catalog.common.transaction.CswTransactionRequest) Test(org.junit.Test)

Example 4 with UpdateResponseImpl

use of ddf.catalog.operation.impl.UpdateResponseImpl in project ddf by codice.

the class PluginTest method testUpdate.

@Test
@Ignore
public void testUpdate() throws PluginExecutionException, IngestException, SourceUnavailableException {
    // given
    UpdateResponse updateResponse = new UpdateResponseImpl(new UpdateRequestImpl("23", metacard), null, Arrays.asList(metacard), Arrays.asList(metacard));
    // when
    UpdateResponse response = plugin.process(updateResponse);
    // then
    verify(endpoint).updateDocument(argThat(is("23")), isA(HttpHeaders.class), isA(InputStream.class));
    assertThat(response, sameInstance(updateResponse));
}
Also used : UpdateResponse(ddf.catalog.operation.UpdateResponse) HttpHeaders(javax.ws.rs.core.HttpHeaders) UpdateResponseImpl(ddf.catalog.operation.impl.UpdateResponseImpl) InputStream(java.io.InputStream) UpdateRequestImpl(ddf.catalog.operation.impl.UpdateRequestImpl) Ignore(org.junit.Ignore) Test(org.junit.Test)

Example 5 with UpdateResponseImpl

use of ddf.catalog.operation.impl.UpdateResponseImpl in project ddf by codice.

the class PluginTest method testUpdateNullRequest.

@Test
@Ignore
public void testUpdateNullRequest() throws PluginExecutionException, IngestException, SourceUnavailableException {
    // given
    UpdateResponse updateResponse = new UpdateResponseImpl(null, null, Arrays.asList(metacard), Arrays.asList(metacard));
    // when
    UpdateResponse response = plugin.process(updateResponse);
    // then
    verify(endpoint, never()).updateDocument(isA(String.class), isA(HttpHeaders.class), isA(InputStream.class));
    assertThat(response, sameInstance(updateResponse));
}
Also used : UpdateResponse(ddf.catalog.operation.UpdateResponse) HttpHeaders(javax.ws.rs.core.HttpHeaders) UpdateResponseImpl(ddf.catalog.operation.impl.UpdateResponseImpl) InputStream(java.io.InputStream) Ignore(org.junit.Ignore) Test(org.junit.Test)

Aggregations

UpdateResponseImpl (ddf.catalog.operation.impl.UpdateResponseImpl)16 UpdateResponse (ddf.catalog.operation.UpdateResponse)13 ArrayList (java.util.ArrayList)12 Update (ddf.catalog.operation.Update)11 Test (org.junit.Test)11 HashMap (java.util.HashMap)10 Metacard (ddf.catalog.data.Metacard)9 UpdateImpl (ddf.catalog.operation.impl.UpdateImpl)9 UpdateRequest (ddf.catalog.operation.UpdateRequest)7 Serializable (java.io.Serializable)7 MetacardImpl (ddf.catalog.data.impl.MetacardImpl)5 UpdateRequestImpl (ddf.catalog.operation.impl.UpdateRequestImpl)5 IngestException (ddf.catalog.source.IngestException)5 TransactionResponseType (net.opengis.cat.csw.v_2_0_2.TransactionResponseType)5 CswTransactionRequest (org.codice.ddf.spatial.ogc.csw.catalog.common.transaction.CswTransactionRequest)5 InputStream (java.io.InputStream)4 HttpHeaders (javax.ws.rs.core.HttpHeaders)4 TransactionSummaryType (net.opengis.cat.csw.v_2_0_2.TransactionSummaryType)4 Entry (java.util.Map.Entry)3 MockEndpoint (org.apache.camel.component.mock.MockEndpoint)3