-
Notifications
You must be signed in to change notification settings - Fork 0
/
OpalConfirmer.java
159 lines (135 loc) · 7.24 KB
/
OpalConfirmer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package org.diceresearch.opalconfirmconversionservice.utility;
import net.logstash.logback.argument.StructuredArguments;
import org.apache.jena.rdf.model.*;
import org.apache.jena.rdf.model.impl.SelectorImpl;
import org.apache.jena.rdf.model.impl.StatementImpl;
import org.apache.jena.vocabulary.DCAT;
import org.apache.jena.vocabulary.RDF;
import org.dice_research.opal.common.utilities.Hash;
import org.dice_research.opal.common.utilities.ModelSerialization;
import org.dice_research.opal.common.vocabulary.Opal;
import org.dice_research.opal.metadata.GeoData;
import org.dice_research.opal.metadata.LanguageDetection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import static org.dice_research.opal.common.vocabulary.Opal.NS_OPAL;
@Component
public class OpalConfirmer {
private static final Logger logger = LoggerFactory.getLogger(OpalConfirmer.class);
private static final Property catalogProperty = ResourceFactory.createProperty("http://www.w3.org/ns/dcat#catalog");
public byte[] convert(byte[] bytes) {
Model model;
try {
model = ModelSerialization.deserialize(bytes);
logger.trace("called: convert, {}", StructuredArguments.kv("model", model));
} catch (Exception e) {
logger.error("Exception in deserialize the byte code ", e);
return bytes;
}
try {
ResIterator resIterator = model.listResourcesWithProperty(RDF.type, DCAT.Dataset);
if (resIterator.hasNext()) {
Resource dataSet = resIterator.nextResource();
model.add(dataSet, Opal.PROP_ORIGINAL_URI, dataSet);
String originalUriValue = dataSet.getURI();
// After the dataset URI is changed to Opal format, new URI to be passed for distribution
Resource catalog = getCatalog(model);
dataSet = makeOpalConfirmedUri(model, catalog, dataSet, DCAT.Dataset, null, "dataset");
logger.info("{} {}", StructuredArguments.kv("originalUri", originalUriValue), StructuredArguments.kv("dataSetUri", dataSet.getURI()));
makeOpalConfirmedUri(model, catalog, dataSet, DCAT.Distribution, DCAT.distribution, "distribution");
StmtIterator stmtIterator = model.listStatements(dataSet, catalogProperty, (RDFNode) null);
model.remove(stmtIterator);
refineMetadata(model, dataSet);
createGeoData(model, dataSet);
logger.trace("return: convert, {}", StructuredArguments.kv("model", model));
return ModelSerialization.serialize(model);
} else {
logger.info("The given model doesn't have DCAT:Dataset");
}
} catch (Exception e) {
logger.error("Exception in converting th model", e);
}
return bytes;
}
private void createGeoData(Model model, Resource dataSet) {
logger.trace("called: createGeoData, {}, {}", StructuredArguments.kv("model", model),
StructuredArguments.kv("dataSet", dataSet));
try {
new GeoData().processModel(model, dataSet.getURI());
} catch (Exception e) {
logger.error("", e);
}
}
private void refineMetadata(Model model, Resource dataSet) {
logger.trace("called: refineMetadata, {}, {}", StructuredArguments.kv("model", model),
StructuredArguments.kv("dataSet", dataSet));
try {
LanguageDetection languageDetection = new LanguageDetection();
languageDetection.initialize();
// Update model
languageDetection.processModel(model, dataSet.getURI());
} catch (Exception e) {
logger.error("", e);
}
}
private Resource getCatalog(Model model) {
logger.trace("called: getCatalog, {}", StructuredArguments.kv("model", model));
ResIterator iterator = model.listSubjectsWithProperty(RDF.type, DCAT.Catalog);
Resource catalog = null;
if (iterator.hasNext()) {
catalog = iterator.nextResource();
}
logger.trace("return: getCatalog, {}, {}", StructuredArguments.kv("model", model), StructuredArguments.kv("catalog", catalog));
return catalog;
}
private boolean isNotOpalConfirmed(String uri) {
logger.trace("called: isNotOpalConfirmed, {}", StructuredArguments.kv("uri", uri));
return !uri.startsWith(NS_OPAL);
}
private Resource makeOpalConfirmedUri(Model model, Resource catalog, Resource dataSet, Resource classType,
Property propertyType, String typeName) {
logger.trace("called: makeOpalConfirmedUri, {}, {}, {}, {}, {}, {}",
StructuredArguments.kv("model", model), StructuredArguments.kv("catalog", catalog),
StructuredArguments.kv("dataSet", dataSet), StructuredArguments.kv("classType", classType),
StructuredArguments.kv("propertyType", propertyType), StructuredArguments.kv("typeName", typeName));
ResIterator resIterator = model.listResourcesWithProperty(RDF.type, classType);
Resource newResource = null;
while (resIterator.hasNext()) {
Resource oldResource = resIterator.nextResource();
if (isNotOpalConfirmed(oldResource.getURI())) {
newResource = generateOpalConfirmedUrl(catalog, oldResource, typeName);
StmtIterator oldIterator = model.listStatements(new SelectorImpl(oldResource, null, (RDFNode) null));
List<Statement> newResourceStatements = new ArrayList<>();
while (oldIterator.hasNext()) {
Statement statement = oldIterator.nextStatement();
newResourceStatements.add(new StatementImpl(newResource, statement.getPredicate(), statement.getObject()));
}
oldIterator = model.listStatements(new SelectorImpl(oldResource, null, (RDFNode) null));
model.remove(oldIterator);
model.add(newResourceStatements);
if (propertyType != null) {
model.remove(dataSet, propertyType, oldResource);
model.add(dataSet, propertyType, newResource);
}
} else { // for mcloud portal
newResource = dataSet;
}
}
return newResource;
}
private Resource generateOpalConfirmedUrl(Resource catalog, Resource resource, String type) {
logger.trace("called: generateOpalConfirmedUrl, {}, {}, {}", StructuredArguments.kv("catalog", catalog),
StructuredArguments.kv("resource", resource), StructuredArguments.kv("type", type));
String s = resource.getURI();
s = catalog.getLocalName().concat(s);
s = Hash.md5(s);
String confirmedUri = NS_OPAL + type + "/" + s;
logger.trace("return: generateOpalConfirmedUrl, {}, {}, {}, {}",
StructuredArguments.kv("confirmedUri", confirmedUri), StructuredArguments.kv("catalog", catalog),
StructuredArguments.kv("resource", resource), StructuredArguments.kv("type", type));
return ResourceFactory.createResource(confirmedUri);
}
}