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/2hbase/";
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 testParseSoftwareEgiApp() throws Exception {
80

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

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

    
87
		doTest(loadFromTransformationProfile("odf2hbase.xml"), load("softwareEgiApp2.xml"));
88
	}
89

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

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

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

    
99
		doTest(loadFromTransformationProfile("odf2hbase.xml"), load("datasetLindat.xml"));
100
	}
101

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

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

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

    
111
		doTest(loadFromTransformationProfile("odf2hbase.xml"), load("recordClaimDataset.xml"));
112
	}
113

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

    
117
		doTest(loadFromTransformationProfile("oaf2hbase.xml"), load("recordACM.xml"));
118
	}
119

    
120
	@Test
121
	public void testParseASB() throws Exception {
122

    
123
		doTest(loadFromTransformationProfile("oaf2hbase.xml"), load("recordASB.xml"));
124
	}
125

    
126
	@Test
127
	public void testParseProjectCorda() throws Exception {
128

    
129
		doTest(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordCorda.xml"));
130
	}
131

    
132
	@Test
133
	public void testParseProjectFCT() throws Exception {
134

    
135
		doTest(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordFCT.xml"));
136
	}
137

    
138

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

    
142
		doTest(loadFromTransformationProfile("oaf2hbase.xml"), load("record.xml"));
143
	}
144

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

    
148
		doTest(loadFromTransformationProfile("oaf_publication2hbase.xml"), load("record.xml"));
149
	}
150

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

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

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

    
160
		doTest(loadFromTransformationProfile("odf2hbase.xml"), load("recordDatacite.xml"));
161
	}
162

    
163
	@Test
164
	public void testParseDatacite2() throws Exception {
165

    
166
		doTest(loadFromTransformationProfile("odf2hbase.xml"), load("recordDatacite2.xml"));
167
	}
168

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

    
172
		doTest(loadFromTransformationProfile("odf2hbase.xml"), load("opentrials_datacite1.xml"));
173
	}
174

    
175
	@Test
176
	public void testLinkPangaea() throws Exception {
177

    
178
		final List<Row> rows = Lists.newArrayList();
179
		rows.addAll(asRows(loadFromTransformationProfile("odf2hbase.xml"), load("pangaeODF1.xml")));
180
		rows.addAll(asRows(loadFromTransformationProfile("odf2hbase.xml"), load("pangaeODF2.xml")));
181
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("pangaeOAF.xml")));
182
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordCordaPangaea.xml")));
183

    
184
		printAll(mapAll(buildTable(rows)));
185
	}
186

    
187
	@Test
188
	public void testPangaea() throws Exception {
189

    
190
		final List<Row> rows = Lists.newArrayList();
191
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("pangaeOAF2.xml")));
192
		printAll(mapAll(buildTable(rows)));
193
	}
194
	@Test
195
	public void testZenodo() throws Exception {
196

    
197
		final List<Row> rows = Lists.newArrayList();
198
		rows.addAll(asRows(loadFromTransformationProfile("odf2hbase.xml"), load("zenodoData.xml")));
199
		printAll(mapAll(buildTable(rows)));
200
	}
201

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

    
205
		final List<Row> rows = Lists.newArrayList();
206
		rows.addAll(asRows(loadFromTransformationProfile("odf2hbase.xml"), load("softwareZenodo_odf.xml")));
207
		printAll(mapAll(buildTable(rows)));
208
	}
209

    
210
	@Test
211
	public void testLinkCorda() throws Exception {
212

    
213
		final List<Row> rows = Lists.newArrayList();
214
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordCorda.xml")));
215
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordCorda.xml")));
216

    
217
		printAll(mapAll(buildTable(rows)));
218
	}
219

    
220
	@Test
221
	public void testLinkFCT() throws Exception {
222

    
223
		final List<Row> rows = Lists.newArrayList();
224
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordFCT.xml")));
225
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordFCT.xml")));
226

    
227
		printAll(mapAll(buildTable(rows)));
228
	}
229

    
230
	@Test
