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 testParseDatasetPUB() throws Exception {
68

    
69
		doTest(loadFromTransformationProfile("odf2hbase.xml"), load("recordDatasetPUB.xml"));
70
	}
71

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

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

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

    
81
		doTest(loadFromTransformationProfile("oaf2hbase.xml"), load("recordClaim.xml"));
82
	}
83

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

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

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

    
93
		doTest(loadFromTransformationProfile("oaf2hbase.xml"), load("recordACM.xml"));
94
	}
95

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

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

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

    
105
		doTest(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordCorda.xml"));
106
	}
107

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

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

    
114

    
115
	@Test
116
	public void testParseOaf() throws Exception {
117

    
118
		doTest(loadFromTransformationProfile("oaf2hbase.xml"), load("record.xml"));
119
	}
120

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

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

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

    
130
		doTest(loadFromTransformationProfile("odf2hbase.xml"), load("recordLindat.xml"));
131
	}
132

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

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

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

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

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

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

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

    
154
		final List<Row> rows = Lists.newArrayList();
155
		rows.addAll(asRows(loadFromTransformationProfile("odf2hbase.xml"), load("pangaeODF1.xml")));
156
		rows.addAll(asRows(loadFromTransformationProfile("odf2hbase.xml"), load("pangaeODF2.xml")));
157
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("pangaeOAF.xml")));
158
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordCordaPangaea.xml")));
159

    
160
		printAll(mapAll(buildTable(rows)));
161
	}
162

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

    
166
		final List<Row> rows = Lists.newArrayList();
167
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("pangaeOAF2.xml")));
168
		printAll(mapAll(buildTable(rows)));
169
	}
170
	@Test
171
	public void testZenodo() throws Exception {
172

    
173
		final List<Row> rows = Lists.newArrayList();
174
		rows.addAll(asRows(loadFromTransformationProfile("odf2hbase.xml"), load("zenodoData.xml")));
175
		printAll(mapAll(buildTable(rows)));
176
	}
177

    
178
	@Test
179
	public void testLinkCorda() throws Exception {
180

    
181
		final List<Row> rows = Lists.newArrayList();
182
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordCorda.xml")));
183
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordCorda.xml")));
184

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

    
188
	@Test
189
	public void testLinkFCT() throws Exception {
190

    
191
		final List<Row> rows = Lists.newArrayList();
192
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordFCT.xml")));
193
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordFCT.xml")));
194

    
195
		printAll(mapAll(buildTable(rows)));
196
	}
197

    
198
	@Test
199
	public void testLinkARC() throws Exception {
200

    
201
		final List<Row> rows = Lists.newArrayList();
202
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordARC.xml")));
203
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordARC.xml")));
204

    
205
		printAll(mapAll(buildTable(rows)));
206
	}
207

    
208
	@Test
209
	public void testLinkWT() throws Exception {
210

    
211
		final List<Row> rows = Lists.newArrayList();
212
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordWT.xml")));
213
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordWT.xml")));
214

    
215
		printAll(mapAll(buildTable(rows)));
216
	}
217

    
218

    
219

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

    
223
		final List<Row> rows = Lists.newArrayList();
224
		rows.addAll(asRows(loadFromTransformationProfile("organizations_2_hbase.xsl"), load("organization.xml")));
225
		rows.addAll(asRows(loadFromTransformationProfile("projectorganization_2_hbase.xsl"), load("project_organization.xml")));
226
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordCorda.xml")));
227

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

    
231
	@Test
232
	public void testLinkOrganizationAffiliation() throws Exception {
233

    
234
		final List<Row> rows = Lists.newArrayList();
235
		rows.addAll(asRows(loadFromTransformationProfile("organizations_2_hbase.xsl"), load("organization.xml")));
236
		rows.addAll(asRows(loadFromTransformationProfile("resultorganization_2_hbase.xsl"), load("result_organization.xml")));
237
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("record.xml")));
238

    
239
		printAll(mapAll(buildTable(rows)));
240
	}
241

    
242
	@Test
