Project

General

Profile

1
package eu.dnetlib.data.transform;
2

    
3
import java.io.*;
4
import java.util.*;
5
import java.util.Map.Entry;
6
import java.util.zip.GZIPInputStream;
7
import javax.xml.transform.TransformerConfigurationException;
8
import javax.xml.transform.TransformerFactoryConfigurationError;
9

    
10
import com.google.common.base.Function;
11
import com.google.common.collect.Iterables;
12
import com.google.common.collect.Lists;
13
import com.google.common.collect.Maps;
14
import com.google.common.collect.Sets;
15
import com.google.protobuf.InvalidProtocolBufferException;
16
import eu.dnetlib.data.mapreduce.hbase.index.config.*;
17
import eu.dnetlib.data.mapreduce.util.*;
18
import eu.dnetlib.data.proto.KindProtos.Kind;
19
import eu.dnetlib.data.proto.OafProtos.Oaf;
20
import eu.dnetlib.data.proto.TypeProtos.Type;
21
import eu.dnetlib.miscutils.functional.xml.IndentXmlString;
22
import org.apache.commons.io.IOUtils;
23
import org.apache.commons.lang.StringUtils;
24
import org.apache.commons.logging.Log;
25
import org.apache.commons.logging.LogFactory;
26
import org.dom4j.Document;
27
import org.dom4j.DocumentException;
28
import org.dom4j.io.SAXReader;
29
import org.json.JSONObject;
30
import org.junit.Before;
31
import org.junit.Ignore;
32
import org.junit.Test;
33

    
34
import static org.junit.Assert.*;
35

    
36
public class XsltRowTransformerFactoryTest {
37

    
38
	private static final Log log = LogFactory.getLog(XsltRowTransformerFactoryTest.class);
39
	private static String basePathProfiles = "/eu/dnetlib/test/profiles/TransformationRuleDSResources/TransformationRuleDSResourceType/";
40
	private XsltRowTransformerFactory factory;
41
	private EntityConfigTable entityConfigTable;
42

    
43
	@Before
44
	public void setUp() throws Exception {
45
		factory = new XsltRowTransformerFactory();
46
		entityConfigTable = IndexConfig.load(IndexConfigTest.config).getConfigMap();
47
	}
48

    
49
	@Test
50
	@Ignore // need to reimplement because claimUpdates_2_hbase.xsl was removed
51
	public void testParseOafClaimUpdate() throws Exception {
52
		doTest(loadFromTransformationProfile("claimUpdates_2_hbase.xsl"), load("recordClaimUpdate.xml"));
53
	}
54

    
55
	@Test
56
	@Ignore // need to reimplement because claimUpdates_2_hbase.xsl was removed
57
	public void testParseClaimUpdate() throws Exception {
58

    
59
		final List<Row> rows = Lists.newArrayList();
60
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordClaim.xml")));
61
		rows.addAll(asRows(loadFromTransformationProfile("claimUpdates_2_hbase.xsl"), load("recordClaimUpdate.xml")));
62

    
63
		printAll(mapAll(buildTable(rows)));
64
	}
65

    
66
	@Test
67
	public void testParseFp7IctPUB() throws Exception {
68

    
69
		doTest(loadFromTransformationProfile("oaf2hbase.xml"), load("ec_fp7_ict.xml"));
70
	}
71

    
72
	@Test
73
	public void testParseDatasetPUB() throws Exception {
74

    
75
		doTest(loadFromTransformationProfile("odf2hbase.xml"), load("recordDatasetPUB.xml"));
76
	}
77

    
78
	@Test
79
	public void testParseDatasetLindat() throws Exception {
80

    
81
		doTest(loadFromTransformationProfile("odf2hbase.xml"), load("datasetLindat.xml"));
82
	}
83

    
84
	@Test
85
	public void testParseClaim() throws Exception {
86

    
87
		doTest(loadFromTransformationProfile("oaf2hbase.xml"), load("recordClaim.xml"));
88
	}
89

    
90
	@Test
91
	public void testParseClaimDataset() throws Exception {
92

    
93
		doTest(loadFromTransformationProfile("odf2hbase.xml"), load("recordClaimDataset.xml"));
94
	}
95

    
96
	@Test
97
	public void testParseACM() throws Exception {
98

    
99
		doTest(loadFromTransformationProfile("oaf2hbase.xml"), load("recordACM.xml"));
100
	}
101

    
102
	@Test
103
	public void testParseASB() throws Exception {
104

    
105
		doTest(loadFromTransformationProfile("oaf2hbase.xml"), load("recordASB.xml"));
106
	}
107

    
108
	@Test
109
	public void testParseProjectCorda() throws Exception {
110

    
111
		doTest(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordCorda.xml"));
112
	}
113

    
114
	@Test
115
	public void testParseProjectFCT() throws Exception {
116

    
117
		doTest(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordFCT.xml"));
118
	}
119

    
120

    
121
	@Test
122
	public void testParseOaf() throws Exception {
123

    
124
		doTest(loadFromTransformationProfile("oaf2hbase.xml"), load("record.xml"));
125
	}
126

    
127
	@Test
128
	public void testParseOafPublication() throws Exception {
129

    
130
		doTest(loadFromTransformationProfile("oaf_publication2hbase.xml"), load("record.xml"));
131
	}
132

    
133
	@Test
134
	public void testParseLindat() throws Exception {
135

    
136
		doTest(loadFromTransformationProfile("odf2hbase.xml"), load("recordLindat.xml"));
137
	}
138

    
139
	@Test
140
	public void testParseDatacite() throws Exception {
141

    
142
		doTest(loadFromTransformationProfile("odf2hbase.xml"), load("recordDatacite.xml"));
143
	}
144

    
145
	@Test
146
	public void testParseDatacite2() throws Exception {
147

    
148
		doTest(loadFromTransformationProfile("odf2hbase.xml"), load("recordDatacite2.xml"));
149
	}
150

    
151
	@Test
152
	public void testParseOpenTrials() throws Exception {
153

    
154
		doTest(loadFromTransformationProfile("odf2hbase.xml"), load("opentrials_datacite1.xml"));
155
	}
156

    
157
	@Test
158
	public void testLinkPangaea() throws Exception {
159

    
160
		final List<Row> rows = Lists.newArrayList();
161
		rows.addAll(asRows(loadFromTransformationProfile("odf2hbase.xml"), load("pangaeODF1.xml")));
162
		rows.addAll(asRows(loadFromTransformationProfile("odf2hbase.xml"), load("pangaeODF2.xml")));
163
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("pangaeOAF.xml")));
164
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordCordaPangaea.xml")));
165

    
166
		printAll(mapAll(buildTable(rows)));
167
	}
168

    
169
	@Test
170
	public void testPangaea() throws Exception {
171

    
172
		final List<Row> rows = Lists.newArrayList();
173
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("pangaeOAF2.xml")));
174
		printAll(mapAll(buildTable(rows)));