231
	public void testLinkARC() throws Exception {
232

    
233
		final List<Row> rows = Lists.newArrayList();
234
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordARC.xml")));
235
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordARC.xml")));
236

    
237
		printAll(mapAll(buildTable(rows)));
238
	}
239

    
240
	@Test
241
	public void testLinkWT() throws Exception {
242

    
243
		final List<Row> rows = Lists.newArrayList();
244
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordWT.xml")));
245
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordWT.xml")));
246

    
247
		printAll(mapAll(buildTable(rows)));
248
	}
249

    
250

    
251

    
252
	@Test
253
	public void testLinkOrganization() throws Exception {
254

    
255
		final List<Row> rows = Lists.newArrayList();
256
		rows.addAll(asRows(loadFromTransformationProfile("organizations_2_hbase.xsl"), load("organization.xml")));
257
		rows.addAll(asRows(loadFromTransformationProfile("projectorganization_2_hbase.xsl"), load("project_organization.xml")));
258
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordCorda.xml")));
259

    
260
		printAll(mapAll(buildTable(rows)));
261
	}
262

    
263
	@Test
264
	public void testLinkOrganizationAffiliation() throws Exception {
265

    
266
		final List<Row> rows = Lists.newArrayList();
267
		rows.addAll(asRows(loadFromTransformationProfile("organizations_2_hbase.xsl"), load("organization.xml")));
268
		rows.addAll(asRows(loadFromTransformationProfile("resultorganization_2_hbase.xsl"), load("result_organization.xml")));
269
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("record.xml")));
270

    
271
		printAll(mapAll(buildTable(rows)));
272
	}
273

    
274
	@Test
275
	public void testDuplicates() throws Exception {
276
		final String mergeId = "50|dedup_wf_001::08ed625d07e5738b794ff14d6773fd9f";
277
		final List<Row> rows = Lists.newArrayList();
278

    
279
		final Function<Row, Row> f = rowIn -> {
280

    
281
			final List<Column<String,byte[]>> cols = Lists.newArrayList();
282
			for(Column<String,byte[]> col : rowIn.getColumns()) {
283
				if (col.getName().equals("body")) {
284
					cols.add(new Column(col.getName(), col.getValue()));
285

    
286
				}
287
			}
288
			return new Row("result", rowIn.getKey(), cols);
289
		};
290

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

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

    
297
		rows.addAll(puma1);
298
		rows.addAll(puma2);
299

    
300
		List<Oaf> duplicates = Lists.newArrayList();
301
		duplicates.add(getOafBody(puma1));
302
		duplicates.add(getOafBody(puma2));
303
		final Oaf.Builder oafMerge = OafEntityMerger.merge(mergeId, duplicates);
304

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

    
307
		rows.add(mergeRow);
308

    
309
		printAll(mapAll(buildTable(rows)));
310
	}
311

    
312
	private Oaf getOafBody(final List<Row> rows) throws InvalidProtocolBufferException {
313
		for(Row row : rows) {
314
			if(StringUtils.startsWith(row.getKey(), "50")) {
315
				return Oaf.parseFrom(row.getColumn("body").getValue());
316

    
317
			}
318
		}
319
		return null;
320
	}
321

    
322
	@Test
323
	public void testParseDoajOAF() throws Exception {
324

    
325
		doTest(loadFromTransformationProfile("oaf2hbase.xml"), load("doajUniversityRecord.xml"));
326
	}
327

    
328
	@Test
329
	public void testParseDatasource() throws Exception {
330

    
331
		doTest(loadFromTransformationProfile("datasources_2_hbase.xsl"), load("datasourceNative.xml"));
332
	}
333
	@Test
334
	public void testParseDatasourcePiwik() throws Exception {
335

    
336
		doTest(loadFromTransformationProfile("datasources_2_hbase.xsl"), load("datasourcePiwik.xml"));
337
	}
338

    
339
	@Test
340
	public void testParseDataDatasource() throws Exception {
341

    
342
		doTest(loadFromTransformationProfile("datasources_2_hbase.xsl"), load("dataDatasource.xml"));
343
	}
344

    
345
	@Test
