use of datawave.webservice.common.exception.DatawaveWebApplicationException in project datawave by NationalSecurityAgency.
the class ModelBean method listModelNames.
/**
* Get the names of the models
*
* @param modelTableName
* name of the table that contains the model
* @return datawave.webservice.model.ModelList
* @RequestHeader X-ProxiedEntitiesChain use when proxying request for user
*
* @HTTP 200 success
* @HTTP 500 internal server error
*/
@GET
@Produces({ "application/xml", "text/xml", "application/json", "text/yaml", "text/x-yaml", "application/x-yaml", "application/x-protobuf", "application/x-protostuff", "text/html" })
@Path("/list")
@GZIP
@Interceptors(ResponseInterceptor.class)
public ModelList listModelNames(@QueryParam("modelTableName") String modelTableName) {
if (modelTableName == null) {
modelTableName = defaultModelTableName;
}
ModelList response = new ModelList(jqueryUri, dataTablesUri, modelTableName);
// Find out who/what called this method
Principal p = ctx.getCallerPrincipal();
String user = p.getName();
Set<Authorizations> cbAuths = new HashSet<>();
if (p instanceof DatawavePrincipal) {
DatawavePrincipal cp = (DatawavePrincipal) p;
user = cp.getShortName();
for (Collection<String> auths : cp.getAuthorizations()) {
cbAuths.add(new Authorizations(auths.toArray(new String[auths.size()])));
}
}
log.trace(user + " has authorizations " + cbAuths);
Connector connector = null;
HashSet<String> modelNames = new HashSet<>();
try {
Map<String, String> trackingMap = connectionFactory.getTrackingMap(Thread.currentThread().getStackTrace());
connector = connectionFactory.getConnection(AccumuloConnectionFactory.Priority.LOW, trackingMap);
try (Scanner scanner = ScannerHelper.createScanner(connector, this.checkModelTableName(modelTableName), cbAuths)) {
for (Entry<Key, Value> entry : scanner) {
String colf = entry.getKey().getColumnFamily().toString();
if (!RESERVED_COLF_VALUES.contains(colf) && !modelNames.contains(colf)) {
String[] parts = colf.split(ModelKeyParser.NULL_BYTE);
if (parts.length == 1)
modelNames.add(colf);
else if (parts.length == 2)
modelNames.add(parts[0]);
}
}
}
} catch (Exception e) {
QueryException qe = new QueryException(DatawaveErrorCode.MODEL_NAME_LIST_ERROR, e);
log.error(qe);
response.addException(qe.getBottomQueryException());
throw new DatawaveWebApplicationException(qe, response);
} finally {
if (null != connector) {
try {
connectionFactory.returnConnection(connector);
} catch (Exception e) {
log.error("Error returning connection to factory", e);
}
}
}
response.setNames(modelNames);
return response;
}
use of datawave.webservice.common.exception.DatawaveWebApplicationException in project datawave by NationalSecurityAgency.
the class ModelBean method getModel.
/**
* Retrieve the model and all of its mappings
*
* @param name
* model name
* @param modelTableName
* name of the table that contains the model
* @return datawave.webservice.model.Model
* @RequestHeader X-ProxiedEntitiesChain use when proxying request for user
*
* @HTTP 200 success
* @HTTP 404 model not found
* @HTTP 500 internal server error
*/
@GET
@Produces({ "application/xml", "text/xml", "application/json", "text/yaml", "text/x-yaml", "application/x-yaml", "application/x-protobuf", "application/x-protostuff", "text/html" })
@Path("/{name}")
@GZIP
@Interceptors({ RequiredInterceptor.class, ResponseInterceptor.class })
public datawave.webservice.model.Model getModel(@Required("name") @PathParam("name") String name, @QueryParam("modelTableName") String modelTableName) {
if (modelTableName == null) {
modelTableName = defaultModelTableName;
}
datawave.webservice.model.Model response = new datawave.webservice.model.Model(jqueryUri, dataTablesUri);
// Find out who/what called this method
Principal p = ctx.getCallerPrincipal();
String user = p.getName();
Set<Authorizations> cbAuths = new HashSet<>();
if (p instanceof DatawavePrincipal) {
DatawavePrincipal cp = (DatawavePrincipal) p;
user = cp.getShortName();
for (Collection<String> auths : cp.getAuthorizations()) {
cbAuths.add(new Authorizations(auths.toArray(new String[auths.size()])));
}
}
log.trace(user + " has authorizations " + cbAuths);
Connector connector = null;
try {
Map<String, String> trackingMap = connectionFactory.getTrackingMap(Thread.currentThread().getStackTrace());
connector = connectionFactory.getConnection(AccumuloConnectionFactory.Priority.LOW, trackingMap);
try (Scanner scanner = ScannerHelper.createScanner(connector, this.checkModelTableName(modelTableName), cbAuths)) {
IteratorSetting cfg = new IteratorSetting(21, "colfRegex", RegExFilter.class.getName());
cfg.addOption(RegExFilter.COLF_REGEX, "^" + name + "(\\x00.*)?");
scanner.addScanIterator(cfg);
for (Entry<Key, Value> entry : scanner) {
FieldMapping mapping = ModelKeyParser.parseKey(entry.getKey(), cbAuths);
response.getFields().add(mapping);
}
}
} catch (Exception e) {
QueryException qe = new QueryException(DatawaveErrorCode.MODEL_FETCH_ERROR, e);
log.error(qe);
response.addException(qe.getBottomQueryException());
throw new DatawaveWebApplicationException(qe, response);
} finally {
if (null != connector) {
try {
connectionFactory.returnConnection(connector);
} catch (Exception e) {
log.error("Error returning connection to factory", e);
}
}
}
// return 404 if model not found
if (response.getFields().isEmpty()) {
throw new NotFoundException(null, response);
}
response.setName(name);
return response;
}
use of datawave.webservice.common.exception.DatawaveWebApplicationException in project datawave by NationalSecurityAgency.
the class ModelBean method deleteMapping.
private VoidResponse deleteMapping(datawave.webservice.model.Model model, String modelTableName, boolean reloadCache) {
VoidResponse response = new VoidResponse();
Connector connector = null;
BatchWriter writer = null;
String tableName = this.checkModelTableName(modelTableName);
try {
Map<String, String> trackingMap = connectionFactory.getTrackingMap(Thread.currentThread().getStackTrace());
connector = connectionFactory.getConnection(AccumuloConnectionFactory.Priority.LOW, trackingMap);
writer = connector.createBatchWriter(tableName, new BatchWriterConfig().setMaxLatency(BATCH_WRITER_MAX_LATENCY, TimeUnit.MILLISECONDS).setMaxMemory(BATCH_WRITER_MAX_MEMORY).setMaxWriteThreads(BATCH_WRITER_MAX_THREADS));
for (FieldMapping mapping : model.getFields()) {
Mutation m = ModelKeyParser.createDeleteMutation(mapping, model.getName());
writer.addMutation(m);
}
} catch (Exception e) {
log.error("Could not delete mapping.", e);
QueryException qe = new QueryException(DatawaveErrorCode.MAPPING_DELETION_ERROR, e);
response.addException(qe.getBottomQueryException());
throw new DatawaveWebApplicationException(qe, response);
} finally {
if (null != writer) {
try {
writer.close();
} catch (MutationsRejectedException e1) {
QueryException qe = new QueryException(DatawaveErrorCode.WRITER_CLOSE_ERROR, e1);
log.error(qe);
response.addException(qe);
throw new DatawaveWebApplicationException(qe, response);
}
}
if (null != connector) {
try {
connectionFactory.returnConnection(connector);
} catch (Exception e) {
log.error("Error returning connection to factory", e);
}
}
}
if (reloadCache)
cache.reloadCache(tableName);
return response;
}
use of datawave.webservice.common.exception.DatawaveWebApplicationException in project datawave by NationalSecurityAgency.
the class QueryExecutorBean method close.
private VoidResponse close(String id, Principal principal) {
VoidResponse response = new VoidResponse();
try {
boolean connectionRequestCanceled = accumuloConnectionRequestBean.cancelConnectionRequest(id, principal);
Pair<QueryLogic<?>, Connector> tuple = qlCache.pollIfOwnedBy(id, ((DatawavePrincipal) principal).getShortName());
if (tuple == null) {
try {
RunningQuery query = getQueryById(id, principal);
close(query);
} catch (Exception e) {
log.debug("Failed to close " + id + ", checking if closed previously");
// if this is a query that is in the closed query cache, then we have already successfully closed this query so ignore
if (!closedQueryCache.exists(id)) {
log.debug("Failed to close " + id + ", checking if connection request was canceled");
// if connection request was canceled, then the call was successful even if a RunningQuery was not found
if (!connectionRequestCanceled) {
log.error("Failed to close " + id, e);
throw e;
}
}
}
response.addMessage(id + " closed.");
} else {
QueryLogic<?> logic = tuple.getFirst();
try {
logic.close();
} catch (Exception e) {
log.error("Exception occurred while closing query logic; may be innocuous if scanners were running.", e);
}
connectionFactory.returnConnection(tuple.getSecond());
response.addMessage(id + " closed before create completed.");
}
// no longer need to remember this query
closedQueryCache.remove(id);
return response;
} catch (DatawaveWebApplicationException e) {
throw e;
} catch (Exception e) {
QueryException qe = new QueryException(DatawaveErrorCode.CLOSE_ERROR, e, MessageFormat.format("query_id: {0}", id));
log.error(qe, e);
response.addException(qe.getBottomQueryException());
int statusCode = qe.getBottomQueryException().getStatusCode();
throw new DatawaveWebApplicationException(qe, response, statusCode);
}
}
use of datawave.webservice.common.exception.DatawaveWebApplicationException in project datawave by NationalSecurityAgency.
the class QueryExecutorBean method next.
private BaseQueryResponse next(final String id, boolean checkForContentLookup) {
// in case we don't make it to creating the response from the QueryLogic
BaseQueryResponse response = responseObjectFactory.getEventQueryResponse();
Collection<String> proxyServers = null;
Principal p = ctx.getCallerPrincipal();
String userid = p.getName();
if (p instanceof DatawavePrincipal) {
DatawavePrincipal dp = (DatawavePrincipal) p;
userid = dp.getShortName();
proxyServers = dp.getProxyServers();
}
Span span = null;
RunningQuery query = null;
Query contentLookupSettings = null;
try {
ctx.getUserTransaction().begin();
// Not calling getQueryById() here. We don't want to pull the persisted definition.
query = queryCache.get(id);
// The lock should be released at the end of the method call.
if (!queryCache.lock(id)) {
throw new QueryException(DatawaveErrorCode.QUERY_LOCKED_ERROR);
}
// an error.
if (null == query || null == query.getConnection()) {
// status code.
if (null == query) {
List<Query> queries = persister.findById(id);
if (queries == null || queries.size() != 1) {
throw new NotFoundQueryException(DatawaveErrorCode.NO_QUERY_OBJECT_MATCH, MessageFormat.format("{0}", id));
}
}
throw new PreConditionFailedQueryException(DatawaveErrorCode.QUERY_TIMEOUT_OR_SERVER_ERROR, MessageFormat.format("id = {0}", id));
} else {
// Validate the query belongs to the caller
if (!query.getSettings().getOwner().equals(userid)) {
throw new UnauthorizedQueryException(DatawaveErrorCode.QUERY_OWNER_MISMATCH, MessageFormat.format("{0} != {1}", userid, query.getSettings().getOwner()));
}
// Set the active call and get next
query.setActiveCall(true);
response = _next(query, id, proxyServers, span);
// Conditionally swap the standard response with content
if (checkForContentLookup) {
final Query settings = query.getSettings();
final Parameter contentLookupParam = settings.findParameter(LookupUUIDUtil.PARAM_CONTENT_LOOKUP);
if ((null != contentLookupParam) && Boolean.parseBoolean(contentLookupParam.getParameterValue())) {
contentLookupSettings = settings;
}
}
// Unset the active call and return
query.setActiveCall(false);
}
} catch (NoResultsException e) {
if (query != null) {
query.setActiveCall(false);
if (query.getLogic().getCollectQueryMetrics()) {
try {
// do not set the error message here - zero results is not an error that should be added to metrics
metrics.updateMetric(query.getMetric());
} catch (Exception e1) {
log.error(e1.getMessage());
}
}
}
try {
ctx.getUserTransaction().setRollbackOnly();
} catch (Exception ex) {
log.error("Error marking transaction for roll back", ex);
}
// close the query, as there were no results and we are done here
close(id);
// remember that we auto-closed this query
closedQueryCache.add(id);
throw e;
} catch (DatawaveWebApplicationException e) {
if (query != null) {
query.setActiveCall(false);
if (query.getLogic().getCollectQueryMetrics()) {
query.getMetric().setError(e);
try {
metrics.updateMetric(query.getMetric());
} catch (Exception e1) {
log.error("Error updating query metrics", e1);
}
}
}
try {
ctx.getUserTransaction().setRollbackOnly();
} catch (Exception ex) {
log.error("Error marking transaction for roll back", ex);
}
if (e.getCause() instanceof NoResultsException) {
close(id);
// remember that we auto-closed this query
closedQueryCache.add(id);
}
throw e;
} catch (Exception e) {
log.error("Query Failed", e);
if (query != null) {
query.setActiveCall(false);
if (query.getLogic().getCollectQueryMetrics() == true) {
query.getMetric().setError(e);
try {
metrics.updateMetric(query.getMetric());
} catch (Exception e1) {
log.error("Error updating query metrics", e1);
}
}
}
try {
ctx.getUserTransaction().setRollbackOnly();
} catch (Exception ex) {
log.error("Error marking transaction for roll back", ex);
}
QueryException qe = new QueryException(DatawaveErrorCode.QUERY_NEXT_ERROR, e, MessageFormat.format("query id: {0}", id));
if (e.getCause() instanceof NoResultsException) {
log.debug("Got a nested NoResultsException", e);
close(id);
// remember that we auto-closed this query
closedQueryCache.add(id);
} else {
try {
close(id);
} catch (Exception ce) {
log.error(qe, ce);
}
log.error(qe, e);
response.addException(qe.getBottomQueryException());
}
int statusCode = qe.getBottomQueryException().getStatusCode();
throw new DatawaveWebApplicationException(qe, response, statusCode);
} finally {
queryCache.unlock(id);
try {
if (ctx.getUserTransaction().getStatus() == Status.STATUS_MARKED_ROLLBACK) {
ctx.getUserTransaction().rollback();
} else if (ctx.getUserTransaction().getStatus() != Status.STATUS_NO_TRANSACTION) {
// no reason to commit if transaction not started, ie Query not found exception
ctx.getUserTransaction().commit();
}
} catch (IllegalStateException e) {
log.error("Error committing transaction: thread not associated with transaction", e);
} catch (RollbackException e) {
log.error("Error committing transaction: marked for rollback due to error", e);
} catch (HeuristicMixedException e) {
log.error("Error committing transaction: partial commit of resources", e);
} catch (HeuristicRollbackException e) {
log.error("Error committing transaction: resources rolled back transaction", e);
} catch (Exception e) {
log.error("Error committing transaction: Unknown error", e);
} finally {
// Stop timing on this trace, if any
if (span != null) {
span.stop();
}
}
}
// If applicable, perform a paged content lookup (i.e., not streamed), replacing its results in the returned response
if (null != contentLookupSettings) {
final NextContentCriteria criteria = new NextContentCriteria(id, contentLookupSettings);
response = this.lookupUUIDUtil.lookupContentByNextResponse(criteria, response);
}
return response;
}
Aggregations