175
	}
176
	@Test
177
	public void testZenodo() throws Exception {
178

    
179
		final List<Row> rows = Lists.newArrayList();
180
		rows.addAll(asRows(loadFromTransformationProfile("odf2hbase.xml"), load("zenodoData.xml")));
181
		printAll(mapAll(buildTable(rows)));
182
	}
183

    
184
	@Test
185
	public void testZenodoSoftware() throws Exception {
186

    
187
		final List<Row> rows = Lists.newArrayList();
188
		rows.addAll(asRows(loadFromTransformationProfile("odf2hbase.xml"), load("softwareZenodo_odf.xml")));
189
		printAll(mapAll(buildTable(rows)));
190
	}
191

    
192
	@Test
193
	public void testLinkCorda() throws Exception {
194

    
195
		final List<Row> rows = Lists.newArrayList();
196
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordCorda.xml")));
197
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordCorda.xml")));
198

    
199
		printAll(mapAll(buildTable(rows)));
200
	}
201

    
202
	@Test
203
	public void testLinkFCT() throws Exception {
204

    
205
		final List<Row> rows = Lists.newArrayList();
206
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordFCT.xml")));
207
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordFCT.xml")));
208

    
209
		printAll(mapAll(buildTable(rows)));
210
	}
211

    
212
	@Test