243
	public void testDuplicates() throws Exception {
244
		final String mergeId = "50|dedup_wf_001::08ed625d07e5738b794ff14d6773fd9f";
245
		final List<Row> rows = Lists.newArrayList();
246

    
247
		final Function<Row, Row> f = rowIn -> {
248

    
249
			final List<Column<String,byte[]>> cols = Lists.newArrayList();
250
			for(Column<String,byte[]> col : rowIn.getColumns()) {
251
				if (col.getName().equals("body")) {
252
					cols.add(new Column(col.getName(), col.getValue()));
253

    
254
				}
255
			}
256
			return new Row("result", rowIn.getKey(), cols);
257
		};
258

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

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

    
265
		rows.addAll(puma1);
266
		rows.addAll(puma2);
267

    
268
		List<Oaf> duplicates = Lists.newArrayList();
269
		duplicates.add(getOafBody(puma1));
270
		duplicates.add(getOafBody(puma2));
271
		final Oaf.Builder oafMerge = OafEntityMerger.merge(mergeId, duplicates);
272

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

    
275
		rows.add(mergeRow);
276

    
277
		printAll(mapAll(buildTable(rows)));
278
	}
279

    
280
	private Oaf getOafBody(final List<Row> rows) throws InvalidProtocolBufferException {
281
		for(Row row : rows) {
282
			if(StringUtils.startsWith(row.getKey(), "50")) {
283
				return Oaf.parseFrom(row.getColumn("body").getValue());
284

    
285
			}
286
		}
287
		return null;
288
	}
289

    
290
	@Test
291
	public void testParseDoajOAF() throws Exception {
292

    
293
		doTest(loadFromTransformationProfile("oaf2hbase.xml"), load("doajUniversityRecord.xml"));
294
	}
295

    
296
	@Test
297
	public void testParseDatasource() throws Exception {
298

    
299
		doTest(loadFromTransformationProfile("datasources_2_hbase.xsl"), load("datasourceNative.xml"));
300
	}
301
	@Test
302
	public void testParseDatasourcePiwik() throws Exception {
303

    
304
		doTest(loadFromTransformationProfile("datasources_2_hbase.xsl"), load("datasourcePiwik.xml"));
305
	}
306

    
307
	@Test
308
	public void testParseDataDatasource() throws Exception {
309

    
310
		doTest(loadFromTransformationProfile("datasources_2_hbase.xsl"), load("dataDatasource.xml"));
311
	}
312

    
313
	@Test
314
	public void testFromMongodbCompressedDump() throws Exception {
315
		doTestJsonGz(loadFromTransformationProfile("oaf2hbase.xml"), load("mdstore_cleaned.json.gz"));
316
	}
317

    
318
	@Test
319
	public void testLoadFromTransformationProfile() throws IOException {
320
		InputStream in = loadFromTransformationProfile("oaf2hbase.xml");
321
		log.info(IOUtils.toString(in));
322
	}
323

    
324
	@Test
325
	public void test_template() throws Exception {
326
		final String xslt = IOUtils.toString(loadFromTransformationProfile("oaf2hbase.xml"));
327
		final XsltRowTransformer transformer = factory.getTransformer(xslt);
328
		assertNotNull(transformer);
329

    
330
		final String record = IOUtils.toString(load("record.xml"));
331
		final List<Row> rows = transformer.apply(record);
332

    
333
		System.out.println(rows);
334
	}
335

    
336
	@Test
337
	public void testWrongCharsOrganization() throws Exception {
338
		final List<Row> rows = Lists.newArrayList();
339
		rows.addAll(asRows(loadFromTransformationProfile("organizations_2_hbase.xsl"), load("organizationWrongChars.xml")));
340
		printAll(mapAll(buildTable(rows)));
341
	}
342

    
343
	@Test