346
	public void testFromMongodbCompressedDump() throws Exception {
347
		doTestJsonGz(loadFromTransformationProfile("oaf2hbase.xml"), load("mdstore_cleaned.json.gz"));
348
	}
349

    
350
	@Test
351
	public void testLoadFromTransformationProfile() throws IOException {
352
		InputStream in = loadFromTransformationProfile("oaf2hbase.xml");
353
		log.info(IOUtils.toString(in));
354
	}
355

    
356
	@Test
357
	public void test_template() throws Exception {
358
		final String xslt = IOUtils.toString(loadFromTransformationProfile("oaf2hbase.xml"));
359
		final XsltRowTransformer transformer = factory.getTransformer(xslt);
360
		assertNotNull(transformer);
361

    
362
		final String record = IOUtils.toString(load("record.xml"));
363
		final List<Row> rows = transformer.apply(record);
364

    
365
		System.out.println(rows);
366
	}
367

    
368
	@Test
369
	public void testWrongCharsOrganization() throws Exception {
370
		final List<Row> rows = Lists.newArrayList();
371
		rows.addAll(asRows(loadFromTransformationProfile("organizations_2_hbase.xsl"), load("organizationWrongChars.xml")));
372
		printAll(mapAll(buildTable(rows)));
373
	}
374

    
375
	@Test
376
	public void testParseProjectWithFunderOriginalName() throws Exception {
377

    
378
		doTest(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectWithFunderOriginalName.xml"));
379
	}
380
	@Test
381
	public void testLinkFunderOriginalName() throws Exception {
382

    
383
		final List<Row> rows = Lists.newArrayList();
384
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectWithFunderOriginalName.xml")));
385
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordFunderOriginalName.xml")));
386

    
387
		printAll(mapAll(buildTable(rows)));
388
	}
389

    
390
	@Test
391
	public void testProjectExtraInfo() throws Exception {
392
		final List<Row> rows = Lists.newArrayList();
393
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordExtraInfo.xml")));
394
		printAll(mapAll(buildTable(rows)));
395
	}
396

    
397
	@Test
398
	public void testParseSoftwareFromODF() throws Exception {
399
		final List<Row> rows = Lists.newArrayList();
400
		rows.addAll(asRows(loadFromTransformationProfile("odf2hbase.xml"), load("softwareODF.xml")));
401
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordCorda.xml")));
402
		printAll(mapAll(buildTable(rows)));
403
	}
404

    
405
	@Test
406
	public void testParseSoftwareFromOAF() throws Exception {
407
		final List<Row> rows = Lists.newArrayList();
408
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordOAFsoftwareCLOSED.xml")));
409
		printAll(mapAll(buildTable(rows)));
410
	}
411

    
412
	@Test
413
	public void testParseSoftwareFromOAFOpen() throws Exception {
414
		final List<Row> rows = Lists.newArrayList();
415
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordOAFsoftwareOPEN.xml")));
416
		printAll(mapAll(buildTable(rows)));
417
	}
418

    
419
	@Test
420
	public void testParseOafWithExternalRef() throws Exception {
421
		final List<Row> rows = Lists.newArrayList();
422
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("oafWithExternalReference.xml")));
423
		printAll(mapAll(buildTable(rows)));
424
	}
425

    
426
	@Test
427
	public void testParseOafWithCommunity() throws Exception {
428
		final List<Row> rows = Lists.newArrayList();
429
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("oafWithCommunity.xml")));
430
		printAll(mapAll(buildTable(rows)));
431
	}
432

    
433
	private void doTest(final InputStream xsltStream, final InputStream recordStream) throws Exception {
434
		try {
435
			final List<Row> rows = asRows(xsltStream, recordStream);
436

    
437
			log.info(rows);
438

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

    
441
			// System.out.println("\n" + table.toString());
442

    
443
			final Map<String, XmlRecordFactory> builders = mapAll(table);
444

    
445
			printAll(builders);
446
		} catch (final InvalidProtocolBufferException e) {
447
			throw new Exception(e);
448
		} catch (final TransformerConfigurationException e) {
449
			throw new Exception(e);
450
		} catch (final TransformerFactoryConfigurationError e) {
451
			throw new Exception(e);
452
		} catch (final DocumentException e) {
453
			throw new Exception(e);
454
		}
455
	}