213
	public void testLinkARC() throws Exception {
214

    
215
		final List<Row> rows = Lists.newArrayList();
216
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordARC.xml")));
217
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordARC.xml")));
218

    
219
		printAll(mapAll(buildTable(rows)));
220
	}
221

    
222
	@Test
223
	public void testLinkWT() throws Exception {
224

    
225
		final List<Row> rows = Lists.newArrayList();
226
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordWT.xml")));
227
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordWT.xml")));
228

    
229
		printAll(mapAll(buildTable(rows)));
230
	}
231

    
232

    
233

    
234
	@Test
235
	public void testLinkOrganization() throws Exception {
236

    
237
		final List<Row> rows = Lists.newArrayList();
238
		rows.addAll(asRows(loadFromTransformationProfile("organizations_2_hbase.xsl"), load("organization.xml")));
239
		rows.addAll(asRows(loadFromTransformationProfile("projectorganization_2_hbase.xsl"), load("project_organization.xml")));
240
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordCorda.xml")));
241

    
242
		printAll(mapAll(buildTable(rows)));
243
	}
244

    
245
	@Test
246
	public void testLinkOrganizationAffiliation() throws Exception {
247

    
248
		final List<Row> rows = Lists.newArrayList();
249
		rows.addAll(asRows(loadFromTransformationProfile("organizations_2_hbase.xsl"), load("organization.xml")));
250
		rows.addAll(asRows(loadFromTransformationProfile("resultorganization_2_hbase.xsl"), load("result_organization.xml")));
251
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("record.xml")));
252

    
253
		printAll(mapAll(buildTable(rows)));
254
	}
255

    
256
	@Test
257
	public void testDuplicates() throws Exception {
258
		final String mergeId = "50|dedup_wf_001::08ed625d07e5738b794ff14d6773fd9f";
259
		final List<Row> rows = Lists.newArrayList();
260

    
261
		final Function<Row, Row> f = rowIn -> {
262

    
263
			final List<Column<String,byte[]>> cols = Lists.newArrayList();
264
			for(Column<String,byte[]> col : rowIn.getColumns()) {
265
				if (col.getName().equals("body")) {
266
					cols.add(new Column(col.getName(), col.getValue()));
267

    
268
				}
269
			}
270
			return new Row("result", rowIn.getKey(), cols);
271
		};
272

    
273
		final List<Row> puma1 = asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordPuma1.xml"), f);
274
		puma1.add(new Row("resultResult_dedup_isMergedIn", mergeId));
275

    
276
		final List<Row> puma2 = asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordPuma2.xml"), f);
277
		puma2.add(new Row("resultResult_dedup_isMergedIn", mergeId));
278

    
279
		rows.addAll(puma1);
280
		rows.addAll(puma2);
281

    
282
		List<Oaf> duplicates = Lists.newArrayList();
283
		duplicates.add(getOafBody(puma1));
284
		duplicates.add(getOafBody(puma2));
285
		final Oaf.Builder oafMerge = OafEntityMerger.merge(mergeId, duplicates);
286

    
287
		final Row mergeRow = new Row("result", mergeId, Lists.newArrayList(new Column("body", oafMerge.build().toByteArray())));
288

    
289
		rows.add(mergeRow);
290

    
291
		printAll(mapAll(buildTable(rows)));
292
	}