344
	public void testParseProjectWithFunderOriginalName() throws Exception {
345

    
346
		doTest(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectWithFunderOriginalName.xml"));
347
	}
348
	@Test
349
	public void testLinkFunderOriginalName() throws Exception {
350

    
351
		final List<Row> rows = Lists.newArrayList();
352
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectWithFunderOriginalName.xml")));
353
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordFunderOriginalName.xml")));
354

    
355
		printAll(mapAll(buildTable(rows)));
356
	}
357

    
358
	@Test
359
	public void testProjectExtraInfo() throws Exception {
360
		final List<Row> rows = Lists.newArrayList();
361
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordExtraInfo.xml")));
362
		printAll(mapAll(buildTable(rows)));
363
	}
364

    
365
	@Test
366
	public void testParseSoftwareFromODF() throws Exception {
367
		final List<Row> rows = Lists.newArrayList();
368
		rows.addAll(asRows(loadFromTransformationProfile("odf2hbase.xml"), load("softwareODF.xml")));
369
		rows.addAll(asRows(loadFromTransformationProfile("projects_2_hbase.xsl"), load("projectRecordCorda.xml")));
370
		printAll(mapAll(buildTable(rows)));
371
	}
372

    
373
	@Test(expected = AssertionError.class)
374
	public void testParseSoftwareFromOAF() throws Exception {
375
		final List<Row> rows = Lists.newArrayList();
376
		rows.addAll(asRows(loadFromTransformationProfile("oaf2hbase.xml"), load("recordOAFsoftware.xml")));
377
		printAll(mapAll(buildTable(rows)));
378
	}
379

    
380
	private void doTest(final InputStream xsltStream, final InputStream recordStream) throws Exception {
381
		try {
382
			final List<Row> rows = asRows(xsltStream, recordStream);
383

    
384
			log.info(rows);
385

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

    
388
			// System.out.println("\n" + table.toString());
389

    
390
			final Map<String, XmlRecordFactory> builders = mapAll(table);
391

    
392
			printAll(builders);
393
		} catch (final InvalidProtocolBufferException e) {
394
			throw new Exception(e);
395
		} catch (final TransformerConfigurationException e) {
396
			throw new Exception(e);
397
		} catch (final TransformerFactoryConfigurationError e) {
398
			throw new Exception(e);
399
		} catch (final DocumentException e) {
400
			throw new Exception(e);
401
		}
402
	}
403

    
404
	private void doTestJsonGz(final InputStream xsltStream, final InputStream recordStream) throws Exception {
405

    
406
		final Iterator<List<Row>> rowsIterator = asRowsJsonGzip(xsltStream, recordStream);
407

    
408
		int i = 0;
409
		while (rowsIterator.hasNext()) {
410
			final List<Row> rows = rowsIterator.next();
411
			i++;
412

    
413
			if ((i % 10000) == 0) {
414
				System.out.println(i);
415
			}
416

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

    
419
			for (final Map<String, Map<String, byte[]>> m : table.values()) {
420
				for (final Map<String, byte[]> mv : m.values()) {
421
					for (final byte[] v : mv.values()) {
422
						final OafDecoder d = OafDecoder.decode(v);
423
						assertNotNull(d);
424
						assertNotNull(d.getOaf());
425

    
426
						switch (d.getKind()) {
427
						case entity:
428
							assertNotNull(d.getMetadata());
429
							if (d.getOaf().getEntity().getType().equals(Type.result)) {
430
								System.out.println(d.getOaf());
431
							}
432
							break;
433
						case relation:
434
							assertNotNull(d.getRel());
435
							break;
436
						default:
437
							break;
438
						}
439
					}
440
				}
441
			}
442
		}
443
	}
444

    
445
	private List<Row> asRows(final InputStream xsltStream, final InputStream recordStream, final Function<Row, Row> p) throws Exception {
446
		return asRows(xsltStream, new HashMap<>(), recordStream, p);
447
	}
448

    
449
	private List<Row> asRows(final InputStream xsltStream, final InputStream recordStream) throws Exception {
450
		return asRows(xsltStream, new HashMap<>(), recordStream);
451
	}
452

    
453
	private List<Row> asRows(final InputStream xsltStream, final Map<String, Object> params, final InputStream recordStream) throws Exception {
454
		return asRows(xsltStream, params, recordStream, null);
455
	}
456

    
457
	private List<Row> asRows(final InputStream xsltStream, final Map<String, Object> params, final InputStream recordStream, final Function<Row, Row> p) throws Exception {
458
		final String xslt = IOUtils.toString(xsltStream);
459
		final XsltRowTransformer transformer = factory.getTransformer(xslt, params);
460
		assertNotNull(transformer);
461

    
462
		final String record = IOUtils.toString(recordStream);
463
		final List<Row> rows = transformer.apply(record);
464

    
465
		assertNotNull(rows);
466
		assertFalse(rows.isEmpty());
467
		return p == null ? rows : Lists.newArrayList(Iterables.transform(rows, p));
468
	}
469

    
470
	private Iterator<List<Row>> asRowsJsonGzip(final InputStream xsltStream, final InputStream recordStreamJsonGzip) throws Exception {
471
		final String xslt = IOUtils.toString(xsltStream);
472
		final XsltRowTransformer transformer = factory.getTransformer(xslt);
473
		assertNotNull(transformer);
474
		assertNotNull(recordStreamJsonGzip);
475

    
476
		final GZIPInputStream stream = new GZIPInputStream(recordStreamJsonGzip);
477
		assertNotNull(stream);
478
		final BufferedReader inStream = new BufferedReader(new InputStreamReader(stream));
479
		assertNotNull(inStream);
480
		return new Iterator<List<Row>>() {
481

    
482
			String jsonRecord = null;
483

    
484
			@Override
485
			public boolean hasNext() {
486
				try {
487
					return (jsonRecord = inStream.readLine()) != null;
488
				} catch (final IOException e) {
489
					throw new RuntimeException(e);
490
				}
491
			}
492

    
493
			@Override
494
			public List<Row> next() {
495

    
496
				final JSONObject jsonObj = new JSONObject(jsonRecord);
497
				final String body = jsonObj.getString("body");
498
				try {
499
					assertTrue(StringUtils.isNotBlank(body));
500
					// System.out.println(body);
501
					final List<Row> rows = transformer.apply(body);
502
					assertNotNull(rows);
503
					assertFalse(rows.isEmpty());
504
					return rows;
505
				} catch (final Throwable e) {
506
					System.err.println("error transforming document: " + body);
507
					throw new RuntimeException(e);
508
				}
509
			}
510

    
511
			@Override
512
			public void remove() {
513
				throw new UnsupportedOperationException();
514
			}
515

    
516
		};
517

    
518
	}
519

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

    
523
		for (final Row row : rows) {
524
			final String rowKey = row.getKey();
525
			final String cf = row.getColumnFamily();
526
			if (!table.containsKey(rowKey)) {
527
				table.put(rowKey, new HashMap<>());
528
			}
529
			if (!table.get(rowKey).containsKey(cf)) {
530
				table.get(rowKey).put(row.getColumnFamily(), new HashMap<>());
531
			}
532
			for (final Column<String, byte[]> c : row.getColumns()) {
533
				// System.out.println(String.format("ADDING K:%s CF:%s Q:%s", rowKey, cf, c.getName()));
534
				table.get(rowKey).get(cf).put(c.getName(), c.getValue());
535
				if (cf.equals("result") && c.getName().equals("body")) {
536
					// System.out.println(String.format("ADDING K:%s CF:%s Q:%s", rowKey, cf, c.getName()));
537
					assertTrue(StringUtils.isNotBlank(new String(c.getValue(), "UTF-8")));
538
				}
539
			}
540
		}
541
		return table;
542

    
543
	}
