in persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java [831:892]
private <T extends Item> T load(final String itemId, final Class<T> clazz, final String customItemType) {
if (StringUtils.isEmpty(itemId)) {
return null;
}
return new InClassLoaderExecute<T>(metricsService, this.getClass().getName() + ".loadItem", this.bundleContext, this.fatalIllegalStateErrors, throwExceptions) {
protected T execute(Object... args) throws Exception {
try {
String itemType = Item.getItemType(clazz);
if (customItemType != null) {
itemType = customItemType;
}
String documentId = getDocumentIDForItemType(itemId, itemType);
boolean sessionSpecialDirectAccess = sessionLatestIndex != null && Session.ITEM_TYPE.equals(itemType) ;
if (!sessionSpecialDirectAccess && isItemTypeRollingOver(itemType)) {
return new MetricAdapter<T>(metricsService, ".loadItemWithQuery") {
@Override
public T execute(Object... args) throws Exception {
if (customItemType == null) {
PartialList<T> r = query(QueryBuilders.idsQuery().addIds(documentId), null, clazz, 0, 1, null, null);
if (r.size() > 0) {
return r.get(0);
}
} else {
PartialList<CustomItem> r = query(QueryBuilders.idsQuery().addIds(documentId), null, customItemType, 0, 1, null, null);
if (r.size() > 0) {
return (T) r.get(0);
}
}
return null;
}
}.execute();
} else {
// Special handling for session we check the latest available index directly to speed up session loading
GetRequest getRequest = new GetRequest(sessionSpecialDirectAccess ? sessionLatestIndex : getIndex(itemType), documentId);
GetResponse response = client.get(getRequest, RequestOptions.DEFAULT);
if (response.isExists()) {
String sourceAsString = response.getSourceAsString();
final T value = ESCustomObjectMapper.getObjectMapper().readValue(sourceAsString, clazz);
setMetadata(value, response.getId(), response.getVersion(), response.getSeqNo(), response.getPrimaryTerm(), response.getIndex());
return value;
} else {
return null;
}
}
} catch (ElasticsearchStatusException ese) {
if (ese.status().equals(RestStatus.NOT_FOUND)) {
// this can happen if we are just testing the existence of the item, it is not always an error.
return null;
}
throw new Exception("Error loading itemType=" + clazz.getName() + " customItemType=" + customItemType + " itemId=" + itemId, ese);
} catch (IndexNotFoundException e) {
// this can happen if we are just testing the existence of the item, it is not always an error.
return null;
} catch (Exception ex) {
throw new Exception("Error loading itemType=" + clazz.getName() + " customItemType=" + customItemType + " itemId=" + itemId, ex);
}
}
}.catchingExecuteInClassLoader(true);
}