293

    
294
	private Oaf getOafBody(final List<Row> rows) throws InvalidProtocolBufferException {
295
		for(Row row : rows) {
296
			if(StringUtils.startsWith(row.getKey(), "50")) {
297
				return Oaf.parseFrom(row.getColumn("body").getValue());
298

    
299
			}
300
		}
301
		return null;
302
	}
303

    
304
	@Test
305
	public void testParseDoajOAF() throws Exception {
306

    
307
		doTest(loadFromTransformationProfile("oaf2hbase.xml"), load("doajUniversityRecord.xml"));
308
	}
309

    
310
	@Test
311
	public void testParseDatasource() throws Exception {
312

    
313
		doTest(loadFromTransformationProfile("datasources_2_hbase.xsl"), load("datasourceNative.xml"));
314
	}
315
	@Test
316
	public void testParseDatasourcePiwik() throws Exception {
317

    
318
		doTest(loadFromTransformationProfile("datasources_2_hbase.xsl"), load("datasourcePiwik.xml"));
319
	}
320

    
321
	@Test
322
	public void testParseDataDatasource() throws Exception {
323

    
324
		doTest(loadFromTransformationProfile("datasources_2_hbase.xsl"), load("dataDatasource.xml"));
325
	}
326

    
327
	@Test
328
	public void testFromMongodbCompressedDump() throws Exception {
329
		doTestJsonGz(loadFromTransformationProfile("oaf2hbase.xml"), load("mdstore_cleaned.json.gz"));
330
	}
331

    
332
	@Test
333
	public void testLoadFromTransformationProfile() throws IOException {
334
		InputStream in = loadFromTransformationProfile("oaf2hbase.xml");
335
		log.info(IOUtils.toString(in));
336
	}
337

    
338
	@Test
339
	public void test_template() throws Exception {
340
		final String xslt = IOUtils.toString(loadFromTransformationProfile("oaf2hbase.xml"));
341
		final XsltRowTransformer transformer = factory.getTransformer(xslt);
342
		assertNotNull(transformer);
343

    
344
		final String record = IOUtils.toString(load("record.xml"));
345
		final List<Row> rows = transformer.apply(record);
346

    
347
		System.out.println(rows);
348
	}
349

    
350
	@Test
351
	public void testWrongCharsOrganization() throws Exception {
352
		final List<Row> rows = Lists.newArrayList();
353
		rows.addAll(asRows(loadFromTransformationProfile("organizations_2_hbase.xsl"), load("organizationWrongChars.xml")));
354
		printAll(mapAll(buildTable(rows)));
355
	}
356

    
357
	@Test
358
	public void testParseProjectWithFunderOriginalName() throws Exception {
359

    
360
		doTest(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectWithFunderOriginalName.xml"));
361
	}
362
	@Test
363
	public void testLinkFunderOriginalName() throws Exception {
364

    
365
		final List<Row> rows = Lists.newArrayList();
366
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectWithFunderOriginalName.xml")));
367
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordFunderOriginalName.xml")));
368

    
369
		printAll(mapAll(buildTable(rows)));
370
	}
371

    
372
	@Test
373
	public void testProjectExtraInfo() throws Exception {
374
		final List<Row> rows = Lists.newArrayList();
375
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordExtraInfo.xml")));
376
		printAll(mapAll(buildTable(rows)));
377
	}
378

    
379
	@Test
380
	public void testParseSoftwareFromODF() throws Exception {
381
		final List<Row> rows = Lists.newArrayList();
382
		rows.addAll(asRows(loadFromTransformationProfile("odf2hbase.xml"), load("softwareODF.xml")));
383
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordCorda.xml")));
384
		printAll(mapAll(buildTable(rows)));
385
	}
386

    
387
	@Test
388
	public void testParseSoftwareFromOAF() throws Exception {
389
		final List<Row> rows = Lists.newArrayList();
390
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordOAFsoftwareCLOSED.xml")));
391
		printAll(mapAll(buildTable(rows)));
392
	}
393

    
394
	@Test
395
	public void testParseSoftwareFromOAFOpen() throws Exception {
396
		final List<Row> rows = Lists.newArrayList();
397
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordOAFsoftwareOPEN.xml")));
398
		printAll(mapAll(buildTable(rows)));
399
	}
400

    
401
	@Test
402
	public void testParseOafWithExternalRef() throws Exception {
403
		final List<Row> rows = Lists.newArrayList();
404
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("oafWithExternalReference.xml")));
405
		printAll(mapAll(buildTable(rows)));
