use of ddf.catalog.data.Metacard in project ddf by codice.
the class OpenSearchSource method query.
@Override
public SourceResponse query(QueryRequest queryRequest) throws UnsupportedQueryException {
String methodName = "query";
LOGGER.trace(methodName);
Serializable metacardId = queryRequest.getPropertyValue(Metacard.ID);
SourceResponseImpl response = null;
Subject subject = null;
WebClient restWebClient = null;
if (queryRequest.hasProperties()) {
Object subjectObj = queryRequest.getProperties().get(SecurityConstants.SECURITY_SUBJECT);
subject = (Subject) subjectObj;
}
restWebClient = factory.getWebClientForSubject(subject);
Query query = queryRequest.getQuery();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Received query: " + query);
}
boolean canDoOpenSearch = setOpenSearchParameters(query, subject, restWebClient);
if (canDoOpenSearch) {
InputStream responseStream = performRequest(restWebClient);
response = new SourceResponseImpl(queryRequest, new ArrayList<Result>());
if (responseStream != null) {
response = processResponse(responseStream, queryRequest);
}
} else {
if (StringUtils.isEmpty((String) metacardId)) {
OpenSearchFilterVisitor visitor = new OpenSearchFilterVisitor();
query.accept(visitor, null);
metacardId = visitor.getMetacardId();
}
restWebClient = newRestClient(query, (String) metacardId, false, subject);
if (restWebClient != null) {
InputStream responseStream = performRequest(restWebClient);
Metacard metacard = null;
List<Result> resultQueue = new ArrayList<Result>();
try (TemporaryFileBackedOutputStream fileBackedOutputStream = new TemporaryFileBackedOutputStream()) {
if (responseStream != null) {
IOUtils.copyLarge(responseStream, fileBackedOutputStream);
InputTransformer inputTransformer = null;
try (InputStream inputStream = fileBackedOutputStream.asByteSource().openStream()) {
inputTransformer = getInputTransformer(inputStream);
} catch (IOException e) {
LOGGER.debug("Problem with transformation.", e);
}
if (inputTransformer != null) {
try (InputStream inputStream = fileBackedOutputStream.asByteSource().openStream()) {
metacard = inputTransformer.transform(inputStream);
} catch (IOException e) {
LOGGER.debug("Problem with transformation.", e);
}
}
}
} catch (IOException | CatalogTransformerException e) {
LOGGER.debug("Problem with transformation.", e);
}
if (metacard != null) {
metacard.setSourceId(getId());
ResultImpl result = new ResultImpl(metacard);
resultQueue.add(result);
response = new SourceResponseImpl(queryRequest, resultQueue);
response.setHits(resultQueue.size());
}
}
}
LOGGER.trace(methodName);
return response;
}
use of ddf.catalog.data.Metacard in project ddf by codice.
the class OpenSearchSource method createResponseFromEntry.
/**
* Creates a single response from input parameters. Performs XPath operations on the document to
* retrieve data not passed in.
*
* @param entry a single Atom entry
* @return single response
* @throws ddf.catalog.source.UnsupportedQueryException
*/
private List<Result> createResponseFromEntry(SyndEntry entry) throws UnsupportedQueryException {
String id = entry.getUri();
if (id != null && !id.isEmpty()) {
id = id.substring(id.lastIndexOf(':') + 1);
}
List<SyndContent> contents = entry.getContents();
List<SyndCategory> categories = entry.getCategories();
List<Metacard> metacards = new ArrayList<>();
List<Element> foreignMarkup = entry.getForeignMarkup();
String relevance = "";
String source = "";
for (Element element : foreignMarkup) {
if (element.getName().equals("score")) {
relevance = element.getContent(0).getValue();
}
}
//we currently do not support downloading content via an RSS enclosure, this support can be added at a later date if we decide to include it
for (SyndContent content : contents) {
MetacardImpl metacard = getMetacardImpl(parseContent(content.getValue(), id));
metacard.setSourceId(this.shortname);
String title = metacard.getTitle();
if (StringUtils.isEmpty(title)) {
metacard.setTitle(entry.getTitle());
}
if (!source.isEmpty()) {
metacard.setSourceId(source);
}
metacards.add(metacard);
}
for (int i = 0; i < categories.size() && i < metacards.size(); i++) {
SyndCategory category = categories.get(i);
Metacard metacard = metacards.get(i);
if (StringUtils.isBlank(metacard.getContentTypeName())) {
((MetacardImpl) metacard).setContentTypeName(category.getName());
}
}
List<Result> results = new ArrayList<>();
for (Metacard metacard : metacards) {
ResultImpl result = new ResultImpl(metacard);
if (relevance == null || relevance.isEmpty()) {
LOGGER.debug("couldn't find valid relevance. Setting relevance to 0");
relevance = "0";
}
result.setRelevanceScore(new Double(relevance));
results.add(result);
}
return results;
}
use of ddf.catalog.data.Metacard in project ddf by codice.
the class TestOpenSearchSource method testQueryBySearchPhrase.
@Test
public void testQueryBySearchPhrase() throws UnsupportedQueryException, URISyntaxException, IOException {
Response clientResponse = mock(Response.class);
when(clientResponse.getStatus()).thenReturn(Response.Status.OK.getStatusCode());
when(clientResponse.getEntity()).thenReturn(getSampleAtomStream());
WebClient client = mock(WebClient.class);
when(client.get()).thenReturn(clientResponse);
SecureCxfClientFactory factory = getMockFactory(client);
OverriddenOpenSearchSource source = new OverriddenOpenSearchSource(FILTER_ADAPTER, encryptionService);
source.setInputTransformer(getMockInputTransformer());
source.setEndpointUrl("http://localhost:8181/services/catalog/query");
source.init();
source.setParameters(DEFAULT_PARAMETERS);
source.factory = factory;
Filter filter = filterBuilder.attribute(Metacard.METADATA).like().text(SAMPLE_SEARCH_PHRASE);
// when
QueryRequestImpl queryRequest = new QueryRequestImpl(new QueryImpl(filter));
Map<String, Serializable> properties = new HashMap<>();
properties.put(SecurityConstants.SECURITY_SUBJECT, mock(Subject.class));
queryRequest.setProperties(properties);
SourceResponse response = source.query(queryRequest);
Assert.assertEquals(1, response.getHits());
List<Result> results = response.getResults();
Assert.assertTrue(results.size() == 1);
Result result = results.get(0);
Metacard metacard = result.getMetacard();
Assert.assertNotNull(metacard);
Assert.assertEquals("Resource", metacard.getContentTypeName());
}
use of ddf.catalog.data.Metacard in project ddf by codice.
the class TestOpenSearchSource method testQueryBySearchPhraseContentTypeSetRss.
@Test
public void testQueryBySearchPhraseContentTypeSetRss() throws UnsupportedQueryException, URISyntaxException, IOException {
WebClient client = mock(WebClient.class);
Response clientResponse = mock(Response.class);
when(client.get()).thenReturn(clientResponse);
when(clientResponse.getStatus()).thenReturn(Response.Status.OK.getStatusCode());
when(clientResponse.getEntity()).thenReturn(getSampleRssStream());
SecureCxfClientFactory factory = getMockFactory(client);
OverriddenOpenSearchSource source = new OverriddenOpenSearchSource(FILTER_ADAPTER, encryptionService);
InputTransformer inputTransformer = mock(InputTransformer.class);
MetacardImpl generatedMetacard = new MetacardImpl();
generatedMetacard.setMetadata(getSample());
generatedMetacard.setId(SAMPLE_ID);
generatedMetacard.setContentTypeName("myType");
try {
when(inputTransformer.transform(isA(InputStream.class))).thenReturn(generatedMetacard);
when(inputTransformer.transform(isA(InputStream.class), isA(String.class))).thenReturn(generatedMetacard);
} catch (IOException e) {
fail();
} catch (CatalogTransformerException e) {
fail();
}
source.setInputTransformer(inputTransformer);
source.setEndpointUrl("http://localhost:8181/services/catalog/query");
source.init();
source.setParameters(DEFAULT_PARAMETERS);
source.factory = factory;
Filter filter = filterBuilder.attribute(Metacard.METADATA).like().text(SAMPLE_SEARCH_PHRASE);
SourceResponse response = source.query(new QueryRequestImpl(new QueryImpl(filter)));
Assert.assertEquals(1, response.getHits());
List<Result> results = response.getResults();
Assert.assertTrue(results.size() == 1);
Result result = results.get(0);
Metacard metacard = result.getMetacard();
Assert.assertNotNull(metacard);
Assert.assertEquals("myType", metacard.getContentTypeName());
}
use of ddf.catalog.data.Metacard in project ddf by codice.
the class TestOpenSearchSource method testQueryBySearchPhraseContentTypeSet.
@Test
public void testQueryBySearchPhraseContentTypeSet() throws UnsupportedQueryException, URISyntaxException, IOException {
WebClient client = mock(WebClient.class);
Response clientResponse = mock(Response.class);
when(client.get()).thenReturn(clientResponse);
when(clientResponse.getStatus()).thenReturn(Response.Status.OK.getStatusCode());
when(clientResponse.getEntity()).thenReturn(getSampleAtomStream());
SecureCxfClientFactory factory = getMockFactory(client);
OverriddenOpenSearchSource source = new OverriddenOpenSearchSource(FILTER_ADAPTER, encryptionService);
InputTransformer inputTransformer = mock(InputTransformer.class);
MetacardImpl generatedMetacard = new MetacardImpl();
generatedMetacard.setMetadata(getSample());
generatedMetacard.setId(SAMPLE_ID);
generatedMetacard.setContentTypeName("myType");
try {
when(inputTransformer.transform(isA(InputStream.class))).thenReturn(generatedMetacard);
when(inputTransformer.transform(isA(InputStream.class), isA(String.class))).thenReturn(generatedMetacard);
} catch (IOException e) {
fail();
} catch (CatalogTransformerException e) {
fail();
}
source.setInputTransformer(inputTransformer);
source.setEndpointUrl("http://localhost:8181/services/catalog/query");
source.init();
source.setParameters(DEFAULT_PARAMETERS);
source.factory = factory;
Filter filter = filterBuilder.attribute(Metacard.METADATA).like().text(SAMPLE_SEARCH_PHRASE);
SourceResponse response = source.query(new QueryRequestImpl(new QueryImpl(filter)));
Assert.assertEquals(1, response.getHits());
List<Result> results = response.getResults();
Assert.assertTrue(results.size() == 1);
Result result = results.get(0);
Metacard metacard = result.getMetacard();
Assert.assertNotNull(metacard);
Assert.assertEquals("myType", metacard.getContentTypeName());
}
Aggregations