456

    
457
	private void doTestJsonGz(final InputStream xsltStream, final InputStream recordStream) throws Exception {
458

    
459
		final Iterator<List<Row>> rowsIterator = asRowsJsonGzip(xsltStream, recordStream);
460

    
461
		int i = 0;
462
		while (rowsIterator.hasNext()) {
463
			final List<Row> rows = rowsIterator.next();
464
			i++;
465

    
466
			if ((i % 10000) == 0) {
467
				System.out.println(i);
468
			}
469

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

    
472
			for (final Map<String, Map<String, byte[]>> m : table.values()) {
473
				for (final Map<String, byte[]> mv : m.values()) {
474
					for (final byte[] v : mv.values()) {
475
						final OafDecoder d = OafDecoder.decode(v);
476
						assertNotNull(d);
477
						assertNotNull(d.getOaf());
478

    
479
						switch (d.getKind()) {
480
						case entity:
481
							assertNotNull(d.getMetadata());
482
							if (d.getOaf().getEntity().getType().equals(Type.result)) {
483
								System.out.println(d.getOaf());
484
							}
485
							break;
486
						case relation:
487
							assertNotNull(d.getRel());
488
							break;
489
						default:
490
							break;
491
						}
492
					}
493
				}
494
			}
495
		}
496
	}
497

    
498
	private List<Row> asRows(final InputStream xsltStream, final InputStream recordStream, final Function<Row, Row> p) throws Exception {
499
		return asRows(xsltStream, new HashMap<>(), recordStream, p);
500
	}
501

    
502
	private List<Row> asRows(final InputStream xsltStream, final InputStream recordStream) throws Exception {
503
		return asRows(xsltStream, new HashMap<>(), recordStream);
504
	}
505

    
506
	private List<Row> asRows(final InputStream xsltStream, final Map<String, Object> params, final InputStream recordStream) throws Exception {
507
		return asRows(xsltStream, params, recordStream, null);
508
	}
509

    
510
	private List<Row> asRows(final InputStream xsltStream, final Map<String, Object> params, final InputStream recordStream, final Function<Row, Row> p) throws Exception {
511
		final String xslt = IOUtils.toString(xsltStream);
512
		final XsltRowTransformer transformer = factory.getTransformer(xslt, params);
513
		assertNotNull(transformer);
514

    
515
		final String record = IOUtils.toString(recordStream);
516
		final List<Row> rows = transformer.apply(record);
517

    
518
		assertNotNull(rows);
519
		assertFalse(rows.isEmpty());
520
		return p == null ? rows : Lists.newArrayList(Iterables.transform(rows, p));
521
	}
522

    
523
	private Iterator<List<Row>> asRowsJsonGzip(final InputStream xsltStream, final InputStream recordStreamJsonGzip) throws Exception {
524
		final String xslt = IOUtils.toString(xsltStream);
525
		final XsltRowTransformer transformer = factory.getTransformer(xslt);
526
		assertNotNull(transformer);
527
		assertNotNull(recordStreamJsonGzip);
528

    
529
		final GZIPInputStream stream = new GZIPInputStream(recordStreamJsonGzip);
530
		assertNotNull(stream);
531
		final BufferedReader inStream = new BufferedReader(new InputStreamReader(stream));
532
		assertNotNull(inStream);
533
		return new Iterator<List<Row>>() {
534

    
535
			String jsonRecord = null;
536

    
537
			@Override
538
			public boolean hasNext() {
539
				try {
540
					return (jsonRecord = inStream.readLine()) != null;
541
				} catch (final IOException e) {
542
					throw new RuntimeException(e);
543
				}
544
			}
545

    
546
			@Override
547
			public List<Row> next() {
548

    
549
				final JSONObject jsonObj = new JSONObject(jsonRecord);
550
				final String body = jsonObj.getString("body");
551
				try {
552
					assertTrue(StringUtils.isNotBlank(body));
553
					// System.out.println(body);
554
					final List<Row> rows = transformer.apply(body);
555
					assertNotNull(rows);
556
					assertFalse(rows.isEmpty());
557
					return rows;
558
				} catch (final Throwable e) {
559
					System.err.println("error transforming document: " + body);
560
					throw new RuntimeException(e);
561
				}
562
			}
563

    
564
			@Override
565
			public void remove() {
566
				throw new UnsupportedOperationException();
567
			}
568

    
569
		};
570

    
571
	}