406
	}
407

    
408
	private void doTest(final InputStream xsltStream, final InputStream recordStream) throws Exception {
409
		try {
410
			final List<Row> rows = asRows(xsltStream, recordStream);
411

    
412
			log.info(rows);
413

    
414
			final Map<String, Map<String, Map<String, byte[]>>> table = buildTable(rows);
415

    
416
			// System.out.println("\n" + table.toString());
417

    
418
			final Map<String, XmlRecordFactory> builders = mapAll(table);
419

    
420
			printAll(builders);
421
		} catch (final InvalidProtocolBufferException e) {
422
			throw new Exception(e);
423
		} catch (final TransformerConfigurationException e) {
424
			throw new Exception(e);
425
		} catch (final TransformerFactoryConfigurationError e) {
426
			throw new Exception(e);
427
		} catch (final DocumentException e) {
428
			throw new Exception(e);
429
		}
430
	}
431

    
432
	private void doTestJsonGz(final InputStream xsltStream, final InputStream recordStream) throws Exception {
433

    
434
		final Iterator<List<Row>> rowsIterator = asRowsJsonGzip(xsltStream, recordStream);
435

    
436
		int i = 0;
437
		while (rowsIterator.hasNext()) {
438
			final List<Row> rows = rowsIterator.next();
439
			i++;
440

    
441
			if ((i % 10000) == 0) {
442
				System.out.println(i);
443
			}
444

    
445
			final Map<String, Map<String, Map<String, byte[]>>> table = buildTableDoaj(rows);
446

    
447
			for (final Map<String, Map<String, byte[]>> m : table.values()) {
448
				for (final Map<String, byte[]> mv : m.values()) {
449
					for (final byte[] v : mv.values()) {
450
						final OafDecoder d = OafDecoder.decode(v);
451
						assertNotNull(d);
452
						assertNotNull(d.getOaf());
453

    
454
						switch (d.getKind()) {
455
						case entity:
456
							assertNotNull(d.getMetadata());
457
							if (d.getOaf().getEntity().getType().equals(Type.result)) {
458
								System.out.println(d.getOaf());
459
							}
460
							break;
461
						case relation:
462
							assertNotNull(d.getRel());
463
							break;
464
						default:
465
							break;
466
						}
467
					}
468
				}
469
			}
470
		}
471
	}
472

    
473
	private List<Row> asRows(final InputStream xsltStream, final InputStream recordStream, final Function<Row, Row> p) throws Exception {
474
		return asRows(xsltStream, new HashMap<>(), recordStream, p);
475
	}
476

    
477
	private List<Row> asRows(final InputStream xsltStream, final InputStream recordStream) throws Exception {
478
		return asRows(xsltStream, new HashMap<>(), recordStream);
479
	}
480

    
481
	private List<Row> asRows(final InputStream xsltStream, final Map<String, Object> params, final InputStream recordStream) throws Exception {
482
		return asRows(xsltStream, params, recordStream, null);
483
	}
