Project

General

Profile

« Previous | Next » 

Revision 46587

implemented use of opt in/out rules for entity fields (#2557).
depending on specific solrj version (thus excluding cdh6.X versions)

View differences:

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