572

    
573
	private Map<String, Map<String, Map<String, byte[]>>> buildTableDoaj(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 (cf.equals("result") && c.getName().equals("body")) {
589
					// System.out.println(String.format("ADDING K:%s CF:%s Q:%s", rowKey, cf, c.getName()));
590
					assertTrue(StringUtils.isNotBlank(new String(c.getValue(), "UTF-8")));
591
				}
592
			}
593
		}
594
		return table;
595

    
596
	}
597

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

    
601
		for (final Row row : rows) {
602
			final String rowKey = row.getKey();
603
			final String cf = row.getColumnFamily();
604
			if (!table.containsKey(rowKey)) {
605
				table.put(rowKey, new HashMap<>());
606
			}
607
			if (!table.get(rowKey).containsKey(cf)) {
608
				table.get(rowKey).put(row.getColumnFamily(), new HashMap<>());
609
			}
610
			for (final Column<String, byte[]> c : row.getColumns()) {
611
				System.out.println(String.format("ADDING K:%s CF:%s Q:%s", rowKey, cf, c.getName()));
612
				table.get(rowKey).get(cf).put(c.getName(), c.getValue());
613
				if (c.getName().equals("body")) {
614
					final String theBody = new String(c.getValue(), "UTF-8");
615
					assertTrue(StringUtils.isNotBlank(theBody));
616
					//System.out.println(theBody);
617
				}
618
			}
619
		}
620
		return table;
621

    
622
	}
623

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

    
626
		final Map<String, XmlRecordFactory> builders = Maps.newHashMap();
627
		for (final Entry<String, Map<String, Map<String, byte[]>>> e : table.entrySet()) {
628
			map(builders, e.getKey(), e.getValue());
629
		}
630
		return builders;
631
	}
632

    
633
	// private Map<String, XmlRecordFactory> mapResultsOnly(final Map<String, Map<String, Map<String, byte[]>>> table) throws Exception {
634
	//
635
	// final Map<String, XmlRecordFactory> builders = Maps.newHashMap();
636
	// for (final Entry<String, Map<String, Map<String, byte[]>>> e : table.entrySet()) {
637
	// final Type type = OafRowKeyDecoder.decode(e.getKey()).getType();
638
	// if (type == Type.result) {
639
	// map(builders, e.getKey(), e.getValue());
640
	// }
641
	// }
642
	// return builders;
643
	// }
644

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

    
647
		final Type type = OafRowKeyDecoder.decode(rowKey).getType();
648

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

    
651
		if (familyMap == null) return;
652

    
653
		final byte[] bodyB = familyMap.get("body");
654

    
655
		if (bodyB != null) {
656
			ensureBuilder(builders, rowKey);
657

    
658
			final Oaf oaf = UpdateMerger.mergeBodyUpdates(familyMap);
659

    
660
			final OafDecoder mainEntity = OafDecoder.decode(oaf);
661

    
662
			builders.get(rowKey).setMainEntity(mainEntity);
663

    
664
			for (final LinkDescriptor ld : entityConfigTable.getDescriptors(type)) {
665

    
666
				final String it = ld.getRelDescriptor().getIt();
667
				final Map<String, byte[]> cols = row.get(it);
668

    
669
				if ((cols != null) && !cols.isEmpty()) {
670

    
671
					for (final byte[] oafB : cols.values()) {
672

    
673
						final Oaf.Builder relBuilder = Oaf.newBuilder(Oaf.parseFrom(oafB));
674

    
675
						if (ld.isSymmetric()) {
676
							final RelDescriptor rd = ld.getRelDescriptor();
677

    
678
							relBuilder.getRelBuilder().setCachedTarget(mainEntity.getEntity()).setRelType(rd.getRelType()).setSubRelType(rd.getSubRelType());
679
						}
680

    
681
						relBuilder.getRelBuilder().setChild(ld.isChild());
682

    
683
						final Oaf.Builder oafBuilder = Oaf.newBuilder().setKind(Kind.relation).setLastupdatetimestamp(System.currentTimeMillis());
684
						oafBuilder.mergeFrom(relBuilder.build());
685

    
686
						final String targetId = ld.isSymmetric() ? oafBuilder.getRel().getTarget() : oafBuilder.getRel().getSource();
687
						ensureBuilder(builders, targetId);
688
						final OafDecoder decoder = OafDecoder.decode(oafBuilder.build());
689

    
690
						if (ld.isChild()) {
691
							builders.get(targetId).addChild(type, decoder);
692
						} else {
693
							builders.get(targetId).addRelation(type, decoder);
694
						}
695
					}
696

    
697
				}
698
			}
699
		}
