/*******************************************************************************
* Copyright 2012 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.rep.sources;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import org.apache.log4j.Logger;
import org.jgrapht.graph.DirectedWeightedMultigraph;
import edu.isi.karma.modeling.ModelingParams;
import edu.isi.karma.rep.alignment.ColumnNode;
import edu.isi.karma.rep.alignment.Label;
import edu.isi.karma.rep.alignment.Link;
import edu.isi.karma.rep.alignment.LiteralNode;
import edu.isi.karma.rep.alignment.Node;
import edu.isi.karma.rep.model.Argument;
import edu.isi.karma.rep.model.ArgumentType;
import edu.isi.karma.rep.model.ClassAtom;
import edu.isi.karma.rep.model.IndividualPropertyAtom;
import edu.isi.karma.rep.model.Model;
import edu.isi.karma.util.RandomGUID;
public class DataSource extends Source {
static Logger logger = Logger.getLogger(DataSource.class);
private List<Attribute> attributes;
private Model model;
private List<String> variables;
HashMap<String, Attribute> attIdToAttMap;
public DataSource(String id) {
super(id);
variables = new ArrayList<String>();
attributes = new ArrayList<Attribute>();
attIdToAttMap = new HashMap<String, Attribute>();
}
public DataSource(String id, String name) {
super(id, name);
variables = new ArrayList<String>();
attributes = new ArrayList<Attribute>();
attIdToAttMap = new HashMap<String, Attribute>();
}
public DataSource(String name, DirectedWeightedMultigraph<Node, Link> treeModel) {
super(new RandomGUID().toString());
this.setName(name);
variables = new ArrayList<String>();
attributes = new ArrayList<Attribute>();
attIdToAttMap = new HashMap<String, Attribute>();
this.updateModel(treeModel);
}
public DataSource(DirectedWeightedMultigraph<Node, Link> treeModel) {
super(new RandomGUID().toString());
variables = new ArrayList<String>();
attributes = new ArrayList<Attribute>();
attIdToAttMap = new HashMap<String, Attribute>();
this.updateModel(treeModel);
}
public String getUri() {
return ModelingParams.KARMA_SOURCE_PREFIX + getId() + "#";
}
public List<Attribute> getAttributes() {
return Collections.unmodifiableList(attributes);
}
public Attribute getAttribute(String id) {
return this.attIdToAttMap.get(id);
}
public void setAttributes(List<Attribute> attributes) {
if (this.attributes != null)
this.attributes.clear();
for (Attribute att : attributes)
att.setBaseUri(this.getUri());
for (Attribute att : attributes)
attIdToAttMap.put(att.getId(), att);
this.attributes = attributes;
}
public Model getModel() {
return model;
}
public void setModel(Model model) {
if (model != null)
model.setBaseUri(this.getUri());
this.model = model;
}
public List<String> getVariables() {
return variables;
}
public void setVariables(List<String> variables) {
this.variables = variables;
}
private void updateModel(DirectedWeightedMultigraph<Node, Link> treeModel) {
if (treeModel == null)
return;
Model m = new Model("model");
HashMap<String, Argument> vertexIdToArgument = new HashMap<String, Argument>();
List<Attribute> attributeList = new ArrayList<Attribute>();
// get the column name associated to the hNodeIds to assign to attribute names
// set the rdf ids of all the vertices.
for (Node n : treeModel.vertexSet()) {
if (n instanceof ColumnNode) {
logger.debug("Vertex " + n.getLocalId() + " is a column node.");
String hNodeId = ((ColumnNode)n).getHNodeId();
String attId = "att" + String.valueOf(attributeList.size() + 1);
Attribute att = new Attribute(attId, this.getUri(), n.getLabel().getLocalName(), IOType.NONE, AttributeRequirement.NONE);
att.sethNodeId(hNodeId);
attributeList.add(att);
vertexIdToArgument.put(n.getId(), new Argument(att.getId(), att.getId(), ArgumentType.ATTRIBUTE));
} else {
logger.debug("Vertex " + n.getLocalId() + " is an intermediate node.");
String variableId = "v" + String.valueOf(variables.size() + 1);
this.variables.add(variableId);
vertexIdToArgument.put(n.getId(), new Argument(variableId, variableId, ArgumentType.VARIABLE));
}
}
for (Node n : treeModel.vertexSet()) {
if (n instanceof ColumnNode || n instanceof LiteralNode)
continue;
if (vertexIdToArgument.get(n.getId()) == null)
continue;
Label classPredicate = new Label(n.getLabel().getUri(), n.getLabel().getNs(), n.getLabel().getPrefix());
ClassAtom classAtom = new ClassAtom(classPredicate, vertexIdToArgument.get(n.getId()));
m.getAtoms().add(classAtom);
}
for (Link e : treeModel.edgeSet()) {
if (vertexIdToArgument.get(e.getSource().getId()) == null ||
vertexIdToArgument.get(e.getTarget().getId()) == null)
continue;
Label propertyPredicate = new Label(e.getLabel().getUri(), e.getLabel().getNs(), e.getLabel().getPrefix());
IndividualPropertyAtom propertyAtom = null;
// has_subclass is from source to target, we substitute this with a rdfs:subClassOf from target to source
// if (propertyPredicate.getUriString().equalsIgnoreCase(ModelingParams.HAS_SUBCLASS_URI)){
// Label subClassPredicate = new Label(ModelingParams.SUBCLASS_URI, Namespaces.OWL, Prefixes.OWL);
// propertyAtom = new IndividualPropertyAtom(subClassPredicate,
// vertexIdToArgument.get(e.getTarget().getId()),
// vertexIdToArgument.get(e.getSource().getId()));
// } else {
propertyAtom = new IndividualPropertyAtom(propertyPredicate,
vertexIdToArgument.get(e.getSource().getId()),
vertexIdToArgument.get(e.getTarget().getId()));
// }
m.getAtoms().add(propertyAtom);
}
// will update the hashmap.
setAttributes(attributeList);
this.setModel(m);
}
public String getInfo() {
String s = "";
s += "uri=" + this.getUri() + "\n";
s += "id=" + this.getId() + ", ";
s += "name=" + this.getName() + ", ";
return s;
}
@Override
public void print() {
System.out.println("********************************************");
System.out.println("Source: " + getInfo());
System.out.println("********************************************");
System.out.println("Attributes: ");
for (Attribute p : getAttributes())
p.print();
System.out.print("Model: ");
if (this.model != null) {
System.out.println(model.getUri());
this.model.print();
}
}
}