Revision 46587
Added by Alessia Bardi about 7 years ago
XmlRecordFactory.java | ||
---|---|---|
13 | 13 |
import com.google.common.base.Joiner; |
14 | 14 |
import com.google.common.base.Predicate; |
15 | 15 |
import com.google.common.base.Splitter; |
16 |
import com.google.common.collect.Iterables; |
|
16 | 17 |
import com.google.common.collect.Lists; |
17 | 18 |
import com.google.common.collect.Maps; |
18 | 19 |
import com.google.common.collect.Sets; |
... | ... | |
33 | 34 |
import eu.dnetlib.data.proto.ResultProtos.Result.ExternalReference; |
34 | 35 |
import eu.dnetlib.data.proto.ResultProtos.Result.Instance; |
35 | 36 |
import eu.dnetlib.data.proto.ResultProtos.Result.Journal; |
37 |
import eu.dnetlib.data.proto.TypeProtos; |
|
36 | 38 |
import eu.dnetlib.data.proto.TypeProtos.Type; |
37 | 39 |
import eu.dnetlib.miscutils.functional.UnaryFunction; |
38 | 40 |
import org.apache.commons.lang.StringUtils; |
... | ... | |
67 | 69 |
protected Map<String, Integer> counters = Maps.newHashMap(); |
68 | 70 |
protected Transformer transformer; |
69 | 71 |
|
72 |
protected static Predicate<String> instanceFilter = new Predicate<String>() { |
|
73 |
final Set<String> instanceFieldFilter = Sets.newHashSet("instancetype", "hostedby", "licence"); |
|
74 |
@Override |
|
75 |
public boolean apply(final String s) { |
|
76 |
return instanceFieldFilter.contains(s); |
|
77 |
} |
|
78 |
}; |
|
79 |
|
|
70 | 80 |
public XmlRecordFactory(final EntityConfigTable entityConfigTable, final ContextMapper contextMapper, final RelClasses relClasses, |
71 | 81 |
final String schemaLocation, final boolean entityDefaults, final boolean relDefaults, final boolean childDefeaults, final Set<String> otherDatasourceTypesUForUI) |
72 | 82 |
throws TransformerConfigurationException, TransformerFactoryConfigurationError { |
... | ... | |
156 | 166 |
// log.info("chi: " + children); |
157 | 167 |
// log.info("============="); |
158 | 168 |
|
159 |
final Type type = entity.getType();
|
|
160 |
final List<String> metadata = decodeType(entity, null, entityDefaults, false);
|
|
169 |
final Predicate<String> filter = entityConfigTable.getFilter(entity.getType());
|
|
170 |
final List<String> metadata = decodeType(entity, filter, entityDefaults, false);
|
|
161 | 171 |
|
162 | 172 |
// rels has to be processed before the contexts because they enrich the contextMap with the funding info. |
163 | 173 |
final List<String> rels = listRelations(); |
164 |
metadata.addAll(buildContexts(type));
|
|
174 |
metadata.addAll(buildContexts(entity.getType()));
|
|
165 | 175 |
metadata.add(parseDataInfo(mainEntity)); |
166 | 176 |
|
167 |
final String body = templateFactory.buildBody(type, metadata, rels, listChildren(), extraInfo);
|
|
177 |
final String body = templateFactory.buildBody(entity.getType(), metadata, rels, listChildren(), extraInfo);
|
|
168 | 178 |
|
169 | 179 |
return templateFactory |
170 |
.buildRecord(type, key, entity.getDateOfCollection(), entity.getDateOfTransformation(), schemaLocation, body, countersAsXml());
|
|
180 |
.buildRecord(key, entity.getDateOfCollection(), entity.getDateOfTransformation(), schemaLocation, body, countersAsXml()); |
|
171 | 181 |
} catch (final Throwable e) { |
172 | 182 |
throw new RuntimeException(String.format("error building record '%s'", this.key), e); |
173 | 183 |
} |
... | ... | |
188 | 198 |
return sb.toString(); |
189 | 199 |
} |
190 | 200 |
|
191 |
private List<String> decodeType(final OafEntityDecoder decoder, final Set<String> filter, final boolean defaults, final boolean expandingRel) {
|
|
201 |
private List<String> decodeType(final OafEntityDecoder decoder, final Predicate<String> filter, final boolean defaults, final boolean expandingRel) {
|
|
192 | 202 |
|
193 | 203 |
final List<String> metadata = Lists.newArrayList(); |
194 | 204 |
metadata.addAll(listFields(decoder.getMetadata(), filter, defaults, expandingRel)); |
... | ... | |
238 | 248 |
if (relDecoder.getRelSourceId().equals(key) || relDecoder.getRelTargetId().equals(key)) { |
239 | 249 |
|
240 | 250 |
final List<String> metadata = Lists.newArrayList(); |
241 |
final Type targetType = relDecoder.getTargetType(mainEntity.getEntity().getType()); |
|
242 |
final Set<String> relFilter = entityConfigTable.getFilter(targetType, relDecoder.getRelDescriptor()); |
|
243 |
metadata.addAll(listFields(relDecoder.getSubRel(), relFilter, false, true));
|
|
251 |
final TypeProtos.Type targetType = relDecoder.getTargetType(mainEntity.getEntity().getType());
|
|
252 |
//final Set<String> relFilter = entityConfigTable.getFilter(targetType, relDecoder.getRelDescriptor());
|
|
253 |
metadata.addAll(listFields(relDecoder.getSubRel(), entityConfigTable.getIncludeFilter(targetType, relDecoder.getRelDescriptor()), false, true));
|
|
244 | 254 |
|
245 | 255 |
String semanticclass = ""; |
246 | 256 |
String semanticscheme = ""; |
... | ... | |
249 | 259 |
|
250 | 260 |
if ((cachedTarget != null) && cachedTarget.isInitialized()) { |
251 | 261 |
|
252 |
final Set<String> filter = entityConfigTable.getFilter(targetType, relDescriptor); |
|
262 |
//final Set<String> filter = entityConfigTable.getFilter(targetType, relDescriptor);
|
|
253 | 263 |
final OafEntityDecoder d = OafEntityDecoder.decode(cachedTarget); |
254 |
metadata.addAll(decodeType(d, filter, relDefaults, true));
|
|
264 |
metadata.addAll(decodeType(d, entityConfigTable.getIncludeFilter(targetType, relDescriptor), relDefaults, true));
|
|
255 | 265 |
if (d.getType().equals(Type.result)) { |
256 | 266 |
for(Instance i : cachedTarget.getResult().getInstanceList()) { |
257 |
metadata.addAll(listFields(i, relFilter, false, true));
|
|
267 |
metadata.addAll(listFields(i, entityConfigTable.getIncludeFilter(targetType, relDecoder.getRelDescriptor()), false, true));
|
|
258 | 268 |
} |
259 | 269 |
} |
260 | 270 |
} |
... | ... | |
304 | 314 |
final OafEntityDecoder entity = mainEntity.decodeEntity(); |
305 | 315 |
if (entity.getType().equals(Type.result)) { |
306 | 316 |
for (final Instance instance : ((Result) entity.getEntity()).getInstanceList()) { |
307 |
final Set<String> instanceFieldFilter = Sets.newHashSet("instancetype", "hostedby", "licence"); |
|
308 |
children.add(templateFactory.getInstance(instance.getHostedby().getKey(), listFields(instance, instanceFieldFilter, false, false), |
|
317 |
|
|
318 |
|
|
319 |
children.add(templateFactory.getInstance(instance.getHostedby().getKey(), listFields(instance, instanceFilter, false, false), |
|
309 | 320 |
listMap(instance.getUrlList(), new UnaryFunction<String, String>() { |
310 | 321 |
|
311 | 322 |
@Override |
... | ... | |
327 | 338 |
private void addChildren(final List<String> children, final OafEntity target, final RelDescriptor relDescriptor) { |
328 | 339 |
final OafEntityDecoder decoder = OafEntityDecoder.decode(target); |
329 | 340 |
incrementCounter(relDescriptor.getSubRelType().toString()); |
330 |
final Set<String> filters = entityConfigTable.getFilter(target.getType(), relDescriptor);
|
|
331 |
children.add(templateFactory.getChild(decoder.getType().toString(), decoder.getId(), listFields(decoder.getMetadata(), filters, childDefaults, false)));
|
|
341 |
final Predicate<String> filter = entityConfigTable.getIncludeFilter(target.getType(), relDescriptor);
|
|
342 |
children.add(templateFactory.getChild(decoder.getType().toString(), decoder.getId(), listFields(decoder.getMetadata(), filter, childDefaults, false))); |
|
332 | 343 |
} |
333 | 344 |
|
334 |
private List<String> listFields(final GeneratedMessage fields, final Set<String> filter, final boolean defaults, final boolean expandingRel) {
|
|
345 |
private List<String> listFields(final GeneratedMessage fields, final Predicate<String> filter, final boolean defaults, final boolean expandingRel) {
|
|
335 | 346 |
|
336 | 347 |
final List<String> metadata = Lists.newArrayList(); |
337 | 348 |
|
338 | 349 |
if (fields != null) { |
339 | 350 |
|
340 | 351 |
final Set<String> seen = Sets.newHashSet(); |
341 |
for (final Entry<FieldDescriptor, Object> e : filterFields(fields, filter)) { |
|
342 | 352 |
|
343 |
// final String name = getFieldName(e.getKey().getName()); |
|
353 |
final Map<FieldDescriptor, Object> filtered = filterFields(fields, filter); |
|
354 |
for (final Entry<FieldDescriptor, Object> e : filtered.entrySet()) { |
|
355 |
|
|
344 | 356 |
final String name = e.getKey().getName(); |
345 | 357 |
seen.add(name); |
346 |
|
|
347 | 358 |
addFieldValue(metadata, e.getKey(), e.getValue(), expandingRel); |
348 | 359 |
} |
349 | 360 |
|
350 | 361 |
if (defaults) { |
351 |
for (final FieldDescriptor fd : fields.getDescriptorForType().getFields()) { |
|
352 |
if (!seen.contains(fd.getName())) { |
|
353 |
addFieldValue(metadata, fd, getDefault(fd), expandingRel); |
|
362 |
final Iterable<FieldDescriptor> unseen = Iterables.filter(fields.getDescriptorForType().getFields(), new Predicate<FieldDescriptor>() { |
|
363 |
@Override |
|
364 |
public boolean apply(final FieldDescriptor fd) { |
|
365 |
return !seen.contains(fd.getName()) && filter.apply(fd.getName()); |
|
354 | 366 |
} |
367 |
}); |
|
368 |
for(FieldDescriptor fd : unseen){ |
|
369 |
addFieldValue(metadata, fd, getDefault(fd), expandingRel); |
|
355 | 370 |
} |
356 | 371 |
} |
357 | 372 |
} |
... | ... | |
485 | 500 |
if (Journal.getDescriptor().equals(fd.getMessageType()) && (o != null)) { |
486 | 501 |
final Journal j = (Journal) o; |
487 | 502 |
metadata.add("<journal " + "issn=\"" + escapeXml(j.getIssnPrinted()) + "\" " + "eissn=\"" + escapeXml(j.getIssnOnline()) + "\" " + "lissn=\"" |
488 |
+ escapeXml(j.getIssnLinking()) + "\">" + escapeXml(j.getName()) + "</journal>"); |
|
503 |
+ escapeXml(j.getIssnLinking()) + "\" " + "ep=\"" + escapeXml(j.getEp()) + "\" " + "iss=\"" + escapeXml(j.getIss()) + "\" " + "sp=\"" |
|
504 |
+ escapeXml(j.getSp()) + "\" " + "vol=\"" + escapeXml(j.getVol()) + "\">" + escapeXml(j.getName()) + "</journal>"); |
|
489 | 505 |
} |
490 | 506 |
|
491 | 507 |
if (Context.getDescriptor().equals(fd.getMessageType()) && (o != null)) { |
... | ... | |
705 | 721 |
return sb.toString(); |
706 | 722 |
} |
707 | 723 |
|
708 |
private Set<Entry<FieldDescriptor, Object>> filterFields(final GeneratedMessage fields, final Set<String> filter) { |
|
709 | 724 |
|
710 |
if (filter != null) { |
|
711 |
final Predicate<FieldDescriptor> p = new Predicate<FieldDescriptor>() { |
|
712 |
|
|
713 |
@Override |
|
714 |
public boolean apply(final FieldDescriptor descriptor) { |
|
715 |
if (fields == null) return false; |
|
716 |
final String name = descriptor.getName(); |
|
717 |
return filter.contains(name); |
|
718 |
} |
|
719 |
}; |
|
720 |
final Map<FieldDescriptor, Object> filtered = Maps.filterKeys(fields.getAllFields(), p); |
|
721 |
// log.info( |
|
722 |
// "filtered " + type.toString() + ": " + toString(filterEntries.keySet()) + "\n" + |
|
723 |
// "builder " + fields.getDescriptorForType().getFullName() + ": " + toString(fields.getAllFields().keySet())); |
|
724 |
return filtered.entrySet(); |
|
725 |
private Map<FieldDescriptor, Object> filterFields(final GeneratedMessage fields, final Predicate<String> acceptFilter) { |
|
726 |
if(acceptFilter == null) return fields.getAllFields(); |
|
727 |
final Map<FieldDescriptor, Object> res = Maps.newHashMap(); |
|
728 |
for(Entry<FieldDescriptor, Object> e : fields.getAllFields().entrySet()) { |
|
729 |
if (acceptFilter.apply(e.getKey().getName())) { |
|
730 |
res.put(e.getKey(), e.getValue()); |
|
731 |
} |
|
725 | 732 |
} |
726 |
return fields.getAllFields().entrySet();
|
|
733 |
return res;
|
|
727 | 734 |
} |
728 | 735 |
|
736 |
|
|
737 |
|
|
729 | 738 |
private List<String> countersAsXml() { |
730 | 739 |
final List<String> out = Lists.newArrayList(); |
731 | 740 |
for (final Entry<String, Integer> e : counters.entrySet()) { |
Also available in: Unified diff
implemented use of opt in/out rules for entity fields (#2557).
depending on specific solrj version (thus excluding cdh6.X versions)