484

    
485
	private List<Row> asRows(final InputStream xsltStream, final Map<String, Object> params, final InputStream recordStream, final Function<Row, Row> p) throws Exception {
486
		final String xslt = IOUtils.toString(xsltStream);
487
		final XsltRowTransformer transformer = factory.getTransformer(xslt, params);
488
		assertNotNull(transformer);
489

    
490
		final String record = IOUtils.toString(recordStream);
491
		final List<Row> rows = transformer.apply(record);
492

    
493
		assertNotNull(rows);
494
		assertFalse(rows.isEmpty());
495
		return p == null ? rows : Lists.newArrayList(Iterables.transform(rows, p));
496
	}
497

    
498
	private Iterator<List<Row>> asRowsJsonGzip(final InputStream xsltStream, final InputStream recordStreamJsonGzip) throws Exception {
499
		final String xslt = IOUtils.toString(xsltStream);
500
		final XsltRowTransformer transformer = factory.getTransformer(xslt);
501
		assertNotNull(transformer);
502
		assertNotNull(recordStreamJsonGzip);
503

    
504
		final GZIPInputStream stream = new GZIPInputStream(recordStreamJsonGzip);
505
		assertNotNull(stream);
506
		final BufferedReader inStream = new BufferedReader(new InputStreamReader(stream));
507
		assertNotNull(inStream);
508
		return new Iterator<List<Row>>() {
509

    
510
			String jsonRecord = null;
511

    
512
			@Override
513
			public boolean hasNext() {
514
				try {
515
					return (jsonRecord = inStream.readLine()) != null;
516
				} catch (final IOException e) {
517
					throw new RuntimeException(e);
518
				}
519
			}
520

    
521
			@Override
522
			public List<Row> next() {
523

    
524
				final JSONObject jsonObj = new JSONObject(jsonRecord);
525
				final String body = jsonObj.getString("body");
526
				try {
527
					assertTrue(StringUtils.isNotBlank(body));
528
					// System.out.println(body);
529
					final List<Row> rows = transformer.apply(body);
530
					assertNotNull(rows);
531
					assertFalse(rows.isEmpty());
532
					return rows;
533
				} catch (final Throwable e) {
534
					System.err.println("error transforming document: " + body);
535
					throw new RuntimeException(e);
536
				}
537
			}
538

    
539
			@Override
540
			public void remove() {
541
				throw new UnsupportedOperationException();
542
			}
543

    
544
		};
545

    
546
	}
547

    
548
	private Map<String, Map<String, Map<String, byte[]>>> buildTableDoaj(final List<Row> rows) throws UnsupportedEncodingException {
549
		final Map<String, Map<String, Map<String, byte[]>>> table = Maps.newHashMap();
550

    
551
		for (final Row row : rows) {
552
			final String rowKey = row.getKey();
553
			final String cf = row.getColumnFamily();
554
			if (!table.containsKey(rowKey)) {
555
				table.put(rowKey, new HashMap<>());
556
			}
557
			if (!table.get(rowKey).containsKey(cf)) {
558
				table.get(rowKey).put(row.getColumnFamily(), new HashMap<>());
559
			}
560
			for (final Column<String, byte[]> c : row.getColumns()) {
561
				// System.out.println(String.format("ADDING K:%s CF:%s Q:%s", rowKey, cf, c.getName()));
562
				table.get(rowKey).get(cf).put(c.getName(), c.getValue());
563
				if (cf.equals("result") && c.getName().equals("body")) {
564
					// System.out.println(String.format("ADDING K:%s CF:%s Q:%s", rowKey, cf, c.getName()));
565
					assertTrue(StringUtils.isNotBlank(new String(c.getValue(), "UTF-8")));
566
				}
567
			}
568
		}
569
		return table;
570

    
571
	}