544

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

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

    
569
	}
570

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

    
573
		final Map<String, XmlRecordFactory> builders = Maps.newHashMap();
574
		for (final Entry<String, Map<String, Map<String, byte[]>>> e : table.entrySet()) {
575
			map(builders, e.getKey(), e.getValue());
576
		}
577
		return builders;
578
	}
579

    
580
	// private Map<String, XmlRecordFactory> mapResultsOnly(final Map<String, Map<String, Map<String, byte[]>>> table) throws Exception {
581
	//
582
	// final Map<String, XmlRecordFactory> builders = Maps.newHashMap();
583
	// for (final Entry<String, Map<String, Map<String, byte[]>>> e : table.entrySet()) {
584
	// final Type type = OafRowKeyDecoder.decode(e.getKey()).getType();
585
	// if (type == Type.result) {
586
	// map(builders, e.getKey(), e.getValue());
587
	// }
588
	// }
589
	// return builders;
590
	// }
591

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

    
594
		final Type type = OafRowKeyDecoder.decode(rowKey).getType();
595

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

    
598
		if (familyMap == null) return;
599

    
600
		final byte[] bodyB = familyMap.get("body");
601

    
602
		if (bodyB != null) {
603
			ensureBuilder(builders, rowKey);
604

    
605
			final Oaf oaf = UpdateMerger.mergeBodyUpdates(familyMap);
606

    
607
			final OafDecoder mainEntity = OafDecoder.decode(oaf);
608

    
609
			builders.get(rowKey).setMainEntity(mainEntity);
610

    
611
			for (final LinkDescriptor ld : entityConfigTable.getDescriptors(type)) {
612

    
613
				final String it = ld.getRelDescriptor().getIt();
614
				final Map<String, byte[]> cols = row.get(it);
615

    
616
				if ((cols != null) && !cols.isEmpty()) {
617

    
618
					for (final byte[] oafB : cols.values()) {
619

    
620
						final Oaf.Builder relBuilder = Oaf.newBuilder(Oaf.parseFrom(oafB));
621

    
622
						if (ld.isSymmetric()) {
623
							final RelDescriptor rd = ld.getRelDescriptor();
624

    
625
							relBuilder.getRelBuilder().setCachedTarget(mainEntity.getEntity()).setRelType(rd.getRelType()).setSubRelType(rd.getSubRelType());
626
						}
627

    
628
						relBuilder.getRelBuilder().setChild(ld.isChild());
629

    
630
						final Oaf.Builder oafBuilder = Oaf.newBuilder().setKind(Kind.relation).setLastupdatetimestamp(System.currentTimeMillis());
631
						oafBuilder.mergeFrom(relBuilder.build());
632

    
633
						final String targetId = ld.isSymmetric() ? oafBuilder.getRel().getTarget() : oafBuilder.getRel().getSource();
634
						ensureBuilder(builders, targetId);
635
						final OafDecoder decoder = OafDecoder.decode(oafBuilder.build());
636

    
637
						if (ld.isChild()) {
638
							builders.get(targetId).addChild(type, decoder);
639
						} else {
640
							builders.get(targetId).addRelation(type, decoder);
641
						}
642
					}
643

    
644
				}
645
			}
646
		}
