use of eu.europeana.metis.schema.jibx.AboutType in project metis-framework by europeana.
the class MetisRecordParser method parseReferences.
@Override
public Set<ReferenceTermContext> parseReferences(RDF rdf) {
// Get all direct references (also look in Europeana proxy as it may have been dereferenced - we
// use this below to follow sameAs links).
final List<ProxyType> proxies = Optional.ofNullable(rdf.getProxyList()).stream().flatMap(Collection::stream).filter(Objects::nonNull).collect(Collectors.toList());
final Map<String, Set<ProxyFieldType>> directReferences = new HashMap<>();
for (ProxyFieldType field : ProxyFieldType.values()) {
final Set<String> directLinks = proxies.stream().map(field::extractFieldLinksForEnrichment).flatMap(Set::stream).collect(Collectors.toSet());
for (String directLink : directLinks) {
directReferences.computeIfAbsent(directLink, key -> new HashSet<>()).add(field);
}
}
// Get all sameAs links from the directly referenced contextual entities.
final Map<String, Set<ProxyFieldType>> indirectReferences = new HashMap<>();
final Consumer<AboutType> contextualTypeProcessor = contextualClass -> {
final Set<ProxyFieldType> linkTypes = Optional.ofNullable(directReferences.get(contextualClass.getAbout())).orElseGet(Collections::emptySet);
if (!linkTypes.isEmpty()) {
for (String sameAsLink : getSameAsLinks(contextualClass)) {
indirectReferences.computeIfAbsent(sameAsLink, key -> new HashSet<>()).addAll(linkTypes);
}
}
};
Optional.ofNullable(rdf.getAgentList()).orElseGet(Collections::emptyList).forEach(contextualTypeProcessor);
Optional.ofNullable(rdf.getConceptList()).orElseGet(Collections::emptyList).forEach(contextualTypeProcessor);
Optional.ofNullable(rdf.getPlaceList()).orElseGet(Collections::emptyList).forEach(contextualTypeProcessor);
Optional.ofNullable(rdf.getTimeSpanList()).orElseGet(Collections::emptyList).forEach(contextualTypeProcessor);
// Merge the two maps.
final Map<String, Set<ProxyFieldType>> resultMap = mergeMapInto(directReferences, indirectReferences);
// Clean up the result: no null values. But objects we already have need to
// stay: maybe they are matched using a sameAs link.
resultMap.remove(null);
// Convert and done
final Set<ReferenceTermContext> result = new HashSet<>();
for (Map.Entry<String, Set<ProxyFieldType>> entry : resultMap.entrySet()) {
ReferenceTermContext value;
try {
value = new ReferenceTermContext(new URL(entry.getKey()), entry.getValue());
result.add(value);
} catch (MalformedURLException e) {
LOGGER.debug("Invalid enrichment reference found: {}", entry.getKey());
}
}
return result;
}
use of eu.europeana.metis.schema.jibx.AboutType in project metis-framework by europeana.
the class ItemExtractorUtilsTest method testSetAbout.
@Test
void testSetAbout() {
EnrichmentBase enrichmentBase = new Agent();
AboutType aboutType = new AboutType();
enrichmentBase.setAbout("About");
ItemExtractorUtils.setAbout(enrichmentBase, aboutType);
assertEquals("About", aboutType.getAbout());
}
use of eu.europeana.metis.schema.jibx.AboutType in project metis-framework by europeana.
the class RdfEntityUtils method replaceValueWithLinkInAggregation.
/**
* Replace matching aggregation values with their found corresponding links.
*
* @param rdf the rdf to update
* @param link the about value to use
* @param searchTermAggregation the aggregation search term to use for finding the matched values
*/
public static void replaceValueWithLinkInAggregation(RDF rdf, String link, SearchTermContext searchTermAggregation) {
final List<Aggregation> aggregationList = rdf.getAggregationList();
for (FieldType<? extends AboutType> aggregationFieldType : searchTermAggregation.getFieldTypes()) {
aggregationList.stream().flatMap(((AggregationFieldType) aggregationFieldType)::extractFields).filter(resourceOrLiteralType -> resourceOrLiteralAndSearchTermEquality(resourceOrLiteralType, searchTermAggregation)).forEach(resourceOrLiteralType -> {
final Resource resource = new Resource();
resource.setResource(link);
resourceOrLiteralType.setResource(resource);
resourceOrLiteralType.setLang(new Lang());
resourceOrLiteralType.setString("");
});
}
}
use of eu.europeana.metis.schema.jibx.AboutType in project metis-framework by europeana.
the class EnablingElementTest method testChoiceElementWithCandidateGroups.
private <T extends ResourceOrLiteralType> void testChoiceElementWithCandidateGroups(EnablingElement element, Set<ContextualClassGroup> candidates, Supplier<T> constructor, BiConsumer<Choice, T> setter) {
// Do the testing on the links.
final BiConsumer<ProxyType, List<T>> objectSetter = (proxy, values) -> {
proxy.setChoiceList(new ArrayList<>());
Optional.ofNullable(values).stream().flatMap(Collection::stream).forEach(value -> {
final Choice choice = new Choice();
proxy.getChoiceList().add(choice);
setter.accept(choice, value);
});
};
final BiConsumer<T, String> linkSetter = (value, link) -> {
value.setResource(new Resource());
value.getResource().setResource(link);
};
testElementWithCandidateGroups(element, candidates, constructor, objectSetter, linkSetter);
// Test literals: they do not create any match (but links still do, proving the setup is correct).
final String link = "link";
final Map<String, Set<Class<? extends AboutType>>> typeMap = Collections.singletonMap(link, getTypes(EnumSet.allOf(ContextualClassGroup.class)));
final T value = constructor.get();
value.setString(link);
final ProxyType proxy = new ProxyType();
objectSetter.accept(proxy, Collections.singletonList(value));
assertTrue(element.analyze(Collections.singletonList(proxy), typeMap).isEmpty());
linkSetter.accept(value, link);
assertEquals(candidates, element.analyze(Collections.singletonList(proxy), typeMap));
}
Aggregations