700

    
701
	}
702

    
703
	private void printAll(final Map<String, XmlRecordFactory> builders) throws DocumentException {
704
		print(Sets.newHashSet(Type.values()), builders, null);
705
	}
706

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

    
710
		for (final Entry<String, XmlRecordFactory> e : builders.entrySet()) {
711
			final OafRowKeyDecoder kd = OafRowKeyDecoder.decode(e.getKey());
712

    
713
			if (!e.getValue().isValid()) throw new IllegalArgumentException("invalid builder: " + e.getKey());
714
			if (types.contains(kd.getType())) {
715
				final String val = IndentXmlString.apply(e.getValue().build());
716

    
717
				if ((xpaths != null) && !xpaths.isEmpty() && (xpaths.get(kd.getType()) != null)) {
718
					final Document doc = r.read(new StringReader(val));
719

    
720
					log.debug("\n" + e.getKey());
721
					for (final String xpath : xpaths.get(kd.getType())) {
722
						log.debug(doc.valueOf(xpath));
723
					}
724
				} else {
725
					log.info(val);
726
				}
727
			}
728
		}
729
	}
730

    
731
	private void printNoIndent(final Map<String, XmlRecordFactory> builders) {
732
		for (final Entry<String, XmlRecordFactory> e : builders.entrySet()) {
733
			if (e.getValue().isValid()) {
734
				log.debug(e.getValue().build());
735
			} else {
736
				log.debug("invalid builder: " + e.getKey());
737
			}
738
		}
739
	}
740

    
741
	private void ensureBuilder(final Map<String, XmlRecordFactory> builders, final String rowKey) throws Exception {
742
		if (!builders.containsKey(rowKey)) {
743
			builders.put(rowKey, newBuilder());
744
		}
745
	}
746

    
747
	private XmlRecordFactory newBuilder() throws TransformerConfigurationException, TransformerFactoryConfigurationError, DocumentException {
748
		return new XmlRecordFactory(entityConfigTable, ContextMapper.fromXml(Context.xml),
749
				RelClasses.fromJSon(RelClassesTest.relClassesJson), XmlRecordFactoryTest.SCHEMA_LOCATION, true, false, false, XmlRecordFactoryTest.specialDatasourceTypes);
750
	}
751

    
752
	private InputStream load(final String fileName) {
753
		return getClass().getResourceAsStream(fileName);
754
	}
755

    
756
	private InputStream loadFromTransformationProfile(final String profilePath) {
757
		log.info("Loading xslt from: " + basePathProfiles + profilePath);
758
		InputStream profile = getClass().getResourceAsStream(basePathProfiles + profilePath);
759
		SAXReader saxReader = new SAXReader();
760
		Document doc = null;
761
		try {
762
			doc = saxReader.read(profile);
763
		} catch (DocumentException e) {
764
			e.printStackTrace();
765
			throw new RuntimeException(e);
766
		}
767
		String xslt = doc.selectSingleNode("//SCRIPT/CODE/*[local-name()='stylesheet']").asXML();
768
		//log.info(xslt);
769
		return IOUtils.toInputStream(xslt);
770
	}
771

    
772
}
    (1-1/1)