647

    
648
	}
649

    
650
	private void printAll(final Map<String, XmlRecordFactory> builders) throws DocumentException {
651
		print(Sets.newHashSet(Type.values()), builders, null);
652
	}
653

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

    
657
		for (final Entry<String, XmlRecordFactory> e : builders.entrySet()) {
658
			final OafRowKeyDecoder kd = OafRowKeyDecoder.decode(e.getKey());
659

    
660
			if (!e.getValue().isValid()) throw new IllegalArgumentException("invalid builder: " + e.getKey());
661
			if (types.contains(kd.getType())) {
662
				final String val = IndentXmlString.apply(e.getValue().build());
663

    
664
				if ((xpaths != null) && !xpaths.isEmpty() && (xpaths.get(kd.getType()) != null)) {
665
					final Document doc = r.read(new StringReader(val));
666

    
667
					log.debug("\n" + e.getKey());
668
					for (final String xpath : xpaths.get(kd.getType())) {
669
						log.debug(doc.valueOf(xpath));
670
					}
671
				} else {
672
					log.info(val);
673
				}
674
			}
675
		}
676
	}
677

    
678
	private void printNoIndent(final Map<String, XmlRecordFactory> builders) {
679
		for (final Entry<String, XmlRecordFactory> e : builders.entrySet()) {
680
			if (e.getValue().isValid()) {
681
				log.debug(e.getValue().build());
682
			} else {
683
				log.debug("invalid builder: " + e.getKey());
684
			}
685
		}
686
	}
687

    
688
	private void ensureBuilder(final Map<String, XmlRecordFactory> builders, final String rowKey) throws Exception {
689
		if (!builders.containsKey(rowKey)) {
690
			builders.put(rowKey, newBuilder());
691
		}
692
	}
693

    
694
	private XmlRecordFactory newBuilder() throws TransformerConfigurationException, TransformerFactoryConfigurationError, DocumentException {
695
		return new XmlRecordFactory(entityConfigTable, ContextMapper.fromXml(Context.xml),
696
				RelClasses.fromJSon(RelClassesTest.relClassesJson), XmlRecordFactoryTest.SCHEMA_LOCATION, true, false, false, XmlRecordFactoryTest.specialDatasourceTypes);
697
	}
698

    
699
	private InputStream load(final String fileName) {
700
		return getClass().getResourceAsStream(fileName);
701
	}
702

    
703
	private InputStream loadFromTransformationProfile(final String profilePath) {
704
		log.info("Loading xslt from: " + basePathProfiles + profilePath);
705
		InputStream profile = getClass().getResourceAsStream(basePathProfiles + profilePath);
706
		SAXReader saxReader = new SAXReader();
707
		Document doc = null;
708
		try {
709
			doc = saxReader.read(profile);
710
		} catch (DocumentException e) {
711
			e.printStackTrace();
712
			throw new RuntimeException(e);
713
		}
714
		String xslt = doc.selectSingleNode("//SCRIPT/CODE/*[local-name()='stylesheet']").asXML();
715
		return IOUtils.toInputStream(xslt);
716
	}
717

    
718
}
    (1-1/1)