572

    
573
	private Map<String, Map<String, Map<String, byte[]>>> buildTable(final List<Row> rows) throws UnsupportedEncodingException {
574
		final Map<String, Map<String, Map<String, byte[]>>> table = Maps.newHashMap();
575

    
576
		for (final Row row : rows) {
577
			final String rowKey = row.getKey();
578
			final String cf = row.getColumnFamily();
579
			if (!table.containsKey(rowKey)) {
580
				table.put(rowKey, new HashMap<>());
581
			}
582
			if (!table.get(rowKey).containsKey(cf)) {
583
				table.get(rowKey).put(row.getColumnFamily(), new HashMap<>());
584
			}
585
			for (final Column<String, byte[]> c : row.getColumns()) {
586
				System.out.println(String.format("ADDING K:%s CF:%s Q:%s", rowKey, cf, c.getName()));
587
				table.get(rowKey).get(cf).put(c.getName(), c.getValue());
588
				if (c.getName().equals("body")) {
589
					final String theBody = new String(c.getValue(), "UTF-8");
590
					assertTrue(StringUtils.isNotBlank(theBody));
591
					//System.out.println(theBody);
592
				}
593
			}
594
		}
595
		return table;
596

    
597
	}
598

    
599
	private Map<String, XmlRecordFactory> mapAll(final Map<String, Map<String, Map<String, byte[]>>> table) throws Exception {
600

    
601
		final Map<String, XmlRecordFactory> builders = Maps.newHashMap();
602
		for (final Entry<String, Map<String, Map<String, byte[]>>> e : table.entrySet()) {
603
			map(builders, e.getKey(), e.getValue());
604
		}
605
		return builders;
606
	}
607

    
608
	// private Map<String, XmlRecordFactory> mapResultsOnly(final Map<String, Map<String, Map<String, byte[]>>> table) throws Exception {
609
	//
610
	// final Map<String, XmlRecordFactory> builders = Maps.newHashMap();
611
	// for (final Entry<String, Map<String, Map<String, byte[]>>> e : table.entrySet()) {
612
	// final Type type = OafRowKeyDecoder.decode(e.getKey()).getType();
613
	// if (type == Type.result) {
614
	// map(builders, e.getKey(), e.getValue());
615
	// }
616
	// }
617
	// return builders;
618
	// }
619

    
620
	private void map(final Map<String, XmlRecordFactory> builders, final String rowKey, final Map<String, Map<String, byte[]>> row) throws Exception {
621

    
622
		final Type type = OafRowKeyDecoder.decode(rowKey).getType();
623

    
624
		final Map<String, byte[]> familyMap = row.get(type.toString());
625

    
626
		if (familyMap == null) return;
627

    
628
		final byte[] bodyB = familyMap.get("body");
629

    
630
		if (bodyB != null) {
631
			ensureBuilder(builders, rowKey);
632

    
633
			final Oaf oaf = UpdateMerger.mergeBodyUpdates(familyMap);
634

    
635
			final OafDecoder mainEntity = OafDecoder.decode(oaf);
636

    
637
			builders.get(rowKey).setMainEntity(mainEntity);
638

    
639
			for (final LinkDescriptor ld : entityConfigTable.getDescriptors(type)) {
640

    
641
				final String it = ld.getRelDescriptor().getIt();
642
				final Map<String, byte[]> cols = row.get(it);
643

    
644
				if ((cols != null) && !cols.isEmpty()) {
645

    
646
					for (final byte[] oafB : cols.values()) {
647

    
648
						final Oaf.Builder relBuilder = Oaf.newBuilder(Oaf.parseFrom(oafB));
649

    
650
						if (ld.isSymmetric()) {
651
							final RelDescriptor rd = ld.getRelDescriptor();
652

    
653
							relBuilder.getRelBuilder().setCachedTarget(mainEntity.getEntity()).setRelType(rd.getRelType()).setSubRelType(rd.getSubRelType());
654
						}
655

    
656
						relBuilder.getRelBuilder().setChild(ld.isChild());
657

    
658
						final Oaf.Builder oafBuilder = Oaf.newBuilder().setKind(Kind.relation).setLastupdatetimestamp(System.currentTimeMillis());
659
						oafBuilder.mergeFrom(relBuilder.build());
660

    
661
						final String targetId = ld.isSymmetric() ? oafBuilder.getRel().getTarget() : oafBuilder.getRel().getSource();
662
						ensureBuilder(builders, targetId);
663
						final OafDecoder decoder = OafDecoder.decode(oafBuilder.build());
664

    
665
						if (ld.isChild()) {
666
							builders.get(targetId).addChild(type, decoder);
667
						} else {
668
							builders.get(targetId).addRelation(type, decoder);
669
						}
670
					}
671

    
672
				}
673
			}
674
		}
675

    
676
	}
