/**
* Copyright (c) Codice Foundation
* <p/>
* This is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser
* General Public License as published by the Free Software Foundation, either version 3 of the
* License, or any later version.
* <p/>
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details. A copy of the GNU Lesser General Public License
* is distributed along with this program and can be found at
* <http://www.gnu.org/licenses/lgpl.html>.
*/
package ddf.catalog.impl.operations;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.sun.istack.Nullable;
import ddf.catalog.Constants;
import ddf.catalog.data.Metacard;
import ddf.catalog.impl.FrameworkProperties;
import ddf.catalog.operation.DeleteRequest;
import ddf.catalog.operation.DeleteResponse;
import ddf.catalog.operation.ProcessingDetails;
import ddf.catalog.operation.impl.DeleteResponseImpl;
import ddf.catalog.operation.impl.ProcessingDetailsImpl;
import ddf.catalog.source.CatalogStore;
import ddf.catalog.source.IngestException;
public class RemoteDeleteOperations {
static final Logger INGEST_LOGGER = LoggerFactory.getLogger(Constants.INGEST_LOGGER_NAME);
private FrameworkProperties frameworkProperties;
private OperationsMetacardSupport opsMetacardSupport;
private OperationsCatalogStoreSupport opsCatStoreSupport;
public RemoteDeleteOperations(FrameworkProperties frameworkProperties,
OperationsMetacardSupport opsMetacardSupport,
OperationsCatalogStoreSupport opsCatStoreSupport) {
this.frameworkProperties = frameworkProperties;
this.opsMetacardSupport = opsMetacardSupport;
this.opsCatStoreSupport = opsCatStoreSupport;
}
@Nullable
public DeleteResponse performRemoteDelete(DeleteRequest deleteRequest,
@Nullable DeleteResponse deleteResponse) {
if (!opsCatStoreSupport.isCatalogStoreRequest(deleteRequest)) {
return deleteResponse;
}
DeleteResponse remoteDeleteResponse = doRemoteDelete(deleteRequest);
if (deleteResponse == null) {
deleteResponse = remoteDeleteResponse;
deleteResponse = injectAttributes(deleteResponse);
} else {
deleteResponse.getProperties()
.putAll(remoteDeleteResponse.getProperties());
deleteResponse.getProcessingErrors()
.addAll(remoteDeleteResponse.getProcessingErrors());
}
return deleteResponse;
}
private DeleteResponse doRemoteDelete(DeleteRequest deleteRequest) {
HashSet<ProcessingDetails> exceptions = new HashSet<>();
Map<String, Serializable> properties = new HashMap<>();
List<CatalogStore> stores = opsCatStoreSupport.getCatalogStoresForRequest(deleteRequest,
exceptions);
List<Metacard> metacards = new ArrayList<>();
for (CatalogStore store : stores) {
try {
if (!store.isAvailable()) {
exceptions.add(new ProcessingDetailsImpl(store.getId(),
null,
"CatalogStore is not available"));
} else {
// TODO: 4/27/17 Address bug in DDF-2970 for overwriting deleted metacards
DeleteResponse response = store.delete(deleteRequest);
properties.put(store.getId(), new ArrayList<>(response.getDeletedMetacards()));
metacards = response.getDeletedMetacards();
}
} catch (IngestException e) {
INGEST_LOGGER.error("Error deleting metacards for CatalogStore {}",
store.getId(),
e);
exceptions.add(new ProcessingDetailsImpl(store.getId(), e));
}
}
return new DeleteResponseImpl(deleteRequest, properties, metacards, exceptions);
}
public void setOpsCatStoreSupport(OperationsCatalogStoreSupport opsCatStoreSupport) {
this.opsCatStoreSupport = opsCatStoreSupport;
}
// TODO: 4/24/17 Move to future utility class (called in DeleteOperations as well)
// https://codice.atlassian.net/browse/DDF-2962
private DeleteResponse injectAttributes(DeleteResponse response) {
List<Metacard> deletedMetacards = response.getDeletedMetacards()
.stream()
.map((original) -> opsMetacardSupport.applyInjectors(original,
frameworkProperties.getAttributeInjectors()))
.collect(Collectors.toList());
return new DeleteResponseImpl(response.getRequest(),
response.getProperties(),
deletedMetacards,
response.getProcessingErrors());
}
}