/*******************************************************************************
* Copyright 2014 University of Southern California
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This code was developed by the Information Integration Group as part
* of the Karma project at the Information Sciences Institute of the
* University of Southern California. For more information, publications,
* and related projects, please see: http://www.isi.edu/integration
******************************************************************************/
package edu.isi.karma.kr2rml.planning;
import java.util.Map;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import edu.isi.karma.controller.command.selection.SuperSelection;
import edu.isi.karma.kr2rml.PredicateObjectMap;
import edu.isi.karma.kr2rml.URIFormatter;
import edu.isi.karma.kr2rml.exception.HNodeNotFoundKarmaException;
import edu.isi.karma.kr2rml.mapping.KR2RMLMapping;
import edu.isi.karma.kr2rml.mapping.KR2RMLMappingColumnNameHNodeTranslator;
import edu.isi.karma.kr2rml.template.ColumnTemplateTerm;
import edu.isi.karma.kr2rml.template.PopulatedTemplateTermSet;
import edu.isi.karma.kr2rml.template.TemplateTerm;
import edu.isi.karma.kr2rml.template.TemplateTermSet;
import edu.isi.karma.kr2rml.template.TemplateTermSetPopulator;
import edu.isi.karma.kr2rml.writer.KR2RMLRDFWriter;
import edu.isi.karma.modeling.Namespaces;
import edu.isi.karma.modeling.Uris;
import edu.isi.karma.rep.HNodePath;
import edu.isi.karma.rep.RepFactory;
public class ColumnPredicateObjectMappingPlan extends
PredicateObjectMappingPlan {
private static Logger LOG = LoggerFactory.getLogger(ColumnPredicateObjectMappingPlan.class);
protected Map<String, String> hNodeToContextUriMap;
protected boolean generateContext;
public ColumnPredicateObjectMappingPlan(TemplateTermSet subjectMapTemplate,
PredicateObjectMap pom,
Map<ColumnTemplateTerm, HNodePath> subjectTermsToPaths,
KR2RMLMapping kr2rmlMapping, URIFormatter uriFormatter,
RepFactory factory, KR2RMLMappingColumnNameHNodeTranslator translator,
Map<String, String> hNodeToContextUriMap, boolean generateContext,
SuperSelection sel) throws HNodeNotFoundKarmaException
{
super(kr2rmlMapping, uriFormatter, factory, translator, sel);
this.hNodeToContextUriMap = hNodeToContextUriMap;
this.generateContext = generateContext;
generateLiteral(subjectMapTemplate, pom, subjectTermsToPaths);
}
public void generateLiteral(TemplateTermSet subjectMapTemplate, PredicateObjectMap pom, Map<ColumnTemplateTerm, HNodePath> subjectTermsToPaths) throws HNodeNotFoundKarmaException
{
this.isLiteral = true;
TemplateTermSet literalTemplate = pom.getObject().getRdfLiteralType();
literalTemplateValue = null;
if(literalTemplate != null)
literalTemplateValue = generateStringValueForTemplate(literalTemplate);
TemplateTermSet languageTemplate = pom.getObject().getLanguage();
literalLanguage = null;
if(languageTemplate != null)
literalLanguage = generateStringValueForTemplate(languageTemplate);
objectTemplateTermSetPopulator = new TemplateTermSetPopulator(pom.getObject().getTemplate(), new StringBuilder(), uriFormatter, false, true);
generateInternal(subjectMapTemplate, pom, subjectTermsToPaths);
if(generateContext && objectTemplateTermSetPopulator.getTerms().isSingleColumnTerm())
{
getColumnContextUri(translator.getHNodeIdForColumnName(objectTemplateTermSetPopulator.getTerms().getAllTerms().get(0).getTemplateTermValue()));
}
}
private String generateStringValueForTemplate(
TemplateTermSet objMapTemplate) {
StringBuilder sb = new StringBuilder();
for(TemplateTerm term : objMapTemplate.getAllTerms())
{
sb.append(term.getTemplateTermValue());
}
return sb.toString();
}
@Override
protected void outputTriple(KR2RMLRDFWriter outWriter,
PopulatedTemplateTermSet subject,
PopulatedTemplateTermSet predicate, PopulatedTemplateTermSet object) {
if(objectTemplateTermSetPopulator.getTerms().isSingleUriString() || predicate.getURI().equals("<" + Uris.RDF_TYPE_URI + ">"))
{
outWriter.outputTripleWithURIObject(pom, subject.getURI(), predicate.getURI(), uriFormatter.getExpandedAndNormalizedUri(object.getURI()));
}
else if(generateContext && objectTemplateTermSetPopulator.getTerms().isSingleColumnTerm())
{
try {
outWriter.outputQuadWithLiteralObject(pom, subject.getURI(), predicate.getURI(), object.getURI(),
literalTemplateValue, literalLanguage,
getColumnContextUri(translator.getHNodeIdForColumnName(objectTemplateTermSetPopulator.getTerms().getAllTerms().get(0).getTemplateTermValue())));
} catch (HNodeNotFoundKarmaException e) {
LOG.error("No hnode found for context " +objectTemplateTermSetPopulator.getTerms().getAllTerms().get(0).getTemplateTermValue() + " " + e);
}
}
else
{
outWriter.outputTripleWithLiteralObject(pom, subject.getURI(), predicate.getURI(), object.getURI(), literalTemplateValue, literalLanguage);
}
}
protected String getColumnContextUri (String hNodeId) {
if(hNodeId != null) {
if (hNodeToContextUriMap.containsKey(hNodeId))
return hNodeToContextUriMap.get(hNodeId);
else {
String randomId = UUID.randomUUID().toString();
String uri = Namespaces.KARMA_DEV + randomId + "_" + hNodeId;
hNodeToContextUriMap.put(hNodeId, uri);
return uri;
}
}
return null;
}
}