677

    
678
	private void printAll(final Map<String, XmlRecordFactory> builders) throws DocumentException {
679
		print(Sets.newHashSet(Type.values()), builders, null);
680
	}
681

    
682
	private void print(final Set<Type> types, final Map<String, XmlRecordFactory> builders, final Map<Type, Set<String>> xpaths) throws DocumentException {
683
		final SAXReader r = new SAXReader();
684

    
685
		for (final Entry<String, XmlRecordFactory> e : builders.entrySet()) {
686
			final OafRowKeyDecoder kd = OafRowKeyDecoder.decode(e.getKey());
687

    
688
			if (!e.getValue().isValid()) throw new IllegalArgumentException("invalid builder: " + e.getKey());
689
			if (types.contains(kd.getType())) {
690
				final String val = IndentXmlString.apply(e.getValue().build());
691

    
692
				if ((xpaths != null) && !xpaths.isEmpty() && (xpaths.get(kd.getType()) != null)) {
693
					final Document doc = r.read(new StringReader(val));
694

    
695
					log.debug("\n" + e.getKey());
696
					for (final String xpath : xpaths.get(kd.getType())) {
697
						log.debug(doc.valueOf(xpath));
698
					}
699
				} else {
700
					log.info(val);
701
				}
702
			}
703
		}
704
	}
705

    
706
	private void printNoIndent(final Map<String, XmlRecordFactory> builders) {
707
		for (final Entry<String, XmlRecordFactory> e : builders.entrySet()) {
708
			if (e.getValue().isValid()) {
709
				log.debug(e.getValue().build());
710
			} else {
711
				log.debug("invalid builder: " + e.getKey());
712
			}
713
		}
714
	}
715

    
716
	private void ensureBuilder(final Map<String, XmlRecordFactory> builders, final String rowKey) throws Exception {
717
		if (!builders.containsKey(rowKey)) {
718
			builders.put(rowKey, newBuilder());
719
		}
720
	}
721

    
722
	private XmlRecordFactory newBuilder() throws TransformerConfigurationException, TransformerFactoryConfigurationError, DocumentException {
723
		return new XmlRecordFactory(entityConfigTable, ContextMapper.fromXml(Context.xml),
724
				RelClasses.fromJSon(RelClassesTest.relClassesJson), XmlRecordFactoryTest.SCHEMA_LOCATION, true, false, false, XmlRecordFactoryTest.specialDatasourceTypes);
725
	}
726

    
727
	private InputStream load(final String fileName) {
728
		return getClass().getResourceAsStream(fileName);
729
	}
730

    
731
	private InputStream loadFromTransformationProfile(final String profilePath) {
732
		log.info("Loading xslt from: " + basePathProfiles + profilePath);
733
		InputStream profile = getClass().getResourceAsStream(basePathProfiles + profilePath);
734
		SAXReader saxReader = new SAXReader();
735
		Document doc = null;
736
		try {
737
			doc = saxReader.read(profile);
738
		} catch (DocumentException e) {
739
			e.printStackTrace();
740
			throw new RuntimeException(e);
741
		}
742
		String xslt = doc.selectSingleNode("//SCRIPT/CODE/*[local-name()='stylesheet']").asXML();
743
		return IOUtils.toInputStream(xslt);
744
	}
745

    
746
}
    (1-1/1)