/*******************************************************************************
* 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.kr2rml;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import edu.isi.karma.rep.HNode;
import edu.isi.karma.rep.RepFactory;
public class TemplateTermSet {
private final List<TemplateTerm> termSet;
public TemplateTermSet() {
termSet = new LinkedList<TemplateTerm>();
}
public void addTemplateTermToSet(TemplateTerm term) {
this.termSet.add(term);
}
public List<TemplateTerm> getAllTerms() {
return this.termSet;
}
public List<ColumnTemplateTerm> getAllColumnNameTermElements() {
List<ColumnTemplateTerm> cnList = new ArrayList<ColumnTemplateTerm>();
for (TemplateTerm term:termSet) {
if (term instanceof ColumnTemplateTerm) {
cnList.add((ColumnTemplateTerm)term);
}
}
return cnList;
}
public TemplateTermSet clear() {
termSet.clear();
return this;
}
@Override
public String toString() {
StringBuilder str = new StringBuilder();
for (TemplateTerm term:termSet) {
if (term instanceof StringTemplateTerm)
str.append("<" + term.getTemplateTermValue() + ">");
else if (term instanceof ColumnTemplateTerm)
str.append("<ColumnHNodeId:" + term.getTemplateTermValue() + ">");
}
return str.toString();
}
public boolean isEmpty() {
return termSet.size() == 0;
}
public String getR2rmlTemplateString(RepFactory factory) {
StringBuilder str = new StringBuilder();
for (TemplateTerm term:termSet) {
if (term instanceof StringTemplateTerm) {
str.append(term.getTemplateTermValue());
} else if (term instanceof ColumnTemplateTerm) {
HNode hNode = factory.getHNode(term.getTemplateTermValue());
if (hNode != null) {
String colNameStr = "";
try {
JSONArray colNameArr = hNode.getJSONArrayRepresentation(factory);
if (colNameArr.length() == 1) {
colNameStr = (String)
(((JSONObject)colNameArr.get(0)).get("columnName"));
} else {
JSONArray colNames = new JSONArray();
for (int i=0; i<colNameArr.length();i++) {
colNames.put((String)
(((JSONObject)colNameArr.get(i)).get("columnName")));
}
colNameStr = colNames.toString();
}
str.append("{\"" + colNameStr + "\"}");
} catch (JSONException e) {
continue;
}
}
else {
str.append("{\"" + term.getTemplateTermValue() + "\"}");
}
}
}
return str.toString();
}
public String getColumnNameR2RMLRepresentation(RepFactory factory) {
StringBuilder str = new StringBuilder();
for (TemplateTerm term:termSet) {
if (term instanceof StringTemplateTerm) {
str.append(term.getTemplateTermValue());
} else if (term instanceof ColumnTemplateTerm) {
HNode hNode = factory.getHNode(term.getTemplateTermValue());
if (hNode != null) {
String colNameStr = "";
try {
JSONArray colNameArr = hNode.getJSONArrayRepresentation(factory);
if (colNameArr.length() == 1) {
colNameStr = (String)
(((JSONObject)colNameArr.get(0)).get("columnName"));
} else {
JSONArray colNames = new JSONArray();
for (int i=0; i<colNameArr.length();i++) {
colNames.put((String)
(((JSONObject)colNameArr.get(i)).get("columnName")));
}
colNameStr = colNames.toString();
}
str.append(colNameStr);
} catch (JSONException e) {
continue;
}
}
else {
str.append(term.getTemplateTermValue());
}
}
}
return str.toString();
}
public boolean isSingleUriString() {
if (termSet.size() == 1 && termSet.get(0) instanceof StringTemplateTerm)
return ((StringTemplateTerm)termSet.get(0)).hasFullUri();
return false;
}
public boolean isSingleColumnTerm() {
if (termSet.size() == 1 && termSet.get(0) instanceof ColumnTemplateTerm)
return true;
return false;
}
}